stage4/generate_c/generate_c.cc
changeset 146 eef5e62048c7
parent 145 72ae82e65dbc
child 178 1622dc05c6ca
equal deleted inserted replaced
145:72ae82e65dbc 146:eef5e62048c7
   568   s4o.indent_right();
   568   s4o.indent_right();
   569   vardecl = new generate_c_vardecl_c(&s4o,
   569   vardecl = new generate_c_vardecl_c(&s4o,
   570   				      generate_c_vardecl_c::finterface_vf,
   570   				      generate_c_vardecl_c::finterface_vf,
   571   				      generate_c_vardecl_c::input_vt |
   571   				      generate_c_vardecl_c::input_vt |
   572 				        generate_c_vardecl_c::output_vt |
   572 				        generate_c_vardecl_c::output_vt |
   573 				        generate_c_vardecl_c::inoutput_vt);
   573 				        generate_c_vardecl_c::inoutput_vt |
       
   574                 generate_c_vardecl_c::eneno_vt);
       
   575   vardecl->print(symbol->var_declarations_list);
       
   576   if (!vardecl->is_en_declared()) {
       
   577     s4o.print(",\n" + s4o.indent_spaces + "BOOL EN");
       
   578   }
       
   579   if (!vardecl->is_eno_declared()) {
       
   580     s4o.print(",\n" + s4o.indent_spaces + "BOOL *ENO");
       
   581   }
       
   582   delete vardecl;
       
   583   
       
   584   s4o.indent_left();
       
   585   
       
   586   s4o.print(")\n" + s4o.indent_spaces + "{\n");
       
   587 
       
   588   /* (B) Function local variable declaration */
       
   589   /* (B.1) Variables declared in ST source code */
       
   590   s4o.indent_right();
       
   591   
       
   592   vardecl = new generate_c_vardecl_c(&s4o, 
       
   593                 generate_c_vardecl_c::localinit_vf, 
       
   594                 generate_c_vardecl_c::output_vt |
       
   595                 generate_c_vardecl_c::inoutput_vt |
       
   596                 generate_c_vardecl_c::private_vt);
   574   vardecl->print(symbol->var_declarations_list);
   597   vardecl->print(symbol->var_declarations_list);
   575   delete vardecl;
   598   delete vardecl;
   576   s4o.indent_left();
   599 
   577 
   600   /* (B.2) Temporary variable for function's return value */
   578   s4o.print(")\n" + s4o.indent_spaces + "{\n");
       
   579 
       
   580   /* (B) Function local variable declaration */
       
   581     /* (B.1) Variables declared in ST source code */
       
   582   s4o.indent_right();
       
   583   vardecl = new generate_c_vardecl_c(&s4o,
       
   584                 generate_c_vardecl_c::foutputdecl_vf,
       
   585                 generate_c_vardecl_c::output_vt |
       
   586                 generate_c_vardecl_c::inoutput_vt);
       
   587   vardecl->print(symbol->var_declarations_list);
       
   588   delete vardecl;
       
   589   
       
   590   vardecl = new generate_c_vardecl_c(&s4o, generate_c_vardecl_c::localinit_vf, generate_c_vardecl_c::private_vt);
       
   591   vardecl->print(symbol->var_declarations_list);
       
   592   delete vardecl;
       
   593 
       
   594     /* (B.2) Temporary variable for function's return value */
       
   595   /* It will have the same name as the function itself! */
   601   /* It will have the same name as the function itself! */
   596   s4o.print(s4o.indent_spaces);
   602   s4o.print(s4o.indent_spaces);
   597   symbol->type_name->accept(*this); /* return type */
   603   symbol->type_name->accept(*this); /* return type */
   598   s4o.print(" ");
   604   s4o.print(" ");
   599   symbol->derived_function_name->accept(*this);
   605   symbol->derived_function_name->accept(*this);
   603     symbol_c *default_value = (symbol_c *)symbol->type_name->accept(*type_initial_value_c::instance());
   609     symbol_c *default_value = (symbol_c *)symbol->type_name->accept(*type_initial_value_c::instance());
   604     if (default_value == NULL) ERROR;
   610     if (default_value == NULL) ERROR;
   605     default_value->accept(*this);
   611     default_value->accept(*this);
   606   }
   612   }
   607   s4o.print(";\n\n");
   613   s4o.print(";\n\n");
   608 
   614   
       
   615   s4o.print(s4o.indent_spaces + "// Control execution\n");
       
   616   s4o.print(s4o.indent_spaces + "if (!EN) {\n");
       
   617   s4o.indent_right();
       
   618   s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n");
       
   619   s4o.indent_right();
       
   620   s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(FALSE);\n");
       
   621   s4o.indent_left();
       
   622   s4o.print(s4o.indent_spaces + "}\n");
       
   623   s4o.print(s4o.indent_spaces + "return ");
       
   624   symbol->derived_function_name->accept(*this);
       
   625   s4o.print(";\n");
       
   626   s4o.indent_left();
       
   627   s4o.print(s4o.indent_spaces + "}\n");
       
   628   s4o.print(s4o.indent_spaces + "else {\n");
       
   629   s4o.indent_right();
       
   630   s4o.print(s4o.indent_spaces + "if (ENO != NULL) {\n");
       
   631   s4o.indent_right();
       
   632   s4o.print(s4o.indent_spaces + "*ENO = __BOOL_LITERAL(TRUE);\n");
       
   633   s4o.indent_left();
       
   634   s4o.print(s4o.indent_spaces + "}\n");
       
   635   s4o.indent_left();
       
   636   s4o.print(s4o.indent_spaces + "}\n");
       
   637   
   609   /* (C) Function body */
   638   /* (C) Function body */
   610   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol);
   639   generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol);
   611   symbol->function_body->accept(generate_c_code);
   640   symbol->function_body->accept(generate_c_code);
   612   
   641   
   613   vardecl = new generate_c_vardecl_c(&s4o,
   642   vardecl = new generate_c_vardecl_c(&s4o,
   661   s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n");
   690   s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n");
   662   vardecl = new generate_c_vardecl_c(&s4o_incl,
   691   vardecl = new generate_c_vardecl_c(&s4o_incl,
   663   				      generate_c_vardecl_c::local_vf,
   692   				      generate_c_vardecl_c::local_vf,
   664   				      generate_c_vardecl_c::input_vt |
   693   				      generate_c_vardecl_c::input_vt |
   665   				      generate_c_vardecl_c::output_vt |
   694   				      generate_c_vardecl_c::output_vt |
   666   				      generate_c_vardecl_c::inoutput_vt);
   695   				      generate_c_vardecl_c::inoutput_vt |
       
   696                 generate_c_vardecl_c::eneno_vt);
   667   vardecl->print(symbol->var_declarations);
   697   vardecl->print(symbol->var_declarations);
       
   698   if (!vardecl->is_en_declared()) {
       
   699     s4o_incl.print(s4o_incl.indent_spaces + "BOOL EN;\n");
       
   700   }
       
   701   if (!vardecl->is_eno_declared()) {
       
   702     s4o_incl.print(s4o_incl.indent_spaces + "BOOL ENO;\n");
       
   703   }
   668   delete vardecl;
   704   delete vardecl;
   669   s4o_incl.print("\n");
   705   s4o_incl.print("\n");
   670   /* (A.3) Private internal variables */
   706   /* (A.3) Private internal variables */
   671   s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n");
   707   s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n");
   672   vardecl = new generate_c_vardecl_c(&s4o_incl,
   708   vardecl = new generate_c_vardecl_c(&s4o_incl,
   675   				      generate_c_vardecl_c::private_vt |
   711   				      generate_c_vardecl_c::private_vt |
   676   				      generate_c_vardecl_c::located_vt |
   712   				      generate_c_vardecl_c::located_vt |
   677   				      generate_c_vardecl_c::external_vt);
   713   				      generate_c_vardecl_c::external_vt);
   678   vardecl->print(symbol->var_declarations);
   714   vardecl->print(symbol->var_declarations);
   679   delete vardecl;
   715   delete vardecl;
       
   716   
   680   /* (A.4) Generate private internal variables for SFC */
   717   /* (A.4) Generate private internal variables for SFC */
   681   sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd);
   718   sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd);
   682   sfcdecl->print(symbol->fblock_body);
   719   sfcdecl->print(symbol->fblock_body);
   683   delete sfcdecl;
   720   delete sfcdecl;
   684   s4o_incl.print("\n");
   721   s4o_incl.print("\n");
   711   				      generate_c_vardecl_c::input_vt |
   748   				      generate_c_vardecl_c::input_vt |
   712   				      generate_c_vardecl_c::output_vt |
   749   				      generate_c_vardecl_c::output_vt |
   713   				      generate_c_vardecl_c::inoutput_vt |
   750   				      generate_c_vardecl_c::inoutput_vt |
   714   				      generate_c_vardecl_c::private_vt |
   751   				      generate_c_vardecl_c::private_vt |
   715 				        generate_c_vardecl_c::located_vt |
   752 				        generate_c_vardecl_c::located_vt |
   716 				        generate_c_vardecl_c::external_vt);
   753 				        generate_c_vardecl_c::external_vt |
       
   754                 generate_c_vardecl_c::eneno_vt);
   717   vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
   755   vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
       
   756   if (!vardecl->is_en_declared()) {
       
   757     s4o.print("\n" + s4o.indent_spaces);
       
   758     s4o.print(FB_FUNCTION_PARAM);
       
   759     s4o.print("->EN = __BOOL_LITERAL(TRUE);");
       
   760   }
       
   761   if (!vardecl->is_eno_declared()) {
       
   762     s4o.print("\n" + s4o.indent_spaces);
       
   763     s4o.print(FB_FUNCTION_PARAM);
       
   764     s4o.print("->ENO = __BOOL_LITERAL(TRUE);");
       
   765   }
   718   delete vardecl;
   766   delete vardecl;
   719   s4o.print("\n");
   767   s4o.print("\n");
   720   /* (B.3) Generate private internal variables for SFC */
   768   /* (B.3) Generate private internal variables for SFC */
   721   sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcinit_sd);
   769   sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcinit_sd);
   722   sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->");
   770   sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->");
   747   symbol->fblock_name->accept(*this);
   795   symbol->fblock_name->accept(*this);
   748   s4o.print(" *");
   796   s4o.print(" *");
   749   s4o.print(FB_FUNCTION_PARAM);
   797   s4o.print(FB_FUNCTION_PARAM);
   750   s4o.print(") {\n");
   798   s4o.print(") {\n");
   751   s4o.indent_right();
   799   s4o.indent_right();
       
   800 
       
   801   s4o.print(s4o.indent_spaces + "// Control execution\n");
       
   802   s4o.print(s4o.indent_spaces + "if (!");
       
   803   s4o.print(FB_FUNCTION_PARAM);
       
   804   s4o.print("->EN) {\n");
       
   805   s4o.indent_right();
       
   806   s4o.print(s4o.indent_spaces);
       
   807   s4o.print(FB_FUNCTION_PARAM);
       
   808   s4o.print("->ENO = __BOOL_LITERAL(FALSE);\n");
       
   809   s4o.print(s4o.indent_spaces + "return;\n");
       
   810   s4o.indent_left();
       
   811   s4o.print(s4o.indent_spaces + "}\n");
       
   812   s4o.print(s4o.indent_spaces + "else {\n");
       
   813   s4o.indent_right();
       
   814   s4o.print(s4o.indent_spaces);
       
   815   s4o.print(FB_FUNCTION_PARAM);
       
   816   s4o.print("->ENO = __BOOL_LITERAL(TRUE);\n");
       
   817   s4o.indent_left();
       
   818   s4o.print(s4o.indent_spaces + "}\n");
   752 
   819 
   753   /* (C.4) Initialize TEMP variables */
   820   /* (C.4) Initialize TEMP variables */
   754   /* function body */
   821   /* function body */
   755   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   822   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   756   vardecl = new generate_c_vardecl_c(&s4o,
   823   vardecl = new generate_c_vardecl_c(&s4o,