stage4/generate_cc/generate_cc.cc
changeset 66 501e9d494744
parent 65 c6d41c1287de
child 69 41cb5b80416e
equal deleted inserted replaced
65:c6d41c1287de 66:501e9d494744
   619 public:
   619 public:
   620 /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   620 /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   621 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused)
   621 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused)
   622 void *visit(function_block_declaration_c *symbol) {
   622 void *visit(function_block_declaration_c *symbol) {
   623   generate_cc_vardecl_c *vardecl;
   623   generate_cc_vardecl_c *vardecl;
       
   624   generate_cc_sfcdecl_c *sfcdecl;
   624   TRACE("function_block_declaration_c");
   625   TRACE("function_block_declaration_c");
   625 
   626 
   626   /* start off by adding this declaration to the global
   627   /* start off by adding this declaration to the global
   627    * function block declaration symbol table...
   628    * function block declaration symbol table...
   628    */
   629    */
   653   				      generate_cc_vardecl_c::private_vt |
   654   				      generate_cc_vardecl_c::private_vt |
   654   				      generate_cc_vardecl_c::located_vt |
   655   				      generate_cc_vardecl_c::located_vt |
   655   				      generate_cc_vardecl_c::external_vt);
   656   				      generate_cc_vardecl_c::external_vt);
   656   vardecl->print(symbol->var_declarations);
   657   vardecl->print(symbol->var_declarations);
   657   delete vardecl;
   658   delete vardecl;
       
   659   /* (A.4) Generate private internal variables for SFC */
       
   660   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcdecl_sd);
       
   661   sfcdecl->print(symbol->fblock_body);
       
   662   delete sfcdecl;
   658   s4o.print("\n");
   663   s4o.print("\n");
   659 
   664 
   660   /* (A.4) Function Block data structure type name. */
   665   /* (A.5) Function Block data structure type name. */
   661   s4o.indent_left();
   666   s4o.indent_left();
   662   s4o.print("} ");
   667   s4o.print("} ");
   663   symbol->fblock_name->accept(*this);
   668   symbol->fblock_name->accept(*this);
   664   s4o.print(";\n\n");
   669   s4o.print(";\n\n");
   665 
   670 
   686   				      generate_cc_vardecl_c::output_vt |
   691   				      generate_cc_vardecl_c::output_vt |
   687   				      generate_cc_vardecl_c::inoutput_vt |
   692   				      generate_cc_vardecl_c::inoutput_vt |
   688   				      generate_cc_vardecl_c::private_vt |
   693   				      generate_cc_vardecl_c::private_vt |
   689 				        generate_cc_vardecl_c::located_vt |
   694 				        generate_cc_vardecl_c::located_vt |
   690 				        generate_cc_vardecl_c::external_vt);
   695 				        generate_cc_vardecl_c::external_vt);
   691   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   696   vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->");
   692   delete vardecl;
   697   delete vardecl;
       
   698   s4o.print("\n");
       
   699   /* (B.3) Generate private internal variables for SFC */
       
   700   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::sfcinit_sd);
       
   701   sfcdecl->print(symbol->fblock_body, FB_FUNCTION_PARAM"->");
       
   702   delete sfcdecl;
   693   s4o.indent_left();
   703   s4o.indent_left();
   694   s4o.print("\n" + s4o.indent_spaces + "}\n\n");
   704   s4o.print(s4o.indent_spaces + "}\n\n");
   695 
   705 
   696   
   706   
   697   /* (C) Function with FB body */
   707   /* (C) Function with FB body */
   698   /* (C.1) Function declaration */
   708   /* (C.1) Step definitions */
       
   709   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepdef_sd);
       
   710   sfcdecl->print(symbol->fblock_body);
       
   711   delete sfcdecl;
       
   712   
       
   713   /* (C.2) Action definitions */
       
   714   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actiondef_sd);
       
   715   sfcdecl->print(symbol->fblock_body);
       
   716   delete sfcdecl;
       
   717   
       
   718   /* (C.3) Function declaration */
   699   s4o.print("// Code part\n");
   719   s4o.print("// Code part\n");
   700   /* function interface */
   720   /* function interface */
   701   s4o.print("void ");
   721   s4o.print("void ");
   702   symbol->fblock_name->accept(*this);
   722   symbol->fblock_name->accept(*this);
   703   s4o.print(FB_FUNCTION_SUFFIX);
   723   s4o.print(FB_FUNCTION_SUFFIX);
   707   s4o.print(" *");
   727   s4o.print(" *");
   708   s4o.print(FB_FUNCTION_PARAM);
   728   s4o.print(FB_FUNCTION_PARAM);
   709   s4o.print(") {\n");
   729   s4o.print(") {\n");
   710   s4o.indent_right();
   730   s4o.indent_right();
   711 
   731 
   712   /* (C.2) Initialize TEMP variables */
   732   /* (C.4) Initialize TEMP variables */
   713   /* function body */
   733   /* function body */
   714   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   734   s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n");
   715   vardecl = new generate_cc_vardecl_c(&s4o,
   735   vardecl = new generate_cc_vardecl_c(&s4o,
   716   				      generate_cc_vardecl_c::init_vf,
   736   				      generate_cc_vardecl_c::init_vf,
   717 				      generate_cc_vardecl_c::temp_vt);
   737 				      generate_cc_vardecl_c::temp_vt);
   718   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   738   vardecl->print(symbol->var_declarations, NULL,  FB_FUNCTION_PARAM"->");
   719   delete vardecl;
   739   delete vardecl;
   720   s4o.print("\n");
   740   s4o.print("\n");
   721 
   741 
   722   /* (C.3) Function code */
   742   /* (C.5) Function code */
   723   generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   743   generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   724   symbol->fblock_body->accept(generate_cc_code);
   744   symbol->fblock_body->accept(generate_cc_code);
   725   s4o.indent_left();
   745   s4o.indent_left();
   726   s4o.print(s4o.indent_spaces + "} // ");
   746   s4o.print(s4o.indent_spaces + "} // ");
   727   symbol->fblock_name->accept(*this);
   747   symbol->fblock_name->accept(*this);
   728   s4o.print(FB_FUNCTION_SUFFIX);
   748   s4o.print(FB_FUNCTION_SUFFIX);
   729   s4o.print(s4o.indent_spaces + "() \n\n");
   749   s4o.print(s4o.indent_spaces + "() \n\n");
       
   750 
       
   751   /* (C.6) Step undefinitions */
       
   752   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::stepundef_sd);
       
   753   sfcdecl->print(symbol->fblock_body);
       
   754   delete sfcdecl;
       
   755   
       
   756   /* (C.7) Action undefinitions */
       
   757   sfcdecl = new generate_cc_sfcdecl_c(&s4o, generate_cc_sfcdecl_c::actionundef_sd);
       
   758   sfcdecl->print(symbol->fblock_body);
       
   759   delete sfcdecl;
   730 
   760 
   731   s4o.indent_left();
   761   s4o.indent_left();
   732   s4o.print("\n\n\n\n");
   762   s4o.print("\n\n\n\n");
   733 
   763 
   734   return NULL;
   764   return NULL;