# HG changeset patch # User mjsousa # Date 1396133169 0 # Node ID b2604fc6d25c037a075ef129e165c231e7b61030 # Parent 599e88d12f9a99e705c80e6907dbaa00e46ef369 Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on) diff -r 599e88d12f9a -r b2604fc6d25c lib/accessor.h --- a/lib/accessor.h Wed Mar 19 12:13:43 2014 +0000 +++ b/lib/accessor.h Sat Mar 29 22:46:09 2014 +0000 @@ -113,15 +113,15 @@ // variable setting macros -#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, ...)\ +#define __SET_VAR(prefix, name, suffix, new_value)\ + if (!(prefix name.flags & __IEC_FORCE_FLAG)) prefix name.value suffix = new_value +#define __SET_EXTERNAL(prefix, name, suffix, new_value)\ {extern IEC_BYTE __IS_GLOBAL_##name##_FORCED();\ if (!(prefix name.flags & __IEC_FORCE_FLAG || __IS_GLOBAL_##name##_FORCED()))\ - (*(prefix name.value)) __VA_ARGS__ = new_value;} -#define __SET_EXTERNAL_FB(prefix, name, new_value, ...)\ - __SET_VAR((*(prefix name)), __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 + (*(prefix name.value)) suffix = new_value;} +#define __SET_EXTERNAL_FB(prefix, name, suffix, new_value)\ + __SET_VAR((*(prefix name)), suffix, new_value) +#define __SET_LOCATED(prefix, name, suffix, new_value)\ + if (!(prefix name.flags & __IEC_FORCE_FLAG)) *(prefix name.value) suffix = new_value #endif //__ACCESSOR_H diff -r 599e88d12f9a -r b2604fc6d25c lib/rtc.txt --- a/lib/rtc.txt Wed Mar 19 12:13:43 2014 +0000 +++ b/lib/rtc.txt Sat Mar 29 22:46:09 2014 +0000 @@ -29,7 +29,7 @@ CURRENT_TIME : DT; END_VAR - {__SET_VAR(data__->,CURRENT_TIME,__CURRENT_TIME)} + {__SET_VAR(data__->,CURRENT_TIME,,__CURRENT_TIME)} IF IN THEN diff -r 599e88d12f9a -r b2604fc6d25c lib/timer.txt --- a/lib/timer.txt Wed Mar 19 12:13:43 2014 +0000 +++ b/lib/timer.txt Sat Mar 29 22:46:09 2014 +0000 @@ -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 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c.cc Sat Mar 29 22:46:09 2014 +0000 @@ -380,6 +380,131 @@ /***********************************************************************/ /***********************************************************************/ /***********************************************************************/ +/* A helper class that analyses if the datatype of a variable is 'complex'. */ +/* 'complex' means that it is either a strcuture or an array! */ +class print_getter_c: public search_visitor_c { + private: + static print_getter_c *singleton_; + + public: + print_getter_c(void) {}; + + static bool is_complex_type(symbol_c *symbol) { + if (NULL == symbol) ERROR; + if (!get_datatype_info_c::is_type_valid (symbol->datatype)) return false; + return ( get_datatype_info_c::is_structure(symbol->datatype) + || get_datatype_info_c::is_array (symbol->datatype) + ); + } + + + private: + symbol_c *last_fb, *first_non_fb_identifier; + + public: + /* returns the first element (from left to right) in a structured variable that is not a FB, i.e. is either a structure or an array! */ + /* eg: + * fb1.fb2.fb3.real returns ?????? + * fb1.fb2.struct1.real returns struct1 + * struct1.real returns struct1 + */ + static symbol_c *find_first_nonfb(symbol_c *symbol) { + if (NULL == singleton_) singleton_ = new print_getter_c(); + if (NULL == singleton_) ERROR; + if (NULL == symbol) ERROR; + + singleton_->last_fb = NULL; + singleton_->first_non_fb_identifier = NULL; + return (symbol_c *)symbol->accept(*singleton_); + } + + /* returns true if a strcutured variable (e.g. fb1.fb2.strcut1.real) contains a structure or array */ + /* eg: + * fb1.fb2.fb3.real returns FALSE + * fb1.fb2.struct1.real returns TRUE + * struct1.real returns TRUE + */ + static bool contains_complex_type(symbol_c *symbol) { + if (NULL == symbol) ERROR; + if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; + + symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); + return is_complex_type(first_non_fb->datatype); + } + + + /* returns the datatype of the variable returned by find_first_nonfb() */ + /* eg: + * fb1.fb2.fb3.real returns ?????? + * fb1.fb2.struct1.real returns datatype of struct1 + * struct1.real returns datatype of struct1 + */ + static search_var_instance_decl_c::vt_t first_nonfb_vardecltype(symbol_c *symbol, symbol_c *scope) { + if (NULL == symbol) ERROR; + if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; + + symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); + if (NULL != singleton_->last_fb) { + scope = singleton_->last_fb->datatype; + symbol = singleton_->first_non_fb_identifier; + } + + search_var_instance_decl_c search_var_instance_decl(scope); + + return search_var_instance_decl.get_vartype(symbol); + } + + + /*********************/ + /* B 1.4 - Variables */ + /*********************/ + void *visit(symbolic_variable_c *symbol) { + if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; + if (!get_datatype_info_c::is_function_block(symbol->datatype)) { + first_non_fb_identifier = symbol; + return (void *)symbol; + } + last_fb = symbol; + return NULL; + } + + /*************************************/ + /* B.1.4.2 Multi-element Variables */ + /*************************************/ + + // SYM_REF2(structured_variable_c, record_variable, field_selector) + void *visit(structured_variable_c *symbol) { + symbol_c *res = (symbol_c *)symbol->record_variable->accept(*this); + if (NULL != res) return res; + + if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; + if (!get_datatype_info_c::is_function_block(symbol->datatype)) { + first_non_fb_identifier = symbol->field_selector; + return (void *)symbol; + } + + last_fb = symbol; + return NULL; + } + + /* subscripted_variable '[' subscript_list ']' */ + //SYM_REF2(array_variable_c, subscripted_variable, subscript_list) + void *visit(array_variable_c *symbol) { + void *res = symbol->subscripted_variable->accept(*this); + if (NULL != res) return res; + return (void *)symbol; + } + + +}; + +print_getter_c *print_getter_c::singleton_ = NULL; + + + + + + /* A helper class that analyses if the datatype of a variable is 'complex'. */ /* 'complex' means that it is either a strcuture or an array! */ @@ -1567,7 +1692,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"); @@ -1577,7 +1702,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"); @@ -2397,7 +2522,7 @@ s4o.print(SET_VAR); s4o.print("("); current_task_name->accept(*this); - s4o.print("_R_TRIG.,CLK, *"); + s4o.print("_R_TRIG.,CLK,, *"); symbol->single_data_source->accept(*this); s4o.print(");}\n"); s4o.print(s4o.indent_spaces + "R_TRIG"); diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_il.cc --- a/stage4/generate_c/generate_c_il.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_il.cc Sat Mar 29 22:46:09 2014 +0000 @@ -445,8 +445,8 @@ wanted_variablegeneration = complextype_base_assignment_vg; else wanted_variablegeneration = assignment_vg; - symbol->accept(*this); +/* s4o.print(","); if (negative) { if (get_datatype_info_c::is_BOOL_compatible(this->current_operand->datatype)) @@ -464,6 +464,24 @@ s4o.print(")"); wanted_variablegeneration = expression_vg; return NULL; +*/ + s4o.print(","); + if (type_is_complex) { + wanted_variablegeneration = complextype_suffix_vg; + symbol->accept(*this); + } + s4o.print(","); + if (negative) { + if (get_datatype_info_c::is_BOOL_compatible(this->current_operand->datatype)) + s4o.print("!"); + else + s4o.print("~"); + } + wanted_variablegeneration = expression_vg; + print_check_function(type, value, fb_value); + s4o.print(")"); + wanted_variablegeneration = expression_vg; + return NULL; } public: diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_inlinefcall.cc --- a/stage4/generate_c/generate_c_inlinefcall.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_inlinefcall.cc Sat Mar 29 22:46:09 2014 +0000 @@ -281,7 +281,7 @@ else s4o.print(SET_VAR); s4o.print("(,"); - +/* wanted_variablegeneration = complextype_base_vg; symbol->accept(*this); s4o.print(","); @@ -295,6 +295,20 @@ s4o.print(")"); wanted_variablegeneration = expression_vg; return NULL; +*/ + wanted_variablegeneration = complextype_base_vg; + symbol->accept(*this); + s4o.print(","); + if (analyse_variable_c::contains_complex_type(symbol)) { + wanted_variablegeneration = complextype_suffix_vg; + symbol->accept(*this); + } + s4o.print(","); + wanted_variablegeneration = expression_vg; + print_check_function(type, value, NULL, true); + s4o.print(")"); + wanted_variablegeneration = expression_vg; + return NULL; } /*********************/ diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_sfc.cc --- a/stage4/generate_c/generate_c_sfc.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_sfc.cc Sat Mar 29 22:46:09 2014 +0000 @@ -136,7 +136,7 @@ s4o.print(SET_VAR); s4o.print("("); print_step_argument(step_name, "state", true); - s4o.print(",0);\n"); + s4o.print(",,0);\n"); } void print_set_step(symbol_c *step_name) { @@ -144,7 +144,7 @@ s4o.print(SET_VAR); s4o.print("("); print_step_argument(step_name, "state", true); - 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"); } @@ -299,7 +299,7 @@ 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; @@ -358,7 +358,7 @@ s4o.print("__"); s4o.print("transition_list["); print_transition_number(); - s4o.print("],"); + s4o.print("],,"); generate_c_il->print_implicit_variable_back(); // generate_c_il->reset_default_variable_name(); // generate_c_il does not require his anymore s4o.print(");\n"); @@ -376,7 +376,7 @@ s4o.print("__"); s4o.print("transition_list["); print_transition_number(); - s4o.print("],"); + s4o.print("],,"); symbol->transition_condition_st->accept(*generate_c_st); s4o.print(");\n"); } @@ -389,7 +389,7 @@ print_variable_prefix(); s4o.print(",__debug_transition_list["); print_transition_number(); - s4o.print("],"); + s4o.print("],,"); s4o.print(GET_VAR); s4o.print("("); print_variable_prefix(); @@ -514,7 +514,7 @@ s4o.print(SET_VAR); s4o.print("("); print_action_argument(symbol->action_name, "state", true); - s4o.print(",1);\n"); + s4o.print(",,1);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}"); } @@ -575,7 +575,7 @@ print_variable_prefix(); s4o.print(","); current_action->accept(*this); - s4o.print(",1);\n"); + s4o.print(",,1);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); s4o.print(s4o.indent_spaces + "else if (active) {\n"); @@ -591,14 +591,14 @@ print_variable_prefix(); s4o.print(","); current_action->accept(*this); - s4o.print(",0);\n"); + s4o.print(",,0);\n"); } else { s4o.print(SET_VAR); s4o.print("("); print_action_argument(current_action, "state", true); - s4o.print(",1);\n"); + s4o.print(",,1);\n"); } } if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) { @@ -773,7 +773,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); - s4o.print(",__action_list[i].state,0);\n"); + s4o.print(",__action_list[i].state,,0);\n"); s4o.print(s4o.indent_spaces); print_variable_prefix(); s4o.print("__action_list[i].set = 0;\n"); @@ -895,7 +895,7 @@ s4o.print(SET_VAR); s4o.print("("); print_variable_prefix(); - s4o.print(",__action_list[i].state,"); + s4o.print(",__action_list[i].state,,"); s4o.print(GET_VAR); s4o.print("("); print_variable_prefix(); @@ -932,7 +932,7 @@ print_variable_prefix(); s4o.print(","); pt->symbol->accept(*this); - s4o.print(",0);\n"); + s4o.print(",,0);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); s4o.print(s4o.indent_spaces + "else if ("); @@ -953,7 +953,7 @@ print_variable_prefix(); s4o.print(","); pt->symbol->accept(*this); - s4o.print(",1);\n"); + s4o.print(",,1);\n"); s4o.indent_left(); s4o.print(s4o.indent_spaces + "}\n"); } diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_sfcdecl.cc --- a/stage4/generate_c/generate_c_sfcdecl.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_sfcdecl.cc Sat Mar 29 22:46:09 2014 +0000 @@ -252,7 +252,7 @@ print_variable_prefix(); s4o.print(",__step_list["); s4o.print(step_number); - s4o.print("].state,1);\n"); + s4o.print("].state,,1);\n"); step_number++; break; case stepdef_sd: diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_st.cc Sat Mar 29 22:46:09 2014 +0000 @@ -213,6 +213,7 @@ else wanted_variablegeneration = assignment_vg; +/* symbol->accept(*this); s4o.print(","); wanted_variablegeneration = expression_vg; @@ -225,6 +226,19 @@ s4o.print(")"); wanted_variablegeneration = expression_vg; return NULL; +*/ + symbol->accept(*this); + s4o.print(","); + if (type_is_complex) { + wanted_variablegeneration = complextype_suffix_vg; + symbol->accept(*this); + } + s4o.print(","); + wanted_variablegeneration = expression_vg; + print_check_function(type, value, fb_value); + s4o.print(")"); + wanted_variablegeneration = expression_vg; + return NULL; } /********************************/ diff -r 599e88d12f9a -r b2604fc6d25c stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Wed Mar 19 12:13:43 2014 +0000 +++ b/stage4/generate_c/generate_c_vardecl.cc Sat Mar 29 22:46:09 2014 +0000 @@ -169,7 +169,7 @@ print_variable_prefix(); s4o.print(","); symbol->elements[i]->accept(*this); - s4o.print(",temp);\n"); + s4o.print(",,temp);\n"); } return NULL; } @@ -577,7 +577,7 @@ print_variable_prefix(); s4o.print(","); symbol->elements[i]->accept(*this); - s4o.print(",temp);\n"); + s4o.print(",,temp);\n"); } return NULL; } @@ -1000,7 +1000,7 @@ s4o.print("}\n"); } else if (wanted_varformat == init_vf) { - s4o.print(","); + s4o.print(",,"); this->current_var_init_symbol->accept(*this); s4o.print(");\n"); }