stage4/generate_c/generate_c_sfc.cc
author Laurent Bessard
Thu, 08 Nov 2012 12:10:52 +0100
changeset 704 1adc8df05d2b
parent 703 48d106ffc2ca
child 793 268bf4ca5fa1
permissions -rwxr-xr-x
Fix definition of BCD to ANY_UINT and ANY_UINT to BCD conversion standard functions
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
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    37
class generate_c_sfc_elements_c: public generate_c_base_c {
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)
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
    66
    : generate_c_base_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(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   113
      s4o.print("__step_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   114
      s4o.print(SFC_STEP_ACTION_PREFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   115
      step_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   116
      s4o.print("].");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   117
      s4o.print(argument);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   118
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   119
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   120
    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
   121
      print_variable_prefix();
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   122
      if (setter) s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   123
      s4o.print("__action_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   124
      s4o.print(SFC_STEP_ACTION_PREFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   125
      action_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   126
      s4o.print("].");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   127
      s4o.print(argument);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   128
    }      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   129
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   130
    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
   131
      s4o.print(transition_number);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   132
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   133
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   134
    void print_reset_step(symbol_c *step_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   135
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   136
      s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   137
      s4o.print("(");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   138
      print_step_argument(step_name, "state", true);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   139
      s4o.print(",0);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   140
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   141
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   142
    void print_set_step(symbol_c *step_name) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   143
      s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   144
      s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   145
      s4o.print("(");
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   146
      print_step_argument(step_name, "state", true);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   147
      s4o.print(",1);\n" + s4o.indent_spaces);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   148
      print_step_argument(step_name, "elapsed_time");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   149
      s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   150
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   151
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   152
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   153
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   154
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   155
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   156
    void *visit(initial_step_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   157
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   158
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   159
          if (((list_c*)symbol->action_association_list)->n > 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   160
            s4o.print(s4o.indent_spaces + "// ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   161
            symbol->step_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   162
            s4o.print(" action associations\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   163
            current_step = symbol->step_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   164
            s4o.print(s4o.indent_spaces + "{\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   165
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   166
            s4o.print(s4o.indent_spaces + "char activated = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   167
            s4o.print(GET_VAR);
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, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   170
            s4o.print(") && !");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   171
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   172
            s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   173
            s4o.print(s4o.indent_spaces + "char desactivated = !");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   174
            s4o.print(GET_VAR);
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, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   177
            s4o.print(") && ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   178
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   179
            s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   180
            s4o.print(s4o.indent_spaces + "char active = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   181
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   182
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   183
            print_step_argument(current_step, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   184
            s4o.print(");\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   185
            symbol->action_association_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   186
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   187
            s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   188
          }
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   191
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   192
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   193
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   194
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   195
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   196
    void *visit(step_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   197
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   198
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   199
          if (((list_c*)symbol->action_association_list)->n > 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   200
            s4o.print(s4o.indent_spaces + "// ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   201
            symbol->step_name->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   202
            s4o.print(" action associations\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   203
            current_step = symbol->step_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   204
            s4o.print(s4o.indent_spaces + "{\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   205
            s4o.indent_right();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   206
            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
   207
            s4o.print(s4o.indent_spaces + "activated = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   208
            s4o.print(GET_VAR);
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, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   211
            s4o.print(") && !");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   212
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   213
            s4o.print(";\n");
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   214
            s4o.print(s4o.indent_spaces + "desactivated = !");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   215
            s4o.print(GET_VAR);
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, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   218
            s4o.print(") && ");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   219
            print_step_argument(current_step, "prev_state");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   220
            s4o.print(";\n");
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   221
            s4o.print(s4o.indent_spaces + "active = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   222
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   223
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   224
            print_step_argument(current_step, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   225
            s4o.print(");\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   226
            symbol->action_association_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   227
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   228
            s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   229
          }
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   232
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   233
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   234
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   235
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   236
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   237
    void *visit(transition_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   238
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   239
        case transitionlist_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   240
          {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   241
            TRANSITION *transition;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   242
            transition = new TRANSITION;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   243
            transition->symbol = symbol;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   244
            transition->index = transition_number;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   245
            if (symbol->integer != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   246
              transition->priority = atoi(((token_c *)symbol->integer)->value);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   247
              std::list<TRANSITION>::iterator pt = transition_list.begin();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   248
              while (pt != transition_list.end() && pt->priority <= transition->priority) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   249
                pt++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   250
              } 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   251
              transition_list.insert(pt, *transition);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   252
            } 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   253
            else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   254
              transition->priority = 0;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   255
              transition_list.push_back(*transition);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   256
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   257
            transition_number++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   258
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   259
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   260
        case transitiontest_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   261
          s4o.print(s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   262
          symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   263
          s4o.print(") {\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   264
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   265
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   266
          // Calculate transition value
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   267
          symbol->transition_condition->accept(*this);
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   268
          
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   269
          if (symbol->integer != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   270
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   271
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   272
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   273
            print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   274
            s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   275
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   276
            s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   277
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   278
            wanted_sfcgeneration = stepreset_sg;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   279
            symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   280
            wanted_sfcgeneration = transitiontest_sg;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   281
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   282
            s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   283
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   284
          s4o.indent_left();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   285
          s4o.print(s4o.indent_spaces + "}\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   286
          s4o.print(s4o.indent_spaces + "else {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   287
          s4o.indent_right();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   288
          // Calculate transition value for debug
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   289
          s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   290
          s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   291
          wanted_sfcgeneration = transitiontestdebug_sg;
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   292
          symbol->transition_condition->accept(*this);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   293
          wanted_sfcgeneration = transitiontest_sg;
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   294
          s4o.indent_left();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   295
          s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   296
          s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   297
          s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   298
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   299
          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
   300
          s4o.print(",__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   301
          print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   302
          s4o.print("],0);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   303
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   304
          s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   305
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   306
        case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   307
          s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   308
          s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   309
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   310
          print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   311
          s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   312
          print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   313
          s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   314
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   315
          symbol->to_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   316
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   317
          s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   318
          transition_number++;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   319
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   320
        case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   321
          if (symbol->integer == NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   322
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   323
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   324
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   325
            print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   326
            s4o.print("__transition_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   327
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   328
            s4o.print("])) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   329
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   330
            symbol->from_steps->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   331
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   332
            s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   333
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   334
          transition_number++;
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   337
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   338
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   339
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   340
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   341
    
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   342
    void *visit(transition_condition_c *symbol) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   343
      switch (wanted_sfcgeneration) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   344
        case transitiontest_sg:
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   345
        case transitiontestdebug_sg:
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   346
          // Transition condition is in IL
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   347
          if (symbol->transition_condition_il != NULL) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   348
            generate_c_il->declare_backup_variable();
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   349
            s4o.print(s4o.indent_spaces);
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   350
            symbol->transition_condition_il->accept(*generate_c_il);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   351
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   352
            s4o.print("(");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   353
            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
   354
            s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   355
            if (wanted_sfcgeneration == transitiontestdebug_sg)
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   356
              s4o.print("__debug_");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   357
            else
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   358
              s4o.print("__");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   359
            s4o.print("transition_list[");
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   360
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   361
            s4o.print("],");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   362
            generate_c_il->print_backup_variable();
392
9b88b8b6bccd Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents: 350
diff changeset
   363
            generate_c_il->reset_default_variable_name();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   364
            s4o.print(");\n");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   365
          }
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   366
          // Transition condition is in ST
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   367
          if (symbol->transition_condition_st != NULL) {
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   368
            s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   369
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   370
            s4o.print("(");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   371
            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
   372
            s4o.print(",");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   373
            if (wanted_sfcgeneration == transitiontestdebug_sg)
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   374
              s4o.print("__debug_");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   375
            else
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   376
              s4o.print("__");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   377
            s4o.print("transition_list[");
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   378
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   379
            s4o.print("],");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   380
            symbol->transition_condition_st->accept(*generate_c_st);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   381
            s4o.print(");\n");
87
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   382
          }
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   383
          if (wanted_sfcgeneration == transitiontest_sg) {
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   384
            s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   385
            s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   386
            s4o.print(s4o.indent_spaces);
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   387
            s4o.print(SET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   388
            s4o.print("(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   389
            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
   390
            s4o.print(",__debug_transition_list[");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   391
            print_transition_number();
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   392
            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
   393
            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
   394
            s4o.print("(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   395
            print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   396
            s4o.print("__transition_list[");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   397
            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
   398
            s4o.print("]));\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   399
            s4o.indent_left();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   400
            s4o.print(s4o.indent_spaces + "}\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   401
          }
87
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
        default:
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   404
          break;
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
      return NULL;
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   407
    }
b97f9ad7b2c6 Bug on SFC transition parsing and generation fixed
lbessard
parents: 70
diff changeset
   408
    
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   409
    void *visit(action_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   410
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   411
        case actionbody_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   412
          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
   413
          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
   414
          s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   415
          print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   416
          s4o.print("__action_list[");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   417
          s4o.print(SFC_STEP_ACTION_PREFIX);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   418
          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
   419
          s4o.print("].state)) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   420
          s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   421
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   422
          // generate action code
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   423
          symbol->function_block_body->accept(*generate_c_code);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   424
          
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   425
          s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   426
          s4o.print(s4o.indent_spaces + "}\n\n");
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   429
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   430
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   431
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   432
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   433
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   434
    void *visit(steps_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   435
      if (symbol->step_name != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   436
        switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   437
          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
   438
            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
   439
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   440
            print_step_argument(symbol->step_name, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   441
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   442
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   443
          case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   444
            print_set_step(symbol->step_name);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   445
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   446
          case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   447
            print_reset_step(symbol->step_name);
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
          default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   450
            break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   451
        }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   452
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   453
      else if (symbol->step_name_list != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   454
        symbol->step_name_list->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   455
      }  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   456
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   457
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   458
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   459
    void *visit(step_name_list_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   460
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   461
        case transitiontest_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   462
          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
   463
            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
   464
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   465
            print_step_argument(symbol->elements[i], "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   466
            s4o.print(")");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   467
            if (i < symbol->n - 1) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   468
              s4o.print(" && ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   469
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   470
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   471
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   472
        case stepset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   473
          for(int i = 0; i < symbol->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   474
            print_set_step(symbol->elements[i]);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   475
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   476
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   477
        case stepreset_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   478
          for(int i = 0; i < symbol->n; i++) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   479
            print_reset_step(symbol->elements[i]);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   480
          }
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   483
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   484
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   485
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   486
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   487
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   488
    void *visit(action_association_list_c* symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   489
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   490
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   491
          print_list(symbol, "", "\n", "\n");
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   494
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   495
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   496
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   497
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   498
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   499
    void *visit(action_association_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   500
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   501
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   502
          if (symbol->action_qualifier != NULL) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   503
            current_action = symbol->action_name;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   504
            symbol->action_qualifier->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   505
          }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   506
          else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   507
            s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   508
            s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   509
            s4o.print("(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   510
            print_step_argument(current_step, "state");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   511
            s4o.print(")) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   512
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   513
            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
   514
            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
   515
            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
   516
            print_action_argument(symbol->action_name, "state", true);
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
   517
            s4o.print(",1);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   518
            s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   519
            s4o.print(s4o.indent_spaces + "}");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   520
          }
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   523
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   524
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   525
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   526
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   527
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   528
    void *visit(action_qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   529
      switch (wanted_sfcgeneration) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   530
        case actionassociation_sg:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   531
          {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   532
            char *qualifier = (char *)symbol->action_qualifier->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   533
            s4o.print(s4o.indent_spaces + "if (");
155
e094c92cf197 set and reset action fixed
greg
parents: 149
diff changeset
   534
            if (strcmp(qualifier, "N") == 0 || strcmp(qualifier, "S") == 0 ||
e094c92cf197 set and reset action fixed
greg
parents: 149
diff changeset
   535
                strcmp(qualifier, "R") == 0) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   536
              s4o.print("active");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   537
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   538
            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
   539
                     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
   540
                     strcmp(qualifier, "P0") == 0) {
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   541
              s4o.print("activated");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   542
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   543
            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
   544
              s4o.print("desactivated");
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   545
            }
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   546
            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
   547
              s4o.print("active && __time_cmp(");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   548
              print_step_argument(current_step, "elapsed_time");
120
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   549
              s4o.print(", ");
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   550
              symbol->action_time->accept(*this);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   551
              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
   552
                s4o.print(") >= 0");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   553
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   554
              else {
120
74640e3c7f53 Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents: 119
diff changeset
   555
                s4o.print(") < 0");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   556
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   557
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   558
            s4o.print(") {\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   559
            s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   560
            s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   561
            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
   562
                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
   563
                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
   564
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   565
              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
   566
                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
   567
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   568
                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
   569
                  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
   570
                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
   571
                  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
   572
                else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   573
                  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
   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
                print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   576
                s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   577
                current_action->accept(*this);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   578
                s4o.print(",1);\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   579
                s4o.indent_left();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   580
                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
   581
                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
   582
                s4o.indent_right();
702
56337e796ab0 Fix indentation and unused variable warning in SFC generated code
Laurent Bessard
parents: 629
diff changeset
   583
                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
   584
                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
   585
                  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
   586
                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
   587
                  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
   588
                else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   589
                  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
   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
                print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   592
                s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   593
                current_action->accept(*this);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   594
                s4o.print(",0);\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   595
              }
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   596
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   597
              else {
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   598
                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
   599
                s4o.print("(");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   600
                print_action_argument(current_action, "state", true);
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   601
                s4o.print(",1);\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   602
              }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   603
            }
627
e7caa7d32ef5 Adding support for P0 and P1 qualifiers and fixing code generated for SL qualifier
Laurent Bessard
parents: 594
diff changeset
   604
            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
   605
              print_action_argument(current_action, "set");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   606
              s4o.print(" = 1;\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   607
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   608
            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
   609
              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
   610
              s4o.print(" = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   611
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   612
            if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || 
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   613
                strcmp(qualifier, "SL") == 0) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   614
              if (strcmp(qualifier, "SL") == 0) {
703
48d106ffc2ca Fix indentation in SFC SL qualifier code generated
Laurent Bessard
parents: 702
diff changeset
   615
            	s4o.print(s4o.indent_spaces);
48d106ffc2ca Fix indentation in SFC SL qualifier code generated
Laurent Bessard
parents: 702
diff changeset
   616
            	print_action_argument(current_action, "reset_remaining_time");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   617
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   618
              else {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   619
                print_action_argument(current_action, "set_remaining_time");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   620
              }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   621
              s4o.print(" = ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   622
              symbol->action_time->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   623
              s4o.print(";\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   624
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   625
            s4o.indent_left();
561
30a327be60d4 Fix SFC stage4 error.
Manuele Conti <conti.ma@alice.it>
parents: 417
diff changeset
   626
            s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   627
            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
   628
              s4o.print(s4o.indent_spaces + "if (desactivated) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   629
              s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   630
              s4o.print(s4o.indent_spaces);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   631
              print_action_argument(current_action, "set_remaining_time");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   632
              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
   633
              s4o.indent_left();
30a327be60d4 Fix SFC stage4 error.
Manuele Conti <conti.ma@alice.it>
parents: 417
diff changeset
   634
              s4o.print(s4o.indent_spaces + "}\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   635
            }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   636
          }
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
        default:
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   639
          break;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   640
      }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   641
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   642
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   643
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   644
    void *visit(qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   645
      return (void *)symbol->value;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   646
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   647
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   648
    void *visit(timed_qualifier_c *symbol) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   649
      return (void *)symbol->value;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   650
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   651
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   652
}; /* generate_c_sfc_actiondecl_c */
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
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   658
/***********************************************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   659
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   660
class generate_c_sfc_c: public generate_c_typedecl_c {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   661
  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   662
  private:
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   663
    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
   664
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   665
    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
   666
    search_var_instance_decl_c *search_var_instance_decl;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   667
    
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   668
  public:
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   669
    generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL)
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   670
    : generate_c_typedecl_c(s4o_ptr) {
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   671
      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
   672
      search_var_instance_decl = new search_var_instance_decl_c(scope);
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   673
      this->set_variable_prefix(variable_prefix);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   674
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   675
  
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   676
    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
   677
      variable_list.clear();
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   678
      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
   679
      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
   680
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   681
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   682
    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
   683
      /* 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
   684
      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
   685
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   686
      return var_decl != NULL;
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   687
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   688
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   689
/*********************************************/
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   690
/* B.1.6  Sequential function chart elements */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   691
/*********************************************/
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
   692
    
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
    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
   694
      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
   695
      
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
   696
      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
   697
      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
   698
        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
   699
        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
   700
      }
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
   701
      
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
   702
      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
   703
      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
   704
      
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   705
      /* 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
   706
      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
   707
      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
   708
//       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
   709
//       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
   710
      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
   711
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   712
      s4o.print("__lasttick_time);\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   713
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   714
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   715
      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
   716
      
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   717
      /* generate transition initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   718
      s4o.print(s4o.indent_spaces + "// Transitions initialization\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   719
      s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   720
      s4o.indent_right();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   721
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   722
      print_variable_prefix();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   723
      s4o.print("__nb_transitions; i++) {\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   724
      s4o.indent_right();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   725
      s4o.print(s4o.indent_spaces);
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("__transition_list[i] = ");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   728
      print_variable_prefix();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   729
      s4o.print("__debug_transition_list[i];\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
      s4o.indent_left();
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   733
      s4o.print(s4o.indent_spaces + "}\n");
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   734
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   735
      /* generate step initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   736
      s4o.print(s4o.indent_spaces + "// Steps initialization\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   737
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   738
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   739
      s4o.print("__nb_steps; i++) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   740
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   741
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   742
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   743
      s4o.print("__step_list[i].prev_state = ");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   744
      s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   745
      s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   746
      print_variable_prefix();
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   747
      s4o.print("__step_list[i].state);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   748
      s4o.print(s4o.indent_spaces + "if (");
217
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   749
      s4o.print(GET_VAR);
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   750
      s4o.print("(");
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   751
      print_variable_prefix();
f5dfadf5de54 Adding support for declare, init, get and set macros
laurent
parents: 155
diff changeset
   752
      s4o.print("__step_list[i].state)) {\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   753
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   754
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   755
      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
   756
//      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
   757
//      s4o.print("__step_list[i].elapsed_time = ADD_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
   758
      s4o.print("__step_list[i].elapsed_time = __time_add(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   759
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   760
      s4o.print("__step_list[i].elapsed_time, elapsed_time);\n");
70
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
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   764
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   765
229
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   766
      /* generate action initializations */
ca7bc1324540 Bug on SFC debugging fixed
laurent
parents: 221
diff changeset
   767
      s4o.print(s4o.indent_spaces + "// Actions initialization\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   768
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   769
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   770
      s4o.print("__nb_actions; i++) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   771
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   772
      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
   773
      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
   774
      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
   775
      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
   776
      s4o.print(",__action_list[i].state,0);\n");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   777
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   778
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   779
      s4o.print("__action_list[i].set = 0;\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   780
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   781
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   782
      s4o.print("__action_list[i].reset = 0;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   783
      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
   784
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   785
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   786
      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
   787
      s4o.indent_right();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   788
      s4o.print(s4o.indent_spaces);
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   789
      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
   790
//       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
   791
//       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
   792
      s4o.print("__action_list[i].set_remaining_time = __time_sub(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   793
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   794
      s4o.print("__action_list[i].set_remaining_time, elapsed_time);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   795
      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
   796
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   797
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   798
      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
   799
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   800
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   801
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   802
      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
   803
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   804
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   805
      s4o.print("__action_list[i].set = 1;\n");
70
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.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   809
      s4o.print(s4o.indent_spaces + "}\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   810
      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
   811
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   812
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   813
      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
   814
      s4o.indent_right();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   815
      s4o.print(s4o.indent_spaces);
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   816
      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
   817
//       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
   818
//       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
   819
      s4o.print("__action_list[i].reset_remaining_time = __time_sub(");
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   820
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   821
      s4o.print("__action_list[i].reset_remaining_time, elapsed_time);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   822
      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
   823
      s4o.print("__time_cmp(");
149
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   824
      print_variable_prefix();
05ca171a3d57 Adding support for EN/ENO in standard functions
lbessard
parents: 141
diff changeset
   825
      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
   826
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   827
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   828
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   829
      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
   830
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   831
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   832
      s4o.print("__action_list[i].reset = 1;\n");
70
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");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   837
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   838
      s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   839
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   840
      /* generate transition tests */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   841
      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
   842
      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
   843
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   844
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   845
      /* generate transition reset steps */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   846
      s4o.print(s4o.indent_spaces + "// Transitions reset steps\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   847
      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
   848
      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
   849
        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
   850
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   851
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   852
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   853
      /* generate transition set steps */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   854
      s4o.print(s4o.indent_spaces + "// Transitions set steps\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   855
      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
   856
      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
   857
        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
   858
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   859
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   860
      
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
      /* generate step association */
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   862
      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
   863
      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
   864
        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
   865
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   866
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   867
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   868
      /* generate action state evaluation */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   869
      s4o.print(s4o.indent_spaces + "// Actions state evaluation\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   870
      s4o.print(s4o.indent_spaces + "for (i = 0; i < ");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   871
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   872
      s4o.print("__nb_actions; i++) {\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   873
      s4o.indent_right();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   874
      s4o.print(s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   875
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   876
      s4o.print("__action_list[i].set) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   877
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   878
      s4o.print(s4o.indent_spaces);
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   879
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   880
      s4o.print("__action_list[i].stored = 1;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   881
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   882
      s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces + "if (");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   883
      print_variable_prefix();
141
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   884
      s4o.print("__action_list[i].reset) {\n");
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   885
      s4o.indent_right();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   886
      s4o.print(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].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
   889
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   890
      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
   891
      print_variable_prefix();
d2dc99c319b6 Adding support for transition debugging
lbessard
parents: 125
diff changeset
   892
      s4o.print("__action_list[i].stored = 0;\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   893
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   894
      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
   895
      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
   896
      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
   897
      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
   898
      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
   899
      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
   900
      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
   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].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
   903
      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
   904
      s4o.print("__action_list[i].stored);\n");
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   905
      s4o.indent_left();
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   906
      s4o.print(s4o.indent_spaces + "}\n\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   907
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   908
      /* generate action execution */
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   909
      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
   910
      {
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   911
        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
   912
        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
   913
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   914
          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
   915
            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
   916
629
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   917
            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
   918
            print_variable_prefix();
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   919
            s4o.print("__action_list[");
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   920
            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
   921
            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
   922
            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
   923
            s4o.indent_right();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   924
            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
   925
            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
   926
              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
   927
            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
   928
              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
   929
            else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   930
              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
   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
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   933
            s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   934
            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
   935
            s4o.print(",0);\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   936
            s4o.indent_left();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   937
            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
   938
            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
   939
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   940
            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
   941
            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
   942
            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
   943
            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
   944
            s4o.indent_right();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   945
            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
   946
            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
   947
              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
   948
            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
   949
              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
   950
            else
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   951
              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
   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
            print_variable_prefix();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   954
            s4o.print(",");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   955
            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
   956
            s4o.print(",1);\n");
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   957
            s4o.indent_left();
06abc9867095 Fix generated code when using boolean variable as action name in step action association
Laurent Bessard
parents: 628
diff changeset
   958
            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
   959
          }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   960
        }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   961
      }
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
   962
      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
   963
        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
   964
      }
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   965
      s4o.print("\n");
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   966
      
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   967
      return NULL;
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
   968
    }
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
   969
    
244
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   970
    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
   971
      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
   972
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   973
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   974
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   975
    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
   976
      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
   977
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   978
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   979
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   980
    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
   981
      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
   982
        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
   983
        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
   984
          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
   985
            return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   986
        }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   987
        VARIABLE *variable;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   988
        variable = new VARIABLE;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   989
        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
   990
        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
   991
      }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   992
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   993
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   994
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   995
    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
   996
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   997
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   998
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
   999
    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
  1000
      return NULL;
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
  1001
    }
3a478229db8b Adding support for generating code for variable in step action association instead of action
laurent
parents: 229
diff changeset
  1002
70
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1003
    void generate(sequential_function_chart_c *sfc) {
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1004
      sfc->accept(*this);
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1005
    }
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1006
e1f0ebd2d9ec Change generate_cc to generate_c
lbessard
parents:
diff changeset
  1007
}; /* generate_c_sfc_c */