Make C style comments work in false/suppressed ifdef/etc. blocks.
[iverilog.git] / main.cc
bloba446bbda1a2b6dbd4ae4f62d9760b3c49ad61dc6
2 const char COPYRIGHT[] =
3 "Copyright (c) 1998-2005 Stephen Williams (steve@icarus.com)";
5 /*
6 * This source code is free software; you can redistribute it
7 * and/or modify it in source code form under the terms of the GNU
8 * General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
10 * any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
21 #ifdef HAVE_CVS_IDENT
22 #ident "$Id: main.cc,v 1.95 2007/04/19 02:52:53 steve Exp $"
23 #endif
25 # include "config.h"
27 const char NOTICE[] =
28 " This program is free software; you can redistribute it and/or modify\n"
29 " it under the terms of the GNU General Public License as published by\n"
30 " the Free Software Foundation; either version 2 of the License, or\n"
31 " (at your option) any later version.\n"
32 "\n"
33 " This program is distributed in the hope that it will be useful,\n"
34 " but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
35 " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
36 " GNU General Public License for more details.\n"
37 "\n"
38 " You should have received a copy of the GNU General Public License\n"
39 " along with this program; if not, write to the Free Software\n"
40 " Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\n"
43 # include <stdio.h>
44 # include <iostream>
45 # include <fstream>
46 # include <queue>
47 # include <list>
48 # include <map>
49 # include <unistd.h>
50 # include <stdlib.h>
51 #if defined(HAVE_TIMES)
52 # include <sys/times.h>
53 #endif
54 #if defined(HAVE_GETOPT_H)
55 # include <getopt.h>
56 #endif
57 # include "pform.h"
58 # include "parse_api.h"
59 # include "netlist.h"
60 # include "target.h"
61 # include "compiler.h"
63 #if defined(__MINGW32__) && !defined(HAVE_GETOPT_H)
64 extern "C" int getopt(int argc, char*argv[], const char*fmt);
65 extern "C" int optind;
66 extern "C" const char*optarg;
67 #endif
69 #if defined(__CYGWIN32__) && !defined(HAVE_GETOPT_H)
70 extern "C" int getopt(int argc, char*argv[], const char*fmt);
71 extern "C" int optind;
72 extern "C" const char*optarg;
73 #endif
75 /* Count errors detected in flag processing. */
76 unsigned flag_errors = 0;
78 const char VERSION[] = "$Name: $";
80 const char*basedir = ".";
82 const char*target = "null";
85 * These are the language support control flags. These support which
86 * language features (the generation) to support. The generation_flag
87 * is a major moce, and the gn_* flags control specifc sub-features.
89 generation_t generation_flag = GN_DEFAULT;
90 bool gn_cadence_types_flag = true;
91 bool gn_specify_blocks_flag = true;
92 bool gn_io_range_error_flag = true;
94 map<string,const char*> flags;
95 char*vpi_module_list = 0;
97 map<perm_string,unsigned> missing_modules;
98 map<string,bool> library_file_map;
100 list<const char*> library_suff;
102 list<perm_string> roots;
104 char*ivlpp_string = 0;
106 char* depfile_name = NULL;
107 FILE *depend_file = NULL;
110 * These are the warning enable flags.
112 bool warn_implicit = false;
113 bool warn_timescale = false;
114 bool warn_portbinding = false;
116 bool error_implicit = false;
119 * Debug message class flags.
121 bool debug_scopes = false;
122 bool debug_eval_tree = false;
123 bool debug_elaborate = false;
124 bool debug_synth2 = false;
126 * Verbose messages enabled.
128 bool verbose_flag = false;
130 unsigned integer_width = 32;
133 * Keep a heap of identifier strings that I encounter. This is a more
134 * efficient way to allocate those strings.
136 StringHeapLex lex_strings;
139 * In library searches, Windows file names are never case sensitive.
141 #if defined(__MINGW32__)
142 const bool CASE_SENSITIVE = false;
143 #else
144 const bool CASE_SENSITIVE = true;
145 #endif
147 extern void cprop(Design*des);
148 extern void synth(Design*des);
149 extern void synth2(Design*des);
150 extern void syn_rules(Design*des);
151 extern void nodangle(Design*des);
152 #ifdef WITH_T_XNF
153 extern void xnfio(Design*des);
154 #endif
156 typedef void (*net_func)(Design*);
157 static struct net_func_map {
158 const char*name;
159 void (*func)(Design*);
160 } func_table[] = {
161 { "cprop", &cprop },
162 { "nodangle",&nodangle },
163 { "synth", &synth },
164 { "synth2", &synth2 },
165 { "syn-rules", &syn_rules },
166 #ifdef WITH_T_XNF
167 { "xnfio", &xnfio },
168 #endif
169 { 0, 0 }
172 queue<net_func> net_func_queue;
174 net_func name_to_net_func(const string&name)
176 for (unsigned idx = 0 ; func_table[idx].name ; idx += 1)
177 if (name == func_table[idx].name)
178 return func_table[idx].func;
180 return 0;
183 const char *net_func_to_name(const net_func func)
185 for (unsigned idx = 0 ; func_table[idx].name ; idx += 1)
186 if (func == func_table[idx].func)
187 return func_table[idx].name;
189 return "This cannot happen";
192 static void process_generation_flag(const char*gen)
194 if (strcmp(gen,"1") == 0) {
195 generation_flag = GN_VER1995;
197 } else if (strcmp(gen,"2") == 0) {
198 generation_flag = GN_VER2001;
200 } else if (strcmp(gen,"2x") == 0) {
201 generation_flag = GN_VER2001X;
203 } else if (strcmp(gen,"xtypes") == 0) {
204 gn_cadence_types_flag = true;
206 } else if (strcmp(gen,"no-xtypes") == 0) {
207 gn_cadence_types_flag = false;
209 } else if (strcmp(gen,"specify") == 0) {
210 gn_specify_blocks_flag = true;
212 } else if (strcmp(gen,"no-specify") == 0) {
213 gn_specify_blocks_flag = false;
215 } else if (strcmp(gen,"io-range-error") == 0) {
216 gn_io_range_error_flag = true;
218 } else if (strcmp(gen,"no-io-range-error") == 0) {
219 gn_io_range_error_flag = false;
221 } else {
225 static void parm_to_flagmap(const string&flag)
227 string key;
228 const char*value;
229 unsigned off = flag.find('=');
230 if (off > flag.size()) {
231 key = flag;
232 value = "";
234 } else {
235 key = flag.substr(0, off);
236 value = strdup(flag.substr(off+1).c_str());
239 flags[key] = value;
243 * Read the contents of a config file. This file is a temporary
244 * configuration file made by the compiler driver to carry the bulky
245 * flags generated from the user. This reduces the size of the command
246 * line needed to invoke ivl.
248 * Each line of the iconfig file has the format:
250 * <keyword>:<value>
252 * The <value> is all the text after the ':' and up to but not
253 * including the end of the line. Thus, white spaces and ':'
254 * characters may appear here.
256 * The valid keys are:
258 * -y:<dir>
259 * -yl:<dir>
260 * -Y:<string>
262 * -T:<min/typ/max>
263 * Select which expression to use.
265 * -t:<target>
266 * Usually, "-t:dll"
268 * basedir:<path>
269 * Location to look for installed sub-components
271 * debug:<name>
272 * Activate a class of debug messages.
274 * depfile:<path>
275 * Give the path to an output dependency file.
277 * flag:<name>=<string>
278 * Generic compiler flag strings.
280 * functor:<name>
281 * Append a named functor to the processing path.
283 * generation:<1|2|2x|xtypes|no-xtypes|specify|no-specify>
284 * This is the generation flag
286 * ivlpp:<preprocessor command>
287 * This specifies the ivlpp command line used to process
288 * library modules as I read them in.
290 * iwidth:<bits>
291 * This specifies the width of integer variables. (that is,
292 * variables declared using the "integer" keyword.)
294 * library_file:<path>
295 * This marks that a source file with the given path is a
296 * library. Any modules in that file are marked as library
297 * modules.
299 * module:<name>
300 * Load a VPI module.
302 * out:<path>
303 * Path to the output file.
305 * sys_func:<path>
306 * Path to a system functions descriptor table
308 * root:<name>
309 * Specify a root module. There may be multiple of this.
311 * warnings:<string>
312 * Warning flag letters.
314 static void read_iconfig_file(const char*ipath)
316 char buf[8*1024];
318 FILE*ifile = fopen(ipath, "r");
319 if (ifile == 0) {
320 cerr << "ERROR: Unable to read config file: " << ipath << endl;
321 return;
324 while (fgets(buf, sizeof buf, ifile) != 0) {
325 if (buf[0] == '#')
326 continue;
327 char*cp = strchr(buf, ':');
328 if (cp == 0)
329 continue;
331 *cp++ = 0;
332 char*ep = cp + strlen(cp);
333 while (ep > cp) {
334 ep -= 1;
335 switch (*ep) {
336 case '\r':
337 case '\n':
338 case ' ':
339 case '\t':
340 *ep = 0;
341 break;
342 default:
343 ep = cp;
347 if (strcmp(buf, "basedir") == 0) {
348 basedir = strdup(cp);
350 } else if (strcmp(buf, "debug") == 0) {
351 if (strcmp(cp, "scope") == 0) {
352 debug_scopes = true;
353 cerr << "debug: Enable scope debug" << endl;
354 } else if (strcmp(cp,"eval_tree") == 0) {
355 debug_eval_tree = true;
356 cerr << "debug: Enable eval_tree debug" << endl;
357 } else if (strcmp(cp,"elaborate") == 0) {
358 debug_elaborate = true;
359 cerr << "debug: Enable elaborate debug" << endl;
360 } else if (strcmp(cp,"synth2") == 0) {
361 debug_synth2 = true;
362 cerr << "debug: Enable synth2 debug" << endl;
363 } else {
366 } else if (strcmp(buf, "depfile") == 0) {
367 depfile_name = strdup(cp);
369 } else if (strcmp(buf, "flag") == 0) {
370 string parm = cp;
371 parm_to_flagmap(parm);
373 } else if (strcmp(buf,"functor") == 0) {
374 net_func tmp = name_to_net_func(cp);
375 if (tmp == 0) {
376 cerr << "No such design transform function ``"
377 << cp << "''." << endl;
378 flag_errors += 1;
379 break;
381 net_func_queue.push(tmp);
383 } else if (strcmp(buf, "generation") == 0) {
384 process_generation_flag(cp);
386 } else if (strcmp(buf, "ivlpp") == 0) {
387 ivlpp_string = strdup(cp);
389 } else if (strcmp(buf, "iwidth") == 0) {
390 integer_width = strtoul(cp,0,10);
392 } else if (strcmp(buf, "library_file") == 0) {
393 const char* path = strdup(cp);
394 library_file_map[path] = true;
396 } else if (strcmp(buf,"module") == 0) {
397 if (vpi_module_list == 0) {
398 vpi_module_list = strdup(cp);
400 } else {
401 char*tmp = (char*)realloc(vpi_module_list,
402 strlen(vpi_module_list)
403 + strlen(cp)
404 + 2);
405 strcat(tmp, ",");
406 strcat(tmp, cp);
407 vpi_module_list = tmp;
409 flags["VPI_MODULE_LIST"] = vpi_module_list;
411 } else if (strcmp(buf, "out") == 0) {
412 flags["-o"] = strdup(cp);
414 } else if (strcmp(buf, "sys_func") == 0) {
415 load_sys_func_table(cp);
417 } else if (strcmp(buf, "root") == 0) {
418 roots.push_back(lex_strings.make(cp));
420 } else if (strcmp(buf,"warnings") == 0) {
421 /* Scan the warnings enable string for warning flags. */
422 for ( ; *cp ; cp += 1) switch (*cp) {
423 case 'i':
424 warn_implicit = true;
425 break;
426 case 'p':
427 warn_portbinding = true;
428 break;
429 case 't':
430 warn_timescale = true;
431 break;
432 default:
433 break;
436 } else if (strcmp(buf, "-y") == 0) {
437 build_library_index(cp, CASE_SENSITIVE);
439 } else if (strcmp(buf, "-yl") == 0) {
440 build_library_index(cp, false);
442 } else if (strcmp(buf, "-Y") == 0) {
443 library_suff.push_back(strdup(cp));
445 } else if (strcmp(buf,"-t") == 0) {
446 target = strdup(cp);
448 } else if (strcmp(buf,"-T") == 0) {
449 if (strcmp(cp,"min") == 0) {
450 min_typ_max_flag = MIN;
451 min_typ_max_warn = 0;
452 } else if (strcmp(cp,"typ") == 0) {
453 min_typ_max_flag = TYP;
454 min_typ_max_warn = 0;
455 } else if (strcmp(cp,"max") == 0) {
456 min_typ_max_flag = MAX;
457 min_typ_max_warn = 0;
458 } else {
459 cerr << "Invalid argument (" << optarg << ") to -T flag."
460 << endl;
461 flag_errors += 1;
468 extern Design* elaborate(list <perm_string> root);
470 #if defined(HAVE_TIMES)
471 static double cycles_diff(struct tms *a, struct tms *b)
473 clock_t aa = a->tms_utime
474 + a->tms_stime
475 + a->tms_cutime
476 + a->tms_cstime;
478 clock_t bb = b->tms_utime
479 + b->tms_stime
480 + b->tms_cutime
481 + b->tms_cstime;
483 return (aa-bb)/(double)sysconf(_SC_CLK_TCK);
485 #else // ! defined(HAVE_TIMES)
486 // Provide dummies
487 struct tms { int x; };
488 inline static void times(struct tms *) { }
489 inline static double cycles_diff(struct tms *a, struct tms *b) { return 0; }
490 #endif // ! defined(HAVE_TIMES)
492 int main(int argc, char*argv[])
494 bool help_flag = false;
495 bool times_flag = false;
497 const char* net_path = 0;
498 const char* pf_path = 0;
499 int opt;
501 struct tms cycles[5];
503 library_suff.push_back(".v");
505 vpi_module_list = strdup("system");
506 flags["VPI_MODULE_LIST"] = vpi_module_list;
507 flags["-o"] = "a.out";
508 min_typ_max_flag = TYP;
509 min_typ_max_warn = 10;
511 while ((opt = getopt(argc, argv, "C:f:hN:P:p:Vv")) != EOF) switch (opt) {
513 case 'C':
514 read_iconfig_file(optarg);
515 break;
517 case 'f':
518 parm_to_flagmap(optarg);
519 break;
520 case 'h':
521 help_flag = true;
522 break;
523 case 'N':
524 net_path = optarg;
525 break;
526 case 'P':
527 pf_path = optarg;
528 break;
529 case 'p':
530 parm_to_flagmap(optarg);
531 break;
532 case 'v':
533 verbose_flag = true;
534 # if defined(HAVE_TIMES)
535 times_flag = true;
536 # endif
537 break;
538 case 'V':
539 cout << "Icarus Verilog version " << VERSION << endl;
540 cout << COPYRIGHT << endl;
541 cout << endl << NOTICE << endl;
542 return 0;
543 default:
544 flag_errors += 1;
545 break;
548 if (flag_errors)
549 return flag_errors;
551 if (help_flag) {
552 cout << "Icarus Verilog version " << VERSION << endl <<
553 "usage: ivl <options> <file>\n"
554 "options:\n"
555 "\t-C <name> Config file from driver.\n"
556 "\t-h Print usage information, and exit.\n"
557 "\t-N <file> Dump the elaborated netlist to <file>.\n"
558 "\t-P <file> Write the parsed input to <file>.\n"
559 "\t-p <assign> Set a parameter value.\n"
560 "\t-v Print progress indications"
561 #if defined(HAVE_TIMES)
562 " and execution times"
563 #endif
564 ".\n"
565 "\t-V Print version and copyright information, and exit.\n"
568 return 0;
571 if (optind == argc) {
572 cerr << "No input files." << endl;
573 return 1;
576 if( depfile_name ) {
577 depend_file = fopen(depfile_name, "a");
578 if(! depend_file) {
579 perror(depfile_name);
584 if (verbose_flag) {
585 if (times_flag)
586 times(cycles+0);
588 cout << "Using language generation: ";
589 switch (generation_flag) {
590 case GN_VER1995:
591 cout << "IEEE1364-1995";
592 break;
593 case GN_VER2001:
594 cout << "IEEE1364-2001";
595 break;
596 case GN_VER2001X:
597 cout << "IEEE1364-2001+Extensions";
598 break;
601 if (gn_specify_blocks_flag)
602 cout << ",specify";
603 else
604 cout << ",no-specify";
606 if (gn_cadence_types_flag)
607 cout << ",xtypes";
608 else
609 cout << ",no-xtypes";
611 cout << endl << "PARSING INPUT" << endl;
614 /* Parse the input. Make the pform. */
615 int rc = pform_parse(argv[optind]);
617 if (pf_path) {
618 ofstream out (pf_path);
619 out << "PFORM DUMP MODULES:" << endl;
620 for (map<perm_string,Module*>::iterator mod = pform_modules.begin()
621 ; mod != pform_modules.end()
622 ; mod ++ ) {
623 pform_dump(out, (*mod).second);
625 out << "PFORM DUMP PRIMITIVES:" << endl;
626 for (map<perm_string,PUdp*>::iterator idx = pform_primitives.begin()
627 ; idx != pform_primitives.end()
628 ; idx ++ ) {
629 (*idx).second->dump(out);
633 if (rc) {
634 return rc;
638 /* If the user did not give specific module(s) to start with,
639 then look for modules that are not instantiated anywhere. */
641 if (roots.empty()) {
642 map<perm_string,bool> mentioned_p;
643 map<perm_string,Module*>::iterator mod;
644 if (verbose_flag)
645 cout << "LOCATING TOP-LEVEL MODULES" << endl << " ";
646 for (mod = pform_modules.begin()
647 ; mod != pform_modules.end()
648 ; mod++) {
649 list<PGate*> gates = (*mod).second->get_gates();
650 list<PGate*>::const_iterator gate;
651 for (gate = gates.begin(); gate != gates.end(); gate++) {
652 PGModule *mod = dynamic_cast<PGModule*>(*gate);
653 if (mod) {
654 // Note that this module has been instantiated
655 mentioned_p[mod->get_type()] = true;
660 for (mod = pform_modules.begin()
661 ; mod != pform_modules.end()
662 ; mod++) {
664 /* Don't choose library modules. */
665 if ((*mod).second->library_flag)
666 continue;
668 /* Don't choose modules instantiated in other
669 modules. */
670 if (mentioned_p[(*mod).second->mod_name()])
671 continue;
673 /* What's left might as well be chosen as a root. */
674 if (verbose_flag)
675 cout << " " << (*mod).second->mod_name();
676 roots.push_back((*mod).second->mod_name());
678 if (verbose_flag)
679 cout << endl;
682 /* If there is *still* no guess for the root module, then give
683 up completely, and complain. */
685 if (roots.empty()) {
686 cerr << "No top level modules, and no -s option." << endl;
687 return 1;
691 if (verbose_flag) {
692 if (times_flag) {
693 times(cycles+1);
694 cerr<<" ... done, "
695 <<cycles_diff(cycles+1, cycles+0)<<" seconds."<<endl;
697 cout << "ELABORATING DESIGN" << endl;
700 /* On with the process of elaborating the module. */
701 Design*des = elaborate(roots);
703 if ((des == 0) || (des->errors > 0)) {
704 if (des != 0) {
705 cerr << des->errors
706 << " error(s) during elaboration." << endl;
707 if (net_path) {
708 ofstream out (net_path);
709 des->dump(out);
711 } else {
712 cerr << "Elaboration failed" << endl;
715 goto errors_summary;
718 des->set_flags(flags);
720 /* Done iwth all the pform data. Delete the modules. */
721 for (map<perm_string,Module*>::iterator idx = pform_modules.begin()
722 ; idx != pform_modules.end() ; idx ++) {
724 delete (*idx).second;
725 (*idx).second = 0;
728 if (verbose_flag) {
729 if (times_flag) {
730 times(cycles+2);
731 cerr<<" ... done, "
732 <<cycles_diff(cycles+2, cycles+1)<<" seconds."<<endl;
734 cout << "RUNNING FUNCTORS" << endl;
737 while (!net_func_queue.empty()) {
738 net_func func = net_func_queue.front();
739 net_func_queue.pop();
740 if (verbose_flag)
741 cerr<<" -F "<<net_func_to_name(func)<< " ..." <<endl;
742 func(des);
745 if (net_path) {
746 if (verbose_flag)
747 cerr<<" dumping netlist to " <<net_path<< "..." <<endl;
749 ofstream out (net_path);
750 des->dump(out);
753 if (des->errors) {
754 cerr << des->errors
755 << " error(s) in post-elaboration processing." <<
756 endl;
757 return des->errors;
760 if (verbose_flag) {
761 if (times_flag) {
762 times(cycles+3);
763 cerr<<" ... done, "
764 <<cycles_diff(cycles+3, cycles+2)<<" seconds."<<endl;
768 if (verbose_flag) {
769 cout << "CODE GENERATION -t "<<target<< endl;
772 int emit_rc;
773 emit_rc = emit(des, target);
774 if (emit_rc > 0) {
775 cerr << "error: Code generation had "
776 << emit_rc << " errors."
777 << endl;
778 return 1;
780 if (emit_rc < 0) {
781 cerr << "error: Code generator failure: " << emit_rc << endl;
782 return -1;
785 if (verbose_flag) {
786 if (times_flag) {
787 times(cycles+4);
788 cerr<<" ... done, "
789 <<cycles_diff(cycles+4, cycles+3)<<" seconds."<<endl;
790 } else {
791 cout << "DONE." << endl;
795 if (verbose_flag) {
796 cout << "STATISTICS" << endl;
797 cout << "lex_string:"
798 << " add_count=" << lex_strings.add_count()
799 << " hit_count=" << lex_strings.add_hit_count()
800 << endl;
803 return 0;
805 errors_summary:
806 if (missing_modules.size() > 0) {
807 cerr << "*** These modules were missing:" << endl;
809 map<perm_string,unsigned>::const_iterator idx;
810 for (idx = missing_modules.begin()
811 ; idx != missing_modules.end()
812 ; idx ++)
813 cerr << " " << (*idx).first
814 << " referenced " << (*idx).second
815 << " times."<< endl;
817 cerr << "***" << endl;
820 return des? des->errors : 1;
824 * $Log: main.cc,v $
825 * Revision 1.95 2007/04/19 02:52:53 steve
826 * Add support for -v flag in command file.
828 * Revision 1.94 2007/03/07 04:24:59 steve
829 * Make integer width controllable.
831 * Revision 1.93 2006/09/28 04:35:18 steve
832 * Support selective control of specify and xtypes features.
834 * Revision 1.92 2005/07/14 23:38:43 steve
835 * Display as version 0.9.devel
837 * Revision 1.91 2005/07/07 16:22:49 steve
838 * Generalize signals to carry types.
840 * Revision 1.90 2005/06/28 04:25:55 steve
841 * Remove reference to SystemVerilog.
843 * Revision 1.89 2005/04/24 23:44:02 steve
844 * Update DFF support to new data flow.
846 * Revision 1.88 2005/01/22 01:06:55 steve
847 * Change case compare from logic to an LPM node.
849 * Revision 1.87 2004/12/11 02:31:26 steve
850 * Rework of internals to carry vectors through nexus instead
851 * of single bits. Make the ivl, tgt-vvp and vvp initial changes
852 * down this path.
854 * Revision 1.86 2004/10/04 01:10:53 steve
855 * Clean up spurious trailing white space.
857 * Revision 1.85 2004/09/25 01:58:44 steve
858 * Add a debug_elaborate flag
860 * Revision 1.84 2004/09/10 23:51:42 steve
861 * Fix the evaluation of constant ternary expressions.
863 * Revision 1.83 2004/09/05 17:44:42 steve
864 * Add support for module instance arrays.
866 * Revision 1.82 2004/03/10 04:51:24 steve
867 * Add support for system function table files.
869 * Revision 1.81 2004/02/18 17:11:56 steve
870 * Use perm_strings for named langiage items.
872 * Revision 1.80 2004/02/15 00:19:29 steve
873 * Report elaboration errors without crashing.
875 * Revision 1.79 2003/11/26 01:37:14 steve
876 * Properly initialize vpi_module_list with system.
878 * Revision 1.78 2003/11/13 05:55:33 steve
879 * Move the DLL= flag to target config files.
881 * Revision 1.77 2003/11/13 04:09:49 steve
882 * Pass flags through the temporary config file.
884 * Revision 1.76 2003/11/13 03:10:38 steve
885 * ivl -F and -t flags are onpassed throught the -C file.
887 * Revision 1.75 2003/11/10 20:59:03 steve
888 * Design::get_flag returns const char* instead of string.
890 * Revision 1.74 2003/11/01 04:22:30 steve
891 * Accept functors in the config file.
893 * Revision 1.73 2003/10/26 22:43:42 steve
894 * Improve -V messages,
896 * Revision 1.72 2003/09/26 02:17:14 steve
897 * Delete pform when done with it.
899 * Revision 1.71 2003/09/25 00:25:14 steve
900 * Summary list of missing modules.
902 * Revision 1.70 2003/09/23 05:57:36 steve
903 * Pass -m flag from driver via iconfig file.
905 * Revision 1.69 2003/09/22 01:12:08 steve
906 * Pass more ivl arguments through the iconfig file.
908 * Revision 1.68 2003/06/20 00:53:19 steve
909 * Module attributes from the parser
910 * through to elaborated form.
912 * Revision 1.67 2003/04/24 05:25:27 steve
913 * Dump design even on errors.
915 * Revision 1.66 2003/03/01 06:25:30 steve
916 * Add the lex_strings string handler, and put
917 * scope names and system task/function names
918 * into this table. Also, permallocate event
919 * names from the beginning.