[18] | 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 | } |
---|