diff --git a/Changes b/Changes index 22aa14cc3..94add6886 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ indicates the contributor was also the author of the fix; Thanks! *** Add sc_bv attribute to force bit vectors, bug402. [by Stefan Wallentowitz] +**** Search for user -y paths before default current directory. [Ruben Diez] + **** Fix reporting not found modules if generate-off, bug403. [Jeremy Bennett] diff --git a/bin/verilator b/bin/verilator index 62c7a6250..3e1c42628 100755 --- a/bin/verilator +++ b/bin/verilator @@ -569,10 +569,7 @@ Displays this message and program version and exits. =item -II -Add the directory to the list of directories that should be searched for -include directories or libraries. Same as +incdir and -y; +incdir and -y -are fairly standard across Verilog tools while -I is an alias for GCC -compatibility. +See -y. =item --if-depth I @@ -581,10 +578,7 @@ defaults to 0 which disables this warning. =item +incdir+I -Add the directory to the list of directories that should be searched for -include directories or libraries. Same as -I and -y; +incdir and -y -are fairly standard across Verilog tools while -I is an alias for GCC -compatibility. +See -y. =item --inhibit-sim @@ -973,9 +967,14 @@ enable rerunning with that same seed so you can reproduce bugs. =item -y I Add the directory to the list of directories that should be searched for -include directories or libraries. Same as +incdir and -I; +incdir and +y -are fairly standard across Verilog tools while -I is an alias for GCC -compatibility. +include files or libraries. The three flags -y, +incdir and -I have +similar effect; +incdir and +y are fairly standard across Verilog tools while -I +is an alias for GCC compatibility. + +Verilator defaults to the current directory ("-y .") and any specified +--Mdir, though these default paths are used after any user specified +directories. This allows "-y `pwd`" to be used if absolute filenames are +desired for error messages instead of relative filenames. =back diff --git a/src/V3Options.cpp b/src/V3Options.cpp index 9e4824885..61cc0fee9 100644 --- a/src/V3Options.cpp +++ b/src/V3Options.cpp @@ -51,17 +51,29 @@ struct V3OptionsImp { // STATE list m_allArgs; // List of every argument encountered - list m_incDirs; // Include directories (ordered) - set m_incDirSet; // Include directories (for removing duplicates) + list m_incDirUsers; // Include directories (ordered) + set m_incDirUserSet; // Include directories (for removing duplicates) + list m_incDirFallbacks; // Include directories (ordered) + set m_incDirFallbackSet; // Include directories (for removing duplicates) list m_libExts; // Library extensions (ordered) set m_libExtSet; // Library extensions (for removing duplicates) DirMap m_dirMap; // Directory listing // ACCESSOR METHODS - void addIncDir(const string& incdir) { - if (m_incDirSet.find(incdir) == m_incDirSet.end()) { - m_incDirSet.insert(incdir); - m_incDirs.push_back(incdir); + void addIncDirUser(const string& incdir) { + if (m_incDirUserSet.find(incdir) == m_incDirUserSet.end()) { + m_incDirUserSet.insert(incdir); + m_incDirUsers.push_back(incdir); + m_incDirFallbacks.remove(incdir); // User has priority over Fallback + m_incDirFallbackSet.erase(incdir); // User has priority over Fallback + } + } + void addIncDirFallback(const string& incdir) { + if (m_incDirUserSet.find(incdir) == m_incDirUserSet.end()) { // User has priority over Fallback + if (m_incDirFallbackSet.find(incdir) == m_incDirFallbackSet.end()) { + m_incDirFallbackSet.insert(incdir); + m_incDirFallbacks.push_back(incdir); + } } } void addLibExt(const string& libext) { @@ -73,8 +85,11 @@ struct V3OptionsImp { V3OptionsImp() {} }; -void V3Options::addIncDir(const string& incdir) { - m_impp->addIncDir(incdir); +void V3Options::addIncDirUser(const string& incdir) { + m_impp->addIncDirUser(incdir); +} +void V3Options::addIncDirFallback(const string& incdir) { + m_impp->addIncDirFallback(incdir); } void V3Options::addLibExt(const string& libext) { m_impp->addLibExt(libext); @@ -288,21 +303,33 @@ string V3Options::fileExists (const string& filename) { return filenameOut; } +string V3Options::filePathCheckOneDir(const string& modname, const string& dirname) { + for (list::iterator extIter=m_impp->m_libExts.begin(); extIter!=m_impp->m_libExts.end(); ++extIter) { + string fn = filenameFromDirBase(dirname, modname+*extIter); + string exists = fileExists(fn); + if (exists!="") { + // Strip ./, it just looks ugly + if (exists.substr(0,2)=="./") exists.erase(0,2); + return exists; + } + } + return ""; +} + string V3Options::filePath (FileLine* fl, const string& modname, const string& errmsg) { // Error prefix or "" to suppress error // Find a filename to read the specified module name, // using the incdir and libext's. // Return "" if not found. - for (list::iterator dirIter=m_impp->m_incDirs.begin(); dirIter!=m_impp->m_incDirs.end(); ++dirIter) { - for (list::iterator extIter=m_impp->m_libExts.begin(); extIter!=m_impp->m_libExts.end(); ++extIter) { - string fn = filenameFromDirBase(*dirIter,modname+*extIter); - string exists = fileExists(fn); - if (exists!="") { - // Strip ./, it just looks ugly - if (exists.substr(0,2)=="./") exists.erase(0,2); - return exists; - } - } + for (list::iterator dirIter=m_impp->m_incDirUsers.begin(); + dirIter!=m_impp->m_incDirUsers.end(); ++dirIter) { + string exists = filePathCheckOneDir(modname, *dirIter); + if (exists!="") return exists; + } + for (list::iterator dirIter=m_impp->m_incDirFallbacks.begin(); + dirIter!=m_impp->m_incDirFallbacks.end(); ++dirIter) { + string exists = filePathCheckOneDir(modname, *dirIter); + if (exists!="") return exists; } // Warn and return not found @@ -317,15 +344,22 @@ void V3Options::filePathLookedMsg(FileLine* fl, const string& modname) { static bool shown_notfound_msg = false; if (!shown_notfound_msg) { shown_notfound_msg = true; - if (m_impp->m_incDirs.empty()) { + if (m_impp->m_incDirUsers.empty()) { fl->v3error("This may be because there's no search path specified with -I."<v3error("Looked in:"<::iterator dirIter=m_impp->m_incDirs.begin(); dirIter!=m_impp->m_incDirs.end(); ++dirIter) { - for (list::iterator extIter=m_impp->m_libExts.begin(); extIter!=m_impp->m_libExts.end(); ++extIter) { - string fn = filenameFromDirBase(*dirIter,modname+*extIter); - fl->v3error(" "<v3error("Looked in:"<::iterator dirIter=m_impp->m_incDirUsers.begin(); + dirIter!=m_impp->m_incDirUsers.end(); ++dirIter) { + for (list::iterator extIter=m_impp->m_libExts.begin(); extIter!=m_impp->m_libExts.end(); ++extIter) { + string fn = filenameFromDirBase(*dirIter,modname+*extIter); + fl->v3error(" "<::iterator dirIter=m_impp->m_incDirFallbacks.begin(); + dirIter!=m_impp->m_incDirFallbacks.end(); ++dirIter) { + for (list::iterator extIter=m_impp->m_libExts.begin(); extIter!=m_impp->m_libExts.end(); ++extIter) { + string fn = filenameFromDirBase(*dirIter,modname+*extIter); + fl->v3error(" "<v3fatal ("Invalid Option: "<$Self->{v3}, nc=>0, # Need to get it not to give the prompt expect=> -'%Error: Specified --top-module \'a\' isn.t at the top level, it.s under another cell. +'%Error: Specified --top-module \'a\' isn.t at the top level, it.s under another cell \'a_top\' %Error: Exiting due to.*', ); diff --git a/test_regress/t/t_gen_missing_bad.pl b/test_regress/t/t_gen_missing_bad.pl index 491c56046..7710a9ab5 100755 --- a/test_regress/t/t_gen_missing_bad.pl +++ b/test_regress/t/t_gen_missing_bad.pl @@ -16,9 +16,9 @@ compile ( expect=> '%Error: t/t_gen_missing.v:\d+: Cannot find file containing module: foo_not_needed %Error: t/t_gen_missing.v:\d+: Looked in: -%Error: t/t_gen_missing.v:\d+: foo_not_needed -%Error: t/t_gen_missing.v:\d+: foo_not_needed.v -%Error: t/t_gen_missing.v:\d+: foo_not_needed.sv +%Error: t/t_gen_missing.v:\d+: t/foo_not_needed +%Error: t/t_gen_missing.v:\d+: t/foo_not_needed.v +%Error: t/t_gen_missing.v:\d+: t/foo_not_needed.sv .*%Error: Exiting due to.*', );