stage4/generate_cc/generate_cc_sfc.cc
changeset 66 501e9d494744
parent 53 7f0cea717342
equal deleted inserted replaced
65:c6d41c1287de 66:501e9d494744
    63 
    63 
    64   private:
    64   private:
    65     generate_cc_il_c *generate_cc_il;
    65     generate_cc_il_c *generate_cc_il;
    66     generate_cc_st_c *generate_cc_st;
    66     generate_cc_st_c *generate_cc_st;
    67     generate_cc_SFC_IL_ST_c *generate_cc_code;
    67     generate_cc_SFC_IL_ST_c *generate_cc_code;
       
    68     search_var_instance_decl_c *search_var_instance_decl;
    68     
    69     
    69     int transition_number;
    70     int transition_number;
    70     std::list<TRANSITION> transition_list;
    71     std::list<TRANSITION> transition_list;
    71     
    72     
    72     symbol_c *current_step;
    73     symbol_c *current_step;
    78     generate_cc_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL)
    79     generate_cc_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL)
    79     : generate_cc_base_c(s4o_ptr) {
    80     : generate_cc_base_c(s4o_ptr) {
    80       generate_cc_il = new generate_cc_il_c(s4o_ptr, scope, variable_prefix);
    81       generate_cc_il = new generate_cc_il_c(s4o_ptr, scope, variable_prefix);
    81       generate_cc_st = new generate_cc_st_c(s4o_ptr, scope, variable_prefix);
    82       generate_cc_st = new generate_cc_st_c(s4o_ptr, scope, variable_prefix);
    82       generate_cc_code = new generate_cc_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix);
    83       generate_cc_code = new generate_cc_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix);
       
    84       search_var_instance_decl = new search_var_instance_decl_c(scope);
    83       this->set_variable_prefix(variable_prefix);
    85       this->set_variable_prefix(variable_prefix);
    84     }
    86     }
    85     
    87     
    86     ~generate_cc_sfc_elements_c(void) {
    88     ~generate_cc_sfc_elements_c(void) {
    87       delete generate_cc_il;
    89       delete generate_cc_il;
    88       delete generate_cc_st;
    90       delete generate_cc_st;
    89       delete generate_cc_code;
    91       delete generate_cc_code;
       
    92       delete search_var_instance_decl;
    90     }
    93     }
    91 
    94 
    92     void reset_transition_number(void) {transition_number = 0;}
    95     void reset_transition_number(void) {transition_number = 0;}
    93 
    96 
    94     void generate(symbol_c *symbol, sfcgeneration_t generation_type) {
    97     void generate(symbol_c *symbol, sfcgeneration_t generation_type) {
   145       s4o.print(" = 1;\n" + s4o.indent_spaces);
   148       s4o.print(" = 1;\n" + s4o.indent_spaces);
   146       print_step_argument(step_name, "elapsed_time");
   149       print_step_argument(step_name, "elapsed_time");
   147       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   150       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   148     }
   151     }
   149     
   152     
       
   153     bool is_variable(symbol_c *symbol) {
       
   154       /* we try to find the variable instance declaration, to determine its type... */
       
   155       symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
       
   156       
       
   157       return var_decl != NULL;
       
   158     }
   150 
   159 
   151 /*********************************************/
   160 /*********************************************/
   152 /* B.1.6  Sequential function chart elements */
   161 /* B.1.6  Sequential function chart elements */
   153 /*********************************************/
   162 /*********************************************/
   154     
   163     
   229             transition->symbol = symbol;
   238             transition->symbol = symbol;
   230             transition->index = transition_number;
   239             transition->index = transition_number;
   231             if (symbol->integer != NULL) {
   240             if (symbol->integer != NULL) {
   232               transition->priority = atoi(((token_c *)symbol->integer)->value);
   241               transition->priority = atoi(((token_c *)symbol->integer)->value);
   233               std::list<TRANSITION>::iterator pt = transition_list.begin();
   242               std::list<TRANSITION>::iterator pt = transition_list.begin();
   234               while (pt != transition_list.end() && pt->priority > transition->priority) {
   243               while (pt != transition_list.end() && pt->priority <= transition->priority) {
   235                 pt++;
   244                 pt++;
   236               } 
   245               } 
   237               transition_list.insert(pt, *transition);
   246               transition_list.insert(pt, *transition);
   238             } 
   247             } 
   239             else {
   248             else {
   465                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) {
   474                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) {
   466               print_action_argument(current_action, "state");
   475               print_action_argument(current_action, "state");
   467               s4o.print(" = 1;\n");  
   476               s4o.print(" = 1;\n");  
   468             }
   477             }
   469             if (strcmp(qualifier, "S") == 0) {
   478             if (strcmp(qualifier, "S") == 0) {
   470               print_action_argument(current_action, "set");
   479               if (is_variable(current_action)) {
       
   480                 print_variable_prefix();
       
   481                 current_action->accept(*this);
       
   482               }
       
   483               else
       
   484                 print_action_argument(current_action, "set");
   471               s4o.print(" = 1;\n");
   485               s4o.print(" = 1;\n");
   472             }
   486             }
   473             if (strcmp(qualifier, "R") == 0) {
   487             if (strcmp(qualifier, "R") == 0) {
   474               print_action_argument(current_action, "reset");
   488               if (is_variable(current_action)) {
   475               s4o.print(" = 1;\n");
   489                 print_variable_prefix();
       
   490                 current_action->accept(*this);
       
   491                 s4o.print(" = 0;\n");
       
   492               }
       
   493               else {
       
   494                 print_action_argument(current_action, "reset");
       
   495                 s4o.print(" = 1;\n");
       
   496               }
   476             }
   497             }
   477             if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
   498             if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
   478                 strcmp(qualifier, "SL") == 0) {
   499                 strcmp(qualifier, "SL") == 0) {
   479               if (strcmp(qualifier, "SL") == 0) {
   500               if (strcmp(qualifier, "SL") == 0) {
   480                 print_action_argument(current_action, "reset_remaining_time");  
   501                 print_action_argument(current_action, "reset_remaining_time");  
   562       s4o.indent_right();
   583       s4o.indent_right();
   563       s4o.print(s4o.indent_spaces);
   584       s4o.print(s4o.indent_spaces);
   564       print_variable_prefix();
   585       print_variable_prefix();
   565       s4o.print("step_list[i].elapsed_time = __time_add(");
   586       s4o.print("step_list[i].elapsed_time = __time_add(");
   566       print_variable_prefix();
   587       print_variable_prefix();
   567       s4o.print("step_list[i].elapsed_time, PERIOD);\n");
   588       s4o.print("step_list[i].elapsed_time, ");
       
   589       print_variable_prefix();
       
   590       s4o.print("period);\n");
   568       s4o.indent_left();
   591       s4o.indent_left();
   569       s4o.print(s4o.indent_spaces + "}\n");
   592       s4o.print(s4o.indent_spaces + "}\n");
   570       s4o.indent_left();
   593       s4o.indent_left();
   571       s4o.print(s4o.indent_spaces + "}\n");
   594       s4o.print(s4o.indent_spaces + "}\n");
   572 
   595 
   584       s4o.print("action_list[i].set = 0;\n");
   607       s4o.print("action_list[i].set = 0;\n");
   585       s4o.print(s4o.indent_spaces);
   608       s4o.print(s4o.indent_spaces);
   586       print_variable_prefix();
   609       print_variable_prefix();
   587       s4o.print("action_list[i].reset = 0;\n");
   610       s4o.print("action_list[i].reset = 0;\n");
   588       s4o.print(s4o.indent_spaces + "if (");
   611       s4o.print(s4o.indent_spaces + "if (");
   589       print_variable_prefix();
   612       s4o.print("__gt_TIME(2, ");
   590       s4o.print("__gt_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
   613       print_variable_prefix();
       
   614       s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
   591       s4o.indent_right();
   615       s4o.indent_right();
   592       s4o.print(s4o.indent_spaces);
   616       s4o.print(s4o.indent_spaces);
   593       print_variable_prefix();
   617       print_variable_prefix();
   594       s4o.print("action_list[i].set_remaining_time = __time_sub(");
   618       s4o.print("action_list[i].set_remaining_time = __time_sub(");
   595       print_variable_prefix();
   619       print_variable_prefix();
   596       s4o.print("action_list[i].set_remaining_time, PERIOD);\n");
   620       s4o.print("action_list[i].set_remaining_time, ");
       
   621       print_variable_prefix();
       
   622       s4o.print("period);\n");
   597       s4o.print(s4o.indent_spaces + "if (");
   623       s4o.print(s4o.indent_spaces + "if (");
   598       print_variable_prefix();
   624       s4o.print("__le_TIME(2, ");
   599       s4o.print("__le_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
   625       print_variable_prefix();
       
   626       s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
   600       s4o.indent_right();
   627       s4o.indent_right();
   601       s4o.print(s4o.indent_spaces);
   628       s4o.print(s4o.indent_spaces);
   602       print_variable_prefix();
   629       print_variable_prefix();
   603       s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   630       s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   604       s4o.print(s4o.indent_spaces);
   631       s4o.print(s4o.indent_spaces);
   607       s4o.indent_left();
   634       s4o.indent_left();
   608       s4o.print(s4o.indent_spaces + "}\n");
   635       s4o.print(s4o.indent_spaces + "}\n");
   609       s4o.indent_left();
   636       s4o.indent_left();
   610       s4o.print(s4o.indent_spaces + "}\n");
   637       s4o.print(s4o.indent_spaces + "}\n");
   611       s4o.print(s4o.indent_spaces + "if (");
   638       s4o.print(s4o.indent_spaces + "if (");
   612       print_variable_prefix();
   639       s4o.print("__gt_TIME(2, ");
   613       s4o.print("__gt_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
   640       print_variable_prefix();
       
   641       s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
   614       s4o.indent_right();
   642       s4o.indent_right();
   615       s4o.print(s4o.indent_spaces);
   643       s4o.print(s4o.indent_spaces);
   616       print_variable_prefix();
   644       print_variable_prefix();
   617       s4o.print("action_list[i].reset_remaining_time = __time_sub(");
   645       s4o.print("action_list[i].reset_remaining_time = __time_sub(");
   618       print_variable_prefix();
   646       print_variable_prefix();
   619       s4o.print("action_list[i].reset_remaining_time, PERIOD);\n");
   647       s4o.print("action_list[i].reset_remaining_time, ");
       
   648       print_variable_prefix();
       
   649       s4o.print("period);\n");
   620       s4o.print(s4o.indent_spaces + "if (");
   650       s4o.print(s4o.indent_spaces + "if (");
   621       print_variable_prefix();
   651       s4o.print("__le_TIME(2, ");
   622       s4o.print("__le_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n");
   652       print_variable_prefix();
       
   653       s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n");
   623       s4o.indent_right();
   654       s4o.indent_right();
   624       s4o.print(s4o.indent_spaces);
   655       s4o.print(s4o.indent_spaces);
   625       print_variable_prefix();
   656       print_variable_prefix();
   626       s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   657       s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   627       s4o.print(s4o.indent_spaces);
   658       s4o.print(s4o.indent_spaces);
   674       print_variable_prefix();
   705       print_variable_prefix();
   675       s4o.print("action_list[i].reset) {\n");
   706       s4o.print("action_list[i].reset) {\n");
   676       s4o.indent_right();
   707       s4o.indent_right();
   677       s4o.print(s4o.indent_spaces);
   708       s4o.print(s4o.indent_spaces);
   678       print_variable_prefix();
   709       print_variable_prefix();
   679       s4o.print("action_list[i].set_remaining_time = 0;\n" + s4o.indent_spaces);
   710       s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
   680       print_variable_prefix();
   711       print_variable_prefix();
   681       s4o.print("action_list[i].reset_remaining_time = 0;\n" + s4o.indent_spaces);
   712       s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
   682       print_variable_prefix();
   713       print_variable_prefix();
   683       s4o.print("action_list[i].stored = 0;\n");
   714       s4o.print("action_list[i].stored = 0;\n");
   684       s4o.indent_left();
   715       s4o.indent_left();
   685       s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
   716       s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
   686       print_variable_prefix();
   717       print_variable_prefix();