stage4/generate_c/generate_c.cc
changeset 121 9e8ce092e169
parent 120 74640e3c7f53
child 138 8b32fd4d0194
equal deleted inserted replaced
120:74640e3c7f53 121:9e8ce092e169
   452 
   452 
   453 
   453 
   454 class generate_c_pous_c: public generate_c_typedecl_c {
   454 class generate_c_pous_c: public generate_c_typedecl_c {
   455 
   455 
   456   public:
   456   public:
   457     generate_c_pous_c(stage4out_c *s4o_ptr)
   457     generate_c_pous_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr)
   458       : generate_c_typedecl_c(s4o_ptr) {};
   458       : generate_c_typedecl_c(s4o_ptr, s4o_incl_ptr) {};
   459     virtual ~generate_c_pous_c(void) {}
   459     virtual ~generate_c_pous_c(void) {}
   460 
   460 
   461 
   461 
   462   public:
   462   public:
   463 
   463 
   623 /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   623 /*  FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */
   624 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused)
   624 //SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused)
   625 void *visit(function_block_declaration_c *symbol) {
   625 void *visit(function_block_declaration_c *symbol) {
   626   generate_c_vardecl_c *vardecl;
   626   generate_c_vardecl_c *vardecl;
   627   generate_c_sfcdecl_c *sfcdecl;
   627   generate_c_sfcdecl_c *sfcdecl;
       
   628   generate_c_typedecl_c *typedecl;
   628   TRACE("function_block_declaration_c");
   629   TRACE("function_block_declaration_c");
   629 
   630 
   630   /* start off by adding this declaration to the global
   631   /* start off by adding this declaration to the global
   631    * function block declaration symbol table...
   632    * function block declaration symbol table...
   632    */
   633    */
   633   function_block_type_symtable.insert(symbol->fblock_name, symbol);
   634   function_block_type_symtable.insert(symbol->fblock_name, symbol);
   634   
   635   
   635   /* (A) Function Block data structure declaration... */
   636   /* (A) Function Block data structure declaration... */
       
   637   typedecl = new generate_c_typedecl_c(&s4o_incl);
   636   /* (A.1) Data structure declaration */
   638   /* (A.1) Data structure declaration */
   637   s4o.print("// FUNCTION_BLOCK ");
   639   s4o_incl.print("// FUNCTION_BLOCK ");
   638   symbol->fblock_name->accept(*this);
   640   symbol->fblock_name->accept(*typedecl);
   639   s4o.print("\n// Data part\n");
   641   s4o_incl.print("\n// Data part\n");
   640   s4o.print("typedef struct {\n");
   642   s4o_incl.print("typedef struct {\n");
   641   s4o.indent_right();
   643   s4o_incl.indent_right();
   642   /* (A.2) Public variables: i.e. the function parameters... */
   644   /* (A.2) Public variables: i.e. the function parameters... */
   643   s4o.print(s4o.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n");
   645   s4o_incl.print(s4o_incl.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n");
   644   vardecl = new generate_c_vardecl_c(&s4o,
   646   vardecl = new generate_c_vardecl_c(&s4o_incl,
   645   				      generate_c_vardecl_c::local_vf,
   647   				      generate_c_vardecl_c::local_vf,
   646   				      generate_c_vardecl_c::input_vt |
   648   				      generate_c_vardecl_c::input_vt |
   647   				      generate_c_vardecl_c::output_vt |
   649   				      generate_c_vardecl_c::output_vt |
   648   				      generate_c_vardecl_c::inoutput_vt);
   650   				      generate_c_vardecl_c::inoutput_vt);
   649   vardecl->print(symbol->var_declarations);
   651   vardecl->print(symbol->var_declarations);
   650   delete vardecl;
   652   delete vardecl;
   651   s4o.print("\n");
   653   s4o_incl.print("\n");
   652   /* (A.3) Private internal variables */
   654   /* (A.3) Private internal variables */
   653   s4o.print(s4o.indent_spaces + "// FB private variables - TEMP, private and located variables\n");
   655   s4o_incl.print(s4o_incl.indent_spaces + "// FB private variables - TEMP, private and located variables\n");
   654   vardecl = new generate_c_vardecl_c(&s4o,
   656   vardecl = new generate_c_vardecl_c(&s4o_incl,
   655   				      generate_c_vardecl_c::local_vf,
   657   				      generate_c_vardecl_c::local_vf,
   656 				        generate_c_vardecl_c::temp_vt |
   658 				        generate_c_vardecl_c::temp_vt |
   657   				      generate_c_vardecl_c::private_vt |
   659   				      generate_c_vardecl_c::private_vt |
   658   				      generate_c_vardecl_c::located_vt |
   660   				      generate_c_vardecl_c::located_vt |
   659   				      generate_c_vardecl_c::external_vt);
   661   				      generate_c_vardecl_c::external_vt);
   660   vardecl->print(symbol->var_declarations);
   662   vardecl->print(symbol->var_declarations);
   661   delete vardecl;
   663   delete vardecl;
   662   /* (A.4) Generate private internal variables for SFC */
   664   /* (A.4) Generate private internal variables for SFC */
   663   sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcdecl_sd);
   665   sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd);
   664   sfcdecl->print(symbol->fblock_body);
   666   sfcdecl->print(symbol->fblock_body);
   665   delete sfcdecl;
   667   delete sfcdecl;
   666   s4o.print("\n");
   668   s4o_incl.print("\n");
   667 
   669   
   668   /* (A.5) Function Block data structure type name. */
   670   /* (A.5) Function Block data structure type name. */
   669   s4o.indent_left();
   671   s4o_incl.indent_left();
   670   s4o.print("} ");
   672   s4o_incl.print("} ");
   671   symbol->fblock_name->accept(*this);
   673   symbol->fblock_name->accept(*typedecl);
   672   s4o.print(";\n\n");
   674   s4o_incl.print(";\n\n");
   673 
   675   delete typedecl;
   674 
   676 
   675   /* (B) Constructor */
   677   /* (B) Constructor */
   676   /* (B.1) Constructor name... */
   678   /* (B.1) Constructor name... */
   677   s4o.print(s4o.indent_spaces + "void ");
   679   s4o.print(s4o.indent_spaces + "void ");
   678   symbol->fblock_name->accept(*this);
   680   symbol->fblock_name->accept(*this);
   783 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
   785 /*  PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */
   784 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
   786 //SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused)
   785 void *visit(program_declaration_c *symbol) {
   787 void *visit(program_declaration_c *symbol) {
   786   generate_c_vardecl_c *vardecl;
   788   generate_c_vardecl_c *vardecl;
   787   generate_c_sfcdecl_c *sfcdecl;
   789   generate_c_sfcdecl_c *sfcdecl;
       
   790   generate_c_typedecl_c *typedecl;
   788   TRACE("program_declaration_c");
   791   TRACE("program_declaration_c");
   789 
   792 
   790   /* start off by adding this declaration to the global
   793   /* start off by adding this declaration to the global
   791    * program declaration symbol table...
   794    * program declaration symbol table...
   792    */
   795    */
   793   program_type_symtable.insert(symbol->program_type_name, symbol);
   796   program_type_symtable.insert(symbol->program_type_name, symbol);
   794 
   797 
   795   /* (A) Program data structure declaration... */
   798   /* (A) Program data structure declaration... */
       
   799   typedecl = new generate_c_typedecl_c(&s4o_incl);
   796   /* (A.1) Data structure declaration */
   800   /* (A.1) Data structure declaration */
   797   s4o.print("// PROGRAM ");
   801   s4o_incl.print("// PROGRAM ");
   798   symbol->program_type_name->accept(*this);
   802   symbol->program_type_name->accept(*typedecl);
   799   s4o.print("\n// Data part\n");
   803   s4o_incl.print("\n// Data part\n");
   800   s4o.print("typedef struct {\n");
   804   s4o_incl.print("typedef struct {\n");
   801   s4o.indent_right();
   805   s4o_incl.indent_right();
   802 
   806 
   803   /* (A.2) Public variables: i.e. the program parameters... */
   807   /* (A.2) Public variables: i.e. the program parameters... */
   804   s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n");
   808   s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n");
   805   vardecl = new generate_c_vardecl_c(&s4o,
   809   vardecl = new generate_c_vardecl_c(&s4o_incl,
   806   				      generate_c_vardecl_c::local_vf,
   810   				      generate_c_vardecl_c::local_vf,
   807   				      generate_c_vardecl_c::input_vt |
   811   				      generate_c_vardecl_c::input_vt |
   808   				      generate_c_vardecl_c::output_vt |
   812   				      generate_c_vardecl_c::output_vt |
   809   				      generate_c_vardecl_c::inoutput_vt);
   813   				      generate_c_vardecl_c::inoutput_vt);
   810   vardecl->print(symbol->var_declarations);
   814   vardecl->print(symbol->var_declarations);
   811   delete vardecl;
   815   delete vardecl;
   812   s4o.print("\n");
   816   s4o_incl.print("\n");
   813   /* (A.3) Private internal variables */
   817   /* (A.3) Private internal variables */
   814   s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   818   s4o_incl.print(s4o_incl.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   815   vardecl = new generate_c_vardecl_c(&s4o,
   819   vardecl = new generate_c_vardecl_c(&s4o_incl,
   816                 generate_c_vardecl_c::local_vf,
   820                 generate_c_vardecl_c::local_vf,
   817                 generate_c_vardecl_c::temp_vt |
   821                 generate_c_vardecl_c::temp_vt |
   818                 generate_c_vardecl_c::private_vt |
   822                 generate_c_vardecl_c::private_vt |
   819                 generate_c_vardecl_c::located_vt |
   823                 generate_c_vardecl_c::located_vt |
   820                 generate_c_vardecl_c::external_vt);
   824                 generate_c_vardecl_c::external_vt);
   821   vardecl->print(symbol->var_declarations);
   825   vardecl->print(symbol->var_declarations);
   822   delete vardecl;
   826   delete vardecl;
   823   /* (A.4) Generate private internal variables for SFC */
   827   /* (A.4) Generate private internal variables for SFC */
   824   sfcdecl = new generate_c_sfcdecl_c(&s4o, generate_c_sfcdecl_c::sfcdecl_sd);
   828   sfcdecl = new generate_c_sfcdecl_c(&s4o_incl, generate_c_sfcdecl_c::sfcdecl_sd);
   825   sfcdecl->print(symbol->function_block_body);
   829   sfcdecl->print(symbol->function_block_body);
   826   delete sfcdecl;
   830   delete sfcdecl;
   827   
   831   
   828   /* (A.5) Program data structure type name. */
   832   /* (A.5) Program data structure type name. */
   829   s4o.indent_left();
   833   s4o_incl.indent_left();
   830   s4o.print("} ");
   834   s4o_incl.print("} ");
   831   symbol->program_type_name->accept(*this);
   835   symbol->program_type_name->accept(*typedecl);
   832   s4o.print(";\n\n");
   836   s4o_incl.print(";\n\n");
       
   837   delete typedecl;
   833 
   838 
   834   /* (B) Constructor */
   839   /* (B) Constructor */
   835   /* (B.1) Constructor name... */
   840   /* (B.1) Constructor name... */
   836   s4o.print(s4o.indent_spaces + "void ");
   841   s4o.print(s4o.indent_spaces + "void ");
   837   symbol->program_type_name->accept(*this);
   842   symbol->program_type_name->accept(*this);
  1209         delete vardecl;
  1214         delete vardecl;
  1210         s4o.print("\n");
  1215         s4o.print("\n");
  1211       }
  1216       }
  1212       
  1217       
  1213       /* (A.3) POUs inclusion */
  1218       /* (A.3) POUs inclusion */
       
  1219       s4o.print("#include \"POUS.h\"\n\n");
  1214       s4o.print("#include \"POUS.c\"\n\n");
  1220       s4o.print("#include \"POUS.c\"\n\n");
  1215       
  1221       
  1216       /* (A.4) Resource programs declaration... */
  1222       /* (A.4) Resource programs declaration... */
  1217       wanted_declaretype = declare_dt;
  1223       wanted_declaretype = declare_dt;
  1218       symbol->program_configuration_list->accept(*this);
  1224       symbol->program_configuration_list->accept(*this);
  1434 
  1440 
  1435 class generate_c_c: public iterator_visitor_c {
  1441 class generate_c_c: public iterator_visitor_c {
  1436   protected:
  1442   protected:
  1437     stage4out_c &s4o;
  1443     stage4out_c &s4o;
  1438     stage4out_c pous_s4o;
  1444     stage4out_c pous_s4o;
       
  1445     stage4out_c pous_incl_s4o;
  1439     stage4out_c located_variables_s4o;
  1446     stage4out_c located_variables_s4o;
  1440     stage4out_c variables_s4o;
  1447     stage4out_c variables_s4o;
  1441     generate_c_pous_c generate_c_pous;
  1448     generate_c_pous_c generate_c_pous;
  1442     generate_var_list_c *generate_var_list;
       
  1443     
  1449     
  1444     symbol_c *current_configuration;
  1450     symbol_c *current_configuration;
  1445 
  1451 
  1446     const char *current_name;
  1452     const char *current_name;
  1447     const char *current_builddir;
  1453     const char *current_builddir;
  1450 
  1456 
  1451   public:
  1457   public:
  1452     generate_c_c(stage4out_c *s4o_ptr, const char *builddir): 
  1458     generate_c_c(stage4out_c *s4o_ptr, const char *builddir): 
  1453             s4o(*s4o_ptr),
  1459             s4o(*s4o_ptr),
  1454             pous_s4o(builddir, "POUS", "c"),
  1460             pous_s4o(builddir, "POUS", "c"),
       
  1461             pous_incl_s4o(builddir, "POUS", "h"),
  1455             located_variables_s4o(builddir, "LOCATED_VARIABLES","h"),
  1462             located_variables_s4o(builddir, "LOCATED_VARIABLES","h"),
  1456             variables_s4o(builddir, "VARIABLES","csv"),
  1463             variables_s4o(builddir, "VARIABLES","csv"),
  1457             generate_c_pous(&pous_s4o) {
  1464             generate_c_pous(&pous_s4o, &pous_incl_s4o) {
  1458       current_builddir = builddir;
  1465       current_builddir = builddir;
  1459       current_configuration = NULL;
  1466       current_configuration = NULL;
  1460     }
  1467     }
  1461             
  1468             
  1462     ~generate_c_c(void) {}
  1469     ~generate_c_c(void) {}
  1463 
  1470 
  1464 /***************************/
  1471 /***************************/
  1465 /* B 0 - Programming Model */
  1472 /* B 0 - Programming Model */
  1466 /***************************/
  1473 /***************************/
  1467     void *visit(library_c *symbol) {
  1474     void *visit(library_c *symbol) {
  1468       generate_var_list = new generate_var_list_c(&variables_s4o, symbol);
  1475       pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n");
  1469       
       
  1470       for(int i = 0; i < symbol->n; i++) {
  1476       for(int i = 0; i < symbol->n; i++) {
  1471         symbol->elements[i]->accept(*this);
  1477         symbol->elements[i]->accept(*this);
  1472       }
  1478       }
  1473       
  1479       pous_incl_s4o.print("#endif //__POUS_H\n");
  1474       delete generate_var_list;
  1480       
       
  1481       generate_var_list_c generate_var_list(&variables_s4o, symbol);
       
  1482       generate_var_list.generate_programs(symbol);
       
  1483       generate_var_list.generate_variables(symbol);
  1475       
  1484       
  1476       generate_location_list_c generate_location_list(&located_variables_s4o);
  1485       generate_location_list_c generate_location_list(&located_variables_s4o);
  1477       symbol->accept(generate_location_list);
  1486       symbol->accept(generate_location_list);
  1478       return NULL;
  1487       return NULL;
  1479     }
  1488     }
  1554       
  1563       
  1555       symbol->resource_declarations->accept(*this);
  1564       symbol->resource_declarations->accept(*this);
  1556 
  1565 
  1557       current_configuration = NULL;
  1566       current_configuration = NULL;
  1558       
  1567       
  1559       symbol->accept(*generate_var_list);
       
  1560       
       
  1561       return NULL;
  1568       return NULL;
  1562     }
  1569     }
  1563 
  1570 
  1564     void *visit(resource_declaration_c *symbol) {
  1571     void *visit(resource_declaration_c *symbol) {
  1565     	symbol->resource_name->accept(*this);
  1572     	symbol->resource_name->accept(*this);