stage4/generate_c/generate_c_sfc.cc
changeset 628 fe0d516fe291
parent 627 e7caa7d32ef5
child 629 06abc9867095
equal deleted inserted replaced
627:e7caa7d32ef5 628:fe0d516fe291
   396     
   396     
   397     void *visit(action_c *symbol) {
   397     void *visit(action_c *symbol) {
   398       switch (wanted_sfcgeneration) {
   398       switch (wanted_sfcgeneration) {
   399         case actionbody_sg:
   399         case actionbody_sg:
   400           s4o.print(s4o.indent_spaces + "if(");
   400           s4o.print(s4o.indent_spaces + "if(");
       
   401           s4o.print(GET_VAR);
       
   402           s4o.print("(");
   401           print_variable_prefix();
   403           print_variable_prefix();
   402           s4o.print("__action_list[");
   404           s4o.print("__action_list[");
   403           s4o.print(SFC_STEP_ACTION_PREFIX);
   405           s4o.print(SFC_STEP_ACTION_PREFIX);
   404           symbol->action_name->accept(*this);
   406           symbol->action_name->accept(*this);
   405           s4o.print("].state) {\n");
   407           s4o.print("].state)) {\n");
   406           s4o.indent_right();
   408           s4o.indent_right();
   407           
   409           
   408           // generate action code
   410           // generate action code
   409           symbol->function_block_body->accept(*generate_c_code);
   411           symbol->function_block_body->accept(*generate_c_code);
   410           
   412           
   495             s4o.print("(");
   497             s4o.print("(");
   496             print_step_argument(current_step, "state");
   498             print_step_argument(current_step, "state");
   497             s4o.print(")) {\n");
   499             s4o.print(")) {\n");
   498             s4o.indent_right();
   500             s4o.indent_right();
   499             s4o.print(s4o.indent_spaces);
   501             s4o.print(s4o.indent_spaces);
   500             print_action_argument(symbol->action_name, "state");
   502             s4o.print(SET_VAR);
   501             s4o.print(" = 1;\n");
   503             s4o.print("(");
       
   504             print_action_argument(symbol->action_name, "state", true);
       
   505             s4o.print(",1);\n");
   502             s4o.indent_left();
   506             s4o.indent_left();
   503             s4o.print(s4o.indent_spaces + "}");
   507             s4o.print(s4o.indent_spaces + "}");
   504           }
   508           }
   505           break;
   509           break;
   506         default:
   510         default:
   543             s4o.indent_right();
   547             s4o.indent_right();
   544             s4o.print(s4o.indent_spaces);
   548             s4o.print(s4o.indent_spaces);
   545             if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "P") == 0 ||
   549             if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "P") == 0 ||
   546                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0 ||
   550                 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0 ||
   547                 strcmp(qualifier, "P0") == 0 || strcmp(qualifier, "P1") == 0) {
   551                 strcmp(qualifier, "P0") == 0 || strcmp(qualifier, "P1") == 0) {
   548               print_action_argument(current_action, "state");
   552               s4o.print(SET_VAR);
   549               s4o.print(" = 1;\n");  
   553               s4o.print("(");
       
   554               print_action_argument(current_action, "state", true);
       
   555               s4o.print(",1);\n");
   550             }
   556             }
   551             if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) {
   557             if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) {
   552               print_action_argument(current_action, "set");
   558               print_action_argument(current_action, "set");
   553               s4o.print(" = 1;\n");
   559               s4o.print(" = 1;\n");
   554             }
   560             }
   717       s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
   723       s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
   718       print_variable_prefix();
   724       print_variable_prefix();
   719       s4o.print("__nb_actions; i++) {\n");
   725       s4o.print("__nb_actions; i++) {\n");
   720       s4o.indent_right();
   726       s4o.indent_right();
   721       s4o.print(s4o.indent_spaces);
   727       s4o.print(s4o.indent_spaces);
   722       print_variable_prefix();
   728       s4o.print(SET_VAR);
   723       s4o.print("__action_list[i].state = 0;\n");
   729       s4o.print("(");
       
   730       print_variable_prefix();
       
   731       s4o.print(",__action_list[i].state,0);\n");
   724       s4o.print(s4o.indent_spaces);
   732       s4o.print(s4o.indent_spaces);
   725       print_variable_prefix();
   733       print_variable_prefix();
   726       s4o.print("__action_list[i].set = 0;\n");
   734       s4o.print("__action_list[i].set = 0;\n");
   727       s4o.print(s4o.indent_spaces);
   735       s4o.print(s4o.indent_spaces);
   728       print_variable_prefix();
   736       print_variable_prefix();
   837       s4o.print("__action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
   845       s4o.print("__action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
   838       print_variable_prefix();
   846       print_variable_prefix();
   839       s4o.print("__action_list[i].stored = 0;\n");
   847       s4o.print("__action_list[i].stored = 0;\n");
   840       s4o.indent_left();
   848       s4o.indent_left();
   841       s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
   849       s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
   842       print_variable_prefix();
   850       s4o.print(SET_VAR);
   843       s4o.print("__action_list[i].state |= ");
   851       s4o.print("(");
   844       print_variable_prefix();
   852       print_variable_prefix();
   845       s4o.print("__action_list[i].stored;\n");
   853       s4o.print(",__action_list[i].state,");
       
   854       s4o.print(GET_VAR);
       
   855       s4o.print("(");
       
   856       print_variable_prefix();
       
   857       s4o.print("__action_list[i].state) | ");
       
   858       print_variable_prefix();
       
   859       s4o.print("__action_list[i].stored);\n");
   846       s4o.indent_left();
   860       s4o.indent_left();
   847       s4o.print(s4o.indent_spaces + "}\n\n");
   861       s4o.print(s4o.indent_spaces + "}\n\n");
   848       
   862       
   849       /* generate action execution */
   863       /* generate action execution */
   850       s4o.print(s4o.indent_spaces + "// Actions execution\n");
   864       s4o.print(s4o.indent_spaces + "// Actions execution\n");
   865             s4o.print("(");
   879             s4o.print("(");
   866           	print_variable_prefix();
   880           	print_variable_prefix();
   867           	s4o.print(",");
   881           	s4o.print(",");
   868           	pt->symbol->accept(*this);
   882           	pt->symbol->accept(*this);
   869             s4o.print(",");
   883             s4o.print(",");
       
   884             s4o.print(GET_VAR);
       
   885             s4o.print("(");
   870             print_variable_prefix();
   886             print_variable_prefix();
   871             s4o.print("__action_list[");
   887             s4o.print("__action_list[");
   872             s4o.print(SFC_STEP_ACTION_PREFIX);
   888             s4o.print(SFC_STEP_ACTION_PREFIX);
   873             pt->symbol->accept(*this);
   889             pt->symbol->accept(*this);
   874             s4o.print("].state);\n");
   890             s4o.print("].state));\n");
   875           }
   891           }
   876         }
   892         }
   877       }
   893       }
   878       for(i = 0; i < symbol->n; i++) {
   894       for(i = 0; i < symbol->n; i++) {
   879         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg);
   895         generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg);