--- 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> 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> 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<VARIABLE>::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<VARIABLE>::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);
}