Subversion Repositories Vertical

Rev

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