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/main.c,v 1.2 2009/03/09 20:25:57 fabio Exp $ |
---|
22 | |
---|
23 | |
---|
24 | */ |
---|
25 | |
---|
26 | #include <stdio.h> |
---|
27 | #include <sys/time.h> |
---|
28 | #include <time.h> |
---|
29 | #include <unistd.h> |
---|
30 | #include "util.h" |
---|
31 | #include "array.h" |
---|
32 | #include "st.h" |
---|
33 | #include "list.h" |
---|
34 | #include "set.h" |
---|
35 | #include "stack.h" |
---|
36 | #include "vl_types.h" |
---|
37 | #include "vl_defs.h" |
---|
38 | #include "vlr_int.h" |
---|
39 | #include "vl_traverse.h" |
---|
40 | #include "vl_write.h" |
---|
41 | #include "vl_mux.h" |
---|
42 | #include "verilog.h" |
---|
43 | |
---|
44 | extern vl_descPtr vl_description; |
---|
45 | extern int YYTrace; |
---|
46 | extern lsList vl_module_stack; |
---|
47 | extern lsList vl_cur_type_stack; |
---|
48 | extern st_table *macros; |
---|
49 | extern int PrtEnable; |
---|
50 | extern int dumpSyncCkt; |
---|
51 | extern int dflow_analysis; |
---|
52 | extern int Loop_Unrolling; |
---|
53 | extern int Repeat_Unrolling; |
---|
54 | extern int do_encoding; |
---|
55 | extern int debug_mode; |
---|
56 | extern int Use_MV_Lib; |
---|
57 | extern int set_notation; |
---|
58 | extern int implicitDeclare; |
---|
59 | extern int implicitClocking; |
---|
60 | extern int combinationalReduction; |
---|
61 | extern int chk_IncompleteBranch; |
---|
62 | extern int vlTimedSystem; |
---|
63 | extern int wireRegister; |
---|
64 | extern int portPerLine; |
---|
65 | extern int compatibleChecking; |
---|
66 | extern int use_libraryGate; |
---|
67 | extern int vis_nond; |
---|
68 | extern int vl_noTimers; |
---|
69 | extern int decomposeTable; |
---|
70 | extern int smartEvent; |
---|
71 | extern int indexAssignment; |
---|
72 | extern int NoDetailedComment; |
---|
73 | extern int implicitClockWire; |
---|
74 | extern int arrayBoundNond; |
---|
75 | extern int RQautomata; |
---|
76 | extern int deadlock_semantic; |
---|
77 | extern int Zconnection; |
---|
78 | extern char *vl_filename; |
---|
79 | extern FILE *yyin; |
---|
80 | extern FILE *mv_file; |
---|
81 | extern FILE *open_file(); |
---|
82 | extern stack_t file_stack; |
---|
83 | extern stack_t fname_stack; |
---|
84 | extern stack_t lineno_stack; |
---|
85 | extern stack_t buffer_stack; |
---|
86 | extern int instantiateAll; |
---|
87 | extern FILE *null_file; |
---|
88 | |
---|
89 | FILE *vl_OutStream=NIL(FILE); |
---|
90 | char *vl_OutStreamName=NIL(char); |
---|
91 | |
---|
92 | FILE *siserr; |
---|
93 | |
---|
94 | int noBus=0; |
---|
95 | |
---|
96 | int WarningLevel=0; |
---|
97 | int vlPhase=0; |
---|
98 | int encodeTimer=1; |
---|
99 | int userControlLibraryGate=0; |
---|
100 | |
---|
101 | char *opts = "AbBcdD:eEf:FgiIklMnNo:OpPrR:StT:uvwW:xyZz"; |
---|
102 | int ith_module = 0; |
---|
103 | |
---|
104 | int Warn_Uninitialized = 0; |
---|
105 | int Warn_DuplicateInst = 0; |
---|
106 | |
---|
107 | #define VIS_LIB_PATH "VIS_LIBRARY_PATH" |
---|
108 | #define SISLIB_MV "sislib.mv" |
---|
109 | #define SISLIB_V "sislib.v" |
---|
110 | |
---|
111 | UNUSED static char rcsid[] = "$Id: main.c,v 1.2 2009/03/09 20:25:57 fabio Exp $"; |
---|
112 | |
---|
113 | static void usage ARGS((char *cmd)); |
---|
114 | static void predefine_macros ARGS((st_table *macros)); |
---|
115 | |
---|
116 | int main(int argc, char *argv[]) |
---|
117 | { |
---|
118 | #ifdef _IBMR2 |
---|
119 | int c; |
---|
120 | #else |
---|
121 | char c; |
---|
122 | #endif |
---|
123 | lsHandle handle; |
---|
124 | lsGen gen; |
---|
125 | vl_module *mod; |
---|
126 | int i; |
---|
127 | int dumpOnly=0; |
---|
128 | int use_stdout=0; |
---|
129 | char *out_filename = NIL(char); |
---|
130 | struct timeval tval; |
---|
131 | struct timezone tzone; |
---|
132 | struct tm *current_time; |
---|
133 | char buf[MAXSTRLEN]; |
---|
134 | extern int optind; |
---|
135 | extern char *optarg; |
---|
136 | extern int use_rst_ckt; |
---|
137 | |
---|
138 | mv_file = stdout; |
---|
139 | siserr = stderr; |
---|
140 | |
---|
141 | gettimeofday(&tval, &tzone); |
---|
142 | current_time = localtime((time_t *)(&(tval.tv_sec))); |
---|
143 | |
---|
144 | |
---|
145 | macros = st_init_table(strcmp, st_strhash); |
---|
146 | predefine_macros(macros); |
---|
147 | |
---|
148 | |
---|
149 | vl_module_stack = lsCreate(); |
---|
150 | vl_cur_type_stack = lsCreate(); |
---|
151 | |
---|
152 | if (argc <= 1) { |
---|
153 | usage(argv[0]); |
---|
154 | } |
---|
155 | |
---|
156 | while ((c = getopt(argc, argv, opts)) != EOF) { |
---|
157 | switch (c) { |
---|
158 | case 'A': use_stdout=1; break; |
---|
159 | case 'b': noBus=1; break; |
---|
160 | case 'B': chk_IncompleteBranch = 0; break; |
---|
161 | case 'c': implicitClocking = 0; vlTimedSystem = 1; break; |
---|
162 | case 'C': compatibleChecking = 1; break; |
---|
163 | case 'd': PrtEnable=1; dumpOnly=1; break; |
---|
164 | case 'D': |
---|
165 | switch (*optarg) { |
---|
166 | case 'l': dflow_analysis |= DF_UninitVar; break; |
---|
167 | default: usage(argv[0]); |
---|
168 | } |
---|
169 | break; |
---|
170 | case 'e': do_encoding = 1; break; |
---|
171 | case 'E': smartEvent = 0; break; |
---|
172 | case 'f': portPerLine = atoi(optarg); break; |
---|
173 | case 'F': vl_noTimers = 1; break; |
---|
174 | case 'g': debug_mode=1; break; |
---|
175 | case 'i': implicitDeclare=0; break; |
---|
176 | case 'I': instantiateAll=0; break; |
---|
177 | case 'k': deadlock_semantic = 1; break; |
---|
178 | case 'l': Use_MV_Lib=1; break; |
---|
179 | case 'L': userControlLibraryGate = 1; break; |
---|
180 | case 'M': NoDetailedComment=1; break; |
---|
181 | case 'n': dumpSyncCkt=1; break; |
---|
182 | case 'N': arrayBoundNond=1; break; |
---|
183 | case 'o': out_filename = vlStrdup(optarg); break; |
---|
184 | case 'O': combinationalReduction = 1; break; |
---|
185 | case 'P': Repeat_Unrolling = ~Repeat_Unrolling; break; |
---|
186 | case 'p': PrtEnable=1; break; |
---|
187 | case 'R': if (!strcmp(optarg,"Uninitialized")) Warn_Uninitialized=1; |
---|
188 | if (!strcmp(optarg,"DuplicateInst")) Warn_DuplicateInst=1; |
---|
189 | break; |
---|
190 | case 'r': use_rst_ckt = 1; break; |
---|
191 | case 'S': set_notation=0; break; |
---|
192 | case 't': YYTrace=1; break; |
---|
193 | case 'T': decomposeTable = atoi(optarg); break; |
---|
194 | case 'u': Loop_Unrolling=0; break; |
---|
195 | case 'v': implicitClockWire=1; break; |
---|
196 | case 'w': wireRegister=1; break; |
---|
197 | case 'W': WarningLevel = atoi (optarg); break; |
---|
198 | case 'x': indexAssignment = 1; break; |
---|
199 | case 'y': RQautomata = 0; break; |
---|
200 | case 'Z': vis_nond = 0; break; |
---|
201 | case 'z': Zconnection = 1; break; |
---|
202 | default: usage(argv[0]); |
---|
203 | } |
---|
204 | } |
---|
205 | |
---|
206 | |
---|
207 | file_stack = create_stack(); |
---|
208 | fname_stack = create_stack(); |
---|
209 | lineno_stack = create_stack(); |
---|
210 | buffer_stack = create_stack(); |
---|
211 | vl_filename = argv[optind]; |
---|
212 | yyin = fopen(argv[optind],"r"); |
---|
213 | fprintf(stderr, "%s\n", vl_filename); |
---|
214 | if (!yyin) { |
---|
215 | fprintf(stderr, "failed to open file %s\n", vl_filename); |
---|
216 | exit(1); |
---|
217 | } |
---|
218 | |
---|
219 | |
---|
220 | vlPhase = 0; |
---|
221 | if (yyparse()) |
---|
222 | printf("-- parsing failure\n"); |
---|
223 | chk_mp_definitions(vl_description->mp_undefined); |
---|
224 | |
---|
225 | if (!use_stdout) { |
---|
226 | if (!out_filename) { |
---|
227 | char *tmp_filename; |
---|
228 | tmp_filename = basename(vl_filename); |
---|
229 | out_filename = chk_malloc(strlen(tmp_filename)+15); |
---|
230 | strcpy(out_filename, tmp_filename); |
---|
231 | strcat(out_filename, ".mv"); |
---|
232 | vl_OutStreamName = vlStrdup(out_filename); |
---|
233 | vl_OutStream = mv_file = open_file(out_filename, "w"); |
---|
234 | vl_chk_free(out_filename); |
---|
235 | out_filename = NIL(char); |
---|
236 | } else { |
---|
237 | vl_OutStreamName = vlStrdup(out_filename); |
---|
238 | vl_OutStream = mv_file = open_file(out_filename, "w"); |
---|
239 | vl_chk_free(out_filename); |
---|
240 | out_filename = NIL(char); |
---|
241 | } |
---|
242 | } |
---|
243 | |
---|
244 | null_file = open_file("/dev/null", "w"); |
---|
245 | fprintf(mv_file, "%s ", HSIS_COMMENT); |
---|
246 | for (i=0; i<argc; i++) { |
---|
247 | fprintf(mv_file, "%s ", argv[i]); |
---|
248 | } |
---|
249 | fprintf(mv_file, "\n"); |
---|
250 | fprintf(mv_file, "%s version: %s\n", HSIS_COMMENT, VL2MV_VERSION); |
---|
251 | strftime(buf, MAXSTRLEN, "%T %m/%d/%Y (%Z)", current_time); |
---|
252 | fprintf(mv_file, "%s date: %s\n", HSIS_COMMENT, buf); |
---|
253 | |
---|
254 | vlPhase = 1; |
---|
255 | |
---|
256 | for (gen=lsStart(vl_description->modules); |
---|
257 | lsNext(gen, (lsGeneric*)&mod, &handle) != LS_NOMORE; ) { |
---|
258 | vl_step_desc(mod->name->name, (char*)mod, NIL(char)); |
---|
259 | } |
---|
260 | lsFinish(gen); |
---|
261 | |
---|
262 | if (!dumpOnly) { |
---|
263 | |
---|
264 | vlPhase = 2; |
---|
265 | PrtEnable = 1; |
---|
266 | gen = lsStart(vl_description->modules); |
---|
267 | while (lsNext(gen, (lsGeneric*)&mod, &handle) != LS_NOMORE) { |
---|
268 | vl_write_desc(mod->name->name, (char*)mod, NIL(char)); |
---|
269 | ith_module++; |
---|
270 | } |
---|
271 | vl_dump_libs(mv_file, vl_description->decl_st); |
---|
272 | } |
---|
273 | |
---|
274 | if (use_libraryGate) { |
---|
275 | if (!userControlLibraryGate) { |
---|
276 | char *visLibPath; |
---|
277 | if ((visLibPath=getenv(VIS_LIB_PATH))) { |
---|
278 | char *file_path; |
---|
279 | if ((file_path = util_file_search(SISLIB_MV,visLibPath,"r"))) { |
---|
280 | fprintf(mv_file, ".include %s\n", SISLIB_MV); |
---|
281 | } else if ((file_path = util_file_search(SISLIB_V, |
---|
282 | visLibPath, "r"))) { |
---|
283 | if (!(yyin = fopen(file_path, "r"))) { |
---|
284 | fprintf(stderr, "fail to open %s\n", file_path); |
---|
285 | exit(1); |
---|
286 | } |
---|
287 | yylineno = 1; |
---|
288 | if (yyparse()) { |
---|
289 | fprintf(stderr, "parsing failure for library file %s\n", |
---|
290 | file_path); |
---|
291 | exit(1); |
---|
292 | } |
---|
293 | fclose(yyin); |
---|
294 | } else { |
---|
295 | fprintf(stderr, "cannot file sislib.mv/sislib.v in $%s, insert \".include sislib.mv\" in your generated mv file\n", |
---|
296 | VIS_LIB_PATH); |
---|
297 | fprintf(mv_file, ".include %s\n", SISLIB_MV); |
---|
298 | } |
---|
299 | } else { |
---|
300 | fprintf(stderr, "cannot file sislib.mv/sislib.v in $%s, insert \".include sislib.mv\" in your generated mv file\n", |
---|
301 | VIS_LIB_PATH); |
---|
302 | fprintf(mv_file, ".include %s\n", SISLIB_MV); |
---|
303 | } |
---|
304 | } |
---|
305 | } |
---|
306 | |
---|
307 | return 0; |
---|
308 | } |
---|
309 | |
---|
310 | static void usage(char *cmd) |
---|
311 | { |
---|
312 | fprintf(stderr, "usage: %s -%s <filename>\n", cmd, opts); |
---|
313 | fprintf(stderr, "\tversion %s\n", VL2MV_VERSION); |
---|
314 | fprintf(stderr, " -A : dump output to stdout\n"); |
---|
315 | fprintf(stderr, " -b : no multiple output for bus connection\n"); |
---|
316 | fprintf(stderr, " -B : disable check incomplete branches\n"); |
---|
317 | fprintf(stderr, " -c : explicit clocking\n"); |
---|
318 | |
---|
319 | fprintf(stderr, " -d : dump internal representation only\n"); |
---|
320 | |
---|
321 | |
---|
322 | fprintf(stderr, " -E : turn off smart event (save register)\n"); |
---|
323 | fprintf(stderr, " -f : split line for long port lists\n"); |
---|
324 | fprintf(stderr, " -F : ignore all timing (watch out!!)\n"); |
---|
325 | fprintf(stderr, " -g : put debugging information\n"); |
---|
326 | fprintf(stderr, " -i : turn off auto declaration of 1-bit wires\n"); |
---|
327 | fprintf(stderr, " -I : supress declaration of modules of included file when `VL2MVundefMod is in place\n"); |
---|
328 | fprintf(stderr, " -L : users wish to control the generation of gates instead of using default search/generation schemes.\n"); |
---|
329 | |
---|
330 | fprintf(stderr, " -M : forbidden verbose comments\n"); |
---|
331 | fprintf(stderr, " -n : check if create physically clocked latches\n"); |
---|
332 | fprintf(stderr, " -N : use nondeterminism for out-of-bound array access\n"); |
---|
333 | fprintf(stderr, " -o <file> : send output to <file>\n"); |
---|
334 | fprintf(stderr, " -O : combinational reduction\n"); |
---|
335 | fprintf(stderr, " -P : disable repeat loop unrolling\n"); |
---|
336 | fprintf(stderr, " -p : dump internal representation\n"); |
---|
337 | |
---|
338 | fprintf(stderr, " -R <warn> : provide various warning messages\n"); |
---|
339 | fprintf(stderr, " <warn> = Uninitialized DuplicateInst\n"); |
---|
340 | fprintf(stderr, " -t : dump parsing trace\n"); |
---|
341 | fprintf(stderr, " -T <width>: decompose nonblocking assignment table wider than <width>\n"); |
---|
342 | fprintf(stderr, " -u : turn off loop unrolling\n"); |
---|
343 | fprintf(stderr, " -v : wire for 'clocks' in implicit clocking\n"); |
---|
344 | fprintf(stderr, " -w : put register to prevent self reference wire in alwyas stmt\n"); |
---|
345 | fprintf(stderr, " -W <level>: set warning level\n"); |
---|
346 | fprintf(stderr, " -x : put in assignment to idnex variable in for-loop unrolling\n"); |
---|
347 | fprintf(stderr, " -y : do not attempt to make Timing Maching RQ (save states)\n"); |
---|
348 | fprintf(stderr, " -z : use wire-or for resolution function instead of conflict arbiter\n"); |
---|
349 | fprintf(stderr, " useful for hi-Z modeling\n"); |
---|
350 | fprintf(stderr, " -Z : (turn on) limit $ND to only continuous assignments for VIS\n"); |
---|
351 | fprintf(stderr, " : WARNING: when this is on, only \"assign <id> = $ND(...);\" is allowed\n"); |
---|
352 | exit(255); |
---|
353 | } |
---|
354 | |
---|
355 | void vl_exit(int code) |
---|
356 | { |
---|
357 | if (vl_OutStream != NIL(FILE)) |
---|
358 | unlink(vl_OutStreamName); |
---|
359 | exit(code); |
---|
360 | } |
---|
361 | |
---|
362 | char *predefined_symbols[] = { |
---|
363 | "__vl2mv__", |
---|
364 | "__synth__", |
---|
365 | NULL |
---|
366 | }; |
---|
367 | |
---|
368 | static void predefine_macros(st_table *macros) |
---|
369 | { |
---|
370 | int i; |
---|
371 | char *cp; |
---|
372 | |
---|
373 | for (i=0 ; (cp=predefined_symbols[i]); i++) { |
---|
374 | st_insert(macros, cp, " "); |
---|
375 | } |
---|
376 | } |
---|