generate_IEC_std.py
changeset 307 fd1f6ae26d4f
parent 291 e580c945c62a
child 404 d5a5eaea7844
equal deleted inserted replaced
306:eecc53781498 307:fd1f6ae26d4f
   106     """
   106     """
   107     Convert ANY_XXX IEC type declaration into IEC2C's generated type test.
   107     Convert ANY_XXX IEC type declaration into IEC2C's generated type test.
   108     This tests are defined in search_expression_type.cc 
   108     This tests are defined in search_expression_type.cc 
   109     """
   109     """
   110     return {"ANY" : "",
   110     return {"ANY" : "",
   111     "ANY_BIT" : "if(search_expression_type->is_binary_type(%(paramname)s_type_symbol))",
   111     "ANY_BIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_binary_type(%(paramname)s_type_symbol))",
   112     "ANY_NBIT" : "if(search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))",
   112     "ANY_NBIT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_nbinary_type(%(paramname)s_type_symbol))",
   113     "ANY_NUM" : "if(search_expression_type->is_num_type(%(paramname)s_type_symbol))",
   113     "ANY_NUM" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_num_type(%(paramname)s_type_symbol))",
   114     "ANY_REAL" : "if(search_expression_type->is_real_type(%(paramname)s_type_symbol))",
   114     "ANY_REAL" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_real_type(%(paramname)s_type_symbol))",
   115     "ANY_INT" : "if(search_expression_type->is_integer_type(%(paramname)s_type_symbol))"
   115     "ANY_INT" : "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_integer_type(%(paramname)s_type_symbol))"
   116     }.get(typename,
   116     }.get(typename,
   117         #"if (typeid(*last_type_symbol) == typeid(%(typename)s_type_name_c))")%{
   117         #"if (typeid(*last_type_symbol) == typeid(%(typename)s_type_name_c))")%{
   118         "if(search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{
   118         "if(%(paramname)s_type_symbol == NULL || search_expression_type->is_same_type(&search_constant_type_c::%(typename)s_type_name, last_type_symbol))")%{
   119                 "paramname" : paramname, "typename": typename.lower()}
   119                 "paramname" : paramname, "typename": typename.lower()}
   120 
   120 
   121 def recurse_and_indent(fdecls, indent, do_type_search_only = False, do_il = False):
   121 def recurse_and_indent(fdecls, indent, do_type_search_only = False, do_il = False):
   122     """
   122     """
   123     This function generate visit(function_invocation) code for 
   123     This function generate visit(function_invocation) code for 
   149                 res += """
   149                 res += """
   150 {
   150 {
   151     identifier_c param_name("%(input_name)s");
   151     identifier_c param_name("%(input_name)s");
   152     /* Get the value from a foo(<param_name> = <param_value>) style call */
   152     /* Get the value from a foo(<param_name> = <param_value>) style call */
   153     symbol_c *%(input_name)s_param_value = function_call_param_iterator.search(&param_name);
   153     symbol_c *%(input_name)s_param_value = function_call_param_iterator.search(&param_name);
       
   154     symbol_c *%(input_name)s_type_symbol = NULL;
   154     
   155     
   155     /* Get the value from a foo(<param_value>) style call */
   156     /* Get the value from a foo(<param_value>) style call */
   156     if (%(input_name)s_param_value == NULL)
   157     if (%(input_name)s_param_value == NULL)
   157       %(input_name)s_param_value = function_call_param_iterator.next();
   158       %(input_name)s_param_value = function_call_param_iterator.next();
   158     symbol_c *%(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value);
   159     if (%(input_name)s_param_value != NULL) {
   159     last_type_symbol = last_type_symbol && search_expression_type->is_same_type(%(input_name)s_type_symbol, last_type_symbol) ? search_expression_type->common_type(%(input_name)s_type_symbol, last_type_symbol) : %(input_name)s_type_symbol ;
   160       %(input_name)s_type_symbol = search_expression_type->get_type(%(input_name)s_param_value);
       
   161       last_type_symbol = last_type_symbol && %(input_name)s_type_symbol && search_expression_type->is_same_type(%(input_name)s_type_symbol, last_type_symbol) ? search_expression_type->common_type(%(input_name)s_type_symbol, last_type_symbol) : %(input_name)s_type_symbol ;
       
   162     }
   160 """%{"input_name":Paramname}
   163 """%{"input_name":Paramname}
   161                                 
   164                                 
   162             for ParamType,NextParamDecl in ParamTypes.iteritems():
   165             for ParamType,NextParamDecl in ParamTypes.iteritems():
   163             
   166             
   164                 res += """    
   167                 res += """    
   186             
   189             
   187             if code_gen[1] is not None:
   190             if code_gen[1] is not None:
   188                 res += "function_name = (symbol_c*)(new pragma_c(\"%s\"));\n"%code_gen[1]
   191                 res += "function_name = (symbol_c*)(new pragma_c(\"%s\"));\n"%code_gen[1]
   189             if fdecl["extensible"]:
   192             if fdecl["extensible"]:
   190                 res += """
   193                 res += """
       
   194 if (nb_param < %(min_nb_param)d)
       
   195   nb_param = %(min_nb_param)d;
   191 char* nb_param_str = new char[10];
   196 char* nb_param_str = new char[10];
   192 sprintf(nb_param_str, "%d", nb_param);
   197 sprintf(nb_param_str, "%%d", nb_param);
   193 ADD_PARAM_LIST((symbol_c*)(new integer_c((const char *)nb_param_str)), (symbol_c*)(new int_type_name_c()), function_param_iterator_c::direction_in)
   198 ADD_PARAM_LIST((symbol_c*)(new integer_c((const char *)nb_param_str)), (symbol_c*)(new int_type_name_c()), function_param_iterator_c::direction_in)
   194 """
   199 """%{"min_nb_param" : len(fdecl["inputs"])}
   195             for paramname,paramtype,unused in fdecl["inputs"]:
   200             for paramname,paramtype,unused in fdecl["inputs"]:
   196                 res += "ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in)\n"%{"input_name" : paramname}
   201                 res += """
   197 
   202 if (%(input_name)s_type_symbol == NULL)
       
   203   %(input_name)s_type_symbol = last_type_symbol;
       
   204 ADD_PARAM_LIST(%(input_name)s_param_value, %(input_name)s_type_symbol, function_param_iterator_c::direction_in)
       
   205 """%{"input_name" : paramname}
   198             if fdecl["extensible"]:
   206             if fdecl["extensible"]:
   199                 res += """
   207                 res += """
   200 int base_num = %d;
   208 int base_num = %d;
   201 symbol_c *param_value = NULL;
   209 symbol_c *param_value = NULL;
   202 do{
   210 do{