Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2 | Rev 11 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* expression.h */ |
1 | /* expression.h */ |
2 | /* contains the type declarations for expression handling information */ |
2 | /* contains the type declarations for expression handling information */ |
3 | /* |
3 | /* |
4 | * $Id: expression.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $ |
4 | * $Id: expression.c,v 1.1.1.1 2003/11/04 23:34:57 mjames Exp $ |
5 | * |
5 | * |
6 | * $Log: expression.c,v $ |
6 | * $Log: expression.c,v $ |
7 | * Revision 1.1.1.1 2003/11/04 23:34:57 mjames |
7 | * Revision 1.1.1.1 2003/11/04 23:34:57 mjames |
8 | * Imported into local repositrory |
8 | * Imported into local repositrory |
9 | * |
9 | * |
Line 50... | Line 50... | ||
50 | * Mike put it here |
50 | * Mike put it here |
51 | * |
51 | * |
52 | * |
52 | * |
53 | * Revision 1.20 2000/10/12 15:32:18 15:32:18 mjames (Mike James) |
53 | * Revision 1.20 2000/10/12 15:32:18 15:32:18 mjames (Mike James) |
54 | * Removed <cr> |
54 | * Removed <cr> |
55 | * |
55 | * |
56 | * Revision 1.19 2000/10/04 10:37:04 10:37:04 mjames (Mike James) |
56 | * Revision 1.19 2000/10/04 10:37:04 10:37:04 mjames (Mike James) |
57 | * Modified for Vertical2 : support COMPONENTS and SIGNALS |
57 | * Modified for Vertical2 : support COMPONENTS and SIGNALS |
58 | * |
58 | * |
59 | * Revision 1.19 2000/10/04 10:37:04 10:37:04 mjames (Mike James) |
59 | * Revision 1.19 2000/10/04 10:37:04 10:37:04 mjames (Mike James) |
60 | * Part of Release PSAVAT01 |
60 | * Part of Release PSAVAT01 |
61 | * |
61 | * |
62 | * Revision 1.18 2000/10/02 11:04:12 11:04:12 mjames (Mike James) |
62 | * Revision 1.18 2000/10/02 11:04:12 11:04:12 mjames (Mike James) |
63 | * new_vhdl |
63 | * new_vhdl |
64 | * |
64 | * |
65 | * Revision 1.17 2000/09/27 14:42:12 14:42:12 mjames (Mike James) |
65 | * Revision 1.17 2000/09/27 14:42:12 14:42:12 mjames (Mike James) |
66 | * Part of Release Sep_27_ST_2000 |
66 | * Part of Release Sep_27_ST_2000 |
67 | * |
67 | * |
68 | * Revision 1.16 2000/09/21 10:15:42 10:15:42 mjames (Mike James) |
68 | * Revision 1.16 2000/09/21 10:15:42 10:15:42 mjames (Mike James) |
69 | * Part of Release Sep21Alpha |
69 | * Part of Release Sep21Alpha |
70 | * |
70 | * |
71 | * Revision 1.15 2000/08/25 09:57:10 09:57:10 mjames (Mike James) |
71 | * Revision 1.15 2000/08/25 09:57:10 09:57:10 mjames (Mike James) |
72 | * Part of Release Aug25_alpha |
72 | * Part of Release Aug25_alpha |
73 | * |
73 | * |
74 | * Revision 1.14 2000/08/16 08:57:27 08:57:27 mjames (Mike James) |
74 | * Revision 1.14 2000/08/16 08:57:27 08:57:27 mjames (Mike James) |
75 | * Part of Release CD01_Aug2000 |
75 | * Part of Release CD01_Aug2000 |
76 | * |
76 | * |
77 | * Revision 1.13 2000/08/14 14:45:08 14:45:08 mjames (Mike James) |
77 | * Revision 1.13 2000/08/14 14:45:08 14:45:08 mjames (Mike James) |
78 | * Part of Release Aug_14_2000 |
78 | * Part of Release Aug_14_2000 |
79 | * |
79 | * |
80 | * Revision 1.12 2000/08/11 08:30:28 08:30:28 mjames (Mike James) |
80 | * Revision 1.12 2000/08/11 08:30:28 08:30:28 mjames (Mike James) |
81 | * Part of Release Aug_11_2000 |
81 | * Part of Release Aug_11_2000 |
82 | * |
82 | * |
83 | * Revision 1.11 2000/08/09 10:31:42 10:31:42 mjames (Mike James) |
83 | * Revision 1.11 2000/08/09 10:31:42 10:31:42 mjames (Mike James) |
84 | * Part of Release Aug__9_2000 |
84 | * Part of Release Aug__9_2000 |
85 | * |
85 | * |
86 | * Revision 1.10 2000/05/31 11:42:50 11:42:50 mjames (Mike James) |
86 | * Revision 1.10 2000/05/31 11:42:50 11:42:50 mjames (Mike James) |
87 | * Part of Release May_31_2000 |
87 | * Part of Release May_31_2000 |
88 | * |
88 | * |
89 | * Revision 1.9 2000/05/08 17:01:34 17:01:34 mjames (Mike James) |
89 | * Revision 1.9 2000/05/08 17:01:34 17:01:34 mjames (Mike James) |
90 | * Part of Release May__8_2000 |
90 | * Part of Release May__8_2000 |
91 | * |
91 | * |
92 | * Revision 1.8 2000/05/08 16:59:27 16:59:27 mjames (Mike James) |
92 | * Revision 1.8 2000/05/08 16:59:27 16:59:27 mjames (Mike James) |
93 | * Part of Release May__8_2000 |
93 | * Part of Release May__8_2000 |
94 | * |
94 | * |
95 | * Revision 1.7 2000/05/08 16:57:03 16:57:03 mjames (Mike James) |
95 | * Revision 1.7 2000/05/08 16:57:03 16:57:03 mjames (Mike James) |
96 | * Part of Release May__8_2000 |
96 | * Part of Release May__8_2000 |
97 | * |
97 | * |
98 | * Revision 1.6 2000/03/08 16:18:56 16:18:56 mjames (Mike James) |
98 | * Revision 1.6 2000/03/08 16:18:56 16:18:56 mjames (Mike James) |
99 | * New version including PC |
99 | * New version including PC |
100 | * |
100 | * |
101 | * Revision 1.3 2000/01/20 15:58:42 15:58:42 mjames (Mike James) |
101 | * Revision 1.3 2000/01/20 15:58:42 15:58:42 mjames (Mike James) |
102 | * Part of Release R22 |
102 | * Part of Release R22 |
103 | * |
103 | * |
104 | * Revision 1.2 99/12/22 11:15:23 11:15:23 mjames (Mike James) |
104 | * Revision 1.2 99/12/22 11:15:23 11:15:23 mjames (Mike James) |
105 | * Part of Release Dec_22_1999 |
105 | * Part of Release Dec_22_1999 |
106 | * |
106 | * |
107 | * Revision 1.1 99/06/25 14:34:45 14:34:45 mjames (Mike James) |
107 | * Revision 1.1 99/06/25 14:34:45 14:34:45 mjames (Mike James) |
108 | * Initial revision |
108 | * Initial revision |
109 | * |
109 | * |
110 | * */ |
110 | * */ |
111 | 111 | ||
112 | #include "expression.h" |
- | |
113 | - | ||
114 | #include "acf_yacc.h" |
- | |
115 | #include "cmdlog.h" |
- | |
116 | #include "cmdparse.h" |
- | |
117 | #include "database.h" |
- | |
118 | #include "generic.h" |
- | |
119 | #include "vertcl_main.h" |
- | |
120 | 112 | ||
121 | #include <stdio.h> |
113 | #include <stdio.h> |
122 | #include <stdlib.h> |
114 | #include <stdlib.h> |
123 | #include <string.h> |
115 | #include <string.h> |
124 | 116 | ||
- | 117 | #include "vertcl_main.h" |
|
- | 118 | #include "expression.h" |
|
- | 119 | #include "generic.h" |
|
- | 120 | #include "database.h" |
|
- | 121 | #include "cmdparse.h" |
|
- | 122 | #include "cmdlog.h" |
|
- | 123 | #include "acf_yacc.h" |
|
- | 124 | ||
- | 125 | ||
125 | /* place reference to a 'C' variable at the end of the tree branch */ |
126 | /* place reference to a 'C' variable at the end of the tree branch */ |
126 | expression_t *compile_variable_reference (int *v, char *s) |
127 | expression_t * compile_variable_reference(int *v,char * s ) { |
127 | { |
- | |
128 | expression_t *p; |
128 | expression_t * p; |
129 | p = calloc (1, sizeof (expression_t)); |
129 | p = calloc(1,sizeof(expression_t)); |
- | 130 | ||
- | 131 | if(p) { |
|
- | 132 | p->opcode = EXP_VAR_REF; |
|
- | 133 | p->left.ip = v; |
|
- | 134 | p->right.s = s; |
|
- | 135 | } |
|
- | 136 | return p; |
|
- | 137 | } |
|
130 | 138 | ||
131 | if (p) |
- | |
132 | { |
- | |
133 | p->opcode = EXP_VAR_REF; |
- | |
134 | p->left.ip = v; |
- | |
135 | p->right.s = s; |
- | |
136 | } |
- | |
137 | return p; |
- | |
138 | } |
- | |
139 | 139 | ||
140 | /* place an integer constant at the end of the tree branch */ |
- | |
141 | expression_t *compile_constant (int k) |
- | |
142 | { |
- | |
143 | expression_t *p; |
- | |
144 | p = calloc (1, sizeof (expression_t)); |
- | |
145 | 140 | ||
- | 141 | /* place an integer constant at the end of the tree branch */ |
|
- | 142 | expression_t * compile_constant(int k ) { |
|
146 | if (p) |
143 | expression_t * p; |
- | 144 | p = calloc(1,sizeof(expression_t)); |
|
- | 145 | ||
147 | { |
146 | if(p) { |
148 | p->opcode = EXP_CONSTANT; |
147 | p->opcode = EXP_CONSTANT; |
149 | p->left.i = k; |
148 | p->left.i = k; |
150 | p->right.s = NULL; |
149 | p->right.s = NULL; |
151 | } |
150 | } |
152 | return p; |
151 | return p; |
153 | } |
152 | } |
154 | /* place a boolean constant at the end of the tree branch */ |
153 | /* place a boolean constant at the end of the tree branch */ |
155 | expression_t *compile_boolean_constant (int k) |
154 | expression_t * compile_boolean_constant(int k ) { |
156 | { |
- | |
157 | expression_t *p; |
155 | expression_t * p; |
158 | p = calloc (1, sizeof (expression_t)); |
156 | p = calloc(1,sizeof(expression_t)); |
159 | 157 | ||
160 | if (p) |
- | |
161 | { |
158 | if(p) { |
162 | p->opcode = EXP_BOOLEAN; |
159 | p->opcode = EXP_BOOLEAN; |
163 | p->left.i = k; |
160 | p->left.i = k; |
164 | p->right.s = NULL; |
161 | p->right.s = NULL; |
165 | } |
162 | } |
166 | return p; |
163 | return p; |
167 | } |
164 | } |
168 | 165 | ||
169 | /* this is where the user types some arbitrary string which is a numeric constant */ |
166 | /* this is where the user types some arbitrary string which is a numeric constant */ |
170 | expression_t *compile_constant_string (int k, char *s) |
167 | expression_t * compile_constant_string(int k,char * s ) { |
171 | { |
- | |
172 | expression_t *p; |
168 | expression_t * p; |
173 | p = calloc (1, sizeof (expression_t)); |
169 | p = calloc(1,sizeof(expression_t)); |
174 | 170 | ||
175 | if (p) |
- | |
176 | { |
171 | if(p) { |
177 | p->opcode = EXP_CONSTANT; |
172 | p->opcode = EXP_CONSTANT; |
178 | p->left.i = k; |
173 | p->left.i = k; |
179 | p->right.s = ISNULLSTR (s) ? NULL : strdup (s); |
174 | p->right.s = ISNULLSTR(s)?NULL:strdup(s); |
180 | } |
175 | } |
181 | return p; |
176 | return p; |
182 | } |
177 | } |
183 | /* this is where the user types some arbitrary string which is a boolean constant */ |
178 | /* this is where the user types some arbitrary string which is a boolean constant */ |
184 | expression_t *compile_boolean_constant_string (int k, char *s) |
179 | expression_t * compile_boolean_constant_string(int k,char * s ) { |
- | 180 | expression_t * p; |
|
- | 181 | p = calloc(1,sizeof(expression_t)); |
|
- | 182 | ||
- | 183 | if(p) { |
|
- | 184 | p->opcode = EXP_BOOLEAN; |
|
- | 185 | p->left.i = k; |
|
- | 186 | p->right.s = ISNULLSTR(s)?NULL:strdup(s); |
|
- | 187 | } |
|
- | 188 | return p; |
|
- | 189 | } |
|
185 | { |
190 | |
- | 191 | /* this compiles a reference to the variable */ |
|
- | 192 | expression_t * compile_variable(generic_info_t * generic , char * valname) { |
|
186 | expression_t *p; |
193 | expression_t * p; |
187 | p = calloc (1, sizeof (expression_t)); |
194 | p = calloc(1,sizeof(expression_t)); |
- | 195 | ||
- | 196 | if(p) { |
|
- | 197 | p->opcode = EXP_VARIABLE; |
|
- | 198 | p->left.g = generic; |
|
- | 199 | p->right.s = valname; |
|
- | 200 | } |
|
- | 201 | return p; |
|
- | 202 | } |
|
- | 203 | ||
- | 204 | ||
- | 205 | expression_t * compile_string(char * s) { |
|
- | 206 | expression_t * p; |
|
- | 207 | p = (expression_t *)calloc(1,sizeof(expression_t)); |
|
- | 208 | ||
- | 209 | if(p) { |
|
- | 210 | p->opcode = EXP_STRING; |
|
- | 211 | p->left.s = ISNULLSTR(s)?NULL:strdup(s); |
|
- | 212 | } |
|
- | 213 | return p; |
|
- | 214 | } |
|
- | 215 | ||
- | 216 | ||
- | 217 | expression_t * compile_char(char c) { |
|
- | 218 | expression_t * p; |
|
- | 219 | p = (expression_t *)calloc(1,sizeof(expression_t)); |
|
- | 220 | ||
- | 221 | if(p) { |
|
- | 222 | p->opcode = EXP_CHAR; |
|
- | 223 | p->left.i = c; |
|
- | 224 | } |
|
- | 225 | return p; |
|
- | 226 | } |
|
- | 227 | ||
- | 228 | ||
- | 229 | expression_t * compile_reference(char * s) { |
|
- | 230 | expression_t * p; |
|
- | 231 | p = (expression_t *)calloc(1,sizeof(expression_t)); |
|
- | 232 | ||
- | 233 | if(p) { |
|
- | 234 | p->opcode = EXP_UNDEF_VAR; |
|
- | 235 | p->right.s = ISNULLSTR(s)?NULL:strdup(s); |
|
- | 236 | } |
|
- | 237 | return p; |
|
- | 238 | } |
|
- | 239 | ||
- | 240 | ||
- | 241 | ||
- | 242 | expression_t * compile_expression(int opcode, |
|
- | 243 | expression_t * l, |
|
- | 244 | expression_t * r ) { |
|
- | 245 | expression_t * p; |
|
- | 246 | p = (expression_t *)calloc(1,sizeof(expression_t)); |
|
- | 247 | if(p) { |
|
- | 248 | p->opcode = opcode; |
|
- | 249 | p->left.e = l; |
|
- | 250 | p->right.e = r; |
|
- | 251 | } |
|
- | 252 | return p; |
|
- | 253 | } |
|
188 | 254 | ||
189 | if (p) |
- | |
190 | { |
- | |
191 | p->opcode = EXP_BOOLEAN; |
- | |
192 | p->left.i = k; |
- | |
193 | p->right.s = ISNULLSTR (s) ? NULL : strdup (s); |
- | |
194 | } |
- | |
195 | return p; |
- | |
196 | } |
- | |
197 | 255 | ||
198 | /* this compiles a reference to the variable */ |
- | |
199 | expression_t *compile_variable (generic_info_t *generic, char *valname) |
- | |
200 | { |
- | |
201 | expression_t *p; |
- | |
202 | p = calloc (1, sizeof (expression_t)); |
- | |
203 | 256 | ||
204 | if (p) |
- | |
205 | { |
- | |
206 | p->opcode = EXP_VARIABLE; |
- | |
207 | p->left.g = generic; |
- | |
208 | p->right.s = valname; |
- | |
209 | } |
- | |
210 | return p; |
- | |
211 | } |
- | |
212 | - | ||
213 | expression_t *compile_string (char *s) |
- | |
214 | { |
- | |
215 | expression_t *p; |
- | |
216 | p = (expression_t *) calloc (1, sizeof (expression_t)); |
- | |
217 | 257 | ||
218 | if (p) |
- | |
219 | { |
- | |
220 | p->opcode = EXP_STRING; |
- | |
221 | p->left.s = ISNULLSTR (s) ? NULL : strdup (s); |
- | |
222 | } |
- | |
223 | return p; |
- | |
224 | } |
- | |
225 | 258 | ||
226 | expression_t *compile_char (char c) |
- | |
227 | { |
- | |
228 | expression_t *p; |
- | |
229 | p = (expression_t *) calloc (1, sizeof (expression_t)); |
- | |
230 | 259 | ||
231 | if (p) |
260 | void print_expression(FILE * f,expression_t * e , |
232 | { |
261 | generic_print_style recurse_generics) { |
233 | p->opcode = EXP_CHAR; |
262 | if (!e) { |
234 | p->left.i = c; |
263 | fprintf(f,"(NULL)"); |
235 | } |
264 | return; |
236 | return p; |
265 | } |
237 | } |
266 | switch (e->opcode) { |
238 | 267 | case EXP_UNDEF_VAR : |
|
239 | expression_t *compile_reference (char *s) |
268 | if (e->right.s) |
240 | { |
269 | fprintf(f,"%s",e->right.s); |
241 | expression_t *p; |
270 | break; |
242 | p = (expression_t *) calloc (1, sizeof (expression_t)); |
271 | case EXP_STRING : |
243 | 272 | if (e->left.s) |
|
244 | if (p) |
273 | fprintf(f,"\"%s\"",e->left.s); |
245 | { |
274 | break; |
246 | p->opcode = EXP_UNDEF_VAR; |
275 | case EXP_CHAR : |
247 | p->right.s = ISNULLSTR (s) ? NULL : strdup (s); |
276 | fprintf(f,"\'%c\'",e->left.i); |
248 | } |
277 | break; |
249 | return p; |
278 | case EXP_CONSTANT : |
250 | } |
279 | if (e->right.s) |
251 | 280 | fprintf(f,"%s",e->right.s); |
|
252 | expression_t *compile_expression (int opcode, expression_t *l, expression_t *r) |
281 | else |
253 | { |
282 | fprintf(f,"%d",e->left.i); |
254 | expression_t *p; |
283 | break; |
255 | p = (expression_t *) calloc (1, sizeof (expression_t)); |
284 | case EXP_VAR_REF : |
256 | if (p) |
285 | /* if (e->right.s) |
257 | { |
286 | fprintf(f,"%s",e->right.s); |
258 | p->opcode = opcode; |
287 | else */ |
259 | p->left.e = l; |
288 | fprintf(f,"%d",*(e->left.ip)); |
260 | p->right.e = r; |
289 | break; |
261 | } |
290 | case EXP_BOOLEAN : |
262 | return p; |
291 | if (e->right.s) |
263 | } |
292 | fprintf(f,"%s",e->right.s); |
264 | 293 | else |
|
265 | void print_expression (FILE *f, expression_t *e, generic_print_style recurse_generics) |
294 | fprintf(f,"%s",e->left.i?"true":"false"); |
266 | { |
295 | break; |
267 | if (!e) |
296 | case EXP_VARIABLE : |
268 | { |
297 | if (e->left.g) { |
269 | fprintf (f, "(NULL)"); |
298 | if(recurse_generics!=NO_RECURSE && |
270 | return; |
299 | e->left.g->expr && |
271 | } |
300 | (recurse_generics==RECURSE_NUMBER || e->left.g->expr->opcode != EXP_CONSTANT)) { |
272 | switch (e->opcode) |
301 | fprintf(f,"("); |
273 | { |
302 | print_expression(f, e->left.g->expr,recurse_generics); |
274 | case EXP_UNDEF_VAR: |
303 | fprintf(f,")"); |
275 | if (e->right.s) |
304 | } |
276 | fprintf (f, "%s", e->right.s); |
305 | else |
277 | break; |
306 | fprintf(f,"%s",e->right.s); |
278 | case EXP_STRING: |
307 | } |
279 | if (e->left.s) |
308 | else |
280 | fprintf (f, "\"%s\"", e->left.s); |
309 | fprintf(f,"((%s))",e->right.s); |
281 | break; |
310 | |
282 | case EXP_CHAR: |
311 | break; |
283 | fprintf (f, "\'%c\'", e->left.i); |
312 | case UMINUS: |
284 | break; |
313 | fprintf(f,"(-"); |
285 | case EXP_CONSTANT: |
314 | if(e->left.e->opcode != EXP_CONSTANT) |
286 | if (e->right.s) |
315 | fprintf(f,"("); |
287 | fprintf (f, "%s", e->right.s); |
316 | print_expression(f,e->left.e,recurse_generics); |
288 | else |
317 | if(e->left.e->opcode != EXP_CONSTANT) |
289 | fprintf (f, "%d", e->left.i); |
318 | fprintf(f,")"); |
290 | break; |
319 | fprintf(f,")"); |
291 | case EXP_VAR_REF: |
320 | break; |
292 | /* if (e->right.s) |
321 | case '~': |
293 | fprintf(f,"%s",e->right.s); |
322 | fprintf(f,"(~"); |
294 | else */ |
323 | if(e->left.e->opcode != EXP_CONSTANT) |
295 | fprintf (f, "%d", *(e->left.ip)); |
324 | fprintf(f,"("); |
296 | break; |
325 | print_expression(f,e->left.e,recurse_generics); |
297 | case EXP_BOOLEAN: |
326 | if(e->left.e->opcode != EXP_CONSTANT) |
298 | if (e->right.s) |
327 | fprintf(f,")"); |
299 | fprintf (f, "%s", e->right.s); |
328 | fprintf(f,")"); |
300 | else |
329 | break; |
301 | fprintf (f, "%s", e->left.i ? "true" : "false"); |
330 | case '!': |
302 | break; |
331 | fprintf(f,"(!"); |
303 | case EXP_VARIABLE: |
332 | if(e->left.e->opcode != EXP_CONSTANT) |
304 | if (e->left.g) |
333 | fprintf(f,"("); |
305 | { |
334 | print_expression(f,e->left.e,recurse_generics); |
306 | if (recurse_generics != NO_RECURSE && e->left.g->expr && |
335 | if(e->left.e->opcode != EXP_CONSTANT) |
307 | (recurse_generics == RECURSE_NUMBER || |
336 | fprintf(f,")"); |
308 | e->left.g->expr->opcode != EXP_CONSTANT)) |
337 | fprintf(f,")"); |
309 | { |
338 | break; |
310 | fprintf (f, "("); |
339 | case '(' : |
311 | print_expression (f, e->left.g->expr, recurse_generics); |
340 | fprintf(f,"("); |
312 | fprintf (f, ")"); |
341 | print_expression(f,e->left.e,recurse_generics); |
313 | } |
342 | fprintf(f,")"); |
314 | else |
343 | break; |
315 | fprintf (f, "%s", e->right.s); |
344 | case '+' : |
316 | } |
345 | case '-' : |
317 | else |
346 | case '*' : |
318 | fprintf (f, "((%s))", e->right.s); |
347 | case '/' : |
319 | 348 | case '%' : |
|
320 | break; |
349 | case '^' : |
321 | case UMINUS: |
350 | case '?' : |
322 | fprintf (f, "(-"); |
351 | case ':' : |
323 | if (e->left.e->opcode != EXP_CONSTANT) |
352 | case '>' : |
324 | fprintf (f, "("); |
353 | case '<' : |
325 | print_expression (f, e->left.e, recurse_generics); |
354 | case '&' : |
326 | if (e->left.e->opcode != EXP_CONSTANT) |
355 | case '|' : |
327 | fprintf (f, ")"); |
356 | |
328 | fprintf (f, ")"); |
357 | print_expression(f,e->left.e,recurse_generics); |
329 | break; |
358 | fprintf(f,"%c",e->opcode); |
330 | case '~': |
359 | print_expression(f,e->right.e,recurse_generics); |
331 | fprintf (f, "(~"); |
360 | |
332 | if (e->left.e->opcode != EXP_CONSTANT) |
361 | break; |
333 | fprintf (f, "("); |
362 | case SHL : |
334 | print_expression (f, e->left.e, recurse_generics); |
363 | print_expression(f,e->left.e,recurse_generics); |
335 | if (e->left.e->opcode != EXP_CONSTANT) |
364 | fprintf(f,"<<"); |
336 | fprintf (f, ")"); |
365 | print_expression(f,e->right.e,recurse_generics); |
337 | fprintf (f, ")"); |
366 | break; |
338 | break; |
367 | case SHR : |
339 | case '!': |
368 | print_expression(f,e->left.e,recurse_generics); |
340 | fprintf (f, "(!"); |
369 | fprintf(f,">>"); |
341 | if (e->left.e->opcode != EXP_CONSTANT) |
370 | print_expression(f,e->right.e,recurse_generics); |
342 | fprintf (f, "("); |
371 | break; |
343 | print_expression (f, e->left.e, recurse_generics); |
372 | case EQ_EQ : |
344 | if (e->left.e->opcode != EXP_CONSTANT) |
373 | print_expression(f,e->left.e,recurse_generics); |
345 | fprintf (f, ")"); |
374 | fprintf(f,"=="); |
346 | fprintf (f, ")"); |
375 | print_expression(f,e->right.e,recurse_generics); |
347 | break; |
376 | break; |
348 | case '(': |
377 | case N_EQ : |
349 | fprintf (f, "("); |
378 | print_expression(f,e->left.e,recurse_generics); |
350 | print_expression (f, e->left.e, recurse_generics); |
379 | fprintf(f,"!="); |
351 | fprintf (f, ")"); |
380 | print_expression(f,e->right.e,recurse_generics); |
352 | break; |
381 | break; |
353 | case '+': |
382 | case LOG_AND : |
354 | case '-': |
383 | print_expression(f,e->left.e,recurse_generics); |
355 | case '*': |
384 | fprintf(f,"&&"); |
356 | case '/': |
385 | print_expression(f,e->right.e,recurse_generics); |
357 | case '%': |
386 | break; |
358 | case '^': |
387 | case LOG_OR : |
359 | case '?': |
388 | print_expression(f,e->left.e,recurse_generics); |
360 | case ':': |
389 | fprintf(f,"||"); |
361 | case '>': |
390 | print_expression(f,e->right.e,recurse_generics); |
362 | case '<': |
391 | break; |
363 | case '&': |
392 | case TO_POW : |
364 | case '|': |
393 | print_expression(f,e->left.e,recurse_generics); |
365 | 394 | fprintf(f,"**"); |
|
366 | print_expression (f, e->left.e, recurse_generics); |
395 | print_expression(f,e->right.e,recurse_generics); |
367 | fprintf (f, "%c", e->opcode); |
396 | break; |
368 | print_expression (f, e->right.e, recurse_generics); |
397 | default : |
369 | 398 | fprintf(f,"(?? expression ERROR : OPCODE 0x%X)",e->opcode); |
|
370 | break; |
399 | |
371 | case SHL: |
400 | } |
372 | print_expression (f, e->left.e, recurse_generics); |
401 | |
373 | fprintf (f, "<<"); |
402 | } |
374 | print_expression (f, e->right.e, recurse_generics); |
403 | |
375 | break; |
404 | |
376 | case SHR: |
405 | |
377 | print_expression (f, e->left.e, recurse_generics); |
406 | /* a range is permitted at the top level of an expression */ |
378 | fprintf (f, ">>"); |
- | |
379 | print_expression (f, e->right.e, recurse_generics); |
- | |
380 | break; |
- | |
381 | case EQ_EQ: |
- | |
382 | print_expression (f, e->left.e, recurse_generics); |
- | |
383 | fprintf (f, "=="); |
- | |
384 | print_expression (f, e->right.e, recurse_generics); |
- | |
385 | break; |
- | |
386 | case N_EQ: |
- | |
387 | print_expression (f, e->left.e, recurse_generics); |
- | |
388 | fprintf (f, "!="); |
- | |
389 | print_expression (f, e->right.e, recurse_generics); |
- | |
390 | break; |
- | |
391 | case LOG_AND: |
- | |
392 | print_expression (f, e->left.e, recurse_generics); |
- | |
393 | fprintf (f, "&&"); |
- | |
394 | print_expression (f, e->right.e, recurse_generics); |
- | |
395 | break; |
- | |
396 | case LOG_OR: |
- | |
397 | print_expression (f, e->left.e, recurse_generics); |
- | |
398 | fprintf (f, "||"); |
- | |
399 | print_expression (f, e->right.e, recurse_generics); |
- | |
400 | break; |
- | |
401 | case TO_POW: |
- | |
402 | print_expression (f, e->left.e, recurse_generics); |
- | |
403 | fprintf (f, "**"); |
- | |
404 | print_expression (f, e->right.e, recurse_generics); |
- | |
405 | break; |
- | |
406 | default: |
- | |
407 | fprintf (f, "(?? expression ERROR : OPCODE 0x%X)", e->opcode); |
- | |
408 | } |
- | |
409 | } |
- | |
410 | - | ||
411 | /* a range is permitted at the top level of an expression */ |
- | |
412 | /* if there is no expression return */ |
407 | /* if there is no expression return */ |
413 | void print_range_expression (FILE *f, expression_t *e, generic_print_style recurse_generics) |
408 | void print_range_expression(FILE * f, expression_t * e,generic_print_style recurse_generics) { |
414 | { |
409 | if (!e) return; |
415 | if (!e) |
410 | switch (e->opcode) { |
416 | return; |
411 | case TO : |
417 | switch (e->opcode) |
412 | fprintf(f,"("); |
418 | { |
413 | print_expression(f,e->left.e,recurse_generics); |
419 | case TO: |
414 | fprintf(f," TO "); |
420 | fprintf (f, "("); |
415 | print_expression(f,e->right.e,recurse_generics); |
421 | print_expression (f, e->left.e, recurse_generics); |
416 | fprintf(f,")"); |
422 | fprintf (f, " TO "); |
417 | break; |
423 | print_expression (f, e->right.e, recurse_generics); |
418 | |
424 | fprintf (f, ")"); |
419 | case DOWNTO : |
425 | break; |
420 | fprintf(f,"("); |
426 | 421 | print_expression(f,e->left.e,recurse_generics); |
|
427 | case DOWNTO: |
422 | fprintf(f," DOWNTO "); |
428 | fprintf (f, "("); |
423 | print_expression(f,e->right.e,recurse_generics); |
429 | print_expression (f, e->left.e, recurse_generics); |
424 | fprintf(f,")"); |
430 | fprintf (f, " DOWNTO "); |
425 | break; |
431 | print_expression (f, e->right.e, recurse_generics); |
426 | |
432 | fprintf (f, ")"); |
427 | case EXP_VARIABLE : |
433 | break; |
428 | if (e->left.g) { |
434 | 429 | if(recurse_generics != NO_RECURSE) |
|
435 | case EXP_VARIABLE: |
430 | print_range_expression(f, e->left.g->expr,recurse_generics); |
436 | if (e->left.g) |
431 | else |
437 | { |
432 | fprintf(f,"(%s)",e->right.s); |
438 | if (recurse_generics != NO_RECURSE) |
433 | } |
439 | print_range_expression (f, e->left.g->expr, recurse_generics); |
434 | else |
440 | else |
435 | fprintf(f,"((??%s))",e->right.s); |
441 | fprintf (f, "(%s)", e->right.s); |
436 | |
442 | } |
437 | break; |
443 | else |
438 | |
444 | fprintf (f, "((??%s))", e->right.s); |
439 | |
445 | 440 | ||
446 | break; |
441 | default : |
447 | 442 | /* handle the expressions down each level of the hierarchy */ |
|
448 | default: |
443 | /* fprintf(f,"("); */ |
449 | /* handle the expressions down each level of the hierarchy */ |
444 | print_expression(f,e,recurse_generics); |
450 | /* fprintf(f,"("); */ |
445 | /* fprintf(f,")"); */ |
451 | print_expression (f, e, recurse_generics); |
446 | } |
452 | /* fprintf(f,")"); */ |
447 | } |
453 | } |
448 | |
454 | } |
449 | |
455 | 450 | ||
456 | void print_msg_expression (FILE *f, char *s, expression_t *e) |
451 | void print_msg_expression(FILE * f,char * s, expression_t *e) { |
457 | { |
452 | fprintf(f,"%s '",s); |
458 | fprintf (f, "%s '", s); |
453 | print_range_expression(f,e,NO_RECURSE); |
459 | print_range_expression (f, e, NO_RECURSE); |
454 | fprintf(f,"'\n"); |
460 | fprintf (f, "'\n"); |
455 | } |
461 | } |
456 | |
462 | 457 | ||
463 | /* evaluate an integer expression : checking local generics if they are available */ |
458 | |
464 | int eval_expression (expression_t *e, generic_info_t **chip_generics) |
459 | /* evaluate an integer expression : checking local generics if they are available */ |
465 | { |
460 | int eval_expression(expression_t * e,generic_info_t ** chip_generics ) { |
466 | int r = 0; |
461 | int r = 0; |
467 | if (!e) |
462 | if (!e) return 0; |
468 | return 0; |
463 | |
469 | 464 | switch (e->opcode) { |
|
470 | switch (e->opcode) |
465 | case EXP_CONSTANT : |
471 | { |
466 | case EXP_BOOLEAN: |
472 | case EXP_CONSTANT: |
467 | r = e->left.i; |
473 | case EXP_BOOLEAN: |
468 | break; |
474 | r = e->left.i; |
469 | case EXP_VAR_REF : |
475 | break; |
470 | r = *(e->left.ip); |
476 | case EXP_VAR_REF: |
471 | break; |
477 | r = *(e->left.ip); |
472 | /* when evaluating expression, if a generic in scope is found then the |
478 | break; |
473 | generic will be updated : ends up creating and cross-linking a |
479 | /* when evaluating expression, if a generic in scope is found then the |
474 | partition generic */ |
480 | generic will be updated : ends up creating and cross-linking a |
475 | case EXP_UNDEF_VAR : |
481 | partition generic */ |
476 | { |
482 | case EXP_UNDEF_VAR: |
477 | generic_info_t * gen; |
483 | { |
478 | gen = NULL; |
484 | generic_info_t *gen; |
479 | if (chip_generics) |
485 | gen = NULL; |
480 | { |
486 | if (chip_generics) |
481 | gen = get_generic_ref(chip_generics,e->right.s); |
487 | { |
482 | } |
488 | gen = get_generic_ref (chip_generics, e->right.s); |
483 | /* search outwards */ |
489 | } |
484 | if (!gen) |
490 | /* search outwards */ |
485 | { |
491 | if (!gen) |
486 | gen = get_generic_ref(&global_generics,e->right.s); |
492 | { |
487 | } |
493 | gen = get_generic_ref (&global_generics, e->right.s); |
488 | if (!gen) |
494 | } |
489 | {/* scope is external not local */ |
495 | if (!gen) |
490 | expr_ref_t * link; |
496 | { /* scope is external not local */ |
491 | gen = get_generic_ref(&partition_generics,e->right.s); |
497 | expr_ref_t *link; |
492 | /* if no partition generic appears, make one */ |
498 | gen = get_generic_ref (&partition_generics, e->right.s); |
493 | if(!gen) |
499 | /* if no partition generic appears, make one */ |
494 | { |
500 | if (!gen) |
495 | generic_info_t newgen; |
501 | { |
496 | newgen.typename = "integer"; |
502 | generic_info_t newgen; |
497 | newgen.name = e->right.s; |
503 | newgen.typename = "integer"; |
498 | |
504 | newgen.name = e->right.s; |
499 | newgen.valid = 1; |
505 | 500 | newgen.expr = compile_constant(0); |
|
506 | newgen.valid = 1; |
501 | newgen.g_type = IS_INTEGER; |
507 | newgen.expr = compile_constant (0); |
502 | newgen.g_class = DEFINED; |
508 | newgen.g_type = IS_INTEGER; |
503 | |
509 | newgen.g_class = DEFINED; |
504 | gen = set_generic_value(&partition_generics, &newgen); |
510 | 505 | } |
|
511 | gen = set_generic_value (&partition_generics, &newgen); |
506 | if(gen) |
512 | } |
507 | { |
513 | if (gen) |
508 | link = calloc(1,sizeof(expr_ref_t)); |
514 | { |
509 | } |
515 | link = calloc (1, sizeof (expr_ref_t)); |
510 | if(gen && link) |
516 | } |
511 | { |
517 | if (gen && link) |
512 | link -> expr_ref = gen -> expr_ref; |
518 | { |
513 | gen -> expr_ref = link; |
519 | link->expr_ref = gen->expr_ref; |
514 | link -> expr = e; |
520 | gen->expr_ref = link; |
515 | } |
521 | link->expr = e; |
516 | } |
522 | } |
517 | if(gen) |
523 | } |
518 | { |
524 | if (gen) |
519 | e->opcode = EXP_VARIABLE; |
525 | { |
520 | e->left.g = gen; |
526 | e->opcode = EXP_VARIABLE; |
521 | /* having located a valid generic then try to link it up */ |
527 | e->left.g = gen; |
522 | |
528 | /* having located a valid generic then try to link it up */ |
523 | |
529 | 524 | /* duplicate code borrowed from below. Avoiding 'goto' !! */ |
|
530 | /* duplicate code borrowed from below. Avoiding 'goto' !! */ |
525 | eval_gen_expression(gen); |
531 | eval_gen_expression (gen); |
526 | if( gen->g_type==IS_ATTRIBUTE || gen->g_type==IS_INTEGER) { |
532 | if (gen->g_type == IS_ATTRIBUTE || gen->g_type == IS_INTEGER) |
527 | r = eval_expression(gen->expr,chip_generics); |
533 | { |
- | |
534 | r = eval_expression (gen->expr, chip_generics); |
- | |
535 | #if defined DEBUG_EXPRESSION |
528 | #if defined DEBUG_EXPRESSION |
536 | printf ("eval %s = %d\n", gen->name, r); |
529 | printf("eval %s = %d\n",gen->name,r); |
537 | #endif |
530 | #endif |
538 | } |
531 | } |
539 | else |
- | |
540 | { |
532 | else { |
541 | Log ( |
- | |
542 | LOG_ERROR, |
- | |
543 | "#Error : generic %s has non integer type (code %d)\n", |
533 | Log(LOG_ERROR,"#Error : generic %s has non integer type (code %d)\n",gen->name,gen->g_type); |
544 | gen->name, |
- | |
545 | gen->g_type); |
- | |
546 | r = 0; |
534 | r= 0; |
547 | } |
535 | } |
548 | } |
536 | } |
549 | else |
537 | else |
550 | { |
538 | { |
- | 539 | ||
551 | Log (LOG_ERROR, "# symbol '%s' is not defined\n", e->right.s); |
540 | Log(LOG_ERROR,"# symbol '%s' is not defined\n",e->right.s); |
552 | } |
541 | } |
- | 542 | ||
553 | } |
543 | } |
554 | break; |
544 | break; |
555 | case EXP_VARIABLE: |
545 | case EXP_VARIABLE : |
556 | { |
546 | { |
557 | generic_info_t *gen; |
547 | generic_info_t * gen; |
558 | gen = e->left.g; |
548 | gen = e->left.g; |
559 | - | ||
560 | if (gen) |
549 | |
561 | { |
550 | if (gen) { |
562 | eval_gen_expression (gen); |
551 | eval_gen_expression(gen); |
563 | if (gen->g_type == IS_ATTRIBUTE || gen->g_type == IS_INTEGER) |
552 | if( gen->g_type==IS_ATTRIBUTE || gen->g_type==IS_INTEGER) { |
564 | { |
- | |
565 | r = eval_expression (gen->expr, chip_generics); |
553 | r = eval_expression(gen->expr,chip_generics); |
566 | #if defined DEBUG_EXPRESSION |
554 | #if defined DEBUG_EXPRESSION |
567 | printf ("eval %s = %d\n", gen->name, r); |
555 | printf("eval %s = %d\n",gen->name,r); |
568 | #endif |
556 | #endif |
569 | } |
557 | } |
570 | else |
558 | else { |
571 | { |
559 | Log(LOG_ERROR,"#Error : generic %s has non integer type (code %d)\n",gen->name,gen->g_type); |
572 | Log ( |
560 | r= 0; |
573 | LOG_ERROR, |
561 | } |
574 | "#Error : generic %s has non integer type (code %d)\n", |
562 | } |
575 | gen->name, |
563 | |
576 | gen->g_type); |
564 | else |
577 | r = 0; |
565 | Log(LOG_ERROR,"#Error : generic '%s' not found\n",e->right.s); |
578 | } |
566 | } |
579 | } |
567 | break; |
580 | 568 | case EXP_CHAR : |
|
581 | else |
569 | r= e->left.i; |
582 | Log (LOG_ERROR, "#Error : generic '%s' not found\n", e->right.s); |
570 | break; |
583 | } |
571 | case EXP_STRING : |
584 | break; |
572 | r= 0; |
585 | case EXP_CHAR: |
573 | break; |
586 | r = e->left.i; |
574 | case '(' : |
587 | break; |
575 | r= eval_expression(e->left.e,chip_generics); |
588 | case EXP_STRING: |
576 | break; |
589 | r = 0; |
577 | case UMINUS : |
590 | break; |
578 | r= 0-eval_expression(e->left.e,chip_generics); |
591 | case '(': |
579 | break; |
592 | r = eval_expression (e->left.e, chip_generics); |
580 | case '~' : |
593 | break; |
581 | r= ~eval_expression(e->left.e,chip_generics); |
594 | case UMINUS: |
582 | break; |
595 | r = 0 - eval_expression (e->left.e, chip_generics); |
583 | case '!' : |
596 | break; |
584 | r= !eval_expression(e->left.e,chip_generics); |
597 | case '~': |
585 | break; |
598 | r = ~eval_expression (e->left.e, chip_generics); |
586 | case '+' : |
599 | break; |
587 | r= eval_expression(e->left.e,chip_generics)+eval_expression(e->right.e,chip_generics); |
600 | case '!': |
588 | break; |
601 | r = !eval_expression (e->left.e, chip_generics); |
589 | case '-' : |
602 | break; |
590 | r= eval_expression(e->left.e,chip_generics)-eval_expression(e->right.e,chip_generics); |
603 | case '+': |
591 | break; |
604 | r = eval_expression (e->left.e, chip_generics) + |
592 | case '*' : |
605 | eval_expression (e->right.e, chip_generics); |
593 | r= eval_expression(e->left.e,chip_generics)*eval_expression(e->right.e,chip_generics); |
606 | break; |
594 | break; |
607 | case '-': |
595 | case '/' : |
608 | r = eval_expression (e->left.e, chip_generics) - |
596 | { |
609 | eval_expression (e->right.e, chip_generics); |
597 | int rhs; |
610 | break; |
598 | rhs = eval_expression(e->right.e,chip_generics); |
611 | case '*': |
599 | if(rhs) |
612 | r = eval_expression (e->left.e, chip_generics) * |
600 | { |
613 | eval_expression (e->right.e, chip_generics); |
601 | r= eval_expression(e->left.e,chip_generics)/rhs; |
614 | break; |
602 | } |
615 | case '/': |
603 | else |
616 | { |
604 | { |
617 | int rhs; |
605 | Log(LOG_ERROR,"# ERROR: Division by 0\n"); |
618 | rhs = eval_expression (e->right.e, chip_generics); |
606 | r=0; |
619 | if (rhs) |
607 | }; |
620 | { |
608 | } |
621 | r = eval_expression (e->left.e, chip_generics) / rhs; |
609 | break; |
622 | } |
610 | case '%' : |
623 | else |
611 | { |
624 | { |
612 | int rhs; |
625 | Log (LOG_ERROR, "# ERROR: Division by 0\n"); |
613 | rhs = eval_expression(e->right.e,chip_generics); |
626 | r = 0; |
614 | if(rhs) |
627 | }; |
615 | { |
628 | } |
616 | r= eval_expression(e->left.e,chip_generics)%rhs; |
629 | break; |
617 | } |
630 | case '%': |
618 | else |
631 | { |
619 | { |
632 | int rhs; |
620 | Log(LOG_ERROR,"# ERROR: Modulus by 0\n"); |
633 | rhs = eval_expression (e->right.e, chip_generics); |
621 | r=0; |
634 | if (rhs) |
622 | }; |
635 | { |
623 | } |
636 | r = eval_expression (e->left.e, chip_generics) % rhs; |
624 | break; |
637 | } |
625 | case '^' : |
638 | else |
626 | r= eval_expression(e->left.e,chip_generics)^eval_expression(e->right.e,chip_generics); |
639 | { |
627 | break; |
640 | Log (LOG_ERROR, "# ERROR: Modulus by 0\n"); |
628 | case '|' : |
641 | r = 0; |
629 | r= eval_expression(e->left.e,chip_generics)|eval_expression(e->right.e,chip_generics); |
642 | }; |
630 | break; |
643 | } |
631 | case '&' : |
644 | break; |
632 | r= eval_expression(e->left.e,chip_generics)&eval_expression(e->right.e,chip_generics); |
645 | case '^': |
633 | break; |
646 | r = eval_expression (e->left.e, chip_generics) ^ |
634 | case '>' : |
647 | eval_expression (e->right.e, chip_generics); |
635 | r= eval_expression(e->left.e,chip_generics)>eval_expression(e->right.e,chip_generics); |
648 | break; |
636 | break; |
649 | case '|': |
637 | case '<' : |
650 | r = eval_expression (e->left.e, chip_generics) | |
638 | r= eval_expression(e->left.e,chip_generics)<eval_expression(e->right.e,chip_generics); |
651 | eval_expression (e->right.e, chip_generics); |
639 | break; |
652 | break; |
640 | case EQ_EQ : |
653 | case '&': |
641 | r= eval_expression(e->left.e,chip_generics)==eval_expression(e->right.e,chip_generics); |
654 | r = eval_expression (e->left.e, chip_generics) & |
642 | break; |
655 | eval_expression (e->right.e, chip_generics); |
643 | case N_EQ: |
656 | break; |
644 | r= eval_expression(e->left.e,chip_generics)!=eval_expression(e->right.e,chip_generics); |
657 | case '>': |
645 | break; |
658 | r = eval_expression (e->left.e, chip_generics) > |
646 | case LOG_OR: |
659 | eval_expression (e->right.e, chip_generics); |
647 | r= eval_expression(e->left.e,chip_generics)||eval_expression(e->right.e,chip_generics); |
660 | break; |
648 | break; |
661 | case '<': |
649 | case LOG_AND: |
662 | r = eval_expression (e->left.e, chip_generics) < |
650 | r= eval_expression(e->left.e,chip_generics)&&eval_expression(e->right.e,chip_generics); |
663 | eval_expression (e->right.e, chip_generics); |
651 | break; |
664 | break; |
652 | case SHL : |
665 | case EQ_EQ: |
653 | r= eval_expression(e->left.e,chip_generics)<<eval_expression(e->right.e,chip_generics); |
666 | r = eval_expression (e->left.e, chip_generics) == |
654 | break; |
667 | eval_expression (e->right.e, chip_generics); |
655 | case SHR : |
668 | break; |
656 | r= eval_expression(e->left.e,chip_generics)>>eval_expression(e->right.e,chip_generics); |
669 | case N_EQ: |
657 | break; |
670 | r = eval_expression (e->left.e, chip_generics) != |
658 | case '?' : |
671 | eval_expression (e->right.e, chip_generics); |
659 | r= eval_expression(e->left.e,chip_generics) ? eval_expression(e->right.e->left.e,chip_generics) : |
672 | break; |
660 | eval_expression(e->right.e->right.e,chip_generics) ; |
673 | case LOG_OR: |
661 | break; |
674 | r = eval_expression (e->left.e, chip_generics) || |
662 | case TO_POW : { |
675 | eval_expression (e->right.e, chip_generics); |
663 | int i,y,x; |
676 | break; |
664 | x = eval_expression(e->left.e,chip_generics); |
677 | case LOG_AND: |
665 | y = eval_expression(e->right.e,chip_generics); |
678 | r = eval_expression (e->left.e, chip_generics) && |
666 | if (y==0) /* x**0 = 1 */ |
679 | eval_expression (e->right.e, chip_generics); |
667 | r=1; |
680 | break; |
668 | else if (y<0 ) /* negative powers */ |
681 | case SHL: |
669 | r=0; |
682 | r = eval_expression (e->left.e, chip_generics) |
670 | else { |
683 | << eval_expression (e->right.e, chip_generics); |
671 | i = y; /* limit power */ |
684 | break; |
672 | if (i > 32) { |
685 | case SHR: |
673 | Log(LOG_ERROR,"arithmetic power of: %d ** %d : %d > 32: limited to 32\n",x,y,y); |
686 | r = eval_expression (e->left.e, chip_generics) >> |
674 | i = 32; } |
687 | eval_expression (e->right.e, chip_generics); |
675 | r = x; |
688 | break; |
676 | while(--i) |
689 | case '?': |
677 | r *= x; |
690 | r = eval_expression (e->left.e, chip_generics) |
678 | } |
691 | ? eval_expression (e->right.e->left.e, chip_generics) |
679 | } |
692 | : eval_expression (e->right.e->right.e, chip_generics); |
680 | break; |
693 | break; |
681 | default : |
694 | case TO_POW: |
682 | Log(LOG_ERROR,"#Error : expression : illegal operator (%d)\n",e->opcode); |
695 | { |
683 | } |
696 | int i, y, x; |
684 | /* printf("(%d)",r); */ |
697 | x = eval_expression (e->left.e, chip_generics); |
685 | return r; |
698 | y = eval_expression (e->right.e, chip_generics); |
686 | } |
699 | if (y == 0) /* x**0 = 1 */ |
687 | |
700 | r = 1; |
688 | |
701 | else if (y < 0) /* negative powers */ |
689 | |
702 | r = 0; |
690 | int eval_vhdl_expression(expression_t * expr, |
703 | else |
691 | int * high, |
704 | { |
692 | int * low ) { |
705 | i = y; /* limit power */ |
693 | int rc; |
706 | if (i > 32) |
694 | |
707 | { |
695 | generic_info_t ** chip_generics = NULL; /* no local search scope, order of declaration should ensure that |
708 | Log ( |
696 | generics are defined before use */ |
709 | LOG_ERROR, |
697 | |
710 | "arithmetic power of: %d ** %d : %d > 32: limited to 32\n", |
698 | if (!expr) return 0; |
711 | x, |
699 | /* my be range at top level in variable */ |
712 | y, |
700 | if(expr->opcode == EXP_VARIABLE) |
713 | y); |
701 | expr = expr->left.g->expr; |
714 | i = 32; |
702 | |
715 | } |
703 | if (!expr) return 0; |
716 | r = x; |
704 | |
717 | while (--i) |
705 | switch (expr->opcode) { |
718 | r *= x; |
706 | |
719 | } |
707 | |
720 | } |
708 | |
721 | break; |
709 | case TO: |
722 | default: |
710 | *high = eval_expression(expr->left.e,chip_generics); |
723 | Log (LOG_ERROR, "#Error : expression : illegal operator (%d)\n", e->opcode); |
711 | *low = eval_expression(expr->right.e,chip_generics); |
724 | } |
712 | rc = TO; |
725 | /* printf("(%d)",r); */ |
713 | break; |
726 | return r; |
714 | |
727 | } |
715 | case DOWNTO: |
728 | 716 | *high = eval_expression(expr->left.e,chip_generics); |
|
729 | int eval_vhdl_expression (expression_t *expr, int *high, int *low) |
717 | *low = eval_expression(expr->right.e,chip_generics); |
730 | { |
718 | rc = DOWNTO; |
731 | int rc; |
719 | break; |
732 | 720 | ||
733 | generic_info_t **chip_generics = |
721 | |
734 | NULL; /* no local search scope, order of declaration should ensure that |
722 | default: |
735 | generics are defined before use */ |
723 | /* handle the expressions down each level of the hierarchy */ |
736 | 724 | *high = eval_expression(expr,chip_generics); |
|
737 | if (!expr) |
725 | *low = *high; |
738 | return 0; |
726 | rc = IS_INTEGER; |
739 | /* my be range at top level in variable */ |
727 | break; |
740 | if (expr->opcode == EXP_VARIABLE) |
728 | } |
741 | expr = expr->left.g->expr; |
- | |
742 | - | ||
743 | if (!expr) |
- | |
744 | return 0; |
- | |
745 | - | ||
746 | switch (expr->opcode) |
- | |
747 | { |
- | |
748 | case TO: |
- | |
749 | *high = eval_expression (expr->left.e, chip_generics); |
- | |
750 | *low = eval_expression (expr->right.e, chip_generics); |
- | |
751 | rc = TO; |
- | |
752 | break; |
- | |
753 | - | ||
754 | case DOWNTO: |
- | |
755 | *high = eval_expression (expr->left.e, chip_generics); |
- | |
756 | *low = eval_expression (expr->right.e, chip_generics); |
- | |
757 | rc = DOWNTO; |
- | |
758 | break; |
- | |
759 | - | ||
760 | default: |
- | |
761 | /* handle the expressions down each level of the hierarchy */ |
- | |
762 | *high = eval_expression (expr, chip_generics); |
- | |
763 | *low = *high; |
- | |
764 | rc = IS_INTEGER; |
- | |
765 | break; |
- | |
766 | } |
- | |
767 | #if defined DEBUG_EXPRESSION |
729 | #if defined DEBUG_EXPRESSION |
768 | print_msg_expression (stdout, "eval vhdl ", expr); |
730 | print_msg_expression(stdout,"eval vhdl ",expr); |
769 | printf ("high %d low %d rc %d\n", *high, *low, rc); |
731 | printf("high %d low %d rc %d\n", |
- | 732 | *high,*low, |
|
- | 733 | rc ); |
|
770 | #endif |
734 | #endif |
771 | return rc; |
735 | return rc; |
- | 736 | } |
|
772 | } |
737 | |
773 | 738 | ||
774 | int eval_gen_expression (generic_info_t *gen) |
739 | int eval_gen_expression( |
775 | { |
- | |
- | 740 | generic_info_t * gen) { |
|
776 | #if defined NEED_EVAL_GEN |
741 | #if defined NEED_EVAL_GEN |
777 | expression_t *exp; |
742 | expression_t * exp; |
778 | if (gen) |
743 | if (gen) { |
779 | { |
- | |
780 | exp = gen->expr; |
744 | exp = gen->expr; |
781 | /* printf("Ptr %p: ",exp); */ |
745 | /* printf("Ptr %p: ",exp); */ |
782 | if (exp) |
- | |
783 | { |
746 | if (exp) { |
784 | switch (exp->opcode) |
747 | switch (exp->opcode) { |
785 | { |
- | |
786 | case EXP_STRING: |
748 | case EXP_STRING : |
787 | gen->valuename = exp->left.s; |
749 | gen->valuename = exp->left.s; |
788 | gen->g_type = IS_STRING; |
750 | gen->g_type = IS_STRING; |
789 | gen->valid = 1; |
751 | gen->valid = 1; |
790 | break; |
752 | break; |
791 | case TO: |
753 | case TO : |
792 | gen->valid = 1; |
754 | gen->valid = 1; |
793 | gen->g_type = TO; |
755 | gen->g_type = TO; |
794 | 756 | ||
795 | break; |
757 | break; |
796 | 758 | ||
797 | case DOWNTO: |
759 | case DOWNTO : |
798 | gen->valid = 1; |
760 | gen->valid = 1; |
799 | gen->g_type = DOWNTO; |
761 | gen->g_type = DOWNTO; |
800 | break; |
762 | break; |
801 | default: |
763 | default : |
802 | /* handle the expressions down each level of the hierarchy */ |
764 | /* handle the expressions down each level of the hierarchy */ |
803 | gen->valid = 1; |
765 | gen->valid = 1; |
804 | gen->g_type = IS_INTEGER; |
766 | gen->g_type = IS_INTEGER; |
805 | } |
767 | } |
806 | gen->g_class = DEFINED; |
768 | gen->g_class = DEFINED; |
807 | return gen->g_type; |
769 | return gen->g_type; |
808 | } |
770 | } |
809 | } |
771 | } |
810 | 772 | ||
811 | return NO_VALUE; |
773 | return NO_VALUE; |
812 | #else |
774 | #else |
813 | return gen->g_type; |
775 | return gen->g_type; |
814 | #endif |
776 | #endif |
815 | } |
777 | } |
816 | 778 | ||
817 | /* delete any expression pointed to */ |
779 | /* delete any expression pointed to */ |
818 | void free_expression (expression_t *ptr) |
780 | void free_expression(expression_t * ptr) { |
819 | { |
781 | |
820 | if (!ptr) |
782 | if (!ptr) |
821 | return; |
783 | return; |
822 | switch (ptr->opcode) |
784 | switch(ptr->opcode) { |
823 | { |
- | |
824 | case EXP_STRING: |
785 | case EXP_STRING: |
825 | if (ptr->left.s) |
786 | if(ptr->left.s) |
826 | free (ptr->left.s); |
787 | free(ptr->left.s); |
827 | case EXP_CONSTANT: |
788 | case EXP_CONSTANT: |
828 | case EXP_BOOLEAN: |
789 | case EXP_BOOLEAN: |
829 | case EXP_VARIABLE: |
790 | case EXP_VARIABLE: |
830 | case EXP_VAR_REF: |
791 | case EXP_VAR_REF: |
831 | if (ptr->right.s) |
792 | if(ptr->right.s) |
832 | free (ptr->right.s); /* remove string */ |
793 | free(ptr->right.s); /* remove string */ |
833 | break; |
794 | break; |
834 | default: |
795 | default: |
835 | if (ptr->left.e) |
796 | if (ptr->left.e) |
836 | free_expression (ptr->left.e); |
797 | free_expression(ptr->left.e); |
837 | if (ptr->right.e) |
798 | if (ptr->right.e) |
838 | free_expression (ptr->right.e); |
799 | free_expression(ptr->right.e); |
839 | break; |
800 | break; |
- | 801 | ||
840 | } |
802 | } |
841 | free (ptr); |
803 | free(ptr); |
842 | } |
804 | } |
843 | /* copy the expression, fixing up the references to local generic constants |
805 | /* copy the expression, fixing up the references to local generic constants |
844 | at the same time . Need to */ |
806 | at the same time . Need to */ |
845 | expression_t *copy_expression (expression_t *ptr, socket_t *skt) |
807 | expression_t * copy_expression(expression_t * ptr,socket_t * skt) { |
846 | { |
- | |
847 | expression_t *copy; |
808 | expression_t * copy; |
848 | if (!ptr) |
809 | if(!ptr) |
849 | return NULL; |
810 | return NULL; |
850 | switch (ptr->opcode) |
811 | switch(ptr->opcode) { |
851 | { |
- | |
852 | case EXP_CONSTANT: |
812 | case EXP_CONSTANT : |
853 | case EXP_BOOLEAN: |
813 | case EXP_BOOLEAN : |
854 | case EXP_STRING: |
814 | case EXP_STRING : |
855 | case EXP_VAR_REF: |
815 | case EXP_VAR_REF: |
856 | case EXP_VARIABLE: |
816 | case EXP_VARIABLE: |
857 | case EXP_CHAR: |
817 | case EXP_CHAR: |
858 | return ptr; /* no copy needed as this is a terminal node that cannot change */ |
818 | return ptr; /* no copy needed as this is a terminal node that cannot change */ |
859 | break; |
819 | break; |
860 | /* duplicate undefined references so each induvidual expression is fixed up */ |
820 | /* duplicate undefined references so each induvidual expression is fixed up */ |
861 | case EXP_UNDEF_VAR: |
821 | case EXP_UNDEF_VAR: |
862 | copy = calloc (1, sizeof (expression_t)); |
822 | copy = calloc(1,sizeof(expression_t)); |
863 | *copy = *ptr; |
823 | *copy = *ptr; |
864 | return copy; |
824 | return copy; |
865 | break; |
825 | break; |
866 | default: |
826 | default: |
867 | return compile_expression ( |
827 | return compile_expression(ptr->opcode, |
868 | ptr->opcode, |
- | |
869 | copy_expression (ptr->left.e, skt), |
828 | copy_expression(ptr->left.e,skt), |
870 | copy_expression (ptr->right.e, skt)); |
829 | copy_expression(ptr->right.e,skt)); |
871 | break; |
830 | break; |
872 | } |
831 | } |
873 | return NULL; |
832 | return NULL; |
- | 833 | } |
|
874 | } |
834 | |
875 | 835 | ||
876 | struct vhdl *copy_vhdl (vhdl_t *vhdl, socket_t *skt) |
836 | struct vhdl * copy_vhdl(vhdl_t * vhdl,socket_t * skt) { |
877 | { |
- | |
878 | vhdl_t *new_vhdl; |
837 | vhdl_t * new_vhdl; |
879 | if (!vhdl) |
838 | if(!vhdl) |
880 | return NULL; |
839 | return NULL; |
881 | new_vhdl = calloc (1, sizeof (vhdl_t)); |
840 | new_vhdl = calloc(1,sizeof(vhdl_t)); |
882 | *new_vhdl = *vhdl; |
841 | *new_vhdl = *vhdl; |
883 | new_vhdl->expr = copy_expression (vhdl->expr, skt); |
842 | new_vhdl->expr = copy_expression(vhdl->expr,skt); |
884 | new_vhdl->default_expr = copy_expression (vhdl->default_expr, skt); |
843 | new_vhdl->default_expr = copy_expression(vhdl->default_expr,skt); |
885 | #if defined DEBUG_EXPRESSION |
844 | #if defined DEBUG_EXPRESSION |
886 | printf ("Type = %s\n", vhdl->basetype); |
845 | printf("Type = %s\n",vhdl->basetype); |
887 | print_msg_expression (stdout, "Copied expr", new_vhdl->expr); |
846 | print_msg_expression(stdout,"Copied expr",new_vhdl->expr); |
888 | print_msg_expression (stdout, "Copied default", new_vhdl->default_expr); |
847 | print_msg_expression(stdout,"Copied default",new_vhdl->default_expr); |
889 | #endif |
848 | #endif |
890 | return new_vhdl; |
849 | return new_vhdl; |
- | 850 | } |
|
- | 851 | ||
- | 852 | ||
- | 853 | ||
891 | } |
854 |