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@49: class generate_cc_sfcdecl_c: protected generate_cc_typedecl_c { lbessard@49: lbessard@49: public: lbessard@49: typedef enum { lbessard@49: sfcdecl_sg, lbessard@49: sfcinit_sg, lbessard@49: stepdef_sg, lbessard@49: stepundef_sg, lbessard@49: actiondef_sg, lbessard@49: actionundef_sg lbessard@49: } sfcgeneration_t; lbessard@17: lbessard@17: private: lbessard@17: char step_number; lbessard@49: char action_number; lbessard@49: char transition_number; lbessard@49: lbessard@49: sfcgeneration_t wanted_sfcgeneration; lbessard@17: lbessard@17: public: lbessard@49: generate_cc_sfcdecl_c(stage4out_c *s4o_ptr, sfcgeneration_t sfcgeneration) lbessard@49: : generate_cc_typedecl_c(s4o_ptr) { lbessard@49: wanted_sfcgeneration = sfcgeneration; lbessard@49: } lbessard@49: ~generate_cc_sfcdecl_c(void) {} lbessard@49: lbessard@49: void print(symbol_c *symbol, const char *variable_prefix = NULL) { lbessard@49: this->set_variable_prefix(variable_prefix); lbessard@49: lbessard@49: symbol->accept(*this); lbessard@49: } lbessard@49: lbessard@17: /*********************************************/ lbessard@17: /* B.1.6 Sequential function chart elements */ lbessard@17: /*********************************************/ lbessard@17: lbessard@49: void *visit(sequential_function_chart_c *symbol) { lbessard@49: step_number = 0; lbessard@49: action_number = 0; lbessard@49: transition_number = 0; lbessard@49: switch (wanted_sfcgeneration) { lbessard@49: case sfcdecl_sg: lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: lbessard@49: /* steps table declaration */ lbessard@49: s4o.print(s4o.indent_spaces + "STEP step_list["); lbessard@49: s4o.print_integer(step_number); lbessard@49: s4o.print("];\n"); lbessard@49: s4o.print(s4o.indent_spaces + "UINT nb_steps = "); lbessard@49: s4o.print_integer(step_number); lbessard@49: s4o.print(";\n"); lbessard@49: lbessard@49: /* actions table declaration */ lbessard@49: s4o.print(s4o.indent_spaces + "ACTION action_list["); lbessard@49: s4o.print_integer(action_number); lbessard@49: s4o.print("];\n"); lbessard@49: s4o.print(s4o.indent_spaces + "UINT nb_actions = "); lbessard@49: s4o.print_integer(action_number); lbessard@49: s4o.print(";\n"); lbessard@49: lbessard@49: /* transitions table declaration */ lbessard@49: s4o.print(s4o.indent_spaces + "USINT transition_list["); lbessard@49: s4o.print_integer(transition_number); lbessard@49: s4o.print("];\n"); lbessard@49: break; lbessard@49: case sfcinit_sg: lbessard@49: /* steps table initialisation */ lbessard@49: s4o.print(s4o.indent_spaces + "STEP temp_step = {0, 0, 0};\n"); lbessard@49: s4o.print(s4o.indent_spaces + "for(UINT i = 0; i < "); lbessard@49: print_variable_prefix(); lbessard@49: s4o.print("nb_steps; i++) {\n"); lbessard@49: s4o.indent_right(); lbessard@49: s4o.print(s4o.indent_spaces); lbessard@49: print_variable_prefix(); lbessard@49: s4o.print("step_list[i] = temp_step;\n"); lbessard@49: s4o.indent_left(); lbessard@49: s4o.print(s4o.indent_spaces + "}\n"); lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: lbessard@49: /* actions table initialisation */ lbessard@49: s4o.print(s4o.indent_spaces + "ACTION temp_action = {0, 0, 0, 0, 0, 0};\n"); lbessard@49: s4o.print(s4o.indent_spaces + "for(UINT i = 0; i < "); lbessard@49: print_variable_prefix(); lbessard@49: s4o.print("nb_actions; i++) {\n"); lbessard@49: s4o.indent_right(); lbessard@49: s4o.print(s4o.indent_spaces); lbessard@49: print_variable_prefix(); lbessard@49: s4o.print("action_list[i] = temp_action;\n"); lbessard@49: s4o.indent_left(); lbessard@49: s4o.print(s4o.indent_spaces + "}\n"); lbessard@49: break; lbessard@49: case stepdef_sg: lbessard@49: s4o.print("// Steps definitions\n"); lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: case actiondef_sg: lbessard@49: s4o.print("// Actions definitions\n"); lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: case stepundef_sg: lbessard@49: s4o.print("// Steps undefinitions\n"); lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: case actionundef_sg: lbessard@49: s4o.print("// Actions undefinitions\n"); lbessard@49: for(int i = 0; i < symbol->n; i++) lbessard@49: symbol->elements[i]->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: } lbessard@49: return NULL; lbessard@49: } lbessard@49: lbessard@17: void *visit(initial_step_c *symbol) { lbessard@49: switch (wanted_sfcgeneration) { lbessard@49: case sfcdecl_sg: lbessard@49: step_number++; lbessard@49: break; lbessard@49: case sfcinit_sg: lbessard@49: s4o.print(s4o.indent_spaces); lbessard@49: print_variable_prefix(); lbessard@49: s4o.print("action_list["); lbessard@49: s4o.print_integer(step_number); lbessard@49: s4o.print("].state = 1;\n"); lbessard@49: step_number++; lbessard@49: break; lbessard@49: case stepdef_sg: lbessard@49: s4o.print("#define "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->step_name->accept(*this); lbessard@49: s4o.print(" "); lbessard@49: s4o.print_integer(step_number); lbessard@49: s4o.print("\n"); lbessard@49: step_number++; lbessard@49: break; lbessard@49: case stepundef_sg: lbessard@49: s4o.print("#undef "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->step_name->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: default: lbessard@49: break; lbessard@49: } lbessard@17: return NULL; lbessard@17: } lbessard@17: lbessard@17: void *visit(step_c *symbol) { lbessard@49: switch (wanted_sfcgeneration) { lbessard@49: case sfcdecl_sg: lbessard@49: step_number++; lbessard@49: break; lbessard@49: case stepdef_sg: lbessard@49: s4o.print("#define "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->step_name->accept(*this); lbessard@49: s4o.print(" "); lbessard@49: s4o.print_integer(step_number); lbessard@49: s4o.print("\n"); lbessard@49: step_number++; lbessard@49: break; lbessard@49: case stepundef_sg: lbessard@49: s4o.print("#undef "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->step_name->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: default: lbessard@49: break; lbessard@49: } lbessard@49: return NULL; lbessard@49: } lbessard@49: lbessard@49: void *visit(transition_c *symbol) { lbessard@49: switch (wanted_sfcgeneration) { lbessard@49: case sfcdecl_sg: lbessard@49: transition_number++; lbessard@49: break; lbessard@49: default: lbessard@49: break; lbessard@49: } lbessard@49: return NULL; lbessard@49: } lbessard@17: lbessard@17: void *visit(action_c *symbol) { lbessard@49: switch (wanted_sfcgeneration) { lbessard@49: case actiondef_sg: lbessard@49: s4o.print("#define "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->action_name->accept(*this); lbessard@49: s4o.print(" "); lbessard@49: s4o.print_integer(action_number); lbessard@49: s4o.print("\n"); lbessard@49: action_number++; lbessard@49: break; lbessard@49: case actionundef_sg: lbessard@49: s4o.print("#undef "); lbessard@49: s4o.print(SFC_STEP_ACTION_PREFIX); lbessard@49: symbol->action_name->accept(*this); lbessard@49: s4o.print("\n"); lbessard@49: break; lbessard@49: case sfcdecl_sg: lbessard@49: action_number++; lbessard@49: break; lbessard@49: default: lbessard@49: break; lbessard@49: } lbessard@49: return NULL; lbessard@49: } lbessard@49: lbessard@49: }; /* generate_cc_sfcdecl_c */ lbessard@49: