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