stage4/generate_c/generate_c_sfc.cc
author mjsousa
Sun, 16 Nov 2014 12:54:10 +0000
changeset 945 477393b00f95
parent 899 a3f734a23566
child 992 aa642302fa60
permissions -rwxr-xr-x
Add support for relaxed datatype model for array datatypes.
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     1
/*
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     2
 *  matiec - a compiler for the programming languages defined in IEC 61131-3
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     3
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     4
 *  Copyright (C) 2003-2011  Mario de Sousa (msousa@fe.up.pt)
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     5
 *  Copyright (C) 2007-2011  Laurent Bessard and Edouard Tisserant
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
     6
 *
279
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     7
 *  This program is free software: you can redistribute it and/or modify
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     8
 *  it under the terms of the GNU General Public License as published by
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
     9
 *  the Free Software Foundation, either version 3 of the License, or
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    10
 *  (at your option) any later version.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    11
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    12
 *  This program is distributed in the hope that it will be useful,
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    13
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    14
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    15
 *  GNU General Public License for more details.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    16
 *
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    17
 *  You should have received a copy of the GNU General Public License
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    18
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
c0453b7f99df Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents: 244
diff changeset
    19
 *
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    20
 *
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    21
 * This code is made available on the understanding that it will not be
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    22
 * used in safety-critical situations without a full and competent review.
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    23
 */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    24
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    25
typedef struct
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    26
{
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    27
  transition_c *symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    28
  int priority;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    29
  int index;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    30
} TRANSITION;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    31
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    32
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    33
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    34
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    35
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    36
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 899
diff changeset
    37
class generate_c_sfc_elements_c: public generate_c_base_and_typeid_c {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    38
  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    39
  public:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    40
    typedef enum {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    41
      transitionlist_sg,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    42
      transitiontest_sg,
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
    43
      transitiontestdebug_sg,
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    44
      stepset_sg,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    45
      stepreset_sg,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    46
      actionassociation_sg,
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    47
      actionbody_sg
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    48
    } sfcgeneration_t;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    49
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    50
  private:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    51
    generate_c_il_c *generate_c_il;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    52
    generate_c_st_c *generate_c_st;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    53
    generate_c_SFC_IL_ST_c *generate_c_code;
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    54
    search_var_instance_decl_c *search_var_instance_decl;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    55
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    56
    int transition_number;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    57
    std::list<TRANSITION> transition_list;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    58
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    59
    symbol_c *current_step;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    60
    symbol_c *current_action;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    61
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    62
    sfcgeneration_t wanted_sfcgeneration;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    63
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    64
  public:
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
    65
    generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 899
diff changeset
    66
    : generate_c_base_and_typeid_c(s4o_ptr) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
    67
      generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
    68
      generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
    69
      generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix);
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    70
      search_var_instance_decl = new search_var_instance_decl_c(scope);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    71
      this->set_variable_prefix(variable_prefix);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    72
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    73
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    74
    ~generate_c_sfc_elements_c(void) {
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
    75
      transition_list.clear();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    76
      delete generate_c_il;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    77
      delete generate_c_st;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    78
      delete generate_c_code;
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    79
      delete search_var_instance_decl;
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    80
    }
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    81
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    82
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    83
	bool is_variable(symbol_c *symbol) {
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    84
	  /* we try to find the variable instance declaration, to determine if symbol is variable... */
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    85
	  symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    86
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    87
	  return var_decl != NULL;
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
    88
	}
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    89
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    90
    void reset_transition_number(void) {transition_number = 0;}
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    91
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    92
    void generate(symbol_c *symbol, sfcgeneration_t generation_type) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    93
      wanted_sfcgeneration = generation_type;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    94
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    95
        case transitiontest_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    96
          {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    97
            std::list<TRANSITION>::iterator pt;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    98
            for(pt = transition_list.begin(); pt != transition_list.end(); pt++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    99
              transition_number = pt->index;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   100
              pt->symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   101
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   102
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   103
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   104
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   105
          symbol->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   106
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   107
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   108
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   109
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   110
    void print_step_argument(symbol_c *step_name, const char* argument, bool setter=false) {
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   111
      print_variable_prefix();
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   112
      if (setter) s4o.print(",");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   113
      step_name->accept(*this);  // in the generated C code, the 'step_name' will have been previously #define'd as equiv to '__step_list[<step_number>]", so now we simply print out the name!
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   114
      s4o.print(".");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
      s4o.print(argument);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   116
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   118
    void print_action_argument(symbol_c *action_name, const char* argument, bool setter=false) {
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   119
      print_variable_prefix();
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   120
      if (setter) s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   121
      s4o.print("__action_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   122
      s4o.print(SFC_STEP_ACTION_PREFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   123
      action_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
      s4o.print("].");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
      s4o.print(argument);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
    }      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
    void print_transition_number(void) {
594
c8092e909886 Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents: 561
diff changeset
   129
      s4o.print(transition_number);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   131
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
    void print_reset_step(symbol_c *step_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   134
      s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   135
      s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   136
      print_step_argument(step_name, "X", true);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   137
      s4o.print(",,0);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   138
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   139
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
    void print_set_step(symbol_c *step_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   142
      s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   143
      s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   144
      print_step_argument(step_name, "X", true);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   145
      s4o.print(",,1);\n" + s4o.indent_spaces);
899
a3f734a23566 Add support for the stepname.T syntax.
mjsousa
parents: 897
diff changeset
   146
      print_step_argument(step_name, "T.value");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   147
      s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
    void *visit(initial_step_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   155
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   156
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   157
          if (((list_c*)symbol->action_association_list)->n > 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   158
            s4o.print(s4o.indent_spaces + "// ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   159
            symbol->step_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   160
            s4o.print(" action associations\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   161
            current_step = symbol->step_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   162
            s4o.print(s4o.indent_spaces + "{\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   163
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   164
            s4o.print(s4o.indent_spaces + "char activated = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   165
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   166
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   167
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   168
            s4o.print(") && !");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   169
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   170
            s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   171
            s4o.print(s4o.indent_spaces + "char desactivated = !");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   172
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   173
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   174
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   175
            s4o.print(") && ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   176
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   177
            s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   178
            s4o.print(s4o.indent_spaces + "char active = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   179
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   180
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   181
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   182
            s4o.print(");\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   183
            symbol->action_association_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   184
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   185
            s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   186
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   187
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   188
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   189
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   190
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   191
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   192
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   193
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   194
    void *visit(step_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   195
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   196
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   197
          if (((list_c*)symbol->action_association_list)->n > 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   198
            s4o.print(s4o.indent_spaces + "// ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   199
            symbol->step_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   200
            s4o.print(" action associations\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   201
            current_step = symbol->step_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   202
            s4o.print(s4o.indent_spaces + "{\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   203
            s4o.indent_right();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   204
            s4o.print(s4o.indent_spaces + "char activated, desactivated, active;\n");
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   205
            s4o.print(s4o.indent_spaces + "activated = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   206
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   207
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   208
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   209
            s4o.print(") && !");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   210
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   211
            s4o.print(";\n");
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   212
            s4o.print(s4o.indent_spaces + "desactivated = !");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   213
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   214
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   215
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   216
            s4o.print(") && ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   217
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   218
            s4o.print(";\n");
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   219
            s4o.print(s4o.indent_spaces + "active = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   220
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   221
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   222
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   223
            s4o.print(");\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   224
            symbol->action_association_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   225
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   226
            s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   227
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   228
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   229
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   230
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   231
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   232
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   233
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   234
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   235
    void *visit(transition_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   236
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   237
        case transitionlist_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   238
          {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   239
            TRANSITION *transition;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   240
            transition = new TRANSITION;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   241
            transition->symbol = symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   242
            transition->index = transition_number;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   243
            if (symbol->integer != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   244
              transition->priority = atoi(((token_c *)symbol->integer)->value);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   245
              std::list<TRANSITION>::iterator pt = transition_list.begin();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   246
              while (pt != transition_list.end() && pt->priority <= transition->priority) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   247
                pt++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   248
              } 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   249
              transition_list.insert(pt, *transition);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   250
            } 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   251
            else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   252
              transition->priority = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   253
              transition_list.push_back(*transition);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   254
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   255
            transition_number++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   256
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   257
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   258
        case transitiontest_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   259
          s4o.print(s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   260
          symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   261
          s4o.print(") {\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   262
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   263
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   264
          // Calculate transition value
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   265
          symbol->transition_condition->accept(*this);
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   266
          
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   267
          if (symbol->integer != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   268
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   269
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   270
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   271
            print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   272
            s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   273
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   274
            s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   275
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   276
            wanted_sfcgeneration = stepreset_sg;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   277
            symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   278
            wanted_sfcgeneration = transitiontest_sg;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   279
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   280
            s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   281
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   282
          s4o.indent_left();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   283
          s4o.print(s4o.indent_spaces + "}\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   284
          s4o.print(s4o.indent_spaces + "else {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   285
          s4o.indent_right();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   286
          // Calculate transition value for debug
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   287
          s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   288
          s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   289
          wanted_sfcgeneration = transitiontestdebug_sg;
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   290
          symbol->transition_condition->accept(*this);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   291
          wanted_sfcgeneration = transitiontest_sg;
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   292
          s4o.indent_left();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   293
          s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   294
          s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   295
          s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   296
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   297
          print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   298
          s4o.print(",__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   299
          print_transition_number();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   300
          s4o.print("],,0);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   301
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   302
          s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   303
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   304
        case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   305
          s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   306
          s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   307
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   308
          print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   309
          s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   310
          print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   311
          s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   312
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   313
          symbol->to_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   314
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   315
          s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   316
          transition_number++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   317
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   318
        case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
          if (symbol->integer == NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   320
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   321
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   322
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   323
            print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   324
            s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   326
            s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   328
            symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
            s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
          transition_number++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   333
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   334
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   335
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   336
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   337
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   338
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   339
    
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   340
    void *visit(transition_condition_c *symbol) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   341
      switch (wanted_sfcgeneration) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   342
        case transitiontest_sg:
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   343
        case transitiontestdebug_sg:
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   344
          // Transition condition is in IL
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   345
          if (symbol->transition_condition_il != NULL) {
682
966f32af570d Major code cleanup: IL code generation now uses symbol.datatype (filled in during stage3 data type checking) instead of determining the symbol's datatype by itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 629
diff changeset
   346
            generate_c_il->declare_implicit_variable_back();
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   347
            s4o.print(s4o.indent_spaces);
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   348
            symbol->transition_condition_il->accept(*generate_c_il);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   349
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   350
            s4o.print("(");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   351
            print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   352
            s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   353
            if (wanted_sfcgeneration == transitiontestdebug_sg)
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   354
              s4o.print("__debug_");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   355
            else
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   356
              s4o.print("__");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   357
            s4o.print("transition_list[");
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   358
            print_transition_number();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   359
            s4o.print("],,");
682
966f32af570d Major code cleanup: IL code generation now uses symbol.datatype (filled in during stage3 data type checking) instead of determining the symbol's datatype by itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 629
diff changeset
   360
            generate_c_il->print_implicit_variable_back();
966f32af570d Major code cleanup: IL code generation now uses symbol.datatype (filled in during stage3 data type checking) instead of determining the symbol's datatype by itself.
Mario de Sousa <msousa@fe.up.pt>
parents: 629
diff changeset
   361
            // generate_c_il->reset_default_variable_name(); // generate_c_il does not require his anymore
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   362
            s4o.print(");\n");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   363
          }
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   364
          // Transition condition is in ST
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   365
          if (symbol->transition_condition_st != NULL) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   366
            s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   367
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   368
            s4o.print("(");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   369
            print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   370
            s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   371
            if (wanted_sfcgeneration == transitiontestdebug_sg)
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   372
              s4o.print("__debug_");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   373
            else
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   374
              s4o.print("__");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   375
            s4o.print("transition_list[");
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   376
            print_transition_number();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   377
            s4o.print("],,");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   378
            symbol->transition_condition_st->accept(*generate_c_st);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   379
            s4o.print(");\n");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   380
          }
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   381
          if (wanted_sfcgeneration == transitiontest_sg) {
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   382
            s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   383
            s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   384
            s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   385
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   386
            s4o.print("(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   387
            print_variable_prefix();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   388
            s4o.print(",__debug_transition_list[");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   389
            print_transition_number();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   390
            s4o.print("],,");
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   391
            s4o.print(GET_VAR);
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   392
            s4o.print("(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   393
            print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   394
            s4o.print("__transition_list[");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   395
            print_transition_number();
221
c6aed7e5f070 Adding support for flags on Function Block variables for marking which variable must be debugged, retained or is forced
laurent
parents: 217
diff changeset
   396
            s4o.print("]));\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   397
            s4o.indent_left();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   398
            s4o.print(s4o.indent_spaces + "}\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   399
          }
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   400
          break;
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   401
        default:
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   402
          break;
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   403
      }
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   404
      return NULL;
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   405
    }
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   406
    
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   407
    void *visit(action_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   408
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   409
        case actionbody_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   410
          s4o.print(s4o.indent_spaces + "if(");
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   411
          s4o.print(GET_VAR);
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   412
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   413
          print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   414
          s4o.print("__action_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   415
          s4o.print(SFC_STEP_ACTION_PREFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   416
          symbol->action_name->accept(*this);
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   417
          s4o.print("].state)) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   418
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   419
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   420
          // generate action code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   421
          symbol->function_block_body->accept(*generate_c_code);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   422
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   423
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   424
          s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   425
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   426
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   427
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   428
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   429
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   430
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   431
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   432
    void *visit(steps_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   433
      if (symbol->step_name != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   434
        switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   435
          case transitiontest_sg:
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   436
            s4o.print(GET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   437
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   438
            print_step_argument(symbol->step_name, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   439
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   440
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   441
          case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   442
            print_set_step(symbol->step_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   443
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   444
          case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   445
            print_reset_step(symbol->step_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   446
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   447
          default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   448
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   449
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   450
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   451
      else if (symbol->step_name_list != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   452
        symbol->step_name_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   453
      }  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   454
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   455
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   456
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   457
    void *visit(step_name_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   458
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   459
        case transitiontest_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   460
          for(int i = 0; i < symbol->n; i++) {
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   461
            s4o.print(GET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   462
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   463
            print_step_argument(symbol->elements[i], "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   464
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   465
            if (i < symbol->n - 1) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   466
              s4o.print(" && ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   467
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   468
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   469
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   470
        case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   471
          for(int i = 0; i < symbol->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   472
            print_set_step(symbol->elements[i]);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   473
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   474
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   475
        case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   476
          for(int i = 0; i < symbol->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   477
            print_reset_step(symbol->elements[i]);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   478
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   479
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   480
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   481
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   482
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   483
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   484
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   485
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   486
    void *visit(action_association_list_c* symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   487
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   488
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   489
          print_list(symbol, "", "\n", "\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   490
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   491
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   492
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   493
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   494
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   495
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   496
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   497
    void *visit(action_association_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   498
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   499
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   500
          if (symbol->action_qualifier != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   501
            current_action = symbol->action_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   502
            symbol->action_qualifier->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   503
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   504
          else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   505
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   506
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   507
            s4o.print("(");
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   508
            print_step_argument(current_step, "X");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   509
            s4o.print(")) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   510
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   511
            s4o.print(s4o.indent_spaces);
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   512
            s4o.print(SET_VAR);
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   513
            s4o.print("(");
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   514
            print_action_argument(symbol->action_name, "state", true);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   515
            s4o.print(",,1);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   516
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   517
            s4o.print(s4o.indent_spaces + "}");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   518
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   519
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   520
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   521
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   522
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   523
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   524
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   525
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   526
    void *visit(action_qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   527
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   528
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   529
          {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   530
            char *qualifier = (char *)symbol->action_qualifier->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   531
            s4o.print(s4o.indent_spaces + "if (");
155
e094c92cf197 set and reset action fixed
greg
parents: 149
diff changeset
   532
            if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "S") == 0 ||
e094c92cf197 set and reset action fixed
greg
parents: 149
diff changeset
   533
                strcmp(qualifier, "R") == 0) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   534
              s4o.print("active");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   535
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   536
            else if (strcmp(qualifier, "P") == 0 || strcmp(qualifier, "SD") == 0 ||
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   537
                     strcmp(qualifier, "DS") == 0 || strcmp(qualifier, "SL") == 0 ||
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   538
                     strcmp(qualifier, "P0") == 0) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   539
              s4o.print("activated");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   540
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   541
            else if (strcmp(qualifier, "P1") == 0) {
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   542
              s4o.print("desactivated");
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   543
            }
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   544
            else if (strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) {
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   545
              s4o.print("active && __time_cmp(");
899
a3f734a23566 Add support for the stepname.T syntax.
mjsousa
parents: 897
diff changeset
   546
              print_step_argument(current_step, "T.value");
120
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   547
              s4o.print(", ");
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   548
              symbol->action_time->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   549
              if (strcmp(qualifier, "D") == 0) {
120
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   550
                s4o.print(") >= 0");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   551
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   552
              else {
120
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   553
                s4o.print(") < 0");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   554
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   555
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   556
            s4o.print(") {\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   557
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   558
            s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   559
            if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "P") == 0 ||
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   560
                strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0 ||
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   561
                strcmp(qualifier, "P0") == 0 || strcmp(qualifier, "P1") == 0) {
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   562
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   563
              if (is_variable(current_action)) {
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   564
                unsigned int vartype = search_var_instance_decl->get_vartype(current_action);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   565
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   566
                if (vartype == search_var_instance_decl_c::external_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   567
                  s4o.print(SET_EXTERNAL);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   568
                else if (vartype == search_var_instance_decl_c::located_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   569
                  s4o.print(SET_LOCATED);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   570
                else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   571
                  s4o.print(SET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   572
                s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   573
                print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   574
                s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   575
                current_action->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   576
                s4o.print(",,1);\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   577
                s4o.indent_left();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   578
                s4o.print(s4o.indent_spaces + "}\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   579
                s4o.print(s4o.indent_spaces + "else if (active) {\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   580
                s4o.indent_right();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   581
                s4o.print(s4o.indent_spaces);
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   582
                if (vartype == search_var_instance_decl_c::external_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   583
                  s4o.print(SET_EXTERNAL);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   584
                else if (vartype == search_var_instance_decl_c::located_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   585
                  s4o.print(SET_LOCATED);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   586
                else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   587
                  s4o.print(SET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   588
                s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   589
                print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   590
                s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   591
                current_action->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   592
                s4o.print(",,0);\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   593
              }
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   594
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   595
              else {
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   596
                s4o.print(SET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   597
                s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   598
                print_action_argument(current_action, "state", true);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   599
                s4o.print(",,1);\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   600
              }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   601
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   602
            if (strcmp(qualifier, "S") == 0 || strcmp(qualifier, "SL") == 0) {
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   603
              print_action_argument(current_action, "set");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   604
              s4o.print(" = 1;\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   605
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   606
            if (strcmp(qualifier, "R") == 0) {
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   607
              print_action_argument(current_action, "reset");
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   608
              s4o.print(" = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   609
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   610
            if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   611
                strcmp(qualifier, "SL") == 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   612
              if (strcmp(qualifier, "SL") == 0) {
703
48d106ffc2ca Fix indentation in SFC SL qualifier code generated
Laurent Bessard
parents: 702
diff changeset
   613
            	s4o.print(s4o.indent_spaces);
48d106ffc2ca Fix indentation in SFC SL qualifier code generated
Laurent Bessard
parents: 702
diff changeset
   614
            	print_action_argument(current_action, "reset_remaining_time");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   615
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   616
              else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   617
                print_action_argument(current_action, "set_remaining_time");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   618
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   619
              s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   620
              symbol->action_time->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   621
              s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   622
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   623
            s4o.indent_left();
561
30a327be60d4 Fix SFC stage4 error.
Manuele Conti <conti.ma@alice.it>
parents: 417
diff changeset
   624
            s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   625
            if (strcmp(qualifier, "DS") == 0) {
704
1adc8df05d2b Fix definition of BCD to ANY_UINT and ANY_UINT to BCD conversion standard functions
Laurent Bessard
parents: 703
diff changeset
   626
              s4o.print(s4o.indent_spaces + "if (desactivated) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   627
              s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   628
              s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   629
              print_action_argument(current_action, "set_remaining_time");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   630
              s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
561
30a327be60d4 Fix SFC stage4 error.
Manuele Conti <conti.ma@alice.it>
parents: 417
diff changeset
   631
              s4o.indent_left();
30a327be60d4 Fix SFC stage4 error.
Manuele Conti <conti.ma@alice.it>
parents: 417
diff changeset
   632
              s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   633
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   634
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   635
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   636
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   637
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   638
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   639
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   640
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   641
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   642
    void *visit(qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   643
      return (void *)symbol->value;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   644
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   645
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   646
    void *visit(timed_qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   647
      return (void *)symbol->value;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   648
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   649
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   650
}; /* generate_c_sfc_actiondecl_c */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   651
 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   652
 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   653
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   654
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   655
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   656
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   657
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 899
diff changeset
   658
class generate_c_sfc_c: public generate_c_base_and_typeid_c {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   659
  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   660
  private:
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   661
    std::list<VARIABLE> variable_list;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   662
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   663
    generate_c_sfc_elements_c *generate_c_sfc_elements;
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   664
    search_var_instance_decl_c *search_var_instance_decl;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   665
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   666
  public:
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   667
    generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
945
477393b00f95 Add support for relaxed datatype model for array datatypes.
mjsousa
parents: 899
diff changeset
   668
    : generate_c_base_and_typeid_c(s4o_ptr) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   669
      generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix);
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   670
      search_var_instance_decl = new search_var_instance_decl_c(scope);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   671
      this->set_variable_prefix(variable_prefix);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   672
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   673
  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   674
    virtual ~generate_c_sfc_c(void) {
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   675
      variable_list.clear();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   676
      delete generate_c_sfc_elements;
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   677
      delete search_var_instance_decl;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   678
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   679
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   680
    bool is_variable(symbol_c *symbol) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   681
      /* we try to find the variable instance declaration, to determine if symbol is variable... */
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   682
      symbol_c *var_decl = search_var_instance_decl->get_decl(symbol);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   683
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   684
      return var_decl != NULL;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   685
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   686
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
/*********************************************/
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   690
    
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   691
    void *visit(sequential_function_chart_c *symbol) {
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   692
      int i;
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   693
      
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   694
      generate_c_sfc_elements->reset_transition_number();
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   695
      for(i = 0; i < symbol->n; i++) {
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   696
        symbol->elements[i]->accept(*this);
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   697
        generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg);
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   698
      }
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   699
      
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   700
      s4o.print(s4o.indent_spaces +"INT i;\n");
125
7ec16536bc87 Modifying time qualifier in SFC to take real time enlapsed instead of theoric period time
lbessard
parents: 121
diff changeset
   701
      s4o.print(s4o.indent_spaces +"TIME elapsed_time, current_time;\n\n");
7ec16536bc87 Modifying time qualifier in SFC to take real time enlapsed instead of theoric period time
lbessard
parents: 121
diff changeset
   702
      
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   703
      /* generate elapsed_time initializations */
125
7ec16536bc87 Modifying time qualifier in SFC to take real time enlapsed instead of theoric period time
lbessard
parents: 121
diff changeset
   704
      s4o.print(s4o.indent_spaces + "// Calculate elapsed_time\n");
7ec16536bc87 Modifying time qualifier in SFC to take real time enlapsed instead of theoric period time
lbessard
parents: 121
diff changeset
   705
      s4o.print(s4o.indent_spaces +"current_time = __CURRENT_TIME;\n");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   706
//       s4o.print(s4o.indent_spaces +"elapsed_time = __time_sub(__BOOL_LITERAL(TRUE), NULL, current_time, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   707
//       s4o.print(s4o.indent_spaces +"elapsed_time = SUB_TIME(__BOOL_LITERAL(TRUE), NULL, current_time, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   708
      s4o.print(s4o.indent_spaces +"elapsed_time = __time_sub(current_time, ");
125
7ec16536bc87 Modifying time qualifier in SFC to take real time enlapsed instead of theoric period time
lbessard
parents: 121
diff changeset
   709
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   710
      s4o.print("__lasttick_time);\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   711
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   712
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   713
      s4o.print("__lasttick_time = current_time;\n");
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   714
      
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   715
      /* generate transition initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   716
      s4o.print(s4o.indent_spaces + "// Transitions initialization\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   717
      s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   718
      s4o.indent_right();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   719
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   720
      print_variable_prefix();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   721
      s4o.print("__nb_transitions; i++) {\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   722
      s4o.indent_right();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   723
      s4o.print(s4o.indent_spaces);
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   724
      print_variable_prefix();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   725
      s4o.print("__transition_list[i] = ");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   726
      print_variable_prefix();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   727
      s4o.print("__debug_transition_list[i];\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   728
      s4o.indent_left();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   729
      s4o.print(s4o.indent_spaces + "}\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   730
      s4o.indent_left();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   731
      s4o.print(s4o.indent_spaces + "}\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   732
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   733
      /* generate step initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   734
      s4o.print(s4o.indent_spaces + "// Steps initialization\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   735
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   736
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   737
      s4o.print("__nb_steps; i++) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   738
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   739
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   740
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   741
      s4o.print("__step_list[i].prev_state = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   742
      s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   743
      s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   744
      print_variable_prefix();
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   745
      s4o.print("__step_list[i].X);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   746
      s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   747
      s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   748
      s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   749
      print_variable_prefix();
897
8c3e91c385f5 Add support for Stepname.X syntax.
mjsousa
parents: 885
diff changeset
   750
      s4o.print("__step_list[i].X)) {\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   751
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   752
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   753
      print_variable_prefix();
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   754
//      s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   755
//      s4o.print("__step_list[i].elapsed_time = ADD_TIME(__BOOL_LITERAL(TRUE), NULL, ");
899
a3f734a23566 Add support for the stepname.T syntax.
mjsousa
parents: 897
diff changeset
   756
      s4o.print("__step_list[i].T.value = __time_add(");
a3f734a23566 Add support for the stepname.T syntax.
mjsousa
parents: 897
diff changeset
   757
      print_variable_prefix();
a3f734a23566 Add support for the stepname.T syntax.
mjsousa
parents: 897
diff changeset
   758
      s4o.print("__step_list[i].T.value, elapsed_time);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   759
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   760
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   761
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   762
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   763
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   764
      /* generate action initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   765
      s4o.print(s4o.indent_spaces + "// Actions initialization\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   766
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   767
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   768
      s4o.print("__nb_actions; i++) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   769
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   770
      s4o.print(s4o.indent_spaces);
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   771
      s4o.print(SET_VAR);
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   772
      s4o.print("(");
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   773
      print_variable_prefix();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   774
      s4o.print(",__action_list[i].state,,0);\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   775
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   776
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   777
      s4o.print("__action_list[i].set = 0;\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   778
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   779
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   780
      s4o.print("__action_list[i].reset = 0;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   781
      s4o.print(s4o.indent_spaces + "if (");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   782
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   783
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   784
      s4o.print("__action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) > 0) {\n");
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   785
      s4o.indent_right();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   786
      s4o.print(s4o.indent_spaces);
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   787
      print_variable_prefix();
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   788
//       s4o.print("__action_list[i].set_remaining_time = __time_sub(__BOOL_LITERAL(TRUE), NULL, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   789
//       s4o.print("__action_list[i].set_remaining_time = SUB_TIME(__BOOL_LITERAL(TRUE), NULL, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   790
      s4o.print("__action_list[i].set_remaining_time = __time_sub(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   791
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   792
      s4o.print("__action_list[i].set_remaining_time, elapsed_time);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   793
      s4o.print(s4o.indent_spaces + "if (");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   794
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   795
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   796
      s4o.print("__action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) <= 0) {\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   797
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   798
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   799
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   800
      s4o.print("__action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   801
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   802
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   803
      s4o.print("__action_list[i].set = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   804
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   805
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   806
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   807
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   808
      s4o.print(s4o.indent_spaces + "if (");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   809
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   810
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   811
      s4o.print("__action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) > 0) {\n");
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   812
      s4o.indent_right();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   813
      s4o.print(s4o.indent_spaces);
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   814
      print_variable_prefix();
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   815
//       s4o.print("__action_list[i].reset_remaining_time = __time_sub(__BOOL_LITERAL(TRUE), NULL, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   816
//       s4o.print("__action_list[i].reset_remaining_time = SUB_TIME(__BOOL_LITERAL(TRUE), NULL, ");
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   817
      s4o.print("__action_list[i].reset_remaining_time = __time_sub(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   818
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   819
      s4o.print("__action_list[i].reset_remaining_time, elapsed_time);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   820
      s4o.print(s4o.indent_spaces + "if (");
350
2c3c4dc34979 Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents: 279
diff changeset
   821
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   822
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   823
      s4o.print("__action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) <= 0) {\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   824
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   825
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   826
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   827
      s4o.print("__action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   828
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   829
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   830
      s4o.print("__action_list[i].reset = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   831
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   832
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   833
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   834
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   835
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   836
      s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   837
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   838
      /* generate transition tests */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   839
      s4o.print(s4o.indent_spaces + "// Transitions fire test\n");
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   840
      generate_c_sfc_elements->generate((symbol_c *)symbol, generate_c_sfc_elements_c::transitiontest_sg);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   841
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   842
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   843
      /* generate transition reset steps */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   844
      s4o.print(s4o.indent_spaces + "// Transitions reset steps\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   845
      generate_c_sfc_elements->reset_transition_number();
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   846
      for(i = 0; i < symbol->n; i++) {
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   847
        generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::stepreset_sg);
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   848
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   849
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   850
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   851
      /* generate transition set steps */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   852
      s4o.print(s4o.indent_spaces + "// Transitions set steps\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   853
      generate_c_sfc_elements->reset_transition_number();
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   854
      for(i = 0; i < symbol->n; i++) {
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   855
        generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::stepset_sg);
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   856
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   857
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   858
      
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   859
      /* generate step association */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   860
      s4o.print(s4o.indent_spaces + "// Steps association\n");
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   861
      for(i = 0; i < symbol->n; i++) {
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   862
        generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionassociation_sg);
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   863
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   864
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   865
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   866
      /* generate action state evaluation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   867
      s4o.print(s4o.indent_spaces + "// Actions state evaluation\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   868
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   869
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   870
      s4o.print("__nb_actions; i++) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   871
      s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   872
      s4o.print(s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   873
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   874
      s4o.print("__action_list[i].set) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   875
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   876
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   877
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   878
      s4o.print("__action_list[i].stored = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   879
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   880
      s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   881
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   882
      s4o.print("__action_list[i].reset) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   883
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   884
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   885
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   886
      s4o.print("__action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   887
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   888
      s4o.print("__action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   889
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   890
      s4o.print("__action_list[i].stored = 0;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   891
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   892
      s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces);
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   893
      s4o.print(SET_VAR);
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   894
      s4o.print("(");
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   895
      print_variable_prefix();
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   896
      s4o.print(",__action_list[i].state,,");
628
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   897
      s4o.print(GET_VAR);
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   898
      s4o.print("(");
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   899
      print_variable_prefix();
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   900
      s4o.print("__action_list[i].state) | ");
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   901
      print_variable_prefix();
fe0d516fe291 Fix bug in SFC generated code. Action state was declared in the list of variables to debug, but wasn't stored using structure with flags. This error had side effects that makes Beremiz debug crash.
Laurent Bessard
parents: 627
diff changeset
   902
      s4o.print("__action_list[i].stored);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   903
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   904
      s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   905
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   906
      /* generate action execution */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   907
      s4o.print(s4o.indent_spaces + "// Actions execution\n");
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   908
      {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   909
        std::list<VARIABLE>::iterator pt;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   910
        for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   911
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   912
          if (is_variable(pt->symbol)) {
417
d48f53715f77 Re-write of stage3 code (done by Manuele and I), re-write of search_varfb_instance_type_c (done by myself), and several other bug fixes.
Mario de Sousa <msousa@fe.up.pt>
parents: 392
diff changeset
   913
            unsigned int vartype = search_var_instance_decl->get_vartype(pt->symbol);
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   914
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   915
            s4o.print(s4o.indent_spaces + "if (");
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   916
            print_variable_prefix();
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   917
            s4o.print("__action_list[");
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   918
            s4o.print(SFC_STEP_ACTION_PREFIX);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   919
            pt->symbol->accept(*this);
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   920
            s4o.print("].reset) {\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   921
            s4o.indent_right();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   922
            s4o.print(s4o.indent_spaces);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   923
            if (vartype == search_var_instance_decl_c::external_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   924
              s4o.print(SET_EXTERNAL);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   925
            else if (vartype == search_var_instance_decl_c::located_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   926
              s4o.print(SET_LOCATED);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   927
            else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   928
              s4o.print(SET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   929
            s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   930
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   931
            s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   932
            pt->symbol->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   933
            s4o.print(",,0);\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   934
            s4o.indent_left();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   935
            s4o.print(s4o.indent_spaces + "}\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   936
            s4o.print(s4o.indent_spaces + "else if (");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   937
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   938
            s4o.print("__action_list[");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   939
            s4o.print(SFC_STEP_ACTION_PREFIX);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   940
            pt->symbol->accept(*this);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   941
            s4o.print("].set) {\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   942
            s4o.indent_right();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   943
            s4o.print(s4o.indent_spaces);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   944
            if (vartype == search_var_instance_decl_c::external_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   945
              s4o.print(SET_EXTERNAL);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   946
            else if (vartype == search_var_instance_decl_c::located_vt)
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   947
              s4o.print(SET_LOCATED);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   948
            else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   949
              s4o.print(SET_VAR);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   950
            s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   951
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   952
            s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   953
            pt->symbol->accept(*this);
885
b2604fc6d25c Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents: 861
diff changeset
   954
            s4o.print(",,1);\n");
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   955
            s4o.indent_left();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   956
            s4o.print(s4o.indent_spaces + "}\n");
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   957
          }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   958
        }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   959
      }
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   960
      for(i = 0; i < symbol->n; i++) {
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   961
        generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg);
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   962
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   963
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   964
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   965
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   966
    }
119
4cbf71106b66 Bug with C code generation for SFC when more than one sfc_network in one sequential_function_chart fixed
lbessard
parents: 111
diff changeset
   967
    
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   968
    void *visit(initial_step_c *symbol) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   969
      symbol->action_association_list->accept(*this);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   970
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   971
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   972
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   973
    void *visit(step_c *symbol) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   974
      symbol->action_association_list->accept(*this);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   975
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   976
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   977
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   978
    void *visit(action_association_c *symbol) {
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   979
      if (is_variable(symbol->action_name)) {
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   980
        std::list<VARIABLE>::iterator pt;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   981
        for(pt = variable_list.begin(); pt != variable_list.end(); pt++) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   982
          if (!compare_identifiers(pt->symbol, symbol->action_name))
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   983
            return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   984
        }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   985
        VARIABLE *variable;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   986
        variable = new VARIABLE;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   987
        variable->symbol = (identifier_c*)(symbol->action_name);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   988
        variable_list.push_back(*variable);
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   989
      }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   990
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   991
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   992
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   993
    void *visit(transition_c *symbol) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   994
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   995
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   996
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   997
    void *visit(action_c *symbol) {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   998
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   999
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
  1000
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1001
    void generate(sequential_function_chart_c *sfc) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1002
      sfc->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1003
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1004
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1005
}; /* generate_c_sfc_c */