lbessard@17: /* lbessard@17: * (c) 2007 Mario de Sousa, Laurent Bessard lbessard@17: * lbessard@17: * Offered to the public under the terms of the GNU General Public License lbessard@17: * as published by the Free Software Foundation; either version 2 of the lbessard@17: * License, or (at your option) any later version. lbessard@17: * lbessard@17: * This program is distributed in the hope that it will be useful, but lbessard@17: * WITHOUT ANY WARRANTY; without even the implied warranty of lbessard@17: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General lbessard@17: * Public License for more details. lbessard@17: * lbessard@17: * This code is made available on the understanding that it will not be lbessard@17: * used in safety-critical situations without a full and competent review. lbessard@17: */ lbessard@17: lbessard@17: /* lbessard@17: * An IEC 61131-3 IL and ST compiler. lbessard@17: * lbessard@17: * Based on the lbessard@17: * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) lbessard@17: * lbessard@17: */ lbessard@17: lbessard@17: lbessard@17: /* lbessard@17: * Conversion of sfc networks (i.e. SFC code). lbessard@17: * lbessard@17: * This is part of the 4th stage that generates lbessard@17: * a c++ source program equivalent to the SFC, IL and ST lbessard@17: * code. lbessard@17: */ lbessard@17: lbessard@17: lbessard@17: lbessard@17: lbessard@17: /***********************************************************************/ lbessard@17: /***********************************************************************/ lbessard@17: /***********************************************************************/ lbessard@17: /***********************************************************************/ lbessard@17: lbessard@18: class generate_cc_sfc_steptable_c: public generate_cc_base_c { lbessard@17: lbessard@17: private: lbessard@17: char step_number; lbessard@17: lbessard@17: public: lbessard@18: generate_cc_sfc_steptable_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_steptable_c(void) {} lbessard@17: lbessard@17: void reset_step_number(void) {step_number = 0;} lbessard@17: void print_step_number(void) { lbessard@17: char str[10]; lbessard@17: sprintf(str, "%d", step_number); lbessard@17: s4o.print(str); lbessard@17: } lbessard@17: /*********************************************/ lbessard@17: /* B.1.6 Sequential function chart elements */ lbessard@17: /*********************************************/ lbessard@17: lbessard@17: void *visit(initial_step_c *symbol) { lbessard@18: if (step_number > 0) { lbessard@18: s4o.print(",\n"); lbessard@18: } lbessard@18: s4o.print(s4o.indent_spaces + "{1, 0, 0}"); lbessard@18: step_number++; lbessard@17: return NULL; lbessard@17: } lbessard@17: lbessard@17: void *visit(step_c *symbol) { lbessard@18: if (step_number > 0) { lbessard@18: s4o.print(",\n"); lbessard@18: } lbessard@18: s4o.print(s4o.indent_spaces + "{0, 0, 0}"); lbessard@18: step_number++; lbessard@17: return NULL; lbessard@17: } lbessard@17: lbessard@17: void *visit(transition_c *symbol) {return NULL;} lbessard@17: lbessard@17: void *visit(action_c *symbol) {return NULL;} lbessard@17: lbessard@18: }; /* generate_cc_sfc_steptable_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_actiontable_c: public generate_cc_base_c { lbessard@17: lbessard@17: private: lbessard@17: char action_number; lbessard@17: lbessard@17: public: lbessard@18: generate_cc_sfc_actiontable_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_actiontable_c(void) {} lbessard@17: lbessard@17: void reset_action_number(void) {action_number = 0;} lbessard@17: void print_action_number(void) { lbessard@17: char str[10]; lbessard@17: sprintf(str, "%d", action_number); lbessard@17: s4o.print(str); lbessard@17: } lbessard@17: /*********************************************/ lbessard@17: /* B.1.6 Sequential function chart elements */ lbessard@17: /*********************************************/ lbessard@17: lbessard@17: void *visit(initial_step_c *symbol) {return NULL;} lbessard@17: lbessard@17: void *visit(step_c *symbol) {return NULL;} lbessard@17: lbessard@17: void *visit(transition_c *symbol) {return NULL;} lbessard@17: lbessard@17: void *visit(action_c *symbol) { lbessard@18: if (action_number > 0) { lbessard@18: s4o.print(",\n"); lbessard@18: } lbessard@18: s4o.print(s4o.indent_spaces + "{0, 0, 0, 0, 0, 0}"); lbessard@18: action_number++; lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: }; /* generate_cc_sfc_actiontable_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_transitiontable_c: public generate_cc_base_c { lbessard@18: lbessard@18: private: lbessard@18: char transition_number; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfc_transitiontable_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_transitiontable_c(void) {} lbessard@18: lbessard@18: void reset_transition_number(void) {transition_number = 0;} lbessard@18: void print_transition_number(void) { lbessard@18: char str[10]; lbessard@18: sprintf(str, "%d", transition_number); lbessard@18: s4o.print(str); lbessard@18: } lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: void *visit(initial_step_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(step_c *symbol) {return NULL;} lbessard@18: lbessard@22: void *visit(transition_c *symbol) { lbessard@18: transition_number++; lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@22: void *visit(action_c *symbol) {return NULL;} lbessard@22: lbessard@18: }; /* generate_cc_sfc_steptable_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfctables_c: public iterator_visitor_c { lbessard@17: lbessard@17: protected: lbessard@17: stage4out_c &s4o; lbessard@17: lbessard@17: private: lbessard@18: generate_cc_sfc_steptable_c *generate_cc_sfc_steptable; lbessard@18: generate_cc_sfc_actiontable_c *generate_cc_sfc_actiontable; lbessard@18: generate_cc_sfc_transitiontable_c *generate_cc_sfc_transitiontable; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfctables_c(stage4out_c *s4o_ptr) : s4o(*s4o_ptr) { lbessard@18: generate_cc_sfc_steptable = new generate_cc_sfc_steptable_c(s4o_ptr); lbessard@18: generate_cc_sfc_actiontable = new generate_cc_sfc_actiontable_c(s4o_ptr); lbessard@18: generate_cc_sfc_transitiontable = new generate_cc_sfc_transitiontable_c(s4o_ptr); lbessard@18: } lbessard@18: lbessard@18: virtual ~generate_cc_sfctables_c(void) { lbessard@18: delete generate_cc_sfc_steptable; lbessard@18: delete generate_cc_sfc_actiontable; lbessard@18: delete generate_cc_sfc_transitiontable; lbessard@18: } lbessard@18: lbessard@18: public: lbessard@18: lbessard@18: /* generate steps and actions tables */ lbessard@18: void *visit(sequential_function_chart_c *symbol) { lbessard@18: /* generate steps table */ lbessard@18: generate_cc_sfc_steptable->reset_step_number(); lbessard@18: s4o.print(s4o.indent_spaces + "STEP step_list[] = {\n"); lbessard@17: s4o.indent_right(); lbessard@18: symbol->accept(*generate_cc_sfc_steptable); lbessard@18: s4o.indent_left(); lbessard@18: s4o.print("\n" + s4o.indent_spaces + "};\n" + s4o.indent_spaces + "nb_steps = "); lbessard@18: generate_cc_sfc_steptable->print_step_number(); lbessard@18: s4o.print(";\n"); lbessard@18: lbessard@18: /* generate actions table */ lbessard@18: generate_cc_sfc_actiontable->reset_action_number(); lbessard@18: s4o.print(s4o.indent_spaces + "ACTION action_list[] = {\n"); lbessard@17: s4o.indent_right(); lbessard@18: symbol->accept(*generate_cc_sfc_actiontable); lbessard@18: s4o.indent_left(); lbessard@18: s4o.print("\n" + s4o.indent_spaces + "};\n" + s4o.indent_spaces + "nb_actions = "); lbessard@18: generate_cc_sfc_actiontable->print_action_number(); lbessard@18: s4o.print(";\n"); lbessard@18: lbessard@22: /* generate transitions table */ lbessard@18: generate_cc_sfc_transitiontable->reset_transition_number(); lbessard@22: symbol->accept(*generate_cc_sfc_transitiontable); lbessard@18: s4o.print(s4o.indent_spaces + "char transition_list["); lbessard@18: generate_cc_sfc_transitiontable->print_transition_number(); lbessard@18: s4o.print("];\n"); lbessard@17: lbessard@17: return NULL; lbessard@17: } lbessard@17: lbessard@17: /***********************************/ lbessard@17: /* B 2.1 Instructions and Operands */ lbessard@17: /***********************************/ lbessard@17: /*| instruction_list il_instruction */ lbessard@17: void *visit(instruction_list_c *symbol) {return NULL;} lbessard@17: lbessard@17: /***************************************/ lbessard@17: /* B.3 - Language ST (Structured Text) */ lbessard@17: /***************************************/ lbessard@17: /********************/ lbessard@17: /* B 3.2 Statements */ lbessard@17: /********************/ lbessard@18: void *visit(statement_list_c *symbol) {return NULL;} lbessard@17: lbessard@17: /* Remainder implemented in generate_cc_sfcdecl_c... */ lbessard@17: }; lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_stepdecl_c: public generate_cc_base_c { lbessard@18: lbessard@18: private: lbessard@18: char step_number; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfc_stepdecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_stepdecl_c(void) {} lbessard@18: lbessard@18: void reset_step_number(void) {step_number = 0;} lbessard@18: void print_step_number(void) { lbessard@18: char str[10]; lbessard@18: sprintf(str, "%d", step_number); lbessard@18: s4o.print(str); lbessard@18: } lbessard@18: lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: void *visit(initial_step_c *symbol) { lbessard@18: s4o.print("#define "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->step_name->accept(*this); lbessard@18: s4o.print(" "); lbessard@18: print_step_number(); lbessard@18: s4o.print("\n"); lbessard@18: step_number++; lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: void *visit(step_c *symbol) { lbessard@18: s4o.print("#define "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->step_name->accept(*this); lbessard@18: s4o.print(" "); lbessard@18: print_step_number(); lbessard@18: s4o.print("\n"); lbessard@18: step_number++; lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: void *visit(transition_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(action_c *symbol) {return NULL;} lbessard@18: lbessard@18: }; /* generate_cc_sfc_stepdecl_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_actiondecl_c: public generate_cc_base_c { lbessard@18: lbessard@18: private: lbessard@18: char action_number; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfc_actiondecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_actiondecl_c(void) {} lbessard@18: lbessard@18: void reset_action_number(void) {action_number = 0;} lbessard@18: void print_action_number(void) { lbessard@18: char str[10]; lbessard@18: sprintf(str, "%d", action_number); lbessard@18: s4o.print(str); lbessard@18: } lbessard@18: lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: void *visit(initial_step_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(step_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(transition_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(action_c *symbol) { lbessard@18: s4o.print("#define "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->action_name->accept(*this); lbessard@18: s4o.print(" "); lbessard@18: print_action_number(); lbessard@18: s4o.print("\n"); lbessard@18: action_number++; lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: }; /* generate_cc_sfc_actiondecl_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfcdecl_c: public iterator_visitor_c { lbessard@18: lbessard@18: protected: lbessard@18: stage4out_c &s4o; lbessard@18: lbessard@18: private: lbessard@18: generate_cc_sfc_stepdecl_c *generate_cc_sfc_stepdecl; lbessard@18: generate_cc_sfc_actiondecl_c *generate_cc_sfc_actiondecl; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfcdecl_c(stage4out_c *s4o_ptr) : s4o(*s4o_ptr) { lbessard@18: generate_cc_sfc_stepdecl = new generate_cc_sfc_stepdecl_c(s4o_ptr); lbessard@18: generate_cc_sfc_actiondecl = new generate_cc_sfc_actiondecl_c(s4o_ptr); lbessard@18: } lbessard@18: lbessard@18: virtual ~generate_cc_sfcdecl_c(void) { lbessard@18: delete generate_cc_sfc_stepdecl; lbessard@18: delete generate_cc_sfc_actiondecl; lbessard@18: } lbessard@18: lbessard@18: public: lbessard@18: lbessard@18: /* generate steps and actions tables */ lbessard@18: void *visit(sequential_function_chart_c *symbol) { lbessard@18: /* generate steps definitions */ lbessard@18: generate_cc_sfc_stepdecl->reset_step_number(); lbessard@18: s4o.print("// Steps definitions\n"); lbessard@18: symbol->accept(*generate_cc_sfc_stepdecl); lbessard@18: s4o.print("\n"); lbessard@18: lbessard@18: /* generate actions definitions */ lbessard@18: generate_cc_sfc_actiondecl->reset_action_number(); lbessard@18: s4o.print("// Actions definitions\n"); lbessard@18: symbol->accept(*generate_cc_sfc_actiondecl); lbessard@18: s4o.print("\n"); lbessard@18: lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: /***********************************/ lbessard@18: /* B 2.1 Instructions and Operands */ lbessard@18: /***********************************/ lbessard@18: /*| instruction_list il_instruction */ lbessard@18: void *visit(instruction_list_c *symbol) {return NULL;} lbessard@18: lbessard@18: /***************************************/ lbessard@18: /* B.3 - Language ST (Structured Text) */ lbessard@18: /***************************************/ lbessard@18: /********************/ lbessard@18: /* B 3.2 Statements */ lbessard@18: /********************/ lbessard@18: void *visit(statement_list_c *symbol) {return NULL;} lbessard@18: lbessard@18: /* Remainder implemented in generate_cc_sfcdecl_c... */ lbessard@18: }; lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_stepundecl_c: public generate_cc_base_c { lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfc_stepundecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_stepundecl_c(void) {} lbessard@18: lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: void *visit(initial_step_c *symbol) { lbessard@18: s4o.print("#undef "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->step_name->accept(*this); lbessard@18: s4o.print("\n"); lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: void *visit(step_c *symbol) { lbessard@18: s4o.print("#undef "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->step_name->accept(*this); lbessard@18: s4o.print("\n"); lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: void *visit(transition_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(action_c *symbol) {return NULL;} lbessard@18: lbessard@18: }; /* generate_cc_sfc_stepdecl_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfc_actionundecl_c: public generate_cc_base_c { lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfc_actionundecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} lbessard@18: ~generate_cc_sfc_actionundecl_c(void) {} lbessard@18: lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: void *visit(initial_step_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(step_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(transition_c *symbol) {return NULL;} lbessard@18: lbessard@18: void *visit(action_c *symbol) { lbessard@18: s4o.print("#undef "); lbessard@18: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@18: symbol->action_name->accept(*this); lbessard@18: s4o.print("\n"); lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: }; /* generate_cc_sfc_stepdecl_c */ lbessard@18: lbessard@18: lbessard@18: lbessard@18: lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: /***********************************************************************/ lbessard@18: lbessard@18: class generate_cc_sfcundecl_c: public iterator_visitor_c { lbessard@18: lbessard@18: protected: lbessard@18: stage4out_c &s4o; lbessard@18: lbessard@18: private: lbessard@18: generate_cc_sfc_stepundecl_c *generate_cc_sfc_stepundecl; lbessard@18: generate_cc_sfc_actionundecl_c *generate_cc_sfc_actionundecl; lbessard@18: lbessard@18: public: lbessard@18: generate_cc_sfcundecl_c(stage4out_c *s4o_ptr) : s4o(*s4o_ptr) { lbessard@18: generate_cc_sfc_stepundecl = new generate_cc_sfc_stepundecl_c(s4o_ptr); lbessard@18: generate_cc_sfc_actionundecl = new generate_cc_sfc_actionundecl_c(s4o_ptr); lbessard@18: } lbessard@18: lbessard@18: virtual ~generate_cc_sfcundecl_c(void) { lbessard@18: delete generate_cc_sfc_stepundecl; lbessard@18: delete generate_cc_sfc_actionundecl; lbessard@18: } lbessard@18: lbessard@18: public: lbessard@18: lbessard@18: /*********************************************/ lbessard@18: /* B.1.6 Sequential function chart elements */ lbessard@18: /*********************************************/ lbessard@18: lbessard@18: /* generate steps and actions tables */ lbessard@18: void *visit(sequential_function_chart_c *symbol) { lbessard@18: /* generate steps undefinitions */ lbessard@18: s4o.print("// Steps undefinitions\n"); lbessard@18: symbol->accept(*generate_cc_sfc_stepundecl); lbessard@18: s4o.print("\n"); lbessard@18: lbessard@18: /* generate actions table */ lbessard@18: s4o.print("// Actions undefinitions\n"); lbessard@18: symbol->accept(*generate_cc_sfc_actionundecl); lbessard@18: s4o.print("\n"); lbessard@18: lbessard@18: return NULL; lbessard@18: } lbessard@18: lbessard@18: /***********************************/ lbessard@18: /* B 2.1 Instructions and Operands */ lbessard@18: /***********************************/ lbessard@18: /*| instruction_list il_instruction */ lbessard@18: void *visit(instruction_list_c *symbol) {return NULL;} lbessard@18: lbessard@18: /***************************************/ lbessard@18: /* B.3 - Language ST (Structured Text) */ lbessard@18: /***************************************/ lbessard@18: /********************/ lbessard@18: /* B 3.2 Statements */ lbessard@18: /********************/ lbessard@18: void *visit(statement_list_c *symbol) {return NULL;} lbessard@18: lbessard@18: /* Remainder implemented in generate_cc_sfcdecl_c... */ lbessard@18: };