diff -r e8b99f896416 -r 38754701ac41 stage4/generate_cc/generate_cc_sfcdecl.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/stage4/generate_cc/generate_cc_sfcdecl.cc Fri Feb 23 19:19:23 2007 +0100 @@ -0,0 +1,235 @@ +/* + * (c) 2007 Mario de Sousa, Laurent Bessard + * + * Offered to the public under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * This code is made available on the understanding that it will not be + * used in safety-critical situations without a full and competent review. + */ + +/* + * An IEC 61131-3 IL and ST compiler. + * + * Based on the + * FINAL DRAFT - IEC 61131-3, 2nd Ed. (2001-12-10) + * + */ + + +/* + * Conversion of sfc networks (i.e. SFC code). + * + * This is part of the 4th stage that generates + * a c++ source program equivalent to the SFC, IL and ST + * code. + */ + + + + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +class generate_cc_sfc_stepdecl_c: public generate_cc_base_c { + + private: + char step_number; + + public: + generate_cc_sfc_stepdecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} + ~generate_cc_sfc_stepdecl_c(void) {} + + void reset_step_number(void) {step_number = 0;} + char get_step_number(void) {return step_number;} + void increment_step_number(void) {step_number++;} + void print_step_number(void) { + char str[10]; + sprintf(str, "%d", step_number); + s4o.print(str); + } + +/*********************************************/ +/* B.1.6 Sequential function chart elements */ +/*********************************************/ + + void *visit(initial_step_c *symbol) { + s4o.print("#define "); + symbol->step_name->accept(*this); + s4o.print(" "); + print_step_number(); + s4o.print("\n"); + increment_step_number(); + return NULL; + } + + void *visit(step_c *symbol) { + s4o.print("#define "); + symbol->step_name->accept(*this); + s4o.print(" "); + print_step_number(); + s4o.print("\n"); + increment_step_number(); + return NULL; + } + + void *visit(transition_c *symbol) {return NULL;} + + void *visit(action_c *symbol) {return NULL;} + +}; /* generate_cc_sfc_stepdecl_c */ + + + + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +class generate_cc_sfc_actiondecl_c: public generate_cc_base_c { + + private: + char action_number; + + public: + generate_cc_sfc_actiondecl_c(stage4out_c *s4o_ptr): generate_cc_base_c(s4o_ptr) {} + ~generate_cc_sfc_actiondecl_c(void) {} + + void reset_action_number(void) {action_number = 0;} + char get_action_number(void) {return action_number;} + void increment_action_number(void) {action_number++;} + void print_action_number(void) { + char str[10]; + sprintf(str, "%d", action_number); + s4o.print(str); + } + +/*********************************************/ +/* B.1.6 Sequential function chart elements */ +/*********************************************/ + + void *visit(initial_step_c *symbol) {return NULL;} + + void *visit(step_c *symbol) {return NULL;} + + void *visit(transition_c *symbol) {return NULL;} + + void *visit(action_c *symbol) { + s4o.print("#define "); + symbol->action_name->accept(*this); + s4o.print(" "); + print_action_number(); + s4o.print("\n"); + increment_action_number(); + return NULL; + } + +}; /* generate_cc_sfc_actiondecl_c */ + + + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + +class generate_cc_sfcdecl_c: public iterator_visitor_c { + + protected: + stage4out_c &s4o; + + private: + generate_cc_sfc_stepdecl_c *generate_cc_sfc_stepdecl; + generate_cc_sfc_actiondecl_c *generate_cc_sfc_actiondecl; + + public: + generate_cc_sfcdecl_c(stage4out_c *s4o_ptr) : s4o(*s4o_ptr) { + generate_cc_sfc_stepdecl = new generate_cc_sfc_stepdecl_c(s4o_ptr); + generate_cc_sfc_actiondecl = new generate_cc_sfc_actiondecl_c(s4o_ptr); + } + + virtual ~generate_cc_sfcdecl_c(void) { + delete generate_cc_sfc_stepdecl; + delete generate_cc_sfc_actiondecl; + } + + public: + +/*********************************************/ +/* B.1.6 Sequential function chart elements */ +/*********************************************/ + + /*| sequential_function_chart sfc_network*/ + void *visit(sfc_network_c *symbol) { + char i; + + /* generate step number definitions */ + s4o.print(s4o.indent_spaces + "// Steps declaration\n"); + generate_cc_sfc_stepdecl->reset_step_number(); + symbol->accept(*generate_cc_sfc_stepdecl); + s4o.print("\n" + s4o.indent_spaces + "nb_steps = "); + generate_cc_sfc_stepdecl->print_step_number(); + s4o.print(";\n" + s4o.indent_spaces + "STEP step_list["); + generate_cc_sfc_stepdecl->print_step_number(); + s4o.print("] = {\n"); + s4o.indent_right(); + for (i = 0; i < generate_cc_sfc_stepdecl->get_step_number(); i++) { + if (i == 0) { + s4o.print(s4o.indent_spaces + "{1, 0, 0}"); + } + else { + s4o.print(",\n" + s4o.indent_spaces + "{0, 0, 0}"); + } + } + s4o.indent_left(); + s4o.print("\n" + s4o.indent_spaces + "};\n\n"); + + /* generate action number definitions */ + s4o.print(s4o.indent_spaces + "// Actions declaration\n"); + generate_cc_sfc_actiondecl->reset_action_number(); + symbol->accept(*generate_cc_sfc_actiondecl); + s4o.print("\n" + s4o.indent_spaces + "nb_actions = "); + generate_cc_sfc_actiondecl->print_action_number(); + s4o.print(";\n" + s4o.indent_spaces + "STEP step_list["); + generate_cc_sfc_actiondecl->print_action_number(); + s4o.print("] = {\n"); + s4o.indent_right(); + for (i = 0; i < generate_cc_sfc_actiondecl->get_action_number(); i++) { + if (i == 0) { + s4o.print(s4o.indent_spaces + "{0, 0, 0, 0, 0, 0}"); + } + else { + s4o.print(",\n" + s4o.indent_spaces + "{0, 0, 0, 0, 0, 0}"); + } + } + s4o.indent_left(); + s4o.print("\n" + s4o.indent_spaces + "};\n\n"); + + return NULL; + } + +/***********************************/ +/* B 2.1 Instructions and Operands */ +/***********************************/ +/*| instruction_list il_instruction */ + void *visit(instruction_list_c *symbol) {return NULL;} + +/***************************************/ +/* B.3 - Language ST (Structured Text) */ +/***************************************/ +/********************/ +/* B 3.2 Statements */ +/********************/ +void *visit(statement_list_c *symbol) {return NULL;} + +/* Remainder implemented in generate_cc_sfcdecl_c... */ +};