source: vis_dev/vl2mv-2.3/src/parser/vl_write_util.c@ 28

Last change on this file since 28 was 18, checked in by cecile, 15 years ago

vl2mv added

File size: 98.5 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_write_util.c,v 1.3 2009/03/09 20:25:58 fabio Exp $
22
23
24*/
25
26#include <stdio.h>
27#include <math.h>
28#include "util.h"
29#include "st.h"
30#include "array.h"
31#include "list.h"
32#include "set.h"
33#include "graph.h"
34#include "vl_types.h"
35#include "vl_defs.h"
36#include "vlr_int.h"
37#include "vl_fg_defs.h"
38#include "vl_fg_types.h"
39#include "vl_create.h"
40#include "vl_write.h"
41#include "vl_write_util.h"
42#include "vl_vardecl.h"
43#include "vl_edgedetector.h"
44#include "vl_traverse.h"
45#include "vl_mux.h"
46#include "vl_flowgraph.h"
47#include "verilog.h"
48
49extern vl_desc *mod_list;
50extern int implicitClocking;
51extern int compatibleChecking;
52extern int set_notation;
53extern int debug_mode;
54extern int decomposeTable;
55extern int noBus;
56extern int smartEvent;
57extern int vlTimedSystem;
58extern int Zconnection;
59extern int implicitDeclare;
60
61extern int WarningLevel;
62
63extern int rst_ckt, use_rst_ckt, mark_sel_var;
64extern lsList ctrl_list, rst_ctrl_list;
65extern st_table *sensitiveList;
66extern int lhs_hi, lhs_lo;
67extern int lhs_must_be_wire;
68extern int Vlerrno;
69extern int silent_err;
70extern char *cntxt_event;
71
72int deadlock_semantic = 0;
73int arrayBoundNond=0;
74int vis_nond=1;
75int vis_nond_var=0;
76int instantiateInputLatch = 0;
77
78static char *nond_output();
79static int isTautology ARGS((lsList syndrome_expr_list));
80static void postprocess_vlr_rel ARGS((FILE *file, short type, char *carry,
81 vl_term *results, vl_term *out));
82static int evaluable_expr ARGS((vl_expr *expr));
83static void vl_write_bin_equal_const(FILE *file, vl_expr *val, vl_term *term, vl_term *out);
84
85void vl_mv_to_bin(vl_term *term)
86{
87 if (term->flag & MVar) {
88 char buf[MAXSTRLEN];
89 sprintf(buf, "enforced mv->binary encoding on '%s'", term->name->name);
90 Translate_Warning(buf);
91
92 term->flag &= !MVar;
93 if (term->hi < 0) {
94 term->hi = MAXBITNUM-1;
95 term->lo = 0;
96 } else {
97 int range, blen;
98
99 for (range = term->hi - term->lo + 1, blen = -1;
100 range>0; range >>= 1)
101 blen++;
102 if (blen>0)
103 if ((1<<(blen-1)) < term->hi-term->lo+1)
104 blen++;
105 term->lo = 0;
106 term->hi = blen-1;
107 }
108 }
109}
110
111
112
113void vl_bin_to_mv(vl_term *term)
114{
115 int blen;
116
117 if (!(term->flag & MVar)) {
118 Translate_Warning("enforced binary->mv encoding");
119
120 term->flag |= MVar;
121 blen = term->hi-term->lo+1;
122 term->lo = 1;
123 term->hi = (1 << (blen));
124 }
125}
126
127
128void vl_write_mv_comp(FILE *file, short type, vl_term *in1, vl_term *in2, vl_term *out)
129{
130 lsList domain;
131 lsGen igen, jgen;
132 lsHandle ihandle, jhandle;
133 vl_enumerator *i, *j;
134
135 if (in1->hi-in1->lo != in2->hi-in2->lo)
136 Translate_Warning("comparator have MV's of different domain elts");
137
138 fprintf(file, ".names %s %s %s\n",
139 in1->name->name, in2->name->name, out->name->name);
140 if (set_notation) {
141 if (in1->term_type != in2->term_type) {
142 char buf[MAXSTRLEN];
143 sprintf(buf, "'%s':comparing %s and %s of different domains",
144 vl_currentModule->name->name,
145 in1->name->name, in2->name->name);
146 semantic_error(buf);
147 }
148
149 fprintf(file, "%s %d\n", HSIS_DEFAULT, type==Bneq2Expr);
150 fprintf(file, "- %s%s %d\n",
151 HSIS_EQUAL, in1->name->name, type!=Bneq2Expr);
152
153 } else {
154 switch (type) {
155 case Beq2Expr:
156
157 if (in1->term_type != in2->term_type) {
158 char buf[MAXSTRLEN];
159 sprintf(buf, "'%s':comparing %s and %s of different domains",
160 vl_currentModule->name->name,
161 in1->name->name, in2->name->name);
162 semantic_error(buf);
163 }
164
165 domain = in1->term_type->specifier->u.enum_type->domain_list;
166 for (igen=lsStart(domain);
167 lsNext(igen,(lsGeneric*)&i,&ihandle)!=LS_NOMORE;) {
168 for (jgen=lsStart(domain);
169 lsNext(jgen,(lsGeneric*)&j,&jhandle)!=LS_NOMORE;) {
170 fprintf(file, "%s %s %d\n",
171 i->name, j->name, (strcmp(i->name, j->name)==0));
172 }
173 lsFinish(jgen);
174 }
175 lsFinish(igen);
176 break;
177 case Bneq2Expr:
178
179 if (in1->term_type != in2->term_type) {
180 char buf[MAXSTRLEN];
181 sprintf(buf, "'%s':comparing %s and %s of different domains",
182 vl_currentModule->name->name,
183 in1->name->name, in2->name->name);
184 semantic_error(buf);
185 }
186
187 domain = in1->term_type->specifier->u.enum_type->domain_list;
188 for (igen=lsStart(domain);
189 lsNext(igen,(lsGeneric*)&i,&ihandle)!=LS_NOMORE;) {
190 for (jgen=lsStart(domain);
191 lsNext(jgen,(lsGeneric*)&j,&jhandle)!=LS_NOMORE;) {
192 fprintf(file, "%s %s %d\n",
193 i->name, j->name, (strcmp(i->name, j->name)!=0));
194 }
195 lsFinish(jgen);
196 }
197 lsFinish(igen);
198 break;
199 }
200 }
201}
202
203
204void vl_write_bin_comp(FILE *file, short type, vl_term *in1, vl_term *in2, vl_term *out)
205{
206 vl_term *tmp, *ripple_term;
207 char *ripple;
208
209 tmp = new_term(NIL(vl_range), 0, -1);
210
211 if (in1->lo > in1->hi) {
212 tmp->lo = in2->lo;
213 tmp->hi = in2->hi;
214 } else if (in2->lo > in2->hi) {
215 tmp->lo = in1->lo;
216 tmp->hi = in1->hi;
217 } else {
218 tmp->lo = 0;
219 tmp->hi = MIN(in1->hi-in1->lo, in2->hi-in2->lo);
220 }
221 write_var_decl(file, tmp);
222 vl_write_vector_bop(file, BxorExpr, in1, in2, tmp);
223
224 ripple = vlStrdup(new_termname());
225 ripple_term = vl_create_term(vl_create_id_range(ripple,NIL(vl_range)),
226 tmp->lo, tmp->hi);
227 if (tmp->lo <= tmp->hi) {
228 ripple =
229 vl_write_vector_bop(file, UorExpr, tmp, NIL(vl_term), ripple_term);
230 vl_write_bit_connect(file, ripple_term->name->name, out->name->name,
231 (type==Beq2Expr));
232 vl_free_term(ripple_term);
233 } else {
234 vl_write_bit_connect(file, tmp->name->name, out->name->name,
235 (type==Beq2Expr));
236 }
237 vl_free_term(tmp);
238}
239
240
241static void vl_write_bin_equal_const(
242 FILE *file,
243 vl_expr *val,
244 vl_term *term,
245 vl_term *out
246 )
247{
248 int lo, hi;
249 int i, v;
250
251 if (term->lo > term->hi) {
252 lo = 0;
253 hi = 0;
254 } else {
255 lo = term->lo;
256 hi = term->hi;
257 }
258
259 /* Write table header and default value. */
260 fprintf(file, ".names");
261 for (i=lo; i<=hi; i++) {
262 fprintf(file, " %s%s%d%s", term->name->name,
263 SEP_LBITSELECT, i, SEP_RBITSELECT);
264 }
265 fprintf(file, " %s\n.def 0\n", out->name->name);
266
267 for (i=lo, v=vl_eval_expr(val); i<=hi; i++, v >>= 1) {
268 fprintf(file, "%d ", (v & 1));
269 }
270 fprintf(file, " 1\n");
271}
272
273
274void vl_write_mv_connect(FILE *file, vl_term *in, vl_term *out)
275{
276 lsList domain;
277 lsGen enum_gen;
278 lsHandle enum_handle;
279 vl_enumerator *enum_elt;
280
281 if (in->term_type != out->term_type) {
282 char buf[MAXSTRLEN];
283 sprintf(buf, "connecting %s and %s of different domains",
284 out->name->name, in->name->name);
285 semantic_error(buf);
286 }
287
288 fprintf(file, ".names %s %s\n", in->name->name, out->name->name);
289
290 if (set_notation) {
291 fprintf(file, "- =%s\n", in->name->name);
292 } else {
293 domain = in->term_type->specifier->u.enum_type->domain_list;
294 for (enum_gen=lsStart(domain);
295 lsNext(enum_gen,(lsGeneric*)&enum_elt,&enum_handle)!=LS_NOMORE;) {
296 fprintf(file, "%s %s\n", enum_elt->name, enum_elt->name);
297 }
298 lsFinish(enum_gen);
299 }
300}
301
302
303void vl_write_bin_connect(FILE *file, vl_term *in, vl_term *out, int inverted)
304{
305 int i;
306 char out_buf[MAXSTRLEN], in_buf[MAXSTRLEN];
307
308 if (out->lo > out->hi) {
309 if (in->lo > in->hi) {
310 vl_write_bit_connect(file, in->name->name, out->name->name, 0);
311 } else {
312 char buf[MAXSTRLEN];
313
314 sprintf(buf, "%s%s%d%s", in->name->name,
315 SEP_LBITSELECT, in->lo, SEP_RBITSELECT);
316 vl_write_bit_connect(file, buf, out->name->name, 0);
317 }
318 } else {
319 if (in->lo > in->hi) {
320 int i;
321 sprintf(out_buf, "%s%s%d%s", out->name->name,
322 SEP_LBITSELECT, out->lo, SEP_RBITSELECT);
323 sprintf(in_buf, "%s", in->name->name);
324 if (set_notation && !inverted) {
325 fprintf(file, ".names %s %s\n- =%s\n",
326 in_buf, out_buf, in_buf);
327
328 } else {
329 vl_write_bit_connect(file, in_buf, out_buf, inverted);
330 }
331
332 sprintf(in_buf, "%s", WRT_BLIF_GND(file));
333 for (i=out->lo+1; i<=out->hi; i++) {
334 sprintf(out_buf, "%s%s%d%s", out->name->name,
335 SEP_LBITSELECT, i, SEP_RBITSELECT);
336 if (set_notation) {
337 fprintf(file, ".names %s %s\n- =%s\n",
338 in_buf, out_buf, in_buf);
339 } else {
340 vl_write_bit_connect(file, in_buf, out_buf, 0);
341 }
342 }
343 } else {
344 for (i=out->lo; i<=out->hi; i++) {
345 sprintf(out_buf, "%s%s%d%s", out->name->name,
346 SEP_LBITSELECT, i, SEP_RBITSELECT);
347 sprintf(in_buf, "%s%s%d%s", in->name->name,
348 SEP_LBITSELECT, i+in->lo-out->lo,
349 SEP_RBITSELECT);
350 if (set_notation && !inverted) {
351 fprintf(file, ".names %s %s\n- =%s\n",
352 in_buf, out_buf, in_buf);
353 } else {
354 vl_write_bit_connect(file, in_buf, out_buf,
355 inverted);
356 }
357 }
358 }
359 }
360}
361
362
363void vl_write_consts(FILE *file)
364{
365
366
367 file = file;
368}
369
370
371void vl_write_const(FILE *file, vl_expr *val, vl_term *out)
372{
373 int ismvar=0;
374 int i, v;
375 int lo, hi;
376 int find_elt=0;
377 char buf[MAXSTRLEN];
378 lsList domain;
379 lsGen enum_gen;
380 lsHandle enum_handle;
381 vl_enumerator *enum_elt;
382
383 ismvar = out->flag & MVar;
384
385 if (ismvar) {
386 assert (val);
387
388 fprintf(file, ".names %s\n", out->name->name);
389 switch(val->type) {
390 case BitExpr:
391 Translate_Warning("Using binary constant as value of mv variable");
392 case IntExpr:
393 domain = out->term_type->specifier->u.enum_type->domain_list;
394 for (enum_gen=lsStart(domain);
395 lsNext(enum_gen,
396 (lsGeneric*)&enum_elt,&enum_handle)!=LS_NOMORE;) {
397 find_elt=1;
398 if (enum_elt->val==val->u.intval) break;
399 find_elt=0;
400 }
401 lsFinish(enum_gen);
402
403 if (find_elt)
404 fprintf(file, "%s\n", enum_elt->name);
405 else {
406 char buf[MAXSTRLEN];
407 sprintf(buf, "trying to assign to '%s' out of its domain",
408 out->name->name);
409 semantic_error(buf);
410 }
411 break;
412 case RealExpr:
413 semantic_error("assinging real value to enumeration typed var");
414 break;
415 case IDExpr:
416 if (st_lookup(out->term_type->specifier->u.enum_type->domain_st,
417 val->u.name->name, (char**)&enum_elt)) {
418 fprintf(file, "%s\n", enum_elt->name);
419 } else {
420 char buf[MAXSTRLEN];
421
422 sprintf(buf, "%s should be a constant/symbolic name",
423 val->u.name->name);
424 internal_error(buf);
425 }
426 break;
427 }
428 } else {
429
430 if (out->name->mpg_master_exp && out->hi==-1 && out->lo==0)
431
432 get_hilo(out->name, &hi, &lo);
433 else {
434
435 hi = out->hi;
436 lo = out->lo;
437 }
438 if (val) {
439 if (lo <= hi) {
440 int v0;
441 v0 = val->u.bexpr.part0;
442 for (i=lo, v=vl_eval_expr(val); i<=hi;
443 i++, v >>= 1, v0 >>= 1) {
444 sprintf(buf, "%s%s%d%s", out->name->name,
445 SEP_LBITSELECT, i, SEP_RBITSELECT);
446 fprintf(file, ".names %s\n", buf);
447 if ((v & 1) && (v0 & 1))
448 fprintf(file, "-\n");
449 else
450 fprintf(file, "%d\n", (v & 1));
451 }
452 } else {
453 fprintf(file, ".names %s\n", out->name->name);
454 fprintf(file, "%d\n", vl_eval_expr(val) & 1);
455 }
456 } else {
457 if (lo <= hi) {
458 for (i=lo; i<=hi; i++) {
459 sprintf(buf, "%s%s%d%s", out->name->name,
460 SEP_LBITSELECT, i, SEP_RBITSELECT);
461 fprintf(file, ".names %s\n", buf);
462 fprintf(file, "0\n1\n");
463 }
464 } else {
465 fprintf(file, ".names %s\n", out->name->name);
466 fprintf(file, "0\n1\n");
467 }
468 }
469 }
470}
471
472
473
474void write_int_connect(FILE *file, int v, vl_term *out)
475{
476 int lo, hi, i;
477 char buf[MAXSTRLEN];
478 lsList args;
479
480 lo = out->lo; hi = out->hi;
481 if (hi < lo) {
482 fprintf(file, ".names %s\n", out->name->name);
483 fprintf(file, "%d\n", (v&1));
484 } else {
485 args = lsCreate();
486 sprintf(buf, "%d", out->hi-out->lo+1);
487 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
488 sprintf(buf, "%d", v);
489 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
490
491 for (i=lo; i<=hi; i++, v >>= 1) {
492 sprintf(buf, "%s%s%d%s", out->name->name,
493 SEP_LBITSELECT, i, SEP_RBITSELECT);
494 fprintf(file, ".names %s\n", buf);
495 fprintf(file, "%d\n", (v & 1));
496 }
497
498 lsDestroy(args, vl_chk_free);
499 }
500}
501
502
503
504vl_term *write_local_control(FILE *file, vl_term *ctrl, lsList sub_ctrls, int inverted)
505{
506 int i, j;
507 vl_term *retval;
508 lsGen gen;
509 lsHandle handle;
510 vl_term *sub_ctrl;
511 int unconditional_assign = 0;
512
513
514
515
516 if (!sub_ctrls)
517 unconditional_assign = 1;
518 else if (lsLength(sub_ctrls)==0)
519 unconditional_assign = 1;
520
521 if (unconditional_assign) {
522 retval = new_term(NIL(vl_range), 0, -1);
523 vl_write_bit_connect(file, ctrl->name->name, retval->name->name,
524 inverted);
525 return retval;
526 }
527
528 retval = new_term(NIL(vl_range), 0, -1);
529
530 fprintf(file, ".names %s ", ctrl->name->name);
531 gen = lsStart(sub_ctrls);
532 if (lsNext(gen, (lsGeneric*)&sub_ctrl, &handle) == LS_OK) {
533 fprintf(file, "%s ", ((vl_term*)(((int)sub_ctrl)&~1))->name->name);
534 while (lsNext(gen, (lsGeneric*)&sub_ctrl, &handle) != LS_NOMORE) {
535 fprintf(file, "%s ", ((vl_term*)(((int)sub_ctrl)&~1))->name->name);
536 }
537 }
538 lsFinish(gen);
539 fprintf(file, "%s\n", retval->name->name);
540
541 for (i=0; i<lsLength(sub_ctrls); i++) {
542 fprintf(file, "%c ", (inverted)?'0':'1');
543 for (j=0; j<lsLength(sub_ctrls); j++) {
544 fprintf(file, "%c ", (i==j)?'1':'-');
545 }
546 fprintf(file, "1\n");
547 }
548
549 fprintf(file, "%c ", (inverted)?'0':'1');
550 gen = lsStart(sub_ctrls);
551 if (lsNext(gen, (lsGeneric*)&sub_ctrl, &handle) == LS_OK) {
552 fprintf(file, "%c ", ((int)sub_ctrl&1)?'1':'0');
553 while (lsNext(gen, (lsGeneric*)&sub_ctrl, &handle) != LS_NOMORE) {
554 fprintf(file, "%c ", ((int)sub_ctrl&1)?'1':'0');
555 }
556 }
557 lsFinish(gen);
558 fprintf(file, "0\n");
559
560 fprintf(file, "%c ", (inverted)?'1':'0');
561 for (i=0; i<lsLength(sub_ctrls); i++) {
562 fprintf(file, "%c ", '-');
563 }
564 fprintf(file, "0\n");
565
566 return retval;
567}
568
569
570
571void write_switch(FILE *file, vl_id_range *id_sym,
572 vl_term *sel, vl_expr *sel_expr,
573 vl_term *orig, vl_term *new, vl_term *out_term)
574{
575 int lo, hi;
576 int bit_hi, bit_lo;
577 int idx;
578 vl_expr *hi_expr;
579 char new_buf[MAXSTRLEN], orig_buf[MAXSTRLEN], out_buf[MAXSTRLEN];
580
581 get_hilo(id_sym, &bit_hi, &bit_lo);
582
583 lo = vl_eval_expr(out_term->name->range->left);
584 if (out_term->name->range->right)
585 hi = vl_eval_expr(out_term->name->range->right);
586 else
587 hi = lo;
588
589 if (!sel) {
590 int const_hi, const_lo;
591
592 assert(ISVLCONST(sel_expr->type));
593
594 const_hi = min_bit_width(hi)-1;
595 const_lo = 0;
596 sel = new_term(NIL(vl_range), const_lo, const_hi);
597 write_var_decl(file, sel);
598 vl_write_const(file, sel_expr, sel);
599 }
600
601 hi_expr = vl_create_expr(IntExpr, hi, (double)0.0,
602 NIL(void), NIL(void), NIL(void));
603 for (idx=lo; idx<=hi; idx++) {
604 vl_term *ctrl;
605 vl_term *new_elt, *orig_elt, *out_elt;
606 vl_expr *const_expr;
607 vl_term *const_trm;
608
609 const_expr = vl_create_expr(IntExpr, idx, (double)0.0,
610 NIL(void), NIL(void), NIL(void));
611 const_trm = new_term(NIL(vl_range), 0, data_width(hi_expr)-1);
612#if 0
613 write_var_decl(file, const_trm);
614 vl_write_const(file, const_expr, const_trm);
615 vl_chk_free((char*)const_expr);
616
617 ctrl = new_term(NIL(vl_range), 0, -1);
618 vl_write_bin_comp(file, Beq2Expr, const_trm, sel, ctrl);
619#else
620 ctrl = new_term(NIL(vl_range), 0, -1);
621 vl_write_bin_equal_const(file, const_expr, sel, ctrl);
622 vl_chk_free((char*)const_expr);
623#endif
624 sprintf(new_buf, "%s%s%d%s",
625 new->name->name, SEP_LARRAY, idx, SEP_RARRAY);
626 if (rst_ckt && !strstr(orig->name->name, SEP_GATEPIN)) {
627 int i;
628 sprintf(orig_buf, "%s", new_termname());
629 if (bit_lo == 0 && bit_hi == -1) {
630 if (out_term->term_type) {
631 if (vis_nond) {
632 char *old_name;
633 vl_range *old_range;
634 vl_enumerator *enum_elt;
635 old_name = out_term->name->name;
636 old_range = out_term->name->range;
637 out_term->name->name = orig_buf;
638 out_term->name->range = NIL(vl_range);
639 write_var_decl(file, out_term);
640 out_term->name->name = old_name;
641 out_term->name->range = old_range;
642 lsFirstItem(out_term->term_type->specifier->u.enum_type->domain_list, (lsGeneric*)&enum_elt, 0);
643 fprintf(file, ".names %s\n%s\n", orig_buf,
644 enum_elt->name);
645 } else {
646 fprintf(file, ".names %s\n-\n", orig_buf);
647 }
648 } else {
649 if (vis_nond) {
650 fprintf(file, ".names %s\n0\n", orig_buf);
651 } else {
652 fprintf(file, ".names %s\n-\n", orig_buf);
653 }
654 }
655 } else {
656 for (i=bit_lo; i<=bit_hi; i++)
657 if (vis_nond) {
658 fprintf(file, ".names %s%s%d%s\n0\n", orig_buf,
659 SEP_LBITSELECT, i, SEP_RBITSELECT);
660 } else {
661 fprintf(file, ".names %s%s%d%s\n-\n", orig_buf,
662 SEP_LBITSELECT, i, SEP_RBITSELECT);
663 }
664 }
665 } else {
666 sprintf(orig_buf, "%s%s%d%s",
667 orig->name->name, SEP_LARRAY, idx, SEP_RARRAY);
668 }
669 sprintf(out_buf, "%s%s%d%s",
670 out_term->name->name, SEP_LARRAY, idx, SEP_RARRAY);
671 new_elt = new;
672 orig_elt = create_rename_term(orig->name, orig_buf, bit_lo, bit_hi);
673 orig_elt->name->range = NIL(vl_range);
674 orig_elt->flag = orig->flag;
675 orig_elt->term_type = orig->term_type;
676 out_elt = create_rename_term(out_term->name, out_buf, bit_lo, bit_hi);
677 out_elt->name->range = NIL(vl_range);
678 instantiate_mux(file, new_elt, orig_elt, ctrl, out_elt);
679 }
680 vl_chk_free((char*)hi_expr);
681}
682
683
684char *new_termname()
685{
686 static char sbuf[MAXSTRLEN];
687 static unsigned int TermCount=0;
688
689 sprintf(sbuf, "%s%x", NODE, TermCount++);
690 return sbuf;
691}
692
693char *new_instname()
694{
695 static char sbuf[MAXSTRLEN];
696 static unsigned int InstCount=0;
697
698 sprintf(sbuf, "%s%x%s", NODE, InstCount++, NODE);
699 return sbuf;
700}
701
702
703vl_range *get_decl_range(void *decl)
704{
705 if (!decl) return NIL(vl_range);
706 switch (((typestructPtr)(decl))->type) {
707 case InputDecl:
708 case OutputDecl:
709 case InoutDecl:
710 case RegDecl:
711 return ((vl_rangedeclPtr)(decl))->range;
712 case WireDecl:
713 case SWireDecl:
714 case TriDecl:
715 case Tri0Decl:
716 case Tri1Decl:
717 case TriandDecl:
718 case TriorDecl:
719 case WandDecl:
720 case WorDecl:
721 return ((vl_netdeclPtr)(decl))->range;
722 default:
723 return NIL(vl_range);
724 }
725}
726
727vl_expr *get_decl_range_left(void *decl)
728{
729 switch (((typestructPtr)(decl))->type) {
730 case InputDecl:
731 case OutputDecl:
732 case InoutDecl:
733 case RegDecl:
734 if (!((vl_rangedeclPtr)(decl))->range) return NIL(vl_expr);
735 return ((vl_rangedeclPtr)(decl))->range->left;
736 case WireDecl:
737 case SWireDecl:
738 case TriDecl:
739 case Tri0Decl:
740 case Tri1Decl:
741 case TriandDecl:
742 case TriorDecl:
743 case WandDecl:
744 case WorDecl:
745 if (!((vl_netdeclPtr)(decl))->range) return NIL(vl_expr);
746 return ((vl_netdeclPtr)(decl))->range->left;
747 default:
748 return NIL(vl_expr);
749 }
750}
751
752vl_expr *get_decl_range_right(void *decl)
753{
754 switch (((typestructPtr)(decl))->type) {
755 case InputDecl:
756 case OutputDecl:
757 case InoutDecl:
758 case RegDecl:
759 if (!((vl_rangedeclPtr)(decl))->range) return NIL(vl_expr);
760 return ((vl_rangedeclPtr)(decl))->range->right;
761 case WireDecl:
762 case SWireDecl:
763 case TriDecl:
764 case Tri0Decl:
765 case Tri1Decl:
766 case TriandDecl:
767 case TriorDecl:
768 case WandDecl:
769 case WorDecl:
770 if (!((vl_netdeclPtr)(decl))->range) return NIL(vl_expr);
771 return ((vl_netdeclPtr)(decl))->range->right;
772 default:
773 return NIL(vl_expr);
774 }
775}
776
777void *
778chng_decl_range(void *decl, vl_range *new_range)
779{
780 void *retval = NIL(void);
781 if (!decl) return decl;
782
783 switch (((typestructPtr)(decl))->type) {
784 case InputDecl:
785 case OutputDecl:
786 case InoutDecl:
787 case RegDecl:
788 retval = (void*)chk_malloc(sizeof(vl_rangedecl));
789 ((vl_rangedeclPtr)(retval))->type = ((vl_rangedeclPtr)decl)->type;
790 ((vl_rangedeclPtr)(retval))->flags = ((vl_rangedeclPtr)decl)->flags;
791 ((vl_rangedeclPtr)(retval))->handle = ((vl_rangedeclPtr)decl)->handle;
792 ((vl_rangedeclPtr)(retval))->ids = lsCreate();
793 ((vl_rangedeclPtr)(retval))->range = new_range;
794 break;
795 case WireDecl:
796 case SWireDecl:
797 case TriDecl:
798 case Tri0Decl:
799 case Tri1Decl:
800 case TriandDecl:
801 case TriorDecl:
802 case WandDecl:
803 case WorDecl:
804 retval = (void*)chk_malloc(sizeof(vl_netdecl));
805 ((vl_netdeclPtr)(retval))->type = ((vl_netdeclPtr)decl)->type;
806 ((vl_netdeclPtr)(retval))->flags = ((vl_netdeclPtr)decl)->flags;
807 ((vl_netdeclPtr)(retval))->strength = ((vl_netdeclPtr)decl)->strength;
808 ((vl_netdeclPtr)(retval))->delay = ((vl_netdeclPtr)decl)->delay;
809 ((vl_netdeclPtr)(retval))->handle = ((vl_netdeclPtr)decl)->handle;
810 ((vl_netdeclPtr)(retval))->ids = lsCreate();
811 ((vl_netdeclPtr)(retval))->range = new_range;
812 break;
813 default:
814 break;
815 }
816 return retval;
817}
818
819short get_decl_flags(void *decl)
820{
821 if (!decl) return 0;
822
823 switch (((typestructPtr)(decl))->type) {
824 case InputDecl:
825 case OutputDecl:
826 case InoutDecl:
827 case RegDecl:
828 return ((vl_rangedeclPtr)(decl))->flags;
829 case WireDecl:
830 case SWireDecl:
831 case TriDecl:
832 case Tri0Decl:
833 case Tri1Decl:
834 case TriandDecl:
835 case TriorDecl:
836 case WandDecl:
837 case WorDecl:
838 return ((vl_netdeclPtr)(decl))->flags;
839 default:
840 return 0;
841 }
842}
843
844void get_type(vl_id_range *id, vl_type **var_type)
845{
846
847 id = id;
848 var_type = var_type;
849}
850
851
852void get_hilo(vl_id_range *id, int *hi, int *lo)
853{
854 vl_expr *left, *right;
855 int leftval, rightval;
856
857 if (get_decl_range(id->mpg_master_exp)) {
858 left = get_decl_range_left(id->mpg_master_exp);
859 right = get_decl_range_right(id->mpg_master_exp);
860 leftval = vl_eval_expr(left);
861 rightval = vl_eval_expr(right);
862 if (leftval > rightval) {
863 int temp;
864
865 temp=leftval; leftval = rightval; rightval = temp;
866 }
867 *lo = leftval;
868 *hi = rightval;
869 } else {
870 *lo = 0;
871 *hi = -1;
872 }
873}
874
875
876
877void insert_control_list(var_info *cur_var, vl_term *sel)
878{
879 vl_id_range *id_sym;
880
881 if (!sel) return;
882 st_lookup(vl_currentModule->sig_st, cur_var->id->name, (char**)&id_sym);
883 lsNewEnd(cur_var->cond_list, (lsGeneric)sel, LS_NH);
884}
885
886
887void print_control_var_pair(FILE *file, char *ctrl, char *var)
888{
889 fprintf(file, "%s %s ", ctrl, var);
890}
891
892
893
894vl_term *write_multi_in_or(FILE *file, lsList in_list)
895{
896 lsGen gen;
897 lsHandle handle;
898 vl_term *term_out;
899 vl_term *in_term, *true_in_term;
900 int i, j;
901
902 term_out = new_term(NIL(vl_range), 0, -1);
903
904 fprintf(file, ".names ");
905 gen = lsStart(in_list);
906 if (lsNext(gen, (lsGeneric*)&in_term, &handle) == LS_OK) {
907 true_in_term = (vl_term*)((int)in_term & (~1));
908 fprintf(file, "%s ", true_in_term->name->name);
909 while (lsNext(gen, (lsGeneric*)&in_term, &handle) != LS_NOMORE) {
910 true_in_term = (vl_term*)((int)in_term & (~1));
911 fprintf(file, "%s ", true_in_term->name->name);
912 }
913 }
914 fprintf(file, "%s\n", term_out->name->name);
915 lsFinish(gen);
916
917 if (set_notation) {
918 fprintf(file, "%s 1\n", HSIS_DEFAULT);
919 } else {
920 gen = lsStart(in_list);
921 for (i=0; i<lsLength(in_list); i++) {
922 lsNext(gen, (lsGeneric*)&in_term, &handle);
923 for (j=0; j<lsLength(in_list); j++) {
924 fprintf(file, "%c ", (i==j)?(((int)in_term&1)?'0':'1'):'-');
925 }
926 fprintf(file, "1\n");
927 }
928 lsFinish(gen);
929 }
930
931 gen = lsStart(in_list);
932 if (lsNext(gen, (lsGeneric*)&in_term, &handle) == LS_OK) {
933 fprintf(file, "%c ", ((int)in_term&1)?'1':'0');
934 while (lsNext(gen, (lsGeneric*)&in_term, &handle) != LS_NOMORE) {
935 fprintf(file, "%c ", ((int)in_term&1)?'1':'0');
936 }
937 }
938 lsFinish(gen);
939 fprintf(file, "0\n");
940
941 return term_out;
942}
943
944
945
946vl_term *array_or(FILE *file, array_t *in_array)
947{
948 vl_term *term_out;
949 vl_term *in_term, *true_in_term;
950 int i, j;
951 int ithItem;
952
953 term_out = new_term(NIL(vl_range), 0, -1);
954
955 fprintf(file, ".names ");
956 ithItem = 0;
957 for (i=0; i<array_n(in_array); i++) {
958 true_in_term = array_fetch(vl_term*, in_array, i);
959 if (true_in_term) {
960 fprintf(file, "%s ", true_in_term->name->name);
961 }
962
963 }
964 fprintf(file, "%s\n", term_out->name->name);
965
966 if (set_notation) {
967 fprintf(file, "%s 1\n", HSIS_DEFAULT);
968 } else {
969 for (i=0; i<array_n(in_array); i++) {
970 in_term = array_fetch(vl_term*, in_array, i);
971 if (!in_term) continue;
972 for (j=0; j<array_n(in_array); j++) {
973 if (array_fetch(vl_term*, in_array, j))
974 fprintf(file, "%c ", (i==j)?'1':'-');
975 }
976 fprintf(file, "1\n");
977 }
978 }
979
980 for (i=0; i<array_n(in_array); i++)
981 if (array_fetch(vl_term*, in_array, i))
982 fprintf(file, "0 ");
983 fprintf(file, "0\n");
984
985 return term_out;
986}
987
988
989vl_term *syndrome_to_control(FILE *file, char *key, st_table *sig_st)
990{
991 vl_term *retval=NIL(vl_term);
992 vl_id_range *id_sym;
993 syndrome_expr *se;
994 vl_term *ctrl_term;
995 int ith_var = 0;
996 char *syndrome;
997 char *dc;
998 lsList comp;
999 lsGen gen;
1000 lsHandle handle;
1001 var_info *cur_var;
1002 int fg_id = -1;
1003 char lc_name[MAXSTRLEN];
1004 int need_leading_and = 1;
1005 int ithItem;
1006
1007 if (!st_lookup(sig_st, key, (char**)&cur_var)) return true_term(file);
1008 id_sym = cur_var->id;
1009
1010
1011 if (!(dc = check_dc((!rst_ckt)?id_sym->syndrome_expr_list:
1012 id_sym->rst_syndrome_expr_list)))
1013 return NIL(vl_term);;
1014
1015
1016 retval = new_term(NIL(vl_range), 0, -1);
1017 if (!vlTimedSystem)
1018 if (isTautology((!rst_ckt)?id_sym->syndrome_expr_list:
1019 id_sym->rst_syndrome_expr_list))
1020 retval->flag |= TautologyTrue;
1021 if (vlTimedSystem && !rst_ckt) {
1022 for (gen=lsStart((!rst_ckt)?
1023 id_sym->syndrome_expr_list:
1024 id_sym->rst_syndrome_expr_list);
1025 lsNext(gen,(lsGeneric*)&se,&handle)!=LS_NOMORE; ) {
1026 st_table *dummy;
1027 if (st_lookup(vl_description->fg_vars_st, (char*)se->fg_id,
1028 (char**)&dummy))
1029 if (dummy == sig_st) {
1030 fg_id = se->fg_id; break;
1031 }
1032 }
1033 lsFinish(gen);
1034 sprintf(lc_name, "%s%06x", FG_LC_PS, fg_id);
1035 if (fg_id != -1) {
1036 fprintf(file, ".names %s ", lc_name);
1037 } else {
1038 fprintf(file, ".names %s\n0\n", retval->name->name);
1039 retval->flag |= ConflictFalse;
1040 return retval;
1041 }
1042 } else {
1043 fprintf(file, ".names ");
1044 }
1045 ithItem = 0;
1046 for (gen=lsStart((!rst_ckt)?ctrl_list:rst_ctrl_list), ith_var=0;
1047 lsNext(gen,(lsGeneric*)&ctrl_term,&handle)!=LS_NOMORE; ith_var++) {
1048 if (!dc[ith_var]) {
1049 fprintf(file, "%s ", ctrl_term->name->name);
1050 }
1051 }
1052 lsFinish(gen);
1053
1054 fprintf(file, "%s\n", retval->name->name);
1055
1056 if (set_notation)
1057 fprintf(file, "%s 0\n", HSIS_DEFAULT);
1058
1059 for (gen=lsStart((!rst_ckt)?
1060 id_sym->syndrome_expr_list:
1061 id_sym->rst_syndrome_expr_list);
1062 lsNext(gen,(lsGeneric*)&se,&handle)!=LS_NOMORE; ) {
1063 st_table *dummy;
1064 int printed;
1065
1066 printed = 0;
1067 if (st_lookup(vl_description->fg_vars_st, (char*)se->fg_id,
1068 (char**)&dummy))
1069 if (dummy == sig_st) {
1070 if (vlTimedSystem && !rst_ckt)
1071 fg_put_loc_context(file, se->pre_cond, lc_name);
1072 fprintf(file, " ");
1073 printed = put_entry(file, se->syndrome, dc, need_leading_and);
1074 if (!need_leading_and && !printed)
1075 fprintf(file, "%d ", 1);
1076 fprintf(file, "1\n");
1077 }
1078 }
1079 lsFinish(gen);
1080
1081 if (!set_notation) {
1082 comp=put_guard_zero(file, (!rst_ckt)?
1083 id_sym->syndrome_expr_list:
1084 id_sym->rst_syndrome_expr_list);
1085 for (gen=lsStart(comp); lsNext(gen,&syndrome,&handle)!=LS_NOMORE; ) {
1086 put_entry(file, syndrome, dc, 1);
1087 fprintf(file, "0\n");
1088 }
1089 lsFinish(gen);
1090 }
1091
1092 vl_chk_free(dc);
1093
1094 return retval;
1095}
1096
1097
1098lsList put_guard_zero(FILE *file, lsList se_list)
1099{
1100 lsList retval=(lsList)0;
1101
1102 return retval;
1103}
1104
1105
1106lsList get_transition(FILE *file)
1107{
1108 lsList retval;
1109 char buf[MAXSTRLEN], *cp;
1110 char syndrome[MAXSTRLEN];
1111 int n_entries, i;
1112
1113 retval = lsCreate();
1114 while (fgets(buf, MAXSTRLEN-1, file)) {
1115 if ((cp = strstr(buf, ".p")) != NIL(char)) {
1116 cp += strlen(".p");
1117 n_entries = atoi(cp);
1118 for (i=0; i<n_entries && fgets(buf, MAXSTRLEN-1, file); i++) {
1119 sscanf(buf, "%s", syndrome);
1120 lsNewEnd(retval, vlStrdup(syndrome), 0);
1121 }
1122 break;
1123 }
1124 }
1125 return retval;
1126}
1127
1128
1129int put_entry(FILE *file, char *str, char *dc, int need_leading_and)
1130{
1131 unsigned int i;
1132 lsGen gen;
1133 lsHandle handle;
1134 vl_term *ctrl_term;
1135 int print_something=0;
1136
1137 for (i=0, gen=lsStart((!rst_ckt)?ctrl_list:rst_ctrl_list);
1138 i<strlen(str) && lsNext(gen,(lsGeneric*)&ctrl_term,&handle)!=LS_NOMORE;
1139 i++) {
1140 if (!dc) {
1141 fprintf(file, "%c ", str[i]);
1142 } else if (!dc[i]) {
1143 fprintf(file, "%c ", str[i]);
1144 }
1145 }
1146
1147 return print_something;
1148}
1149
1150
1151int put_blif_header(FILE *file, lsList se_list)
1152{
1153 int terminal_count=0;
1154 int retval;
1155 unsigned int i;
1156 syndrome_expr *se;
1157
1158 fprintf(file, ".model scratch\n");
1159 fprintf(file, ".outputs n%d\n", retval = terminal_count++);
1160 if (lsLength(se_list)) {
1161 fprintf(file, ".inputs");
1162 lsFirstItem(se_list, (lsGeneric*)&se, 0);
1163 for (i=0; i<strlen(se->syndrome); i++) {
1164 fprintf(file, " n%d", terminal_count++);
1165 }
1166 fprintf(file, "\n");
1167 }
1168 return retval;
1169}
1170
1171
1172int put_blif_gate_header(FILE *file, lsList se_list)
1173{
1174 int terminal_count=0;
1175 int retval;
1176 unsigned int i;
1177 syndrome_expr *se;
1178
1179 fprintf(file, ".names");
1180 if (lsLength(se_list)) {
1181 lsFirstItem(se_list, (lsGeneric*)&se, 0);
1182 for (i=0; i<strlen(se->syndrome); i++) {
1183 fprintf(file, " n%d", ++terminal_count);
1184 }
1185 }
1186 fprintf(file, " n%d\n", retval = ++terminal_count);
1187
1188 return retval;
1189}
1190
1191void put_blif_tail(FILE *file)
1192{
1193 fprintf(file, ".end\n\n");
1194}
1195
1196
1197vl_term *write_array_access(FILE *file, vl_id_range *id_sym, vl_term *idx_term, vl_expr *idx_expr)
1198{
1199 int lo, hi, idx;
1200 int bit_lo, bit_hi, bit;
1201 int i, j;
1202 unsigned int k;
1203 vl_term *retval;
1204 char buf[MAXSTRLEN];
1205
1206 lo = vl_eval_expr(id_sym->range->left);
1207 if (id_sym->range->right)
1208 hi = vl_eval_expr(id_sym->range->right);
1209 else
1210 hi = lo;
1211
1212
1213 if (!idx_term) {
1214 int const_hi, const_lo;
1215
1216 assert(ISVLCONST(idx_expr->type));
1217
1218 const_hi = min_bit_width(hi)-1;
1219 const_lo = 0;
1220 idx_term = new_term(NIL(vl_range), const_lo, const_hi);
1221 write_var_decl(file, idx_term);
1222 vl_write_const(file, idx_expr, idx_term);
1223 }
1224
1225
1226 get_hilo(id_sym, &bit_hi, &bit_lo);
1227 retval = new_term(NIL(vl_range), bit_lo, bit_hi);
1228 retval->flag = id_sym->flags;
1229 retval->term_type = id_sym->id_type;
1230 write_var_decl(file, retval);
1231
1232 if (bit_lo > bit_hi) {
1233 if (id_sym->flags & MVar) {
1234
1235 lsList domain;
1236
1237 domain = id_sym->id_type->specifier->u.enum_type->domain_list;
1238
1239 fprintf(file, ".names ");
1240 for (i=idx_term->hi; i>=idx_term->lo; i--) {
1241 fprintf(file, "%s%s%d%s ", idx_term->name->name,
1242 SEP_LBITSELECT, i, SEP_RBITSELECT);
1243 }
1244 for (idx=lo; idx<=hi; idx++) {
1245 fprintf(file, "%s%s%d%s ", id_sym->name,
1246 SEP_LARRAY, idx, SEP_RARRAY);
1247 }
1248 fprintf(file, "%s\n", retval->name->name);
1249
1250
1251 if (set_notation) {
1252 for (i=0; i<(1<<(idx_term->hi-idx_term->lo+1)); i++) {
1253 strcpy(buf,
1254 num_to_binstr(i,(idx_term->hi-idx_term->lo+1)));
1255 for (k=0; k<strlen(buf); k++)
1256 fprintf(file, "%c ", buf[k]);
1257 for (idx=lo; idx<=hi; idx++) fprintf(file, "- ");
1258 if (i <= hi && i >= lo)
1259 fprintf(file, "%s%s%s%d%s\n", HSIS_EQUAL,
1260 id_sym->name, SEP_LARRAY, i, SEP_RARRAY);
1261 else {
1262 if (arrayBoundNond) {
1263 fprintf(file, "-\n");
1264 } else {
1265 vl_enumerator *enum_elt;
1266 lsFirstItem(id_sym->id_type->specifier
1267 ->u.enum_type->domain_list,
1268 (lsGeneric*)&enum_elt, 0);
1269 fprintf(file, "%s\n", enum_elt->name);
1270 }
1271 }
1272 }
1273 } else {
1274 lsList domain;
1275 lsGen enum_gen;
1276 lsHandle enum_handle;
1277 vl_enumerator *enum_elt;
1278 domain = id_sym->id_type->specifier->u.enum_type->domain_list;
1279 for (i=0; i<(1<<(idx_term->hi-idx_term->lo+1)); i++) {
1280 for (enum_gen=lsStart(domain);
1281 lsNext(enum_gen,(lsGeneric*)&enum_elt,&enum_handle)!=
1282 LS_NOMORE; ) {
1283 strcpy(buf,
1284 num_to_binstr(i,(idx_term->hi-idx_term->lo+1)));
1285 for (k=0; k<strlen(buf); k++)
1286 fprintf(file, "%c ", buf[k]);
1287 for (idx=lo; idx<=hi; idx++)
1288 fprintf(file, "%s ",
1289 (idx==i)?enum_elt->name:"-");
1290 fprintf(file, "%s\n",
1291 (i<=hi && i>=lo)?enum_elt->name:
1292 (arrayBoundNond)?"-":enum_elt->name);
1293 }
1294 lsFinish(enum_gen);
1295 }
1296 }
1297 } else {
1298
1299 fprintf(file, ".names ");
1300 for (i=idx_term->hi; i>=idx_term->lo; i--) {
1301 fprintf(file, "%s%s%d%s ", idx_term->name->name,
1302 SEP_LBITSELECT, i, SEP_RBITSELECT);
1303 }
1304 for (idx=lo; idx<=hi; idx++) {
1305 fprintf(file, "%s%s%d%s ", id_sym->name,
1306 SEP_LARRAY, idx, SEP_RARRAY);
1307 }
1308 fprintf(file, "%s\n", retval->name->name);
1309 fprintf(file, ".def 0\n");
1310
1311 for (i=0; i<(1<<(idx_term->hi-idx_term->lo+1)); i++) {
1312 for (j=0; j<=1; j++) {
1313 if (j==0 && i<=hi && i>=lo) continue;
1314 if ((i>hi || i<lo) && !arrayBoundNond) continue;
1315 strcpy(buf,
1316 num_to_binstr(i, (idx_term->hi-idx_term->lo+1)));
1317 for (k=0; k<strlen(buf); k++)
1318 fprintf(file, "%c ", buf[k]);
1319 for (idx=lo; idx<=hi; idx++) {
1320 fprintf(file, "%c ", (idx==i)?((j==0)?'0':'1'):'-');
1321 }
1322 fprintf(file, "%c\n", (i<=hi && i>=lo)?'1':'-');
1323 }
1324 }
1325 }
1326 } else {
1327 for (bit=bit_lo; bit<=bit_hi; bit++) {
1328
1329 fprintf(file, ".names ");
1330 for (i=idx_term->hi; i>=idx_term->lo; i--) {
1331 fprintf(file, "%s%s%d%s ", idx_term->name->name,
1332 SEP_LBITSELECT, i, SEP_RBITSELECT);
1333 }
1334 for (idx=lo; idx<=hi; idx++) {
1335 fprintf(file, "%s%s%d%s%s%d%s ", id_sym->name,
1336 SEP_LARRAY, idx, SEP_RARRAY,
1337 SEP_LBITSELECT, bit, SEP_RBITSELECT);
1338 }
1339 fprintf(file, "%s%s%d%s\n", retval->name->name,
1340 SEP_LBITSELECT,bit,SEP_RBITSELECT);
1341 fprintf(file, ".def 0\n");
1342
1343 for (i=0; i<(1<<(idx_term->hi-idx_term->lo+1)); i++) {
1344 for (j=0; j<=1; j++) {
1345 if (j==0 && i<=hi && i>=lo) continue;
1346 if ((i>hi || i<lo) && !arrayBoundNond) continue;
1347 strcpy(buf,
1348 num_to_binstr(i,(idx_term->hi-idx_term->lo+1)));
1349 for (k=0; k<strlen(buf); k++)
1350 fprintf(file, "%c ", buf[k]);
1351 for (idx=lo; idx<=hi; idx++) {
1352 fprintf(file, "%c ", (idx==i)?((j==0)?'0':'1'):'-');
1353 }
1354 fprintf(file, "%c\n", (i<=hi && i>=lo)? '1':'-');
1355 }
1356 }
1357 }
1358 }
1359
1360 return retval;
1361}
1362
1363
1364char *sel_var(char *name)
1365{
1366 return name;
1367}
1368
1369int isMVar(short unsigned flag)
1370{
1371 return (flag & MVar);
1372}
1373
1374int isOutPort(short unsigned flag)
1375{
1376 return (flag & OutPort);
1377}
1378
1379
1380void check_assign(vl_bassign_stmt *assign, int procedural)
1381{
1382 vl_id_range *lhs_id;
1383 char buf[MAXSTRLEN];
1384
1385 st_lookup(vl_currentModule->sig_st,
1386 assign->lhs->name->name, (char**)&lhs_id);
1387
1388 if (procedural) {
1389 if (assign->type != NbassignStmt &&
1390 assign->type != DelayNbassignStmt &&
1391 assign->type != EventNbassignStmt &&
1392 !(lhs_id->flags & RegVar)) {
1393 yylineno = assign->lineno;
1394 sprintf(buf,
1395 "error: wire '%s' is used as lhs of = in procedural statement\n",
1396 lhs_id->name);
1397 compile_error(buf);
1398 }
1399 if (lhs_must_be_wire && (lhs_id->flags & RegVar)) {
1400
1401 }
1402 if (compatibleChecking && !(lhs_id->flags & RegVar)) {
1403 yylineno = assign->lineno;
1404 sprintf(buf,
1405 "error: wire '%s' is used as lhs of <= in procedural statement\n",
1406 lhs_id->name);
1407 compile_error(buf);
1408 }
1409 } else {
1410 if (lhs_id->flags & RegVar) {
1411 yylineno = assign->lineno;
1412 sprintf(buf,
1413 "error: reg '%s' is used as lhs of continus assignment\n",
1414 lhs_id->name);
1415 compile_error(buf);
1416 }
1417 }
1418}
1419
1420
1421void instantiate_reset_mux(FILE *file, vl_id_range *id_sym, int lo, int hi,
1422 var_info *var, var_info *lvar)
1423{
1424 extern vl_term *Initial_Signal;
1425 vl_term *term_out;
1426 char buf[MAXSTRLEN];
1427 vl_term *init_term;
1428
1429 sprintf(buf, "%s%s", id_sym->name, new_termname());
1430 term_out = create_rename_term(id_sym, buf, lo, hi);
1431 term_out->flag =
1432 get_decl_flags(var->id->mpg_master_exp);
1433 write_var_decl(file,term_out);
1434 lsFirstItem(id_sym->initial, (lsGeneric*)&init_term, 0);
1435 instantiate_mux(file, init_term,
1436 lvar->current_terminal,
1437 Initial_Signal, term_out);
1438 lvar->current_terminal = term_out;
1439}
1440
1441
1442void instantiate_input_latch(FILE *file, vl_id_range *id_sym)
1443{
1444 char buf[MAXSTRLEN];
1445
1446 sprintf(buf, "%s%s%s", id_sym->name, SEP_DIR, PIN_IN);
1447 if (id_sym->flags & InPort && id_sym->flags & RegVar) {
1448 if (!instantiateInputLatch) return;
1449 if (id_sym->flags & MVar) {
1450 fprintf(file, ".latch %s %s\n", id_sym->name, buf);
1451 } else {
1452 int i, lo, hi;
1453
1454 get_hilo(id_sym, &hi, &lo);
1455 if (lo > hi) {
1456 fprintf(file, ".latch %s %s\n", id_sym->name, buf);
1457 } else {
1458 for (i=lo; i<=hi; i++) {
1459 fprintf(file, ".latch %s%s%d%s %s%s%d%s\n",
1460 id_sym->name,
1461 SEP_LBITSELECT, i, SEP_RBITSELECT,
1462 buf, SEP_LBITSELECT, i, SEP_RBITSELECT);
1463 }
1464 }
1465 }
1466 }
1467}
1468
1469
1470void instantiate_hidden_latch(FILE *file, vl_id_range *id_sym)
1471{
1472 char buf[MAXSTRLEN];
1473 lsList domain;
1474 lsGen enum_gen;
1475 lsHandle enum_handle;
1476 vl_enumerator *enum_elt;
1477
1478
1479 if (!id_sym->mpg_master_exp) return;
1480 if (strstr(id_sym->name, SEP_LATCH)) return;
1481
1482 sprintf(buf, "%s%s", id_sym->name, PIN_HIDDEN);
1483 if (id_sym->flags & HiddenLatch) {
1484 if (id_sym->flags & MVar) {
1485 domain = id_sym->id_type->specifier->u.enum_type->domain_list;
1486 fprintf(file, ".mv %s %d ", buf, lsLength(domain));
1487 for (enum_gen = lsStart(domain);
1488 lsNext(enum_gen, (lsGeneric*)&enum_elt, &enum_handle) !=
1489 LS_NOMORE;) {
1490 fprintf(file, "%s ", enum_elt->name);
1491 }
1492 lsFinish(enum_gen);
1493 fprintf(file, "\n");
1494 fprintf(file, ".latch %s %s\n", id_sym->name, buf);
1495 fprintf(file, ".r %s\n-\n", buf);
1496 } else {
1497 int i, lo, hi;
1498
1499 get_hilo(id_sym, &hi, &lo);
1500 if (lo > hi) {
1501 fprintf(file, ".latch %s %s\n", id_sym->name, buf);
1502 fprintf(file, ".r %s\n-\n", buf);
1503 } else {
1504 for (i=lo; i<=hi; i++) {
1505 fprintf(file, ".latch %s%s%d%s %s%s%d%s\n",
1506 id_sym->name, SEP_LBITSELECT, i, SEP_RBITSELECT,
1507 buf, SEP_LBITSELECT, i, SEP_RBITSELECT);
1508 fprintf(file, ".r %s%s%d%s\n-\n",
1509 buf, SEP_LBITSELECT, i, SEP_RBITSELECT);
1510 }
1511 }
1512 }
1513 }
1514}
1515
1516
1517char *check_dc(lsList syndrome_expr_list)
1518{
1519 lsGen lgen;
1520 lsHandle handle;
1521 char *retval;
1522 int nsym;
1523 syndrome_expr *se;
1524 int i;
1525 int rtvl;
1526
1527 if (lsLength(syndrome_expr_list) == 0) return NIL(char);
1528
1529 rtvl = lsFirstItem(syndrome_expr_list,(lsGeneric*)&se,0);
1530 assert(rtvl == LS_OK);
1531 nsym = strlen(se->syndrome);
1532 retval = (char*)chk_malloc(nsym * sizeof(char));
1533 for (i=0; i<nsym; i++) {
1534 retval[i] = 1;
1535 for (lgen=lsStart(syndrome_expr_list);
1536 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;) {
1537 if (se->syndrome[i] != '-')
1538 retval[i] = 0;
1539 }
1540 (void)lsFinish(lgen);
1541 }
1542
1543 return retval;
1544}
1545
1546
1547void put_nblock_transition(FILE *file, int non_block_wire, int n_entries,
1548 vl_id_range *id_sym, int idx_lo, int idx_hi, int cur, char *dc, lsList ripple)
1549{
1550 lsGen lgen;
1551 lsList comp;
1552 lsHandle handle;
1553 int lo, hi;
1554 int i, j, k;
1555 char *syndrome;
1556 syndrome_expr *se;
1557 lsList domain=(lsList)0;
1558 lsGen enum_gen;
1559 lsHandle enum_handle;
1560 vl_enumerator *enum_elt;
1561
1562 for (lgen=lsStart((!rst_ckt)?
1563 id_sym->syndrome_expr_list:
1564 id_sym->rst_syndrome_expr_list),
1565 i=0;
1566 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE; i++) {
1567 if (!(id_sym->flags & MVar)) {
1568 lo=0; hi=1;
1569 } else {
1570 get_hilo(id_sym, &hi, &lo);
1571 }
1572
1573 if (id_sym->id_type)
1574 domain = id_sym->id_type->specifier->u.enum_type->domain_list;
1575
1576 if (!(id_sym->flags & MVar)) {
1577 for (k=lo; k<=hi; k++) {
1578 if (vlTimedSystem && !rst_ckt)
1579 fg_put_loc_context(file, se->pre_cond, NIL(char));
1580 fprintf(file, " ");
1581 put_entry(file, se->syndrome, dc, 1);
1582
1583 if (ripple) {
1584 for (j=0; j<i; j++) fprintf(file, "- ");
1585 fprintf(file, "%d ", 1); j++;
1586 for (; j<n_entries; j++) fprintf(file, "- ");
1587 }
1588
1589 for (j=0; j<i; j++) fprintf(file, "- ");
1590 fprintf(file, "%d ", k); j++;
1591 for (; j<n_entries; j++) fprintf(file, "- ");
1592 fprintf(file, "%s%d\n", (non_block_wire||rst_ckt)?"":"- ", k);
1593 }
1594 } else {
1595 for (enum_gen=lsStart(domain);
1596 lsNext(enum_gen,
1597 (lsGeneric*)&enum_elt,&enum_handle)!=LS_NOMORE;) {
1598 if (vlTimedSystem && !vlTimedSystem)
1599 fg_put_loc_context(file, se->pre_cond, NIL(char));
1600 fprintf(file, " ");
1601 put_entry(file, se->syndrome, dc, 1);
1602
1603 if (ripple) {
1604 for (j=0; j<i; j++) fprintf(file, "- ");
1605 fprintf(file, "%d ", 1); j++;
1606 for (; j<n_entries; j++) fprintf(file, "- ");
1607 }
1608
1609 for (j=0; j<i; j++) fprintf(file, "- ");
1610 fprintf(file, "%s ", enum_elt->name); j++;
1611 for (; j<n_entries; j++) fprintf(file, "- ");
1612 fprintf(file, "%s%s\n",
1613 (non_block_wire||rst_ckt)?"":"- ", enum_elt->name);
1614 }
1615 lsFinish(enum_gen);
1616 }
1617
1618
1619 }
1620 lsFinish(lgen);
1621
1622
1623 if (deadlock_semantic) {
1624 comp = put_guard_zero(file, (!rst_ckt)?id_sym->syndrome_expr_list:
1625 id_sym->rst_syndrome_expr_list);
1626 if (comp)
1627 if (lsLength(comp) > 0 && !(id_sym->flags & RegVar)) {
1628 char buf[MAXSTRLEN], tmp_buf[MAXSTRLEN];
1629 strcpy(tmp_buf, id_sym->name);
1630 strip_char(tmp_buf,SEP_LATCH);
1631 sprintf(buf, "%s: wire '%s' might be unassigned in certain context(s).\n", vl_currentModule->name->name, tmp_buf);
1632 strcat(buf, "\tDeadlock is assumed. To make its value a don't care, turn off -k option");
1633 if (WarningLevel > 0)
1634 Translate_Notice(buf);
1635 }
1636 }
1637
1638
1639 if (!set_notation && !(deadlock_semantic && non_block_wire)) {
1640 comp = put_guard_zero(file, (!rst_ckt)?id_sym->syndrome_expr_list:
1641 id_sym->rst_syndrome_expr_list);
1642 if (!(id_sym->flags & MVar)) {
1643 for (lgen=lsStart(comp);
1644 lsNext(lgen,&syndrome,&handle)!=LS_NOMORE;) {
1645 if (!(id_sym->flags & MVar)) {
1646 lo=0; hi=1;
1647 }
1648 for (k=lo; k<=hi; k++) {
1649 put_entry(file, syndrome, dc, 1);
1650 for (j=0; j<n_entries*((ripple)?2:1); j++)
1651 fprintf(file, "- ");
1652 if (non_block_wire || rst_ckt)
1653 fprintf(file, "%d\n", k);
1654 else
1655 fprintf(file, "%d %d\n", k, k);
1656 }
1657 }
1658 lsFinish(lgen);
1659 } else {
1660 for (lgen=lsStart(comp);
1661 lsNext(lgen,&syndrome,&handle)!=LS_NOMORE;) {
1662 if (!(id_sym->flags & MVar)) {
1663 lo=0; hi=1;
1664 }
1665 for (enum_gen=lsStart(domain);
1666 lsNext(enum_gen,
1667 (lsGeneric*)&enum_elt,&enum_handle)!=LS_NOMORE;) {
1668 put_entry(file, syndrome, dc, 1);
1669 for (j=0; j<n_entries*((ripple)?2:1); j++)
1670 fprintf(file, "- ");
1671 if (non_block_wire || rst_ckt)
1672 fprintf(file, "%s\n", enum_elt->name);
1673 else
1674 fprintf(file, "%s %s\n",
1675 enum_elt->name, enum_elt->name);
1676 }
1677 lsFinish(enum_gen);
1678 }
1679 lsFinish(lgen);
1680 }
1681 }
1682
1683
1684 idx_lo = idx_lo;
1685 idx_hi = idx_hi;
1686 cur = cur;
1687}
1688
1689
1690void put_nblock_mout_transition(FILE *file, int non_block_wire,
1691 int n_entries,
1692 vl_id_range *id_sym,
1693 int idx_lo, int idx_hi, int cur,
1694 char *dc, char *latch_name)
1695{
1696 lsGen lgen;
1697 lsList comp;
1698 lsHandle handle;
1699 int lo, hi;
1700 int i, j, k;
1701 char *syndrome;
1702 syndrome_expr *se;
1703
1704 for (lgen=lsStart((!rst_ckt)?
1705 id_sym->syndrome_expr_list:
1706 id_sym->rst_syndrome_expr_list),
1707 i=0;
1708 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE; i++) {
1709 if (!(id_sym->flags & MVar)) {
1710 lo=0; hi=1;
1711 } else {
1712 get_hilo(id_sym, &hi, &lo);
1713 }
1714
1715 if (vlTimedSystem && !rst_ckt)
1716 fg_put_loc_context(file, se->pre_cond, NIL(char));
1717 fprintf(file, " ");
1718 put_entry(file, se->syndrome, dc, 1);
1719
1720 for (j=0; j<n_entries; j++)
1721 if (idx_lo == 0 && idx_hi == -1)
1722 fprintf(file, "- ");
1723 else
1724 for (k=idx_lo; k<=idx_hi; k++) fprintf(file, "- ");
1725 if (!(non_block_wire||rst_ckt)) {
1726 if (idx_lo == 0 && idx_hi == -1)
1727 fprintf(file, "- ");
1728 else
1729 for (k=idx_lo; k<=idx_hi; k++)
1730 fprintf(file, "- ");
1731 }
1732 if (id_sym->flags & MVar || (idx_lo==0 && idx_hi==-1)) {
1733 fprintf(file, "%s%s\n", HSIS_EQUAL, se->expr->name->name);
1734 } else {
1735 for (k=idx_lo; k<=idx_hi; k++) {
1736 fprintf(file, "%s%s%s%d%s ", HSIS_EQUAL,
1737 se->expr->name->name,
1738 SEP_LBITSELECT, k, SEP_RBITSELECT);
1739 }
1740 fprintf(file, "\n");
1741 }
1742 }
1743 lsFinish(lgen);
1744
1745
1746 if (deadlock_semantic) {
1747 comp = put_guard_zero(file, (!rst_ckt)?id_sym->syndrome_expr_list:
1748 id_sym->rst_syndrome_expr_list);
1749 if (comp)
1750 if (lsLength(comp) > 0 && !(id_sym->flags & RegVar)) {
1751 char buf[MAXSTRLEN], tmp_buf[MAXSTRLEN];
1752 strcpy(tmp_buf, id_sym->name);
1753 strip_char(tmp_buf,SEP_LATCH);
1754 sprintf(buf, "%s: wire '%s' might be unassigned in certain context(s).\n", vl_currentModule->name->name, tmp_buf);
1755 strcat(buf, "\tDeadlock is assumed. To make its value a don't care, use -k option");
1756 if (WarningLevel > 0)
1757 Translate_Notice(buf);
1758 }
1759 }
1760
1761
1762 if (!set_notation && !(deadlock_semantic && non_block_wire)) {
1763 comp = put_guard_zero(file, (!rst_ckt)?id_sym->syndrome_expr_list:
1764 id_sym->rst_syndrome_expr_list);
1765 for (lgen=lsStart(comp);
1766 lsNext(lgen,&syndrome,&handle)!=LS_NOMORE;) {
1767
1768 put_entry(file, syndrome, dc, 1);
1769 for (j=0; j<n_entries; j++)
1770 if (idx_lo == 0 && idx_hi == -1)
1771 fprintf(file, "- ");
1772 else
1773 for (k=idx_lo; k<=idx_hi; k++) fprintf(file, "- ");
1774 if (!(non_block_wire || rst_ckt)) {
1775 if (idx_lo == 0 && idx_hi == -1)
1776 fprintf(file, "- ");
1777 else
1778 for (k=idx_lo; k<=idx_hi; k++)
1779 fprintf(file, "- ");
1780 }
1781 if (id_sym->flags & MVar || (idx_lo==0 && idx_hi==-1)) {
1782 if (!(non_block_wire || rst_ckt)) {
1783 fprintf(file, "%s%s\n", HSIS_EQUAL, latch_name);
1784 } else {
1785 fprintf(file, "-\n");
1786 }
1787 } else {
1788 if (!(non_block_wire || rst_ckt))
1789 for (k=idx_lo; k<=idx_hi; k++) {
1790 fprintf(file, "%s%s%s%d%s ", HSIS_EQUAL,
1791 latch_name, SEP_LBITSELECT, k, SEP_RBITSELECT);
1792 }
1793 else
1794 for (k=idx_lo; k<=idx_hi; k++) {
1795 fprintf(file,"-");
1796 }
1797 fprintf(file, "\n");
1798 }
1799 }
1800
1801 lsFinish(lgen);
1802 }
1803
1804
1805 cur = cur;
1806}
1807
1808
1809void create_wire_nondeterminism(FILE *file, char * var_name,
1810 vl_id_range *id_sym, array_t *vars_array)
1811{
1812 char buf[MAXSTRLEN];
1813 char input_buf[MAXSTRLEN];
1814 char *cp;
1815 st_table *vars;
1816 var_info *cur_var;
1817 int h, i, j, k;
1818 int hi, lo;
1819 int num_changer=0;
1820 lsList domain;
1821 lsGen enum_gen;
1822 lsHandle enum_handle;
1823 vl_enumerator *enum_elt;
1824
1825
1826 get_hilo(id_sym, &hi, &lo);
1827
1828 cp = buf; *cp = '\0';
1829 cp = strappend(cp, ".names ");
1830 for (i=0; i<array_n(vars_array); i++) {
1831 vars = array_fetch(st_table*, vars_array, i);
1832 if (vars) {
1833 if (st_lookup(vars, var_name, (char**)&cur_var)) {
1834 num_changer++;
1835 cp = strappendS(cp,
1836 cur_var->current_terminal->name->name);
1837 }
1838 }
1839 }
1840 strcpy(input_buf, buf);
1841 if (!num_changer)
1842 if (!((id_sym->flags & OutPort) && Zconnection))
1843 return;
1844
1845
1846 if (id_sym->flags &MVar) {
1847 fprintf(file, "%s %s\n", buf, id_sym->name);
1848
1849 if (set_notation) {
1850 for (i=0; i<array_n(vars_array); i++) {
1851 vars = array_fetch(st_table*, vars_array, i);
1852 if (vars) {
1853 if (st_lookup(vars, var_name, (char**)&cur_var)) {
1854 for (j=0; j<num_changer; j++) {
1855 fprintf(file, "- ");
1856 }
1857 fprintf(file, "%s%s\n", HSIS_EQUAL,
1858 cur_var->current_terminal->name->name);
1859 }
1860 }
1861 }
1862 } else {
1863 domain = id_sym->id_type->specifier->u.enum_type->domain_list;
1864 for (i=0; i<num_changer; i++) {
1865 for (enum_gen=lsStart(domain);
1866 lsNext(enum_gen,
1867 (lsGeneric*)&enum_elt,&enum_handle)!=LS_NOMORE;) {
1868 for (k=0; k<num_changer; k++) {
1869 fprintf(file, "%s ", (i==k)?enum_elt->name:"-");
1870 }
1871 fprintf(file, "%s\n", enum_elt->name);
1872 }
1873 lsFinish(enum_gen);
1874 }
1875 }
1876
1877 } else if (lo > hi) {
1878
1879 fprintf(file, "%s %s\n", buf, id_sym->name);
1880
1881 for (i=0; i<num_changer; i++) {
1882 for (j=0; j<=1; j++) {
1883 for (k=0; k<num_changer; k++) {
1884 fprintf(file, "%c ", (i==k)?'0'+j:'-');
1885 }
1886 fprintf(file, "%d\n", j);
1887 }
1888 }
1889
1890 } else {
1891 array_t *ctrlv;
1892
1893 for (h=lo; h<=hi; h++) {
1894 cp = buf; *cp = '\0';
1895 cp = strappend(cp, ".names ");
1896 ctrlv = array_alloc(char*,0);
1897 for (i=0, num_changer=0; i<array_n(vars_array); i++) {
1898 vars = array_fetch(st_table*, vars_array, i);
1899 if (vars) {
1900 if (st_lookup(vars, var_name, (char**)&cur_var)) {
1901 char tmp_buf[MAXSTRLEN];
1902 int real_changer = 0;
1903 if (h == lo &&
1904 cur_var->current_terminal->lo >
1905 cur_var->current_terminal->hi)
1906 real_changer = 1;
1907 if (cur_var->current_terminal->lo <=
1908 cur_var->current_terminal->hi)
1909 if (cur_var->current_terminal->lo <= h &&
1910 cur_var->current_terminal->hi >= h)
1911 real_changer = 1;
1912 if (real_changer) {
1913 num_changer++;
1914
1915 sprintf(tmp_buf, "%s%s%d%s",
1916 cur_var->current_terminal->name->name,
1917 SEP_LBITSELECT, h, SEP_RBITSELECT);
1918 cp = strappendS(cp, tmp_buf);
1919 array_insert_last(char*,ctrlv,
1920 vlStrdup(cur_var->current_terminal->name->name));
1921 }
1922 }
1923 }
1924 }
1925 if (!num_changer) continue;
1926 fprintf(file, "%s %s%s%d%s\n", buf, id_sym->name,
1927 SEP_LBITSELECT, h, SEP_RBITSELECT);
1928 if (set_notation) {
1929 for (i=0; i<num_changer; i++) {
1930 for (k=0; k<num_changer; k++) {
1931 fprintf(file, "- ");
1932 }
1933 fprintf(file, "%s%s%s%d%s\n", HSIS_EQUAL,
1934 array_fetch(char*, ctrlv, i),
1935 SEP_LBITSELECT, h, SEP_RBITSELECT);
1936 }
1937 } else {
1938 for (i=0; i<num_changer; i++) {
1939 for (j=0; j<=1; j++) {
1940 for (k=0; k<num_changer; k++) {
1941 fprintf(file, "%c ", (i==k)?'0'+j:'-');
1942 }
1943 fprintf(file, "%d\n", j);
1944 }
1945 }
1946 }
1947
1948 for (i=0; i<array_n(ctrlv); i++)
1949 vl_chk_free(array_fetch(char*, ctrlv, i));
1950 array_free(ctrlv);
1951
1952 }
1953 }
1954}
1955
1956
1957vl_term *put_quasi_control(FILE *file, char *dc, char *quasi_name, vl_id_range *id_sym, int n_entries)
1958{
1959 int ith_var;
1960 vl_term *ctrl_term;
1961 vl_term *retval;
1962 lsGen lgen;
1963 lsHandle handle;
1964 syndrome_expr *se;
1965 int retval_width, retval_range;
1966 char buf[MAXSTRLEN];
1967
1968 retval_range = lsLength((!rst_ckt)?
1969 id_sym->syndrome_expr_list:
1970 id_sym->rst_syndrome_expr_list);
1971 retval_width = min_bit_width(retval_range);
1972 retval = new_term(NIL(vl_range), 0, retval_width-1);
1973 fprintf(file, ".mv %s,%s%s%s %d\n",
1974 retval->name->name, retval->name->name, SEP_GATEPIN, PIN_NS,
1975 n_entries+1);
1976 fprintf(file, ".latch %s%s%s %s\n",
1977 retval->name->name, SEP_GATEPIN, PIN_NS, retval->name->name);
1978 fprintf(file, ".r %s\n0\n", retval->name->name);
1979
1980
1981 fprintf(file, ".names ");
1982
1983 for (lgen=lsStart((!rst_ckt)?ctrl_list:rst_ctrl_list), ith_var=0;
1984 lsNext(lgen,(lsGeneric*)&ctrl_term,&handle)!=LS_NOMORE;
1985 ith_var++) {
1986 if (!dc[ith_var]) fprintf(file, "%s ", ctrl_term->name->name);
1987 }
1988 (void)lsFinish(lgen);
1989
1990 fprintf(file, "%s %s%s%s\n",
1991 retval->name->name, retval->name->name, SEP_GATEPIN, PIN_NS);
1992
1993 fprintf(file, "%s %s%s\n",
1994 HSIS_DEFAULT, HSIS_EQUAL, retval->name->name);
1995
1996 for (lgen=lsStart((!rst_ckt)?
1997 id_sym->syndrome_expr_list:
1998 id_sym->rst_syndrome_expr_list), ith_var=0;
1999 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;
2000 ith_var++) {
2001 if (vlTimedSystem && !rst_ckt)
2002 fg_put_loc_context(file, se->pre_cond, NIL(char));
2003 fprintf(file, " ");
2004 put_entry(file, se->syndrome, dc, 1);
2005 fprintf(file, "- %d\n",
2006 (strcmp(se->expr->name->name,quasi_name))?ith_var+1:0);
2007 }
2008 (void)lsFinish(lgen);
2009
2010 sprintf(buf, "%s%s%s", retval->name->name, SEP_GATEPIN, PIN_NS);
2011 vl_chk_free(retval->name->name);
2012 retval->name->name = vlStrdup(buf);
2013
2014 return retval;
2015}
2016
2017
2018void put_quasi_table(FILE *file, char *dc, char *quasi_name, char *sync_name,
2019 vl_id_range *id_sym, vl_term *out_term, int lo, int hi,
2020 int n_entries)
2021{
2022 int ith_var, j;
2023 lsGen lgen;
2024 lsHandle handle;
2025 syndrome_expr *se;
2026 vl_term *ctrl_term;
2027
2028
2029 ctrl_term = put_quasi_control(file, dc, quasi_name, id_sym, n_entries);
2030
2031 if (hi < lo) {
2032
2033
2034 fprintf(file, ".names %s ", ctrl_term->name->name);
2035
2036 for (lgen=lsStart((!rst_ckt)?
2037 id_sym->syndrome_expr_list:
2038 id_sym->rst_syndrome_expr_list);
2039 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;) {
2040 fprintf(file, "%s ", se->expr->name->name);
2041 }
2042 (void)lsFinish(lgen);
2043 fprintf(file, "%s ", sync_name);
2044
2045 fprintf(file, "%s\n", out_term->name->name);
2046
2047
2048 for (lgen=lsStart((!rst_ckt)?
2049 id_sym->syndrome_expr_list:
2050 id_sym->rst_syndrome_expr_list), ith_var=0;
2051 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;
2052 ith_var++) {
2053 if (strcmp(se->expr->name->name, quasi_name)) {
2054 fprintf(file, "%d ", ith_var+1);
2055 for (j=0; j<n_entries; j++) fprintf(file, "- ");
2056 fprintf(file, "- %s%s\n", HSIS_EQUAL,se->expr->name->name);
2057 }
2058 }
2059 (void)lsFinish(lgen);
2060 fprintf(file, "0 ");
2061 for (j=0; j<n_entries; j++) fprintf(file, "- ");
2062 fprintf(file, "- %s%s\n", HSIS_EQUAL, sync_name);
2063 } else {
2064 int bit;
2065
2066
2067 fprintf(file, ".names %s ", ctrl_term->name->name);
2068
2069 for (lgen=lsStart((!rst_ckt)?
2070 id_sym->syndrome_expr_list:
2071 id_sym->rst_syndrome_expr_list);
2072 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;) {
2073 for (bit=lo; bit<=hi; bit++)
2074 fprintf(file, "%s%s%d%s ", se->expr->name->name,
2075 SEP_LBITSELECT, bit, SEP_RBITSELECT);
2076 }
2077 (void)lsFinish(lgen);
2078
2079 for (bit=lo; bit<=hi; bit++)
2080 fprintf(file, "%s%s%d%s%s%s ", quasi_name,
2081 SEP_LBITSELECT, bit, SEP_RBITSELECT,
2082 SEP_GATEPIN, PIN_PS);
2083
2084 fprintf(file, "%s ", HSIS_ARROW);
2085 for (bit=lo; bit<=hi; bit++)
2086 fprintf(file, "%s%s%d%s ", out_term->name->name,
2087 SEP_LBITSELECT, bit, SEP_RBITSELECT);
2088 fprintf(file, "\n");
2089
2090
2091 for (lgen=lsStart((!rst_ckt)?
2092 id_sym->syndrome_expr_list:
2093 id_sym->rst_syndrome_expr_list), ith_var=0;
2094 lsNext(lgen,(lsGeneric*)&se,&handle)!=LS_NOMORE;
2095 ith_var++) {
2096 if (strcmp(se->expr->name->name, quasi_name)) {
2097 fprintf(file, "%d ", ith_var+1);
2098 for (j=0; j<n_entries; j++)
2099 for (bit=lo; bit<=hi; bit++) fprintf(file, "- ");
2100 for (bit=lo; bit<=hi; bit++) fprintf(file, "- ");
2101 for (bit=lo; bit<=hi; bit++)
2102 fprintf(file, "%s%s%s%d%s ",
2103 HSIS_EQUAL,se->expr->name->name,
2104 SEP_LBITSELECT, bit, SEP_RBITSELECT);
2105 fprintf(file, "\n");
2106 }
2107 }
2108 (void)lsFinish(lgen);
2109 fprintf(file, "0 ");
2110 for (j=0; j<n_entries; j++)
2111 for (bit=lo; bit<=hi; bit++) fprintf(file, "- ");
2112 for (bit=lo; bit<=hi; bit++) fprintf(file, "- ");
2113
2114 for (bit=lo; bit<=hi; bit++)
2115 fprintf(file, "%s%s%s%d%s%s%s ",
2116 HSIS_EQUAL, quasi_name,
2117 SEP_LBITSELECT, bit, SEP_RBITSELECT,
2118 SEP_GATEPIN, PIN_PS);
2119 fprintf(file, "\n");
2120 }
2121}
2122
2123
2124void declare_mvar_io(FILE *file, char *dir, vl_id_range *id_sym)
2125{
2126 int idx, idx_hi, idx_lo;
2127
2128 if (!id_sym->range) {
2129 fprintf(file, "%s %s", dir, id_sym->name);
2130 fprintf(file, "\n");
2131 } else {
2132 idx_lo = vl_eval_expr(id_sym->range->left);
2133 if (id_sym->range->right)
2134 idx_hi = vl_eval_expr(id_sym->range->right);
2135 else
2136 idx_hi = idx_lo;
2137
2138 for (idx = idx_lo; idx <= idx_hi; idx++) {
2139 fprintf(file, "%s %s%s%d%s", dir,
2140 id_sym->name, SEP_LARRAY, idx, SEP_RARRAY);
2141 fprintf(file, "\n");
2142 }
2143 }
2144}
2145
2146void declare_bin_scalar_io(FILE *file, char *dir, vl_id_range *id_sym)
2147{
2148 int idx, idx_lo, idx_hi;
2149
2150 if (!id_sym->range) {
2151 fprintf(file, "%s %s", dir, id_sym->name);
2152 fprintf(file, "\n");
2153 } else {
2154 idx_lo = vl_eval_expr(id_sym->range->left);
2155 if (id_sym->range->right)
2156 idx_hi = vl_eval_expr(id_sym->range->right);
2157 else
2158 idx_hi = idx_lo;
2159
2160 for (idx = idx_lo; idx <= idx_hi; idx++) {
2161 fprintf(file, "%s %s%s%d%s", dir,
2162 id_sym->name, SEP_LARRAY, idx, SEP_RARRAY);
2163 fprintf(file, "\n");
2164 }
2165 }
2166}
2167
2168void declare_bin_vector_io(FILE *file, char *dir, vl_id_range *id_sym)
2169{
2170 int idx, idx_lo, idx_hi;
2171 int i, lo, hi;
2172 int ithItem;
2173
2174 get_hilo(id_sym, &hi, &lo);
2175
2176 if (!id_sym->range) {
2177 fprintf(file, "%s ", dir);
2178 ithItem = 0;
2179 for (i=lo; i<=hi; i++) {
2180 char buf[MAXSTRLEN];
2181
2182 sprintf(buf, "%s%s%d%s", id_sym->name,
2183 SEP_LBITSELECT, i, SEP_RBITSELECT);
2184 fprintf(file, "%s ", buf);
2185 }
2186 fprintf(file, "\n");
2187 } else {
2188 idx_lo = vl_eval_expr(id_sym->range->left);
2189 if (id_sym->range->right)
2190 idx_hi = vl_eval_expr(id_sym->range->right);
2191 else
2192 idx_hi = idx_lo;
2193
2194 for (idx = idx_lo; idx <= idx_hi; idx++) {
2195 fprintf(file, "%s ", dir);
2196 for (i=lo; i<=hi; i++) {
2197 char buf[MAXSTRLEN];
2198
2199 sprintf(buf, "%s%s%d%s%s%d%s", id_sym->name,
2200 SEP_LARRAY, idx, SEP_RARRAY,
2201 SEP_LBITSELECT, i, SEP_RBITSELECT);
2202 fprintf(file, "%s ", buf);
2203 }
2204 fprintf(file, "\n");
2205 }
2206 }
2207}
2208
2209
2210void put_const_port_connect(FILE *file, char *outstr,
2211 vl_id_range *master,
2212 vl_port_connect *instance,
2213 lsList input_consts,
2214 vl_term *term_out)
2215{
2216 int i, hi, lo;
2217 char buf[MAXSTRLEN];
2218
2219 get_hilo(master, &hi, &lo);
2220 if (isMVar(master->flags)) {
2221
2222 sprintf(buf, "%s=%s ", master->name, term_out->name->name);
2223 } else {
2224
2225 if (lo > hi) {
2226
2227 sprintf(buf, "%s=%s ",
2228 master->name, term_out->name->name);
2229 } else {
2230
2231 char tmp[MAXSTRLEN];
2232
2233 buf[0] = '\0';
2234 for (i=lo; i<=hi; i++) {
2235 sprintf(tmp, "%s%s%d%s=%s%s%d%s ",
2236 master->name,
2237 SEP_LBITSELECT, i, SEP_RBITSELECT,
2238 term_out->name->name,
2239 SEP_LBITSELECT, i, SEP_RBITSELECT);
2240 strcat(buf, tmp);
2241 }
2242 }
2243 }
2244
2245 if (file) fprintf(file, "%s", buf);
2246 if (outstr) sprintf(outstr, "%s", buf);
2247}
2248
2249
2250void put_mvar_port_connect(FILE *file, char *outstr,
2251 vl_id_range *master,
2252 vl_port_connect *instance)
2253{
2254 int idx, idx_lo, idx_hi;
2255 char buf[MAXSTRLEN];
2256
2257 if (!master->range) {
2258 sprintf(buf, "%s=%s ",
2259 master->name,
2260 instance->expr->term->name->name);
2261 } else {
2262 char tmp[MAXSTRLEN];
2263
2264 buf[0] = '\0';
2265 idx_lo = vl_eval_expr(master->range->left);
2266 if (master->range->right)
2267 idx_hi = vl_eval_expr(master->range->right);
2268 else
2269 idx_hi = idx_lo;
2270
2271 for (idx=idx_lo; idx<=idx_hi; idx++) {
2272 sprintf(tmp, "%s%s%d%s=%s%s%d%s ",
2273 master->name, SEP_LARRAY, idx, SEP_RARRAY,
2274 instance->expr->term->name->name,
2275 SEP_LARRAY, idx, SEP_RARRAY);
2276 strcat(buf, tmp);
2277 }
2278 }
2279
2280 if (file) fprintf(file, "%s", buf);
2281 if (outstr) sprintf(outstr, "%s", buf);
2282}
2283
2284
2285void put_bin_scalar_port_connect(FILE *file, char *outstr,
2286 vl_id_range *master,
2287 vl_port_connect *instance)
2288{
2289 int idx, idx_lo, idx_hi;
2290 char buf[MAXSTRLEN];
2291
2292 if (instance->expr->term->lo > instance->expr->term->hi){
2293 if (!master->range) {
2294 sprintf(buf, "%s=%s ",
2295 master->name,
2296 instance->expr->term->name->name);
2297 } else {
2298 char tmp[MAXSTRLEN];
2299
2300 buf[0] = '\0';
2301 idx_lo = vl_eval_expr(master->range->left);
2302 if (master->range->right)
2303 idx_hi = vl_eval_expr(master->range->right);
2304 else
2305 idx_hi = idx_lo;
2306
2307 for (idx=idx_lo; idx<=idx_hi; idx++) {
2308 sprintf(tmp, "%s%s%d%s=%s%s%d%s ",
2309 master->name,
2310 SEP_LARRAY, idx, SEP_RARRAY,
2311 instance->expr->term->name->name,
2312 SEP_LARRAY, idx, SEP_RARRAY);
2313 strcat(buf, tmp);
2314 }
2315 }
2316 } else {
2317 if (!master->range) {
2318 sprintf(buf, "%s=%s%s%d%s ",
2319 master->name,
2320 instance->expr->term->name->name,
2321 SEP_LBITSELECT,
2322 instance->expr->term->lo,
2323 SEP_RBITSELECT);
2324 } else {
2325 char tmp[MAXSTRLEN];
2326
2327 buf[0] = '\0';
2328 idx_lo = vl_eval_expr(master->range->left);
2329 if (master->range->right)
2330 idx_hi = vl_eval_expr(master->range->right);
2331 else
2332 idx_hi = idx_lo;
2333
2334 for (idx=idx_lo; idx<=idx_hi; idx++) {
2335 sprintf(tmp, "%s%s%d%s=%s%s%d%s%s%d%s ",
2336 master->name,
2337 SEP_LARRAY, idx, SEP_RARRAY,
2338 instance->expr->term->name->name,
2339 SEP_LARRAY, idx, SEP_RARRAY,
2340 SEP_LBITSELECT,
2341 instance->expr->term->lo,
2342 SEP_RBITSELECT);
2343 strcat(buf, tmp);
2344 }
2345 }
2346 }
2347
2348 if (file) fprintf(file, "%s", buf);
2349 if (outstr) sprintf(outstr, "%s", buf);
2350}
2351
2352
2353void put_bin_vector_port_connect(FILE *file, char *outstr,
2354 vl_id_range *master,
2355 vl_port_connect *instance)
2356{
2357 int sig_lo;
2358 int lo, hi;
2359 int idx, idx_lo, idx_hi;
2360 int i;
2361 char buf[MAXSTRLEN];
2362
2363 get_hilo(master, &hi, &lo);
2364 sig_lo = instance->expr->term->lo;
2365
2366 if (!master->range) {
2367 char tmp[MAXSTRLEN];
2368
2369 buf[0] = '\0';
2370 for (i=lo; i<=hi; i++) {
2371 char mast_buf[MAXSTRLEN];
2372 char inst_buf[MAXSTRLEN];
2373
2374 sprintf(mast_buf, "%s%s%d%s", master->name,
2375 SEP_LBITSELECT, i, SEP_RBITSELECT);
2376 sprintf(inst_buf, "%s%s%d%s",
2377 instance->expr->term->name->name,
2378 SEP_LBITSELECT,sig_lo-lo+i,SEP_RBITSELECT);
2379 sprintf(tmp, "%s=%s ", mast_buf, inst_buf);
2380 strcat(buf, tmp);
2381 }
2382 } else {
2383 idx_lo = vl_eval_expr(master->range->left);
2384 if (master->range->right)
2385 idx_hi = vl_eval_expr(master->range->right);
2386 else
2387 idx_hi = idx_lo;
2388
2389 {
2390 char tmp[MAXSTRLEN];
2391
2392 buf[0] = '\0';
2393 for (idx=idx_lo; idx<=idx_hi; idx++) {
2394 for (i=lo; i<=hi; i++) {
2395 char mast_buf[MAXSTRLEN];
2396 char inst_buf[MAXSTRLEN];
2397
2398 sprintf(mast_buf, "%s%s%d%s%s%d%s", master->name,
2399 SEP_LARRAY, idx, SEP_RARRAY,
2400 SEP_LBITSELECT, i, SEP_RBITSELECT);
2401 sprintf(inst_buf, "%s%s%d%s%s%d%s",
2402 instance->expr->term->name->name,
2403 SEP_LARRAY, idx, SEP_RARRAY,
2404 SEP_LBITSELECT,
2405 sig_lo-lo+i,
2406 SEP_RBITSELECT);
2407 sprintf(tmp, "%s=%s ", mast_buf, inst_buf);
2408 strcat(buf, tmp);
2409 }
2410 }
2411 }
2412 }
2413
2414 if (file) fprintf(file, "%s", buf);
2415 if (outstr) sprintf(outstr, "%s", buf);
2416}
2417
2418
2419void put_bin_scalar_func_connect(FILE *file, vl_id_range *master,
2420 vl_term *instance)
2421{
2422 int idx, idx_lo, idx_hi;
2423
2424 if (instance->lo > instance->hi){
2425 if (!master->range) {
2426 fprintf(file, "%s=%s ",
2427 master->name,
2428 instance->name->name);
2429 } else {
2430 idx_lo = vl_eval_expr(master->range->left);
2431 if (master->range->right)
2432 idx_hi = vl_eval_expr(master->range->right);
2433 else
2434 idx_hi = idx_lo;
2435
2436 for (idx=idx_lo; idx<=idx_hi; idx++) {
2437 fprintf(file, "%s%s%d%s=%s%s%d%s ",
2438 master->name,
2439 SEP_LARRAY, idx, SEP_RARRAY,
2440 instance->name->name,
2441 SEP_LARRAY, idx, SEP_RARRAY);
2442 }
2443 }
2444 } else {
2445 if (!master->range) {
2446 fprintf(file, "%s=%s%s%d%s ",
2447 master->name,
2448 instance->name->name,
2449 SEP_LBITSELECT,
2450 instance->lo,
2451 SEP_RBITSELECT);
2452 } else {
2453 idx_lo = vl_eval_expr(master->range->left);
2454 if (master->range->right)
2455 idx_hi = vl_eval_expr(master->range->right);
2456 else
2457 idx_hi = idx_lo;
2458
2459 for (idx=idx_lo; idx<=idx_hi; idx++) {
2460 fprintf(file, "%s%s%d%s=%s%s%d%s%s%d%s ",
2461 master->name,
2462 SEP_LARRAY, idx, SEP_RARRAY,
2463 instance->name->name,
2464 SEP_LARRAY, idx, SEP_RARRAY,
2465 SEP_LBITSELECT,
2466 instance->lo,
2467 SEP_RBITSELECT);
2468 }
2469 }
2470 }
2471}
2472
2473
2474void put_bin_vector_func_connect(FILE *file, vl_id_range *master,
2475 vl_term *instance)
2476{
2477 int sig_lo;
2478 int lo, hi;
2479 int idx, idx_lo, idx_hi;
2480 int i;
2481
2482 get_hilo(master, &hi, &lo);
2483 sig_lo = instance->lo;
2484
2485 if (!master->range) {
2486 for (i=lo; i<=hi; i++) {
2487 char mast_buf[MAXSTRLEN];
2488 char inst_buf[MAXSTRLEN];
2489
2490 sprintf(mast_buf, "%s%s%d%s", master->name,
2491 SEP_LBITSELECT, i, SEP_RBITSELECT);
2492 sprintf(inst_buf, "%s%s%d%s",
2493 instance->name->name,
2494 SEP_LBITSELECT,sig_lo-lo+i,SEP_RBITSELECT);
2495 fprintf(file, "%s=%s ", mast_buf, inst_buf);
2496 }
2497 } else {
2498 idx_lo = vl_eval_expr(master->range->left);
2499 if (master->range->right)
2500 idx_hi = vl_eval_expr(master->range->right);
2501 else
2502 idx_hi = idx_lo;
2503
2504 for (idx=idx_lo; idx<=idx_hi; idx++) {
2505 for (i=lo; i<=hi; i++) {
2506 char mast_buf[MAXSTRLEN];
2507 char inst_buf[MAXSTRLEN];
2508
2509 sprintf(mast_buf, "%s%s%d%s%s%d%s", master->name,
2510 SEP_LARRAY, idx, SEP_RARRAY,
2511 SEP_LBITSELECT, i, SEP_RBITSELECT);
2512 sprintf(inst_buf, "%s%s%d%s%s%d%s",
2513 instance->name->name,
2514 SEP_LARRAY, idx, SEP_RARRAY,
2515 SEP_LBITSELECT,
2516 sig_lo-lo+i,
2517 SEP_RBITSELECT);
2518 fprintf(file, "%s=%s ", mast_buf, inst_buf);
2519 }
2520 }
2521 }
2522}
2523
2524
2525char *write_red_op(FILE *file, short type, vl_term *in1, vl_term *in2, vl_term *out)
2526{
2527 int bpos;
2528 char *ripple=NIL(char);
2529
2530 fprintf(file, ".names ");
2531 for (bpos=in1->lo; bpos<=in1->hi; bpos++) {
2532 fprintf(file, "%s%s%d%s ", in1->name->name,
2533 SEP_LBITSELECT, bpos, SEP_RBITSELECT);
2534 }
2535
2536 fprintf(file, "%s\n", out->name->name);
2537
2538 if (set_notation) {
2539 fprintf(file, "%s %c\n", HSIS_DEFAULT,
2540 (type==UnorExpr||type==UandExpr)?'0':'1');
2541 for (bpos=in1->lo; bpos<=in1->hi; bpos++) {
2542 fprintf(file, "%c ",
2543 (type==UorExpr||type==UnorExpr)?'0':'1');
2544 }
2545 fprintf(file, "%c\n",
2546 (type==UnorExpr||type==UandExpr)?'1':'0');
2547 } else {
2548 for (bpos=in1->lo; bpos<=in1->hi; bpos++) {
2549 int i;
2550 for (i=in1->lo; i<=in1->hi; i++) {
2551 fprintf(file, "%c ",
2552 (i==bpos)?
2553 ((type==UorExpr||type==UnorExpr)?'1':'0'):'-');
2554 }
2555 fprintf(file, "%c\n",
2556 (type==UorExpr||type==UnandExpr)?'1':'0');
2557 }
2558 for (bpos=in1->lo; bpos<=in1->hi; bpos++) {
2559 fprintf(file, "%c ",
2560 (type==UorExpr||type==UnorExpr)?'0':'1');
2561 }
2562 fprintf(file, "%c\n",
2563 (type==UorExpr||type==UnandExpr)?'0':'1');
2564 }
2565
2566 in2 = in2;
2567
2568 return ripple;
2569}
2570
2571
2572
2573char *write_rel_vector_bop(FILE *file, short type, vl_term *in1, vl_term *in2, vl_term *out)
2574{
2575 int bpos;
2576 vl_term *tmpterm;
2577 char term1[MAXSTRLEN], term2[MAXSTRLEN], outerm[MAXSTRLEN];
2578 char *ripple=NIL(char);
2579
2580
2581 tmpterm = create_rename_term(out->name, new_termname(), out->lo, out->hi);
2582 out->lo = 0;
2583 out->hi = -1;
2584
2585 if (in1->lo > in1->hi && in2->lo > in2->hi) {
2586
2587 ripple = vl_write_bop(file, type,
2588 in1->name->name, in2->name->name, NIL(char),
2589 tmpterm->name->name,
2590 !IS_VLR_REL_OP(type));
2591 if (IS_VLR_REL_OP(type))
2592 postprocess_vlr_rel(file, type, ripple, tmpterm, out);
2593 } else if (in1->lo > in1->hi && in2->lo <= in2->hi) {
2594
2595 char tmpterm_buf[MAXSTRLEN];
2596 if (tmpterm->lo > tmpterm->hi)
2597 sprintf(tmpterm_buf, "%s", tmpterm->name->name);
2598 else
2599 sprintf(tmpterm_buf, "%s%s%d%s", tmpterm->name->name,
2600 SEP_LBITSELECT, tmpterm->lo, SEP_RBITSELECT);
2601 sprintf(term2, "%s%s%d%s", in2->name->name,
2602 SEP_LBITSELECT, in2->lo, SEP_RBITSELECT);
2603 ripple = vl_write_bop(file, type,
2604 in1->name->name, term2, NIL(char),
2605 tmpterm_buf,
2606 !IS_VLR_REL_OP(type));
2607
2608 for (bpos=in2->lo+1; bpos<=in2->hi; bpos++) {
2609 sprintf(term2, "%s%s%d%s", in2->name->name,
2610 SEP_LBITSELECT, bpos, SEP_RBITSELECT);
2611 sprintf(tmpterm_buf, "%s%s%d%s",
2612 tmpterm->name->name,
2613 SEP_LBITSELECT,
2614 tmpterm->lo+(bpos-in2->lo),
2615 SEP_RBITSELECT);
2616 vl_write_bit_connect(file, term2, tmpterm_buf, 0);
2617 }
2618 if (IS_VLR_REL_OP(type))
2619 postprocess_vlr_rel(file, type, ripple, tmpterm, out);
2620 } else if (in1->lo <= in1->hi && in2->lo > in2->hi) {
2621
2622 char tmpterm_buf[MAXSTRLEN];
2623 if (tmpterm->lo > tmpterm->hi)
2624 sprintf(tmpterm_buf, "%s", tmpterm->name->name);
2625 else
2626 sprintf(tmpterm_buf, "%s%s%d%s", tmpterm->name->name,
2627 SEP_LBITSELECT, tmpterm->lo, SEP_RBITSELECT);
2628 sprintf(term1, "%s%s%d%s", in1->name->name,
2629 SEP_LBITSELECT, in1->lo, SEP_RBITSELECT);
2630 ripple = vl_write_bop(file, type,
2631 term1, in2->name->name, NIL(char),
2632 tmpterm_buf,
2633 !IS_VLR_REL_OP(type));
2634
2635 for (bpos=in1->lo+1; bpos<=in1->hi; bpos++) {
2636 sprintf(term1, "%s%s%d%s", in1->name->name,
2637 SEP_LBITSELECT, bpos, SEP_RBITSELECT);
2638 sprintf(tmpterm_buf, "%s%s%d%s",
2639 tmpterm->name->name,
2640 SEP_LBITSELECT,
2641 tmpterm->lo+(bpos-in1->lo),
2642 SEP_RBITSELECT);
2643 vl_write_bit_connect(file, term1, tmpterm_buf, 0);
2644 }
2645 if (IS_VLR_REL_OP(type))
2646 postprocess_vlr_rel(file, type, ripple, tmpterm, out);
2647 } else {
2648
2649 for (bpos=tmpterm->lo, ripple=NIL(char); bpos<=tmpterm->hi; bpos++) {
2650 if (bpos > in1->hi-in1->lo)
2651 sprintf(term1, "%s", WRT_BLIF_GND(file));
2652 else
2653 sprintf(term1, "%s%s%d%s",
2654 in1->name->name,
2655 SEP_LBITSELECT, in1->lo+bpos, SEP_RBITSELECT);
2656 if (bpos > in2->hi-in2->lo)
2657 sprintf(term2, "%s", WRT_BLIF_GND(file));
2658 else
2659 sprintf(term2, "%s%s%d%s",
2660 in2->name->name,
2661 SEP_LBITSELECT, in2->lo+bpos, SEP_RBITSELECT);
2662 sprintf(outerm, "%s%s%d%s",
2663 tmpterm->name->name,
2664 SEP_LBITSELECT, tmpterm->lo+bpos, SEP_RBITSELECT);
2665 ripple = vl_write_bop(file, type, term1, term2, ripple, outerm,
2666 !IS_VLR_REL_OP(type));
2667 }
2668 if (IS_VLR_REL_OP(type))
2669 postprocess_vlr_rel(file, type, ripple, tmpterm, out);
2670 }
2671
2672 vl_chk_free((char*)tmpterm);
2673
2674 return ripple;
2675}
2676
2677
2678char *write_op_vector_bop(FILE *file, short type, vl_term *in1, vl_term *in2, vl_term *out)
2679{
2680 int bpos;
2681 char term1[MAXSTRLEN], term2[MAXSTRLEN], outerm[MAXSTRLEN];
2682 char *ripple = NIL(char);
2683
2684
2685 if (in1->lo > in1->hi && in2->lo > in2->hi) {
2686
2687 if ((vector_width(in1->lo, in1->hi) <
2688 vector_width(out->lo, out->hi)) &&
2689 (vector_width(in2->lo, in2->hi) <
2690 vector_width(out->lo, out->hi))) {
2691 sprintf(outerm, "%s%s%d%s",
2692 out->name->name,
2693 SEP_LBITSELECT,
2694 out->lo,
2695 SEP_RBITSELECT);
2696 ripple = vl_write_bop(file, type,
2697 in1->name->name, in2->name->name,
2698 NIL(char),
2699 outerm, 0);
2700 sprintf(outerm, "%s%s%d%s",
2701 out->name->name,
2702 SEP_LBITSELECT,
2703 out->lo+1,
2704 SEP_RBITSELECT);
2705 vl_write_bit_connect(file, ripple, outerm, 0);
2706 } else {
2707 ripple = vl_write_bop(file, type,
2708 in1->name->name, in2->name->name,
2709 NIL(char),
2710 out->name->name, 0);
2711 }
2712 } else if (in1->lo > in1->hi && in2->lo <= in2->hi) {
2713
2714 sprintf(term2, "%s%s%d%s", in2->name->name,
2715 SEP_LBITSELECT, in2->lo, SEP_RBITSELECT);
2716 sprintf(outerm, "%s%s%d%s", out->name->name,
2717 SEP_LBITSELECT, out->lo, SEP_RBITSELECT);
2718 ripple = vl_write_bop(file, type,
2719 in1->name->name,term2,NIL(char),outerm, 0);
2720
2721 if (IS_VLR_LOG_OP(type)) {
2722 sprintf(term2, "%s", WRT_BLIF_GND(file));
2723 for (bpos=in1->lo+1; bpos<=in1->hi; bpos++) {
2724 sprintf(outerm, "%s%s%d%s",
2725 out->name->name,
2726 SEP_LBITSELECT,
2727 out->lo+(bpos-in2->lo),
2728 SEP_RBITSELECT);
2729 vl_write_bit_connect(file, term2, outerm, 0);
2730 }
2731 } else {
2732 for (bpos=in2->lo+1; bpos<=in2->hi; bpos++) {
2733 sprintf(term2, "%s%s%d%s", in2->name->name,
2734 SEP_LBITSELECT, bpos, SEP_RBITSELECT);
2735 sprintf(outerm, "%s%s%d%s",
2736 out->name->name,
2737 SEP_LBITSELECT,
2738 out->lo+(bpos-in2->lo),
2739 SEP_RBITSELECT);
2740 if (type == BplusExpr || type == BminusExpr) {
2741 ripple = vl_write_bop(file, type,
2742 term2,ripple,NIL(char),outerm,0);
2743 } else {
2744 vl_write_bit_connect(file, term2, outerm, 0);
2745 }
2746 }
2747 }
2748
2749 if ((vector_width(in1->lo, in1->hi) <
2750 vector_width(out->lo, out->hi)) &&
2751 (vector_width(in2->lo, in2->hi) <
2752 vector_width(out->lo, out->hi))) {
2753 sprintf(outerm, "%s%s%d%s",
2754 out->name->name,
2755 SEP_LBITSELECT,
2756 bpos,
2757 SEP_RBITSELECT);
2758 vl_write_bit_connect(file, ripple, outerm, 0);
2759 }
2760 } else if (in1->lo <= in1->hi && in2->lo > in2->hi) {
2761
2762 sprintf(term1, "%s%s%d%s", in1->name->name,
2763 SEP_LBITSELECT, in1->lo, SEP_RBITSELECT);
2764 sprintf(outerm, "%s%s%d%s", out->name->name,
2765 SEP_LBITSELECT, out->lo, SEP_RBITSELECT);
2766 ripple = vl_write_bop(file, type,
2767 term1,in2->name->name,NIL(char),outerm, 0);
2768
2769 if (IS_VLR_LOG_OP(type)) {
2770 sprintf(term1, "%s", WRT_BLIF_GND(file));
2771 for (bpos=in1->lo+1; bpos<=in1->hi; bpos++) {
2772 sprintf(outerm, "%s%s%d%s", out->name->name,
2773 SEP_LBITSELECT,
2774 out->lo+(bpos-in1->lo),
2775 SEP_RBITSELECT);
2776 vl_write_bit_connect(file, term1, outerm, 0);
2777 }
2778 } else {
2779 for (bpos=in1->lo+1; bpos<=in1->hi; bpos++) {
2780 sprintf(term1, "%s%s%d%s", in1->name->name,
2781 SEP_LBITSELECT, bpos, SEP_RBITSELECT);
2782 sprintf(outerm, "%s%s%d%s",
2783 out->name->name,
2784 SEP_LBITSELECT,
2785 out->lo+(bpos-in1->lo),
2786 SEP_RBITSELECT);
2787 if (type == BplusExpr || type == BminusExpr) {
2788 ripple = vl_write_bop(file, type,
2789 term1,ripple,NIL(char),outerm,0);
2790 } else {
2791 vl_write_bit_connect(file, term1, outerm, 0);
2792 }
2793 }
2794 }
2795
2796 if ((vector_width(in1->lo, in1->hi) <
2797 vector_width(out->lo, out->hi)) &&
2798 (vector_width(in2->lo, in2->hi) <
2799 vector_width(out->lo, out->hi))) {
2800 sprintf(outerm, "%s%s%d%s",
2801 out->name->name,
2802 SEP_LBITSELECT,
2803 bpos,
2804 SEP_RBITSELECT);
2805 vl_write_bit_connect(file, ripple, outerm, 0);
2806 }
2807 } else {
2808
2809 for (bpos=out->lo, ripple=NIL(char); bpos<=out->hi; bpos++) {
2810 if (RIPPLE_INTERFERE(type)) {
2811 if (bpos-out->lo <=
2812 MIN(in1->hi-in1->lo,in2->hi-in2->lo)) {
2813 sprintf(term1, "%s%s%d%s",
2814 in1->name->name,
2815 SEP_LBITSELECT, in1->lo+bpos, SEP_RBITSELECT);
2816 sprintf(term2, "%s%s%d%s",
2817 in2->name->name,
2818 SEP_LBITSELECT, in2->lo+bpos, SEP_RBITSELECT);
2819 sprintf(outerm, "%s%s%d%s",
2820 out->name->name,
2821 SEP_LBITSELECT, out->lo+bpos, SEP_RBITSELECT);
2822 ripple =
2823 vl_write_bop(file, type, term1, term2, ripple,
2824 outerm, (bpos==out->hi));
2825 } else if (bpos-out->lo ==
2826 MIN(in1->hi-in1->lo,in2->hi-in2->lo)+1) {
2827 sprintf(outerm, "%s%s%d%s",
2828 out->name->name,
2829 SEP_LBITSELECT, out->lo+bpos, SEP_RBITSELECT);
2830 fprintf(file, ".names %s %s\n1 1\n0 0\n",
2831 ripple, outerm);
2832 } else {
2833 sprintf(outerm, "%s%s%d%s",
2834 out->name->name,
2835 SEP_LBITSELECT, out->lo+bpos, SEP_RBITSELECT);
2836 fprintf(file, ".names %s\n0\n", outerm);
2837 }
2838 } else {
2839 if (bpos-out->lo <=
2840 MIN(in1->hi-in1->lo,in2->hi-in2->lo)) {
2841 sprintf(term1, "%s%s%d%s",
2842 in1->name->name,
2843 SEP_LBITSELECT, in1->lo+bpos, SEP_RBITSELECT);
2844 sprintf(term2, "%s%s%d%s",
2845 in2->name->name,
2846 SEP_LBITSELECT, in2->lo+bpos, SEP_RBITSELECT);
2847 sprintf(outerm, "%s%s%d%s",
2848 out->name->name,
2849 SEP_LBITSELECT, out->lo+bpos, SEP_RBITSELECT);
2850 ripple =
2851 vl_write_bop(file, type, term1, term2, ripple,
2852 outerm, (bpos==out->hi));
2853 } else {
2854 if (bpos-out->lo <= in1->hi-in1->lo) {
2855 sprintf(term1, "%s%s%d%s",
2856 in1->name->name,
2857 SEP_LBITSELECT, in1->lo+bpos,
2858 SEP_RBITSELECT);
2859 sprintf(outerm, "%s%s%d%s",
2860 out->name->name,
2861 SEP_LBITSELECT, out->lo+bpos,
2862 SEP_RBITSELECT);
2863 fprintf(file, ".names %s %s\n0 0\n1 1\n",
2864 term1, outerm);
2865 } else if (bpos-out->lo <= in2->hi-in2->lo) {
2866 sprintf(term2, "%s%s%d%s",
2867 in2->name->name,
2868 SEP_LBITSELECT, in2->lo+bpos,
2869 SEP_RBITSELECT);
2870 sprintf(outerm, "%s%s%d%s",
2871 out->name->name,
2872 SEP_LBITSELECT, out->lo+bpos,
2873 SEP_RBITSELECT);
2874 fprintf(file, ".names %s %s\n0 0\n1 1\n",
2875 term2, outerm);
2876 } else {
2877 sprintf(outerm, "%s%s%d%s",
2878 out->name->name,
2879 SEP_LBITSELECT, out->lo+bpos,
2880 SEP_RBITSELECT);
2881 fprintf(file, ".names %s\n0\n", outerm);
2882 }
2883 }
2884 }
2885 }
2886 }
2887
2888 return ripple;
2889}
2890
2891
2892static void postprocess_vlr_rel(FILE *file, short type, char *carry,
2893 vl_term *results, vl_term *out)
2894{
2895 char *tmp_termname;
2896 vl_term *zero_term;
2897
2898 switch(type) {
2899 case BltExpr:
2900
2901 zero_term = new_term(NIL(vl_range), 0, -1);
2902 if (results->hi < results->lo)
2903 vl_write_bit_connect(file,
2904 results->name->name, zero_term->name->name, 0);
2905 else
2906 vl_write_vector_bop(file, UorExpr,
2907 results, NIL(vl_term), zero_term);
2908 vl_write_bop(file, BandExpr, carry, zero_term->name->name, NIL(char),
2909 out->name->name, 1);
2910 break;
2911 case BgtExpr:
2912
2913 zero_term = new_term(NIL(vl_range), 0, -1);
2914 if (results->hi < results->lo)
2915 vl_write_bit_connect(file,
2916 results->name->name, zero_term->name->name, 1);
2917 else
2918 vl_write_vector_bop(file, UnorExpr,
2919 results, NIL(vl_term), zero_term);
2920 tmp_termname = new_termname();
2921 vl_write_bop(file, BorExpr, carry, zero_term->name->name, NIL(char),
2922 tmp_termname, 1);
2923 vl_write_bit_connect(file, tmp_termname, out->name->name, 1);
2924 break;
2925 case BleExpr:
2926
2927 zero_term = new_term(NIL(vl_range), 0, -1);
2928 if (results->hi < results->lo)
2929 vl_write_bit_connect(file,
2930 results->name->name, zero_term->name->name, 1);
2931 else
2932 vl_write_vector_bop(file, UnorExpr,
2933 results, NIL(vl_term), zero_term);
2934 vl_write_bop(file, BorExpr, carry, zero_term->name->name, NIL(char),
2935 out->name->name, 1);
2936 break;
2937 case BgeExpr:
2938
2939 zero_term = new_term(NIL(vl_range), 0, -1);
2940 if (results->hi < results->lo)
2941 vl_write_bit_connect(file,
2942 results->name->name, zero_term->name->name, 0);
2943 else
2944 vl_write_vector_bop(file, UorExpr,
2945 results, NIL(vl_term), zero_term);
2946 tmp_termname = new_termname();
2947 vl_write_bop(file, BandExpr, carry, zero_term->name->name, NIL(char),
2948 tmp_termname, 1);
2949 vl_write_bit_connect(file, tmp_termname, out->name->name, 1);
2950 break;
2951 }
2952}
2953
2954
2955vl_port *search_match_port(char *name, lsList ports)
2956{
2957 lsGen gen;
2958 lsHandle handle;
2959 vl_port *retval=NIL(vl_port), *port;
2960 lsHandle port_handle;
2961 vl_id_range *id;
2962
2963 gen = lsStart(ports);
2964 while (lsNext(gen, (lsGeneric*)&port, &handle)!=LS_NOMORE) {
2965 lsFirstItem(port->port_exp, (lsGeneric*)&id, &port_handle);
2966 if (!strcmp(name, id->name)) {
2967 retval = port;
2968 break;
2969 }
2970 }
2971 lsFinish(gen);
2972
2973 return retval;
2974}
2975
2976
2977vl_port_connect *search_inst_port(char *name, lsList ports)
2978{
2979 lsGen gen;
2980 lsHandle handle;
2981 vl_port_connect *retval=NIL(vl_port_connect), *port;
2982
2983 gen = lsStart(ports);
2984 while (lsNext(gen, (lsGeneric*)&port, &handle)!=LS_NOMORE) {
2985 if (!strcmp(name, port->id->name)) {
2986 retval = port;
2987 break;
2988 }
2989 }
2990 lsFinish(gen);
2991
2992 return retval;
2993}
2994
2995
2996
2997char *vl_translate_prim_symbol(unsigned char sym)
2998{
2999 char buf[MAXSTRLEN];
3000
3001 switch(sym) {
3002 case PrimNone: return("");
3003 case Prim0: return("0");
3004 case Prim1: return("1");
3005 case PrimX: return("-");
3006 case PrimQ: return("-");
3007 case PrimB: return("-");
3008 case PrimM: return("-");
3009 case PrimR: return("0 1");
3010 case PrimF: return("1 0");
3011 case PrimS: return("- -");
3012 case PrimBB: return("- -");
3013 case PrimQ0: return("- 0");
3014 case PrimQ1: return("- 1");
3015 case PrimQB: return("- -");
3016 case Prim0X: return("0 -");
3017 case Prim1X: return("1 -");
3018 case PrimX0: return("- 0");
3019 case PrimX1: return("- 1");
3020 case PrimXB: return("- -");
3021 case PrimBX: return("- -");
3022 case PrimP: sprintf(buf, "P");
3023 case PrimN: sprintf(buf, "N");
3024 strcat(buf, " :: can not be handled yet");
3025 Translate_Warning(buf);
3026 return("");
3027 default: {
3028 char msg[MAXSTRLEN];
3029 sprintf(msg, "Unexpected primitive symbol type %d", sym);
3030 internal_error(msg); return(NULL);
3031 }
3032 }
3033}
3034
3035vl_term *sensitive_control(FILE *file, st_table *sensitive_list)
3036{
3037 vl_term *retval;
3038 st_generator *gen;
3039 char *key, *dummy;
3040 vl_id_range *id_sym;
3041 int i, j;
3042 int lo, hi;
3043 int ithItem;
3044
3045 retval = new_term(NIL(vl_range), 0, -1);
3046 fprintf(file, ".names ");
3047 ithItem = 0;
3048 gen = st_init_gen(sensitive_list);
3049 while (st_gen(gen, &key, &dummy)) {
3050 if (!st_lookup(vl_currentModule->sig_st, key, (char**)&id_sym)) {
3051 char buf[MAXSTRLEN];
3052
3053 sprintf(buf, "sensitive var:%s is not defined in module %s",
3054 key, vl_currentModule->name->name);
3055 semantic_error(buf);
3056 }
3057
3058 get_hilo(id_sym, &hi, &lo);
3059 if (lo < hi || id_sym->range) {
3060 char buf[MAXSTRLEN];
3061
3062 sprintf(buf, "%s is vector/array while as sensitive var in %s",
3063 key, vl_currentModule->name->name);
3064 semantic_error(buf);
3065 }
3066
3067 fprintf(file, "%s ", key);
3068 }
3069 st_free_gen(gen);
3070 fprintf(file, "%s\n", retval->name->name);
3071
3072 for (i=0; i<st_count(sensitive_list); i++) {
3073 for (j=0; j<st_count(sensitive_list); j++)
3074 fprintf(file, "%c ", (i==j)?'1':'-');
3075 fprintf(file, "1\n");
3076 }
3077 for (i=0; i<st_count(sensitive_list); i++)
3078 fprintf(file, "0 ");
3079 fprintf(file, "0\n");
3080
3081 return retval;
3082}
3083
3084
3085void patch_unaffected_term(FILE *file, vl_id_range *id_sym,
3086 vl_term *orig_term,
3087 vl_term *out_term)
3088{
3089 int i;
3090 int set_floating = 0;
3091
3092 if (orig_term->lo == out_term->lo && orig_term->hi == out_term->hi)
3093 return;
3094 if (orig_term->lo >= orig_term->hi && out_term->lo >= out_term->hi)
3095 return;
3096
3097 if (vl_currentFunction)
3098 if (!strcmp(id_sym->name, orig_term->name->name))
3099 set_floating = 1;
3100
3101 if (set_floating) {
3102 for (i=orig_term->lo; i<out_term->lo; i++) {
3103 fprintf(file, ".names %s%s%d%s\n-\n",
3104 out_term->name->name,
3105 SEP_LBITSELECT, i, SEP_RBITSELECT);
3106 }
3107
3108 for (i=out_term->hi+1; i<=orig_term->hi; i++) {
3109 fprintf(file, ".names %s%s%d%s\n-\n",
3110 out_term->name->name,
3111 SEP_LBITSELECT, i, SEP_RBITSELECT);
3112 }
3113 } else {
3114
3115 for (i=orig_term->lo; i<out_term->lo; i++) {
3116 if (set_notation) {
3117 fprintf(file,".names %s%s%d%s %s%s%d%s\n- %s%s%s%d%s\n",
3118 orig_term->name->name,
3119 SEP_LBITSELECT, i, SEP_RBITSELECT,
3120 out_term->name->name,
3121 SEP_LBITSELECT, i, SEP_RBITSELECT,
3122 HSIS_EQUAL,
3123 orig_term->name->name,
3124 SEP_LBITSELECT, i, SEP_RBITSELECT);
3125 } else {
3126 fprintf(file, ".names %s%s%d%s %s%s%d%s\n1 1\n0 0\n",
3127 orig_term->name->name,
3128 SEP_LBITSELECT, i, SEP_RBITSELECT,
3129 out_term->name->name,
3130 SEP_LBITSELECT, i, SEP_RBITSELECT);
3131 }
3132 }
3133
3134 for (i=out_term->hi+1; i<=orig_term->hi; i++) {
3135 if (set_notation) {
3136 fprintf(file,".names %s%s%d%s %s%s%d%s\n- %s%s%s%d%s\n",
3137 orig_term->name->name,
3138 SEP_LBITSELECT, i, SEP_RBITSELECT,
3139 out_term->name->name,
3140 SEP_LBITSELECT, i, SEP_RBITSELECT,
3141 HSIS_EQUAL,
3142 orig_term->name->name,
3143 SEP_LBITSELECT, i, SEP_RBITSELECT);
3144 } else {
3145 fprintf(file, ".names %s%s%d%s %s%s%d%s\n1 1\n0 0\n",
3146 orig_term->name->name,
3147 SEP_LBITSELECT, i, SEP_RBITSELECT,
3148 out_term->name->name,
3149 SEP_LBITSELECT, i, SEP_RBITSELECT);
3150 }
3151 }
3152 }
3153
3154 out_term->lo = orig_term->lo;
3155 out_term->hi = orig_term->hi;
3156}
3157
3158int need_edge_detector(lsList table_entries, int ith_port)
3159{
3160 int retval=0;
3161 lsGen gen;
3162 lsHandle handle;
3163 vl_prim_entry *e;
3164
3165 for (gen=lsStart(table_entries);
3166 lsNext(gen, (lsGeneric*)&e, &handle) != LS_NOMORE; ) {
3167 register unsigned char sym;
3168 sym = e->inputs[ith_port];
3169 if (IS_TRANSITION(sym)) {
3170 retval = 1;
3171 break;
3172 }
3173 }
3174 (void)lsFinish(gen);
3175
3176 return retval;
3177}
3178
3179
3180void dump_debug_information(FILE *file, vl_id_range *id_var,
3181 vl_term *current_term, int lineno,
3182 lsList ctrl_list, char *ctrl_syndrome)
3183{
3184 lsGen gen;
3185 lsHandle handle;
3186 vl_term *ctrl;
3187 int i;
3188 char *Comment;
3189
3190 Comment = HSIS_COMMENT;
3191 if (debug_mode) {
3192 if (lineno >= 0) {
3193 fprintf(file, "%s%sl %d%s%s\n",
3194 Comment, Comment,
3195 lineno,
3196 Comment, Comment);
3197 }
3198 fprintf(file, "%s%sv %s.%s%s%s\n",
3199 Comment, Comment,
3200 vl_currentModule->name->name, id_var->name,
3201 Comment, Comment);
3202 for (i=0, gen=lsStart(ctrl_list);
3203 lsNext(gen, (lsGeneric*)&ctrl, &handle)!=LS_NOMORE; i++) {
3204 if (ctrl_syndrome[i] == '-') continue;
3205 if (ctrl_syndrome[i] == '1')
3206 fprintf(file, "%s%sg %s%s%s\n",
3207 Comment, Comment,
3208 ctrl->name->name,
3209 Comment, Comment);
3210 if (ctrl_syndrome[i] == '0')
3211 fprintf(file, "%s%sG %s%s%s\n",
3212 Comment, Comment,
3213 ctrl->name->name,
3214 Comment, Comment);
3215 }
3216 lsFinish(gen);
3217 }
3218
3219 current_term = current_term;
3220}
3221
3222
3223int vector_width(int lo, int hi)
3224{
3225 if (lo > hi) return 1;
3226 return hi - lo + 1;
3227}
3228
3229
3230void expand_term(FILE *file, vl_term *in, vl_term *out)
3231{
3232 int i;
3233 char in_buf[MAXSTRLEN], out_buf[MAXSTRLEN];
3234 lsList args;
3235
3236 assert(vector_width(in->lo, in->hi) <= vector_width(out->lo, out->hi));
3237
3238 if (vector_width(in->lo, in->hi) == vector_width(out->lo, out->hi)) {
3239 vl_write_bin_connect(file, in, out, 0);
3240 } else {
3241 char buf[MAXSTRLEN];
3242 args = lsCreate();
3243 sprintf(buf, "%d", in->hi-in->lo+1);
3244 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
3245 sprintf(buf, "%d", out->hi-out->lo+1);
3246 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
3247
3248 for (i=out->lo; i<=out->hi; i++) {
3249 if (in->lo > in->hi) {
3250 sprintf(out_buf, "%s%s%d%s", out->name->name,
3251 SEP_LBITSELECT, i, SEP_RBITSELECT);
3252 sprintf(in_buf, "%s",
3253 (i==out->lo)?in->name->name:WRT_BLIF_GND(file));
3254 if (set_notation) {
3255 fprintf(file, ".names %s %s\n- =%s\n",
3256 in_buf, out_buf, in_buf);
3257 } else {
3258 vl_write_bit_connect(file, in_buf, out_buf, 0);
3259 }
3260 } else {
3261 sprintf(out_buf, "%s%s%d%s", out->name->name,
3262 SEP_LBITSELECT, i, SEP_RBITSELECT);
3263 if (i-out->lo <= in->hi-in->lo)
3264 sprintf(in_buf, "%s%s%d%s", in->name->name,
3265 SEP_LBITSELECT, i+in->lo-out->lo, SEP_RBITSELECT);
3266 else
3267 sprintf(in_buf, "%s", WRT_BLIF_GND(file));
3268 if (set_notation) {
3269 fprintf(file, ".names %s %s\n- =%s\n",
3270 in_buf, out_buf, in_buf);
3271 } else {
3272 vl_write_bit_connect(file, in_buf, out_buf, 0);
3273 }
3274 }
3275 }
3276
3277 lsDestroy(args, vl_chk_free);
3278 }
3279}
3280
3281void shrink_term(FILE *file, vl_term *in, vl_term *out)
3282{
3283 int i;
3284 char in_buf[MAXSTRLEN], out_buf[MAXSTRLEN];
3285 lsList args;
3286
3287 assert(vector_width(in->lo, in->hi) >= vector_width(out->lo, out->hi));
3288
3289 if (vector_width(in->lo, in->hi) == vector_width(out->lo, out->hi)) {
3290 vl_write_bin_connect(file, in, out, 0);
3291 } else {
3292 char buf[MAXSTRLEN];
3293 args = lsCreate();
3294 sprintf(buf, "%d", in->hi-in->lo+1);
3295 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
3296 sprintf(buf, "%d", out->hi-out->lo+1);
3297 lsNewEnd(args, (lsGeneric)vlStrdup(buf), 0);
3298
3299 for (i=in->lo; i<=in->hi; i++) {
3300 if (out->lo > out->hi) {
3301 if (i == in->lo) {
3302 sprintf(out_buf, "%s", out->name->name);
3303 sprintf(in_buf, "%s%s%d%s", in->name->name,
3304 SEP_LARRAY, i, SEP_RARRAY);
3305 if (set_notation) {
3306 fprintf(file, ".names %s %s\n- =%s\n",
3307 in_buf, out_buf, in_buf);
3308 } else {
3309 vl_write_bit_connect(file, in_buf, out_buf, 0);
3310 }
3311 }
3312 } else {
3313 if (i-in->lo <= out->hi-out->lo) {
3314 sprintf(out_buf, "%s%s%d%s", out->name->name,
3315 SEP_LBITSELECT,i+in->lo-out->lo,SEP_RBITSELECT);
3316 sprintf(in_buf, "%s%s%d%s", in->name->name,
3317 SEP_LBITSELECT, i, SEP_RBITSELECT);
3318 if (set_notation) {
3319 fprintf(file, ".names %s %s\n- =%s\n",
3320 in_buf, out_buf, in_buf);
3321 } else {
3322 vl_write_bit_connect(file, in_buf, out_buf, 0);
3323 }
3324 }
3325 }
3326 }
3327
3328 lsDestroy(args, vl_chk_free);
3329 }
3330}
3331
3332
3333void subrange_term(FILE *file, vl_term *in, vl_term *out)
3334{
3335}
3336
3337
3338vl_term *vl_write_nond_wire(FILE *file, vl_term *ctrl_term, lsList nond_list, vl_term *reference_term)
3339{
3340 vl_term *retval;
3341 vl_term *nond_term;
3342 vl_expr *nond_expr;
3343 lsHandle handle;
3344 lsGen gen;
3345 lsList domain;
3346 lsGen enum_gen;
3347 vl_enumerator *enum_elt;
3348 lsHandle enum_handle;
3349 lsList nond_consts, nond_terms;
3350 int num_terms, num_consts;
3351 int i, j, k, l;
3352
3353 retval = typed_new_term(reference_term->term_type, NIL(vl_range),
3354 reference_term->lo, reference_term->hi);
3355 if (vis_nond && rst_ckt) {
3356 char *cp;
3357 cp = (char*)chk_malloc(strlen(reference_term->name->name) +
3358 strlen(retval->name->name) +
3359 2*strlen(SEP_GATEPIN)+strlen(PIN_INITIAL)+1);
3360 sprintf(cp, "%s%s%s%s%s", reference_term->name->name, SEP_GATEPIN,
3361 PIN_INITIAL, SEP_GATEPIN, retval->name->name);
3362 retval->name->name = cp;
3363 }
3364 retval->flag = reference_term->flag;
3365 if (!vis_nond || rst_ckt)
3366 write_var_decl(file, retval);
3367 nond_consts = lsCreate();
3368 nond_terms = lsCreate();
3369 for (gen=lsStart(nond_list), num_terms=0, num_consts=0;
3370 lsNext(gen, (lsGeneric*)&nond_expr, &handle) != LS_NOMORE; ) {
3371 if (ISVLCONST(nond_expr->type)) {
3372
3373 num_consts++;
3374 lsNewEnd(nond_consts, (lsGeneric)nond_expr->u.intval, 0);
3375 } else {
3376
3377 num_terms++;
3378 lsNewEnd(nond_terms, (lsGeneric)nond_expr->term, 0);
3379 }
3380 }
3381 (void)lsFinish(gen);
3382
3383
3384 fprintf(file, ".names ");
3385 for (gen=lsStart(nond_terms);
3386 lsNext(gen, (lsGeneric*)&nond_term, &handle) != LS_NOMORE; ) {
3387 if (reference_term->lo > reference_term->hi ||
3388 reference_term->flag & MVar)
3389 if (nond_term->lo > nond_term->hi || reference_term->flag & MVar)
3390 fprintf(file, "%s ", nond_term->name->name);
3391 else
3392 fprintf(file, "%s%s%d%s ", nond_term->name->name,
3393 SEP_LBITSELECT, nond_term->lo, SEP_RBITSELECT);
3394 else {
3395 for (l=reference_term->lo; l<=reference_term->hi; l++)
3396 fprintf(file, "%s%s%d%s ", nond_term->name->name,
3397 SEP_LBITSELECT, l, SEP_RBITSELECT);
3398 }
3399 }
3400 (void)lsFinish(gen);
3401 if (reference_term->lo > reference_term->hi ||
3402 reference_term->flag & MVar)
3403 fprintf(file, "%s\n",
3404 nond_output(retval->name->name, reference_term->name->name));
3405 else {
3406 fprintf(file, "%s ", HSIS_ARROW);
3407 for (l=reference_term->lo; l<=reference_term->hi; l++)
3408 fprintf(file, "%s%s%d%s ",
3409 nond_output(retval->name->name,reference_term->name->name),
3410 SEP_LBITSELECT, l, SEP_RBITSELECT);
3411 fprintf(file, "\n");
3412 }
3413
3414
3415
3416 for (gen=lsStart(nond_consts);
3417 lsNext(gen,(lsGeneric*)&k,&handle) != LS_NOMORE; ) {
3418 if (reference_term->lo > reference_term->hi ||
3419 reference_term->flag & MVar)
3420 for (j=0; j<num_terms; j++) fprintf(file, "- ");
3421 else
3422 for (l=reference_term->lo; l<=reference_term->hi; l++)
3423 for (j=0; j<num_terms; j++) fprintf(file, "- ");
3424
3425 if (reference_term->flag & MVar) {
3426 domain = reference_term->term_type->specifier->u.enum_type->domain_list;
3427 for (enum_gen = lsStart(domain), i=0;
3428 lsNext(enum_gen, (lsGeneric*)&enum_elt, &enum_handle) !=
3429 LS_NOMORE; i++)
3430 if (k == i) {
3431 fprintf(file, "%s ", enum_elt->name);
3432
3433 }
3434 (void)lsFinish(enum_gen);
3435 } else {
3436 if (reference_term->lo > reference_term->hi) {
3437
3438 fprintf(file, "%d", k);
3439 } else {
3440
3441 for (l=reference_term->lo, j=k; l<=reference_term->hi;
3442 l++, j >>= 1)
3443 fprintf(file, "%d ", j & 0x1);
3444 }
3445 }
3446 fprintf(file, "\n");
3447 }
3448 (void)lsFinish(gen);
3449
3450 for (gen=lsStart(nond_terms), j=0;
3451 lsNext(gen,(lsGeneric*)&nond_term,&handle) != LS_NOMORE; j++) {
3452 if (set_notation || reference_term->lo <= reference_term->hi) {
3453
3454
3455 for (i=0; i<num_terms; i++)
3456 if (reference_term->lo > reference_term->hi ||
3457 reference_term->flag & MVar)
3458 fprintf(file, "- ");
3459 else {
3460 for (l=reference_term->lo; l<=reference_term->hi; l++)
3461 fprintf(file, "- ");
3462 }
3463
3464 if (reference_term->lo > reference_term->hi ||
3465 reference_term->flag & MVar) {
3466 if (nond_term->lo > nond_term->hi)
3467 fprintf(file, "%s%s\n", HSIS_EQUAL, nond_term->name->name);
3468 else
3469 fprintf(file, "%s%s%s%d%s\n", HSIS_EQUAL,
3470 nond_term->name->name,
3471 SEP_LBITSELECT, nond_term->lo, SEP_RBITSELECT);
3472 } else {
3473 for (l=reference_term->lo; l<=reference_term->hi; l++)
3474 fprintf(file, "%s%s%s%d%s ", HSIS_EQUAL,
3475 nond_term->name->name,
3476 SEP_LBITSELECT,
3477 nond_term->lo-reference_term->lo+l,
3478 SEP_RBITSELECT);
3479 fprintf(file, "\n");
3480 }
3481
3482 } else {
3483
3484
3485 if (reference_term->flag & MVar) {
3486
3487 domain = reference_term->term_type->specifier->u.enum_type->domain_list;
3488 for (enum_gen=lsStart(domain);
3489 lsNext(enum_gen, (lsGeneric*)&enum_elt,
3490 &enum_handle) !=
3491 LS_NOMORE; ) {
3492 for (i=0; i<j; i++) fprintf(file, "- ");
3493 fprintf(file, "%s ", enum_elt->name);
3494 for (i++; i<num_terms; i++) fprintf(file, "- ");
3495 fprintf(file, "%s\n", enum_elt->name);
3496 }
3497 (void)lsFinish(enum_gen);
3498 } else {
3499
3500 }
3501
3502 }
3503 }
3504 (void)lsFinish(gen);
3505
3506 lsDestroy(nond_consts, 0);
3507 lsDestroy(nond_terms, 0);
3508 return retval;
3509}
3510
3511
3512void vl_get_minmax_delay(vl_delay *delay, vl_expr **min_delay, vl_expr **max_delay)
3513{
3514 lsGen gen;
3515 lsHandle handle;
3516 vl_expr *delayi;
3517 int i;
3518
3519 if (!(delay->delay3 && !delay->delay2)) return;
3520 assert(lsLength((lsList)delay->delay1) == 2);
3521
3522 *min_delay = *max_delay = NIL(vl_expr);
3523 for (gen=lsStart((lsList)delay->delay1), i=1;
3524 lsNext(gen, (lsGeneric*)&delayi, &handle) != LS_NOMORE; i++) {
3525 if (i==1) *min_delay = delayi;
3526 else if (i==2) *max_delay = delayi;
3527 else break;
3528 }
3529 lsFinish(gen);
3530}
3531
3532
3533static int isTautology(lsList syndrome_expr_list)
3534{
3535 lsGen gen;
3536 lsHandle handle;
3537 syndrome_expr *se;
3538 unsigned int i;
3539 int unguarded = 0;
3540
3541 for (gen = lsStart(syndrome_expr_list);
3542 lsNext(gen, (lsGeneric*)&se, &handle) != LS_NOMORE; ) {
3543 unguarded = 1;
3544 for (i=0; i<strlen(se->syndrome); i++) {
3545 if ((se->syndrome)[i] != '-') {
3546 unguarded = 0;
3547 break;
3548 }
3549 }
3550 if (unguarded) break;
3551 }
3552 lsFinish(gen);
3553
3554 return unguarded;
3555}
3556
3557
3558
3559void write_case_tag_const(FILE *file, vl_term *selector,
3560 vl_expr *tag_expr, st_table *vars)
3561{
3562
3563 if (!tag_expr->term) {
3564 if (tag_expr->type == IntExpr || tag_expr->type == BitExpr ||
3565 evaluable_expr(tag_expr)) {
3566 tag_expr->term = typed_new_term(selector->name->id_type,
3567 NIL(vl_range),
3568 selector->lo, selector->hi);
3569 write_var_decl(file, tag_expr->term);
3570 write_int_connect(file, vl_eval_expr(tag_expr), tag_expr->term);
3571 } else if (tag_expr->type != IDExpr && tag_expr->type != ConcatExpr) {
3572 vl_write_expr(file, tag_expr, vars);
3573 } else if (tag_expr->type == IDExpr) {
3574 vl_id_range *sel_id_sym;
3575 vl_enumerator *enum_elt;
3576
3577 if (!st_lookup(vl_currentModule->sig_st, selector->name->name,
3578 (char**)&sel_id_sym)) {
3579 sel_id_sym = vl_copy_id_range(selector->name);
3580 if (selector->term_type)
3581 sel_id_sym->id_type = selector->term_type;
3582 if (!strstr(selector->name->name, SEP_GATEPIN)) {
3583 st_insert(vl_currentModule->sig_st,
3584 vlStrdup(selector->name->name),
3585 (char*)sel_id_sym);
3586 }
3587 }
3588 if (!sel_id_sym->id_type) {
3589 vl_write_expr(file, tag_expr, vars);
3590 return;
3591 }
3592
3593 if (st_lookup(sel_id_sym->id_type->specifier->
3594 u.enum_type->domain_st,
3595 tag_expr->u.name->name,
3596 (char**)&enum_elt)) {
3597
3598 tag_expr->term = typed_new_term(selector->term_type,
3599 NIL(vl_range),
3600 selector->lo, selector->hi);
3601 tag_expr->term->flag = selector->flag;
3602 write_var_decl(file, tag_expr->term);
3603 tag_expr->type = IntExpr;
3604 tag_expr->u.intval = enum_elt->val;
3605 vl_write_const(file, tag_expr, tag_expr->term);
3606 } else {
3607 char buf[MAXSTRLEN];
3608
3609 sprintf(buf,"'%s':var '%s' should not be used as CASE-tag",
3610 vl_currentModule->name->name, tag_expr->u.name->name);
3611 semantic_error(buf);
3612 }
3613 } else if (tag_expr->type == ConcatExpr) {
3614 vl_write_expr(file, tag_expr, vars);
3615 }
3616 }
3617}
3618
3619
3620void width_unknown()
3621{
3622 char buf[MAXSTRLEN];
3623
3624 sprintf(buf, "%s:you are giving me concatenation of something I can't determined the width", vl_currentModule->name->name);
3625 yylineno = -1;
3626 compile_error(buf);
3627}
3628
3629
3630vl_term *concate_assigns(array_t *assign_array)
3631{
3632 vl_term *retval;
3633 vl_term *ith_term;
3634 int n_bits;
3635 int i;
3636
3637 n_bits=0;
3638 for (i=0; i<array_n(assign_array); i++) {
3639 ith_term = array_fetch(vl_term*, assign_array, i);
3640 if (ith_term->flag & MVar)
3641 compile_error("boomer:concating symbolic variables");
3642
3643 if (ith_term->hi < ith_term->lo) n_bits++;
3644 else n_bits += (ith_term->hi - ith_term->lo + 1);
3645 }
3646
3647 retval = new_term(NIL(vl_range), 0, n_bits-1);
3648
3649 return retval;
3650}
3651
3652
3653void connect_concat(FILE *file, vl_term *assign_term, array_t *lhs_array)
3654{
3655 int i;
3656 int old_lo, old_hi;
3657 int n_bits, bit_pos;
3658 vl_term *lhs_term;
3659
3660 old_lo = assign_term->lo;
3661 old_hi = assign_term->hi;
3662 for (i=array_n(lhs_array)-1, bit_pos = assign_term->lo; i>=0; i--) {
3663 lhs_term = array_fetch(vl_term*, lhs_array, i);
3664 if (lhs_term->hi < lhs_term->lo) n_bits = 1;
3665 else n_bits = lhs_term->hi - lhs_term->lo + 1;
3666 assign_term->lo = bit_pos;
3667 assign_term->hi = assign_term->lo + n_bits - 1;
3668 vl_write_bin_connect(file, assign_term, lhs_term, 0);
3669 bit_pos += n_bits;
3670 }
3671 assign_term->lo = old_lo;
3672 assign_term->hi = old_hi;
3673}
3674
3675
3676fg_graph_info *get_assoc_lc_name(char *loc, char *lc_name)
3677{
3678 int location;
3679 lsGen ggen;
3680 lsHandle ghandle;
3681 graph_t *graph;
3682 fg_graph_info *retval=NIL(fg_graph_info);
3683
3684 if (!loc) return retval;
3685 if (!lc_name) return retval;
3686
3687 location = atoi(strstr(loc, FG_LLOC)+strlen(FG_LLOC));
3688 for(ggen=lsStart(vl_currentModule->flow_graphs);
3689 lsNext(ggen, (lsGeneric*)&graph, &ghandle) != LS_NOMORE; ) {
3690 if (location >= ((fg_graph_info*)graph->user_data)->pause_lo &&
3691 location < ((fg_graph_info*)graph->user_data)->pause_hi) {
3692 sprintf(lc_name, "%s%06x",
3693 FG_LC_PS, ((fg_graph_info*)graph->user_data)->fg_id);
3694 retval = (fg_graph_info*)(graph->user_data);
3695 break;
3696 }
3697 }
3698 lsFinish(ggen);
3699
3700 return retval;
3701}
3702
3703
3704void write_out_port(FILE *file, vl_id_range *id_sym,
3705 int m_hi, int m_lo, vl_expr *inst_expr,
3706 st_table *auxSigST)
3707{
3708 if (inst_expr->type == IDExpr) {
3709 st_insert(vl_currentModule->sig_st, inst_expr->u.name->name,
3710 (char*)vl_create_id_range(inst_expr->u.name->name,
3711 NIL(vl_range)));
3712 }
3713 inst_expr->term = new_term(NIL(vl_range), m_lo, m_hi);
3714}
3715
3716
3717void vl_write_outport_connect(FILE *file, vl_expr *inst_expr)
3718{
3719 int rep=1;
3720 int i;
3721 int bitWidth;
3722 lsGen gen;
3723 lsHandle handle;
3724 vl_term *term_out;
3725 vl_expr *e;
3726
3727 if (inst_expr->type != ConcatExpr) return;
3728
3729 if (inst_expr->u.exprs.e2) {
3730 rep = vl_eval_expr(inst_expr->u.exprs.e2);
3731 }
3732
3733 term_out = inst_expr->term;
3734 assert(term_out);
3735 term_out->hi = term_out->lo - 1;
3736 for (i=0; i<rep; i++) {
3737 for (gen=lsStart((lsList)(inst_expr->u.exprs.e1));
3738 lsNext(gen, (lsGeneric*)&e, &handle) != LS_NOMORE; ) {
3739 vl_write_expr(file, e, NIL(st_table));
3740 assert(e->term);
3741 bitWidth = (e->term->hi - e->term->lo+1);
3742 bitWidth = (bitWidth>0) ? bitWidth : 1;
3743 term_out->lo = term_out->hi + 1;
3744 term_out->hi = term_out->lo + bitWidth - 1;
3745 vl_write_bin_connect(file, term_out, e->term, 0);
3746 }
3747 lsFinish(gen);
3748 }
3749 term_out->lo = 0;
3750}
3751
3752
3753static int evaluable_expr(vl_expr *expr)
3754{
3755 int old_silent_err;
3756 int retval;
3757
3758 old_silent_err = silent_err;
3759 silent_err = 1;
3760 Vlerrno = 0;
3761
3762 vl_eval_expr(expr);
3763
3764 retval = Vlerrno;
3765 silent_err = old_silent_err;
3766 return !retval;
3767}
3768
3769
3770void write_const_param(FILE *file, vl_expr *expr, vl_id_range *ival)
3771{
3772 int l, r;
3773 vl_expr *ce;
3774
3775 if (expr->type == IDExpr) {
3776
3777 l = 31; r = 0;
3778 } else {
3779 l = vl_eval_expr(expr->u.idrng->range->left);
3780 if (expr->u.idrng->range->right)
3781 r = vl_eval_expr(expr->u.idrng->range->right);
3782 else
3783 r = l;
3784 }
3785
3786 expr->term = new_term(NIL(vl_range), 0, (l>r)?l:r);
3787 write_var_decl(file, expr->term);
3788
3789 ce = vl_create_expr(IntExpr, (int)ival->mpg_master_exp, (double)0.0,
3790 NIL(void), NIL(void), NIL(void));
3791 vl_write_const(file, ce, expr->term);
3792 vl_chk_free((char*)ce);
3793
3794 expr->term->hi = (l>r)?l:r;
3795 expr->term->lo = (l>r)?r:l;
3796}
3797
3798
3799void chkUndefPorts(vl_expr *expr, st_table *sig_st)
3800{
3801 char *dummy;
3802
3803 if (implicitDeclare)
3804 if (sig_st)
3805 if (expr->type == IDExpr)
3806 if (!st_lookup(vl_currentModule->sig_st, expr->u.name->name,
3807 &dummy)) {
3808 st_insert(sig_st, expr->u.name->name, 0);
3809 }
3810}
3811
3812
3813void record_pseudo_cntxt(FILE *file, int fg_id, st_table *pre_cond,
3814 char *ctrl_syndrome,
3815 char *rst_ctrl_syndrome, st_table *vars)
3816{
3817 vl_id_range *cntxt_idsym;
3818 vl_term *out_term, *new_out;
3819
3820 cntxt_idsym = vl_create_id_range(cntxt_event, NIL(vl_range));
3821 cntxt_idsym->flags |= EventVar;
3822 st_insert(vl_currentModule->sig_st, cntxt_idsym->name, (char*)cntxt_idsym);
3823
3824 out_term = new_term(NIL(vl_range), 0, -1);
3825 write_int_connect(file, 1, out_term);
3826 new_out = vl_copy_term(out_term);
3827
3828 if (!rst_ckt) {
3829 lsNewEnd(cntxt_idsym->syndrome_expr_list,
3830 (lsGeneric)create_syndrome_expr(vlStrdup(ctrl_syndrome),
3831 new_out, pre_cond, fg_id),
3832 0);
3833 } else {
3834 lsNewEnd(cntxt_idsym->rst_syndrome_expr_list,
3835 (lsGeneric)create_syndrome_expr(vlStrdup(rst_ctrl_syndrome),
3836 new_out, pre_cond, fg_id),
3837 0);
3838 }
3839
3840
3841
3842
3843 st_insert(vars, cntxt_idsym->name,
3844 (char*)create_var_info(vl_copy_id_range(cntxt_idsym), out_term));
3845
3846 cntxt_event = NIL(char);
3847}
3848
3849
3850char *descape(char *str, char ch1, char ch2)
3851{
3852 static char retval[MAXSTRLEN];
3853
3854 strcpy(retval, str);
3855 return retval;
3856}
3857
3858
3859char *triPort(char *name)
3860{
3861 static char retval[MAXSTRLEN];
3862 vl_id_range *id_sym;
3863
3864 strcpy(retval, name);
3865 if (st_lookup(vl_currentModule->sig_st, name, (char**)&id_sym)) {
3866 if (Zconnection) {
3867 if ((id_sym->flags & InPort) && (id_sym->flags & OutPort)) {
3868 strcat(retval, SEP_GATEPIN); strcat(retval, PIN_INOUT);
3869 }
3870 }
3871 }
3872 return retval;
3873}
3874
3875
3876static char *
3877nond_output(char *local_name, char *var_name)
3878{
3879 static char buf[MAXSTRLEN];
3880 char *cp;
3881
3882 if (vis_nond && !rst_ckt) {
3883 sprintf(buf, var_name);
3884 if ((cp=strstr(buf, SEP_GATEPIN))) *cp = '\0';
3885 vis_nond_var = 1;
3886 return buf;
3887 } else {
3888 return local_name;
3889 }
3890}
3891
3892
3893void to_upper(char *str)
3894{
3895 int i;
3896 int len;
3897
3898 len = strlen(str);
3899 for (i=0; i<len; i++)
3900 if (islower((int)(str[i])))
3901 str[i] += ('A' - 'a');
3902}
3903
3904
3905char *
3906shift_mv_vars(char *inputs, int nval)
3907{
3908 static char buf[MAXSTRLEN];
3909 int len, i;
3910 char arg[MAXSTRLEN];
3911 char token[MAXSTRLEN];
3912 char *cp;
3913 int ith;
3914
3915 buf[0] = '\0';
3916 len = strlen(inputs);
3917 for (cp=inputs, ith=0; cp<inputs+len; ith++) {
3918 i=0;
3919 while ((*cp == ' ' || *cp == '\t') && *cp != '\0') cp++;
3920 while ((*cp != ' ' && *cp != '\t') && *cp != '\0') {
3921 token[i] = *cp;
3922 cp++; i++;
3923 }
3924 if (i > 0) {
3925 token[i] = '\0';
3926 if (ith == 0)
3927 sprintf(arg, " %s ", token);
3928 else
3929 sprintf(arg, " , %s ", token);
3930 strcat(buf, arg);
3931 }
3932 }
3933
3934 return buf;
3935}
Note: See TracBrowser for help on using the repository browser.