stage4/generate_cc/generate_cc.cc
changeset 17 38754701ac41
parent 16 e8b99f896416
child 18 e6af5eb5f546
--- a/stage4/generate_cc/generate_cc.cc	Tue Feb 20 18:17:21 2007 +0100
+++ b/stage4/generate_cc/generate_cc.cc	Fri Feb 23 19:19:23 2007 +0100
@@ -180,6 +180,7 @@
 #include "search_expression_type.cc"
 
 #include "generate_cc_base.cc"
+#include "generate_cc_sfcdecl.cc"
 #include "generate_cc_typedecl.cc"
 #include "generate_cc_vardecl.cc"
 #include "generate_cc_configbody.cc"
@@ -213,59 +214,76 @@
 /***********************************************************************/
 
 /* A helper class that knows how to generate code for both the IL and ST languages... */
-class generate_cc_IL_and_ST_c: public null_visitor_c {
+class generate_cc_SFC_IL_ST_c: public null_visitor_c {
   private:
     stage4out_c *s4o_ptr;
     symbol_c *scope;
     const char *variable_prefix;
 
   public:
-    generate_cc_IL_and_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) {
-      if (NULL == scope) ERROR;
-      this->s4o_ptr = s4o_ptr;
-      this->scope = scope;
-      this->variable_prefix = variable_prefix;
-    }
-
-
-  public:
-/****************************************/
-/* B.2 - Language IL (Instruction List) */
-/****************************************/
-
-/***********************************/
-/* B 2.1 Instructions and Operands */
-/***********************************/
-/*| instruction_list il_instruction */
-void *visit(instruction_list_c *symbol) {
+    generate_cc_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL);
+    /*********************************************/
+    /* B.1.6  Sequential function chart elements */
+    /*********************************************/
+    
+    /*| sequential_function_chart sfc_network*/
+    void *visit(sequential_function_chart_c * symbol);
+    
+    /****************************************/
+    /* B.2 - Language IL (Instruction List) */
+    /****************************************/
+    
+    /***********************************/
+    /* B 2.1 Instructions and Operands */
+    /***********************************/
+    /*| instruction_list il_instruction */
+    void *visit(instruction_list_c *symbol);
+    
+    /* Remainder implemented in generate_cc_il_c... */
+    
+    /***************************************/
+    /* B.3 - Language ST (Structured Text) */
+    /***************************************/
+    /***********************/
+    /* B 3.1 - Expressions */
+    /***********************/
+    /* Implemented in generate_cc_st_c */
+    
+    /********************/
+    /* B 3.2 Statements */
+    /********************/
+    void *visit(statement_list_c *symbol);
+
+/* Remainder implemented in generate_cc_st_c... */
+};
+
+#include "generate_cc_sfc.cc"
+
+generate_cc_SFC_IL_ST_c::generate_cc_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix) {
+  if (NULL == scope) ERROR;
+  this->s4o_ptr = s4o_ptr;
+  this->scope = scope;
+  this->variable_prefix = variable_prefix;
+}
+
+void *generate_cc_SFC_IL_ST_c::visit(sequential_function_chart_c * symbol) {
+  generate_cc_sfc_c generate_cc_sfc(s4o_ptr, scope, variable_prefix);
+  generate_cc_sfc.generate(symbol);
+  return NULL;
+}
+
+void *generate_cc_SFC_IL_ST_c::visit(instruction_list_c *symbol) {
   generate_cc_il_c generate_cc_il(s4o_ptr, scope, variable_prefix);
   generate_cc_il.generate(symbol);
   return NULL;
 }
 
-/* Remainder implemented in generate_cc_il_c... */
-
-/***************************************/
-/* B.3 - Language ST (Structured Text) */
-/***************************************/
-/***********************/
-/* B 3.1 - Expressions */
-/***********************/
-/* Implemented in generate_cc_st_c */
-
-/********************/
-/* B 3.2 Statements */
-/********************/
-void *visit(statement_list_c *symbol) {
+void *generate_cc_SFC_IL_ST_c::visit(statement_list_c *symbol) {
   generate_cc_st_c generate_cc_st(s4o_ptr, scope, variable_prefix);
   generate_cc_st.generate(symbol);
   return NULL;
 }
 
-/* Remainder implemented in generate_cc_st_c... */
-};
-
-
 
 
 
@@ -450,7 +468,7 @@
   s4o.print(";\n\n");
 
   /* (C) Function body */
-  generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol);
+  generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol);
   symbol->function_body->accept(generate_cc_code);
   s4o.print(s4o.indent_spaces + "return ");
   symbol->derived_function_name->accept(*this);
@@ -543,7 +561,7 @@
   s4o.print("\n");
 
   /* (B.3) Function code */
-  generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
+  generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   symbol->fblock_body->accept(generate_cc_code);
   s4o.indent_left();
   s4o.print(s4o.indent_spaces + "} // ");
@@ -602,16 +620,20 @@
   /* (A.3) Private internal variables */
   s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n");
   vardecl = new generate_cc_vardecl_c(&s4o,
-  				      generate_cc_vardecl_c::local_vf,
-				      generate_cc_vardecl_c::temp_vt |
-  				      generate_cc_vardecl_c::private_vt |
-  				      generate_cc_vardecl_c::located_vt |
-  				      generate_cc_vardecl_c::external_vt);
+                generate_cc_vardecl_c::local_vf,
+                generate_cc_vardecl_c::temp_vt |
+                generate_cc_vardecl_c::private_vt |
+                generate_cc_vardecl_c::located_vt |
+                generate_cc_vardecl_c::external_vt);
   vardecl->print(symbol->var_declarations);
   delete vardecl;
   s4o.print("\n");
 
-  /* (A.4) Program data structure type name. */
+  /* (A.4) Generate private internal variables for SFC*/
+  generate_cc_sfcdecl_c generate_cc_sfcdecl(&s4o);
+  symbol->function_block_body->accept(generate_cc_sfcdecl);
+
+  /* (A.5) Program data structure type name. */
   s4o.indent_left();
   s4o.print("} ");
   symbol->program_type_name->accept(*this);
@@ -643,7 +665,7 @@
   s4o.print("\n");
 
   /* (B.3) Function code */
-  generate_cc_IL_and_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
+  generate_cc_SFC_IL_ST_c generate_cc_code(&s4o, symbol, FB_FUNCTION_PARAM"->");
   symbol->function_block_body->accept(generate_cc_code);
   s4o.indent_left();
   s4o.print(s4o.indent_spaces + "} // ");