# HG changeset patch # User laurent # Date 1321633717 -3600 # Node ID 9b88b8b6bccd35d48ce454d0f647019532619212 # Parent 4798bd4739d09bd15b76602dd33b739638623197 Fixing generated code for global variables. Adding support for defining global variables with complex type Fixing bug preventing to generate SFC transition with IL body diff -r 4798bd4739d0 -r 9b88b8b6bccd lib/accessor.h --- a/lib/accessor.h Fri Nov 18 17:21:16 2011 +0100 +++ b/lib/accessor.h Fri Nov 18 17:28:37 2011 +0100 @@ -6,15 +6,14 @@ // variable declaration macros #define __DECLARE_VAR(type, name)\ __IEC_##type##_t name; -#define __DECLARE_GLOBAL(type, resource, name)\ - __IEC_##type##_t resource##__##name;\ - static __IEC_##type##_t *GLOBAL__##name = &resource##__##name;\ +#define __DECLARE_GLOBAL(type, domain, name)\ + __IEC_##type##_t domain##__##name;\ + static __IEC_##type##_t *GLOBAL__##name = &(domain##__##name);\ void __INIT_GLOBAL_##name(type value) {\ (*GLOBAL__##name).value = value;\ }\ - void __SET_GLOBAL_##name(type value) {\ - if (!((*GLOBAL__##name).flags & __IEC_FORCE_FLAG))\ - (*GLOBAL__##name).value = value;\ + IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ + return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ }\ type* __GET_GLOBAL_##name(void) {\ return &((*GLOBAL__##name).value);\ @@ -23,13 +22,12 @@ extern type *location; #define __DECLARE_GLOBAL_LOCATED(type, resource, name)\ __IEC_##type##_p resource##__##name;\ - static __IEC_##type##_p *GLOBAL__##name = &resource##__##name;\ + static __IEC_##type##_p *GLOBAL__##name = &(resource##__##name);\ void __INIT_GLOBAL_##name(type value) {\ *((*GLOBAL__##name).value) = value;\ }\ - void __SET_GLOBAL_##name(type value) {\ - if (!((*GLOBAL__##name).flags & __IEC_FORCE_FLAG))\ - *((*GLOBAL__##name).value) = value;\ + IEC_BYTE __IS_GLOBAL_##name##_FORCED(void) {\ + return (*GLOBAL__##name).flags & __IEC_FORCE_FLAG;\ }\ type* __GET_GLOBAL_##name(void) {\ return (*GLOBAL__##name).value;\ @@ -52,16 +50,21 @@ __INIT_GLOBAL_##name(temp);\ __INIT_RETAIN((*GLOBAL__##name), retained)\ } -#define __INIT_GLOBAL_LOCATED(resource, name, location, retained)\ - resource##__##name.value = location;\ - __INIT_RETAIN(resource##__##name, retained) +#define __INIT_GLOBAL_LOCATED(domain, name, location, retained)\ + domain##__##name.value = location;\ + __INIT_RETAIN(domain##__##name, retained) #define __INIT_EXTERNAL(type, global, name, retained)\ - name.value = __GET_GLOBAL_##global();\ - __INIT_RETAIN(name, retained) + {\ + extern type* __GET_GLOBAL_##global();\ + name.value = __GET_GLOBAL_##global();\ + __INIT_RETAIN(name, retained)\ + } #define __INIT_LOCATED(type, location, name, retained)\ - {extern type *location;\ - name.value = location;\ - __INIT_RETAIN(name, retained)} + {\ + extern type *location;\ + name.value = location;\ + __INIT_RETAIN(name, retained)\ + } #define __INIT_LOCATED_VALUE(name, initial)\ *(name.value) = initial; @@ -81,14 +84,12 @@ ((name.flags & __IEC_FORCE_FLAG) ? &(name.fvalue __VA_ARGS__) : &(*(name.value) __VA_ARGS__)) // variable setting macros -#define __SET_VAR(name, new_value, ...)\ - if (!(name.flags & __IEC_FORCE_FLAG)) name.value __VA_ARGS__ = new_value -#define __SET_EXTERNAL(global, name, new_value)\ - if (!(name.flags & __IEC_FORCE_FLAG))\ - __SET_GLOBAL_##global(new_value) -#define __SET_COMPLEX_EXTERNAL(name, new_value, ...)\ - *(name.value) __VA_ARGS__ = new_value -#define __SET_LOCATED(name, new_value, ...)\ - if (!(name.flags & __IEC_FORCE_FLAG)) *(name.value) __VA_ARGS__ = new_value +#define __SET_VAR(prefix, name, new_value, ...)\ + if (!(prefix name.flags & __IEC_FORCE_FLAG)) prefix name.value __VA_ARGS__ = new_value +#define __SET_EXTERNAL(prefix, name, new_value, ...)\ + if (!(prefix name.flags & __IEC_FORCE_FLAG || __IS_GLOBAL_##name##_FORCED()))\ + (*(prefix name.value)) __VA_ARGS__ = new_value +#define __SET_LOCATED(prefix, name, new_value, ...)\ + if (!(prefix name.flags & __IEC_FORCE_FLAG)) *(prefix name.value) __VA_ARGS__ = new_value #endif //__ACCESSOR_H diff -r 4798bd4739d0 -r 9b88b8b6bccd lib/timer.txt --- a/lib/timer.txt Fri Nov 18 17:21:16 2011 +0100 +++ b/lib/timer.txt Fri Nov 18 17:28:37 2011 +0100 @@ -90,7 +90,7 @@ CURRENT_TIME, START_TIME : TIME; END_VAR - {__SET_VAR(data__->CURRENT_TIME,__CURRENT_TIME)} + {__SET_VAR(data__->,CURRENT_TIME,__CURRENT_TIME)} IF ((STATE = 0) AND NOT(PREV_IN) AND IN) (* found rising edge on IN *) THEN @@ -171,7 +171,7 @@ CURRENT_TIME, START_TIME : TIME; END_VAR - {__SET_VAR(data__->CURRENT_TIME,__CURRENT_TIME)} + {__SET_VAR(data__->,CURRENT_TIME,__CURRENT_TIME)} IF ((STATE = 0) AND NOT(PREV_IN) AND IN) (* found rising edge on IN *) THEN @@ -255,7 +255,7 @@ CURRENT_TIME, START_TIME : TIME; END_VAR - {__SET_VAR(data__->CURRENT_TIME,__CURRENT_TIME)} + {__SET_VAR(data__->,CURRENT_TIME,__CURRENT_TIME)} IF ((STATE = 0) AND PREV_IN AND NOT(IN)) (* found falling edge on IN *) THEN diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c.cc Fri Nov 18 17:28:37 2011 +0100 @@ -124,7 +124,6 @@ /* Variable setter symbol for accessor macros */ #define SET_VAR "__SET_VAR" #define SET_EXTERNAL "__SET_EXTERNAL" -#define SET_COMPLEX_EXTERNAL "__SET_COMPLEX_EXTERNAL" #define SET_LOCATED "__SET_LOCATED" @@ -1334,7 +1333,7 @@ s4o.print(SET_VAR); s4o.print("("); s4o.print(FB_FUNCTION_PARAM); - s4o.print("->ENO,__BOOL_LITERAL(FALSE));\n"); + s4o.print("->,ENO,__BOOL_LITERAL(FALSE));\n"); s4o.print(s4o.indent_spaces + "return;\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); @@ -1344,7 +1343,7 @@ s4o.print(SET_VAR); s4o.print("("); s4o.print(FB_FUNCTION_PARAM); - s4o.print("->ENO,__BOOL_LITERAL(TRUE));\n"); + s4o.print("->,ENO,__BOOL_LITERAL(TRUE));\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); @@ -1621,7 +1620,8 @@ /* (A.2) Global variables */ vardecl = new generate_c_vardecl_c(&s4o, generate_c_vardecl_c::local_vf, - generate_c_vardecl_c::global_vt); + generate_c_vardecl_c::global_vt, + symbol->configuration_name); vardecl->print(symbol); delete vardecl; s4o.print("\n"); @@ -1894,6 +1894,7 @@ s4o.print("extern unsigned long long common_ticktime__;\n\n"); s4o.print("#include \"accessor.h\"\n\n"); + s4o.print("#include \"POUS.h\"\n\n"); /* (A.2) Global variables... */ if (current_global_vars != NULL) { @@ -1907,7 +1908,6 @@ } /* (A.3) POUs inclusion */ - s4o.print("#include \"POUS.h\"\n\n"); s4o.print("#include \"POUS.c\"\n\n"); wanted_declaretype = declare_dt; @@ -2098,33 +2098,29 @@ if (symbol->single_data_source != NULL) { symbol_c *config_var_decl = NULL; symbol_c *res_var_decl = NULL; - unsigned int vartype; + s4o.print(s4o.indent_spaces + "{"); symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->single_data_source))->global_var_name; res_var_decl = search_resource_instance->get_decl(current_var_reference); if (res_var_decl == NULL) { config_var_decl = search_config_instance->get_decl(current_var_reference); if (config_var_decl == NULL) ERROR; - vartype = search_config_instance->get_vartype(); - s4o.print(s4o.indent_spaces + "{extern "); config_var_decl->accept(*this); - s4o.print(" *"); - symbol->single_data_source->accept(*this); - s4o.print("; "); } else { - vartype = search_resource_instance->get_vartype(); - s4o.print(s4o.indent_spaces); + res_var_decl->accept(*this); } + s4o.print("* "); + symbol->single_data_source->accept(*this); + s4o.print(" = __GET_GLOBAL_"); + symbol->single_data_source->accept(*this); + s4o.print("();"); s4o.print(SET_VAR); s4o.print("("); current_task_name->accept(*this); - s4o.print("_R_TRIG.CLK, *__GET_GLOBAL_"); + s4o.print("_R_TRIG.,CLK, *"); symbol->single_data_source->accept(*this); - s4o.print("());"); - if (config_var_decl != NULL) - s4o.print("}"); - s4o.print("\n"); + s4o.print(");}\n"); s4o.print(s4o.indent_spaces + "R_TRIG"); s4o.print(FB_FUNCTION_SUFFIX); s4o.print("(&"); diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_il.cc --- a/stage4/generate_c/generate_c_il.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_il.cc Fri Nov 18 17:28:37 2011 +0100 @@ -132,6 +132,7 @@ expression_vg, assignment_vg, complextype_base_vg, + complextype_base_assignment_vg, complextype_suffix_vg, fparam_output_vg } variablegeneration_t; @@ -287,6 +288,11 @@ this->default_variable_back_name.accept(*this); } + void reset_default_variable_name(void) { + this->default_variable_name.current_type = NULL; + this->default_variable_back_name.current_type = NULL; + } + private: /* A helper function... */ /* @@ -468,35 +474,21 @@ bool negative = false) { unsigned int vartype = search_varfb_instance_type->get_vartype(symbol); bool type_is_complex = search_varfb_instance_type->type_is_complex(); - if (vartype == search_var_instance_decl_c::external_vt) { - symbolic_variable_c *variable = dynamic_cast(symbol); - /* TODO Find a solution for forcing global complex variables */ - if (variable != NULL) { - s4o.print(SET_EXTERNAL); - s4o.print("("); - variable->var_name->accept(*this); - s4o.print(","); - } - else { - s4o.print(SET_COMPLEX_EXTERNAL); - s4o.print("("); - } - } - else { - if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(SET_LOCATED); - else - s4o.print(SET_VAR); - s4o.print("("); - } + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); if (fb_symbol != NULL) { print_variable_prefix(); fb_symbol->accept(*this); - s4o.print("."); + s4o.print(".,"); } else if (type_is_complex) - wanted_variablegeneration = complextype_base_vg; + wanted_variablegeneration = complextype_base_assignment_vg; else wanted_variablegeneration = assignment_vg; @@ -580,8 +572,13 @@ void *visit(symbolic_variable_c *symbol) { unsigned int vartype; switch (wanted_variablegeneration) { + case complextype_base_assignment_vg: + case assignment_vg: + this->print_variable_prefix(); + s4o.print(","); + symbol->var_name->accept(*this); + break; case complextype_base_vg: - case assignment_vg: generate_c_base_c::visit(symbol); break; case complextype_suffix_vg: @@ -648,6 +645,7 @@ TRACE("structured_variable_c"); switch (wanted_variablegeneration) { case complextype_base_vg: + case complextype_base_assignment_vg: symbol->record_variable->accept(*this); break; case complextype_suffix_vg: @@ -674,6 +672,7 @@ void *visit(array_variable_c *symbol) { switch (wanted_variablegeneration) { case complextype_base_vg: + case complextype_base_assignment_vg: symbol->subscripted_variable->accept(*this); break; case complextype_suffix_vg: diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_inlinefcall.cc --- a/stage4/generate_c/generate_c_inlinefcall.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_inlinefcall.cc Fri Nov 18 17:28:37 2011 +0100 @@ -120,6 +120,9 @@ search_expression_type = new search_expression_type_c(scope); search_varfb_instance_type = new search_varfb_instance_type_c(scope); this->set_variable_prefix(variable_prefix); + current_operand = NULL; + current_operand_type = NULL; + il_default_variable_init_value = NULL; fcall_number = 0; fbname = name; wanted_variablegeneration = expression_vg; @@ -330,27 +333,13 @@ symbol_c* type, symbol_c* value) { unsigned int vartype = search_varfb_instance_type->get_vartype(symbol); - if (vartype == search_var_instance_decl_c::external_vt) { - symbolic_variable_c *variable = dynamic_cast(symbol); - /* TODO Find a solution for forcing global complex variables */ - if (variable != NULL) { - s4o.print(SET_EXTERNAL); - s4o.print("("); - variable->var_name->accept(*this); - s4o.print(","); - } - else { - s4o.print(SET_COMPLEX_EXTERNAL); - s4o.print("("); - } - } - else { - if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(SET_LOCATED); - else - s4o.print(SET_VAR); - s4o.print("("); - } + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("(,"); wanted_variablegeneration = complextype_base_vg; symbol->accept(*this); @@ -469,6 +458,7 @@ } return NULL; } + /* | il_simple_operator [il_operand] */ //SYM_REF2(il_simple_operation_c, il_simple_operator, il_operand) void *visit(il_simple_operation_c *symbol) { diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_sfc.cc --- a/stage4/generate_c/generate_c_sfc.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_sfc.cc Fri Nov 18 17:28:37 2011 +0100 @@ -96,8 +96,9 @@ } } - void print_step_argument(symbol_c *step_name, const char* argument) { - print_variable_prefix(); + void print_step_argument(symbol_c *step_name, const char* argument, bool setter=false) { + print_variable_prefix(); + if (setter) s4o.print(","); s4o.print("__step_list["); s4o.print(SFC_STEP_ACTION_PREFIX); step_name->accept(*this); @@ -105,8 +106,9 @@ s4o.print(argument); } - void print_action_argument(symbol_c *action_name, const char* argument) { - print_variable_prefix(); + void print_action_argument(symbol_c *action_name, const char* argument, bool setter=false) { + print_variable_prefix(); + if (setter) s4o.print(","); s4o.print("__action_list["); s4o.print(SFC_STEP_ACTION_PREFIX); action_name->accept(*this); @@ -122,7 +124,7 @@ s4o.print(s4o.indent_spaces); s4o.print(SET_VAR); s4o.print("("); - print_step_argument(step_name, "state"); + print_step_argument(step_name, "state", true); s4o.print(",0);\n"); } @@ -130,7 +132,7 @@ s4o.print(s4o.indent_spaces); s4o.print(SET_VAR); s4o.print("("); - print_step_argument(step_name, "state"); + print_step_argument(step_name, "state", true); 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"); @@ -283,7 +285,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); - s4o.print("__transition_list["); + s4o.print(",__transition_list["); print_transition_number(); s4o.print("],0);\n"); s4o.indent_left(); @@ -337,6 +339,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); + s4o.print(","); if (wanted_sfcgeneration == transitiontestdebug_sg) s4o.print("__debug_"); else @@ -345,6 +348,7 @@ print_transition_number(); s4o.print("],"); generate_c_il->print_backup_variable(); + generate_c_il->reset_default_variable_name(); s4o.print(");\n"); } // Transition condition is in ST @@ -353,6 +357,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); + s4o.print(","); if (wanted_sfcgeneration == transitiontestdebug_sg) s4o.print("__debug_"); else @@ -370,7 +375,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); - s4o.print("__debug_transition_list["); + s4o.print(",__debug_transition_list["); print_transition_number(); s4o.print("],"); s4o.print(GET_VAR); @@ -842,21 +847,16 @@ unsigned int vartype = search_var_instance_decl->get_vartype(); s4o.print(s4o.indent_spaces); - if (vartype == search_var_instance_decl_c::external_vt) { + 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); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); + print_variable_prefix(); + s4o.print(","); + pt->symbol->accept(*this); s4o.print(","); print_variable_prefix(); s4o.print("__action_list["); diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_sfcdecl.cc --- a/stage4/generate_c/generate_c_sfcdecl.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_sfcdecl.cc Fri Nov 18 17:28:37 2011 +0100 @@ -250,7 +250,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); - s4o.print("__step_list["); + s4o.print(",__step_list["); s4o.print_integer(step_number); s4o.print("].state,1);\n"); step_number++; diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_st.cc Fri Nov 18 17:28:37 2011 +0100 @@ -51,6 +51,7 @@ expression_vg, assignment_vg, complextype_base_vg, + complextype_base_assignment_vg, complextype_suffix_vg, fparam_output_vg } variablegeneration_t; @@ -171,35 +172,21 @@ unsigned int vartype = search_varfb_instance_type->get_vartype(symbol); bool type_is_complex = search_varfb_instance_type->type_is_complex(); - if (vartype == search_var_instance_decl_c::external_vt) { - symbolic_variable_c *variable = dynamic_cast(symbol); - /* TODO Find a solution for forcing global complex variables */ - if (variable != NULL) { - s4o.print(SET_EXTERNAL); - s4o.print("("); - variable->var_name->accept(*this); - s4o.print(","); - } - else { - s4o.print(SET_COMPLEX_EXTERNAL); - s4o.print("("); - } - } - else { - if (vartype == search_var_instance_decl_c::located_vt) - s4o.print(SET_LOCATED); - else - s4o.print(SET_VAR); - s4o.print("("); - } + if (vartype == search_var_instance_decl_c::external_vt) + s4o.print(SET_EXTERNAL); + else if (vartype == search_var_instance_decl_c::located_vt) + s4o.print(SET_LOCATED); + else + s4o.print(SET_VAR); + s4o.print("("); if (fb_symbol != NULL) { print_variable_prefix(); fb_symbol->accept(*this); - s4o.print("."); + s4o.print(".,"); } else if (type_is_complex) - wanted_variablegeneration = complextype_base_vg; + wanted_variablegeneration = complextype_base_assignment_vg; else wanted_variablegeneration = assignment_vg; @@ -249,8 +236,13 @@ void *visit(symbolic_variable_c *symbol) { unsigned int vartype; switch (wanted_variablegeneration) { + case complextype_base_assignment_vg: + case assignment_vg: + this->print_variable_prefix(); + s4o.print(","); + symbol->var_name->accept(*this); + break; case complextype_base_vg: - case assignment_vg: generate_c_base_c::visit(symbol); break; case complextype_suffix_vg: @@ -317,6 +309,7 @@ TRACE("structured_variable_c"); switch (wanted_variablegeneration) { case complextype_base_vg: + case complextype_base_assignment_vg: symbol->record_variable->accept(*this); break; case complextype_suffix_vg: @@ -343,6 +336,7 @@ void *visit(array_variable_c *symbol) { switch (wanted_variablegeneration) { case complextype_base_vg: + case complextype_base_assignment_vg: symbol->subscripted_variable->accept(*this); break; case complextype_suffix_vg: diff -r 4798bd4739d0 -r 9b88b8b6bccd stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Fri Nov 18 17:21:16 2011 +0100 +++ b/stage4/generate_c/generate_c_vardecl.cc Fri Nov 18 17:28:37 2011 +0100 @@ -161,6 +161,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); + s4o.print(","); symbol->elements[i]->accept(*this); s4o.print(",temp);\n"); } @@ -553,6 +554,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); + s4o.print(","); symbol->elements[i]->accept(*this); s4o.print(",temp);\n"); } @@ -924,16 +926,19 @@ s4o.print(" "); else s4o.print(","); + print_variable_prefix(); } else if (wanted_varformat == localinit_vf) { this->current_var_type_symbol->accept(*this); s4o.print(" "); + print_variable_prefix(); } else if (wanted_varformat == init_vf) { s4o.print(SET_VAR); s4o.print("("); + print_variable_prefix(); + s4o.print(","); } - print_variable_prefix(); list->elements[i]->accept(*this); if (wanted_varformat != local_vf) { if (wanted_varformat == localinit_vf &&