stage4/generate_c/generate_c_sfc.cc
changeset 244 3a478229db8b
parent 229 ca7bc1324540
child 279 c0453b7f99df
equal deleted inserted replaced
242:0036357a990f 244:3a478229db8b
    36   transition_c *symbol;
    36   transition_c *symbol;
    37   int priority;
    37   int priority;
    38   int index;
    38   int index;
    39 } TRANSITION;
    39 } TRANSITION;
    40 
    40 
    41 
       
    42 
       
    43 
       
    44 
       
    45 /***********************************************************************/
    41 /***********************************************************************/
    46 /***********************************************************************/
    42 /***********************************************************************/
    47 /***********************************************************************/
    43 /***********************************************************************/
    48 /***********************************************************************/
    44 /***********************************************************************/
    49 
    45 
    62 
    58 
    63   private:
    59   private:
    64     generate_c_il_c *generate_c_il;
    60     generate_c_il_c *generate_c_il;
    65     generate_c_st_c *generate_c_st;
    61     generate_c_st_c *generate_c_st;
    66     generate_c_SFC_IL_ST_c *generate_c_code;
    62     generate_c_SFC_IL_ST_c *generate_c_code;
    67     search_var_instance_decl_c *search_var_instance_decl;
       
    68     
    63     
    69     int transition_number;
    64     int transition_number;
    70     std::list<TRANSITION> transition_list;
    65     std::list<TRANSITION> transition_list;
    71     
    66     
    72     symbol_c *current_step;
    67     symbol_c *current_step;
    78     generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
    73     generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
    79     : generate_c_base_c(s4o_ptr) {
    74     : generate_c_base_c(s4o_ptr) {
    80       generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix);
    75       generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix);
    81       generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix);
    76       generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix);
    82       generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix);
    77       generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix);
    83       search_var_instance_decl = new search_var_instance_decl_c(scope);
       
    84       this->set_variable_prefix(variable_prefix);
    78       this->set_variable_prefix(variable_prefix);
    85     }
    79     }
    86     
    80     
    87     ~generate_c_sfc_elements_c(void) {
    81     ~generate_c_sfc_elements_c(void) {
    88       transition_list.clear();
    82       transition_list.clear();
    89       delete generate_c_il;
    83       delete generate_c_il;
    90       delete generate_c_st;
    84       delete generate_c_st;
    91       delete generate_c_code;
    85       delete generate_c_code;
    92       delete search_var_instance_decl;
       
    93     }
    86     }
    94 
    87 
    95     void reset_transition_number(void) {transition_number = 0;}
    88     void reset_transition_number(void) {transition_number = 0;}
    96 
    89 
    97     void generate(symbol_c *symbol, sfcgeneration_t generation_type) {
    90     void generate(symbol_c *symbol, sfcgeneration_t generation_type) {
   129       s4o.print("].");
   122       s4o.print("].");
   130       s4o.print(argument);
   123       s4o.print(argument);
   131     }      
   124     }      
   132 
   125 
   133     void print_transition_number(void) {
   126     void print_transition_number(void) {
   134       char str[10];
   127       s4o.print_integer(transition_number);
   135       sprintf(str, "%d", transition_number);
       
   136       s4o.print(str);
       
   137     }
   128     }
   138 
   129 
   139     void print_reset_step(symbol_c *step_name) {
   130     void print_reset_step(symbol_c *step_name) {
   140       s4o.print(s4o.indent_spaces);
   131       s4o.print(s4o.indent_spaces);
   141       s4o.print(SET_VAR);
   132       s4o.print(SET_VAR);
   152       s4o.print(",1);\n" + s4o.indent_spaces);
   143       s4o.print(",1);\n" + s4o.indent_spaces);
   153       print_step_argument(step_name, "elapsed_time");
   144       print_step_argument(step_name, "elapsed_time");
   154       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   145       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   155     }
   146     }
   156     
   147     
   157     bool is_variable(symbol_c *symbol) {
       
   158       /* we try to find the variable instance declaration, to determine its type... */
       
   159       symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
       
   160       
       
   161       return var_decl != NULL;
       
   162     }
       
   163 
       
   164 /*********************************************/
   148 /*********************************************/
   165 /* B.1.6  Sequential function chart elements */
   149 /* B.1.6  Sequential function chart elements */
   166 /*********************************************/
   150 /*********************************************/
   167     
   151     
   168     void *visit(initial_step_c *symbol) {
   152     void *visit(initial_step_c *symbol) {
   562                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) {
   546                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) {
   563               print_action_argument(current_action, "state");
   547               print_action_argument(current_action, "state");
   564               s4o.print(" = 1;\n");  
   548               s4o.print(" = 1;\n");  
   565             }
   549             }
   566             if (strcmp(qualifier, "S") == 0) {
   550             if (strcmp(qualifier, "S") == 0) {
   567               if (is_variable(current_action)) {
   551               print_action_argument(current_action, "set");
   568                 print_variable_prefix();
       
   569                 current_action->accept(*this);
       
   570               }
       
   571               else
       
   572                 print_action_argument(current_action, "set");
       
   573               s4o.print(" = 1;\n");
   552               s4o.print(" = 1;\n");
   574             }
   553             }
   575             if (strcmp(qualifier, "R") == 0) {
   554             if (strcmp(qualifier, "R") == 0) {
   576               if (is_variable(current_action)) {
   555               print_action_argument(current_action, "reset");
   577                 print_variable_prefix();
   556               s4o.print(" = 1;\n");
   578                 current_action->accept(*this);
       
   579                 s4o.print(" = 0;\n");
       
   580               }
       
   581               else {
       
   582                 print_action_argument(current_action, "reset");
       
   583                 s4o.print(" = 1;\n");
       
   584               }
       
   585             }
   557             }
   586             if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
   558             if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
   587                 strcmp(qualifier, "SL") == 0) {
   559                 strcmp(qualifier, "SL") == 0) {
   588               if (strcmp(qualifier, "SL") == 0) {
   560               if (strcmp(qualifier, "SL") == 0) {
   589                 print_action_argument(current_action, "reset_remaining_time");  
   561                 print_action_argument(current_action, "reset_remaining_time");
   590               }
   562               }
   591               else {
   563               else {
   592                 print_action_argument(current_action, "set_remaining_time");
   564                 print_action_argument(current_action, "set_remaining_time");
   593               }
   565               }
   594               s4o.print(" = ");
   566               s4o.print(" = ");
   621     }
   593     }
   622 
   594 
   623 }; /* generate_c_sfc_actiondecl_c */
   595 }; /* generate_c_sfc_actiondecl_c */
   624  
   596  
   625  
   597  
   626  
       
   627 /***********************************************************************/
   598 /***********************************************************************/
   628 /***********************************************************************/
   599 /***********************************************************************/
   629 /***********************************************************************/
   600 /***********************************************************************/
   630 /***********************************************************************/
   601 /***********************************************************************/
   631 
   602 
   632 class generate_c_sfc_c: public generate_c_typedecl_c {
   603 class generate_c_sfc_c: public generate_c_typedecl_c {
   633   
   604   
   634   private:
   605   private:
       
   606     std::list<VARIABLE> variable_list;
       
   607 
   635     generate_c_sfc_elements_c *generate_c_sfc_elements;
   608     generate_c_sfc_elements_c *generate_c_sfc_elements;
       
   609     search_var_instance_decl_c *search_var_instance_decl;
   636     
   610     
   637   public:
   611   public:
   638     generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
   612     generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
   639     : generate_c_typedecl_c(s4o_ptr) {
   613     : generate_c_typedecl_c(s4o_ptr) {
   640       generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix);
   614       generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix);
       
   615       search_var_instance_decl = new search_var_instance_decl_c(scope);
   641       this->set_variable_prefix(variable_prefix);
   616       this->set_variable_prefix(variable_prefix);
   642     }
   617     }
   643   
   618   
   644     virtual ~generate_c_sfc_c(void) {
   619     virtual ~generate_c_sfc_c(void) {
       
   620       variable_list.clear();
   645       delete generate_c_sfc_elements;
   621       delete generate_c_sfc_elements;
       
   622       delete search_var_instance_decl;
       
   623     }
       
   624 
       
   625     bool is_variable(symbol_c *symbol) {
       
   626       /* we try to find the variable instance declaration, to determine if symbol is variable... */
       
   627       symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
       
   628 
       
   629       return var_decl != NULL;
   646     }
   630     }
   647 
   631 
   648 /*********************************************/
   632 /*********************************************/
   649 /* B.1.6  Sequential function chart elements */
   633 /* B.1.6  Sequential function chart elements */
   650 /*********************************************/
   634 /*********************************************/
   652     void *visit(sequential_function_chart_c *symbol) {
   636     void *visit(sequential_function_chart_c *symbol) {
   653       int i;
   637       int i;
   654       
   638       
   655       generate_c_sfc_elements->reset_transition_number();
   639       generate_c_sfc_elements->reset_transition_number();
   656       for(i = 0; i < symbol->n; i++) {
   640       for(i = 0; i < symbol->n; i++) {
       
   641         symbol->elements[i]->accept(*this);
   657         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg);
   642         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg);
   658       }
   643       }
   659       
   644       
   660       s4o.print(s4o.indent_spaces +"INT i;\n");
   645       s4o.print(s4o.indent_spaces +"INT i;\n");
   661       s4o.print(s4o.indent_spaces +"BOOL transition;\n");
   646       s4o.print(s4o.indent_spaces +"BOOL transition;\n");
   848       s4o.indent_left();
   833       s4o.indent_left();
   849       s4o.print(s4o.indent_spaces + "}\n\n");
   834       s4o.print(s4o.indent_spaces + "}\n\n");
   850       
   835       
   851       /* generate action execution */
   836       /* generate action execution */
   852       s4o.print(s4o.indent_spaces + "// Actions execution\n");
   837       s4o.print(s4o.indent_spaces + "// Actions execution\n");
       
   838       {
       
   839         std::list<VARIABLE>::iterator pt;
       
   840         for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
       
   841           symbol_c *var_decl = search_var_instance_decl->get_decl(pt->symbol);
       
   842           if (var_decl != NULL) {
       
   843             unsigned int vartype = search_var_instance_decl->get_vartype();
       
   844 
       
   845             s4o.print(s4o.indent_spaces);
       
   846             if (vartype == search_var_instance_decl_c::external_vt) {
       
   847           	  s4o.print(SET_EXTERNAL);
       
   848           	  s4o.print("(");
       
   849           	  pt->symbol->accept(*this);
       
   850               s4o.print(",");
       
   851             }
       
   852           	else {
       
   853           	  if (vartype == search_var_instance_decl_c::located_vt)
       
   854           	    s4o.print(SET_LOCATED);
       
   855           	  else
       
   856           	    s4o.print(SET_VAR);
       
   857               s4o.print("(");
       
   858           	}
       
   859             print_variable_prefix();
       
   860             pt->symbol->accept(*this);
       
   861             s4o.print(",");
       
   862             print_variable_prefix();
       
   863             s4o.print("__action_list[");
       
   864             s4o.print(SFC_STEP_ACTION_PREFIX);
       
   865             pt->symbol->accept(*this);
       
   866             s4o.print("].state);\n");
       
   867           }
       
   868         }
       
   869       }
   853       for(i = 0; i < symbol->n; i++) {
   870       for(i = 0; i < symbol->n; i++) {
   854         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg);
   871         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg);
   855       }
   872       }
   856       s4o.print("\n");
   873       s4o.print("\n");
   857       
   874       
   858       return NULL;
   875       return NULL;
   859     }
   876     }
   860     
   877     
       
   878     void *visit(initial_step_c *symbol) {
       
   879       symbol->action_association_list->accept(*this);
       
   880       return NULL;
       
   881     }
       
   882 
       
   883     void *visit(step_c *symbol) {
       
   884       symbol->action_association_list->accept(*this);
       
   885       return NULL;
       
   886     }
       
   887 
       
   888     void *visit(action_association_c *symbol) {
       
   889       symbol_c *var_decl = search_var_instance_decl->get_decl(symbol->action_name);
       
   890 
       
   891       if (var_decl != NULL) {
       
   892         std::list<VARIABLE>::iterator pt;
       
   893         for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
       
   894           if (!compare_identifiers(pt->symbol, symbol->action_name))
       
   895             return NULL;
       
   896         }
       
   897         VARIABLE *variable;
       
   898         variable = new VARIABLE;
       
   899         variable->symbol = (identifier_c*)(symbol->action_name);
       
   900         variable_list.push_back(*variable);
       
   901       }
       
   902       return NULL;
       
   903     }
       
   904 
       
   905     void *visit(transition_c *symbol) {
       
   906       return NULL;
       
   907     }
       
   908 
       
   909     void *visit(action_c *symbol) {
       
   910       return NULL;
       
   911     }
       
   912 
   861     void generate(sequential_function_chart_c *sfc) {
   913     void generate(sequential_function_chart_c *sfc) {
   862       sfc->accept(*this);
   914       sfc->accept(*this);
   863     }
   915     }
   864 
   916 
   865 }; /* generate_c_sfc_c */
   917 }; /* generate_c_sfc_c */