diff -r 90782e241346 -r d7d92b2f87e9 stage4/generate_c/generate_c_sfc.cc --- a/stage4/generate_c/generate_c_sfc.cc Wed Mar 30 19:53:32 2011 +0100 +++ b/stage4/generate_c/generate_c_sfc.cc Thu Mar 31 10:45:34 2011 +0100 @@ -38,10 +38,6 @@ int index; } TRANSITION; - - - - /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ @@ -64,7 +60,6 @@ generate_c_il_c *generate_c_il; generate_c_st_c *generate_c_st; generate_c_SFC_IL_ST_c *generate_c_code; - search_var_instance_decl_c *search_var_instance_decl; int transition_number; std::list transition_list; @@ -75,12 +70,11 @@ sfcgeneration_t wanted_sfcgeneration; public: - generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) + generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) : generate_c_base_c(s4o_ptr) { - generate_c_il = new generate_c_il_c(s4o_ptr, scope, variable_prefix); - generate_c_st = new generate_c_st_c(s4o_ptr, scope, variable_prefix); - generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix); - search_var_instance_decl = new search_var_instance_decl_c(scope); + generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix); + generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix); + generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix); this->set_variable_prefix(variable_prefix); } @@ -89,7 +83,6 @@ delete generate_c_il; delete generate_c_st; delete generate_c_code; - delete search_var_instance_decl; } void reset_transition_number(void) {transition_number = 0;} @@ -131,32 +124,27 @@ } void print_transition_number(void) { - char str[10]; - sprintf(str, "%d", transition_number); - s4o.print(str); + s4o.print_integer(transition_number); } void print_reset_step(symbol_c *step_name) { s4o.print(s4o.indent_spaces); + s4o.print(SET_VAR); + s4o.print("("); print_step_argument(step_name, "state"); - s4o.print(" = 0;\n"); + s4o.print(",0);\n"); } void print_set_step(symbol_c *step_name) { s4o.print(s4o.indent_spaces); + s4o.print(SET_VAR); + s4o.print("("); print_step_argument(step_name, "state"); - s4o.print(" = 1;\n" + s4o.indent_spaces); + s4o.print(",1);\n" + s4o.indent_spaces); print_step_argument(step_name, "elapsed_time"); s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); } - bool is_variable(symbol_c *symbol) { - /* we try to find the variable instance declaration, to determine its type... */ - symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); - - return var_decl != NULL; - } - /*********************************************/ /* B.1.6 Sequential function chart elements */ /*********************************************/ @@ -172,18 +160,24 @@ s4o.print(s4o.indent_spaces + "{\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces + "char activated = "); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(" && !"); + s4o.print(") && !"); print_step_argument(current_step, "prev_state"); s4o.print(";\n"); s4o.print(s4o.indent_spaces + "char desactivated = !"); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(" && "); + s4o.print(") && "); print_step_argument(current_step, "prev_state"); s4o.print(";\n"); s4o.print(s4o.indent_spaces + "char active = "); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(";\n"); + s4o.print(");\n"); symbol->action_association_list->accept(*this); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n\n"); @@ -206,18 +200,24 @@ s4o.print(s4o.indent_spaces + "{\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces + "char activated = "); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(" && !"); + s4o.print(") && !"); print_step_argument(current_step, "prev_state"); s4o.print(";\n"); s4o.print(s4o.indent_spaces + "char desactivated = !"); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(" && "); + s4o.print(") && "); print_step_argument(current_step, "prev_state"); s4o.print(";\n"); s4o.print(s4o.indent_spaces + "char active = "); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(";\n"); + s4o.print(");\n"); symbol->action_association_list->accept(*this); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n\n"); @@ -263,10 +263,12 @@ if (symbol->integer != NULL) { s4o.print(s4o.indent_spaces + "if ("); + s4o.print(GET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__transition_list["); print_transition_number(); - s4o.print("]) {\n"); + s4o.print("])) {\n"); s4o.indent_right(); wanted_sfcgeneration = stepreset_sg; symbol->from_steps->accept(*this); @@ -287,19 +289,23 @@ s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); s4o.print(s4o.indent_spaces); + s4o.print(SET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__transition_list["); print_transition_number(); - s4o.print("] = 0;\n"); + s4o.print("],0);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); break; case stepset_sg: s4o.print(s4o.indent_spaces + "if ("); + s4o.print(GET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__transition_list["); print_transition_number(); - s4o.print("]) {\n"); + s4o.print("])) {\n"); s4o.indent_right(); symbol->to_steps->accept(*this); s4o.indent_left(); @@ -309,10 +315,12 @@ case stepreset_sg: if (symbol->integer == NULL) { s4o.print(s4o.indent_spaces + "if ("); + s4o.print(GET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__transition_list["); print_transition_number(); - s4o.print("]) {\n"); + s4o.print("])) {\n"); s4o.indent_right(); symbol->from_steps->accept(*this); s4o.indent_left(); @@ -335,6 +343,8 @@ generate_c_il->declare_backup_variable(); s4o.print(s4o.indent_spaces); symbol->transition_condition_il->accept(*generate_c_il); + s4o.print(SET_VAR); + s4o.print("("); print_variable_prefix(); if (wanted_sfcgeneration == transitiontestdebug_sg) s4o.print("__debug_"); @@ -342,13 +352,15 @@ s4o.print("__"); s4o.print("transition_list["); print_transition_number(); - s4o.print("] = "); + s4o.print("],"); generate_c_il->print_backup_variable(); - s4o.print(";\n"); + s4o.print(");\n"); } // Transition condition is in ST if (symbol->transition_condition_st != NULL) { s4o.print(s4o.indent_spaces); + s4o.print(SET_VAR); + s4o.print("("); print_variable_prefix(); if (wanted_sfcgeneration == transitiontestdebug_sg) s4o.print("__debug_"); @@ -356,22 +368,26 @@ s4o.print("__"); s4o.print("transition_list["); print_transition_number(); - s4o.print("] = "); + s4o.print("],"); symbol->transition_condition_st->accept(*generate_c_st); - s4o.print(";\n"); + s4o.print(");\n"); } if (wanted_sfcgeneration == transitiontest_sg) { s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); + s4o.print(SET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__debug_transition_list["); print_transition_number(); - s4o.print("] = "); + s4o.print("],"); + s4o.print(GET_VAR); + s4o.print("("); print_variable_prefix(); s4o.print("__transition_list["); print_transition_number(); - s4o.print("];\n"); + s4o.print("]));\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); } @@ -409,7 +425,10 @@ if (symbol->step_name != NULL) { switch (wanted_sfcgeneration) { case transitiontest_sg: + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(symbol->step_name, "state"); + s4o.print(")"); break; case stepset_sg: print_set_step(symbol->step_name); @@ -431,7 +450,10 @@ switch (wanted_sfcgeneration) { case transitiontest_sg: for(int i = 0; i < symbol->n; i++) { + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(symbol->elements[i], "state"); + s4o.print(")"); if (i < symbol->n - 1) { s4o.print(" && "); } @@ -473,8 +495,10 @@ } else { s4o.print(s4o.indent_spaces + "if ("); + s4o.print(GET_VAR); + s4o.print("("); print_step_argument(current_step, "state"); - s4o.print(") {\n"); + s4o.print(")) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); print_action_argument(symbol->action_name, "state"); @@ -524,29 +548,17 @@ s4o.print(" = 1;\n"); } if (strcmp(qualifier, "S") == 0) { - if (is_variable(current_action)) { - print_variable_prefix(); - current_action->accept(*this); - } - else - print_action_argument(current_action, "set"); + print_action_argument(current_action, "set"); s4o.print(" = 1;\n"); } if (strcmp(qualifier, "R") == 0) { - if (is_variable(current_action)) { - print_variable_prefix(); - current_action->accept(*this); - s4o.print(" = 0;\n"); - } - else { - print_action_argument(current_action, "reset"); - s4o.print(" = 1;\n"); - } + print_action_argument(current_action, "reset"); + s4o.print(" = 1;\n"); } if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || strcmp(qualifier, "SL") == 0) { if (strcmp(qualifier, "SL") == 0) { - print_action_argument(current_action, "reset_remaining_time"); + print_action_argument(current_action, "reset_remaining_time"); } else { print_action_argument(current_action, "set_remaining_time"); @@ -583,7 +595,6 @@ }; /* generate_c_sfc_actiondecl_c */ - /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ @@ -592,17 +603,30 @@ class generate_c_sfc_c: public generate_c_typedecl_c { private: + std::list variable_list; + generate_c_sfc_elements_c *generate_c_sfc_elements; + search_var_instance_decl_c *search_var_instance_decl; public: - generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) + generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) : generate_c_typedecl_c(s4o_ptr) { - generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, scope, variable_prefix); + generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix); + search_var_instance_decl = new search_var_instance_decl_c(scope); this->set_variable_prefix(variable_prefix); } virtual ~generate_c_sfc_c(void) { + variable_list.clear(); delete generate_c_sfc_elements; + delete search_var_instance_decl; + } + + bool is_variable(symbol_c *symbol) { + /* we try to find the variable instance declaration, to determine if symbol is variable... */ + symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); + + return var_decl != NULL; } /*********************************************/ @@ -614,6 +638,7 @@ generate_c_sfc_elements->reset_transition_number(); for(i = 0; i < symbol->n; i++) { + symbol->elements[i]->accept(*this); generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg); } @@ -621,7 +646,7 @@ s4o.print(s4o.indent_spaces +"BOOL transition;\n"); s4o.print(s4o.indent_spaces +"TIME elapsed_time, current_time;\n\n"); - /* generate elapsed_time initialisations */ + /* generate elapsed_time initializations */ s4o.print(s4o.indent_spaces + "// Calculate elapsed_time\n"); s4o.print(s4o.indent_spaces +"current_time = __CURRENT_TIME;\n"); s4o.print(s4o.indent_spaces +"elapsed_time = __time_sub(__BOOL_LITERAL(TRUE), NULL, current_time, "); @@ -631,20 +656,42 @@ print_variable_prefix(); s4o.print("__lasttick_time = current_time;\n"); - /* generate step initialisations */ - s4o.print(s4o.indent_spaces + "// Steps initialisation\n"); + /* generate transition initializations */ + s4o.print(s4o.indent_spaces + "// Transitions initialization\n"); + s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n"); + s4o.indent_right(); s4o.print(s4o.indent_spaces + "for (i = 0; i < "); print_variable_prefix(); + s4o.print("__nb_transitions; i++) {\n"); + s4o.indent_right(); + s4o.print(s4o.indent_spaces); + print_variable_prefix(); + s4o.print("__transition_list[i] = "); + print_variable_prefix(); + s4o.print("__debug_transition_list[i];\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + s4o.indent_left(); + s4o.print(s4o.indent_spaces + "}\n"); + + /* generate step initializations */ + s4o.print(s4o.indent_spaces + "// Steps initialization\n"); + s4o.print(s4o.indent_spaces + "for (i = 0; i < "); + print_variable_prefix(); s4o.print("__nb_steps; i++) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); print_variable_prefix(); s4o.print("__step_list[i].prev_state = "); - print_variable_prefix(); - s4o.print("__step_list[i].state;\n"); + s4o.print(GET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print("__step_list[i].state);\n"); s4o.print(s4o.indent_spaces + "if ("); - print_variable_prefix(); - s4o.print("__step_list[i].state) {\n"); + s4o.print(GET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print("__step_list[i].state)) {\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); print_variable_prefix(); @@ -656,8 +703,8 @@ s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); - /* generate action initilizations */ - s4o.print(s4o.indent_spaces + "// Actions initialisation\n"); + /* generate action initializations */ + s4o.print(s4o.indent_spaces + "// Actions initialization\n"); s4o.print(s4o.indent_spaces + "for (i = 0; i < "); print_variable_prefix(); s4o.print("__nb_actions; i++) {\n"); @@ -788,6 +835,38 @@ /* generate action execution */ s4o.print(s4o.indent_spaces + "// Actions execution\n"); + { + std::list::iterator pt; + for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { + symbol_c *var_decl = search_var_instance_decl->get_decl(pt->symbol); + if (var_decl != NULL) { + unsigned int vartype = search_var_instance_decl->get_vartype(); + + s4o.print(s4o.indent_spaces); + if (vartype == search_var_instance_decl_c::external_vt) { + s4o.print(SET_EXTERNAL); + s4o.print("("); + pt->symbol->accept(*this); + s4o.print(","); + } + else { + if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + } + print_variable_prefix(); + pt->symbol->accept(*this); + s4o.print(","); + print_variable_prefix(); + s4o.print("__action_list["); + s4o.print(SFC_STEP_ACTION_PREFIX); + pt->symbol->accept(*this); + s4o.print("].state);\n"); + } + } + } for(i = 0; i < symbol->n; i++) { generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg); } @@ -796,6 +875,41 @@ return NULL; } + void *visit(initial_step_c *symbol) { + symbol->action_association_list->accept(*this); + return NULL; + } + + void *visit(step_c *symbol) { + symbol->action_association_list->accept(*this); + return NULL; + } + + void *visit(action_association_c *symbol) { + symbol_c *var_decl = search_var_instance_decl->get_decl(symbol->action_name); + + if (var_decl != NULL) { + std::list::iterator pt; + for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { + if (!compare_identifiers(pt->symbol, symbol->action_name)) + return NULL; + } + VARIABLE *variable; + variable = new VARIABLE; + variable->symbol = (identifier_c*)(symbol->action_name); + variable_list.push_back(*variable); + } + return NULL; + } + + void *visit(transition_c *symbol) { + return NULL; + } + + void *visit(action_c *symbol) { + return NULL; + } + void generate(sequential_function_chart_c *sfc) { sfc->accept(*this); }