stage4/generate_c/generate_c_sfc.cc
changeset 217 f5dfadf5de54
parent 155 e094c92cf197
child 221 c6aed7e5f070
equal deleted inserted replaced
216:136d6ae70745 217:f5dfadf5de54
    73     symbol_c *current_action;
    73     symbol_c *current_action;
    74 
    74 
    75     sfcgeneration_t wanted_sfcgeneration;
    75     sfcgeneration_t wanted_sfcgeneration;
    76     
    76     
    77   public:
    77   public:
    78     generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL)
    78     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) {
    79     : generate_c_base_c(s4o_ptr) {
    80       generate_c_il = new generate_c_il_c(s4o_ptr, scope, variable_prefix);
    80       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, scope, variable_prefix);
    81       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, scope, variable_prefix);
    82       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);
    83       search_var_instance_decl = new search_var_instance_decl_c(scope);
    84       this->set_variable_prefix(variable_prefix);
    84       this->set_variable_prefix(variable_prefix);
    85     }
    85     }
    86     
    86     
    87     ~generate_c_sfc_elements_c(void) {
    87     ~generate_c_sfc_elements_c(void) {
   136       s4o.print(str);
   136       s4o.print(str);
   137     }
   137     }
   138 
   138 
   139     void print_reset_step(symbol_c *step_name) {
   139     void print_reset_step(symbol_c *step_name) {
   140       s4o.print(s4o.indent_spaces);
   140       s4o.print(s4o.indent_spaces);
       
   141       s4o.print(SET_VAR);
       
   142       s4o.print("(");
   141       print_step_argument(step_name, "state");
   143       print_step_argument(step_name, "state");
   142       s4o.print(" = 0;\n");
   144       s4o.print(",0);\n");
   143     }
   145     }
   144     
   146     
   145     void print_set_step(symbol_c *step_name) {
   147     void print_set_step(symbol_c *step_name) {
   146       s4o.print(s4o.indent_spaces);
   148       s4o.print(s4o.indent_spaces);
       
   149       s4o.print(SET_VAR);
       
   150       s4o.print("(");
   147       print_step_argument(step_name, "state");
   151       print_step_argument(step_name, "state");
   148       s4o.print(" = 1;\n" + s4o.indent_spaces);
   152       s4o.print(",1);\n" + s4o.indent_spaces);
   149       print_step_argument(step_name, "elapsed_time");
   153       print_step_argument(step_name, "elapsed_time");
   150       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   154       s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
   151     }
   155     }
   152     
   156     
   153     bool is_variable(symbol_c *symbol) {
   157     bool is_variable(symbol_c *symbol) {
   170             s4o.print(" action associations\n");
   174             s4o.print(" action associations\n");
   171             current_step = symbol->step_name;
   175             current_step = symbol->step_name;
   172             s4o.print(s4o.indent_spaces + "{\n");
   176             s4o.print(s4o.indent_spaces + "{\n");
   173             s4o.indent_right();
   177             s4o.indent_right();
   174             s4o.print(s4o.indent_spaces + "char activated = ");
   178             s4o.print(s4o.indent_spaces + "char activated = ");
       
   179             s4o.print(GET_VAR);
       
   180             s4o.print("(");
   175             print_step_argument(current_step, "state");
   181             print_step_argument(current_step, "state");
   176             s4o.print(" && !");
   182             s4o.print(") && !");
   177             print_step_argument(current_step, "prev_state");
   183             print_step_argument(current_step, "prev_state");
   178             s4o.print(";\n");
   184             s4o.print(";\n");
   179             s4o.print(s4o.indent_spaces + "char desactivated = !");
   185             s4o.print(s4o.indent_spaces + "char desactivated = !");
       
   186             s4o.print(GET_VAR);
       
   187             s4o.print("(");
   180             print_step_argument(current_step, "state");
   188             print_step_argument(current_step, "state");
   181             s4o.print(" && ");
   189             s4o.print(") && ");
   182             print_step_argument(current_step, "prev_state");
   190             print_step_argument(current_step, "prev_state");
   183             s4o.print(";\n");
   191             s4o.print(";\n");
   184             s4o.print(s4o.indent_spaces + "char active = ");
   192             s4o.print(s4o.indent_spaces + "char active = ");
       
   193             s4o.print(GET_VAR);
       
   194             s4o.print("(");
   185             print_step_argument(current_step, "state");
   195             print_step_argument(current_step, "state");
   186             s4o.print(";\n");
   196             s4o.print(");\n");
   187             symbol->action_association_list->accept(*this);
   197             symbol->action_association_list->accept(*this);
   188             s4o.indent_left();
   198             s4o.indent_left();
   189             s4o.print(s4o.indent_spaces + "}\n\n");
   199             s4o.print(s4o.indent_spaces + "}\n\n");
   190           }
   200           }
   191           break;
   201           break;
   204             s4o.print(" action associations\n");
   214             s4o.print(" action associations\n");
   205             current_step = symbol->step_name;
   215             current_step = symbol->step_name;
   206             s4o.print(s4o.indent_spaces + "{\n");
   216             s4o.print(s4o.indent_spaces + "{\n");
   207             s4o.indent_right();
   217             s4o.indent_right();
   208             s4o.print(s4o.indent_spaces + "char activated = ");
   218             s4o.print(s4o.indent_spaces + "char activated = ");
       
   219             s4o.print(GET_VAR);
       
   220             s4o.print("(");
   209             print_step_argument(current_step, "state");
   221             print_step_argument(current_step, "state");
   210             s4o.print(" && !");
   222             s4o.print(") && !");
   211             print_step_argument(current_step, "prev_state");
   223             print_step_argument(current_step, "prev_state");
   212             s4o.print(";\n");
   224             s4o.print(";\n");
   213             s4o.print(s4o.indent_spaces + "char desactivated = !");
   225             s4o.print(s4o.indent_spaces + "char desactivated = !");
       
   226             s4o.print(GET_VAR);
       
   227             s4o.print("(");
   214             print_step_argument(current_step, "state");
   228             print_step_argument(current_step, "state");
   215             s4o.print(" && ");
   229             s4o.print(") && ");
   216             print_step_argument(current_step, "prev_state");
   230             print_step_argument(current_step, "prev_state");
   217             s4o.print(";\n");
   231             s4o.print(";\n");
   218             s4o.print(s4o.indent_spaces + "char active = ");
   232             s4o.print(s4o.indent_spaces + "char active = ");
       
   233             s4o.print(GET_VAR);
       
   234             s4o.print("(");
   219             print_step_argument(current_step, "state");
   235             print_step_argument(current_step, "state");
   220             s4o.print(";\n");
   236             s4o.print(");\n");
   221             symbol->action_association_list->accept(*this);
   237             symbol->action_association_list->accept(*this);
   222             s4o.indent_left();
   238             s4o.indent_left();
   223             s4o.print(s4o.indent_spaces + "}\n\n");
   239             s4o.print(s4o.indent_spaces + "}\n\n");
   224           }
   240           }
   225           break;
   241           break;
   261           // Calculate transition value
   277           // Calculate transition value
   262           symbol->transition_condition->accept(*this);
   278           symbol->transition_condition->accept(*this);
   263           
   279           
   264           if (symbol->integer != NULL) {
   280           if (symbol->integer != NULL) {
   265             s4o.print(s4o.indent_spaces + "if (");
   281             s4o.print(s4o.indent_spaces + "if (");
       
   282             s4o.print(GET_VAR);
       
   283             s4o.print("(");
   266             print_variable_prefix();
   284             print_variable_prefix();
   267             s4o.print("__transition_list[");
   285             s4o.print("__transition_list[");
   268             print_transition_number();
   286             print_transition_number();
   269             s4o.print("]) {\n");
   287             s4o.print("])) {\n");
   270             s4o.indent_right();
   288             s4o.indent_right();
   271             wanted_sfcgeneration = stepreset_sg;
   289             wanted_sfcgeneration = stepreset_sg;
   272             symbol->from_steps->accept(*this);
   290             symbol->from_steps->accept(*this);
   273             wanted_sfcgeneration = transitiontest_sg;
   291             wanted_sfcgeneration = transitiontest_sg;
   274             s4o.indent_left();
   292             s4o.indent_left();
   285           symbol->transition_condition->accept(*this);
   303           symbol->transition_condition->accept(*this);
   286           wanted_sfcgeneration = transitiontest_sg;
   304           wanted_sfcgeneration = transitiontest_sg;
   287           s4o.indent_left();
   305           s4o.indent_left();
   288           s4o.print(s4o.indent_spaces + "}\n");
   306           s4o.print(s4o.indent_spaces + "}\n");
   289           s4o.print(s4o.indent_spaces);
   307           s4o.print(s4o.indent_spaces);
       
   308           s4o.print(SET_VAR);
       
   309           s4o.print("(");
   290           print_variable_prefix();
   310           print_variable_prefix();
   291           s4o.print("__transition_list[");
   311           s4o.print("__transition_list[");
   292           print_transition_number();
   312           print_transition_number();
   293           s4o.print("] = 0;\n");
   313           s4o.print("],0);\n");
   294           s4o.indent_left();
   314           s4o.indent_left();
   295           s4o.print(s4o.indent_spaces + "}\n");
   315           s4o.print(s4o.indent_spaces + "}\n");
   296           break;
   316           break;
   297         case stepset_sg:
   317         case stepset_sg:
   298           s4o.print(s4o.indent_spaces + "if (");
   318           s4o.print(s4o.indent_spaces + "if (");
       
   319           s4o.print(GET_VAR);
       
   320           s4o.print("(");
   299           print_variable_prefix();
   321           print_variable_prefix();
   300           s4o.print("__transition_list[");
   322           s4o.print("__transition_list[");
   301           print_transition_number();
   323           print_transition_number();
   302           s4o.print("]) {\n");
   324           s4o.print("])) {\n");
   303           s4o.indent_right();
   325           s4o.indent_right();
   304           symbol->to_steps->accept(*this);
   326           symbol->to_steps->accept(*this);
   305           s4o.indent_left();
   327           s4o.indent_left();
   306           s4o.print(s4o.indent_spaces + "}\n");
   328           s4o.print(s4o.indent_spaces + "}\n");
   307           transition_number++;
   329           transition_number++;
   308           break;
   330           break;
   309         case stepreset_sg:
   331         case stepreset_sg:
   310           if (symbol->integer == NULL) {
   332           if (symbol->integer == NULL) {
   311             s4o.print(s4o.indent_spaces + "if (");
   333             s4o.print(s4o.indent_spaces + "if (");
       
   334             s4o.print(GET_VAR);
       
   335             s4o.print("(");
   312             print_variable_prefix();
   336             print_variable_prefix();
   313             s4o.print("__transition_list[");
   337             s4o.print("__transition_list[");
   314             print_transition_number();
   338             print_transition_number();
   315             s4o.print("]) {\n");
   339             s4o.print("])) {\n");
   316             s4o.indent_right();
   340             s4o.indent_right();
   317             symbol->from_steps->accept(*this);
   341             symbol->from_steps->accept(*this);
   318             s4o.indent_left();
   342             s4o.indent_left();
   319             s4o.print(s4o.indent_spaces + "}\n");
   343             s4o.print(s4o.indent_spaces + "}\n");
   320           }
   344           }
   333           // Transition condition is in IL
   357           // Transition condition is in IL
   334           if (symbol->transition_condition_il != NULL) {
   358           if (symbol->transition_condition_il != NULL) {
   335             generate_c_il->declare_backup_variable();
   359             generate_c_il->declare_backup_variable();
   336             s4o.print(s4o.indent_spaces);
   360             s4o.print(s4o.indent_spaces);
   337             symbol->transition_condition_il->accept(*generate_c_il);
   361             symbol->transition_condition_il->accept(*generate_c_il);
       
   362             s4o.print(SET_VAR);
       
   363             s4o.print("(");
   338             print_variable_prefix();
   364             print_variable_prefix();
   339             if (wanted_sfcgeneration == transitiontestdebug_sg)
   365             if (wanted_sfcgeneration == transitiontestdebug_sg)
   340               s4o.print("__debug_");
   366               s4o.print("__debug_");
   341             else
   367             else
   342               s4o.print("__");
   368               s4o.print("__");
   343             s4o.print("transition_list[");
   369             s4o.print("transition_list[");
   344             print_transition_number();
   370             print_transition_number();
   345             s4o.print("] = ");
   371             s4o.print("],");
   346             generate_c_il->print_backup_variable();
   372             generate_c_il->print_backup_variable();
   347             s4o.print(";\n");
   373             s4o.print(");\n");
   348           }
   374           }
   349           // Transition condition is in ST
   375           // Transition condition is in ST
   350           if (symbol->transition_condition_st != NULL) {
   376           if (symbol->transition_condition_st != NULL) {
   351             s4o.print(s4o.indent_spaces);
   377             s4o.print(s4o.indent_spaces);
       
   378             s4o.print(SET_VAR);
       
   379             s4o.print("(");
   352             print_variable_prefix();
   380             print_variable_prefix();
   353             if (wanted_sfcgeneration == transitiontestdebug_sg)
   381             if (wanted_sfcgeneration == transitiontestdebug_sg)
   354               s4o.print("__debug_");
   382               s4o.print("__debug_");
   355             else
   383             else
   356               s4o.print("__");
   384               s4o.print("__");
   357             s4o.print("transition_list[");
   385             s4o.print("transition_list[");
   358             print_transition_number();
   386             print_transition_number();
   359             s4o.print("] = ");
   387             s4o.print("],");
   360             symbol->transition_condition_st->accept(*generate_c_st);
   388             symbol->transition_condition_st->accept(*generate_c_st);
   361             s4o.print(";\n");
   389             s4o.print(");\n");
   362           }
   390           }
   363           if (wanted_sfcgeneration == transitiontest_sg) {
   391           if (wanted_sfcgeneration == transitiontest_sg) {
   364             s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
   392             s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
   365             s4o.indent_right();
   393             s4o.indent_right();
   366             s4o.print(s4o.indent_spaces);
   394             s4o.print(s4o.indent_spaces);
       
   395             s4o.print(SET_VAR);
       
   396             s4o.print("(");
   367             print_variable_prefix();
   397             print_variable_prefix();
   368             s4o.print("__debug_transition_list[");
   398             s4o.print("__debug_transition_list[");
   369             print_transition_number();
   399             print_transition_number();
   370             s4o.print("] = ");
   400             s4o.print("],");
   371             print_variable_prefix();
   401             print_variable_prefix();
   372             s4o.print("__transition_list[");
   402             s4o.print("__transition_list[");
   373             print_transition_number();
   403             print_transition_number();
   374             s4o.print("];\n");
   404             s4o.print("]);\n");
   375             s4o.indent_left();
   405             s4o.indent_left();
   376             s4o.print(s4o.indent_spaces + "}\n");
   406             s4o.print(s4o.indent_spaces + "}\n");
   377           }
   407           }
   378           break;
   408           break;
   379         default:
   409         default:
   407 
   437 
   408     void *visit(steps_c *symbol) {
   438     void *visit(steps_c *symbol) {
   409       if (symbol->step_name != NULL) {
   439       if (symbol->step_name != NULL) {
   410         switch (wanted_sfcgeneration) {
   440         switch (wanted_sfcgeneration) {
   411           case transitiontest_sg:
   441           case transitiontest_sg:
       
   442         	s4o.print(GET_VAR);
       
   443         	s4o.print("(");
   412             print_step_argument(symbol->step_name, "state");
   444             print_step_argument(symbol->step_name, "state");
       
   445             s4o.print(")");
   413             break;
   446             break;
   414           case stepset_sg:
   447           case stepset_sg:
   415             print_set_step(symbol->step_name);
   448             print_set_step(symbol->step_name);
   416             break;
   449             break;
   417           case stepreset_sg:
   450           case stepreset_sg:
   429     
   462     
   430     void *visit(step_name_list_c *symbol) {
   463     void *visit(step_name_list_c *symbol) {
   431       switch (wanted_sfcgeneration) {
   464       switch (wanted_sfcgeneration) {
   432         case transitiontest_sg:
   465         case transitiontest_sg:
   433           for(int i = 0; i < symbol->n; i++) {
   466           for(int i = 0; i < symbol->n; i++) {
       
   467         	s4o.print(GET_VAR);
       
   468         	s4o.print("(");
   434             print_step_argument(symbol->elements[i], "state");
   469             print_step_argument(symbol->elements[i], "state");
       
   470             s4o.print(")");
   435             if (i < symbol->n - 1) {
   471             if (i < symbol->n - 1) {
   436               s4o.print(" && ");
   472               s4o.print(" && ");
   437             }
   473             }
   438           }
   474           }
   439           break;
   475           break;
   471             current_action = symbol->action_name;
   507             current_action = symbol->action_name;
   472             symbol->action_qualifier->accept(*this);
   508             symbol->action_qualifier->accept(*this);
   473           }
   509           }
   474           else {
   510           else {
   475             s4o.print(s4o.indent_spaces + "if (");
   511             s4o.print(s4o.indent_spaces + "if (");
       
   512             s4o.print(GET_VAR);
       
   513             s4o.print("(");
   476             print_step_argument(current_step, "state");
   514             print_step_argument(current_step, "state");
   477             s4o.print(") {\n");
   515             s4o.print(")) {\n");
   478             s4o.indent_right();
   516             s4o.indent_right();
   479             s4o.print(s4o.indent_spaces);
   517             s4o.print(s4o.indent_spaces);
   480             print_action_argument(symbol->action_name, "state");
   518             print_action_argument(symbol->action_name, "state");
   481             s4o.print(" = 1;\n");
   519             s4o.print(" = 1;\n");
   482             s4o.indent_left();
   520             s4o.indent_left();
   593   
   631   
   594   private:
   632   private:
   595     generate_c_sfc_elements_c *generate_c_sfc_elements;
   633     generate_c_sfc_elements_c *generate_c_sfc_elements;
   596     
   634     
   597   public:
   635   public:
   598     generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL)
   636     generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
   599     : generate_c_typedecl_c(s4o_ptr) {
   637     : generate_c_typedecl_c(s4o_ptr) {
   600       generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, scope, variable_prefix);
   638       generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix);
   601       this->set_variable_prefix(variable_prefix);
   639       this->set_variable_prefix(variable_prefix);
   602     }
   640     }
   603   
   641   
   604     virtual ~generate_c_sfc_c(void) {
   642     virtual ~generate_c_sfc_c(void) {
   605       delete generate_c_sfc_elements;
   643       delete generate_c_sfc_elements;
   638       s4o.print("__nb_steps; i++) {\n");
   676       s4o.print("__nb_steps; i++) {\n");
   639       s4o.indent_right();
   677       s4o.indent_right();
   640       s4o.print(s4o.indent_spaces);
   678       s4o.print(s4o.indent_spaces);
   641       print_variable_prefix();
   679       print_variable_prefix();
   642       s4o.print("__step_list[i].prev_state = ");
   680       s4o.print("__step_list[i].prev_state = ");
   643       print_variable_prefix();
   681       s4o.print(GET_VAR);
   644       s4o.print("__step_list[i].state;\n");
   682       s4o.print("(");
       
   683       print_variable_prefix();
       
   684       s4o.print("__step_list[i].state);\n");
   645       s4o.print(s4o.indent_spaces + "if (");
   685       s4o.print(s4o.indent_spaces + "if (");
   646       print_variable_prefix();
   686       s4o.print(GET_VAR);
   647       s4o.print("__step_list[i].state) {\n");
   687       s4o.print("(");
       
   688       print_variable_prefix();
       
   689       s4o.print("__step_list[i].state)) {\n");
   648       s4o.indent_right();
   690       s4o.indent_right();
   649       s4o.print(s4o.indent_spaces);
   691       s4o.print(s4o.indent_spaces);
   650       print_variable_prefix();
   692       print_variable_prefix();
   651       s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, ");
   693       s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, ");
   652       print_variable_prefix();
   694       print_variable_prefix();