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); |
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 } |