source: vis_dev/vl2mv-2.3/src/parser/vl_create.c @ 50

Last change on this file since 50 was 18, checked in by cecile, 13 years ago

vl2mv added

File size: 36.9 KB
Line 
1/*
2
3  Copyright (c) 1992, 1993
4        Regents of the University of California
5  All rights reserved.
6
7  Use and copying of this software and preparation of derivative works
8  based upon this software are permitted.  However, any distribution of
9  this software or derivative works must include the above copyright
10  notice.
11
12  This software is made available AS IS, and neither the Electronics
13  Research Laboratory or the Universify of California make any
14  warranty about the software, its performance or its conformity to
15  any specification.
16
17  Author: Szu-Tsung Cheng, stcheng@ic.Berkeley.EDU
18          10/92
19          10/93
20
21  $Header: /projects/development/hsv/CVSRepository/vl2mv/src/parser/vl_create.c,v 1.3 2009/03/09 20:25:57 fabio Exp $
22
23
24*/
25
26
27#include "util.h"
28#include "list.h"
29#include "st.h"
30#include "set.h"
31#include "array.h"
32#include "vl_types.h"
33#include "vl_defs.h"
34#include "vlr_int.h"
35#include "vl_create.h"
36#include "vl_write.h"
37#include "vl_write_util.h"
38#include "verilog.h"
39
40extern int yylineno;
41extern int task_mode;
42extern int aliasSP;
43extern st_table *aliasStack[];
44extern int use_libraryGate;
45
46vl_descPtr mod_list;
47static int CreTrace = 0;
48
49static int bstr_to_i ARGS((char *str));
50
51vl_desc *vl_create_desc(char *filename)
52{
53    vl_descPtr desc;
54
55    CreTRACE("Creating Description\n");
56    desc = (vl_descPtr)chk_malloc(sizeof(vl_desc));
57    desc->filename = filename;
58    desc->type_st = st_init_table(strcmp, st_strhash);
59    desc->modules = lsCreate();
60    desc->mp_st = st_init_table(strcmp, st_strhash);
61    desc->decl_st = st_init_table(ptrcmp, ptrhash);
62    desc->lib_st = st_init_table(strcmp, st_strhash);
63    desc->mp_undefined = set_empty();
64    desc->fg_vars_st = st_init_table(ptrcmp, ptrhash);
65    desc->handle = (lsHandle)0;
66    desc->mod_holes = st_init_table(strcmp, st_strhash);
67    desc->synclock_st = st_init_table(strcmp, st_strhash);
68    return desc;
69}
70
71vl_type *vl_create_typedecl(char *type_name, struct vl_type_specifier *type_specifier)
72{
73    vl_type *retval;
74
75    retval = (vl_type*)chk_malloc(sizeof(vl_type));
76    retval->name = type_name;
77    retval->specifier = type_specifier;
78    st_insert(mod_list->type_st, type_name, (char*)retval);
79
80    return retval;
81}
82
83vl_type_specifier *vl_create_type_specifier(short typeform, vl_enum_type *type_spc)
84{
85    vl_type_specifier *retval;
86
87    retval = (vl_type_specifier*)chk_malloc(sizeof(vl_type_specifier));
88    retval->typeform = typeform;
89    switch(typeform) {
90    case EnumType: retval->u.enum_type = type_spc; break;
91    default: break;
92    }
93
94    return retval;
95}
96
97vl_enum_type *vl_create_enum_type(char *name, lsList elts_list)
98{
99    vl_enum_type *retval;
100    vl_enumerator *enum_elt;
101    lsGen gen;
102
103    retval = (vl_enum_type*)chk_malloc(sizeof(vl_enum_type));
104    retval->name = name;
105    retval->domain_list = elts_list;
106    retval->domain_st = st_init_table(strcmp, st_strhash);
107    for (gen=lsStart(elts_list);
108         lsNext(gen, (lsGeneric*)&enum_elt, LS_NH)!=LS_NOMORE;) {
109        st_insert(retval->domain_st, enum_elt->name, (char*)enum_elt);
110    }
111    lsFinish(gen);
112
113    return retval;
114}
115
116vl_enumerator *vl_create_enumerator(char *enum_name, int enum_val)
117{
118    vl_enumerator *retval;
119
120    retval = (vl_enumerator*)chk_malloc(sizeof(vl_enumerator));
121    retval->name = enum_name;
122    retval->val = enum_val;
123
124    return retval;
125}
126
127vl_module *vl_create_module(vl_id_range *mod_name, lsList ports, lsList mod_items)
128{
129    vl_module *mod;
130    vl_module *clash_module;
131
132    CreTRACE("Creating module\n");
133    if (st_lookup(mod_list->mp_st, mod_name->name, (char**)&clash_module)) {
134        clash_module->type = ModDecl;
135        clash_module->flags = 0;
136        clash_module->ports = ports;
137        clash_module->mod_items = mod_items;
138        if (clash_module->inst_st) {
139            clash_module->inst_st = st_init_table(strcmp, st_strhash);
140        }
141        if (clash_module->param_st) {
142            clash_module->param_st = st_init_table(strcmp, st_strhash);
143        }
144        if (clash_module->sig_st) {
145            clash_module->sig_st = st_init_table(strcmp, st_strhash);
146        }
147        if (clash_module->latch_st) {
148            clash_module->latch_st = st_init_table(strcmp, st_strhash);
149        }
150        if (clash_module->quasi_st) {
151            clash_module->quasi_st = st_init_table(strcmp, st_strhash);
152        }
153        if (clash_module->func_st) {
154            clash_module->func_st = st_init_table(strcmp, st_strhash);
155        }
156        if (clash_module->uninit_set) {
157            clash_module->uninit_set = st_init_table(strcmp, st_strhash);
158        }
159        if (clash_module->combVar_st) {
160            clash_module->combVar_st = st_init_table(strcmp, st_strhash);
161        }
162        if (clash_module->seqVar_st) {
163            clash_module->seqVar_st = st_init_table(strcmp, st_strhash);
164        }
165        if (clash_module->task_st) {
166            clash_module->task_st = st_init_table(strcmp, st_strhash);
167        }
168        return clash_module;
169    }
170    mod = (vl_module *)chk_malloc(MAX(sizeof(vl_module),sizeof(vl_primitive)));
171    st_insert(mod_list->mp_st, mod_name->name, (char *)mod);
172    lsNewEnd(mod_list->modules, (char *)mod, LS_NH);
173    mod->type = ModDecl;
174    mod->flags = 0;
175    mod->name = mod_name;
176    mod->ports = ports;
177    mod->sig_st = st_init_table(strcmp, st_strhash);
178    mod->param_st = st_init_table(strcmp, st_strhash);
179    mod->param_list = lsCreate();
180    mod->inst_st = st_init_table(strcmp, st_strhash);
181    mod->latch_st = st_init_table(strcmp, st_strhash);
182    mod->quasi_st = st_init_table(strcmp, st_strhash);
183    mod->func_st = st_init_table(strcmp, st_strhash);
184    mod->uninit_set = st_init_table(strcmp, st_strhash);
185    mod->combVar_st = st_init_table(strcmp, st_strhash);
186    mod->seqVar_st = st_init_table(strcmp, st_strhash);
187    mod->mod_items = mod_items;
188    mod->clk = NIL(vl_event_expr);
189    mod->syndrome_width = 0;
190    mod->rst_syndrome_width = 0;
191    mod->flow_graphs = lsCreate();
192    mod->task_st = st_init_table(strcmp, st_strhash);
193    mod->dup_count = 0;
194    mod->visited = 0;
195    return(mod);
196}
197
198
199vl_primitive *vl_create_primitive(vl_id_range *prim_name, lsList ports,lsList  prim_decls, lsList prim_entries)
200{
201    vl_primitive *prim;
202    vl_primitive *clash_prim;
203
204    CreTRACE("Creating primitive\n");
205    if (st_lookup(mod_list->mp_st, prim_name->name, (char**)&clash_prim)) {
206        clash_prim->type = CombPrimDecl;
207        clash_prim->flags = 0;
208        clash_prim->ports = ports;
209        clash_prim->sig_st = st_init_table(strcmp, st_strhash);
210        clash_prim->uninit_set = st_init_table(strcmp, st_strhash);
211        clash_prim->decls = prim_decls;
212        clash_prim->entries = prim_entries;
213        clash_prim->handle = (lsHandle)0;
214        return clash_prim;
215    }
216    prim = (vl_primitive *)chk_malloc(sizeof(vl_primitive));
217        st_insert(mod_list->mp_st, prim_name->name, (char *)prim);
218    prim->type = CombPrimDecl;
219    prim->flags = 0;
220    prim->name = prim_name;
221    prim->ports = ports;
222    prim->sig_st = st_init_table(strcmp, st_strhash);
223    prim->uninit_set = st_init_table(strcmp, st_strhash);
224    prim->decls = prim_decls;
225    prim->entries = prim_entries;
226    prim->handle = (lsHandle)0;
227    return(prim);
228}
229
230vl_port *vl_create_port(short type, vl_id_range *id, lsList exprs)
231{
232    vl_port *port;
233
234    CreTRACE("Creating Port\n");
235    port = (vl_port *)chk_malloc(sizeof(vl_port));
236    port->type = type;
237    port->id = id;
238    port->port_exp = exprs;
239    return port;
240}
241
242vl_port_connect *vl_create_port_connect(short type, vl_id_range *id, vl_expr *expr)
243{
244    vl_port_connect *port_connect;
245
246    CreTRACE("Creating Port Connect\n");
247    port_connect = (vl_port_connect *)chk_malloc(sizeof(vl_port_connect));
248    port_connect->type = type;
249    port_connect->id = id;
250    port_connect->expr = expr;
251    return port_connect;
252}
253
254vl_prim_entry *vl_create_prim_entry(lsList inputs, unsigned char state,
255                                    unsigned char output)
256{
257    vl_prim_entry *entry;
258    lsGen gen;
259    unsigned int insym;
260    int i = 0;
261
262    CreTRACE("Creating primitive entry");
263    entry = (vl_prim_entry *)chk_malloc(sizeof(vl_prim_entry));
264    entry->state = state;
265    entry->next_state = output;
266    for (gen = lsStart(inputs);
267         i<MAXINLEN && lsNext(gen, &insym, LS_NH)!=LS_NOMORE; ) {
268            entry->inputs[i++] = insym;
269    }
270    return entry;
271}
272
273
274vl_decl *vl_create_basicdecl(short type, lsList ids)
275{
276    vl_decl *decl;
277
278    CreTRACE("Creating Basic decl\n");
279    decl = (vl_decl *)chk_malloc(sizeof(vl_decl));
280    decl->type = type;
281    decl->flags = 0;
282    decl->ids = ids;
283    decl->handle = (lsHandle)0;
284    if (type == EventDecl) vl_create_rangedecl(NIL(vl_type), type,
285                                               NIL(vl_range), ids, 0);
286
287    return(decl);
288}
289
290vl_rangedecl *vl_create_rangedecl(vl_type *var_type, short type, vl_range
291                                  *range, lsList ids, int mv)
292{
293    vl_rangedecl *decl;
294    lsGen gen;
295    char *id, *dummy;
296    char *idname;
297
298    CreTRACE("Creating Range decl\n");
299    decl = (vl_rangedecl *)chk_malloc(sizeof(vl_rangedecl));
300    decl->type = type;
301    decl->flags = (type==InputDecl)?InPort:(type==OutputDecl)?OutPort:
302                  (type==InoutDecl)?(InPort|OutPort):RegVar;
303    decl->flags |= mv;
304    decl->range = range;
305    decl->ids = ids;
306    decl->handle = (lsHandle)0;
307
308    if (var_type) {
309        switch(var_type->specifier->typeform) {
310        case EnumType: decl->flags |= MVar; break;
311        default: semantic_error("can not handle types other than enum");
312        }
313    }
314
315
316    if (task_mode &&
317        (type==InputDecl || type==OutputDecl || type==InoutDecl))
318        return decl;
319
320
321    gen = lsStart(ids);
322    while (lsNext(gen, &id, LS_NH) != LS_NOMORE) {
323        if (var_type) ((vl_id_range *)id)->id_type = var_type;
324        ((vl_id_range *)id)->mpg_master_exp = decl;
325        ((vl_id_range *)id)->flags |= (mv | decl->flags);
326        idname = ((vl_id_range *)id)->name;
327
328        if (type==EventDecl) ((vl_id_range*)id)->flags |= EventVar;
329
330        if (vl_currentModule != NIL(vl_module)) {
331            if (!st_lookup(SIG_ST(vl_currentModule), idname, &dummy)) {
332                st_insert(SIG_ST(vl_currentModule), idname, id);
333                dummy = id;
334            } else {
335                ((vl_id_range*)dummy)->flags |= mv;
336                ((vl_id_range*)dummy)->flags |= decl->flags;
337                if (!(((vl_id_range*)dummy)->range))
338                    ((vl_id_range*)dummy)->range = ((vl_id_range*)id)->range;
339                if (!((vl_id_range*)dummy)->id_type)
340                    ((vl_id_range*)dummy)->id_type =
341                        ((vl_id_range*)id)->id_type;
342                if (!get_decl_range(((vl_id_range*)dummy)->mpg_master_exp)) {
343                    void *new_decl;
344                    new_decl = chng_decl_range(((vl_id_range*)dummy)->mpg_master_exp,
345                                               range);
346                    if (new_decl && range) {
347                        lsNewEnd(((vl_netdecl*)new_decl)->ids, dummy, 0);
348                        ((vl_id_range*)dummy)->mpg_master_exp = new_decl;
349                    }
350                }
351            }
352        } else if (vl_currentPrimitive != NIL(vl_primitive)) {
353            if (!st_lookup(vl_currentPrimitive->sig_st, idname, &dummy)) {
354                st_insert(vl_currentPrimitive->sig_st, idname, id);
355                dummy = id;
356            } else {
357                ((vl_id_range*)dummy)->flags |= mv;
358                ((vl_id_range*)dummy)->flags |= decl->flags;
359                if (!(((vl_id_range*)dummy)->range))
360                    ((vl_id_range*)dummy)->range = ((vl_id_range*)id)->range;
361                if (!((vl_id_range*)dummy)->id_type)
362                    ((vl_id_range*)dummy)->id_type =
363                        ((vl_id_range*)id)->id_type;
364            }
365        } else
366            compile_error("declaring signal not within module/primitive");
367
368
369
370        if (vl_currentFunction) {
371            if (type==OutputDecl) {
372                char buf[MAXSTRLEN];
373                sprintf(buf, "function %s can not have output port %s",
374                        vl_currentFunction->name->name, idname);
375                yylineno = -1;
376                compile_error(buf);
377            }
378
379            if (type==InputDecl) {
380                lsNewEnd(vl_currentFunction->ports, (lsGeneric)dummy, 0);
381            }
382        }
383    }
384    lsFinish(gen);
385
386    return(decl);
387}
388
389vl_paramdecl *vl_create_paramdecl(short type, lsList assigns)
390{
391    vl_paramdecl *decl;
392    lsGen gen;
393    vl_bassign_stmt *assign;
394    char *dummy;
395    int val;
396
397    CreTRACE("Creating Parameter decl\n");
398    decl = (vl_paramdecl *)chk_malloc(sizeof(vl_paramdecl));
399    decl->type = type;
400    decl->flags = 0;
401    decl->assigns = assigns;
402    decl->handle = (lsHandle)0;
403
404    for (gen=lsStart(assigns); lsNext(gen, &assign, LS_NH) != LS_NOMORE; ) {
405        val = vl_eval_expr(assign->rhs);
406        assign->lhs->name->mpg_master_exp = (void*) val;
407        if (st_lookup(vl_currentModule->param_st,
408                      assign->lhs->name->name, &dummy)) {
409            char buf[MAXSTRLEN];
410            sprintf(buf, "%s:duplicated parameter declaration - %s",
411                    vl_currentModule->name->name, assign->lhs->name->name);
412            yylineno = -1;
413            compile_error(buf);
414        }
415        lsNewEnd(vl_currentModule->param_list, assign->lhs->name->name, 0);
416        st_insert(vl_currentModule->param_st,
417                  assign->lhs->name->name, assign->lhs->name);
418    }
419    lsFinish(gen);
420
421    return(decl);
422}
423
424vl_netdecl *vl_create_netdecl(vl_type *var_type, short type, int strength, vl_range *range, vl_delay *delay, lsList ids)
425{
426    vl_netdecl *decl;
427    lsGen gen;
428    vl_id_range *id;
429    vl_id_range *id_sym;
430
431    CreTRACE("Creating Net decl\n");
432    decl = (vl_netdecl *)chk_malloc(sizeof(vl_netdecl));
433    decl->type = type;
434    decl->flags = 0;
435    decl->strength = strength;
436    decl->range = range;
437    decl->delay = delay;
438    decl->ids = ids;
439    decl->handle = (lsHandle)0;
440
441    if (var_type) {
442        switch(var_type->specifier->typeform) {
443        case EnumType: decl->flags |= MVar; break;
444        default: semantic_error("can not handle types other than enum");
445        }
446    }
447
448
449    gen = lsStart(ids);
450    while (lsNext(gen, &id, LS_NH) != LS_NOMORE) {
451        id->mpg_master_exp = decl;
452        id->flags |= decl->flags;
453        if (var_type) id->id_type = var_type;
454
455        if (vl_currentModule != NIL(vl_module)) {
456            if (!st_lookup(SIG_ST(vl_currentModule), id->name, &id_sym))
457                st_insert(SIG_ST(vl_currentModule), id->name, id);
458            else {
459                id_sym->flags |= decl->flags;
460                if (!id_sym->range)
461                    id_sym->range = id->range;
462                if (!id_sym->id_type)
463                    id_sym->id_type = id->id_type;
464                if (!get_decl_range(id_sym->mpg_master_exp)) {
465                    void *new_decl;
466                    new_decl = chng_decl_range(id_sym->mpg_master_exp, range);
467                    if (new_decl && range) {
468                        lsNewEnd(((vl_netdecl*)new_decl)->ids, id_sym, 0);
469                        id_sym->mpg_master_exp = new_decl;
470                    }
471                }
472            }
473        } else if (vl_currentPrimitive != NIL(vl_primitive)) {
474            if (!st_lookup(vl_currentPrimitive->sig_st, id->name, &id_sym))
475                st_insert(vl_currentPrimitive->sig_st, id->name, id);
476            else {
477                id_sym->flags |= decl->flags;
478                if (!id_sym->range)
479                    id_sym->range = id->range;
480                if (!id_sym->id_type)
481                    id_sym->id_type = id->id_type;
482            }
483        } else
484            compile_error("declaring signal not within module/primitive");
485    }
486    lsFinish(gen);
487
488    return(decl);
489}
490
491vl_netdecl *vl_create_netdecl_assigned(vl_type *var_type, short type, int strength, vl_range *range, vl_delay *delay, lsList assignments)
492{
493    vl_netdecl *decl;
494    lsGen gen;
495    vl_id_range *id;
496    vl_id_range *id_sym;
497    lsList ids;
498
499    CreTRACE("Creating Net decl\n");
500    decl = (vl_netdecl *)chk_malloc(sizeof(vl_netdecl));
501    decl->type = type;
502    decl->flags = 0;
503    decl->strength = strength;
504    decl->range = range;
505    decl->delay = delay;
506    decl->ids = assignments;
507    decl->handle = (lsHandle)0;
508    ids = get_lhs_ids(assignments);
509    if (var_type) {
510        switch(var_type->specifier->typeform) {
511        case EnumType: decl->flags |= MVar; break;
512        default: semantic_error("can not handle types other than enum");
513        }
514    }
515
516
517    gen = lsStart(ids);
518    while (lsNext(gen, (lsGeneric*)&id, LS_NH) != LS_NOMORE) {
519        id->mpg_master_exp = decl;
520        id->flags |= decl->flags;
521        if (var_type) id->id_type = var_type;
522
523        if (vl_currentModule != NIL(vl_module)) {
524            if (!st_lookup(SIG_ST(vl_currentModule), id->name, &id_sym))
525                st_insert(SIG_ST(vl_currentModule), id->name, id);
526            else {
527                id_sym->flags |= decl->flags;
528                if (!id_sym->range)
529                    id_sym->range = id->range;
530                if (!id_sym->id_type)
531                    id_sym->id_type = id->id_type;
532            }
533        } else if (vl_currentPrimitive != NIL(vl_primitive)) {
534            if (!st_lookup(vl_currentPrimitive->sig_st, id->name, &id_sym))
535                st_insert(vl_currentPrimitive->sig_st, id->name, id);
536            else {
537                id_sym->flags |= decl->flags;
538                if (!id_sym->range)
539                    id_sym->range = id->range;
540                if (!id_sym->id_type)
541                    id_sym->id_type = id->id_type;
542            }
543        } else
544            compile_error("declaring signal not within module/primitive");
545    }
546    lsFinish(gen);
547
548    return(decl);
549}
550
551
552vl_task *vl_create_task(vl_id_range *name, lsList decls, lsList stmts)
553{
554    vl_task *task;
555    lsGen gen, id_gen;
556    vl_rangedecl *decl;
557    vl_id_range *id;
558
559    CreTRACE("Creating Task\n");
560    task = (vl_task *)chk_malloc(sizeof(vl_task));
561    task->type = TaskDecl;
562    task->flags = 0;
563    task->name = name;
564    task->decls = decls;
565    task->stmts = stmts;
566    task->handle = (lsHandle)0;
567    task->io_lst = lsCreate();
568    task->sig_st = st_init_table(strcmp, st_strhash);
569    for (gen=lsStart(decls);
570         lsNext(gen, &decl, LS_NH) != LS_NOMORE; ) {
571        if (decl->ids) {
572            for (id_gen=lsStart(decl->ids);
573                 lsNext(id_gen, &id, LS_NH) != LS_NOMORE; ) {
574
575                st_insert(task->sig_st, id->name, id->name);
576                if (decl->type == InputDecl || decl->type == OutputDecl)
577                    lsNewEnd(task->io_lst, id->name, 0);
578            }
579            lsFinish(id_gen);
580        }
581    }
582    lsFinish(gen);
583    st_insert(vl_currentModule->task_st, name->name, task);
584    return(task);
585}
586
587vl_function *vl_create_function(short type, vl_range *range, vl_id_range *name, lsList decls, lsList stmts)
588{
589    vl_function *func;
590
591    CreTRACE("Creating Function\n");
592    func = (vl_function *)chk_malloc(sizeof(vl_function));
593    func->type = type;
594    func->flags = 0;
595    func->range = range;
596    func->name = name;
597    func->decls = decls;
598    func->stmts = stmts;
599    func->ports = lsCreate();
600    func->sig_st = st_init_table(strcmp, st_strhash);
601    func->uninit_set = st_init_table(strcmp, st_strhash);
602    func->handle = (lsHandle)0;
603    func->param_st = st_init_table(strcmp, st_strhash);
604    return(func);
605}
606
607vl_gate_inst_list *vl_create_gate_inst_list(short type, int strength, vl_delay *delays, lsList gates)
608{
609    vl_gate_inst_list *gatelist;
610
611    CreTRACE("Creating Gate Instance List\n");
612    gatelist = (vl_gate_inst_list *)chk_malloc(sizeof(vl_gate_inst_list));
613    gatelist->type = type;
614    gatelist->flags = 0;
615    gatelist->strength = strength;
616    gatelist->delays = delays;
617    gatelist->gates = gates;
618    gatelist->handle = (lsHandle)0;
619    return(gatelist);
620}
621
622vl_gate_inst *vl_create_gate_inst(vl_id_range *name, lsList terms)
623{
624    vl_gate_inst *gate;
625
626    use_libraryGate = 1;
627
628    CreTRACE("Creating Gate Instance\n");
629    gate = (vl_gate_inst *)chk_malloc(sizeof(vl_gate_inst));
630    gate->name = name;
631    gate->terms = terms;
632    gate->handle = (lsHandle)0;
633    return(gate);
634}
635
636typestruct *vl_add_find_mod_prim_instances(vl_id_range *mp_name, vl_delay *delay, int strength, lsList instances)
637{
638    char *mod_pri;
639    typestructPtr retval=NULL;
640    int still_unknown=0;
641
642    if (!st_lookup(vl_description->mp_st, mp_name->name, &mod_pri)) {
643        still_unknown = 1;
644    } else if (mod_pri == NIL(char)) {
645        still_unknown = 1;
646    }
647
648    if (still_unknown) {
649
650
651
652        mod_pri = (char*)vl_create_module(mp_name, LS_NIL, LS_NIL);
653        st_insert(mod_list->mp_st, mp_name->name, mod_pri);
654        retval = (typestructPtr)vl_create_mod_prim_inst_list(mp_name,
655                                    strength, delay, instances);
656        set_add(mp_name->name, mod_list->mp_undefined);
657        return retval;
658    } else {
659        if (((typestructPtr)mod_pri)->type == ModDecl) {
660            if (strength!=0)
661                compile_error("redundant strength for module instance");
662            retval = (typestructPtr)vl_create_mod_prim_inst_list(mp_name,
663                                        strength, delay, instances);
664            ((vl_mod_prim_inst_listPtr)retval)->type = ModInst;
665        } else if (((typestructPtr)mod_pri)->type == CombPrimDecl ||
666                   ((typestructPtr)mod_pri)->type == SeqPrimDecl) {
667            retval = (typestructPtr)vl_create_mod_prim_inst_list(mp_name,
668                                        strength, delay, instances);
669            ((vl_mod_prim_inst_listPtr)retval)->type = PrimInst;
670        } else {
671            compile_error("unknown module/primitive");
672        }
673    }
674
675    return retval;
676}
677
678
679vl_mod_prim_inst_list *vl_create_mod_prim_inst_list(vl_id_range *name, int strength, vl_delay *delays, lsList mps)
680{
681    vl_mod_prim_inst_list *mplist;
682
683    CreTRACE("Creating Module/Primitive Instance List\n");
684    mplist = (vl_mod_prim_inst_list *)chk_malloc(sizeof(vl_mod_prim_inst_list));
685    mplist->type = ModInst;
686    mplist->flags = 0;
687    mplist->name = name;
688    mplist->strength = strength;
689    mplist->delays = delays;
690    mplist->mps = mps;
691    mplist->handle = (lsHandle)0;
692    return(mplist);
693}
694
695vl_mod_prim_inst *vl_create_mod_prim_inst(vl_id_range *name,
696                                          lsList ports)
697{
698    vl_mod_prim_inst *mp;
699
700    CreTRACE("Creating Primitive Instance\n");
701    mp = (vl_mod_prim_inst *)chk_malloc(sizeof(vl_mod_prim_inst));
702    mp->name = name;
703    mp->ports = ports;
704    mp->handle = (lsHandle)0;
705    return(mp);
706}
707
708
709vl_procstmt *vl_create_procstmt(short type, void *stmt)
710{
711    vl_procstmt *pstmt;
712
713    CreTRACE("Creating Process stmt\n");
714    pstmt = (vl_procstmt *)chk_malloc(sizeof(vl_procstmt));
715    pstmt->type = type;
716    pstmt->flags = 0;
717    pstmt->stmt = stmt;
718    pstmt->pc = vl_create_symbolic_var(vlStrdup(new_pc()));
719    pstmt->fg_info = NIL(char);
720    return(pstmt);
721}
722
723vl_begin_end_stmt *vl_create_begin_end_stmt(vl_id_range *name, void *decls, void *stmts)
724{
725    vl_begin_end_stmt *bestmt;
726
727    CreTRACE("Creating beginend\n");
728    bestmt = (vl_begin_end_stmt *)chk_malloc(sizeof(vl_begin_end_stmt));
729    bestmt->type = BeginEndStmt;
730    bestmt->flags = 0;
731    bestmt->name = name;
732    bestmt->decls = decls;
733    bestmt->stmts = stmts;
734    bestmt->handle = (lsHandle)0;
735    return(bestmt);
736}
737
738vl_if_else_stmt *vl_create_if_else_stmt(vl_expr *cond, void *if_stmt, void *else_stmt)
739{
740    vl_if_else_stmt *stmt;
741
742    CreTRACE("Creating if_else_stmt\n");
743    stmt = (vl_if_else_stmt *)chk_malloc(sizeof(vl_if_else_stmt));
744    stmt->type = IfElseStmt;
745    stmt->flags = 0;
746    stmt->cond = cond;
747    stmt->if_stmt = if_stmt;
748    stmt->else_stmt = else_stmt;
749    stmt->handle = (lsHandle)0;
750    return(stmt);
751}
752
753vl_case_stmt *vl_create_case_stmt(short type, vl_expr *cond, lsList case_items)
754{
755    vl_case_stmt *stmt;
756
757    CreTRACE("Creating case_stmt\n");
758    stmt = (vl_case_stmt *)chk_malloc(sizeof(vl_case_stmt));
759    stmt->type = type;
760    stmt->flags = 0;
761    stmt->cond = cond;
762    stmt->case_items = case_items;
763    stmt->handle = (lsHandle)0;
764    return(stmt);
765}
766
767vl_forever_stmt *vl_create_forever_stmt(void *stmt)
768{
769    vl_forever_stmt *fstmt;
770
771    CreTRACE("Creating forever_stmt\n");
772    fstmt = (vl_forever_stmt *)chk_malloc(sizeof(vl_forever_stmt));
773    fstmt->type = ForeverStmt;
774    fstmt->flags = 0;
775    fstmt->stmt = stmt;
776    fstmt->handle = (lsHandle)0;
777    return(fstmt);
778}
779
780vl_repeat_stmt *vl_create_repeat_stmt( vl_expr *count, void *stmt)
781{
782    vl_repeat_stmt *rstmt;
783
784    CreTRACE("Creating repeat_stmt\n");
785    rstmt = (vl_repeat_stmt *)chk_malloc(sizeof(vl_repeat_stmt));
786    rstmt->type = RepeatStmt;
787    rstmt->flags = 0;
788    rstmt->count = count;
789    rstmt->stmt = stmt;
790    rstmt->handle = (lsHandle)0;
791    return(rstmt);
792}
793
794vl_while_stmt *vl_create_while_stmt(vl_expr *cond, void *stmt)
795{
796    vl_while_stmt *wstmt;
797
798    CreTRACE("Creating while_stmt\n");
799    wstmt = (vl_while_stmt *)chk_malloc(sizeof(vl_while_stmt));
800    wstmt->type = WhileStmt;
801    wstmt->flags = 0;
802    wstmt->cond = cond;
803    wstmt->stmt = stmt;
804    wstmt->handle = (lsHandle)0;
805    return(wstmt);
806}
807
808vl_for_stmt *vl_create_for_stmt(vl_bassign_stmt *init, vl_expr *cond, vl_bassign_stmt *end, void *stmt)
809{
810    vl_for_stmt *fstmt;
811
812    CreTRACE("Creating for_stmt\n");
813    fstmt = (vl_for_stmt *)chk_malloc(sizeof(vl_for_stmt));
814    fstmt->type = ForStmt;
815    fstmt->flags = 0;
816    fstmt->init = init;
817    fstmt->cond = cond;
818    fstmt->end = end;
819    fstmt->stmt = stmt;
820    fstmt->handle = (lsHandle)0;
821    return(fstmt);
822}
823
824vl_delay_control_stmt *vl_create_delay_control_stmt(vl_delay *delay, void *stmt)
825{
826    vl_delay_control_stmt *dcstmt;
827
828    CreTRACE("Creating delay_control_stmt\n");
829    dcstmt = (vl_delay_control_stmt *)chk_malloc(sizeof(vl_delay_control_stmt));
830    dcstmt->type = DelayControlStmt;
831    dcstmt->flags = 0;
832    dcstmt->delay = delay;
833    dcstmt->stmt = stmt;
834    dcstmt->fg_info = NIL(char);
835    return(dcstmt);
836}
837
838vl_event_control_stmt *vl_create_event_control_stmt(vl_event_expr *event, void *stmt)
839{
840    vl_event_control_stmt *ecstmt;
841
842    CreTRACE("Creating event_control_stmt\n");
843    ecstmt = (vl_event_control_stmt *)chk_malloc(sizeof(vl_event_control_stmt));
844    ecstmt->type = EventControlStmt;
845    ecstmt->flags = 0;
846    ecstmt->event = event;
847    ecstmt->stmt = stmt;
848    ecstmt->fg_info = NIL(char);
849    return(ecstmt);
850}
851
852
853vl_bassign_stmt *vl_create_bassign_stmt(short type, vl_lval *lhs, void *control, vl_expr *rhs)
854{
855    vl_bassign_stmt *bassign;
856
857    CreTRACE("Creating bassign_stmt\n");
858    bassign = (vl_bassign_stmt *)chk_malloc(sizeof(vl_bassign_stmt));
859    bassign->type = type;
860    bassign->flags = 0;
861    bassign->lhs = lhs;
862    bassign->control = control;
863    bassign->rhs = rhs;
864    bassign->lineno = yylineno;
865    bassign->fg_info = NIL(char);
866    return(bassign);
867}
868
869vl_cont_assign *vl_create_cont_assign_stmt(int strength, vl_delay *delay, lsList assigns)
870{
871    vl_cont_assign *cassign;
872
873    CreTRACE("Creating cont_assign");
874    cassign = (vl_cont_assign *)chk_malloc(sizeof(vl_cont_assign));
875    cassign->type = ContAssign;
876    cassign->flags = 0;
877    cassign->strength = strength;
878    cassign->delay = delay;
879    cassign->assigns = assigns;
880    return cassign;
881}
882
883vl_wait_stmt *vl_create_wait_stmt(vl_expr *cond, void *stmt)
884{
885    vl_wait_stmt *wstmt;
886
887    CreTRACE("Creating wait_stmt\n");
888    wstmt = (vl_wait_stmt *)chk_malloc(sizeof(vl_wait_stmt));
889    wstmt->type = WaitStmt;
890    wstmt->flags = 0;
891    wstmt->cond = cond;
892    wstmt->stmt = stmt;
893    wstmt->handle = (lsHandle)0;
894    return(wstmt);
895}
896
897vl_send_event_stmt *vl_create_send_event_stmt(vl_id_range *name)
898{
899    vl_send_event_stmt *send_event;
900
901    CreTRACE("creating send_event_stmt\n");
902    send_event = (vl_send_event_stmt*)chk_malloc(sizeof(vl_send_event_stmt));
903    send_event->type = SendEventStmt;
904    send_event->name = name;
905    send_event->fg_info = NIL(char);
906    return send_event;
907}
908
909vl_fork_join_stmt *vl_create_fork_join_stmt(vl_id_range *name, void *decls, void *stmts)
910{
911    vl_fork_join_stmt *fjstmt;
912
913    CreTRACE("Creating fork_join_stmt\n");
914    fjstmt = (vl_fork_join_stmt *)chk_malloc(sizeof(vl_fork_join_stmt));
915    fjstmt->type = ForkJoinStmt;
916    fjstmt->flags = 0;
917    fjstmt->name = name;
918    fjstmt->decls = decls;
919    fjstmt->stmts = stmts;
920    fjstmt->handle = (lsHandle)0;
921    return(fjstmt);
922}
923
924
925vl_task_enable_stmt *vl_create_task_enable_stmt(short type, vl_id_range *name, lsList args)
926{
927    vl_task_enable_stmt *testmt;
928
929    CreTRACE("Creating task_enable_stmt\n");
930    testmt = (vl_task_enable_stmt *)chk_malloc(sizeof(vl_task_enable_stmt));
931    testmt->type = type;
932    testmt->flags = 0;
933    testmt->name = name;
934    testmt->args = args;
935    testmt->handle = (lsHandle)0;
936    return(testmt);
937}
938
939vl_disable_stmt *vl_create_disable_stmt(vl_id_range *name)
940{
941    vl_disable_stmt *dstmt;
942
943    CreTRACE("Creating disable_stmt\n");
944    dstmt = (vl_disable_stmt *)chk_malloc(sizeof(vl_disable_stmt));
945    dstmt->type = DisableStmt;
946    dstmt->flags = 0;
947    dstmt->name = name;
948    dstmt->handle = (lsHandle)0;
949    return(dstmt);
950}
951
952vl_deassign_stmt *vl_create_deassign_stmt(vl_lval *lhs)
953{
954    vl_deassign_stmt *dstmt;
955
956    CreTRACE("Creating deassign_stmt\n");
957    dstmt = (vl_deassign_stmt *)chk_malloc(sizeof(vl_deassign_stmt));
958    dstmt->type = DeassignStmt;
959    dstmt->flags = 0;
960    dstmt->lhs = lhs;
961    dstmt->handle = (lsHandle)0;
962    return(dstmt);
963}
964
965vl_case_item *vl_create_case_item(short type, lsList expr, void *stmt)
966{
967    vl_case_item *item;
968
969    CreTRACE("Creating case_item\n");
970    item = (vl_case_item *)chk_malloc(sizeof(vl_case_item));
971    item->type = type;
972    item->flags = 0;
973    item->exprs = expr;
974    item->stmt = stmt;
975    item->handle = (lsHandle)0;
976    item->fg_info = NIL(char);
977    return(item);
978}
979
980vl_event_expr *vl_create_event_expr(short type, struct vl_expr *expr)
981{
982    vl_event_expr *event;
983
984    CreTRACE("Creating event_expr\n");
985    event = (vl_event_expr *)chk_malloc(sizeof(vl_event_expr));
986    event->type = type;
987    event->flags = 0;
988    event->expr = expr;
989    event->list = (lsList)0;
990    return(event);
991}
992
993vl_lval *vl_create_lval(short type, vl_id_range *name, vl_range *range,
994                        lsList concat)
995{
996    vl_lval *lval;
997
998    CreTRACE("Creating lval\n");
999    lval = (vl_lval *)chk_malloc(sizeof(vl_lval));
1000    lval->type = type;
1001    lval->flags = 0;
1002    lval->name = name;
1003    lval->range = range;
1004    lval->concat = concat;
1005    return(lval);
1006}
1007
1008vl_expr *vl_create_expr(short type, int intval, double realval, void *p1, void
1009                        *p2, void *p3)
1010{
1011    vl_expr *expr;
1012
1013    CreTRACE("Creating expr\n");
1014    expr = (vl_expr *)chk_malloc(sizeof(vl_expr));
1015    expr->type = type;
1016    expr->flags = 0;
1017    expr->fg_info1 = expr->fg_info2 = NIL(char);
1018    expr->fg_aux1 = expr->fg_aux2 = NIL(char);
1019    switch (type) {
1020    case BitExpr:
1021        expr->u.bexpr.part1 = (int)p1;
1022        expr->u.bexpr.part0 = (int)p2;
1023        expr->u.exprs.e3 = (vl_expr*)p3;
1024        expr->u.intval = bstr_to_i(p3);
1025        break;
1026    case IntExpr:
1027        expr->u.intval = intval;
1028        break;
1029    case RealExpr:
1030        expr->u.realval = realval;
1031        break;
1032    case IDExpr:
1033        expr->u.name = (vl_id_range *)p1;
1034        break;
1035    case BitSelExpr:    case PartSelExpr:
1036        expr->u.idrng = (vl_id_range *)p1;
1037        break;
1038    case ConcatExpr:
1039        expr->u.exprs.e1 = (vl_expr*)p1;
1040        expr->u.exprs.e2 = (vl_expr*)p2;
1041        expr->u.exprs.e3 = NIL(vl_expr);
1042        break;
1043    case MinTypMaxExpr:
1044        expr->u.exprs.e1 = (vl_expr*)p1;
1045        expr->u.exprs.e2 = (vl_expr*)p2;
1046        expr->u.exprs.e3 = (vl_expr*)p3;
1047        break;
1048    case StringExpr:
1049        expr->u.string = (char *)p1;
1050        break;
1051    case FuncExpr:
1052        expr->u.func_call.name = (vl_id_range *)p1;
1053        expr->u.func_call.args = (lsList)p2;
1054        break;
1055    case UplusExpr:    case UminusExpr:
1056    case UnotExpr:    case UcomplExpr:
1057
1058    case UandExpr:    case UnandExpr:
1059    case UorExpr:    case UnorExpr:
1060    case UxorExpr:    case UxnorExpr:
1061        expr->u.exprs.e1 = (vl_expr *)p1;
1062        expr->u.exprs.e2 = NIL(vl_expr);
1063        expr->u.exprs.e3 = NIL(vl_expr);
1064        break;
1065
1066    case BplusExpr:    case BminusExpr:
1067    case BtimesExpr:    case BdivExpr:
1068    case BremExpr:    case Beq2Expr:
1069    case Bneq2Expr:    case Beq3Expr:
1070    case Bneq3Expr:    case BlandExpr:
1071    case BlorExpr:    case BltExpr:
1072    case BleExpr:   case BgtExpr:
1073    case BgeExpr:    case BandExpr:
1074    case BorExpr:    case BxorExpr:
1075    case BxnorExpr:    case BlshiftExpr:
1076    case BrshiftExpr:
1077        expr->u.exprs.e1 = (vl_expr *)p1;
1078        expr->u.exprs.e2 = (vl_expr *)p2;
1079        expr->u.exprs.e3 = NIL(vl_expr);
1080        break;
1081
1082    case TcondExpr:
1083        expr->u.exprs.e1 = (vl_expr *)p1;
1084        expr->u.exprs.e2 = (vl_expr *)p2;
1085        expr->u.exprs.e3 = (vl_expr *)p3;
1086        break;
1087    case NondExpr: {
1088        int i;
1089        lsGen gen;
1090        vl_expr *sexp;
1091
1092        for (gen=lsStart(p1), i=0;
1093             lsNext(gen, &sexp, LS_NH) != LS_NOMORE; i++) {
1094        }
1095        (void)lsFinish(gen);
1096
1097        expr->type = type;
1098        expr->u.expr_list = (lsList)p1;
1099
1100        break;
1101    }
1102    }
1103    return(expr);
1104}
1105
1106
1107vl_range *vl_create_range(vl_expr *left, vl_expr *right)
1108{
1109    vl_range *range;
1110
1111    CreTRACE("Creating range\n");
1112    range = (vl_range *)chk_malloc(sizeof(vl_range));
1113    range->left = left;
1114    range->right = right;
1115    return(range);
1116}
1117
1118vl_delay *vl_create_delay(vl_expr *delay1, vl_expr *delay2, vl_expr *delay3)
1119{
1120    vl_delay *delay;
1121
1122    CreTRACE("Creating delay\n");
1123    delay = (vl_delay *)chk_malloc(sizeof(vl_delay));
1124    delay->delay1 = delay1;
1125    delay->delay2 = delay2;
1126    delay->delay3 = delay3;
1127    return(delay);
1128}
1129
1130
1131
1132vl_range_or_typePtr vl_create_range_or_type(short type, vl_rangePtr range)
1133{
1134    vl_range_or_typePtr rng_typ;
1135
1136    rng_typ = (vl_range_or_typePtr)chk_malloc(sizeof(vl_range_or_type));
1137    rng_typ->type = type;
1138    rng_typ->range = range;
1139    return rng_typ;
1140}
1141
1142
1143vl_id_range *vl_create_id_range(char *name, vl_range *range)
1144{
1145    vl_id_range *id_range;
1146
1147    CreTRACE("Creating id_range\n");
1148    id_range = (vl_id_range *)chk_malloc(sizeof(vl_id_range));
1149    id_range->dummy_type = None;
1150    id_range->name = name;
1151    id_range->range = range;
1152    id_range->flags = 0;
1153    id_range->initial = lsCreate();
1154    id_range->syndrome_expr_list = lsCreate();
1155    id_range->rst_syndrome_expr_list = lsCreate();
1156    id_range->symbolic_values = st_init_table(strcmp, st_strhash);
1157    id_range->mpg_master_exp = NIL(void);
1158    id_range->id_type = NIL(vl_type);
1159    id_range->edge_trigger = NIL(vl_term);
1160    id_range->sensitiveList = NIL(st_table);
1161    id_range->unintType = NIL(char);
1162    return(id_range);
1163}
1164
1165vl_term *vl_create_term(vl_id_range *name, int lo, int hi)
1166{
1167    vl_term *term;
1168
1169    CreTRACE("Creating term\n");
1170    term = (vl_term *)chk_malloc(sizeof(vl_term));
1171    term->name = name;
1172    term->flag = 0;
1173    term->lo = lo;
1174    term->hi = hi;
1175    term->term_type = name->id_type;
1176    return term;
1177}
1178
1179
1180vl_id_range *vl_copy_id_range(vl_id_range *id_range)
1181{
1182    vl_id_range *retval;
1183    int i;
1184    char *alias, *dummy;
1185
1186    CreTRACE("Copying id_range\n");
1187    retval = (vl_id_range *)chk_malloc(sizeof(vl_id_range));
1188
1189    alias=id_range->name;
1190    for (i=aliasSP-1; i>=0; i--) {
1191        if (st_lookup(aliasStack[i], id_range->name, &dummy)) {
1192            alias = dummy;
1193            break;
1194        }
1195    }
1196    retval->name = vlStrdup(alias);
1197    retval->flags = id_range->flags;
1198    retval->range = id_range->range;
1199    retval->initial = lsCreate();
1200    retval->syndrome_expr_list = id_range->syndrome_expr_list;
1201    retval->rst_syndrome_expr_list = id_range->rst_syndrome_expr_list;
1202    retval->mpg_master_exp = id_range->mpg_master_exp;
1203    retval->id_type = id_range->id_type;
1204    retval->unintType = id_range->unintType;
1205    return(retval);
1206}
1207
1208vl_term *vl_copy_term(vl_term *term)
1209{
1210    vl_term *retval;
1211
1212    CreTRACE("Copying term\n");
1213    retval = (vl_term*)chk_malloc(sizeof(vl_term));
1214    retval->name = vl_copy_id_range(term->name);
1215    retval->flag = term->flag;
1216    retval->lo = term->lo;
1217    retval->hi = term->hi;
1218    retval->term_type = term->term_type;
1219    return retval;
1220}
1221
1222var_info *copy_var_info(var_info *var)
1223{
1224    var_info *retval;
1225
1226    retval = (var_info*)chk_malloc(sizeof(var_info));
1227    retval->id = vl_copy_id_range(var->id);
1228    retval->current_terminal = vl_copy_term(var->current_terminal);
1229    retval->cond_list = lsCopy(var->cond_list,0);
1230    retval->extra = NIL(void);
1231    return retval;
1232}
1233
1234
1235vl_term *create_rename_term(vl_id_range *id_range, char *newname, int lo, int hi)
1236
1237{
1238    vl_id_range *new_id;
1239    vl_term *new_term;
1240
1241    new_id = vl_copy_id_range(id_range);
1242
1243    new_id->name = vlStrdup(newname);
1244    new_term = vl_create_term(new_id, lo, hi);
1245    new_term->flag = get_decl_flags(id_range->mpg_master_exp);
1246    return new_term;
1247}
1248
1249var_info *create_var_info(vl_id_range *id, vl_term *term)
1250{
1251    var_info *retval;
1252
1253    retval = (var_info*)chk_malloc(sizeof(var_info));
1254    retval->id = id;
1255    retval->current_terminal = term;
1256    retval->cond_list = lsCreate();
1257    return retval;
1258}
1259
1260
1261
1262void vl_free_id(vl_id_range * id)
1263{
1264/* #ifndef __linux__ */
1265    if (id->name) vl_chk_free(id->name);
1266/* #endif */
1267    vl_chk_free((char*)id);
1268}
1269
1270void vl_free_term(vl_term * term)
1271{
1272    if (term->name) vl_free_id(term->name);
1273    vl_chk_free((char*)term);
1274}
1275
1276void free_var_info(var_info *vinfo)
1277{
1278    if (vinfo->id) vl_free_id(vinfo->id);
1279    if (vinfo->current_terminal) vl_free_term(vinfo->current_terminal);
1280    vl_chk_free((char*)vinfo);
1281}
1282
1283blif_latch *create_latch(vl_id_range *name, vl_term *input, vl_term *output)
1284{
1285    blif_latch *retval;
1286
1287    retval = (blif_latch*)chk_malloc(sizeof(blif_latch));
1288    retval->name = name;
1289    retval->inport = input;
1290    retval->outport = output;
1291    return retval;
1292}
1293
1294syndrome_expr *create_syndrome_expr(char *synd, vl_term *expr, st_table *pre_cond, int fg_id)
1295{
1296    syndrome_expr *retval;
1297
1298    retval = (syndrome_expr*)chk_malloc(sizeof(syndrome_expr));
1299    retval->syndrome = synd;
1300    retval->expr = expr;
1301    retval->pre_cond = pre_cond;
1302    retval->fg_id = fg_id;
1303    return retval;
1304}
1305
1306const_term *create_const_term(vl_expr *const_expr, vl_term *term)
1307{
1308    const_term *retval;
1309
1310    retval = (const_term*)chk_malloc(sizeof(const_term));
1311    retval->const_expr = const_expr;
1312    retval->term = term;
1313    return retval;
1314}
1315
1316vl_term *typed_new_term(vl_type *type, vl_range *range, int lo, int hi)
1317{
1318    vl_term *retval;
1319
1320    retval = (vl_term*)chk_malloc(sizeof(vl_term));
1321    retval = vl_create_term(vl_create_id_range(vlStrdup(new_termname()),range),
1322                            lo, hi);
1323    retval->name->id_type = type;
1324    retval->term_type = type;
1325    return retval;
1326}
1327
1328vl_term *new_term(vl_range *range, int lo, int hi)
1329{
1330    vl_term *retval;
1331
1332    retval = (vl_term*)chk_malloc(sizeof(vl_term));
1333    retval = vl_create_term(vl_create_id_range(vlStrdup(new_termname()),range),
1334                            lo, hi);
1335    return retval;
1336}
1337
1338symbolic_var *vl_create_symbolic_var(char *var_name)
1339{
1340    symbolic_var *retval;
1341
1342    retval = (symbolic_var*)chk_malloc(sizeof(symbolic_var));
1343    retval->name = var_name;
1344    retval->values = set_empty();
1345
1346    return retval;
1347}
1348
1349char *new_pc()
1350{
1351    static int pc_number = 0;
1352    static char buf[MAXSTRLEN];
1353
1354    sprintf(buf, "%s%d", PC, pc_number++);
1355    return buf;
1356}
1357
1358lsList get_lhs_ids(lsList assignments)
1359{
1360    lsGen gen;
1361    lsList retval;
1362    vl_bassign_stmt *assignment;
1363
1364    retval = lsCreate();
1365
1366    gen = lsStart(assignments);
1367    while (lsNext(gen, &assignment, LS_NH) != LS_NOMORE) {
1368        lsNewEnd(retval, assignment->lhs->name, 0);
1369    }
1370    lsFinish(gen);
1371
1372    return retval;
1373}
1374
1375static int bstr_to_i(char *str)
1376{
1377    int i, l;
1378    int retval = 0;
1379
1380    l = strlen(str)-1;
1381    for (i=0; i<=MIN(l,31); i++)
1382        retval = (retval << 1) | ((str[i]=='1') || (str[i]=='?'));
1383
1384    return retval;
1385}
1386
1387multi_concat *vl_create_mconcat(vl_expr *rep, lsList concat)
1388{
1389    multi_concat *retval;
1390
1391    retval = (multi_concat*)chk_malloc(sizeof(multi_concat));
1392    retval->rep = rep;
1393    retval->concat = concat;
1394
1395    return retval;
1396}
Note: See TracBrowser for help on using the repository browser.