forked from github/verilator
Add --relative-includes.
This commit is contained in:
parent
15082a178b
commit
0adb789238
2
Changes
2
Changes
@ -7,6 +7,8 @@ The contributors that suggested a given feature are shown in []. Thanks!
|
|||||||
|
|
||||||
** Add -FI option to force includes,msg2146. [Amir Gonnen]
|
** Add -FI option to force includes,msg2146. [Amir Gonnen]
|
||||||
|
|
||||||
|
** Add --relative-includes. [Rob Stoddard]
|
||||||
|
|
||||||
**** Fix 2009 localparam syntax, msg2139. [Galen Seitz]
|
**** Fix 2009 localparam syntax, msg2139. [Galen Seitz]
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,6 +132,8 @@ DISTFILES_INC = $(INFOS) .gitignore Artistic COPYING COPYING.LESSER \
|
|||||||
test_verilated/vgen*.pl \
|
test_verilated/vgen*.pl \
|
||||||
test_regress/t/t*/*.sv* \
|
test_regress/t/t*/*.sv* \
|
||||||
test_regress/t/t*/*.v* \
|
test_regress/t/t*/*.v* \
|
||||||
|
test_regress/t/t*/*/*.sv* \
|
||||||
|
test_regress/t/t*/*/*.v* \
|
||||||
test_regress/t/*.cpp \
|
test_regress/t/*.cpp \
|
||||||
test_regress/t/*.h \
|
test_regress/t/*.h \
|
||||||
test_regress/t/*.dat \
|
test_regress/t/*.dat \
|
||||||
|
@ -324,6 +324,7 @@ descriptions in the next sections for more information.
|
|||||||
--private Debugging; see docs
|
--private Debugging; see docs
|
||||||
--public Debugging; see docs
|
--public Debugging; see docs
|
||||||
-pvalue+<name>=<value> Overwrite toplevel parameter
|
-pvalue+<name>=<value> Overwrite toplevel parameter
|
||||||
|
--relative-includes Resolve includes relative to current file
|
||||||
--report-unoptflat Extra diagnostics for UNOPTFLAT
|
--report-unoptflat Extra diagnostics for UNOPTFLAT
|
||||||
--savable Enable model save-restore
|
--savable Enable model save-restore
|
||||||
--sc Create SystemC output
|
--sc Create SystemC output
|
||||||
@ -1023,6 +1024,12 @@ inlining. This will also turn off inlining as if all modules had a
|
|||||||
Overwrites the given parameter(s) of the toplevel module. See -G for a
|
Overwrites the given parameter(s) of the toplevel module. See -G for a
|
||||||
detailed description.
|
detailed description.
|
||||||
|
|
||||||
|
=item --relative-includes
|
||||||
|
|
||||||
|
When a file references an include file, resolve the filename relative to
|
||||||
|
the path of the referencing file, instead of relative to the current
|
||||||
|
directory.
|
||||||
|
|
||||||
=item --report-unoptflat
|
=item --report-unoptflat
|
||||||
|
|
||||||
Extra diagnostics for UNOPTFLAT warnings. This includes for each loop, the
|
Extra diagnostics for UNOPTFLAT warnings. This includes for each loop, the
|
||||||
|
@ -339,7 +339,7 @@ string V3Options::filePathCheckOneDir(const string& modname, const string& dirna
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
string V3Options::filePath (FileLine* fl, const string& modname,
|
string V3Options::filePath (FileLine* fl, const string& modname, const string& lastpath,
|
||||||
const string& errmsg) { // Error prefix or "" to suppress error
|
const string& errmsg) { // Error prefix or "" to suppress error
|
||||||
// Find a filename to read the specified module name,
|
// Find a filename to read the specified module name,
|
||||||
// using the incdir and libext's.
|
// using the incdir and libext's.
|
||||||
@ -355,6 +355,11 @@ string V3Options::filePath (FileLine* fl, const string& modname,
|
|||||||
if (exists!="") return exists;
|
if (exists!="") return exists;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_relativeIncludes) {
|
||||||
|
string exists = filePathCheckOneDir(modname, lastpath);
|
||||||
|
if (exists!="") return V3Os::filenameRealPath(exists);
|
||||||
|
}
|
||||||
|
|
||||||
// Warn and return not found
|
// Warn and return not found
|
||||||
if (errmsg != "") {
|
if (errmsg != "") {
|
||||||
fl->v3error(errmsg+modname);
|
fl->v3error(errmsg+modname);
|
||||||
@ -710,6 +715,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc, char
|
|||||||
else if ( onoff (sw, "-public", flag/*ref*/) ) { m_public = flag; }
|
else if ( onoff (sw, "-public", flag/*ref*/) ) { m_public = flag; }
|
||||||
else if ( !strncmp(sw, "-pvalue+", strlen("-pvalue+"))) { addParameter(string(sw+strlen("-pvalue+")), false); }
|
else if ( !strncmp(sw, "-pvalue+", strlen("-pvalue+"))) { addParameter(string(sw+strlen("-pvalue+")), false); }
|
||||||
else if ( onoff (sw, "-report-unoptflat", flag/*ref*/) ) { m_reportUnoptflat = flag; }
|
else if ( onoff (sw, "-report-unoptflat", flag/*ref*/) ) { m_reportUnoptflat = flag; }
|
||||||
|
else if ( onoff (sw, "-relative-includes", flag/*ref*/) ) { m_relativeIncludes = flag; }
|
||||||
else if ( onoff (sw, "-savable", flag/*ref*/) ) { m_savable = flag; }
|
else if ( onoff (sw, "-savable", flag/*ref*/) ) { m_savable = flag; }
|
||||||
else if ( !strcmp (sw, "-sc") ) { m_outFormatOk = true; m_systemC = true; m_systemPerl = false; }
|
else if ( !strcmp (sw, "-sc") ) { m_outFormatOk = true; m_systemC = true; m_systemPerl = false; }
|
||||||
else if ( onoff (sw, "-skip-identical", flag/*ref*/) ) { m_skipIdentical = flag; }
|
else if ( onoff (sw, "-skip-identical", flag/*ref*/) ) { m_skipIdentical = flag; }
|
||||||
@ -1226,6 +1232,7 @@ V3Options::V3Options() {
|
|||||||
m_preprocNoLine = false;
|
m_preprocNoLine = false;
|
||||||
m_public = false;
|
m_public = false;
|
||||||
m_reportUnoptflat = false;
|
m_reportUnoptflat = false;
|
||||||
|
m_relativeIncludes = false;
|
||||||
m_savable = false;
|
m_savable = false;
|
||||||
m_skipIdentical = true;
|
m_skipIdentical = true;
|
||||||
m_stats = false;
|
m_stats = false;
|
||||||
|
@ -89,6 +89,7 @@ class V3Options {
|
|||||||
bool m_profileCFuncs;// main switch: --profile-cfuncs
|
bool m_profileCFuncs;// main switch: --profile-cfuncs
|
||||||
bool m_public; // main switch: --public
|
bool m_public; // main switch: --public
|
||||||
bool m_reportUnoptflat; // main switch: --report-unoptflat
|
bool m_reportUnoptflat; // main switch: --report-unoptflat
|
||||||
|
bool m_relativeIncludes; // main switch: --relative-includes
|
||||||
bool m_savable; // main switch: --savable
|
bool m_savable; // main switch: --savable
|
||||||
bool m_systemC; // main switch: --sc: System C instead of simple C++
|
bool m_systemC; // main switch: --sc: System C instead of simple C++
|
||||||
bool m_skipIdentical;// main switch: --skip-identical
|
bool m_skipIdentical;// main switch: --skip-identical
|
||||||
@ -344,7 +345,7 @@ class V3Options {
|
|||||||
|
|
||||||
// METHODS (file utilities using these options)
|
// METHODS (file utilities using these options)
|
||||||
string fileExists (const string& filename);
|
string fileExists (const string& filename);
|
||||||
string filePath (FileLine* fl, const string& modname, const string& errmsg);
|
string filePath(FileLine* fl, const string& modname, const string& lastpath, const string& errmsg);
|
||||||
void filePathLookedMsg(FileLine* fl, const string& modname);
|
void filePathLookedMsg(FileLine* fl, const string& modname);
|
||||||
V3LangCode fileLanguage(const string &filename);
|
V3LangCode fileLanguage(const string &filename);
|
||||||
static bool fileStatDir (const string& filename);
|
static bool fileStatDir (const string& filename);
|
||||||
|
10
src/V3Os.cpp
10
src/V3Os.cpp
@ -25,6 +25,8 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <climits>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
@ -141,6 +143,14 @@ string V3Os::filenameSubstitute (const string& filename) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string V3Os::filenameRealPath(const string& filename) {
|
||||||
|
// Get rid of all the ../ behavior in the middle of the paths.
|
||||||
|
// If there is a ../ that goes down from the 'root' of this path it is preserved.
|
||||||
|
char retpath[PATH_MAX];
|
||||||
|
realpath(filename.c_str(), retpath);
|
||||||
|
return string(retpath);
|
||||||
|
}
|
||||||
|
|
||||||
bool V3Os::filenameIsRel(const string& filename) {
|
bool V3Os::filenameIsRel(const string& filename) {
|
||||||
return (filename.length()>0 && filename[0] != '/');
|
return (filename.length()>0 && filename[0] != '/');
|
||||||
}
|
}
|
||||||
|
@ -41,6 +41,7 @@ public:
|
|||||||
static string filenameNonDirExt (const string& filename) { return filenameNonExt(filenameNonDir(filename)); } ///< Return basename of filename
|
static string filenameNonDirExt (const string& filename) { return filenameNonExt(filenameNonDir(filename)); } ///< Return basename of filename
|
||||||
static string filenameDir (const string& filename); ///< Return directory part of filename
|
static string filenameDir (const string& filename); ///< Return directory part of filename
|
||||||
static string filenameSubstitute (const string& filename); ///< Return filename with env vars removed
|
static string filenameSubstitute (const string& filename); ///< Return filename with env vars removed
|
||||||
|
static string filenameRealPath(const string& fn); ///< Return realpath of filename
|
||||||
static bool filenameIsRel (const string& filename); ///< True if relative
|
static bool filenameIsRel (const string& filename); ///< True if relative
|
||||||
|
|
||||||
// METHODS (directory utilities)
|
// METHODS (directory utilities)
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "V3PreProc.h"
|
#include "V3PreProc.h"
|
||||||
#include "V3File.h"
|
#include "V3File.h"
|
||||||
#include "V3Parse.h"
|
#include "V3Parse.h"
|
||||||
|
#include "V3Os.h"
|
||||||
|
|
||||||
//######################################################################
|
//######################################################################
|
||||||
|
|
||||||
@ -102,7 +103,7 @@ protected:
|
|||||||
|
|
||||||
// Preprocess
|
// Preprocess
|
||||||
s_filterp = filterp;
|
s_filterp = filterp;
|
||||||
bool ok = preprocOpen(fl, s_filterp, modname, errmsg);
|
bool ok = preprocOpen(fl, s_filterp, modname, "", errmsg);
|
||||||
if (!ok) return false;
|
if (!ok) return false;
|
||||||
|
|
||||||
while (!s_preprocp->isEof()) {
|
while (!s_preprocp->isEof()) {
|
||||||
@ -116,10 +117,10 @@ protected:
|
|||||||
if (modname[0]=='/' || modname[0]=='\\') {
|
if (modname[0]=='/' || modname[0]=='\\') {
|
||||||
fl->v3warn(INCABSPATH,"Suggest `include with absolute path be made relative, and use +include: "<<modname);
|
fl->v3warn(INCABSPATH,"Suggest `include with absolute path be made relative, and use +include: "<<modname);
|
||||||
}
|
}
|
||||||
preprocOpen(fl, s_filterp, modname, "Cannot find include file: ");
|
preprocOpen(fl, s_filterp, modname, V3Os::filenameDir(fl->filename()), "Cannot find include file: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool preprocOpen (FileLine* fl, V3InFilter* filterp, const string& modname,
|
bool preprocOpen (FileLine* fl, V3InFilter* filterp, const string& modname, const string& lastpath,
|
||||||
const string& errmsg) { // Error message or "" to suppress
|
const string& errmsg) { // Error message or "" to suppress
|
||||||
// Returns true if successful
|
// Returns true if successful
|
||||||
// Allow user to put `defined names on the command line instead of filenames,
|
// Allow user to put `defined names on the command line instead of filenames,
|
||||||
@ -127,7 +128,7 @@ protected:
|
|||||||
string ppmodname = s_preprocp->removeDefines (modname);
|
string ppmodname = s_preprocp->removeDefines (modname);
|
||||||
|
|
||||||
// Open include or master file
|
// Open include or master file
|
||||||
string filename = v3Global.opt.filePath (fl, ppmodname, errmsg);
|
string filename = v3Global.opt.filePath (fl, ppmodname, lastpath, errmsg);
|
||||||
if (filename=="") return false; // Not found
|
if (filename=="") return false; // Not found
|
||||||
|
|
||||||
UINFO(2," Reading "<<filename<<endl);
|
UINFO(2," Reading "<<filename<<endl);
|
||||||
|
21
test_regress/t/t_flag_relinc.pl
Executable file
21
test_regress/t/t_flag_relinc.pl
Executable file
@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2003 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
|
||||||
|
$Self->{vlt} or $Self->skip("Verilator only test");
|
||||||
|
|
||||||
|
compile (
|
||||||
|
v_flags2 => ["--relative-includes",
|
||||||
|
"--lint-only $Self->{t_dir}/t_flag_relinc_dir/chip/t_flag_relinc_sub.v"],
|
||||||
|
make_top_shell => 0,
|
||||||
|
make_main => 0,
|
||||||
|
verilator_make_gcc => 0,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
10
test_regress/t/t_flag_relinc.v
Normal file
10
test_regress/t/t_flag_relinc.v
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// Copyright 2017 by Wilson Snyder. This program is free software; you can
|
||||||
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
// Version 2.0.
|
||||||
|
|
||||||
|
module t;
|
||||||
|
t_flag_relinc_sub sub ();
|
||||||
|
endmodule
|
15
test_regress/t/t_flag_relinc_dir/chip/t_flag_relinc_sub.v
Normal file
15
test_regress/t/t_flag_relinc_dir/chip/t_flag_relinc_sub.v
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// Copyright 2017 by Wilson Snyder. This program is free software; you can
|
||||||
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
// Version 2.0.
|
||||||
|
|
||||||
|
`include "../include/t_flag_relinc.vh"
|
||||||
|
|
||||||
|
module t_flag_relinc_sub ();
|
||||||
|
initial begin
|
||||||
|
`all_finished;
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endmodule
|
@ -0,0 +1,8 @@
|
|||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// Copyright 2017 by Wilson Snyder. This program is free software; you can
|
||||||
|
// redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
// Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
// Version 2.0.
|
||||||
|
|
||||||
|
`define all_finished $write("*-* All Finished *-*\n")
|
Loading…
Reference in New Issue
Block a user