author | Edouard Tisserant |
Thu, 18 Jun 2020 14:32:20 +0200 | |
changeset 1091 | 6f4e7a8387ae |
parent 1089 | 25271e1a3426 |
permissions | -rw-r--r-- |
70 | 1 |
/* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2 |
* matiec - a compiler for the programming languages defined in IEC 61131-3 |
70 | 3 |
* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
4 |
* Copyright (C) 2003-2011 Mario de Sousa (msousa@fe.up.pt) |
279
c0453b7f99df
Re-generated std lib related code, with updated headers, updated all forgotten headers
Edouard Tisserant
parents:
272
diff
changeset
|
5 |
* Copyright (C) 2007-2011 Laurent Bessard and Edouard Tisserant |
70 | 6 |
* |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
7 |
* This program is free software: you can redistribute it and/or modify |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
8 |
* it under the terms of the GNU General Public License as published by |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
9 |
* the Free Software Foundation, either version 3 of the License, or |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
10 |
* (at your option) any later version. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
11 |
* |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
12 |
* This program is distributed in the hope that it will be useful, |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
13 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
14 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
15 |
* GNU General Public License for more details. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
16 |
* |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
18 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
19 |
* |
70 | 20 |
* |
21 |
* This code is made available on the understanding that it will not be |
|
22 |
* used in safety-critical situations without a full and competent review. |
|
23 |
*/ |
|
24 |
||
25 |
#include <string> |
|
26 |
#include <iostream> |
|
27 |
#include <sstream> |
|
28 |
#include <typeinfo> |
|
111 | 29 |
#include <list> |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
30 |
#include <map> |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
31 |
#include <sstream> |
139
668a54686827
added missing includes on some platform (gentoo/gcc-4.3.1)
etisserant
parents:
138
diff
changeset
|
32 |
#include <strings.h> |
70 | 33 |
|
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
34 |
|
70 | 35 |
#include "../../util/symtable.hh" |
36 |
#include "../../util/dsymtable.hh" |
|
37 |
#include "../../absyntax/visitor.hh" |
|
181
38d6eb056260
Moving absyntax utility files out from stage4/generate_c
mario
parents:
178
diff
changeset
|
38 |
#include "../../absyntax_utils/absyntax_utils.hh" |
596
4efb11e44065
Add ERROR_MSG macro && move extract_XXX() functions to constant_folding.cc
Mario de Sousa <msousa@fe.up.pt>
parents:
594
diff
changeset
|
39 |
#include "../../main.hh" // required for ERROR() and ERROR_MSG() macros. |
70 | 40 |
|
41 |
#include "../stage4.hh" |
|
42 |
||
43 |
//#define DEBUG |
|
44 |
#ifdef DEBUG |
|
45 |
#define TRACE(classname) printf("\n____%s____\n",classname); |
|
46 |
#else |
|
47 |
#define TRACE(classname) |
|
48 |
#endif |
|
49 |
||
50 |
||
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
51 |
|
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
52 |
#define STAGE4_ERROR(symbol1, symbol2, ...) {stage4err("while generating C code", symbol1, symbol2, __VA_ARGS__); exit(EXIT_FAILURE);} |
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
53 |
|
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
54 |
|
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
55 |
/* Macros to access the constant value of each expression (if it exists) from the annotation introduced to the symbol_c object by constant_folding_c in stage3! */ |
965
c9eeb67ba939
Small code re-organization of how const values are stored in symbol_c (can now be accessed through member functions, instead of macros)
mjsousa
parents:
958
diff
changeset
|
56 |
#define VALID_CVALUE(dtype, symbol) ((symbol)->const_value._##dtype.is_valid()) |
c9eeb67ba939
Small code re-organization of how const values are stored in symbol_c (can now be accessed through member functions, instead of macros)
mjsousa
parents:
958
diff
changeset
|
57 |
#define GET_CVALUE(dtype, symbol) ((symbol)->const_value._##dtype.get()) |
592
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
58 |
|
99a284cec1f2
Add 'dimension' parameter to subrange_c, fill it correctly, and use it.
Mario de Sousa <msousa@fe.up.pt>
parents:
587
diff
changeset
|
59 |
|
522
f9cff11ae622
Start having nicer stage 4 error messages.
Mario de Sousa <msousa@fe.up.pt>
parents:
506
diff
changeset
|
60 |
|
70 | 61 |
/***********************************************************************/ |
62 |
||
63 |
/* Unlike Programs and Configurations which get mapped onto C++ classes, |
|
64 |
* Function Blocks are mapped onto a C structure containing the variables, and |
|
65 |
* a C function containing the code in the FB's body. This is to allow direct allocation |
|
66 |
* of a FB variable (which is really an instance of the C data structure) to |
|
67 |
* a member of a union variable (note that classes with constructors cannot |
|
68 |
* be mebers of a union), which is done in IL when loading a FB onto IL's |
|
69 |
* default variable. |
|
70 |
* |
|
71 |
* So as not to clash the names of the C data structure and the C function, |
|
72 |
* the C structure is given a name identical to that of the FB name, whereas |
|
73 |
* the name of the function is the FB name with a constant string appended. |
|
74 |
* The value of that constant string which is appended is defined in the following |
|
75 |
* constant. |
|
76 |
* In order not to clash with any variable in the IL and ST source codem the |
|
77 |
* following constant should contain a double underscore, which is not allowed |
|
78 |
* in IL and ST. |
|
79 |
* |
|
80 |
* e.g.: FUNTION_BLOCK TEST |
|
81 |
* is mapped onto a TEST data structure, and a TEST_body__ function. |
|
82 |
*/ |
|
83 |
||
84 |
#define FB_FUNCTION_SUFFIX "_body__" |
|
85 |
||
86 |
/* Idem as body, but for initializer FB function */ |
|
87 |
#define FB_INIT_SUFFIX "_init__" |
|
88 |
||
89 |
/* Idem as body, but for run CONFIG and RESOURCE function */ |
|
90 |
#define FB_RUN_SUFFIX "_run__" |
|
91 |
||
92 |
/* The FB body function is passed as the only parameter a pointer to the FB data |
|
93 |
* structure instance. The name of this parameter is given by the following constant. |
|
94 |
* In order not to clash with any variable in the IL and ST source codem the |
|
95 |
* following constant should contain a double underscore, which is not allowed |
|
96 |
* in IL and ST. |
|
97 |
* |
|
98 |
* e.g.: the body of FUNTION_BLOCK TEST |
|
99 |
* is mapped onto the C function |
|
100 |
* TEST_body__(TEST *data__) |
|
101 |
*/ |
|
102 |
||
103 |
#define FB_FUNCTION_PARAM "data__" |
|
104 |
||
105 |
||
106 |
#define SFC_STEP_ACTION_PREFIX "__SFC_" |
|
107 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
108 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
109 |
/* Variable declaration symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
110 |
#define DECLARE_VAR "__DECLARE_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
111 |
#define DECLARE_GLOBAL "__DECLARE_GLOBAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
112 |
#define DECLARE_GLOBAL_FB "__DECLARE_GLOBAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
113 |
#define DECLARE_GLOBAL_LOCATION "__DECLARE_GLOBAL_LOCATION" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
114 |
#define DECLARE_GLOBAL_LOCATED "__DECLARE_GLOBAL_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
115 |
#define DECLARE_EXTERNAL "__DECLARE_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
116 |
#define DECLARE_EXTERNAL_FB "__DECLARE_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
117 |
#define DECLARE_LOCATED "__DECLARE_LOCATED" |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
118 |
#define DECLARE_GLOBAL_PROTOTYPE "__DECLARE_GLOBAL_PROTOTYPE" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
119 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
120 |
/* Variable declaration symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
121 |
#define INIT_VAR "__INIT_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
122 |
#define INIT_GLOBAL "__INIT_GLOBAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
123 |
#define INIT_GLOBAL_FB "__INIT_GLOBAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
124 |
#define INIT_GLOBAL_LOCATED "__INIT_GLOBAL_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
125 |
#define INIT_EXTERNAL "__INIT_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
126 |
#define INIT_EXTERNAL_FB "__INIT_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
127 |
#define INIT_LOCATED "__INIT_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
128 |
#define INIT_LOCATED_VALUE "__INIT_LOCATED_VALUE" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
129 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
130 |
/* Variable getter symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
131 |
#define GET_VAR "__GET_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
132 |
#define GET_EXTERNAL "__GET_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
133 |
#define GET_EXTERNAL_FB "__GET_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
134 |
#define GET_LOCATED "__GET_LOCATED" |
873
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
135 |
|
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
136 |
#define GET_VAR_REF "__GET_VAR_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
137 |
#define GET_EXTERNAL_REF "__GET_EXTERNAL_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
138 |
#define GET_EXTERNAL_FB_REF "__GET_EXTERNAL_FB_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
139 |
#define GET_LOCATED_REF "__GET_LOCATED_REF" |
dea39ef02847
Add limited support for the REF() operator (defined in v3 of IEC 61131-3)
mjsousa
parents:
872
diff
changeset
|
140 |
|
933
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
930
diff
changeset
|
141 |
#define GET_VAR_DREF "__GET_VAR_DREF" |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
930
diff
changeset
|
142 |
#define GET_EXTERNAL_DREF "__GET_EXTERNAL_DREF" |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
930
diff
changeset
|
143 |
#define GET_EXTERNAL_FB_DREF "__GET_EXTERNAL_FB_DREF" |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
930
diff
changeset
|
144 |
#define GET_LOCATED_DREF "__GET_LOCATED_DREF" |
76324f461aed
Add support for de-referencing of REF_TO datatypes (Note: dereferencing of arrays and structs not yet supported!)
mjsousa
parents:
930
diff
changeset
|
145 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
146 |
#define GET_VAR_BY_REF "__GET_VAR_BY_REF" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
147 |
#define GET_EXTERNAL_BY_REF "__GET_EXTERNAL_BY_REF" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
148 |
#define GET_EXTERNAL_FB_BY_REF "__GET_EXTERNAL_FB_BY_REF" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
149 |
#define GET_LOCATED_BY_REF "__GET_LOCATED_BY_REF" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
150 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
151 |
/* Variable setter symbol for accessor macros */ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
152 |
#define SET_VAR "__SET_VAR" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
153 |
#define SET_EXTERNAL "__SET_EXTERNAL" |
706
31553c22f318
Adding support for declaring function block instances as global and external variables
Laurent Bessard
parents:
636
diff
changeset
|
154 |
#define SET_EXTERNAL_FB "__SET_EXTERNAL_FB" |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
155 |
#define SET_LOCATED "__SET_LOCATED" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
156 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
157 |
/* Variable initial value symbol for accessor macros */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
158 |
#define INITIAL_VALUE "__INITIAL_VALUE" |
70 | 159 |
|
160 |
/* Generate a name for a temporary variable. |
|
161 |
* Each new name generated is appended a different number, |
|
162 |
* starting off from 0. |
|
163 |
* After calling reset(), the names will start off again from 0. |
|
164 |
*/ |
|
165 |
#define VAR_LEADER "__" |
|
166 |
#define TEMP_VAR VAR_LEADER "TMP_" |
|
167 |
#define SOURCE_VAR VAR_LEADER "SRC_" |
|
168 |
||
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
169 |
/* please see the comment before the RET_operator_c visitor for details... */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
170 |
#define END_LABEL VAR_LEADER "end" |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
171 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
172 |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
173 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
174 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
175 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
176 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
177 |
|
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
178 |
|
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
179 |
static int generate_line_directives__ = 0; |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
180 |
static int generate_pou_filepairs__ = 0; |
1060
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
181 |
static int generate_plc_state_backup_fuctions__ = 0; |
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
182 |
|
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
183 |
#ifdef __unix__ |
878 | 184 |
/* Parse command line options passed from main.c !! */ |
1060
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
185 |
#include <stdlib.h> // for getsubopt() |
878 | 186 |
int stage4_parse_options(char *options) { |
1060
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
187 |
enum {LINE_OPT = 0, |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
188 |
SEPTFILE_OPT, |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
189 |
BACKUP_OPT /* option to generate function to backup and restore internal PLC state */ |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
190 |
/*, SOME_OTHER_OPT, YET_ANOTHER_OPT */}; |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
191 |
char *const token[] = { |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
192 |
/* LINE_OPT*/(char *)"l", |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
193 |
/* SEPTFILE_OPT*/(char *)"p", |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
194 |
/* BACKUP_OPT*/(char *)"b", |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
195 |
/* SOME_OTHER_OPT, ... */ |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
196 |
NULL }; |
878 | 197 |
/* unfortunately, the above commented out syntax for array initialization is valid in C, but not in C++ */ |
198 |
||
199 |
char *subopts = options; |
|
200 |
char *value; |
|
201 |
int opt; |
|
202 |
||
203 |
while (*subopts != '\0') { |
|
204 |
switch (getsubopt(&subopts, token, &value)) { |
|
1060
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
205 |
case LINE_OPT: generate_line_directives__ = 1; break; |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
206 |
case SEPTFILE_OPT: generate_pou_filepairs__ = 1; break; |
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
207 |
case BACKUP_OPT: generate_plc_state_backup_fuctions__ = 1; break; |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
208 |
default : fprintf(stderr, "Unrecognized option: -O %s\n", value); return -1; break; |
878 | 209 |
} |
210 |
} |
|
211 |
return 0; |
|
212 |
} |
|
213 |
||
214 |
||
215 |
void stage4_print_options(void) { |
|
216 |
printf(" (options must be separated by commas. Example: 'l,w,x')\n"); |
|
217 |
printf(" l : insert '#line' directives in generated C code.\n"); |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
218 |
printf(" p : place each POU in a separate pair of files (<pou_name>.c, <pou_name>.h).\n"); |
1060
01c48180af05
make generating backup/restore functions a command line option (off by default).
Mario de Sousa <msousa@fe.up.pt>
parents:
1059
diff
changeset
|
219 |
printf(" b : generate functions to backup and restore internal PLC state.\n"); |
878 | 220 |
} |
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
221 |
#else /* not __unix__ */ |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
222 |
/* getsubopt isn't supported with mingw, |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
223 |
* then stage4 options aren't available on windows*/ |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
224 |
void stage4_print_options(void) {} |
1061
f762b43c8fad
fix initialization of variable (was not following ISO C++ rules)
Mario de Sousa <msousa@fe.up.pt>
parents:
1060
diff
changeset
|
225 |
int stage4_parse_options(char *options) {return 0;} |
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
226 |
#endif |
878 | 227 |
|
228 |
/***********************************************************************/ |
|
229 |
/***********************************************************************/ |
|
230 |
/***********************************************************************/ |
|
231 |
/***********************************************************************/ |
|
232 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
233 |
#include "generate_c_base.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
234 |
#include "generate_c_typedecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
235 |
#include "generate_c_sfcdecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
236 |
#include "generate_c_vardecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
237 |
#include "generate_c_configbody.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
238 |
#include "generate_location_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
239 |
#include "generate_var_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
240 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
241 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
242 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
243 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
244 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
245 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
246 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
247 |
#include "generate_c.hh" |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
248 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
249 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
250 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
251 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
252 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
253 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
254 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
255 |
/* A helper class that prints out the identifiers for function calls to overloaded functions */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
256 |
/* Given a function declaration of the function being called, it |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
257 |
* will simply print out the returned data type, |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
258 |
* followed by the data types of all input, output, and in_out parameters. |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
259 |
* for e.g.; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
260 |
* SIN( REAL) : REAL -> prints out -> REAL__REAL |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
261 |
* LEN( STRING) : INT -> prints out -> INT__STRING |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
262 |
* MUL(TIME, INT) : TIME -> prints out -> TIME__TIME__INT |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
263 |
*/ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
264 |
class print_function_parameter_data_types_c: public generate_c_base_and_typeid_c { |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
265 |
private: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
266 |
symbol_c *current_type; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
267 |
bool_type_name_c tmp_bool; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
268 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
269 |
void print_list(symbol_c *var_list, symbol_c *data_type) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
270 |
if (data_type != NULL) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
271 |
/* print out the data type once for every variable! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
272 |
list_c *list = dynamic_cast<list_c *>(var_list); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
273 |
if (list == NULL) ERROR; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
274 |
for (int i=0; i < list->n; i++) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
275 |
s4o.print("__"); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
276 |
data_type->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
277 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
278 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
279 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
280 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
281 |
public: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
282 |
print_function_parameter_data_types_c(stage4out_c *s4o_ptr): |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
283 |
generate_c_base_and_typeid_c(s4o_ptr) |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
284 |
{current_type = NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
285 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
286 |
/**************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
287 |
/* B.1.5 - Program organization units */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
288 |
/**************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
289 |
/***********************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
290 |
/* B 1.5.1 - Functions */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
291 |
/***********************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
292 |
/* FUNCTION derived_function_name ':' elementary_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
293 |
/* | FUNCTION derived_function_name ':' derived_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
294 |
void *visit(function_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
295 |
symbol->type_name->accept(*this); /* return type */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
296 |
symbol->var_declarations_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
297 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
298 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
299 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
300 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
301 |
//void *visit(var_declarations_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
302 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
303 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
304 |
//void *visit(input_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
305 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
306 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
307 |
//void *visit(input_declaration_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
308 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
309 |
void *visit(edge_declaration_c *symbol) { |
1064
1ac77681946f
Abort compilation when finding R_EDGE or F_EDGE
Mario de Sousa <msousa@fe.up.pt>
parents:
1062
diff
changeset
|
310 |
{STAGE4_ERROR(symbol, symbol, "R_EDGE and F_EDGE declarations are not currently supported"); ERROR;} |
1ac77681946f
Abort compilation when finding R_EDGE or F_EDGE
Mario de Sousa <msousa@fe.up.pt>
parents:
1062
diff
changeset
|
311 |
/* |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
312 |
current_type = &tmp_bool; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
313 |
symbol->var1_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
314 |
current_type = NULL; |
1064
1ac77681946f
Abort compilation when finding R_EDGE or F_EDGE
Mario de Sousa <msousa@fe.up.pt>
parents:
1062
diff
changeset
|
315 |
*/ |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
316 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
317 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
318 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
319 |
/* We do NOT print out EN and ENO parameters! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
320 |
void *visit(en_param_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
321 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
322 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
323 |
//void *visit(output_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
324 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
325 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
326 |
//void *visit(var_init_decl_list_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
327 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
328 |
void *visit(simple_spec_init_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
329 |
/* return the data type */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
330 |
return symbol->simple_specification; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
331 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
332 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
333 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
334 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
335 |
/* NOTE: although this class may also sometimes point to a previously_declared_subrange_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
336 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
337 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
338 |
void *visit(subrange_spec_init_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
339 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
340 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
341 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
342 |
/* NOTE: although this class may also sometimes point to a previously_declared_enumerated_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
343 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
344 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
345 |
void *visit(enumerated_spec_init_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
346 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
347 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
348 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
349 |
/* NOTE: although this class may also sometimes point to a previously_declared_array_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
350 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
351 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
352 |
void *visit(array_var_init_decl_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
353 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
354 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
355 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
356 |
/* NOTE: although this class may also sometimes point to a previously_declared_structured_type_name |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
357 |
* we don't need this for now, so it is easier to just skip it allocation |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
358 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
359 |
void *visit(structured_var_init_decl_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
360 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
361 |
/* We do NOT print out EN and ENO parameters! */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
362 |
void *visit(eno_param_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
363 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
364 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
365 |
//void *visit(input_output_declarations_c *symbol) {// iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
366 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
367 |
/* already handled by iterator base class (note that generate_c_base_c inherits from iterator_c) */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
368 |
//void *visit(var_declaration_list_c *symbol) {iterate through list} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
369 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
370 |
void *visit(fb_name_decl_c *symbol) { |
810
d9c48ad646f1
Add a new node to the abstract symtax tree, which will let us do datatype checking of FB variable declarations using the standard algorithm, and no special cases.
Mario de Sousa <msousa@fe.up.pt>
parents:
793
diff
changeset
|
371 |
print_list(symbol->fb_name_list, spec_init_sperator_c::get_spec(symbol->fb_spec_init)); |
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
372 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
373 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
374 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
375 |
void *visit(var1_init_decl_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
376 |
print_list(symbol->var1_list, (symbol_c *)symbol->spec_init->accept(*this)); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
377 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
378 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
379 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
380 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
381 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
382 |
void *visit(array_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
383 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
384 |
void *visit(structured_var_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
385 |
current_type = symbol->structure_type_name; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
386 |
symbol->var1_list->accept(*this); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
387 |
current_type = NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
388 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
389 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
390 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
391 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
392 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
393 |
/* Note that this class is used for fixed length strings... |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
394 |
* STRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
395 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
396 |
void *visit(single_byte_string_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
397 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
398 |
/* currently we do not support data types defined in the declaration itself */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
399 |
/* For now, sugest the user define a TYPE .. END_TYPE */ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
400 |
/* Note that this class is used for fixed length strings... |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
401 |
* WSTRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
402 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
403 |
void *visit(double_byte_string_var_declaration_c *symbol) {return NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
404 |
}; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
405 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
406 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
407 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
408 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
409 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
410 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
411 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
412 |
/* A helper class that analyses if the datatype of a variable is 'complex'. */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
413 |
/* 'complex' means that it is either a strcuture or an array! */ |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
414 |
class analyse_variable_c: public search_visitor_c { |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
415 |
private: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
416 |
static analyse_variable_c *singleton_; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
417 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
418 |
public: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
419 |
analyse_variable_c(void) {}; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
420 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
421 |
static bool is_complex_type(symbol_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
422 |
if (NULL == symbol) ERROR; |
872
3d682f87c870
Remove assertion being failed by IL labels (IL labels do not yet have specific datatypes).
mjsousa
parents:
864
diff
changeset
|
423 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) return false; |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
424 |
return ( get_datatype_info_c::is_structure(symbol->datatype) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
425 |
|| get_datatype_info_c::is_array (symbol->datatype) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
426 |
); |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
427 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
428 |
|
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
429 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
430 |
private: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
431 |
symbol_c *last_fb, *first_non_fb_identifier; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
432 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
433 |
public: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
434 |
/* returns the first element (from left to right) in a structured variable that is not a FB, i.e. is either a structure or an array! */ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
435 |
/* eg: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
436 |
* fb1.fb2.fb3.real returns ?????? |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
437 |
* fb1.fb2.struct1.real returns struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
438 |
* struct1.real returns struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
439 |
*/ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
440 |
static symbol_c *find_first_nonfb(symbol_c *symbol) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
441 |
if (NULL == singleton_) singleton_ = new analyse_variable_c(); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
442 |
if (NULL == singleton_) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
443 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
444 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
445 |
singleton_->last_fb = NULL; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
446 |
singleton_->first_non_fb_identifier = NULL; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
447 |
return (symbol_c *)symbol->accept(*singleton_); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
448 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
449 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
450 |
/* returns true if a strcutured variable (e.g. fb1.fb2.strcut1.real) contains a structure or array */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
451 |
/* eg: |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
452 |
* fb1.fb2.fb3.real returns FALSE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
453 |
* fb1.fb2.struct1.real returns TRUE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
454 |
* struct1.real returns TRUE |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
455 |
*/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
456 |
static bool contains_complex_type(symbol_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
457 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
458 |
if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
459 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
460 |
symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
461 |
return is_complex_type(first_non_fb->datatype); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
462 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
463 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
464 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
465 |
/* returns the datatype of the variable returned by find_first_nonfb() */ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
466 |
/* eg: |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
467 |
* fb1.fb2.fb3.real returns ?????? |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
468 |
* fb1.fb2.struct1.real returns datatype of struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
469 |
* struct1.real returns datatype of struct1 |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
470 |
*/ |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
471 |
static search_var_instance_decl_c::vt_t first_nonfb_vardecltype(symbol_c *symbol, symbol_c *scope) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
472 |
if (NULL == symbol) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
473 |
if (!get_datatype_info_c::is_type_valid(symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
474 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
475 |
symbol_c *first_non_fb = (symbol_c *)find_first_nonfb(symbol); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
476 |
if (NULL != singleton_->last_fb) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
477 |
scope = singleton_->last_fb->datatype; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
478 |
symbol = singleton_->first_non_fb_identifier; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
479 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
480 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
481 |
search_var_instance_decl_c search_var_instance_decl(scope); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
482 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
483 |
return search_var_instance_decl.get_vartype(symbol); |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
484 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
485 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
486 |
|
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
487 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
488 |
/* B 1.4 - Variables */ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
489 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
490 |
void *visit(symbolic_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
491 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
492 |
if (!get_datatype_info_c::is_function_block(symbol->datatype)) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
493 |
first_non_fb_identifier = symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
494 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
495 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
496 |
last_fb = symbol; |
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
497 |
return NULL; |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
498 |
} |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
499 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
500 |
/*************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
501 |
/* B.1.4.2 Multi-element Variables */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
502 |
/*************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
503 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
504 |
// SYM_REF2(structured_variable_c, record_variable, field_selector) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
505 |
void *visit(structured_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
506 |
symbol_c *res = (symbol_c *)symbol->record_variable->accept(*this); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
507 |
if (NULL != res) return res; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
508 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
509 |
if (!get_datatype_info_c::is_type_valid (symbol->datatype)) ERROR; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
510 |
if (!get_datatype_info_c::is_function_block(symbol->datatype)) { |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
511 |
first_non_fb_identifier = symbol->field_selector; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
512 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
513 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
514 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
515 |
last_fb = symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
516 |
return NULL; |
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
517 |
} |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
518 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
519 |
/* subscripted_variable '[' subscript_list ']' */ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
520 |
//SYM_REF2(array_variable_c, subscripted_variable, subscript_list) |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
521 |
void *visit(array_variable_c *symbol) { |
863
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
522 |
void *res = symbol->subscripted_variable->accept(*this); |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
523 |
if (NULL != res) return res; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
524 |
return (void *)symbol; |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
525 |
} |
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
526 |
|
06820d03a433
Fix bug: correctly generate code when accessing external variables declared inside FBs as a structured variable (realvar := fb1.fb2.extvar1.realvar)
Mario de Sousa <msousa@fe.up.pt>
parents:
854
diff
changeset
|
527 |
|
852
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
528 |
}; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
529 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
530 |
analyse_variable_c *analyse_variable_c::singleton_ = NULL; |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
531 |
|
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
532 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
533 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
534 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
535 |
/***********************************************************************/ |
efb44e892582
Fix bug: allow use, as lvalues, structures/arrays inside FBs (e.g. fb1.struct1.r := 33.3).
Mario de Sousa <msousa@fe.up.pt>
parents:
816
diff
changeset
|
536 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
537 |
|
70 | 538 |
#include "generate_c_st.cc" |
539 |
#include "generate_c_il.cc" |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
540 |
#include "generate_c_inlinefcall.cc" |
70 | 541 |
|
542 |
/***********************************************************************/ |
|
543 |
/***********************************************************************/ |
|
544 |
/***********************************************************************/ |
|
545 |
/***********************************************************************/ |
|
546 |
||
1082
903e2782e405
fix bug introduced in previous commit (force literals to unsigned log long)
Mario de Sousa <msousa@fe.up.pt>
parents:
1081
diff
changeset
|
547 |
#define MILLISECOND ((unsigned long long)1000000) |
70 | 548 |
#define SECOND 1000 * MILLISECOND |
549 |
||
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
550 |
#define ULL_MAX std::numeric_limits<unsigned long long>::max() |
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
551 |
#define UL_MAX std::numeric_limits<uint32_t>::max() |
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
552 |
|
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
553 |
/* unsigned long long -> multiply and add : time_var += interval * multiplier */ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
554 |
/* note: multiplier must be <> 0 due to overflow test */ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
555 |
#define ULL_MUL_ADD(time_var, interval, multiplier, overflow_flag) { \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
556 |
/* Test overflow on MUL by pre-condition: If (ULL_MAX / a) < b => overflow! */ \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
557 |
overflow_flag |= ((ULL_MAX / (multiplier)) < GET_CVALUE(uint64, interval)); \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
558 |
/* Test overflow on ADD by pre-condition: If (ULL_MAX - a) < b => overflow! */ \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
559 |
overflow_flag |= ((ULL_MAX - (GET_CVALUE(uint64, interval) * multiplier)) < time_var); \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
560 |
time_var += GET_CVALUE(uint64, interval) * (multiplier); \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
561 |
} |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
562 |
|
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
563 |
/* long double -> multiply and add : time_var += interval * multiplier */ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
564 |
#define LDB_MUL_ADD(time_var, interval, multiplier) { \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
565 |
time_var += GET_CVALUE(real64, interval) * (multiplier); \ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
566 |
} |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
567 |
|
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
568 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
569 |
unsigned long long calculate_time(symbol_c *symbol) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
570 |
if (NULL == symbol) return 0; |
70 | 571 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
572 |
interval_c *interval = dynamic_cast<interval_c *>(symbol); |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
573 |
duration_c *duration = dynamic_cast<duration_c *>(symbol); |
70 | 574 |
|
632
76c3d707ffa1
Adding error message when task interval value is not supported
Laurent Bessard
parents:
631
diff
changeset
|
575 |
if ((NULL == interval) && (NULL == duration)) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
576 |
{STAGE4_ERROR(symbol, symbol, "This type of interval value is not currently supported"); ERROR;} |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
577 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
578 |
if (NULL != duration) { |
70 | 579 |
/* SYM_REF2(duration_c, neg, interval) */ |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
580 |
if (duration->neg != NULL) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
581 |
{STAGE4_ERROR(duration, duration, "Negative TIME literals for interval are not currently supported"); ERROR;} |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
582 |
return calculate_time(duration->interval); |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
583 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
584 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
585 |
if (NULL != interval) { |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
diff
changeset
|
586 |
/* SYM_REF5(interval_c, days, hours, minutes, seconds, milliseconds) */ |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
587 |
unsigned long long int time_ull = 0; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
588 |
long double time_ld = 0; |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
589 |
bool ovflow = false; |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
590 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
591 |
if (NULL != interval->milliseconds) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
592 |
if (VALID_CVALUE( int64, interval->milliseconds) && GET_CVALUE( int64, interval->milliseconds) < 0) ERROR; // interval elements should always be positive! |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
593 |
if (VALID_CVALUE(uint64, interval->milliseconds)) ULL_MUL_ADD(time_ull, interval->milliseconds, MILLISECOND, ovflow) |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
594 |
else if (VALID_CVALUE(real64, interval->milliseconds)) LDB_MUL_ADD(time_ld , interval->milliseconds, MILLISECOND) |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
595 |
else ERROR; // if (NULL != interval->milliseconds) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
596 |
} |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
diff
changeset
|
597 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
598 |
if (NULL != interval->seconds ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
599 |
if (VALID_CVALUE( int64, interval->seconds ) && GET_CVALUE( int64, interval->seconds ) < 0) ERROR; // interval elements should always be positive! |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
600 |
if (VALID_CVALUE(uint64, interval->seconds )) ULL_MUL_ADD(time_ull, interval->seconds, SECOND, ovflow) |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
601 |
else if (VALID_CVALUE(real64, interval->seconds )) LDB_MUL_ADD(time_ld , interval->seconds, SECOND) |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
602 |
else ERROR; // if (NULL != interval->seconds) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
603 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
604 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
605 |
if (NULL != interval->minutes ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
606 |
if (VALID_CVALUE( int64, interval->minutes ) && GET_CVALUE( int64, interval->minutes ) < 0) ERROR; // interval elements should always be positive! |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
607 |
if (VALID_CVALUE(uint64, interval->minutes )) ULL_MUL_ADD(time_ull, interval->minutes, SECOND * 60, ovflow) |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
608 |
else if (VALID_CVALUE(real64, interval->minutes )) LDB_MUL_ADD(time_ld , interval->minutes, SECOND * 60) |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
609 |
else ERROR; // if (NULL != interval->minutes) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
610 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
611 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
612 |
if (NULL != interval->hours ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
613 |
if (VALID_CVALUE( int64, interval->hours ) && GET_CVALUE( int64, interval->hours ) < 0) ERROR; // interval elements should always be positive! |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
614 |
if (VALID_CVALUE(uint64, interval->hours )) ULL_MUL_ADD(time_ull, interval->hours, SECOND * 60 * 60, ovflow) |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
615 |
else if (VALID_CVALUE(real64, interval->hours )) LDB_MUL_ADD(time_ld , interval->hours, SECOND * 60 * 60) |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
616 |
else ERROR; // if (NULL != interval->hours) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
617 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
618 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
619 |
if (NULL != interval->days ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
620 |
if (VALID_CVALUE( int64, interval->days ) && GET_CVALUE( int64, interval->days ) < 0) ERROR; // interval elements should always be positive! |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
621 |
if (VALID_CVALUE(uint64, interval->days )) ULL_MUL_ADD(time_ull, interval->days, SECOND * 60 * 60 * 24, ovflow) |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
622 |
else if (VALID_CVALUE(real64, interval->days )) LDB_MUL_ADD(time_ld , interval->days, SECOND * 60 * 60 * 24) |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
623 |
else ERROR; // if (NULL != interval->days) is true, then it must have a valid constant value! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
624 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
625 |
|
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
626 |
/* Test overflow on ADD by pre-condition: If (ULL_MAX - a) < b => overflow! */ |
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
627 |
ovflow |= ((ULL_MAX - time_ull) < (unsigned long long)time_ld); |
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
628 |
time_ull += time_ld; |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
629 |
|
1081
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
630 |
if (ovflow) { |
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
631 |
/* time is being stored in ns resolution (MILLISECOND #define is set to 1000000) */ |
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
632 |
/* time is being stored in unsigned long long (ISO C99 guarantees at least 64 bits) */ |
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
633 |
/* 2⁶64ns works out to around 584.5 years, assuming 365.25 days per year */ |
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
634 |
STAGE4_ERROR(symbol, symbol, "Internal overflow calculating task interval (must be < 584 years)."); |
d8ed548e2f9b
return storage of task interval back to 1 ns resolution (when calculating least common multiple et. al. of task intervals).
Mario de Sousa <msousa@fe.up.pt>
parents:
1078
diff
changeset
|
635 |
} |
1078
81e2a100db14
Test for overflow when translating task periods/intervals to integer variable.
Mario de Sousa <msousa@fe.up.pt>
parents:
1077
diff
changeset
|
636 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
637 |
return time_ull; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
638 |
}; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
639 |
ERROR; // should never reach this point! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
640 |
return 0; // humour the compiler! |
661
f537c3315f83
Minor changes needed to build with pedantic flag.
Manuele Conti <conti.ma@alice.it>
parents:
624
diff
changeset
|
641 |
} |
70 | 642 |
|
643 |
/***********************************************************************/ |
|
644 |
/***********************************************************************/ |
|
645 |
/***********************************************************************/ |
|
646 |
/***********************************************************************/ |
|
647 |
||
648 |
class calculate_common_ticktime_c: public iterator_visitor_c { |
|
649 |
private: |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
650 |
unsigned long long common_ticktime; |
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
651 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
652 |
/* Tick overflow can't happen at 2^32 because it |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
653 |
* must align with task periods. |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
654 |
* |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
655 |
* Instead of overflowing naturaly at 2^32 |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
656 |
* the overall periodicity of tasks scheduling |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
657 |
* is used to find the closest overflow lesser than 2^32 |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
658 |
* |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
659 |
*/ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
660 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
661 |
/* after common_period ticks, all task period align again */ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
662 |
unsigned long common_period; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
663 |
|
70 | 664 |
public: |
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
665 |
calculate_common_ticktime_c(void){ |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
666 |
common_ticktime = 0; |
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
667 |
common_period = 1; /* first tick time equals single/first task period */ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
668 |
} |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
669 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
670 |
unsigned long long GCM(unsigned long long a, unsigned long long b) { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
671 |
if(a >= b){ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
672 |
unsigned long long c = a % b; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
673 |
if (c == 0) |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
674 |
return b; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
675 |
else |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
676 |
return GCM(b, c); |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
677 |
} else { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
678 |
return GCM(b, a); |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
679 |
} |
70 | 680 |
} |
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
681 |
|
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
682 |
bool update_ticktime(unsigned long long time) { |
70 | 683 |
if (common_ticktime == 0) |
684 |
common_ticktime = time; |
|
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
685 |
else |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
686 |
common_ticktime = GCM(time, common_ticktime); |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
687 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
688 |
unsigned long task_period = (time / common_ticktime); /* in tick count */ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
689 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
690 |
/* New Common Period is |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
691 |
* Least Common Multiple of |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
692 |
* Previous Common Period and |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
693 |
* New task period |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
694 |
* |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
695 |
* LCM(a,b) = a*b/GCD(a,b) |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
696 |
*/ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
697 |
unsigned long long new_common_period = |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
698 |
common_period * task_period / GCM(common_period, task_period); |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
699 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
700 |
if(new_common_period >= UL_MAX){ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
701 |
return false; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
702 |
} else { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
703 |
common_period = new_common_period; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
704 |
} |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
705 |
/* else if task period already divides common period, |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
706 |
* keep the same common period */ |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
707 |
|
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
708 |
return true; |
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
709 |
} |
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
710 |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
711 |
unsigned long long get_common_ticktime(void) { |
70 | 712 |
return common_ticktime; |
713 |
} |
|
714 |
||
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
715 |
uint32_t get_greatest_tick_count(void) { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
716 |
if (common_period == 1) { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
717 |
return 0; |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
718 |
} else { |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
719 |
return UL_MAX - (UL_MAX % common_period); |
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
720 |
} |
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
721 |
} |
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
722 |
|
70 | 723 |
/* TASK task_name task_initialization */ |
724 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
725 |
void *visit(task_initialization_c *symbol) { |
|
816
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
726 |
if (symbol->interval_data_source != NULL) { |
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
727 |
unsigned long long time = calculate_time(symbol->interval_data_source); |
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
728 |
if(!update_ticktime(time)) { |
1080
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
729 |
/* time is being stored in ns resolution (MILLISECOND #define is set to 1000000) */ |
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
730 |
/* time is being stored in unsigned long long (ISO C99 guarantees at least 64 bits) */ |
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
731 |
/* 2⁶64ns works out to around 584.5 years, assuming 365.25 days per year */ |
54445dfc28ec
addendum to issue #76: detect overflow when calculating least common multiple of task intervals.
Mario de Sousa <msousa@fe.up.pt>
parents:
1079
diff
changeset
|
732 |
STAGE4_ERROR(symbol, symbol, "Internal overflow calculating least common multiple of task intervals (must be < 584 years)."); |
1089
25271e1a3426
Reworked get_greatest_tick_count computation
Edouard Tisserant
parents:
1084
diff
changeset
|
733 |
} |
816
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
734 |
} |
70 | 735 |
return NULL; |
736 |
} |
|
737 |
}; |
|
738 |
||
739 |
/***********************************************************************/ |
|
740 |
/***********************************************************************/ |
|
741 |
/***********************************************************************/ |
|
742 |
/***********************************************************************/ |
|
743 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
744 |
/* A helper class that knows how to generate code for the SFC, IL and ST languages... */ |
70 | 745 |
class generate_c_SFC_IL_ST_c: public null_visitor_c { |
746 |
private: |
|
747 |
stage4out_c *s4o_ptr; |
|
748 |
symbol_c *scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
749 |
symbol_c *fbname; |
70 | 750 |
const char *variable_prefix; |
751 |
||
752 |
public: |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
753 |
generate_c_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL); |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
754 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
755 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
756 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
757 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
758 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o_ptr->enable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
759 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o_ptr->disable_output(); return NULL;} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
760 |
|
70 | 761 |
/*********************************************/ |
762 |
/* B.1.6 Sequential function chart elements */ |
|
763 |
/*********************************************/ |
|
764 |
/*| sequential_function_chart sfc_network*/ |
|
765 |
void *visit(sequential_function_chart_c * symbol); |
|
766 |
||
767 |
/****************************************/ |
|
768 |
/* B.2 - Language IL (Instruction List) */ |
|
769 |
/****************************************/ |
|
770 |
||
771 |
/***********************************/ |
|
772 |
/* B 2.1 Instructions and Operands */ |
|
773 |
/***********************************/ |
|
774 |
/*| instruction_list il_instruction */ |
|
775 |
void *visit(instruction_list_c *symbol); |
|
776 |
||
777 |
/* Remainder implemented in generate_c_il_c... */ |
|
778 |
||
779 |
/***************************************/ |
|
780 |
/* B.3 - Language ST (Structured Text) */ |
|
781 |
/***************************************/ |
|
782 |
/***********************/ |
|
783 |
/* B 3.1 - Expressions */ |
|
784 |
/***********************/ |
|
785 |
/* Implemented in generate_c_st_c */ |
|
786 |
||
787 |
/********************/ |
|
788 |
/* B 3.2 Statements */ |
|
789 |
/********************/ |
|
790 |
void *visit(statement_list_c *symbol); |
|
791 |
||
792 |
/* Remainder implemented in generate_c_st_c... */ |
|
793 |
}; |
|
794 |
||
795 |
#include "generate_c_sfc.cc" |
|
796 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
797 |
generate_c_SFC_IL_ST_c::generate_c_SFC_IL_ST_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix) { |
70 | 798 |
if (NULL == scope) ERROR; |
799 |
this->s4o_ptr = s4o_ptr; |
|
800 |
this->scope = scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
801 |
this->fbname = name; |
70 | 802 |
this->variable_prefix = variable_prefix; |
803 |
} |
|
804 |
||
805 |
void *generate_c_SFC_IL_ST_c::visit(sequential_function_chart_c * symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
806 |
generate_c_sfc_c generate_c_sfc(s4o_ptr, fbname, scope, variable_prefix); |
70 | 807 |
generate_c_sfc.generate(symbol); |
808 |
return NULL; |
|
809 |
} |
|
810 |
||
811 |
void *generate_c_SFC_IL_ST_c::visit(instruction_list_c *symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
812 |
generate_c_il_c generate_c_il(s4o_ptr, fbname, scope, variable_prefix); |
70 | 813 |
generate_c_il.generate(symbol); |
814 |
return NULL; |
|
815 |
} |
|
816 |
||
817 |
void *generate_c_SFC_IL_ST_c::visit(statement_list_c *symbol) { |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
818 |
generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix); |
70 | 819 |
generate_c_st.generate(symbol); |
820 |
return NULL; |
|
821 |
} |
|
822 |
||
823 |
||
824 |
||
825 |
||
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
826 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
827 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
828 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
829 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
830 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
831 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
832 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
833 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
834 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
835 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
836 |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
837 |
class generate_c_pous_c { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
838 |
/* NOTE: This is NOT a visistor class!! |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
839 |
* |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
840 |
* Actually, it does not even really need to be a class. It is simply a collection of similar functions!! |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
841 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
842 |
|
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
843 |
private: |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
844 |
static void print_end_of_block_label(stage4out_c &s4o) { |
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
845 |
/* Print and __end label for return statements! |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
846 |
* If label is not used by at least one goto, compiler will generate a warning. |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
847 |
* To work around this we introduce the useless goto. |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
848 |
*/ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
849 |
s4o.print("\n"); |
634
736b36a83548
Added double curly braces for pragma (kept single curly braces for compatibility). Added macro def and undef surrounding pragma to simplify user code. Moved useless comment from generated code back to code generator.
Edouard Tisserant
parents:
632
diff
changeset
|
850 |
/* to humour the compiler, we insert a goto */ |
283
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
851 |
s4o.print(s4o.indent_spaces); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
852 |
s4o.print("goto "); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
853 |
s4o.print(END_LABEL); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
854 |
s4o.print(";\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
855 |
s4o.indent_left(); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
856 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
857 |
/* write the label marking the end of the code block */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
858 |
/* please see the comment before the RET_operator_c visitor for details... */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
859 |
/* also needed for return_statement_c */ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
860 |
s4o.print("\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
861 |
s4o.print(s4o.indent_spaces); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
862 |
s4o.print(END_LABEL); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
863 |
s4o.print(":\n"); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
864 |
s4o.indent_right(); |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
865 |
} |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
866 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
867 |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
868 |
/*************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
869 |
/* Functions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
870 |
/*************/ |
70 | 871 |
public: |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
872 |
/* NOTE: The following function will be called twice: |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
873 |
* 1st time: s4o will reference the .h file, and print_declaration=true |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
874 |
* Here, we generate the function prototypes... |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
875 |
* 2nd time: s4o will reference the .c file, and print_declaration=false |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
876 |
* Here we generate the source code! |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
877 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
878 |
/* FUNCTION derived_function_name ':' elementary_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
879 |
/* | FUNCTION derived_function_name ':' derived_type_name io_OR_function_var_declarations_list function_body END_FUNCTION */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
880 |
static void handle_function(function_declaration_c *symbol, stage4out_c &s4o, bool print_declaration) { |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
881 |
generate_c_vardecl_c *vardecl = NULL; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
882 |
generate_c_base_and_typeid_c print_base(&s4o); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
883 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
884 |
TRACE("function_declaration_c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
885 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
886 |
/* (A) Function declaration... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
887 |
/* (A.1) Function return type */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
888 |
s4o.print("// FUNCTION\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
889 |
symbol->type_name->accept(print_base); /* return type */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
890 |
s4o.print(" "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
891 |
/* (A.2) Function name */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
892 |
symbol->derived_function_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
893 |
s4o.print("("); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
894 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
895 |
/* (A.3) Function parameters */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
896 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
897 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
898 |
generate_c_vardecl_c::finterface_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
899 |
generate_c_vardecl_c::input_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
900 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
901 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
902 |
generate_c_vardecl_c::en_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
903 |
generate_c_vardecl_c::eno_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
904 |
vardecl->print(symbol->var_declarations_list); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
905 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
906 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
907 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
908 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
909 |
s4o.print(")"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
910 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
911 |
/* If we only want the declaration/prototype, then return!! */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
912 |
if (print_declaration) |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
913 |
{s4o.print(";\n"); return;} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
914 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
915 |
/* continue generating the function definition/code... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
916 |
s4o.print("\n" + s4o.indent_spaces + "{\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
917 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
918 |
/* (B) Function local variable declaration */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
919 |
/* (B.1) Variables declared in ST source code */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
920 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
921 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
922 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
923 |
generate_c_vardecl_c::localinit_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
924 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
925 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
926 |
generate_c_vardecl_c::private_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
927 |
generate_c_vardecl_c::eno_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
928 |
vardecl->print(symbol->var_declarations_list); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
929 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
930 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
931 |
/* (B.2) Temporary variable for function's return value */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
932 |
/* It will have the same name as the function itself! */ |
1016
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
933 |
/* NOTE: matiec supports a non-standard syntax, in which functions do not return a value |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
934 |
* (declared as returning the special non-standard datatype VOID) |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
935 |
* e.g.: FUNCTION foo: VOID |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
936 |
* ... |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
937 |
* END_FUNCTION |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
938 |
* |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
939 |
* These functions cannot return any value, so they do not need a variable to |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
940 |
* store the return value. |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
941 |
* Note that any attemot to sto a value in the implicit variable |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
942 |
* e.g.: FUNCTION foo: VOID |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
943 |
* ... |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
944 |
* foo := 42; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
945 |
* END_FUNCTION |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
946 |
* will always return a datatype incompatilibiyt error in stage 3 of matiec, |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
947 |
* so it is safe for stage 4 to assume that this return variable will never be needed |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
948 |
* if the function's return type is VOID. |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
949 |
*/ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
950 |
if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print return variable if return datatype is not VOID |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
951 |
s4o.print(s4o.indent_spaces); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
952 |
symbol->type_name->accept(print_base); /* return type */ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
953 |
s4o.print(" "); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
954 |
symbol->derived_function_name->accept(print_base); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
955 |
s4o.print(" = "); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
956 |
{ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
957 |
/* get the default value of this variable's type */ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
958 |
symbol_c *default_value = type_initial_value_c::get(symbol->type_name); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
959 |
if (default_value == NULL) ERROR; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
960 |
initialization_analyzer_c initialization_analyzer(default_value); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
961 |
switch (initialization_analyzer.get_initialization_type()) { |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
962 |
case initialization_analyzer_c::struct_it: |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
963 |
{ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
964 |
generate_c_structure_initialization_c *structure_initialization = new generate_c_structure_initialization_c(&s4o); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
965 |
structure_initialization->init_structure_default(symbol->type_name); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
966 |
structure_initialization->init_structure_values(default_value); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
967 |
delete structure_initialization; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
968 |
} |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
969 |
break; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
970 |
case initialization_analyzer_c::array_it: |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
971 |
{ |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
972 |
generate_c_array_initialization_c *array_initialization = new generate_c_array_initialization_c(&s4o); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
973 |
array_initialization->init_array_size(symbol->type_name); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
974 |
array_initialization->init_array_values(default_value); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
975 |
delete array_initialization; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
976 |
} |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
977 |
break; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
978 |
default: |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
979 |
default_value->accept(print_base); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
980 |
break; |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
981 |
} |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
982 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
983 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
984 |
s4o.print(";\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
985 |
|
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
986 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
987 |
// Only generate the code that controls the execution of the function's body if the |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
988 |
// function contains a declaration of both the EN and ENO variables |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
989 |
search_var_instance_decl_c search_var(symbol); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
990 |
identifier_c en_var("EN"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
991 |
identifier_c eno_var("ENO"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
992 |
if ( (search_var.get_vartype(& en_var) == search_var_instance_decl_c::input_vt) |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
993 |
&& (search_var.get_vartype(&eno_var) == search_var_instance_decl_c::output_vt)) { |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
994 |
s4o.print(s4o.indent_spaces + "// Control execution\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
995 |
s4o.print(s4o.indent_spaces + "if (!EN) {\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
996 |
s4o.indent_right(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
997 |
s4o.print(s4o.indent_spaces + "if (__ENO != NULL) {\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
998 |
s4o.indent_right(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
999 |
s4o.print(s4o.indent_spaces + "*__ENO = __BOOL_LITERAL(FALSE);\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1000 |
s4o.indent_left(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1001 |
s4o.print(s4o.indent_spaces + "}\n"); |
1016
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1002 |
if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print return variable if return datatype is not VOID |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1003 |
s4o.print(s4o.indent_spaces + "return "); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1004 |
symbol->derived_function_name->accept(print_base); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1005 |
s4o.print(";\n"); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1006 |
} |
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1007 |
s4o.indent_left(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1008 |
s4o.print(s4o.indent_spaces + "}\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1009 |
} |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1010 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1011 |
/* (C) Function body */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1012 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->derived_function_name, symbol); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1013 |
symbol->function_body->accept(generate_c_code); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1014 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1015 |
print_end_of_block_label(s4o); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1016 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1017 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1018 |
generate_c_vardecl_c::foutputassign_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1019 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1020 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1021 |
generate_c_vardecl_c::eno_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1022 |
vardecl->print(symbol->var_declarations_list); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1023 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1024 |
|
1016
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1025 |
if (!get_datatype_info_c::is_VOID(symbol->type_name->datatype)) { // only print 'return <fname>' if return datatype is not VOID |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1026 |
s4o.print(s4o.indent_spaces + "return "); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1027 |
symbol->derived_function_name->accept(print_base); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1028 |
s4o.print(";\n"); |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1029 |
} |
91bef6704b44
Add support for functions returning VOID (i.e. non-standard extension, allowing functions that do not return any data)
mjsousa
parents:
1011
diff
changeset
|
1030 |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1031 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1032 |
s4o.print(s4o.indent_spaces + "}\n\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1033 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1034 |
return; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1035 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1036 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1037 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1038 |
/*******************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1039 |
/* Function Blocks */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1040 |
/*******************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1041 |
public: |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1042 |
/* NOTE: The following function will be called twice: |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1043 |
* 1st time: s4o will reference the .h file, and print_declaration=true |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1044 |
* Here, we generate the function prototypes... |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1045 |
* 2nd time: s4o will reference the .c file, and print_declaration=false |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1046 |
* Here we generate the source code! |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1047 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1048 |
/* FUNCTION_BLOCK derived_function_block_name io_OR_other_var_declarations function_block_body END_FUNCTION_BLOCK */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1049 |
//SYM_REF4(function_block_declaration_c, fblock_name, var_declarations, fblock_body, unused) |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1050 |
static void handle_function_block(function_block_declaration_c *symbol, stage4out_c &s4o, bool print_declaration) { |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1051 |
generate_c_vardecl_c *vardecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1052 |
generate_c_sfcdecl_c *sfcdecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1053 |
generate_c_base_and_typeid_c print_base(&s4o); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1054 |
TRACE("function_block_declaration_c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1055 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1056 |
/* (A) Function Block data structure declaration... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1057 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1058 |
/* (A.1) Data structure declaration */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1059 |
s4o.print("// FUNCTION_BLOCK "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1060 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1061 |
s4o.print("\n// Data part\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1062 |
s4o.print("typedef struct {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1063 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1064 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1065 |
/* (A.2) Public variables: i.e. the function parameters... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1066 |
s4o.print(s4o.indent_spaces + "// FB Interface - IN, OUT, IN_OUT variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1067 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1068 |
generate_c_vardecl_c::local_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1069 |
generate_c_vardecl_c::input_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1070 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1071 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1072 |
generate_c_vardecl_c::en_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1073 |
generate_c_vardecl_c::eno_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1074 |
vardecl->print(symbol->var_declarations); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1075 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1076 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1077 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1078 |
/* (A.3) Private internal variables */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1079 |
s4o.print(s4o.indent_spaces + "// FB private variables - TEMP, private and located variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1080 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1081 |
generate_c_vardecl_c::local_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1082 |
generate_c_vardecl_c::temp_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1083 |
generate_c_vardecl_c::private_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1084 |
generate_c_vardecl_c::located_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1085 |
generate_c_vardecl_c::external_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1086 |
vardecl->print(symbol->var_declarations); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1087 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1088 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1089 |
/* (A.4) Generate private internal variables for SFC */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1090 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1091 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::sfcdecl_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1092 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1093 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1094 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1095 |
/* (A.5) Function Block data structure type name. */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1096 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1097 |
s4o.print("} "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1098 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1099 |
s4o.print(";\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1100 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1101 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1102 |
if (!print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1103 |
/* (A.6) Function Block inline function declaration for function invocation */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1104 |
generate_c_inlinefcall_c *inlinedecl = new generate_c_inlinefcall_c(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1105 |
symbol->fblock_body->accept(*inlinedecl); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1106 |
delete inlinedecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1107 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1108 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1109 |
/* (B) Constructor */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1110 |
/* (B.1) Constructor name... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1111 |
s4o.print(s4o.indent_spaces + "void "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1112 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1113 |
s4o.print(FB_INIT_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1114 |
s4o.print("("); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1115 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1116 |
/* first and only parameter is a pointer to the data */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1117 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1118 |
s4o.print(" *"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1119 |
s4o.print(FB_FUNCTION_PARAM); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1120 |
s4o.print(", BOOL retain)"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1121 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1122 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1123 |
s4o.print(";\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1124 |
} else { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1125 |
s4o.print(" {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1126 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1127 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1128 |
/* (B.2) Member initializations... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1129 |
s4o.print(s4o.indent_spaces); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1130 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1131 |
generate_c_vardecl_c::constructorinit_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1132 |
generate_c_vardecl_c::input_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1133 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1134 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1135 |
generate_c_vardecl_c::private_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1136 |
generate_c_vardecl_c::located_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1137 |
generate_c_vardecl_c::external_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1138 |
generate_c_vardecl_c::en_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1139 |
generate_c_vardecl_c::eno_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1140 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1141 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1142 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1143 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1144 |
/* (B.3) Generate private internal variables for SFC */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1145 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1146 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::sfcinit_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1147 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1148 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1149 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
920
4369ce5e687f
Fix bug (introduced a few commits ago) when generating SFC actions that are mapped onto variables --> Make generate_sfcdecl_c stateless (i.e. does not depend on order by which it is called).
mjsousa
parents:
918
diff
changeset
|
1150 |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1151 |
/* (C) Function with FB body */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1152 |
/* (C.1) Step definitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1153 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::stepdef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1154 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1155 |
/* (C.2) Action definitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1156 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::actiondef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1157 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1158 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1159 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1160 |
/* (C.3) Function declaration */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1161 |
s4o.print("// Code part\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1162 |
/* function interface */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1163 |
s4o.print("void "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1164 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1165 |
s4o.print(FB_FUNCTION_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1166 |
s4o.print("("); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1167 |
/* first and only parameter is a pointer to the data */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1168 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1169 |
s4o.print(" *"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1170 |
s4o.print(FB_FUNCTION_PARAM); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1171 |
s4o.print(")"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1172 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1173 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1174 |
s4o.print(";\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1175 |
} else { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1176 |
s4o.print(" {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1177 |
s4o.indent_right(); |
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1178 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1179 |
// Only generate the code that controls the execution of the function's body if the |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1180 |
// function contains a declaration of both the EN and ENO variables |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1181 |
search_var_instance_decl_c search_var(symbol); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1182 |
identifier_c en_var("EN"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1183 |
identifier_c eno_var("ENO"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1184 |
if ( (search_var.get_vartype(& en_var) == search_var_instance_decl_c::input_vt) |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1185 |
&& (search_var.get_vartype(&eno_var) == search_var_instance_decl_c::output_vt)) { |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1186 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1187 |
s4o.print(s4o.indent_spaces + "// Control execution\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1188 |
s4o.print(s4o.indent_spaces + "if (!"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1189 |
s4o.print(GET_VAR); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1190 |
s4o.print("("); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1191 |
s4o.print(FB_FUNCTION_PARAM); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1192 |
s4o.print("->EN)) {\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1193 |
s4o.indent_right(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1194 |
s4o.print(s4o.indent_spaces); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1195 |
s4o.print(SET_VAR); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1196 |
s4o.print("("); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1197 |
s4o.print(FB_FUNCTION_PARAM); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1198 |
s4o.print("->,ENO,,__BOOL_LITERAL(FALSE));\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1199 |
s4o.print(s4o.indent_spaces + "return;\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1200 |
s4o.indent_left(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1201 |
s4o.print(s4o.indent_spaces + "}\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1202 |
s4o.print(s4o.indent_spaces + "else {\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1203 |
s4o.indent_right(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1204 |
s4o.print(s4o.indent_spaces); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1205 |
s4o.print(SET_VAR); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1206 |
s4o.print("("); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1207 |
s4o.print(FB_FUNCTION_PARAM); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1208 |
s4o.print("->,ENO,,__BOOL_LITERAL(TRUE));\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1209 |
s4o.indent_left(); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1210 |
s4o.print(s4o.indent_spaces + "}\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1211 |
} |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1212 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1213 |
/* (C.4) Initialize TEMP variables */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1214 |
/* function body */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1215 |
s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1216 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1217 |
generate_c_vardecl_c::init_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1218 |
generate_c_vardecl_c::temp_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1219 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1220 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1221 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1222 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1223 |
/* (C.5) Function code */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1224 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->fblock_name, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1225 |
symbol->fblock_body->accept(generate_c_code); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1226 |
print_end_of_block_label(s4o); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1227 |
s4o.print(s4o.indent_spaces + "return;\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1228 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1229 |
s4o.print(s4o.indent_spaces + "} // "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1230 |
symbol->fblock_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1231 |
s4o.print(FB_FUNCTION_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1232 |
s4o.print(s4o.indent_spaces + "() \n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1233 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1234 |
/* (C.6) Step undefinitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1235 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1236 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::stepundef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1237 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1238 |
/* (C.7) Action undefinitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1239 |
sfcdecl->generate(symbol->fblock_body, generate_c_sfcdecl_c::actionundef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1240 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1241 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1242 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1243 |
s4o.print("\n\n\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1244 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1245 |
return; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1246 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1247 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1248 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1249 |
/************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1250 |
/* Programs */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1251 |
/************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1252 |
public: |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1253 |
/* NOTE: The following function will be called twice: |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1254 |
* 1st time: s4o will reference the .h file, and print_declaration=true |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1255 |
* Here, we generate the function prototypes... |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1256 |
* 2nd time: s4o will reference the .c file, and print_declaration=false |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1257 |
* Here we generate the source code! |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1258 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1259 |
/* PROGRAM program_type_name program_var_declarations_list function_block_body END_PROGRAM */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1260 |
//SYM_REF4(program_declaration_c, program_type_name, var_declarations, function_block_body, unused) |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1261 |
static void handle_program(program_declaration_c *symbol, stage4out_c &s4o, bool print_declaration) { |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1262 |
generate_c_vardecl_c *vardecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1263 |
generate_c_sfcdecl_c *sfcdecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1264 |
generate_c_base_and_typeid_c print_base(&s4o); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1265 |
TRACE("program_declaration_c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1266 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1267 |
/* (A) Program data structure declaration... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1268 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1269 |
/* (A.1) Data structure declaration */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1270 |
s4o.print("// PROGRAM "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1271 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1272 |
s4o.print("\n// Data part\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1273 |
s4o.print("typedef struct {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1274 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1275 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1276 |
/* (A.2) Public variables: i.e. the program parameters... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1277 |
s4o.print(s4o.indent_spaces + "// PROGRAM Interface - IN, OUT, IN_OUT variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1278 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1279 |
generate_c_vardecl_c::local_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1280 |
generate_c_vardecl_c::input_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1281 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1282 |
generate_c_vardecl_c::inoutput_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1283 |
vardecl->print(symbol->var_declarations); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1284 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1285 |
s4o.print("\n"); |
146
eef5e62048c7
Adding support for EN/ENO params in function and function blocks (standard function not supported yet)
lbessard
parents:
145
diff
changeset
|
1286 |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1287 |
/* (A.3) Private internal variables */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1288 |
s4o.print(s4o.indent_spaces + "// PROGRAM private variables - TEMP, private and located variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1289 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1290 |
generate_c_vardecl_c::local_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1291 |
generate_c_vardecl_c::temp_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1292 |
generate_c_vardecl_c::private_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1293 |
generate_c_vardecl_c::located_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1294 |
generate_c_vardecl_c::external_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1295 |
vardecl->print(symbol->var_declarations); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1296 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1297 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1298 |
/* (A.4) Generate private internal variables for SFC */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1299 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1300 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::sfcdecl_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1301 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1302 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1303 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1304 |
/* (A.5) Program data structure type name. */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1305 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1306 |
s4o.print("} "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1307 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1308 |
s4o.print(";\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1309 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1310 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1311 |
if (!print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1312 |
/* (A.6) Function Block inline function declaration for function invocation */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1313 |
generate_c_inlinefcall_c *inlinedecl = new generate_c_inlinefcall_c(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1314 |
symbol->function_block_body->accept(*inlinedecl); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1315 |
delete inlinedecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1316 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1317 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1318 |
/* (B) Constructor */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1319 |
/* (B.1) Constructor name... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1320 |
s4o.print(s4o.indent_spaces + "void "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1321 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1322 |
s4o.print(FB_INIT_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1323 |
s4o.print("("); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1324 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1325 |
/* first and only parameter is a pointer to the data */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1326 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1327 |
s4o.print(" *"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1328 |
s4o.print(FB_FUNCTION_PARAM); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1329 |
s4o.print(", BOOL retain)"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1330 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1331 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1332 |
s4o.print(";\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1333 |
} else { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1334 |
s4o.print(" {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1335 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1336 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1337 |
/* (B.2) Member initializations... */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1338 |
s4o.print(s4o.indent_spaces); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1339 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1340 |
generate_c_vardecl_c::constructorinit_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1341 |
generate_c_vardecl_c::input_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1342 |
generate_c_vardecl_c::output_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1343 |
generate_c_vardecl_c::inoutput_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1344 |
generate_c_vardecl_c::private_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1345 |
generate_c_vardecl_c::located_vt | |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1346 |
generate_c_vardecl_c::external_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1347 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1348 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1349 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1350 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1351 |
/* (B.3) Generate private internal variables for SFC */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1352 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1353 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::sfcinit_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1354 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1355 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1356 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1357 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1358 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1359 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1360 |
if (!print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1361 |
/* (C) Function with PROGRAM body */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1362 |
/* (C.1) Step definitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1363 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1364 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::stepdef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1365 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1366 |
/* (C.2) Action definitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1367 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::actiondef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1368 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1369 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1370 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1371 |
/* (C.3) Function declaration */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1372 |
s4o.print("// Code part\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1373 |
/* function interface */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1374 |
s4o.print("void "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1375 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1376 |
s4o.print(FB_FUNCTION_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1377 |
s4o.print("("); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1378 |
/* first and only parameter is a pointer to the data */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1379 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1380 |
s4o.print(" *"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1381 |
s4o.print(FB_FUNCTION_PARAM); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1382 |
s4o.print(")"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1383 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1384 |
if (print_declaration) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1385 |
s4o.print(";\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1386 |
} else { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1387 |
s4o.print(" {\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1388 |
s4o.indent_right(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1389 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1390 |
/* (C.4) Initialize TEMP variables */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1391 |
/* function body */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1392 |
s4o.print(s4o.indent_spaces + "// Initialise TEMP variables\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1393 |
vardecl = new generate_c_vardecl_c(&s4o, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1394 |
generate_c_vardecl_c::init_vf, |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1395 |
generate_c_vardecl_c::temp_vt); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1396 |
vardecl->print(symbol->var_declarations, NULL, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1397 |
delete vardecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1398 |
s4o.print("\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1399 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1400 |
/* (C.5) Function code */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1401 |
generate_c_SFC_IL_ST_c generate_c_code(&s4o, symbol->program_type_name, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1402 |
symbol->function_block_body->accept(generate_c_code); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1403 |
print_end_of_block_label(s4o); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1404 |
s4o.print(s4o.indent_spaces + "return;\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1405 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1406 |
s4o.print(s4o.indent_spaces + "} // "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1407 |
symbol->program_type_name->accept(print_base); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1408 |
s4o.print(FB_FUNCTION_SUFFIX); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1409 |
s4o.print(s4o.indent_spaces + "() \n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1410 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1411 |
/* (C.6) Step undefinitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1412 |
sfcdecl = new generate_c_sfcdecl_c(&s4o, symbol, FB_FUNCTION_PARAM"->"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1413 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::stepundef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1414 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1415 |
/* (C.7) Action undefinitions */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1416 |
sfcdecl->generate(symbol->function_block_body, generate_c_sfcdecl_c::actionundef_sd); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1417 |
delete sfcdecl; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1418 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1419 |
s4o.indent_left(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1420 |
s4o.print("\n\n\n\n"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1421 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1422 |
return; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1423 |
} |
70 | 1424 |
}; /* generate_c_pous_c */ |
1425 |
||
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1426 |
|
70 | 1427 |
/***********************************************************************/ |
1428 |
/***********************************************************************/ |
|
1429 |
/***********************************************************************/ |
|
1430 |
/***********************************************************************/ |
|
1431 |
/***********************************************************************/ |
|
1432 |
/***********************************************************************/ |
|
1433 |
/***********************************************************************/ |
|
1434 |
/***********************************************************************/ |
|
1435 |
||
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1436 |
class generate_c_config_c: public generate_c_base_and_typeid_c { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1437 |
private: |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1438 |
stage4out_c &s4o_incl; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1439 |
|
70 | 1440 |
public: |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1441 |
generate_c_config_c(stage4out_c *s4o_ptr, stage4out_c *s4o_incl_ptr) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1442 |
: generate_c_base_and_typeid_c(s4o_ptr), s4o_incl(*s4o_incl_ptr) { |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1443 |
}; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1444 |
|
70 | 1445 |
virtual ~generate_c_config_c(void) {} |
1446 |
||
1447 |
typedef enum { |
|
1448 |
initprotos_dt, |
|
1449 |
initdeclare_dt, |
|
1450 |
runprotos_dt, |
|
1451 |
rundeclare_dt |
|
1452 |
} declaretype_t; |
|
1453 |
||
1454 |
declaretype_t wanted_declaretype; |
|
1455 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1456 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1457 |
public: |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1458 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1459 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1460 |
/********************/ |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1461 |
void *visit(enable_code_generation_pragma_c * symbol) { |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1462 |
s4o.enable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1463 |
s4o_incl.enable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1464 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1465 |
} |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1466 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1467 |
void *visit(disable_code_generation_pragma_c * symbol) { |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1468 |
s4o.disable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1469 |
s4o_incl.disable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1470 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1471 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1472 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1473 |
|
70 | 1474 |
/********************************/ |
1475 |
/* B 1.7 Configuration elements */ |
|
1476 |
/********************************/ |
|
1477 |
/* |
|
1478 |
CONFIGURATION configuration_name |
|
1479 |
optional_global_var_declarations |
|
1480 |
(resource_declaration_list | single_resource_declaration) |
|
1481 |
optional_access_declarations |
|
1482 |
optional_instance_specific_initializations |
|
1483 |
END_CONFIGURATION |
|
1484 |
*/ |
|
1485 |
/* |
|
1486 |
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused) |
|
1487 |
*/ |
|
1488 |
void *visit(configuration_declaration_c *symbol) { |
|
1489 |
generate_c_vardecl_c *vardecl; |
|
1490 |
||
1491 |
/* Insert the header... */ |
|
1492 |
s4o.print("/*******************************************/\n"); |
|
1493 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
1494 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
1495 |
s4o.print("/*******************************************/\n\n"); |
|
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1496 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1497 |
if (runtime_options.disable_implicit_en_eno) { |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1498 |
// If we are not generating the EN and ENO parameters for functions and FB, |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1499 |
// then make sure we use the standard library version compiled without these parameters too! |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1500 |
s4o.print("#ifndef DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1501 |
s4o.print("#define DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1502 |
s4o.print("#endif\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1503 |
} |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1504 |
|
70 | 1505 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
257 | 1506 |
s4o.print("#include \"accessor.h\"\n\n"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1507 |
s4o.print("#include \"POUS.h\"\n\n"); |
250
5d2927300e2c
Adding missing support for accessors and retain in configuration files (Bug and fix reported by Manuele Conti)
laurent
parents:
248
diff
changeset
|
1508 |
|
70 | 1509 |
/* (A) configuration declaration... */ |
1510 |
/* (A.1) configuration name in comment */ |
|
1511 |
s4o.print("// CONFIGURATION "); |
|
1512 |
symbol->configuration_name->accept(*this); |
|
1513 |
s4o.print("\n"); |
|
1514 |
||
1515 |
/* (A.2) Global variables */ |
|
1516 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1517 |
generate_c_vardecl_c::local_vf, |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1518 |
generate_c_vardecl_c::global_vt, |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1519 |
symbol->configuration_name); |
70 | 1520 |
vardecl->print(symbol); |
1521 |
delete vardecl; |
|
1522 |
s4o.print("\n"); |
|
1523 |
||
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1524 |
/* (A.3) Declare global prototypes in include file */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1525 |
vardecl = new generate_c_vardecl_c(&s4o_incl, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1526 |
generate_c_vardecl_c::globalprototype_vf, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1527 |
generate_c_vardecl_c::global_vt, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1528 |
symbol->configuration_name); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1529 |
vardecl->print(symbol); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1530 |
delete vardecl; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1531 |
s4o_incl.print("\n"); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1532 |
|
70 | 1533 |
/* (B) Initialisation Function */ |
1534 |
/* (B.1) Ressources initialisation protos... */ |
|
1535 |
wanted_declaretype = initprotos_dt; |
|
1536 |
symbol->resource_declarations->accept(*this); |
|
1537 |
s4o.print("\n"); |
|
1538 |
||
1539 |
/* (B.2) Initialisation function name... */ |
|
1540 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1541 |
s4o.print(FB_INIT_SUFFIX); |
|
1542 |
s4o.print("(void) {\n"); |
|
1543 |
s4o.indent_right(); |
|
250
5d2927300e2c
Adding missing support for accessors and retain in configuration files (Bug and fix reported by Manuele Conti)
laurent
parents:
248
diff
changeset
|
1544 |
s4o.print(s4o.indent_spaces); |
255
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1545 |
s4o.print("BOOL retain;\n"); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1546 |
s4o.print(s4o.indent_spaces); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1547 |
s4o.print("retain = 0;\n"); |
70 | 1548 |
|
1549 |
/* (B.3) Global variables initializations... */ |
|
1550 |
s4o.print(s4o.indent_spaces); |
|
1551 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1552 |
generate_c_vardecl_c::constructorinit_vf, |
537
199bdfe36166
Fix code generation about __INIT_GLOBAL_LOCATED.
Conti Manuele <manuele.conti@alice.it>
parents:
522
diff
changeset
|
1553 |
generate_c_vardecl_c::global_vt, |
199bdfe36166
Fix code generation about __INIT_GLOBAL_LOCATED.
Conti Manuele <manuele.conti@alice.it>
parents:
522
diff
changeset
|
1554 |
symbol->configuration_name); |
70 | 1555 |
vardecl->print(symbol); |
1556 |
delete vardecl; |
|
1557 |
s4o.print("\n"); |
|
1558 |
||
1559 |
/* (B.3) Resources initializations... */ |
|
1560 |
wanted_declaretype = initdeclare_dt; |
|
1561 |
symbol->resource_declarations->accept(*this); |
|
1562 |
||
1563 |
s4o.indent_left(); |
|
1564 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
|
1565 |
||
1566 |
||
1567 |
/* (C) Run Function*/ |
|
1568 |
/* (C.1) Resources run functions protos... */ |
|
1569 |
wanted_declaretype = runprotos_dt; |
|
1570 |
symbol->resource_declarations->accept(*this); |
|
1571 |
s4o.print("\n"); |
|
1572 |
||
1573 |
/* (C.2) Run function name... */ |
|
1574 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1575 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1576 |
s4o.print("(unsigned long tick) {\n"); |
70 | 1577 |
s4o.indent_right(); |
1578 |
||
1579 |
/* (C.3) Resources initializations... */ |
|
1580 |
wanted_declaretype = rundeclare_dt; |
|
1581 |
symbol->resource_declarations->accept(*this); |
|
1582 |
||
1583 |
/* (C.3) Close Public Function body */ |
|
1584 |
s4o.indent_left(); |
|
1585 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
1586 |
||
1587 |
return NULL; |
|
1588 |
} |
|
1589 |
||
1590 |
void *visit(resource_declaration_c *symbol) { |
|
1591 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1592 |
s4o.print(s4o.indent_spaces + "void "); |
|
1593 |
symbol->resource_name->accept(*this); |
|
1594 |
if (wanted_declaretype == initprotos_dt) { |
|
1595 |
s4o.print(FB_INIT_SUFFIX); |
|
1596 |
s4o.print("(void);\n"); |
|
1597 |
} |
|
1598 |
else { |
|
1599 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1600 |
s4o.print("(unsigned long tick);\n"); |
70 | 1601 |
} |
1602 |
} |
|
1603 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1604 |
s4o.print(s4o.indent_spaces); |
|
1605 |
symbol->resource_name->accept(*this); |
|
1606 |
if (wanted_declaretype == initdeclare_dt) { |
|
1607 |
s4o.print(FB_INIT_SUFFIX); |
|
1608 |
s4o.print("();\n"); |
|
1609 |
} |
|
1610 |
else { |
|
1611 |
s4o.print(FB_RUN_SUFFIX); |
|
1612 |
s4o.print("(tick);\n"); |
|
1613 |
} |
|
1614 |
} |
|
1615 |
return NULL; |
|
1616 |
} |
|
1617 |
||
1618 |
void *visit(single_resource_declaration_c *symbol) { |
|
1619 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1620 |
s4o.print(s4o.indent_spaces + "void RESOURCE"); |
|
1621 |
if (wanted_declaretype == initprotos_dt) { |
|
1622 |
s4o.print(FB_INIT_SUFFIX); |
|
1623 |
s4o.print("(void);\n"); |
|
1624 |
} |
|
1625 |
else { |
|
1626 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1627 |
s4o.print("(unsigned long tick);\n"); |
70 | 1628 |
} |
1629 |
} |
|
1630 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1631 |
s4o.print(s4o.indent_spaces + "RESOURCE"); |
|
1632 |
if (wanted_declaretype == initdeclare_dt) { |
|
1633 |
s4o.print(FB_INIT_SUFFIX); |
|
1634 |
s4o.print("();\n"); |
|
1635 |
} |
|
1636 |
else { |
|
1637 |
s4o.print(FB_RUN_SUFFIX); |
|
1638 |
s4o.print("(tick);\n"); |
|
1639 |
} |
|
1640 |
} |
|
1641 |
return NULL; |
|
1642 |
} |
|
1643 |
||
1644 |
}; |
|
1645 |
||
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
1646 |
|
70 | 1647 |
/***********************************************************************/ |
1648 |
/***********************************************************************/ |
|
1649 |
/***********************************************************************/ |
|
1650 |
/***********************************************************************/ |
|
1651 |
/***********************************************************************/ |
|
1652 |
/***********************************************************************/ |
|
1653 |
/***********************************************************************/ |
|
1654 |
/***********************************************************************/ |
|
1655 |
||
1656 |
||
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1657 |
class generate_c_resources_c: public generate_c_base_and_typeid_c { |
70 | 1658 |
|
1659 |
search_var_instance_decl_c *search_config_instance; |
|
1660 |
search_var_instance_decl_c *search_resource_instance; |
|
1661 |
||
1662 |
private: |
|
1663 |
/* The name of the resource curretnly being processed... */ |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1664 |
symbol_c *current_configuration; |
70 | 1665 |
symbol_c *current_resource_name; |
184 | 1666 |
symbol_c *current_task_name; |
70 | 1667 |
symbol_c *current_global_vars; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1668 |
bool configuration_name; |
70 | 1669 |
|
1670 |
public: |
|
1039
52f63e622604
fix wrong common_ticktime if task interval is greater than 4.3 seconds
andrej.skvortzov@gmail.com
parents:
1021
diff
changeset
|
1671 |
generate_c_resources_c(stage4out_c *s4o_ptr, symbol_c *config_scope, symbol_c *resource_scope, unsigned long long time) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1672 |
: generate_c_base_and_typeid_c(s4o_ptr) { |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1673 |
current_configuration = config_scope; |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1674 |
search_config_instance = new search_var_instance_decl_c(config_scope); |
70 | 1675 |
search_resource_instance = new search_var_instance_decl_c(resource_scope); |
1676 |
common_ticktime = time; |
|
1677 |
current_resource_name = NULL; |
|
184 | 1678 |
current_task_name = NULL; |
70 | 1679 |
current_global_vars = NULL; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1680 |
configuration_name = false; |
70 | 1681 |
}; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1682 |
|
70 | 1683 |
virtual ~generate_c_resources_c(void) { |
1684 |
delete search_config_instance; |
|
1685 |
delete search_resource_instance; |
|
1686 |
} |
|
1687 |
||
1688 |
typedef enum { |
|
1689 |
declare_dt, |
|
1690 |
init_dt, |
|
1691 |
run_dt |
|
1692 |
} declaretype_t; |
|
1693 |
||
1694 |
declaretype_t wanted_declaretype; |
|
1695 |
||
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
1696 |
unsigned long long common_ticktime; |
70 | 1697 |
|
1698 |
const char *current_program_name; |
|
1699 |
||
1700 |
typedef enum { |
|
1701 |
assign_at, |
|
1702 |
send_at |
|
1703 |
} assigntype_t; |
|
1704 |
||
1705 |
assigntype_t wanted_assigntype; |
|
1706 |
||
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
|
1707 |
/* the qualifier of variables that need to be processed... */ |
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
|
1708 |
static const unsigned int none_vq = 0x0000; |
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
|
1709 |
static const unsigned int constant_vq = 0x0001; // CONSTANT |
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
|
1710 |
static const unsigned int retain_vq = 0x0002; // RETAIN |
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
|
1711 |
static const unsigned int non_retain_vq = 0x0004; // NON_RETAIN |
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
|
1712 |
|
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
|
1713 |
/* variable used to store the qualifier of program currently being processed... */ |
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
|
1714 |
unsigned int current_varqualifier; |
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
|
1715 |
|
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
|
1716 |
void *print_retain(void) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1717 |
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
|
1718 |
switch (current_varqualifier) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1719 |
case retain_vq: |
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
|
1720 |
s4o.print("1"); |
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
|
1721 |
break; |
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
|
1722 |
case non_retain_vq: |
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
|
1723 |
s4o.print("0"); |
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
|
1724 |
break; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1725 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1726 |
s4o.print("retain"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1727 |
break; |
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
|
1728 |
} |
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
|
1729 |
return NULL; |
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
|
1730 |
} |
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
|
1731 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1732 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1733 |
/* B.1 - Common elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1734 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1735 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1736 |
/* B 1.1 - Letters, digits and identifiers */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1737 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1738 |
void *visit(identifier_c *symbol) { |
958
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1739 |
if (configuration_name) s4o.print(symbol->value); |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1740 |
else generate_c_base_c::visit(symbol); |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1741 |
return NULL; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1742 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1743 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1744 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1745 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1746 |
/********************/ |
1058 | 1747 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;} |
1748 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output(); return NULL;} |
|
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1749 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1750 |
|
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
|
1751 |
/******************************************/ |
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
|
1752 |
/* B 1.4.3 - Declaration & Initialisation */ |
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
|
1753 |
/******************************************/ |
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
|
1754 |
|
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
|
1755 |
void *visit(constant_option_c *symbol) { |
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
|
1756 |
current_varqualifier = constant_vq; |
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
|
1757 |
return NULL; |
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
|
1758 |
} |
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
|
1759 |
|
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
|
1760 |
void *visit(retain_option_c *symbol) { |
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
|
1761 |
current_varqualifier = retain_vq; |
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
|
1762 |
return NULL; |
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
|
1763 |
} |
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
|
1764 |
|
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
|
1765 |
void *visit(non_retain_option_c *symbol) { |
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
|
1766 |
current_varqualifier = non_retain_vq; |
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
|
1767 |
return NULL; |
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
|
1768 |
} |
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
|
1769 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1770 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1771 |
/* B 1.7 Configuration elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1772 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1773 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1774 |
void *visit(configuration_declaration_c *symbol) { |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1775 |
return symbol->configuration_name->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1776 |
} |
70 | 1777 |
|
1778 |
/* |
|
1779 |
RESOURCE resource_name ON resource_type_name |
|
1780 |
optional_global_var_declarations |
|
1781 |
single_resource_declaration |
|
1782 |
END_RESOURCE |
|
1783 |
*/ |
|
1784 |
// SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration) |
|
1785 |
void *visit(resource_declaration_c *symbol) { |
|
1786 |
current_resource_name = symbol->resource_name; |
|
1787 |
current_global_vars = symbol->global_var_declarations; |
|
1788 |
||
1789 |
symbol->resource_declaration->accept(*this); |
|
1790 |
||
1791 |
current_resource_name = NULL; |
|
1792 |
current_global_vars = NULL; |
|
1793 |
return NULL; |
|
1794 |
} |
|
1795 |
||
1796 |
/* task_configuration_list program_configuration_list */ |
|
1797 |
// SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list) |
|
1798 |
void *visit(single_resource_declaration_c *symbol) { |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1799 |
bool single_resource = current_resource_name == NULL; |
70 | 1800 |
if (single_resource) |
1801 |
current_resource_name = new identifier_c("RESOURCE"); |
|
1802 |
generate_c_vardecl_c *vardecl; |
|
1803 |
||
1804 |
/* Insert the header... */ |
|
1805 |
s4o.print("/*******************************************/\n"); |
|
1806 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
1807 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
1808 |
s4o.print("/*******************************************/\n\n"); |
|
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1809 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1810 |
if (runtime_options.disable_implicit_en_eno) { |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1811 |
// If we are not generating the EN and ENO parameters for functions and FB, |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1812 |
// then make sure we use the standard library version compiled without these parameters too! |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1813 |
s4o.print("#ifndef DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1814 |
s4o.print("#define DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1815 |
s4o.print("#endif\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1816 |
} |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
1817 |
|
70 | 1818 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
1819 |
||
1820 |
/* (A) resource declaration... */ |
|
1821 |
/* (A.1) resource name in comment */ |
|
1822 |
s4o.print("// RESOURCE "); |
|
1823 |
current_resource_name->accept(*this); |
|
120
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
1824 |
s4o.print("\n\n"); |
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
1825 |
|
237 | 1826 |
s4o.print("extern unsigned long long common_ticktime__;\n\n"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1827 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1828 |
s4o.print("#include \"accessor.h\"\n"); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
1829 |
s4o.print("#include \"POUS.h\"\n\n"); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1830 |
s4o.print("#include \""); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1831 |
configuration_name = true; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1832 |
current_configuration->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1833 |
configuration_name = false; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1834 |
s4o.print(".h\"\n"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1835 |
|
70 | 1836 |
/* (A.2) Global variables... */ |
1837 |
if (current_global_vars != NULL) { |
|
1838 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1839 |
generate_c_vardecl_c::local_vf, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1840 |
generate_c_vardecl_c::global_vt, |
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1841 |
current_resource_name); |
70 | 1842 |
vardecl->print(current_global_vars); |
1843 |
delete vardecl; |
|
120
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
1844 |
s4o.print("\n"); |
70 | 1845 |
} |
1846 |
||
1847 |
/* (A.3) POUs inclusion */ |
|
1848 |
s4o.print("#include \"POUS.c\"\n\n"); |
|
1849 |
||
184 | 1850 |
wanted_declaretype = declare_dt; |
1851 |
||
70 | 1852 |
/* (A.4) Resource programs declaration... */ |
184 | 1853 |
symbol->task_configuration_list->accept(*this); |
1854 |
||
1855 |
/* (A.5) Resource programs declaration... */ |
|
70 | 1856 |
symbol->program_configuration_list->accept(*this); |
184 | 1857 |
|
70 | 1858 |
s4o.print("\n"); |
1859 |
||
1860 |
/* (B) resource initialisation function... */ |
|
1861 |
/* (B.1) initialisation function name... */ |
|
1862 |
s4o.print("void "); |
|
1863 |
current_resource_name->accept(*this); |
|
1864 |
s4o.print(FB_INIT_SUFFIX); |
|
1865 |
s4o.print("(void) {\n"); |
|
1866 |
s4o.indent_right(); |
|
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
|
1867 |
s4o.print(s4o.indent_spaces); |
255
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1868 |
s4o.print("BOOL retain;\n"); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1869 |
s4o.print(s4o.indent_spaces); |
86ef2244aef1
Modify code generated for avoiding warning while compiling when configuration or resource don't have any global variable
laurent
parents:
250
diff
changeset
|
1870 |
s4o.print("retain = 0;\n"); |
70 | 1871 |
|
1872 |
/* (B.2) Global variables initialisations... */ |
|
1873 |
if (current_global_vars != NULL) { |
|
1874 |
s4o.print(s4o.indent_spaces); |
|
1875 |
vardecl = new generate_c_vardecl_c(&s4o, |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1876 |
generate_c_vardecl_c::constructorinit_vf, |
241
0ba6d614573e
Bug with code generation of global located variables in resource fixed thanks to Mario
laurent
parents:
237
diff
changeset
|
1877 |
generate_c_vardecl_c::global_vt, |
0ba6d614573e
Bug with code generation of global located variables in resource fixed thanks to Mario
laurent
parents:
237
diff
changeset
|
1878 |
current_resource_name); |
70 | 1879 |
vardecl->print(current_global_vars); |
1880 |
delete vardecl; |
|
1881 |
} |
|
1882 |
s4o.print("\n"); |
|
1883 |
||
1884 |
wanted_declaretype = init_dt; |
|
184 | 1885 |
|
1886 |
/* (B.3) Tasks initialisations... */ |
|
1887 |
symbol->task_configuration_list->accept(*this); |
|
1888 |
||
1889 |
/* (B.4) Resource programs initialisations... */ |
|
70 | 1890 |
symbol->program_configuration_list->accept(*this); |
1891 |
||
1892 |
s4o.indent_left(); |
|
1893 |
s4o.print("}\n\n"); |
|
1894 |
||
1895 |
/* (C) Resource run function... */ |
|
1896 |
/* (C.1) Run function name... */ |
|
1897 |
s4o.print("void "); |
|
1898 |
current_resource_name->accept(*this); |
|
1899 |
s4o.print(FB_RUN_SUFFIX); |
|
210
8387cac2aba6
Adding support for forcing tick count to return to zero as the same time than all tasks firing are synchronized
laurent
parents:
202
diff
changeset
|
1900 |
s4o.print("(unsigned long tick) {\n"); |
70 | 1901 |
s4o.indent_right(); |
1902 |
||
184 | 1903 |
wanted_declaretype = run_dt; |
1904 |
||
70 | 1905 |
/* (C.2) Task management... */ |
1906 |
symbol->task_configuration_list->accept(*this); |
|
1907 |
||
1908 |
/* (C.3) Program run declaration... */ |
|
1909 |
symbol->program_configuration_list->accept(*this); |
|
1910 |
||
1911 |
s4o.indent_left(); |
|
1912 |
s4o.print("}\n\n"); |
|
1913 |
||
1914 |
if (single_resource) { |
|
1915 |
delete current_resource_name; |
|
1916 |
current_resource_name = NULL; |
|
1917 |
} |
|
1918 |
return NULL; |
|
1919 |
} |
|
1920 |
||
1921 |
/* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */ |
|
1922 |
//SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused) |
|
1923 |
void *visit(program_configuration_c *symbol) { |
|
184 | 1924 |
switch (wanted_declaretype) { |
1925 |
case declare_dt: |
|
70 | 1926 |
s4o.print(s4o.indent_spaces); |
184 | 1927 |
symbol->program_type_name->accept(*this); |
1928 |
s4o.print(" "); |
|
1929 |
current_resource_name->accept(*this); |
|
1930 |
s4o.print("__"); |
|
1931 |
symbol->program_name->accept(*this); |
|
1932 |
s4o.print(";\n#define "); |
|
1933 |
symbol->program_name->accept(*this); |
|
1934 |
s4o.print(" "); |
|
1935 |
current_resource_name->accept(*this); |
|
1936 |
s4o.print("__"); |
|
1937 |
symbol->program_name->accept(*this); |
|
1938 |
s4o.print("\n"); |
|
1939 |
break; |
|
1940 |
case init_dt: |
|
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
|
1941 |
if (symbol->retain_option != NULL) |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1942 |
symbol->retain_option->accept(*this); |
184 | 1943 |
s4o.print(s4o.indent_spaces); |
1944 |
symbol->program_type_name->accept(*this); |
|
1945 |
s4o.print(FB_INIT_SUFFIX); |
|
1946 |
s4o.print("(&"); |
|
1947 |
symbol->program_name->accept(*this); |
|
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
|
1948 |
print_retain(); |
184 | 1949 |
s4o.print(");\n"); |
1950 |
break; |
|
958
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1951 |
case run_dt: |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1952 |
{ identifier_c *tmp_id = dynamic_cast<identifier_c*>(symbol->program_name); |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1953 |
if (NULL == tmp_id) ERROR; |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1954 |
current_program_name = tmp_id->value; |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
1955 |
} |
184 | 1956 |
if (symbol->task_name != NULL) { |
1957 |
s4o.print(s4o.indent_spaces); |
|
1958 |
s4o.print("if ("); |
|
1959 |
symbol->task_name->accept(*this); |
|
1960 |
s4o.print(") {\n"); |
|
1961 |
s4o.indent_right(); |
|
1962 |
} |
|
70 | 1963 |
|
184 | 1964 |
wanted_assigntype = assign_at; |
1965 |
if (symbol->prog_conf_elements != NULL) |
|
1966 |
symbol->prog_conf_elements->accept(*this); |
|
1967 |
||
1968 |
s4o.print(s4o.indent_spaces); |
|
1969 |
symbol->program_type_name->accept(*this); |
|
1970 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1971 |
s4o.print("(&"); |
|
1972 |
symbol->program_name->accept(*this); |
|
1973 |
s4o.print(");\n"); |
|
1974 |
||
1975 |
wanted_assigntype = send_at; |
|
1976 |
if (symbol->prog_conf_elements != NULL) |
|
1977 |
symbol->prog_conf_elements->accept(*this); |
|
1978 |
||
1979 |
if (symbol->task_name != NULL) { |
|
1980 |
s4o.indent_left(); |
|
1981 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
1982 |
} |
|
1983 |
break; |
|
1984 |
default: |
|
1985 |
break; |
|
70 | 1986 |
} |
1987 |
return NULL; |
|
1988 |
} |
|
1989 |
||
1990 |
/* TASK task_name task_initialization */ |
|
1991 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
1992 |
void *visit(task_configuration_c *symbol) { |
|
184 | 1993 |
current_task_name = symbol->task_name; |
1994 |
switch (wanted_declaretype) { |
|
1995 |
case declare_dt: |
|
1996 |
s4o.print(s4o.indent_spaces + "BOOL "); |
|
1997 |
current_task_name->accept(*this); |
|
1998 |
s4o.print(";\n"); |
|
1999 |
symbol->task_initialization->accept(*this); |
|
2000 |
break; |
|
2001 |
case init_dt: |
|
2002 |
s4o.print(s4o.indent_spaces); |
|
2003 |
current_task_name->accept(*this); |
|
2004 |
s4o.print(" = __BOOL_LITERAL(FALSE);\n"); |
|
2005 |
symbol->task_initialization->accept(*this); |
|
2006 |
break; |
|
2007 |
case run_dt: |
|
2008 |
symbol->task_initialization->accept(*this); |
|
2009 |
break; |
|
2010 |
default: |
|
2011 |
break; |
|
2012 |
} |
|
2013 |
current_task_name = NULL; |
|
70 | 2014 |
return NULL; |
2015 |
} |
|
2016 |
||
2017 |
/* '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */ |
|
2018 |
//SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused) |
|
2019 |
void *visit(task_initialization_c *symbol) { |
|
184 | 2020 |
switch (wanted_declaretype) { |
2021 |
case declare_dt: |
|
2022 |
if (symbol->single_data_source != NULL) { |
|
2023 |
s4o.print(s4o.indent_spaces + "R_TRIG "); |
|
2024 |
current_task_name->accept(*this); |
|
2025 |
s4o.print("_R_TRIG;\n"); |
|
2026 |
} |
|
2027 |
break; |
|
2028 |
case init_dt: |
|
2029 |
if (symbol->single_data_source != NULL) { |
|
2030 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
|
2031 |
s4o.print(FB_INIT_SUFFIX); |
|
2032 |
s4o.print("(&"); |
|
2033 |
current_task_name->accept(*this); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2034 |
s4o.print("_R_TRIG, retain);\n"); |
184 | 2035 |
} |
2036 |
break; |
|
2037 |
case run_dt: |
|
2038 |
if (symbol->single_data_source != NULL) { |
|
2039 |
symbol_c *config_var_decl = NULL; |
|
2040 |
symbol_c *res_var_decl = NULL; |
|
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2041 |
s4o.print(s4o.indent_spaces + "{"); |
184 | 2042 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->single_data_source))->global_var_name; |
2043 |
res_var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2044 |
if (res_var_decl == NULL) { |
|
2045 |
config_var_decl = search_config_instance->get_decl(current_var_reference); |
|
2046 |
if (config_var_decl == NULL) |
|
2047 |
ERROR; |
|
2048 |
config_var_decl->accept(*this); |
|
2049 |
} |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2050 |
else { |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2051 |
res_var_decl->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2052 |
} |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2053 |
s4o.print("* "); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2054 |
symbol->single_data_source->accept(*this); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2055 |
s4o.print(" = __GET_GLOBAL_"); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2056 |
symbol->single_data_source->accept(*this); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2057 |
s4o.print("();"); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2058 |
s4o.print(SET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2059 |
s4o.print("("); |
184 | 2060 |
current_task_name->accept(*this); |
885
b2604fc6d25c
Change order of SET_xxx() macros. (this will allow me to simplify the print_setter() methods later on)
mjsousa
parents:
878
diff
changeset
|
2061 |
s4o.print("_R_TRIG.,CLK,, *"); |
184 | 2062 |
symbol->single_data_source->accept(*this); |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
2063 |
s4o.print(");}\n"); |
184 | 2064 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
2065 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
2066 |
s4o.print("(&"); |
|
2067 |
current_task_name->accept(*this); |
|
2068 |
s4o.print("_R_TRIG);\n"); |
|
2069 |
s4o.print(s4o.indent_spaces); |
|
2070 |
current_task_name->accept(*this); |
|
2071 |
s4o.print(" = "); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2072 |
s4o.print(GET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2073 |
s4o.print("("); |
184 | 2074 |
current_task_name->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2075 |
s4o.print("_R_TRIG.Q)"); |
184 | 2076 |
} |
2077 |
else { |
|
2078 |
s4o.print(s4o.indent_spaces); |
|
2079 |
current_task_name->accept(*this); |
|
2080 |
s4o.print(" = "); |
|
2081 |
if (symbol->interval_data_source != NULL) { |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
2082 |
unsigned long long int time = calculate_time(symbol->interval_data_source); |
184 | 2083 |
if (time != 0) { |
2084 |
s4o.print("!(tick % "); |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
2085 |
s4o.print(time / common_ticktime); |
184 | 2086 |
s4o.print(")"); |
2087 |
} |
|
2088 |
else |
|
2089 |
s4o.print("1"); |
|
2090 |
} |
|
2091 |
else |
|
2092 |
s4o.print("1"); |
|
2093 |
} |
|
2094 |
s4o.print(";\n"); |
|
2095 |
break; |
|
2096 |
default: |
|
2097 |
break; |
|
70 | 2098 |
} |
2099 |
return NULL; |
|
2100 |
} |
|
2101 |
||
2102 |
/* any_symbolic_variable ASSIGN prog_data_source */ |
|
2103 |
//SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source) |
|
2104 |
void *visit(prog_cnxn_assign_c *symbol) { |
|
2105 |
if (wanted_assigntype == assign_at) { |
|
2106 |
symbol_c *var_decl; |
|
2107 |
unsigned int vartype = 0; |
|
2108 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->prog_data_source))->global_var_name; |
|
2109 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2110 |
if (var_decl == NULL) { |
|
2111 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2112 |
if (var_decl == NULL) |
|
2113 |
ERROR; |
|
2114 |
else |
|
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:
397
diff
changeset
|
2115 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2116 |
} |
2117 |
else |
|
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:
397
diff
changeset
|
2118 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2119 |
|
2120 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2121 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2122 |
s4o.print(" *"); |
70 | 2123 |
symbol->prog_data_source->accept(*this); |
2124 |
s4o.print("; "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2125 |
s4o.printupper(current_program_name); |
70 | 2126 |
s4o.print("."); |
2127 |
symbol->symbolic_variable->accept(*this); |
|
2128 |
s4o.print(" = "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2129 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2130 |
s4o.print("*"); |
2131 |
symbol->prog_data_source->accept(*this); |
|
2132 |
s4o.print(";}\n"); |
|
2133 |
} |
|
2134 |
return NULL; |
|
2135 |
} |
|
2136 |
||
2137 |
/* any_symbolic_variable SENDTO data_sink */ |
|
2138 |
//SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, data_sink) |
|
2139 |
void *visit(prog_cnxn_sendto_c *symbol) { |
|
2140 |
if (wanted_assigntype == send_at) { |
|
2141 |
symbol_c *var_decl; |
|
2142 |
unsigned int vartype = 0; |
|
2143 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->data_sink))->global_var_name; |
|
2144 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2145 |
if (var_decl == NULL) { |
|
2146 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2147 |
if (var_decl == NULL) |
|
2148 |
ERROR; |
|
2149 |
else |
|
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:
397
diff
changeset
|
2150 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2151 |
} |
2152 |
else |
|
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:
397
diff
changeset
|
2153 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2154 |
|
2155 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2156 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2157 |
s4o.print(" *"); |
70 | 2158 |
symbol->data_sink->accept(*this); |
2159 |
s4o.print("; "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2160 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2161 |
s4o.print("*"); |
2162 |
symbol->data_sink->accept(*this); |
|
2163 |
s4o.print(" = "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2164 |
s4o.printupper(current_program_name); |
70 | 2165 |
s4o.print("."); |
2166 |
symbol->symbolic_variable->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2167 |
s4o.print(";};\n"); |
70 | 2168 |
} |
2169 |
return NULL; |
|
2170 |
} |
|
2171 |
||
2172 |
}; |
|
2173 |
||
2174 |
/***********************************************************************/ |
|
2175 |
/***********************************************************************/ |
|
2176 |
/***********************************************************************/ |
|
2177 |
/***********************************************************************/ |
|
2178 |
/***********************************************************************/ |
|
2179 |
/***********************************************************************/ |
|
2180 |
/***********************************************************************/ |
|
2181 |
/***********************************************************************/ |
|
2182 |
||
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2183 |
/*******************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2184 |
/* Classes to generate the backup/restore functions... */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2185 |
/*******************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2186 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2187 |
#define RESTORE_ "_restore__" |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2188 |
#define BACKUP_ "_backup__" |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2189 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2190 |
/* class to generate the forward declaration of the XXXX_backup() and XXXX_restore() |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2191 |
* functions that will later (in the generated C source code) be defined |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2192 |
* to backup/restore the global state of each RESOURCE in the source code being compiled. |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2193 |
* The XXXX is actually the resource name! |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2194 |
*/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2195 |
class generate_c_backup_resource_decl_c: public generate_c_base_and_typeid_c { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2196 |
public: |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2197 |
generate_c_backup_resource_decl_c(stage4out_c *s4o_ptr) |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2198 |
: generate_c_base_and_typeid_c(s4o_ptr) {}; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2199 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2200 |
void *visit(resource_declaration_c *symbol) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2201 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2202 |
s4o.print("void "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2203 |
symbol->resource_name->accept(*this); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2204 |
s4o.print("_backup__" "(void **buffer, int *maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2205 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2206 |
s4o.print("void "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2207 |
symbol->resource_name->accept(*this); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2208 |
s4o.print("_restore__" "(void **buffer, int *maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2209 |
return NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2210 |
} |
1071
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2211 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2212 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2213 |
void *visit(single_resource_declaration_c *symbol) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2214 |
/* __Must__ not insert any code! */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2215 |
/* sinlge resources will not create a specific function for the resource */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2216 |
/* backup and restore opertions will be inserted together with the configuration! */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2217 |
return NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2218 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2219 |
|
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2220 |
}; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2221 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2222 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2223 |
/* print out the begining of the generic backup/restore function */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2224 |
void print_backup_restore_function_beg(stage4out_c &s4o, const char *func_name, const char *operation) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2225 |
/* operation will be either "_backup__" or "_restore__" */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2226 |
s4o.print("\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2227 |
s4o.print("void "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2228 |
s4o.print(func_name); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2229 |
s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2230 |
s4o.print("(void **buffer, int *maxsize) {\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2231 |
s4o.indent_right(); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2232 |
// Don't save/restore the __CURRENT_TIME variable, as 'plc controller' has easy access to it |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2233 |
// and can therefore do the save/restore by itself. |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2234 |
//s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2235 |
//s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2236 |
//s4o.print("(&__CURRENT_TIME, sizeof(__CURRENT_TIME), buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2237 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2238 |
s4o.print("#define " DECLARE_GLOBAL "(vartype, domain, varname) \\\n "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2239 |
s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2240 |
s4o.print("(&domain##__##varname, sizeof(domain##__##varname), buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2241 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2242 |
s4o.print("#define " DECLARE_GLOBAL_FB "(vartype, domain, varname) \\\n "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2243 |
s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2244 |
s4o.print("(&domain##__##varname, sizeof(domain##__##varname), buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2245 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2246 |
s4o.print("#define " DECLARE_GLOBAL_LOCATION "(vartype, location) \\\n "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2247 |
s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2248 |
s4o.print("(location, sizeof(*location), buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2249 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2250 |
s4o.print("#define " DECLARE_GLOBAL_LOCATED "(vartype, domain, varname) \\\n "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2251 |
s4o.print(operation); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2252 |
s4o.print("(&domain##__##varname, sizeof(domain##__##varname), buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2253 |
} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2254 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2255 |
/* print out the ending of the generic backup/restore function */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2256 |
void print_backup_restore_function_end(stage4out_c &s4o) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2257 |
s4o.print(s4o.indent_spaces); s4o.print("#undef " DECLARE_GLOBAL "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2258 |
s4o.print(s4o.indent_spaces); s4o.print("#undef " DECLARE_GLOBAL_FB "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2259 |
s4o.print(s4o.indent_spaces); s4o.print("#undef " DECLARE_GLOBAL_LOCATION "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2260 |
s4o.print(s4o.indent_spaces); s4o.print("#undef " DECLARE_GLOBAL_LOCATED "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2261 |
s4o.indent_left(); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2262 |
s4o.print("}\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2263 |
} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2264 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2265 |
|
1071
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2266 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2267 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2268 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2269 |
/* generate the backup/restore function for a RESOURCE */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2270 |
/* the backup/restore function generated here will be called by the backup/restore |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2271 |
* function generated for the configuration in which the resource is embedded |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2272 |
*/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2273 |
class generate_c_backup_resource_c: public generate_c_base_and_typeid_c { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2274 |
public: |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2275 |
const char *operation; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2276 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2277 |
generate_c_backup_resource_c(stage4out_c *s4o_ptr) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2278 |
: generate_c_base_and_typeid_c(s4o_ptr) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2279 |
operation = NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2280 |
}; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2281 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2282 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2283 |
virtual ~generate_c_backup_resource_c(void) {} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2284 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2285 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2286 |
private: |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2287 |
void print_forward_declarations(void) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2288 |
s4o.print("\n\n\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2289 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2290 |
s4o.print("void "); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2291 |
s4o.print("_backup__"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2292 |
s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2293 |
s4o.print("void "); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2294 |
s4o.print("_restore__"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2295 |
s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize);\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2296 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2297 |
s4o.print("\n\n\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2298 |
s4o.print("#undef " DECLARE_GLOBAL "\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2299 |
s4o.print("#undef " DECLARE_GLOBAL_FB "\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2300 |
s4o.print("#undef " DECLARE_GLOBAL_LOCATION "\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2301 |
s4o.print("#undef " DECLARE_GLOBAL_LOCATED "\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2302 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2303 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2304 |
public: |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2305 |
/********************/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2306 |
/* 2.1.6 - Pragmas */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2307 |
/********************/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2308 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2309 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output();return NULL;} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2310 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2311 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2312 |
/********************************/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2313 |
/* B 1.7 Configuration elements */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2314 |
/********************************/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2315 |
void *visit(resource_declaration_c *symbol) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2316 |
char *resource_name = strdup(symbol->resource_name->token->value); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2317 |
/* convert to upper case */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2318 |
for (char *c = resource_name; *c != '\0'; *c = toupper(*c), c++); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2319 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2320 |
generate_c_vardecl_c vardecl = generate_c_vardecl_c(&s4o, |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2321 |
generate_c_vardecl_c::local_vf, |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2322 |
generate_c_vardecl_c::global_vt, |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2323 |
symbol->resource_name); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2324 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2325 |
print_forward_declarations(); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2326 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2327 |
print_backup_restore_function_beg(s4o, resource_name, "_backup__"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2328 |
if (symbol->global_var_declarations != NULL) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2329 |
vardecl.print(symbol->global_var_declarations); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2330 |
if (symbol->resource_declaration != NULL) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2331 |
operation = "_backup__"; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2332 |
symbol->resource_declaration->accept(*this); // will call visit(single_resource_declaration_c *) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2333 |
operation = NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2334 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2335 |
print_backup_restore_function_end(s4o); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2336 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2337 |
print_backup_restore_function_beg(s4o, resource_name, "_restore__"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2338 |
if (symbol->global_var_declarations != NULL) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2339 |
vardecl.print(symbol->global_var_declarations); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2340 |
if (symbol->resource_declaration != NULL) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2341 |
operation = "_restore__"; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2342 |
symbol->resource_declaration->accept(*this); // will call visit(single_resource_declaration_c *) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2343 |
operation = NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2344 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2345 |
print_backup_restore_function_end(s4o); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2346 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2347 |
return NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2348 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2349 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2350 |
void *visit(single_resource_declaration_c *symbol) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2351 |
/* Must store the declared/instatiated PROGRAMS */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2352 |
if (symbol->program_configuration_list != NULL) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2353 |
symbol->program_configuration_list->accept(*this); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2354 |
return NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2355 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2356 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2357 |
/* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2358 |
// SYM_REF5(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements) |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2359 |
void *visit(program_configuration_c *symbol) { |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2360 |
// generate the following source code: |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2361 |
// _xxxxxx__(&program_name, sizeof(program_name), buffer, maxsize); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2362 |
s4o.print(s4o.indent_spaces); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2363 |
s4o.print(operation); // call _restore__() or _backup__() |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2364 |
s4o.print("(&"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2365 |
symbol->program_name->accept(*this); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2366 |
s4o.print(", sizeof("); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2367 |
symbol->program_name->accept(*this); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2368 |
s4o.print("), buffer, maxsize);\n"); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2369 |
return NULL; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2370 |
} |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2371 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2372 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2373 |
}; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2374 |
|
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2375 |
|
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2376 |
/* generate the backup/restore function for a CONFIGURATION */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2377 |
/* the generated function will backup/restore the global variables declared in the |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2378 |
* configuration, and call the backup/restore functions of each embedded resource to do |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2379 |
* the same for the global variables declared inside each resource. |
1062
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2380 |
* |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2381 |
* The matiec compiler will now generate two additional functions which |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2382 |
* will backup and restore the PLC internal state to a void *buffer. |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2383 |
* config_backup__(void **buffer, int *maxsize) |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2384 |
* config_restore__(void **buffer, int *maxsize) |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2385 |
* |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2386 |
* Both functions will backup/restore the internal state from the memory |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2387 |
* pointed to by *buffer, up to a maximum of *maxsize bytes. |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2388 |
* Both functions will return with buffer pointing to the first unused |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2389 |
* byte in the buffer, and maxsize with the number of remaining bytes. If |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2390 |
* the buffer is not sufficient to store all the internal state, maxsize |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2391 |
* will return with a negative number, equal to the number of missing |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2392 |
* bytes. |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2393 |
* |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2394 |
* In other words, to know the exact size of the buffer required to store |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2395 |
* the PLC internal state, malloc() that memory, and do the backup: |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2396 |
* int maxsize = 0; |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2397 |
* config_backup__(NULL, &maxsize); |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2398 |
* void *buffer = malloc(-1 * maxsize); |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2399 |
* // and now to really back the internal state... |
814acf353c69
Add some comments to code regarding backup/restore functions
mjsousa
parents:
1061
diff
changeset
|
2400 |
* config_backup__(&buffer, &maxsize); |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2401 |
*/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2402 |
class generate_c_backup_config_c: public generate_c_base_and_typeid_c { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2403 |
private: |
1061
f762b43c8fad
fix initialization of variable (was not following ISO C++ rules)
Mario de Sousa <msousa@fe.up.pt>
parents:
1060
diff
changeset
|
2404 |
const char *func_to_call; // parameter to pass data from: void *visit(configuration_declaration_c *) |
f762b43c8fad
fix initialization of variable (was not following ISO C++ rules)
Mario de Sousa <msousa@fe.up.pt>
parents:
1060
diff
changeset
|
2405 |
// to: void *visit(resource_declaration_c *) |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2406 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2407 |
public: |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2408 |
generate_c_backup_config_c(stage4out_c *s4o_ptr) |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2409 |
: generate_c_base_and_typeid_c(s4o_ptr) { |
1061
f762b43c8fad
fix initialization of variable (was not following ISO C++ rules)
Mario de Sousa <msousa@fe.up.pt>
parents:
1060
diff
changeset
|
2410 |
func_to_call = NULL; |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2411 |
}; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2412 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2413 |
virtual ~generate_c_backup_config_c(void) {} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2414 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2415 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2416 |
public: |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2417 |
/********************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2418 |
/* 2.1.6 - Pragmas */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2419 |
/********************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2420 |
void *visit(enable_code_generation_pragma_c * symbol) {s4o.enable_output(); return NULL;} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2421 |
void *visit(disable_code_generation_pragma_c * symbol) {s4o.disable_output();return NULL;} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2422 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2423 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2424 |
/********************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2425 |
/* B 1.7 Configuration elements */ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2426 |
/********************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2427 |
/* |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2428 |
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused) |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2429 |
*/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2430 |
void *visit(configuration_declaration_c *symbol) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2431 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2432 |
s4o.print("\n\n\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2433 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2434 |
s4o.print("void "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2435 |
s4o.print("_backup__"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2436 |
s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize) {\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2437 |
s4o.print(" if (varsize <= *maxsize) {memmove(*buffer, varptr, varsize); *buffer += varsize;}\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2438 |
s4o.print(" *maxsize -= varsize;\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2439 |
s4o.print("}\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2440 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2441 |
s4o.print("void "); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2442 |
s4o.print("_restore__"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2443 |
s4o.print("(void *varptr, int varsize, void **buffer, int *maxsize) {\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2444 |
s4o.print(" if (varsize <= *maxsize) {memmove(varptr, *buffer, varsize); *buffer += varsize;}\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2445 |
s4o.print(" *maxsize -= varsize;\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2446 |
s4o.print("}\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2447 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2448 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2449 |
generate_c_vardecl_c vardecl = generate_c_vardecl_c(&s4o, |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2450 |
generate_c_vardecl_c::local_vf, |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2451 |
generate_c_vardecl_c::global_vt, |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2452 |
symbol->configuration_name); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2453 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2454 |
s4o.print("\n\n\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2455 |
s4o.print("#undef " DECLARE_GLOBAL "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2456 |
s4o.print("#undef " DECLARE_GLOBAL_FB "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2457 |
s4o.print("#undef " DECLARE_GLOBAL_LOCATION "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2458 |
s4o.print("#undef " DECLARE_GLOBAL_LOCATED "\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2459 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2460 |
generate_c_backup_resource_decl_c declare_functions = generate_c_backup_resource_decl_c(&s4o); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2461 |
symbol->resource_declarations->accept(declare_functions); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2462 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2463 |
print_backup_restore_function_beg(s4o, "config", "_backup__"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2464 |
vardecl.print(symbol); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2465 |
s4o.print("\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2466 |
func_to_call = "_backup__"; |
1071
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2467 |
symbol->resource_declarations->accept(*this); // will call resource_declaration_list_c or single_resource_declaration_c |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2468 |
func_to_call = NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2469 |
print_backup_restore_function_end(s4o); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2470 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2471 |
print_backup_restore_function_beg(s4o, "config", "_restore__"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2472 |
vardecl.print(symbol); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2473 |
s4o.print("\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2474 |
func_to_call = "_restore__"; |
1071
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2475 |
symbol->resource_declarations->accept(*this); // will call resource_declaration_list_c or single_resource_declaration_c |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2476 |
func_to_call = NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2477 |
print_backup_restore_function_end(s4o); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2478 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2479 |
return NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2480 |
} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2481 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2482 |
void *visit(resource_declaration_c *symbol) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2483 |
s4o.print(s4o.indent_spaces); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2484 |
symbol->resource_name->accept(*this); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2485 |
s4o.print(func_to_call); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2486 |
s4o.print("(buffer, maxsize);\n"); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2487 |
return NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2488 |
} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2489 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2490 |
void *visit(single_resource_declaration_c *symbol) { |
1071
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2491 |
/* If the configuration does not have any resources, we must store/restore the declared program instances |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2492 |
* inside the backup() restore() functions created for the configuration. |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2493 |
*/ |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2494 |
generate_c_backup_resource_c handle_resource = generate_c_backup_resource_c(&s4o); |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2495 |
handle_resource.operation = func_to_call; |
7fd69f29320a
fix backup/restore functions: now also backup/restore programs instantiated to run inside tasks.
Mario de Sousa <msousa@fe.up.pt>
parents:
1061
diff
changeset
|
2496 |
symbol->accept(handle_resource); |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2497 |
return NULL; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2498 |
} |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2499 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2500 |
}; |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2501 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2502 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2503 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2504 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2505 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2506 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2507 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2508 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2509 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2510 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2511 |
/***********************************************************************/ |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2512 |
|
70 | 2513 |
class generate_c_c: public iterator_visitor_c { |
2514 |
protected: |
|
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2515 |
stage4out_c &s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2516 |
stage4out_c pous_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2517 |
stage4out_c pous_incl_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2518 |
stage4out_c located_variables_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2519 |
stage4out_c variables_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2520 |
|
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2521 |
generate_c_typedecl_c generate_c_typedecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2522 |
generate_c_implicit_typedecl_c generate_c_implicit_typedecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2523 |
generate_c_pous_c generate_c_pous; |
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2524 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2525 |
symbol_c *current_configuration; |
70 | 2526 |
|
2527 |
const char *current_name; |
|
2528 |
const char *current_builddir; |
|
2529 |
||
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2530 |
bool allow_output; |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2531 |
|
237 | 2532 |
unsigned long long common_ticktime; |
70 | 2533 |
|
2534 |
public: |
|
2535 |
generate_c_c(stage4out_c *s4o_ptr, const char *builddir): |
|
2536 |
s4o(*s4o_ptr), |
|
2537 |
pous_s4o(builddir, "POUS", "c"), |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2538 |
pous_incl_s4o(builddir, "POUS", "h"), |
70 | 2539 |
located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), |
112 | 2540 |
variables_s4o(builddir, "VARIABLES","csv"), |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2541 |
generate_c_typedecl (&pous_incl_s4o), |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2542 |
generate_c_implicit_typedecl(&pous_incl_s4o, &generate_c_typedecl) |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2543 |
{ |
70 | 2544 |
current_builddir = builddir; |
2545 |
current_configuration = NULL; |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2546 |
allow_output = true; |
70 | 2547 |
} |
2548 |
||
2549 |
~generate_c_c(void) {} |
|
2550 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2551 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2552 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2553 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2554 |
/* 2.1.6 - Pragmas */ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2555 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2556 |
void *visit(enable_code_generation_pragma_c * symbol) { |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2557 |
s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2558 |
pous_s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2559 |
pous_incl_s4o .enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2560 |
located_variables_s4o.enable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2561 |
variables_s4o .enable_output(); |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2562 |
allow_output = true; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2563 |
return NULL; |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2564 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2565 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2566 |
void *visit(disable_code_generation_pragma_c * symbol) { |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2567 |
s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2568 |
pous_s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2569 |
pous_incl_s4o .disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2570 |
located_variables_s4o.disable_output(); |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2571 |
variables_s4o .disable_output(); |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2572 |
allow_output = false; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2573 |
return NULL; |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2574 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2575 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2576 |
|
70 | 2577 |
/***************************/ |
2578 |
/* B 0 - Programming Model */ |
|
2579 |
/***************************/ |
|
2580 |
void *visit(library_c *symbol) { |
|
1011
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2581 |
pous_incl_s4o.print("#ifndef __POUS_H\n#define __POUS_H\n\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2582 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2583 |
if (runtime_options.disable_implicit_en_eno) { |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2584 |
// If we are not generating the EN and ENO parameters for functions and FB, |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2585 |
// then make sure we use the standard library version compiled without these parameters too! |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2586 |
pous_incl_s4o.print("#ifndef DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2587 |
pous_incl_s4o.print("#define DISABLE_EN_ENO_PARAMETERS\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2588 |
pous_incl_s4o.print("#endif\n"); |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2589 |
} |
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2590 |
|
76175defb87b
Add option to not add the EN and ENO parameters to every function and FB (generated C code becomes smaller, and uses less memory for function invocations)
mjsousa
parents:
965
diff
changeset
|
2591 |
pous_incl_s4o.print("#include \"accessor.h\"\n#include \"iec_std_lib.h\"\n\n"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2592 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2593 |
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:
1021
diff
changeset
|
2594 |
symbol->get_element(i)->accept(*this); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2595 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2596 |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2597 |
pous_incl_s4o.print("#endif //__POUS_H\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2598 |
|
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2599 |
generate_var_list_c generate_var_list(&variables_s4o, symbol); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2600 |
generate_var_list.generate_programs(symbol); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2601 |
generate_var_list.generate_variables(symbol); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2602 |
variables_s4o.print("\n// Ticktime\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2603 |
variables_s4o.print_long_long_integer(common_ticktime, false); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2604 |
variables_s4o.print("\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2605 |
|
98 | 2606 |
generate_location_list_c generate_location_list(&located_variables_s4o); |
2607 |
symbol->accept(generate_location_list); |
|
70 | 2608 |
return NULL; |
2609 |
} |
|
2610 |
||
2611 |
/*************************/ |
|
2612 |
/* B.1 - Common elements */ |
|
2613 |
/*************************/ |
|
2614 |
/*******************************************/ |
|
2615 |
/* B 1.1 - Letters, digits and identifiers */ |
|
2616 |
/*******************************************/ |
|
958
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2617 |
void *visit(identifier_c *symbol) {current_name = symbol->value; return NULL;} |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2618 |
/* In the derived datatype and POUs declarations, the names are stored as identfier_c, so the following visitors are not required! */ |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2619 |
void *visit(derived_datatype_identifier_c *symbol) {ERROR; return NULL;} |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2620 |
void *visit( poutype_identifier_c *symbol) {ERROR; return NULL;} |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2621 |
|
70 | 2622 |
|
98 | 2623 |
/********************************/ |
2624 |
/* B 1.3.3 - Derived data types */ |
|
2625 |
/********************************/ |
|
2626 |
/* TYPE type_declaration_list END_TYPE */ |
|
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2627 |
// void *visit(data_type_declaration_c *symbol) // handled by iterator_visitor_c |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2628 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2629 |
/* helper symbol for data_type_declaration */ |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2630 |
void *visit(type_declaration_list_c *symbol) { |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2631 |
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:
1021
diff
changeset
|
2632 |
symbol->get_element(i)->accept(generate_c_implicit_typedecl); |
56ebe2a31b5b
Access elements[] in list_c through a new get_element() method.
Mario de Sousa <msousa@fe.up.pt>
parents:
1021
diff
changeset
|
2633 |
symbol->get_element(i)->accept(generate_c_typedecl); |
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2634 |
} |
98 | 2635 |
return NULL; |
2636 |
} |
|
2637 |
||
70 | 2638 |
/**************************************/ |
2639 |
/* B.1.5 - Program organization units */ |
|
2640 |
/**************************************/ |
|
958
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2641 |
/* WARNING: The following code is buggy when generating an independent pair of files for each POU, as the |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2642 |
* specially created stage4out_c (s4o_c and s4o_h) will not comply with the enable/disable_code_generation_pragma_c |
7474d2cd1d6e
Add a new pou_typename_c object to the AST to store references to previously declared Functions, FB, and Programs.
mjsousa
parents:
945
diff
changeset
|
2643 |
*/ |
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2644 |
#define handle_pou(fname,pname) \ |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2645 |
if (!allow_output) return NULL;\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2646 |
if (generate_pou_filepairs__) {\ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2647 |
const char *pou_name = get_datatype_info_c::get_id_str(pname);\ |
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2648 |
stage4out_c s4o_c(current_builddir, pou_name, "c");\ |
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2649 |
stage4out_c s4o_h(current_builddir, pou_name, "h");\ |
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2650 |
s4o_c.print("#include \""); s4o_c.print(pou_name); s4o_c.print(".h\"\n");\ |
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2651 |
s4o_h.print("#ifndef __"); s4o_h.print(pou_name); s4o_h.print("_H\n");\ |
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2652 |
s4o_h.print("#define __"); s4o_h.print(pou_name); s4o_h.print("_H\n");\ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2653 |
generate_c_implicit_typedecl_c generate_c_implicit_typedecl__(&s4o_h);\ |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2654 |
symbol->accept(generate_c_implicit_typedecl__); /* generate implicitly delcared datatypes (arrays and ref_to) */\ |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2655 |
generate_c_pous_c::fname(symbol, s4o_h, true); /* generate the <pou_name>.h file */\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2656 |
generate_c_pous_c::fname(symbol, s4o_c, false);/* generate the <pou_name>.c file */\ |
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2657 |
s4o_h.print("#endif /* __"); s4o_h.print(pou_name); s4o_h.print("_H */\n");\ |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2658 |
/* add #include directives to the POUS.h and POUS.c files... */\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2659 |
pous_incl_s4o.print("#include \"");\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2660 |
pous_s4o. print("#include \"");\ |
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2661 |
pous_incl_s4o.print(pou_name);\ |
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2662 |
pous_s4o. print(pou_name);\ |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2663 |
pous_incl_s4o.print(".h\"\n");\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2664 |
pous_s4o. print(".c\"\n");\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2665 |
} else {\ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2666 |
symbol->accept(generate_c_implicit_typedecl);\ |
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2667 |
generate_c_pous_c::fname(symbol, pous_incl_s4o, true);\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2668 |
generate_c_pous_c::fname(symbol, pous_s4o, false);\ |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2669 |
} |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2670 |
|
70 | 2671 |
/***********************/ |
2672 |
/* B 1.5.1 - Functions */ |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2673 |
/***********************/ |
70 | 2674 |
void *visit(function_declaration_c *symbol) { |
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2675 |
handle_pou(handle_function,symbol->derived_function_name) |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2676 |
return NULL; |
70 | 2677 |
} |
2678 |
||
2679 |
/*****************************/ |
|
2680 |
/* B 1.5.2 - Function Blocks */ |
|
2681 |
/*****************************/ |
|
2682 |
void *visit(function_block_declaration_c *symbol) { |
|
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2683 |
handle_pou(handle_function_block,symbol->fblock_name) |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2684 |
return NULL; |
70 | 2685 |
} |
2686 |
||
2687 |
/**********************/ |
|
2688 |
/* B 1.5.3 - Programs */ |
|
2689 |
/**********************/ |
|
2690 |
void *visit(program_declaration_c *symbol) { |
|
918
e9bde0aa93ed
for option '-Op' (generate <pouname>.h/c): add '#include <pouname>.h' to the .c file, and '#ifdef <pouname>_H' to the .h file
mjsousa
parents:
917
diff
changeset
|
2691 |
handle_pou(handle_program,symbol->program_type_name) |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2692 |
return NULL; |
70 | 2693 |
} |
2694 |
||
2695 |
||
2696 |
/********************************/ |
|
2697 |
/* B 1.7 Configuration elements */ |
|
2698 |
/********************************/ |
|
2699 |
void *visit(configuration_declaration_c *symbol) { |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2700 |
if (symbol->global_var_declarations != NULL) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2701 |
symbol->global_var_declarations->accept(generate_c_implicit_typedecl); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2702 |
static int configuration_count = 0; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2703 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2704 |
if (configuration_count++) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2705 |
/* the first configuration is the one we will use!! */ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2706 |
STAGE4_ERROR(symbol, symbol, "A previous CONFIGURATION has already been declared (C code generation currently only allows a single configuration)."); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2707 |
ERROR; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2708 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2709 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2710 |
current_configuration = symbol; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2711 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2712 |
{ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2713 |
calculate_common_ticktime_c calculate_common_ticktime; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2714 |
symbol->accept(calculate_common_ticktime); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2715 |
common_ticktime = calculate_common_ticktime.get_common_ticktime(); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2716 |
if (common_ticktime == 0) { |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2717 |
STAGE4_ERROR(symbol, symbol, "You must define at least one periodic task (to set cycle period)!"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2718 |
ERROR; |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2719 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2720 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2721 |
symbol->configuration_name->accept(*this); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2722 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2723 |
stage4out_c config_s4o(current_builddir, current_name, "c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2724 |
stage4out_c config_incl_s4o(current_builddir, current_name, "h"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2725 |
generate_c_config_c generate_c_config(&config_s4o, &config_incl_s4o); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2726 |
symbol->accept(generate_c_config); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2727 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2728 |
config_s4o.print("unsigned long long common_ticktime__ = "); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2729 |
config_s4o.print_long_long_integer(common_ticktime); |
1077
b37de6a9ad7f
partial fix to issue #76 - calculate task periods with 1ms (instead of 1ns) resolution. Allows for tasks with periods larger than 4.295s, but smaller than 50 days.
Mario de Sousa <msousa@fe.up.pt>
parents:
1072
diff
changeset
|
2730 |
config_s4o.print(" * "); |
b37de6a9ad7f
partial fix to issue #76 - calculate task periods with 1ms (instead of 1ns) resolution. Allows for tasks with periods larger than 4.295s, but smaller than 50 days.
Mario de Sousa <msousa@fe.up.pt>
parents:
1072
diff
changeset
|
2731 |
config_s4o.print_long_long_integer(1000000 / MILLISECOND); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2732 |
config_s4o.print("; /*ns*/\n"); |
1007
afb3974f8fb3
fix warning about overflow if matiec is running on 64-bit platform,
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents:
965
diff
changeset
|
2733 |
config_s4o.print("unsigned long greatest_tick_count__ = (unsigned long)"); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2734 |
config_s4o.print_long_integer(calculate_common_ticktime.get_greatest_tick_count()); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2735 |
config_s4o.print("; /*tick*/\n"); |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2736 |
|
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2737 |
if (generate_plc_state_backup_fuctions__ > 0) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2738 |
generate_c_backup_config_c generate_backup = generate_c_backup_config_c(&config_s4o); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2739 |
symbol->accept(generate_backup); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2740 |
} |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2741 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2742 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2743 |
symbol->resource_declarations->accept(*this); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2744 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2745 |
current_configuration = NULL; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2746 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2747 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2748 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2749 |
void *visit(resource_declaration_c *symbol) { |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2750 |
if (symbol->global_var_declarations != NULL) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2751 |
symbol->global_var_declarations->accept(generate_c_implicit_typedecl); |
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2752 |
symbol->resource_name->accept(*this); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2753 |
stage4out_c resources_s4o(current_builddir, current_name, "c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2754 |
generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2755 |
symbol->accept(generate_c_resources); |
1059
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2756 |
if (generate_plc_state_backup_fuctions__ > 0) { |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2757 |
generate_c_backup_resource_c generate_backup = generate_c_backup_resource_c(&resources_s4o); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2758 |
symbol->accept(generate_backup); |
aef63aa7ef2e
add support for generating functions to backup/restore the internal state of the PLC.
Mario de Sousa <msousa@fe.up.pt>
parents:
1058
diff
changeset
|
2759 |
} |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2760 |
return NULL; |
70 | 2761 |
} |
2762 |
||
2763 |
void *visit(single_resource_declaration_c *symbol) { |
|
907
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2764 |
stage4out_c resources_s4o(current_builddir, "RESOURCE", "c"); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2765 |
generate_c_resources_c generate_c_resources(&resources_s4o, current_configuration, symbol, common_ticktime); |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2766 |
symbol->accept(generate_c_resources); |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2767 |
return NULL; |
70 | 2768 |
} |
2769 |
||
2770 |
}; |
|
2771 |
||
2772 |
/***********************************************************************/ |
|
2773 |
/***********************************************************************/ |
|
2774 |
/***********************************************************************/ |
|
2775 |
/***********************************************************************/ |
|
2776 |
/***********************************************************************/ |
|
2777 |
/***********************************************************************/ |
|
2778 |
/***********************************************************************/ |
|
2779 |
/***********************************************************************/ |
|
2780 |
||
2781 |
||
2782 |
||
2783 |
||
2784 |
visitor_c *new_code_generator(stage4out_c *s4o, const char *builddir) {return new generate_c_c(s4o, builddir);} |
|
2785 |
void delete_code_generator(visitor_c *code_generator) {delete code_generator;} |
|
2786 |
||
2787 |