# HG changeset patch # User laurent # Date 1260890984 -3600 # Node ID cece842c741723406eb36cd6090cf1f0655255fc # Parent c55b02ca23426e644db740c0480969db295c5837 Adding support for using arrays in POU interface diff -r c55b02ca2342 -r cece842c7417 absyntax_utils/function_param_iterator.cc --- a/absyntax_utils/function_param_iterator.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/absyntax_utils/function_param_iterator.cc Tue Dec 15 16:29:44 2009 +0100 @@ -294,7 +294,14 @@ /* var1_list ':' array_specification */ //SYM_REF2(array_var_declaration_c, var1_list, array_specification) -void *function_param_iterator_c::visit(array_var_declaration_c *symbol) {TRACE("array_var_declaration_c"); return symbol->var1_list->accept(*this);} +void *function_param_iterator_c::visit(array_var_declaration_c *symbol) { + TRACE("array_var_declaration_c"); + + current_param_default_value = NULL; + current_param_type = symbol->array_specification; + + return symbol->var1_list->accept(*this); +} /* var1_list ':' structure_type_name */ //SYM_REF2(structured_var_declaration_c, var1_list, structure_type_name) diff -r c55b02ca2342 -r cece842c7417 lib/iec_types_all.h --- a/lib/iec_types_all.h Tue Dec 15 11:18:19 2009 +0100 +++ b/lib/iec_types_all.h Tue Dec 15 16:29:44 2009 +0100 @@ -47,7 +47,9 @@ } __IEC_##type##_p; #define __DECLARE_ARRAY_TYPE(base, type, size)\ -typedef base type size;\ +typedef struct {\ + base table size;\ +} type;\ __DECLARE_COMPLEX_STRUCT(type); #define __DECLARE_STRUCT_TYPE(elements, type)\ diff -r c55b02ca2342 -r cece842c7417 stage4/generate_c/generate_c.cc --- a/stage4/generate_c/generate_c.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/stage4/generate_c/generate_c.cc Tue Dec 15 16:29:44 2009 +0100 @@ -331,7 +331,7 @@ unsigned long long least_common_tick = least_common_ticktime / common_ticktime; if (least_common_tick >> 32) ERROR; - return (unsigned long)(~(((unsigned long)-2) % (unsigned long)least_common_tick) + 1); + return (unsigned long)(~(((unsigned long)-1) % (unsigned long)least_common_tick) + 1); } /* TASK task_name task_initialization */ @@ -1294,7 +1294,7 @@ current_resource_name->accept(*this); s4o.print("\n\n"); - s4o.print("extern int common_ticktime__;\n\n"); + s4o.print("extern unsigned long long common_ticktime__;\n\n"); s4o.print("#include \"accessor.h\"\n\n"); @@ -1652,7 +1652,7 @@ const char *current_name; const char *current_builddir; - unsigned long common_ticktime; + unsigned long long common_ticktime; public: generate_c_c(stage4out_c *s4o_ptr, const char *builddir): diff -r c55b02ca2342 -r cece842c7417 stage4/generate_c/generate_c_il.cc --- a/stage4/generate_c/generate_c_il.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/stage4/generate_c/generate_c_il.cc Tue Dec 15 16:29:44 2009 +0100 @@ -660,6 +660,7 @@ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); symbol->subscripted_variable->accept(*this); if (current_array_type != NULL) { + s4o.print(".table"); symbol->subscript_list->accept(*this); current_array_type = NULL; } @@ -669,6 +670,7 @@ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); symbol->subscripted_variable->accept(*this); if (current_array_type != NULL) { + s4o.print(".table"); symbol->subscript_list->accept(*this); current_array_type = NULL; } @@ -697,15 +699,26 @@ /******************************************/ /* B 1.4.3 - Declaration & Initialisation */ /******************************************/ + +/* helper symbol for structure_initialization */ +/* structure_element_initialization_list ',' structure_element_initialization */ void *visit(structure_element_initialization_list_c *symbol) { generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); structure_initialization->init_structure_default(this->current_param_type); - structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; - symbol->accept(*structure_initialization); + structure_initialization->init_structure_values(symbol); delete structure_initialization; return NULL; } +/* helper symbol for array_initialization */ +/* array_initial_elements_list ',' array_initial_elements */ +void *visit(array_initial_elements_list_c *symbol) { + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->init_array_size(this->current_param_type); + array_initialization->init_array_values(symbol); + delete array_initialization; + return NULL; +} /****************************************/ /* B.2 - Language IL (Instruction List) */ /****************************************/ diff -r c55b02ca2342 -r cece842c7417 stage4/generate_c/generate_c_inlinefcall.cc --- a/stage4/generate_c/generate_c_inlinefcall.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/stage4/generate_c/generate_c_inlinefcall.cc Tue Dec 15 16:29:44 2009 +0100 @@ -303,13 +303,7 @@ symbol->field_selector->accept(*this); break; default: - if (this->is_variable_prefix_null()) { - symbol->record_variable->accept(*this); - s4o.print("."); - symbol->field_selector->accept(*this); - } - else - print_getter(symbol); + print_getter(symbol); break; } return NULL; @@ -326,21 +320,13 @@ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); symbol->subscripted_variable->accept(*this); if (current_array_type != NULL) { + s4o.print(".table"); symbol->subscript_list->accept(*this); current_array_type = NULL; } break; default: - if (this->is_variable_prefix_null()) { - current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); - symbol->subscripted_variable->accept(*this); - if (current_array_type != NULL) { - symbol->subscript_list->accept(*this); - current_array_type = NULL; - } - } - else - print_getter(symbol); + print_getter(symbol); break; } return NULL; diff -r c55b02ca2342 -r cece842c7417 stage4/generate_c/generate_c_st.cc --- a/stage4/generate_c/generate_c_st.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/stage4/generate_c/generate_c_st.cc Tue Dec 15 16:29:44 2009 +0100 @@ -295,7 +295,8 @@ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); symbol->subscripted_variable->accept(*this); if (current_array_type != NULL) { - symbol->subscript_list->accept(*this); + s4o.print(".table"); + symbol->subscript_list->accept(*this); current_array_type = NULL; } break; @@ -304,6 +305,7 @@ current_array_type = search_varfb_instance_type->get_rawtype(symbol->subscripted_variable); symbol->subscripted_variable->accept(*this); if (current_array_type != NULL) { + s4o.print(".table"); symbol->subscript_list->accept(*this); current_array_type = NULL; } @@ -332,15 +334,27 @@ /******************************************/ /* B 1.4.3 - Declaration & Initialisation */ /******************************************/ + +/* helper symbol for structure_initialization */ +/* structure_element_initialization_list ',' structure_element_initialization */ void *visit(structure_element_initialization_list_c *symbol) { generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); structure_initialization->init_structure_default(this->current_param_type); - structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; - symbol->accept(*structure_initialization); + structure_initialization->init_structure_values(symbol); delete structure_initialization; return NULL; } +/* helper symbol for array_initialization */ +/* array_initial_elements_list ',' array_initial_elements */ +void *visit(array_initial_elements_list_c *symbol) { + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->init_array_size(this->current_param_type); + array_initialization->init_array_values(symbol); + delete array_initialization; + return NULL; +} + /***************************************/ /* B.3 - Language ST (Structured Text) */ /***************************************/ diff -r c55b02ca2342 -r cece842c7417 stage4/generate_c/generate_c_vardecl.cc --- a/stage4/generate_c/generate_c_vardecl.cc Tue Dec 15 11:18:19 2009 +0100 +++ b/stage4/generate_c/generate_c_vardecl.cc Tue Dec 15 16:29:44 2009 +0100 @@ -79,10 +79,9 @@ public: typedef enum { none_am, - dimensioncount_am, - initializationvalue_am, - arrayassignment_am, - varlistparse_am + arraysize_am, + typedecl_am, + initializationvalue_am } arrayinitialization_mode_t; arrayinitialization_mode_t current_mode; @@ -92,7 +91,6 @@ symbol_c* array_default_initialization; private: - int dimension_number; int current_dimension; int array_size; int defined_values_count; @@ -102,55 +100,46 @@ generate_c_array_initialization_c(stage4out_c *s4o_ptr): generate_c_typedecl_c(s4o_ptr) {} ~generate_c_array_initialization_c(void) {} - void init_array_dimensions(symbol_c *array_specification) { - dimension_number = 0; - current_dimension = 0; + void init_array_size(symbol_c *array_specification) { array_size = 1; defined_values_count = 0; current_initialization_count = 0; array_base_type = array_default_value = array_default_initialization = NULL; - current_mode = dimensioncount_am; + current_mode = arraysize_am; array_specification->accept(*this); } void init_array(symbol_c *var1_list, symbol_c *array_specification, symbol_c *array_initialization) { int i; - init_array_dimensions(array_specification); + init_array_size(array_specification); - current_mode = initializationvalue_am; s4o.print("\n"); s4o.print(s4o.indent_spaces + "{\n"); s4o.indent_right(); - s4o.print(s4o.indent_spaces + "int index["); - print_integer(dimension_number); - s4o.print("];\n"); s4o.print(s4o.indent_spaces); s4o.print("static const "); + + current_mode = typedecl_am; array_specification->accept(*this); + s4o.print(" temp = "); + init_array_values(array_initialization); + s4o.print(";\n"); - - current_mode = arrayassignment_am; - array_specification->accept(*this); - - current_mode = varlistparse_am; var1_list->accept(*this); - - current_mode = arrayassignment_am; - for (i = 0; i < dimension_number; i++) { - s4o.indent_left(); - s4o.print(s4o.indent_spaces + "}\n"); - } s4o.indent_left(); s4o.print(s4o.indent_spaces + "}"); } void init_array_values(symbol_c *array_initialization) { - s4o.print("{"); + s4o.print("{{"); + + current_mode = initializationvalue_am; array_initialization->accept(*this); + if (array_default_initialization != NULL && defined_values_count < array_size) array_default_initialization->accept(*this); if (defined_values_count < array_size) { @@ -161,14 +150,14 @@ defined_values_count++; } } - s4o.print("}"); + + s4o.print("}}"); } void *visit(identifier_c *type_name) { symbol_c *type_decl; switch (current_mode) { - case dimensioncount_am: - case arrayassignment_am: + case arraysize_am: /* look up the type declaration... */ type_decl = type_symtable.find_value(type_name); if (type_decl == type_symtable.end_value()) @@ -192,19 +181,7 @@ s4o.print("("); print_variable_prefix(); symbol->elements[i]->accept(*this); - s4o.print(",temp"); - for (j = 0; j < dimension_number; j++) { - s4o.print("[index["); - print_integer(j); - s4o.print("]]"); - } - s4o.print(","); - for (j = 0; j < dimension_number; j++) { - s4o.print("[index["); - print_integer(j); - s4o.print("]]"); - } - s4o.print(");\n"); + s4o.print(", temp);\n"); } return NULL; } @@ -217,7 +194,7 @@ /* array_initialization may be NULL ! */ void *visit(array_spec_init_c *symbol) { switch (current_mode) { - case dimensioncount_am: + case arraysize_am: array_default_initialization = symbol->array_initialization; break; default: @@ -231,7 +208,7 @@ void *visit(array_specification_c *symbol) { symbol->array_subrange_list->accept(*this); switch (current_mode) { - case dimensioncount_am: + case arraysize_am: array_base_type = symbol->non_generic_type_name; array_default_value = (symbol_c *)symbol->non_generic_type_name->accept(*type_initial_value_c::instance());; if (array_default_value == NULL) ERROR; @@ -246,23 +223,9 @@ //SYM_REF2(subrange_c, lower_limit, upper_limit) void *visit(subrange_c *symbol) { switch (current_mode) { - case dimensioncount_am: - dimension_number++; + case arraysize_am: array_size *= extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit) + 1; break; - case arrayassignment_am: - s4o.print(s4o.indent_spaces + "for (index["); - print_integer(current_dimension); - s4o.print("] = 0; index["); - print_integer(current_dimension); - s4o.print("] <= "); - print_integer(extract_integer(symbol->upper_limit) - extract_integer(symbol->lower_limit)); - s4o.print("; index["); - print_integer(current_dimension); - s4o.print("]++) {\n"); - s4o.indent_right(); - current_dimension++; - break; default: break; } @@ -519,9 +482,9 @@ public: typedef enum { none_sm, + initdefault_sm, typedecl_sm, - initializationvalue_sm, - varlistparse_sm + initializationvalue_sm } structureinitialization_mode_t; structureinitialization_mode_t current_mode; @@ -538,7 +501,7 @@ structure_type_decl = NULL; current_element_type = NULL; - current_mode = typedecl_sm; + current_mode = initdefault_sm; structure_type_name->accept(*this); } @@ -547,28 +510,34 @@ init_structure_default(structure_type_name); - current_mode = initializationvalue_sm; s4o.print("\n"); s4o.print(s4o.indent_spaces + "{\n"); s4o.indent_right(); s4o.print(s4o.indent_spaces); s4o.print("static const "); + + current_mode = typedecl_sm; structure_type_name->accept(*this); + s4o.print(" temp = "); - structure_initialization->accept(*this); + + init_structure_values(structure_initialization); + s4o.print(";\n"); - - current_mode = varlistparse_sm; var1_list->accept(*this); - s4o.indent_left(); s4o.print(s4o.indent_spaces + "}"); } + void init_structure_values(symbol_c *structure_initialization) { + current_mode = initializationvalue_sm; + structure_initialization->accept(*this); + } + void *visit(identifier_c *type_name) { symbol_c *type_decl; switch (current_mode) { - case typedecl_sm: + case initdefault_sm: /* look up the type declaration... */ type_decl = type_symtable.find_value(type_name); if (type_decl == type_symtable.end_value()) @@ -605,7 +574,7 @@ /* structure_element_declaration_list structure_element_declaration ';' */ void *visit(structure_element_declaration_list_c *symbol) { switch (current_mode) { - case typedecl_sm: + case initdefault_sm: structure_type_decl = (symbol_c *)symbol; break; default: @@ -649,10 +618,8 @@ if (initialization_analyzer.get_initialization_type() == initialization_analyzer_c::struct_it) { generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); - structure_initialization->set_variable_prefix(get_variable_prefix()); structure_initialization->init_structure_default(current_element_type); - structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; - element_value->accept(*structure_initialization); + structure_initialization->init_structure_values(element_value); delete structure_initialization; } else { @@ -667,9 +634,7 @@ /* array_initial_elements_list ',' array_initial_elements */ void *visit(array_initial_elements_list_c *symbol) { generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); - array_initialization->set_variable_prefix(get_variable_prefix()); - array_initialization->init_array_dimensions(current_element_type); - array_initialization->current_mode = generate_c_array_initialization_c::initializationvalue_am; + array_initialization->init_array_size(current_element_type); array_initialization->init_array_values(symbol); delete array_initialization; return NULL; @@ -682,10 +647,8 @@ /* structure_element_initialization_list ',' structure_element_initialization */ void *generate_c_array_initialization_c::visit(structure_element_initialization_list_c *symbol) { generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); - structure_initialization->set_variable_prefix(get_variable_prefix()); structure_initialization->init_structure_default(array_base_type); - structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; - symbol->accept(*structure_initialization); + structure_initialization->init_structure_values(symbol); delete structure_initialization; return NULL; } @@ -1534,16 +1497,42 @@ return NULL; } -#if 0 /* var1_list ':' array_specification */ -SYM_REF2(array_var_declaration_c, var1_list, array_specification) -#endif +//SYM_REF2(array_var_declaration_c, var1_list, array_specification) +void *visit(array_var_declaration_c *symbol) { + TRACE("array_var_declaration_c"); + /* Please read the comments inside the var1_init_decl_c + * visitor, as they apply here too. + */ + + /* Start off by setting the current_var_type_symbol and + * current_var_init_symbol private variables... + */ + update_type_init(symbol->array_specification); + + /* now to produce the c equivalent... */ + if (wanted_varformat == constructorinit_vf) { + generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); + array_initialization->set_variable_prefix(get_variable_prefix()); + array_initialization->init_array(symbol->var1_list, this->current_var_type_symbol, this->current_var_init_symbol); + delete array_initialization; + } + else + symbol->var1_list->accept(*this); + + /* Values no longer in scope, and therefore no longer used. + * Make an effort to keep them set to NULL when not in use + * in order to catch bugs as soon as possible... + */ + void_type_init(); + + return NULL; +} void *visit(array_initial_elements_list_c *symbol) { if (wanted_varformat == localinit_vf) { generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); - array_initialization->init_array_dimensions(this->current_var_type_symbol); - array_initialization->current_mode = generate_c_array_initialization_c::initializationvalue_am; + array_initialization->init_array_size(this->current_var_type_symbol); array_initialization->init_array_values(this->current_var_init_symbol); delete array_initialization; } @@ -1586,8 +1575,7 @@ if (wanted_varformat == localinit_vf) { generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); structure_initialization->init_structure_default(this->current_var_type_symbol); - structure_initialization->current_mode = generate_c_structure_initialization_c::initializationvalue_sm; - this->current_var_init_symbol->accept(*structure_initialization); + structure_initialization->init_structure_values(this->current_var_init_symbol); delete structure_initialization; } return NULL;