author | Mario de Sousa <msousa@fe.up.pt> |
Mon, 03 Jul 2017 20:28:26 +0100 | |
changeset 1053 | e94368340160 |
parent 1049 | 4d7183013481 |
child 1058 | 5b54ecd4303b |
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; |
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
181 |
|
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
182 |
#ifdef __unix__ |
878 | 183 |
/* Parse command line options passed from main.c !! */ |
184 |
#include <stdlib.h> // for getsybopt() |
|
185 |
int stage4_parse_options(char *options) { |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
186 |
enum { LINE_OPT = 0 , SEPTFILE_OPT /*, SOME_OTHER_OPT, YET_ANOTHER_OPT */}; |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
187 |
char *const token[] = { /*[LINE_OPT]=*/(char *)"l",/*SEPTFILE_OPT*/(char *)"p" /*, SOME_OTHER_OPT, ... */, NULL }; |
878 | 188 |
/* unfortunately, the above commented out syntax for array initialization is valid in C, but not in C++ */ |
189 |
||
190 |
char *subopts = options; |
|
191 |
char *value; |
|
192 |
int opt; |
|
193 |
||
194 |
while (*subopts != '\0') { |
|
195 |
switch (getsubopt(&subopts, token, &value)) { |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
196 |
case LINE_OPT: generate_line_directives__ = 1; break; |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
197 |
case SEPTFILE_OPT: generate_pou_filepairs__ = 1; break; |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
198 |
default : fprintf(stderr, "Unrecognized option: -O %s\n", value); return -1; break; |
878 | 199 |
} |
200 |
} |
|
201 |
return 0; |
|
202 |
} |
|
203 |
||
204 |
||
205 |
void stage4_print_options(void) { |
|
206 |
printf(" (options must be separated by commas. Example: 'l,w,x')\n"); |
|
207 |
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
|
208 |
printf(" p : place each POU in a separate pair of files (<pou_name>.c, <pou_name>.h).\n"); |
878 | 209 |
} |
882
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
210 |
#else /* not __unix__ */ |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
211 |
/* 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
|
212 |
* 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
|
213 |
void stage4_print_options(void) {} |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
214 |
int stage4_parse_options(char *options) {} |
18a39a545ed9
Disable stage4 options with on windows since getsuboptr isn't supported in mingw
Edouard Tisserant
parents:
878
diff
changeset
|
215 |
#endif |
878 | 216 |
|
217 |
/***********************************************************************/ |
|
218 |
/***********************************************************************/ |
|
219 |
/***********************************************************************/ |
|
220 |
/***********************************************************************/ |
|
221 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
222 |
#include "generate_c_base.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
223 |
#include "generate_c_typedecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
224 |
#include "generate_c_sfcdecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
225 |
#include "generate_c_vardecl.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
226 |
#include "generate_c_configbody.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
227 |
#include "generate_location_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
228 |
#include "generate_var_list.cc" |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
229 |
|
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
230 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
231 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
232 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
233 |
/***********************************************************************/ |
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
234 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
235 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
236 |
#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
|
237 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
238 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
239 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
240 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
241 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
242 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
243 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
244 |
/* 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
|
245 |
/* 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
|
246 |
* 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
|
247 |
* 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
|
248 |
* for e.g.; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
249 |
* 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
|
250 |
* 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
|
251 |
* 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
|
252 |
*/ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
253 |
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
|
254 |
private: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
255 |
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
|
256 |
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
|
257 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
258 |
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
|
259 |
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
|
260 |
/* 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
|
261 |
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
|
262 |
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
|
263 |
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
|
264 |
s4o.print("__"); |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
265 |
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
|
266 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
267 |
} |
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 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
270 |
public: |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
271 |
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
|
272 |
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
|
273 |
{current_type = NULL;} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
274 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
275 |
/**************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
276 |
/* 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
|
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 |
/* 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
|
280 |
/***********************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
281 |
/* 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
|
282 |
/* | 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
|
283 |
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
|
284 |
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
|
285 |
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
|
286 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
287 |
} |
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 |
/* 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
|
290 |
//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
|
291 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
292 |
/* 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
|
293 |
//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
|
294 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
295 |
/* 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
|
296 |
//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
|
297 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
298 |
void *visit(edge_declaration_c *symbol) { |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
299 |
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
|
300 |
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
|
301 |
current_type = NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
302 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
303 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
304 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
305 |
/* 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
|
306 |
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
|
307 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
308 |
/* 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
|
309 |
//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
|
310 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
311 |
/* 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
|
312 |
//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
|
313 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
314 |
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
|
315 |
/* 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
|
316 |
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
|
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 |
/* 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
|
320 |
/* 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
|
321 |
/* 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
|
322 |
* 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
|
323 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
324 |
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
|
325 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
326 |
/* 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
|
327 |
/* 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
|
328 |
/* 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
|
329 |
* 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
|
330 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
331 |
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
|
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_array_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(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
|
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_structured_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(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
|
346 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
347 |
/* 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
|
348 |
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
|
349 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
350 |
/* 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
|
351 |
//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
|
352 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
353 |
/* 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
|
354 |
//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
|
355 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
356 |
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
|
357 |
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
|
358 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
359 |
} |
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 |
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
|
362 |
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
|
363 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
364 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
365 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
366 |
/* 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
|
367 |
/* 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
|
368 |
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
|
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(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
|
371 |
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
|
372 |
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
|
373 |
current_type = NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
374 |
return NULL; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
375 |
} |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
376 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
377 |
/* 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
|
378 |
/* 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
|
379 |
/* 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
|
380 |
* STRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
381 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
382 |
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
|
383 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
384 |
/* 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
|
385 |
/* 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
|
386 |
/* 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
|
387 |
* WSTRING [ 42 ] |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
388 |
*/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
389 |
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
|
390 |
}; |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
391 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
392 |
|
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
393 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
394 |
/***********************************************************************/ |
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 |
/***********************************************************************/ |
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
397 |
|
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
|
398 |
/* 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
|
399 |
/* '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
|
400 |
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
|
401 |
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
|
402 |
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
|
403 |
|
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
|
404 |
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
|
405 |
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
|
406 |
|
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
|
407 |
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
|
408 |
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
|
409 |
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
|
410 |
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
|
411 |
|| 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
|
412 |
); |
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 |
} |
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
|
414 |
|
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
|
415 |
|
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
|
416 |
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
|
417 |
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
|
418 |
|
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
|
419 |
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
|
420 |
/* 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
|
421 |
/* 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
|
422 |
* 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
|
423 |
* 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
|
424 |
* 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
|
425 |
*/ |
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
|
426 |
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
|
427 |
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
|
428 |
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
|
429 |
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
|
430 |
|
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 |
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
|
432 |
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
|
433 |
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
|
434 |
} |
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 |
|
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
|
436 |
/* 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
|
437 |
/* 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
|
438 |
* 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
|
439 |
* 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
|
440 |
* 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
|
441 |
*/ |
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
|
442 |
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
|
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 |
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
|
445 |
|
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 |
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
|
447 |
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
|
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 |
|
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
|
450 |
|
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
|
451 |
/* 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
|
452 |
/* 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
|
453 |
* 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
|
454 |
* 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
|
455 |
* 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
|
456 |
*/ |
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 |
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
|
458 |
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
|
459 |
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
|
460 |
|
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 |
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
|
462 |
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
|
463 |
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
|
464 |
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
|
465 |
} |
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 |
|
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 |
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
|
468 |
|
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 |
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
|
470 |
} |
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
|
471 |
|
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
|
472 |
|
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
473 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
474 |
/* B 1.4 - Variables */ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
475 |
/*********************/ |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
476 |
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
|
477 |
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
|
478 |
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
|
479 |
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
|
480 |
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
|
481 |
} |
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 |
last_fb = symbol; |
853
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
483 |
return NULL; |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
484 |
} |
818c4ac5d64d
Fix bug-fix of previous commit.
Mario de Sousa <msousa@fe.up.pt>
parents:
852
diff
changeset
|
485 |
|
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
|
486 |
/*************************************/ |
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
|
487 |
/* 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
|
488 |
/*************************************/ |
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
|
489 |
|
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
|
490 |
// 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
|
491 |
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
|
492 |
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
|
493 |
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
|
494 |
|
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 |
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
|
496 |
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
|
497 |
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
|
498 |
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
|
499 |
} |
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
|
500 |
|
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
|
501 |
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
|
502 |
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
|
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 |
|
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 |
/* 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
|
506 |
//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
|
507 |
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
|
508 |
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
|
509 |
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
|
510 |
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
|
511 |
} |
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 |
|
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 |
|
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
|
514 |
}; |
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
|
515 |
|
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
|
516 |
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
|
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 |
/***********************************************************************/ |
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 |
/***********************************************************************/ |
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 |
/***********************************************************************/ |
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
|
522 |
|
350
2c3c4dc34979
Support for semantic verification of calls to standard functions.
Mario de Sousa <msousa@fe.up.pt>
parents:
330
diff
changeset
|
523 |
|
70 | 524 |
#include "generate_c_st.cc" |
525 |
#include "generate_c_il.cc" |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
526 |
#include "generate_c_inlinefcall.cc" |
70 | 527 |
|
528 |
/***********************************************************************/ |
|
529 |
/***********************************************************************/ |
|
530 |
/***********************************************************************/ |
|
531 |
/***********************************************************************/ |
|
532 |
||
533 |
#define MILLISECOND 1000000 |
|
534 |
#define SECOND 1000 * MILLISECOND |
|
535 |
||
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
536 |
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
|
537 |
if (NULL == symbol) return 0; |
70 | 538 |
|
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
539 |
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
|
540 |
duration_c *duration = dynamic_cast<duration_c *>(symbol); |
70 | 541 |
|
632
76c3d707ffa1
Adding error message when task interval value is not supported
Laurent Bessard
parents:
631
diff
changeset
|
542 |
if ((NULL == interval) && (NULL == duration)) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
543 |
{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
|
544 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
545 |
if (NULL != duration) { |
70 | 546 |
/* 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
|
547 |
if (duration->neg != NULL) |
631
1a4f5ce62962
Adding error message when task interval value is not supported
Laurent Bessard
parents:
625
diff
changeset
|
548 |
{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
|
549 |
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
|
550 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
551 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
552 |
if (NULL != interval) { |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
diff
changeset
|
553 |
/* 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
|
554 |
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
|
555 |
long double time_ld = 0; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
556 |
/* |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
557 |
const unsigned long long int MILLISECOND = 1000000; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
558 |
const unsigned long long int SECOND = 1000 * MILLISECOND |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
559 |
*/ |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
560 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
561 |
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
|
562 |
if (VALID_CVALUE( int64, interval->milliseconds) && GET_CVALUE( int64, interval->milliseconds) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
563 |
if (VALID_CVALUE( int64, interval->milliseconds)) time_ull += GET_CVALUE( int64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
564 |
else if (VALID_CVALUE(uint64, interval->milliseconds)) time_ull += GET_CVALUE(uint64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
565 |
else if (VALID_CVALUE(real64, interval->milliseconds)) time_ld += GET_CVALUE(real64, interval->milliseconds) * MILLISECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
566 |
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
|
567 |
} |
547
dab341e80664
Fix parsing os TIME literals & rename the extract_integer() function.
mjsousa <msousa@fe.up.pt>
parents:
522
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 |
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
|
570 |
if (VALID_CVALUE( int64, interval->seconds ) && GET_CVALUE( int64, interval->seconds ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
571 |
if (VALID_CVALUE( int64, interval->seconds )) time_ull += GET_CVALUE( int64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
572 |
else if (VALID_CVALUE(uint64, interval->seconds )) time_ull += GET_CVALUE(uint64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
573 |
else if (VALID_CVALUE(real64, interval->seconds )) time_ld += GET_CVALUE(real64, interval->seconds ) * SECOND; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
574 |
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
|
575 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
576 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
577 |
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
|
578 |
if (VALID_CVALUE( int64, interval->minutes ) && GET_CVALUE( int64, interval->minutes ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
579 |
if (VALID_CVALUE( int64, interval->minutes )) time_ull += GET_CVALUE( int64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
580 |
else if (VALID_CVALUE(uint64, interval->minutes )) time_ull += GET_CVALUE(uint64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
581 |
else if (VALID_CVALUE(real64, interval->minutes )) time_ld += GET_CVALUE(real64, interval->minutes ) * SECOND * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
582 |
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
|
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->hours ) { |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
586 |
if (VALID_CVALUE( int64, interval->hours ) && GET_CVALUE( int64, interval->hours ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
587 |
if (VALID_CVALUE( int64, interval->hours )) time_ull += GET_CVALUE( int64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
588 |
else if (VALID_CVALUE(uint64, interval->hours )) time_ull += GET_CVALUE(uint64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
589 |
else if (VALID_CVALUE(real64, interval->hours )) time_ld += GET_CVALUE(real64, interval->hours ) * SECOND * 60 * 60; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
590 |
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
|
591 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
592 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
593 |
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
|
594 |
if (VALID_CVALUE( int64, interval->days ) && GET_CVALUE( int64, interval->days ) < 0) ERROR; // interval elements should always be positive! |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
595 |
if (VALID_CVALUE( int64, interval->days )) time_ull += GET_CVALUE( int64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
596 |
else if (VALID_CVALUE(uint64, interval->days )) time_ull += GET_CVALUE(uint64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
597 |
else if (VALID_CVALUE(real64, interval->days )) time_ld += GET_CVALUE(real64, interval->days ) * SECOND * 60 * 60 * 24; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
598 |
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
|
599 |
} |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
600 |
|
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
601 |
time_ull += time_ld; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
602 |
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
|
603 |
}; |
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
604 |
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
|
605 |
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
|
606 |
} |
70 | 607 |
|
608 |
/***********************************************************************/ |
|
609 |
/***********************************************************************/ |
|
610 |
/***********************************************************************/ |
|
611 |
/***********************************************************************/ |
|
612 |
||
613 |
class calculate_common_ticktime_c: public iterator_visitor_c { |
|
614 |
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
|
615 |
unsigned long long common_ticktime; |
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
|
616 |
unsigned long long least_common_ticktime; |
70 | 617 |
|
618 |
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
|
619 |
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
|
620 |
common_ticktime = 0; |
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
|
621 |
least_common_ticktime = 0; |
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
|
622 |
} |
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
|
623 |
|
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
|
624 |
unsigned long long euclide(unsigned long long a, unsigned long long b) { |
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
|
625 |
unsigned long long c = a % b; |
70 | 626 |
if (c == 0) |
627 |
return b; |
|
628 |
else |
|
629 |
return euclide(b, c); |
|
630 |
} |
|
631 |
||
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
|
632 |
void update_ticktime(unsigned long long time) { |
70 | 633 |
if (common_ticktime == 0) |
634 |
common_ticktime = time; |
|
635 |
else if (time > common_ticktime) |
|
636 |
common_ticktime = euclide(time, common_ticktime); |
|
637 |
else |
|
638 |
common_ticktime = euclide(common_ticktime, time); |
|
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
|
639 |
if (least_common_ticktime == 0) |
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
|
640 |
least_common_ticktime = time; |
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
|
641 |
else |
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
|
642 |
least_common_ticktime = (least_common_ticktime * time) / common_ticktime; |
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
|
643 |
} |
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
|
644 |
|
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
|
645 |
unsigned long long get_common_ticktime(void) { |
70 | 646 |
return common_ticktime; |
647 |
} |
|
648 |
||
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
|
649 |
unsigned long get_greatest_tick_count(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
|
650 |
unsigned long long least_common_tick = least_common_ticktime / common_ticktime; |
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
|
651 |
if (least_common_tick >> 32) |
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
|
652 |
ERROR; |
237 | 653 |
return (unsigned long)(~(((unsigned long)-1) % (unsigned long)least_common_tick) + 1); |
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
|
654 |
} |
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
|
655 |
|
70 | 656 |
/* TASK task_name task_initialization */ |
657 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
658 |
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
|
659 |
if (symbol->interval_data_source != NULL) { |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
660 |
unsigned long long time = calculate_time(symbol->interval_data_source); |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
661 |
if (time < 0) ERROR; |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
662 |
else update_ticktime(time); |
dcd861dda04a
Fixed bug when defining task with single_data_source instead of interval_data_source
Laurent Bessard
parents:
810
diff
changeset
|
663 |
} |
70 | 664 |
return NULL; |
665 |
} |
|
666 |
}; |
|
667 |
||
668 |
/***********************************************************************/ |
|
669 |
/***********************************************************************/ |
|
670 |
/***********************************************************************/ |
|
671 |
/***********************************************************************/ |
|
672 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
673 |
/* A helper class that knows how to generate code for the SFC, IL and ST languages... */ |
70 | 674 |
class generate_c_SFC_IL_ST_c: public null_visitor_c { |
675 |
private: |
|
676 |
stage4out_c *s4o_ptr; |
|
677 |
symbol_c *scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
678 |
symbol_c *fbname; |
70 | 679 |
const char *variable_prefix; |
680 |
||
681 |
public: |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
682 |
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
|
683 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
684 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
685 |
/* 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
|
686 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
687 |
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
|
688 |
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
|
689 |
|
70 | 690 |
/*********************************************/ |
691 |
/* B.1.6 Sequential function chart elements */ |
|
692 |
/*********************************************/ |
|
693 |
/*| sequential_function_chart sfc_network*/ |
|
694 |
void *visit(sequential_function_chart_c * symbol); |
|
695 |
||
696 |
/****************************************/ |
|
697 |
/* B.2 - Language IL (Instruction List) */ |
|
698 |
/****************************************/ |
|
699 |
||
700 |
/***********************************/ |
|
701 |
/* B 2.1 Instructions and Operands */ |
|
702 |
/***********************************/ |
|
703 |
/*| instruction_list il_instruction */ |
|
704 |
void *visit(instruction_list_c *symbol); |
|
705 |
||
706 |
/* Remainder implemented in generate_c_il_c... */ |
|
707 |
||
708 |
/***************************************/ |
|
709 |
/* B.3 - Language ST (Structured Text) */ |
|
710 |
/***************************************/ |
|
711 |
/***********************/ |
|
712 |
/* B 3.1 - Expressions */ |
|
713 |
/***********************/ |
|
714 |
/* Implemented in generate_c_st_c */ |
|
715 |
||
716 |
/********************/ |
|
717 |
/* B 3.2 Statements */ |
|
718 |
/********************/ |
|
719 |
void *visit(statement_list_c *symbol); |
|
720 |
||
721 |
/* Remainder implemented in generate_c_st_c... */ |
|
722 |
}; |
|
723 |
||
724 |
#include "generate_c_sfc.cc" |
|
725 |
||
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
726 |
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 | 727 |
if (NULL == scope) ERROR; |
728 |
this->s4o_ptr = s4o_ptr; |
|
729 |
this->scope = scope; |
|
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
730 |
this->fbname = name; |
70 | 731 |
this->variable_prefix = variable_prefix; |
732 |
} |
|
733 |
||
734 |
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
|
735 |
generate_c_sfc_c generate_c_sfc(s4o_ptr, fbname, scope, variable_prefix); |
70 | 736 |
generate_c_sfc.generate(symbol); |
737 |
return NULL; |
|
738 |
} |
|
739 |
||
740 |
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
|
741 |
generate_c_il_c generate_c_il(s4o_ptr, fbname, scope, variable_prefix); |
70 | 742 |
generate_c_il.generate(symbol); |
743 |
return NULL; |
|
744 |
} |
|
745 |
||
746 |
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
|
747 |
generate_c_st_c generate_c_st(s4o_ptr, fbname, scope, variable_prefix); |
70 | 748 |
generate_c_st.generate(symbol); |
749 |
return NULL; |
|
750 |
} |
|
751 |
||
752 |
||
753 |
||
754 |
||
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
755 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
756 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
757 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
758 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
759 |
|
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
760 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
761 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
762 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
763 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
764 |
/***********************************************************************/ |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
765 |
|
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
|
766 |
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
|
767 |
/* 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
|
768 |
* |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
769 |
* 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
|
770 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
771 |
|
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
772 |
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
|
773 |
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
|
774 |
/* 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
|
775 |
* 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
|
776 |
* 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
|
777 |
*/ |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
778 |
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
|
779 |
/* 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
|
780 |
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
|
781 |
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
|
782 |
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
|
783 |
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
|
784 |
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
|
785 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
786 |
/* 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
|
787 |
/* 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
|
788 |
/* 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
|
789 |
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
|
790 |
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
|
791 |
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
|
792 |
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
|
793 |
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
|
794 |
} |
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
795 |
|
214d3fdee596
fixing C code generation of return_statement_c and exit_statement_c
Mario de Sousa <msousa@fe.up.pt>
parents:
279
diff
changeset
|
796 |
|
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
|
797 |
/*************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
798 |
/* 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
|
799 |
/*************/ |
70 | 800 |
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
|
801 |
/* 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
|
802 |
* 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
|
803 |
* 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
|
804 |
* 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
|
805 |
* 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
|
806 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
807 |
/* 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
|
808 |
/* | 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
|
809 |
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
|
810 |
generate_c_vardecl_c *vardecl = NULL; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
811 |
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
|
812 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
813 |
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
|
814 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
815 |
/* (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
|
816 |
/* (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
|
817 |
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
|
818 |
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
|
819 |
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
|
820 |
/* (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
|
821 |
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
|
822 |
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
|
823 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
824 |
/* (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
|
825 |
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
|
826 |
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
|
827 |
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
|
828 |
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
|
829 |
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
|
830 |
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
|
831 |
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
|
832 |
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
|
833 |
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
|
834 |
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
|
835 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
836 |
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
|
837 |
|
c3edb882a4b2
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 |
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
|
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 |
/* 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
|
841 |
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
|
842 |
{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
|
843 |
|
c3edb882a4b2
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 |
/* 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
|
845 |
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
|
846 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
847 |
/* (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
|
848 |
/* (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
|
849 |
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
|
850 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
851 |
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
|
852 |
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
|
853 |
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
|
854 |
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
|
855 |
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
|
856 |
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
|
857 |
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
|
858 |
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
|
859 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
860 |
/* (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
|
861 |
/* 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
|
862 |
/* 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
|
863 |
* (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
|
864 |
* 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
|
865 |
* ... |
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
|
866 |
* 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
|
867 |
* |
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
|
868 |
* 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
|
869 |
* 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
|
870 |
* 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
|
871 |
* 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
|
872 |
* ... |
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
|
873 |
* 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
|
874 |
* 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
|
875 |
* 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
|
876 |
* 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
|
877 |
* 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
|
878 |
*/ |
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
|
879 |
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
|
880 |
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
|
881 |
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
|
882 |
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
|
883 |
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
|
884 |
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
|
885 |
{ |
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
|
886 |
/* 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
|
887 |
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
|
888 |
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
|
889 |
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
|
890 |
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
|
891 |
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
|
892 |
{ |
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
|
893 |
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
|
894 |
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
|
895 |
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
|
896 |
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
|
897 |
} |
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
|
898 |
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
|
899 |
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
|
900 |
{ |
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
|
901 |
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
|
902 |
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
|
903 |
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
|
904 |
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
|
905 |
} |
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
|
906 |
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
|
907 |
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
|
908 |
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
|
909 |
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
|
910 |
} |
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
|
911 |
} |
c3edb882a4b2
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 |
} |
c3edb882a4b2
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\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
|
914 |
|
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
|
915 |
|
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
|
916 |
// 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
|
917 |
// 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
|
918 |
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
|
919 |
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
|
920 |
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
|
921 |
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
|
922 |
&& (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
|
923 |
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
|
924 |
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
|
925 |
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
|
926 |
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
|
927 |
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
|
928 |
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
|
929 |
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
|
930 |
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
|
931 |
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
|
932 |
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
|
933 |
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
|
934 |
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
|
935 |
} |
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
|
936 |
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
|
937 |
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
|
938 |
} |
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
|
939 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
940 |
/* (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
|
941 |
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
|
942 |
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
|
943 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
944 |
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
|
945 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
946 |
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
|
947 |
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
|
948 |
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
|
949 |
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
|
950 |
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
|
951 |
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
|
952 |
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
|
953 |
|
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
|
954 |
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
|
955 |
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
|
956 |
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
|
957 |
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
|
958 |
} |
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 |
|
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
|
960 |
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
|
961 |
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
|
962 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
963 |
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
|
964 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
965 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
966 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
967 |
/*******************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
968 |
/* 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
|
969 |
/*******************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
970 |
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
|
971 |
/* 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
|
972 |
* 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
|
973 |
* 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
|
974 |
* 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
|
975 |
* 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
|
976 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
977 |
/* 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
|
978 |
//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
|
979 |
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
|
980 |
generate_c_vardecl_c *vardecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
981 |
generate_c_sfcdecl_c *sfcdecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
982 |
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
|
983 |
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
|
984 |
|
c3edb882a4b2
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 |
/* (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
|
986 |
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
|
987 |
/* (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
|
988 |
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
|
989 |
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
|
990 |
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
|
991 |
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
|
992 |
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
|
993 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
994 |
/* (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
|
995 |
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
|
996 |
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
|
997 |
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
|
998 |
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
|
999 |
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
|
1000 |
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
|
1001 |
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
|
1002 |
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
|
1003 |
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
|
1004 |
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
|
1005 |
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
|
1006 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1007 |
/* (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
|
1008 |
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
|
1009 |
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
|
1010 |
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
|
1011 |
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
|
1012 |
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
|
1013 |
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
|
1014 |
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
|
1015 |
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
|
1016 |
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
|
1017 |
|
c3edb882a4b2
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 |
/* (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
|
1019 |
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
|
1020 |
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
|
1021 |
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
|
1022 |
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
|
1023 |
|
c3edb882a4b2
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 |
/* (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
|
1025 |
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
|
1026 |
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
|
1027 |
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
|
1028 |
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
|
1029 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1030 |
|
c3edb882a4b2
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 |
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
|
1032 |
/* (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
|
1033 |
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
|
1034 |
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
|
1035 |
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
|
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 |
/* (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
|
1039 |
/* (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
|
1040 |
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
|
1041 |
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
|
1042 |
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
|
1043 |
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
|
1044 |
|
c3edb882a4b2
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 |
/* 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
|
1046 |
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
|
1047 |
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
|
1048 |
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
|
1049 |
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
|
1050 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1051 |
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
|
1052 |
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
|
1053 |
} 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
|
1054 |
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
|
1055 |
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
|
1056 |
|
c3edb882a4b2
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 |
/* (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
|
1058 |
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
|
1059 |
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
|
1060 |
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
|
1061 |
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
|
1062 |
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
|
1063 |
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
|
1064 |
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
|
1065 |
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
|
1066 |
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
|
1067 |
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
|
1068 |
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
|
1069 |
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
|
1070 |
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
|
1071 |
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
|
1072 |
|
c3edb882a4b2
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 |
/* (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
|
1074 |
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
|
1075 |
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
|
1076 |
|
c3edb882a4b2
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 |
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
|
1078 |
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
|
1079 |
|
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
|
1080 |
/* (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
|
1081 |
/* (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
|
1082 |
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
|
1083 |
|
c3edb882a4b2
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 |
/* (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
|
1085 |
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
|
1086 |
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
|
1087 |
} |
c3edb882a4b2
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 |
/* (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
|
1090 |
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
|
1091 |
/* 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
|
1092 |
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
|
1093 |
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
|
1094 |
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
|
1095 |
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
|
1096 |
/* 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
|
1097 |
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
|
1098 |
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
|
1099 |
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
|
1100 |
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
|
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 |
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
|
1104 |
} 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
|
1105 |
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
|
1106 |
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
|
1107 |
|
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
|
1108 |
// 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
|
1109 |
// 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
|
1110 |
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
|
1111 |
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
|
1112 |
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
|
1113 |
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
|
1114 |
&& (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
|
1115 |
|
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
|
1116 |
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
|
1117 |
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
|
1118 |
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
|
1119 |
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
|
1120 |
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
|
1121 |
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
|
1122 |
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
|
1123 |
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
|
1124 |
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
|
1125 |
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
|
1126 |
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
|
1127 |
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
|
1128 |
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
|
1129 |
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
|
1130 |
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
|
1131 |
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
|
1132 |
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
|
1133 |
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
|
1134 |
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
|
1135 |
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
|
1136 |
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
|
1137 |
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
|
1138 |
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
|
1139 |
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
|
1140 |
} |
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
|
1141 |
|
c3edb882a4b2
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 |
/* (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
|
1143 |
/* 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
|
1144 |
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
|
1145 |
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
|
1146 |
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
|
1147 |
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
|
1148 |
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
|
1149 |
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
|
1150 |
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
|
1151 |
|
c3edb882a4b2
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.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
|
1153 |
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
|
1154 |
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
|
1155 |
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
|
1156 |
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
|
1157 |
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
|
1158 |
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
|
1159 |
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
|
1160 |
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
|
1161 |
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
|
1162 |
|
c3edb882a4b2
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 |
/* (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
|
1164 |
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
|
1165 |
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
|
1166 |
|
c3edb882a4b2
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 |
/* (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
|
1168 |
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
|
1169 |
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
|
1170 |
|
c3edb882a4b2
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.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
|
1172 |
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
|
1173 |
} |
c3edb882a4b2
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 |
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
|
1175 |
} |
c3edb882a4b2
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 |
|
c3edb882a4b2
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 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1178 |
/************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1179 |
/* 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
|
1180 |
/************/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1181 |
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
|
1182 |
/* 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
|
1183 |
* 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
|
1184 |
* 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
|
1185 |
* 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
|
1186 |
* 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
|
1187 |
*/ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1188 |
/* 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
|
1189 |
//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
|
1190 |
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
|
1191 |
generate_c_vardecl_c *vardecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1192 |
generate_c_sfcdecl_c *sfcdecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1193 |
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
|
1194 |
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
|
1195 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1196 |
/* (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
|
1197 |
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
|
1198 |
/* (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
|
1199 |
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
|
1200 |
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
|
1201 |
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
|
1202 |
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
|
1203 |
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
|
1204 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
1205 |
/* (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
|
1206 |
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
|
1207 |
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
|
1208 |
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
|
1209 |
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
|
1210 |
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
|
1211 |
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
|
1212 |
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
|
1213 |
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
|
1214 |
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
|
1215 |
|
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
|
1216 |
/* (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
|
1217 |
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
|
1218 |
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
|
1219 |
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
|
1220 |
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
|
1221 |
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
|
1222 |
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
|
1223 |
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
|
1224 |
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
|
1225 |
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
|
1226 |
|
c3edb882a4b2
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 |
/* (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
|
1228 |
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
|
1229 |
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
|
1230 |
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
|
1231 |
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
|
1232 |
|
c3edb882a4b2
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 |
/* (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
|
1234 |
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
|
1235 |
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
|
1236 |
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
|
1237 |
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
|
1238 |
} |
c3edb882a4b2
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 |
|
c3edb882a4b2
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 |
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
|
1241 |
/* (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
|
1242 |
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
|
1243 |
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
|
1244 |
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
|
1245 |
} |
c3edb882a4b2
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 |
/* (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
|
1248 |
/* (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
|
1249 |
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
|
1250 |
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
|
1251 |
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
|
1252 |
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
|
1253 |
|
c3edb882a4b2
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 |
/* 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
|
1255 |
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
|
1256 |
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
|
1257 |
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
|
1258 |
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
|
1259 |
|
c3edb882a4b2
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 |
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
|
1261 |
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
|
1262 |
} 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
|
1263 |
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
|
1264 |
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
|
1265 |
|
c3edb882a4b2
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 |
/* (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
|
1267 |
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
|
1268 |
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
|
1269 |
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
|
1270 |
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
|
1271 |
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
|
1272 |
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
|
1273 |
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
|
1274 |
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
|
1275 |
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
|
1276 |
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
|
1277 |
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
|
1278 |
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
|
1279 |
|
c3edb882a4b2
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 |
/* (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
|
1281 |
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
|
1282 |
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
|
1283 |
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
|
1284 |
|
c3edb882a4b2
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.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
|
1286 |
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
|
1287 |
} |
c3edb882a4b2
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 |
|
c3edb882a4b2
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 |
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
|
1290 |
/* (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
|
1291 |
/* (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
|
1292 |
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
|
1293 |
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
|
1294 |
|
c3edb882a4b2
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 |
/* (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
|
1296 |
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
|
1297 |
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
|
1298 |
} |
c3edb882a4b2
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 |
|
c3edb882a4b2
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 |
/* (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
|
1301 |
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
|
1302 |
/* 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
|
1303 |
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
|
1304 |
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
|
1305 |
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
|
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 |
/* 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
|
1308 |
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
|
1309 |
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
|
1310 |
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
|
1311 |
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
|
1312 |
|
c3edb882a4b2
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 |
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
|
1314 |
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
|
1315 |
} 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
|
1316 |
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
|
1317 |
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
|
1318 |
|
c3edb882a4b2
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 |
/* (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
|
1320 |
/* 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
|
1321 |
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
|
1322 |
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
|
1323 |
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
|
1324 |
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
|
1325 |
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
|
1326 |
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
|
1327 |
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
|
1328 |
|
c3edb882a4b2
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 |
/* (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
|
1330 |
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
|
1331 |
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
|
1332 |
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
|
1333 |
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
|
1334 |
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
|
1335 |
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
|
1336 |
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
|
1337 |
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
|
1338 |
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
|
1339 |
|
c3edb882a4b2
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 |
/* (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
|
1341 |
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
|
1342 |
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
|
1343 |
|
c3edb882a4b2
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 |
/* (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
|
1345 |
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
|
1346 |
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
|
1347 |
|
c3edb882a4b2
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 |
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
|
1349 |
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
|
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 |
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
|
1352 |
} |
70 | 1353 |
}; /* generate_c_pous_c */ |
1354 |
||
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
|
1355 |
|
70 | 1356 |
/***********************************************************************/ |
1357 |
/***********************************************************************/ |
|
1358 |
/***********************************************************************/ |
|
1359 |
/***********************************************************************/ |
|
1360 |
/***********************************************************************/ |
|
1361 |
/***********************************************************************/ |
|
1362 |
/***********************************************************************/ |
|
1363 |
/***********************************************************************/ |
|
1364 |
||
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1365 |
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
|
1366 |
private: |
860
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1367 |
stage4out_c &s4o_incl; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1368 |
|
70 | 1369 |
public: |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1370 |
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
|
1371 |
: 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
|
1372 |
}; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1373 |
|
70 | 1374 |
virtual ~generate_c_config_c(void) {} |
1375 |
||
1376 |
typedef enum { |
|
1377 |
initprotos_dt, |
|
1378 |
initdeclare_dt, |
|
1379 |
runprotos_dt, |
|
1380 |
rundeclare_dt |
|
1381 |
} declaretype_t; |
|
1382 |
||
1383 |
declaretype_t wanted_declaretype; |
|
1384 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1385 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1386 |
public: |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1387 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1388 |
/* 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
|
1389 |
/********************/ |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1390 |
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
|
1391 |
s4o.enable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1392 |
s4o_incl.enable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1393 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1394 |
} |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1395 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1396 |
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
|
1397 |
s4o.disable_output(); |
7669a8d43c11
Code cleanup (part 2): generate_typedecl_c now only prints to POUS.h !
mjsousa
parents:
856
diff
changeset
|
1398 |
s4o_incl.disable_output(); |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1399 |
return NULL; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1400 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1401 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1402 |
|
70 | 1403 |
/********************************/ |
1404 |
/* B 1.7 Configuration elements */ |
|
1405 |
/********************************/ |
|
1406 |
/* |
|
1407 |
CONFIGURATION configuration_name |
|
1408 |
optional_global_var_declarations |
|
1409 |
(resource_declaration_list | single_resource_declaration) |
|
1410 |
optional_access_declarations |
|
1411 |
optional_instance_specific_initializations |
|
1412 |
END_CONFIGURATION |
|
1413 |
*/ |
|
1414 |
/* |
|
1415 |
SYM_REF6(configuration_declaration_c, configuration_name, global_var_declarations, resource_declarations, access_declarations, instance_specific_initializations, unused) |
|
1416 |
*/ |
|
1417 |
void *visit(configuration_declaration_c *symbol) { |
|
1418 |
generate_c_vardecl_c *vardecl; |
|
1419 |
||
1420 |
/* Insert the header... */ |
|
1421 |
s4o.print("/*******************************************/\n"); |
|
1422 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
1423 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
1424 |
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
|
1425 |
|
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
|
1426 |
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
|
1427 |
// 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
|
1428 |
// 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
|
1429 |
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
|
1430 |
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
|
1431 |
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
|
1432 |
} |
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
|
1433 |
|
70 | 1434 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
257 | 1435 |
s4o.print("#include \"accessor.h\"\n\n"); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1436 |
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
|
1437 |
|
70 | 1438 |
/* (A) configuration declaration... */ |
1439 |
/* (A.1) configuration name in comment */ |
|
1440 |
s4o.print("// CONFIGURATION "); |
|
1441 |
symbol->configuration_name->accept(*this); |
|
1442 |
s4o.print("\n"); |
|
1443 |
||
1444 |
/* (A.2) Global variables */ |
|
1445 |
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
|
1446 |
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
|
1447 |
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
|
1448 |
symbol->configuration_name); |
70 | 1449 |
vardecl->print(symbol); |
1450 |
delete vardecl; |
|
1451 |
s4o.print("\n"); |
|
1452 |
||
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1453 |
/* (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
|
1454 |
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
|
1455 |
generate_c_vardecl_c::globalprototype_vf, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1456 |
generate_c_vardecl_c::global_vt, |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1457 |
symbol->configuration_name); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1458 |
vardecl->print(symbol); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1459 |
delete vardecl; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1460 |
s4o_incl.print("\n"); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1461 |
|
70 | 1462 |
/* (B) Initialisation Function */ |
1463 |
/* (B.1) Ressources initialisation protos... */ |
|
1464 |
wanted_declaretype = initprotos_dt; |
|
1465 |
symbol->resource_declarations->accept(*this); |
|
1466 |
s4o.print("\n"); |
|
1467 |
||
1468 |
/* (B.2) Initialisation function name... */ |
|
1469 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1470 |
s4o.print(FB_INIT_SUFFIX); |
|
1471 |
s4o.print("(void) {\n"); |
|
1472 |
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
|
1473 |
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
|
1474 |
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
|
1475 |
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
|
1476 |
s4o.print("retain = 0;\n"); |
70 | 1477 |
|
1478 |
/* (B.3) Global variables initializations... */ |
|
1479 |
s4o.print(s4o.indent_spaces); |
|
1480 |
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
|
1481 |
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
|
1482 |
generate_c_vardecl_c::global_vt, |
199bdfe36166
Fix code generation about __INIT_GLOBAL_LOCATED.
Conti Manuele <manuele.conti@alice.it>
parents:
522
diff
changeset
|
1483 |
symbol->configuration_name); |
70 | 1484 |
vardecl->print(symbol); |
1485 |
delete vardecl; |
|
1486 |
s4o.print("\n"); |
|
1487 |
||
1488 |
/* (B.3) Resources initializations... */ |
|
1489 |
wanted_declaretype = initdeclare_dt; |
|
1490 |
symbol->resource_declarations->accept(*this); |
|
1491 |
||
1492 |
s4o.indent_left(); |
|
1493 |
s4o.print(s4o.indent_spaces + "}\n\n"); |
|
1494 |
||
1495 |
||
1496 |
/* (C) Run Function*/ |
|
1497 |
/* (C.1) Resources run functions protos... */ |
|
1498 |
wanted_declaretype = runprotos_dt; |
|
1499 |
symbol->resource_declarations->accept(*this); |
|
1500 |
s4o.print("\n"); |
|
1501 |
||
1502 |
/* (C.2) Run function name... */ |
|
1503 |
s4o.print(s4o.indent_spaces + "void config"); |
|
1504 |
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
|
1505 |
s4o.print("(unsigned long tick) {\n"); |
70 | 1506 |
s4o.indent_right(); |
1507 |
||
1508 |
/* (C.3) Resources initializations... */ |
|
1509 |
wanted_declaretype = rundeclare_dt; |
|
1510 |
symbol->resource_declarations->accept(*this); |
|
1511 |
||
1512 |
/* (C.3) Close Public Function body */ |
|
1513 |
s4o.indent_left(); |
|
1514 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
1515 |
||
1516 |
return NULL; |
|
1517 |
} |
|
1518 |
||
1519 |
void *visit(resource_declaration_c *symbol) { |
|
1520 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1521 |
s4o.print(s4o.indent_spaces + "void "); |
|
1522 |
symbol->resource_name->accept(*this); |
|
1523 |
if (wanted_declaretype == initprotos_dt) { |
|
1524 |
s4o.print(FB_INIT_SUFFIX); |
|
1525 |
s4o.print("(void);\n"); |
|
1526 |
} |
|
1527 |
else { |
|
1528 |
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
|
1529 |
s4o.print("(unsigned long tick);\n"); |
70 | 1530 |
} |
1531 |
} |
|
1532 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1533 |
s4o.print(s4o.indent_spaces); |
|
1534 |
symbol->resource_name->accept(*this); |
|
1535 |
if (wanted_declaretype == initdeclare_dt) { |
|
1536 |
s4o.print(FB_INIT_SUFFIX); |
|
1537 |
s4o.print("();\n"); |
|
1538 |
} |
|
1539 |
else { |
|
1540 |
s4o.print(FB_RUN_SUFFIX); |
|
1541 |
s4o.print("(tick);\n"); |
|
1542 |
} |
|
1543 |
} |
|
1544 |
return NULL; |
|
1545 |
} |
|
1546 |
||
1547 |
void *visit(single_resource_declaration_c *symbol) { |
|
1548 |
if (wanted_declaretype == initprotos_dt || wanted_declaretype == runprotos_dt) { |
|
1549 |
s4o.print(s4o.indent_spaces + "void RESOURCE"); |
|
1550 |
if (wanted_declaretype == initprotos_dt) { |
|
1551 |
s4o.print(FB_INIT_SUFFIX); |
|
1552 |
s4o.print("(void);\n"); |
|
1553 |
} |
|
1554 |
else { |
|
1555 |
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
|
1556 |
s4o.print("(unsigned long tick);\n"); |
70 | 1557 |
} |
1558 |
} |
|
1559 |
if (wanted_declaretype == initdeclare_dt || wanted_declaretype == rundeclare_dt) { |
|
1560 |
s4o.print(s4o.indent_spaces + "RESOURCE"); |
|
1561 |
if (wanted_declaretype == initdeclare_dt) { |
|
1562 |
s4o.print(FB_INIT_SUFFIX); |
|
1563 |
s4o.print("();\n"); |
|
1564 |
} |
|
1565 |
else { |
|
1566 |
s4o.print(FB_RUN_SUFFIX); |
|
1567 |
s4o.print("(tick);\n"); |
|
1568 |
} |
|
1569 |
} |
|
1570 |
return NULL; |
|
1571 |
} |
|
1572 |
||
1573 |
}; |
|
1574 |
||
1575 |
/***********************************************************************/ |
|
1576 |
/***********************************************************************/ |
|
1577 |
/***********************************************************************/ |
|
1578 |
/***********************************************************************/ |
|
1579 |
/***********************************************************************/ |
|
1580 |
/***********************************************************************/ |
|
1581 |
/***********************************************************************/ |
|
1582 |
/***********************************************************************/ |
|
1583 |
||
1584 |
||
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
1585 |
class generate_c_resources_c: public generate_c_base_and_typeid_c { |
70 | 1586 |
|
1587 |
search_var_instance_decl_c *search_config_instance; |
|
1588 |
search_var_instance_decl_c *search_resource_instance; |
|
1589 |
||
1590 |
private: |
|
1591 |
/* 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
|
1592 |
symbol_c *current_configuration; |
70 | 1593 |
symbol_c *current_resource_name; |
184 | 1594 |
symbol_c *current_task_name; |
70 | 1595 |
symbol_c *current_global_vars; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1596 |
bool configuration_name; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1597 |
stage4out_c *s4o_ptr; |
70 | 1598 |
|
1599 |
public: |
|
1039
52f63e622604
fix wrong common_ticktime if task interval is greater than 4.3 seconds
andrej.skvortzov@gmail.com
parents:
1021
diff
changeset
|
1600 |
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
|
1601 |
: 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
|
1602 |
current_configuration = config_scope; |
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
1603 |
search_config_instance = new search_var_instance_decl_c(config_scope); |
70 | 1604 |
search_resource_instance = new search_var_instance_decl_c(resource_scope); |
1605 |
common_ticktime = time; |
|
1606 |
current_resource_name = NULL; |
|
184 | 1607 |
current_task_name = NULL; |
70 | 1608 |
current_global_vars = NULL; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1609 |
configuration_name = 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
|
1610 |
generate_c_resources_c::s4o_ptr = s4o_ptr; |
70 | 1611 |
}; |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1612 |
|
70 | 1613 |
virtual ~generate_c_resources_c(void) { |
1614 |
delete search_config_instance; |
|
1615 |
delete search_resource_instance; |
|
1616 |
} |
|
1617 |
||
1618 |
typedef enum { |
|
1619 |
declare_dt, |
|
1620 |
init_dt, |
|
1621 |
run_dt |
|
1622 |
} declaretype_t; |
|
1623 |
||
1624 |
declaretype_t wanted_declaretype; |
|
1625 |
||
594
c8092e909886
Clean up code (remove parsing of integers in stage 4).
Mario de Sousa <msousa@fe.up.pt>
parents:
592
diff
changeset
|
1626 |
unsigned long long common_ticktime; |
70 | 1627 |
|
1628 |
const char *current_program_name; |
|
1629 |
||
1630 |
typedef enum { |
|
1631 |
assign_at, |
|
1632 |
send_at |
|
1633 |
} assigntype_t; |
|
1634 |
||
1635 |
assigntype_t wanted_assigntype; |
|
1636 |
||
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
|
1637 |
/* 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
|
1638 |
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
|
1639 |
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
|
1640 |
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
|
1641 |
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
|
1642 |
|
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
|
1643 |
/* 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
|
1644 |
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
|
1645 |
|
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
|
1646 |
void *print_retain(void) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1647 |
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
|
1648 |
switch (current_varqualifier) { |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1649 |
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
|
1650 |
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
|
1651 |
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
|
1652 |
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
|
1653 |
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
|
1654 |
break; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1655 |
default: |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1656 |
s4o.print("retain"); |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1657 |
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
|
1658 |
} |
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
|
1659 |
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
|
1660 |
} |
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
|
1661 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1662 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1663 |
/* B.1 - Common elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1664 |
/*************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1665 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1666 |
/* 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
|
1667 |
/*******************************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1668 |
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
|
1669 |
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
|
1670 |
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
|
1671 |
return NULL; |
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1672 |
} |
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1673 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1674 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1675 |
/* 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
|
1676 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1677 |
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
|
1678 |
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
|
1679 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
1680 |
|
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
|
1681 |
/******************************************/ |
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
|
1682 |
/* 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
|
1683 |
/******************************************/ |
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
|
1684 |
|
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
|
1685 |
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
|
1686 |
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
|
1687 |
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
|
1688 |
} |
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
|
1689 |
|
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
|
1690 |
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
|
1691 |
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
|
1692 |
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
|
1693 |
} |
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
|
1694 |
|
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
|
1695 |
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
|
1696 |
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
|
1697 |
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
|
1698 |
} |
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
|
1699 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1700 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1701 |
/* B 1.7 Configuration elements */ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1702 |
/********************************/ |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1703 |
|
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1704 |
void *visit(configuration_declaration_c *symbol) { |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1705 |
return symbol->configuration_name->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1706 |
} |
70 | 1707 |
|
1708 |
/* |
|
1709 |
RESOURCE resource_name ON resource_type_name |
|
1710 |
optional_global_var_declarations |
|
1711 |
single_resource_declaration |
|
1712 |
END_RESOURCE |
|
1713 |
*/ |
|
1714 |
// SYM_REF4(resource_declaration_c, resource_name, resource_type_name, global_var_declarations, resource_declaration) |
|
1715 |
void *visit(resource_declaration_c *symbol) { |
|
1716 |
current_resource_name = symbol->resource_name; |
|
1717 |
current_global_vars = symbol->global_var_declarations; |
|
1718 |
||
1719 |
symbol->resource_declaration->accept(*this); |
|
1720 |
||
1721 |
current_resource_name = NULL; |
|
1722 |
current_global_vars = NULL; |
|
1723 |
return NULL; |
|
1724 |
} |
|
1725 |
||
1726 |
/* task_configuration_list program_configuration_list */ |
|
1727 |
// SYM_REF2(single_resource_declaration_c, task_configuration_list, program_configuration_list) |
|
1728 |
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
|
1729 |
bool single_resource = current_resource_name == NULL; |
70 | 1730 |
if (single_resource) |
1731 |
current_resource_name = new identifier_c("RESOURCE"); |
|
1732 |
generate_c_vardecl_c *vardecl; |
|
1733 |
||
1734 |
/* Insert the header... */ |
|
1735 |
s4o.print("/*******************************************/\n"); |
|
1736 |
s4o.print("/* FILE GENERATED BY iec2c */\n"); |
|
1737 |
s4o.print("/* Editing this file is not recommended... */\n"); |
|
1738 |
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
|
1739 |
|
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
|
1740 |
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
|
1741 |
// 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
|
1742 |
// 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
|
1743 |
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
|
1744 |
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
|
1745 |
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
|
1746 |
} |
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
|
1747 |
|
70 | 1748 |
s4o.print("#include \"iec_std_lib.h\"\n\n"); |
1749 |
||
1750 |
/* (A) resource declaration... */ |
|
1751 |
/* (A.1) resource name in comment */ |
|
1752 |
s4o.print("// RESOURCE "); |
|
1753 |
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
|
1754 |
s4o.print("\n\n"); |
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
1755 |
|
237 | 1756 |
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
|
1757 |
|
396
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1758 |
s4o.print("#include \"accessor.h\"\n"); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
1759 |
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
|
1760 |
s4o.print("#include \""); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1761 |
configuration_name = true; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1762 |
current_configuration->accept(*this); |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1763 |
configuration_name = false; |
155560bfe837
Fixing bug with external variables refering to global variables defined in configurations
laurent
parents:
392
diff
changeset
|
1764 |
s4o.print(".h\"\n"); |
217
f5dfadf5de54
Adding support for declare, init, get and set macros
laurent
parents:
210
diff
changeset
|
1765 |
|
70 | 1766 |
/* (A.2) Global variables... */ |
1767 |
if (current_global_vars != NULL) { |
|
1768 |
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
|
1769 |
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
|
1770 |
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
|
1771 |
current_resource_name); |
70 | 1772 |
vardecl->print(current_global_vars); |
1773 |
delete vardecl; |
|
120
74640e3c7f53
Bug with D and L action qualifier and timing management in SFC generated fixed
lbessard
parents:
112
diff
changeset
|
1774 |
s4o.print("\n"); |
70 | 1775 |
} |
1776 |
||
1777 |
/* (A.3) POUs inclusion */ |
|
1778 |
s4o.print("#include \"POUS.c\"\n\n"); |
|
1779 |
||
184 | 1780 |
wanted_declaretype = declare_dt; |
1781 |
||
70 | 1782 |
/* (A.4) Resource programs declaration... */ |
184 | 1783 |
symbol->task_configuration_list->accept(*this); |
1784 |
||
1785 |
/* (A.5) Resource programs declaration... */ |
|
70 | 1786 |
symbol->program_configuration_list->accept(*this); |
184 | 1787 |
|
70 | 1788 |
s4o.print("\n"); |
1789 |
||
1790 |
/* (B) resource initialisation function... */ |
|
1791 |
/* (B.1) initialisation function name... */ |
|
1792 |
s4o.print("void "); |
|
1793 |
current_resource_name->accept(*this); |
|
1794 |
s4o.print(FB_INIT_SUFFIX); |
|
1795 |
s4o.print("(void) {\n"); |
|
1796 |
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
|
1797 |
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
|
1798 |
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
|
1799 |
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
|
1800 |
s4o.print("retain = 0;\n"); |
70 | 1801 |
|
1802 |
/* (B.2) Global variables initialisations... */ |
|
1803 |
if (current_global_vars != NULL) { |
|
1804 |
s4o.print(s4o.indent_spaces); |
|
1805 |
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
|
1806 |
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
|
1807 |
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
|
1808 |
current_resource_name); |
70 | 1809 |
vardecl->print(current_global_vars); |
1810 |
delete vardecl; |
|
1811 |
} |
|
1812 |
s4o.print("\n"); |
|
1813 |
||
1814 |
wanted_declaretype = init_dt; |
|
184 | 1815 |
|
1816 |
/* (B.3) Tasks initialisations... */ |
|
1817 |
symbol->task_configuration_list->accept(*this); |
|
1818 |
||
1819 |
/* (B.4) Resource programs initialisations... */ |
|
70 | 1820 |
symbol->program_configuration_list->accept(*this); |
1821 |
||
1822 |
s4o.indent_left(); |
|
1823 |
s4o.print("}\n\n"); |
|
1824 |
||
1825 |
/* (C) Resource run function... */ |
|
1826 |
/* (C.1) Run function name... */ |
|
1827 |
s4o.print("void "); |
|
1828 |
current_resource_name->accept(*this); |
|
1829 |
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
|
1830 |
s4o.print("(unsigned long tick) {\n"); |
70 | 1831 |
s4o.indent_right(); |
1832 |
||
184 | 1833 |
wanted_declaretype = run_dt; |
1834 |
||
70 | 1835 |
/* (C.2) Task management... */ |
1836 |
symbol->task_configuration_list->accept(*this); |
|
1837 |
||
1838 |
/* (C.3) Program run declaration... */ |
|
1839 |
symbol->program_configuration_list->accept(*this); |
|
1840 |
||
1841 |
s4o.indent_left(); |
|
1842 |
s4o.print("}\n\n"); |
|
1843 |
||
1844 |
if (single_resource) { |
|
1845 |
delete current_resource_name; |
|
1846 |
current_resource_name = NULL; |
|
1847 |
} |
|
1848 |
return NULL; |
|
1849 |
} |
|
1850 |
||
1851 |
/* PROGRAM [RETAIN | NON_RETAIN] program_name [WITH task_name] ':' program_type_name ['(' prog_conf_elements ')'] */ |
|
1852 |
//SYM_REF6(program_configuration_c, retain_option, program_name, task_name, program_type_name, prog_conf_elements, unused) |
|
1853 |
void *visit(program_configuration_c *symbol) { |
|
184 | 1854 |
switch (wanted_declaretype) { |
1855 |
case declare_dt: |
|
70 | 1856 |
s4o.print(s4o.indent_spaces); |
184 | 1857 |
symbol->program_type_name->accept(*this); |
1858 |
s4o.print(" "); |
|
1859 |
current_resource_name->accept(*this); |
|
1860 |
s4o.print("__"); |
|
1861 |
symbol->program_name->accept(*this); |
|
1862 |
s4o.print(";\n#define "); |
|
1863 |
symbol->program_name->accept(*this); |
|
1864 |
s4o.print(" "); |
|
1865 |
current_resource_name->accept(*this); |
|
1866 |
s4o.print("__"); |
|
1867 |
symbol->program_name->accept(*this); |
|
1868 |
s4o.print("\n"); |
|
1869 |
break; |
|
1870 |
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
|
1871 |
if (symbol->retain_option != NULL) |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
1872 |
symbol->retain_option->accept(*this); |
184 | 1873 |
s4o.print(s4o.indent_spaces); |
1874 |
symbol->program_type_name->accept(*this); |
|
1875 |
s4o.print(FB_INIT_SUFFIX); |
|
1876 |
s4o.print("(&"); |
|
1877 |
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
|
1878 |
print_retain(); |
184 | 1879 |
s4o.print(");\n"); |
1880 |
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
|
1881 |
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
|
1882 |
{ 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
|
1883 |
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
|
1884 |
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
|
1885 |
} |
184 | 1886 |
if (symbol->task_name != NULL) { |
1887 |
s4o.print(s4o.indent_spaces); |
|
1888 |
s4o.print("if ("); |
|
1889 |
symbol->task_name->accept(*this); |
|
1890 |
s4o.print(") {\n"); |
|
1891 |
s4o.indent_right(); |
|
1892 |
} |
|
70 | 1893 |
|
184 | 1894 |
wanted_assigntype = assign_at; |
1895 |
if (symbol->prog_conf_elements != NULL) |
|
1896 |
symbol->prog_conf_elements->accept(*this); |
|
1897 |
||
1898 |
s4o.print(s4o.indent_spaces); |
|
1899 |
symbol->program_type_name->accept(*this); |
|
1900 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1901 |
s4o.print("(&"); |
|
1902 |
symbol->program_name->accept(*this); |
|
1903 |
s4o.print(");\n"); |
|
1904 |
||
1905 |
wanted_assigntype = send_at; |
|
1906 |
if (symbol->prog_conf_elements != NULL) |
|
1907 |
symbol->prog_conf_elements->accept(*this); |
|
1908 |
||
1909 |
if (symbol->task_name != NULL) { |
|
1910 |
s4o.indent_left(); |
|
1911 |
s4o.print(s4o.indent_spaces + "}\n"); |
|
1912 |
} |
|
1913 |
break; |
|
1914 |
default: |
|
1915 |
break; |
|
70 | 1916 |
} |
1917 |
return NULL; |
|
1918 |
} |
|
1919 |
||
1920 |
/* TASK task_name task_initialization */ |
|
1921 |
//SYM_REF2(task_configuration_c, task_name, task_initialization) |
|
1922 |
void *visit(task_configuration_c *symbol) { |
|
184 | 1923 |
current_task_name = symbol->task_name; |
1924 |
switch (wanted_declaretype) { |
|
1925 |
case declare_dt: |
|
1926 |
s4o.print(s4o.indent_spaces + "BOOL "); |
|
1927 |
current_task_name->accept(*this); |
|
1928 |
s4o.print(";\n"); |
|
1929 |
symbol->task_initialization->accept(*this); |
|
1930 |
break; |
|
1931 |
case init_dt: |
|
1932 |
s4o.print(s4o.indent_spaces); |
|
1933 |
current_task_name->accept(*this); |
|
1934 |
s4o.print(" = __BOOL_LITERAL(FALSE);\n"); |
|
1935 |
symbol->task_initialization->accept(*this); |
|
1936 |
break; |
|
1937 |
case run_dt: |
|
1938 |
symbol->task_initialization->accept(*this); |
|
1939 |
break; |
|
1940 |
default: |
|
1941 |
break; |
|
1942 |
} |
|
1943 |
current_task_name = NULL; |
|
70 | 1944 |
return NULL; |
1945 |
} |
|
1946 |
||
1947 |
/* '(' [SINGLE ASSIGN data_source ','] [INTERVAL ASSIGN data_source ','] PRIORITY ASSIGN integer ')' */ |
|
1948 |
//SYM_REF4(task_initialization_c, single_data_source, interval_data_source, priority_data_source, unused) |
|
1949 |
void *visit(task_initialization_c *symbol) { |
|
184 | 1950 |
switch (wanted_declaretype) { |
1951 |
case declare_dt: |
|
1952 |
if (symbol->single_data_source != NULL) { |
|
1953 |
s4o.print(s4o.indent_spaces + "R_TRIG "); |
|
1954 |
current_task_name->accept(*this); |
|
1955 |
s4o.print("_R_TRIG;\n"); |
|
1956 |
} |
|
1957 |
break; |
|
1958 |
case init_dt: |
|
1959 |
if (symbol->single_data_source != NULL) { |
|
1960 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
|
1961 |
s4o.print(FB_INIT_SUFFIX); |
|
1962 |
s4o.print("(&"); |
|
1963 |
current_task_name->accept(*this); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
1964 |
s4o.print("_R_TRIG, retain);\n"); |
184 | 1965 |
} |
1966 |
break; |
|
1967 |
case run_dt: |
|
1968 |
if (symbol->single_data_source != NULL) { |
|
1969 |
symbol_c *config_var_decl = NULL; |
|
1970 |
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
|
1971 |
s4o.print(s4o.indent_spaces + "{"); |
184 | 1972 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->single_data_source))->global_var_name; |
1973 |
res_var_decl = search_resource_instance->get_decl(current_var_reference); |
|
1974 |
if (res_var_decl == NULL) { |
|
1975 |
config_var_decl = search_config_instance->get_decl(current_var_reference); |
|
1976 |
if (config_var_decl == NULL) |
|
1977 |
ERROR; |
|
1978 |
config_var_decl->accept(*this); |
|
1979 |
} |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
1980 |
else { |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1981 |
res_var_decl->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
1982 |
} |
392
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1983 |
s4o.print("* "); |
9b88b8b6bccd
Fixing generated code for global variables. Adding support for defining global variables with complex type
laurent
parents:
381
diff
changeset
|
1984 |
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
|
1985 |
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
|
1986 |
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
|
1987 |
s4o.print("();"); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
1988 |
s4o.print(SET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
1989 |
s4o.print("("); |
184 | 1990 |
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
|
1991 |
s4o.print("_R_TRIG.,CLK,, *"); |
184 | 1992 |
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
|
1993 |
s4o.print(");}\n"); |
184 | 1994 |
s4o.print(s4o.indent_spaces + "R_TRIG"); |
1995 |
s4o.print(FB_FUNCTION_SUFFIX); |
|
1996 |
s4o.print("(&"); |
|
1997 |
current_task_name->accept(*this); |
|
1998 |
s4o.print("_R_TRIG);\n"); |
|
1999 |
s4o.print(s4o.indent_spaces); |
|
2000 |
current_task_name->accept(*this); |
|
2001 |
s4o.print(" = "); |
|
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2002 |
s4o.print(GET_VAR); |
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2003 |
s4o.print("("); |
184 | 2004 |
current_task_name->accept(*this); |
248
9cb18ec14fa2
Task single parameter code generation broken after addition of accessors fixed.
laurent
parents:
244
diff
changeset
|
2005 |
s4o.print("_R_TRIG.Q)"); |
184 | 2006 |
} |
2007 |
else { |
|
2008 |
s4o.print(s4o.indent_spaces); |
|
2009 |
current_task_name->accept(*this); |
|
2010 |
s4o.print(" = "); |
|
2011 |
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
|
2012 |
unsigned long long int time = calculate_time(symbol->interval_data_source); |
184 | 2013 |
if (time != 0) { |
2014 |
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
|
2015 |
s4o.print(time / common_ticktime); |
184 | 2016 |
s4o.print(")"); |
2017 |
} |
|
2018 |
else |
|
2019 |
s4o.print("1"); |
|
2020 |
} |
|
2021 |
else |
|
2022 |
s4o.print("1"); |
|
2023 |
} |
|
2024 |
s4o.print(";\n"); |
|
2025 |
break; |
|
2026 |
default: |
|
2027 |
break; |
|
70 | 2028 |
} |
2029 |
return NULL; |
|
2030 |
} |
|
2031 |
||
2032 |
/* any_symbolic_variable ASSIGN prog_data_source */ |
|
2033 |
//SYM_REF2(prog_cnxn_assign_c, symbolic_variable, prog_data_source) |
|
2034 |
void *visit(prog_cnxn_assign_c *symbol) { |
|
2035 |
if (wanted_assigntype == assign_at) { |
|
2036 |
symbol_c *var_decl; |
|
2037 |
unsigned int vartype = 0; |
|
2038 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->prog_data_source))->global_var_name; |
|
2039 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2040 |
if (var_decl == NULL) { |
|
2041 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2042 |
if (var_decl == NULL) |
|
2043 |
ERROR; |
|
2044 |
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
|
2045 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2046 |
} |
2047 |
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
|
2048 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2049 |
|
2050 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2051 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2052 |
s4o.print(" *"); |
70 | 2053 |
symbol->prog_data_source->accept(*this); |
2054 |
s4o.print("; "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2055 |
s4o.printupper(current_program_name); |
70 | 2056 |
s4o.print("."); |
2057 |
symbol->symbolic_variable->accept(*this); |
|
2058 |
s4o.print(" = "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2059 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2060 |
s4o.print("*"); |
2061 |
symbol->prog_data_source->accept(*this); |
|
2062 |
s4o.print(";}\n"); |
|
2063 |
} |
|
2064 |
return NULL; |
|
2065 |
} |
|
2066 |
||
2067 |
/* any_symbolic_variable SENDTO data_sink */ |
|
2068 |
//SYM_REF2(prog_cnxn_sendto_c, symbolic_variable, data_sink) |
|
2069 |
void *visit(prog_cnxn_sendto_c *symbol) { |
|
2070 |
if (wanted_assigntype == send_at) { |
|
2071 |
symbol_c *var_decl; |
|
2072 |
unsigned int vartype = 0; |
|
2073 |
symbol_c *current_var_reference = ((global_var_reference_c *)(symbol->data_sink))->global_var_name; |
|
2074 |
var_decl = search_resource_instance->get_decl(current_var_reference); |
|
2075 |
if (var_decl == NULL) { |
|
2076 |
var_decl = search_config_instance->get_decl(current_var_reference); |
|
2077 |
if (var_decl == NULL) |
|
2078 |
ERROR; |
|
2079 |
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
|
2080 |
vartype = search_config_instance->get_vartype(current_var_reference); |
70 | 2081 |
} |
2082 |
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
|
2083 |
vartype = search_resource_instance->get_vartype(current_var_reference); |
70 | 2084 |
|
2085 |
s4o.print(s4o.indent_spaces + "{extern "); |
|
2086 |
var_decl->accept(*this); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2087 |
s4o.print(" *"); |
70 | 2088 |
symbol->data_sink->accept(*this); |
2089 |
s4o.print("; "); |
|
506
2b4e69c7ff8b
Fix typo in comparison expression.
Mario de Sousa <msousa@fe.up.pt>
parents:
498
diff
changeset
|
2090 |
if (vartype == search_var_instance_decl_c::global_vt) |
70 | 2091 |
s4o.print("*"); |
2092 |
symbol->data_sink->accept(*this); |
|
2093 |
s4o.print(" = "); |
|
202
da1a8186f86f
Initial (very rough) version of semantic checker (stage3)
Catarina Boucinha <ccb@fe.up.pt>
parents:
189
diff
changeset
|
2094 |
s4o.printupper(current_program_name); |
70 | 2095 |
s4o.print("."); |
2096 |
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
|
2097 |
s4o.print(";};\n"); |
70 | 2098 |
} |
2099 |
return NULL; |
|
2100 |
} |
|
2101 |
||
2102 |
}; |
|
2103 |
||
2104 |
/***********************************************************************/ |
|
2105 |
/***********************************************************************/ |
|
2106 |
/***********************************************************************/ |
|
2107 |
/***********************************************************************/ |
|
2108 |
/***********************************************************************/ |
|
2109 |
/***********************************************************************/ |
|
2110 |
/***********************************************************************/ |
|
2111 |
/***********************************************************************/ |
|
2112 |
||
2113 |
class generate_c_c: public iterator_visitor_c { |
|
2114 |
protected: |
|
913
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2115 |
stage4out_c &s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2116 |
stage4out_c pous_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2117 |
stage4out_c pous_incl_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2118 |
stage4out_c located_variables_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2119 |
stage4out_c variables_s4o; |
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2120 |
|
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2121 |
generate_c_typedecl_c generate_c_typedecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2122 |
generate_c_implicit_typedecl_c generate_c_implicit_typedecl; |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2123 |
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
|
2124 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2125 |
symbol_c *current_configuration; |
70 | 2126 |
|
2127 |
const char *current_name; |
|
2128 |
const char *current_builddir; |
|
2129 |
||
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2130 |
bool allow_output; |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2131 |
|
237 | 2132 |
unsigned long long common_ticktime; |
70 | 2133 |
|
2134 |
public: |
|
2135 |
generate_c_c(stage4out_c *s4o_ptr, const char *builddir): |
|
2136 |
s4o(*s4o_ptr), |
|
2137 |
pous_s4o(builddir, "POUS", "c"), |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2138 |
pous_incl_s4o(builddir, "POUS", "h"), |
70 | 2139 |
located_variables_s4o(builddir, "LOCATED_VARIABLES","h"), |
112 | 2140 |
variables_s4o(builddir, "VARIABLES","csv"), |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2141 |
generate_c_typedecl (&pous_incl_s4o), |
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2142 |
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
|
2143 |
{ |
70 | 2144 |
current_builddir = builddir; |
2145 |
current_configuration = NULL; |
|
908
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2146 |
allow_output = true; |
70 | 2147 |
} |
2148 |
||
2149 |
~generate_c_c(void) {} |
|
2150 |
||
267
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2151 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2152 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2153 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2154 |
/* 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
|
2155 |
/********************/ |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2156 |
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
|
2157 |
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
|
2158 |
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
|
2159 |
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
|
2160 |
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
|
2161 |
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
|
2162 |
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
|
2163 |
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
|
2164 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2165 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2166 |
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
|
2167 |
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
|
2168 |
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
|
2169 |
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
|
2170 |
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
|
2171 |
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
|
2172 |
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
|
2173 |
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
|
2174 |
} |
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2175 |
|
0a1204bcc9af
starting to add proper header file with declaration of standard functions
Mario de Sousa <msousa@fe.up.pt>
parents:
262
diff
changeset
|
2176 |
|
70 | 2177 |
/***************************/ |
2178 |
/* B 0 - Programming Model */ |
|
2179 |
/***************************/ |
|
2180 |
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
|
2181 |
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
|
2182 |
|
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
|
2183 |
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
|
2184 |
// 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
|
2185 |
// 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
|
2186 |
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
|
2187 |
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
|
2188 |
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
|
2189 |
} |
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
|
2190 |
|
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
|
2191 |
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
|
2192 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2193 |
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
|
2194 |
symbol->get_element(i)->accept(*this); |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2195 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2196 |
|
121
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2197 |
pous_incl_s4o.print("#endif //__POUS_H\n"); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2198 |
|
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2199 |
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
|
2200 |
generate_var_list.generate_programs(symbol); |
9e8ce092e169
Adding support for POU struct definition in POUS.h
lbessard
parents:
120
diff
changeset
|
2201 |
generate_var_list.generate_variables(symbol); |
397
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2202 |
variables_s4o.print("\n// Ticktime\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2203 |
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
|
2204 |
variables_s4o.print("\n"); |
85151b2f35ca
Adding Common_Ticktime to informations printed in VARIABLES.csv file
laurent
parents:
396
diff
changeset
|
2205 |
|
98 | 2206 |
generate_location_list_c generate_location_list(&located_variables_s4o); |
2207 |
symbol->accept(generate_location_list); |
|
70 | 2208 |
return NULL; |
2209 |
} |
|
2210 |
||
2211 |
/*************************/ |
|
2212 |
/* B.1 - Common elements */ |
|
2213 |
/*************************/ |
|
2214 |
/*******************************************/ |
|
2215 |
/* B 1.1 - Letters, digits and identifiers */ |
|
2216 |
/*******************************************/ |
|
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
|
2217 |
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
|
2218 |
/* 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
|
2219 |
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
|
2220 |
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
|
2221 |
|
70 | 2222 |
|
98 | 2223 |
/********************************/ |
2224 |
/* B 1.3.3 - Derived data types */ |
|
2225 |
/********************************/ |
|
2226 |
/* 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
|
2227 |
// 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
|
2228 |
|
1c74da17cb61
Implicitly defined array datatypes use new naming method (greatly simplifies stage 4 code).
mjsousa
parents:
908
diff
changeset
|
2229 |
/* 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
|
2230 |
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
|
2231 |
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
|
2232 |
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
|
2233 |
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
|
2234 |
} |
98 | 2235 |
return NULL; |
2236 |
} |
|
2237 |
||
70 | 2238 |
/**************************************/ |
2239 |
/* B.1.5 - Program organization units */ |
|
2240 |
/**************************************/ |
|
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
|
2241 |
/* 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
|
2242 |
* 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
|
2243 |
*/ |
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
|
2244 |
#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
|
2245 |
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
|
2246 |
if (generate_pou_filepairs__) {\ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2247 |
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
|
2248 |
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
|
2249 |
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
|
2250 |
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
|
2251 |
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
|
2252 |
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
|
2253 |
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
|
2254 |
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
|
2255 |
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
|
2256 |
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
|
2257 |
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
|
2258 |
/* 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
|
2259 |
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
|
2260 |
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
|
2261 |
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
|
2262 |
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
|
2263 |
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
|
2264 |
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
|
2265 |
} else {\ |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2266 |
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
|
2267 |
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
|
2268 |
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
|
2269 |
} |
9e8e1ba5ca46
Add option to place each POU in a distinct .c and .h file pair.
mjsousa
parents:
907
diff
changeset
|
2270 |
|
70 | 2271 |
/***********************/ |
2272 |
/* 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
|
2273 |
/***********************/ |
70 | 2274 |
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
|
2275 |
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
|
2276 |
return NULL; |
70 | 2277 |
} |
2278 |
||
2279 |
/*****************************/ |
|
2280 |
/* B 1.5.2 - Function Blocks */ |
|
2281 |
/*****************************/ |
|
2282 |
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
|
2283 |
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
|
2284 |
return NULL; |
70 | 2285 |
} |
2286 |
||
2287 |
/**********************/ |
|
2288 |
/* B 1.5.3 - Programs */ |
|
2289 |
/**********************/ |
|
2290 |
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
|
2291 |
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
|
2292 |
return NULL; |
70 | 2293 |
} |
2294 |
||
2295 |
||
2296 |
/********************************/ |
|
2297 |
/* B 1.7 Configuration elements */ |
|
2298 |
/********************************/ |
|
2299 |
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
|
2300 |
if (symbol->global_var_declarations != NULL) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2301 |
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
|
2302 |
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
|
2303 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2304 |
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
|
2305 |
/* 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
|
2306 |
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
|
2307 |
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
|
2308 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2309 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2310 |
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
|
2311 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2312 |
{ |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2313 |
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
|
2314 |
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
|
2315 |
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
|
2316 |
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
|
2317 |
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
|
2318 |
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
|
2319 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2320 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2321 |
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
|
2322 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2323 |
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
|
2324 |
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
|
2325 |
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
|
2326 |
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
|
2327 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2328 |
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
|
2329 |
config_s4o.print_long_long_integer(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
|
2330 |
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
|
2331 |
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
|
2332 |
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
|
2333 |
config_s4o.print("; /*tick*/\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
|
2334 |
} |
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2335 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2336 |
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
|
2337 |
|
c3edb882a4b2
code re-organisation. Preparing for the changes to come in the next commit (one C file for each POU)
mjsousa
parents:
906
diff
changeset
|
2338 |
current_configuration = NULL; |
377
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2339 |
return NULL; |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2340 |
} |
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2341 |
|
60b012b7793f
Adding support for compiling direct array specification inside variable declaration
laurent
parents:
355
diff
changeset
|
2342 |
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
|
2343 |
if (symbol->global_var_declarations != NULL) |
945
477393b00f95
Add support for relaxed datatype model for array datatypes.
mjsousa
parents:
933
diff
changeset
|
2344 |
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
|
2345 |
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
|
2346 |
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
|
2347 |
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
|
2348 |
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
|
2349 |
return NULL; |
70 | 2350 |
} |
2351 |
||
2352 |
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
|
2353 |
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
|
2354 |
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
|
2355 |
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
|
2356 |
return NULL; |
70 | 2357 |
} |
2358 |
||
2359 |
}; |
|
2360 |
||
2361 |
/***********************************************************************/ |
|
2362 |
/***********************************************************************/ |
|
2363 |
/***********************************************************************/ |
|
2364 |
/***********************************************************************/ |
|
2365 |
/***********************************************************************/ |
|
2366 |
/***********************************************************************/ |
|
2367 |
/***********************************************************************/ |
|
2368 |
/***********************************************************************/ |
|
2369 |
||
2370 |
||
2371 |
||
2372 |
||
2373 |
visitor_c *new_code_generator(stage4out_c *s4o, const char *builddir) {return new generate_c_c(s4o, builddir);} |
|
2374 |
void delete_code_generator(visitor_c *code_generator) {delete code_generator;} |
|
2375 |
||
2376 |