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.*',
);