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