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@52: sfcdecl_sd, lbessard@52: sfcinit_sd, lbessard@52: stepdef_sd, lbessard@52: stepundef_sd, lbessard@52: actiondef_sd, lbessard@52: actionundef_sd lbessard@52: } sfcdeclaration_t; lbessard@17: lbessard@17: private: lbessard@17: char step_number; lbessard@49: char action_number; lbessard@49: char transition_number; lbessard@49: lbessard@52: sfcdeclaration_t wanted_sfcdeclaration; lbessard@17: lbessard@17: public: lbessard@52: generate_cc_sfcdecl_c(stage4out_c *s4o_ptr, sfcdeclaration_t sfcdeclaration) lbessard@49: : generate_cc_typedecl_c(s4o_ptr) { lbessard@52: wanted_sfcdeclaration = sfcdeclaration; 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@52: switch (wanted_sfcdeclaration) { lbessard@52: case sfcdecl_sd: 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@52: case sfcinit_sd: 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@52: case stepdef_sd: 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@52: case actiondef_sd: 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@52: case stepundef_sd: 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@52: case actionundef_sd: 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@52: switch (wanted_sfcdeclaration) { lbessard@52: case sfcdecl_sd: lbessard@52: step_number++; lbessard@52: break; lbessard@52: case sfcinit_sd: 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@52: case stepdef_sd: 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@52: case stepundef_sd: 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@52: switch (wanted_sfcdeclaration) { lbessard@52: case sfcdecl_sd: lbessard@52: step_number++; lbessard@52: break; lbessard@52: case stepdef_sd: 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@52: case stepundef_sd: 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@52: switch (wanted_sfcdeclaration) { lbessard@52: case sfcdecl_sd: 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@52: switch (wanted_sfcdeclaration) { lbessard@52: case actiondef_sd: 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@52: case actionundef_sd: 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@52: case sfcdecl_sd: 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: