mirror of
https://github.com/verilator/verilator.git
synced 2025-01-03 21:27:35 +00:00
Change VL_THREADED to use C++11, and compute and test related GCC flags automatically
This commit is contained in:
parent
6bd47b54df
commit
3c1b82255e
2
Changes
2
Changes
@ -17,6 +17,8 @@ The contributors that suggested a given feature are shown in []. Thanks!
|
|||||||
|
|
||||||
**** The internal test_verilated test directory is moved to be part of test_regress.
|
**** The internal test_verilated test directory is moved to be part of test_regress.
|
||||||
|
|
||||||
|
**** The experimental VL_THREADED setting (only, not normal mode) now requires C++11.
|
||||||
|
|
||||||
**** Fix over-aggressive inlining, bug1223. [John Coiner]
|
**** Fix over-aggressive inlining, bug1223. [John Coiner]
|
||||||
|
|
||||||
**** Fix Ubuntu 17.10 issues, bug1223 partial. [John Coiner]
|
**** Fix Ubuntu 17.10 issues, bug1223 partial. [John Coiner]
|
||||||
|
@ -39,5 +39,6 @@ nodist/
|
|||||||
/vc_hdrs.h$
|
/vc_hdrs.h$
|
||||||
/csrc/
|
/csrc/
|
||||||
doxygen-doc/.*
|
doxygen-doc/.*
|
||||||
|
obj_dir/.*
|
||||||
TAGS
|
TAGS
|
||||||
.*~
|
.*~
|
||||||
|
32
configure.ac
32
configure.ac
@ -140,10 +140,12 @@ AC_DEFUN([_MY_CXX_CHECK_FLAG],
|
|||||||
|
|
||||||
AC_DEFUN([_MY_CXX_CHECK_SET],
|
AC_DEFUN([_MY_CXX_CHECK_SET],
|
||||||
[# _MY_CXX_CHECK_SET(variable,flag) -- Check if compiler supports specific options
|
[# _MY_CXX_CHECK_SET(variable,flag) -- Check if compiler supports specific options
|
||||||
# If it does, set variable to flag
|
# If it does, set variable to flag, only if not previously set
|
||||||
_MY_CXX_CHECK_FLAG($2)
|
if test "$$1" = ""; then
|
||||||
if test "$_my_result" = "yes" ; then
|
_MY_CXX_CHECK_FLAG($2)
|
||||||
$1="$$1 $2"
|
if test "$_my_result" = "yes" ; then
|
||||||
|
$1="$2"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -156,6 +158,28 @@ AC_DEFUN([_MY_CXX_CHECK_OPT],
|
|||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
# Flag to select newest language standard supported
|
||||||
|
# Macros work such that first option that passes is the one we take
|
||||||
|
# gnu++14 is the newest that Verilator supports
|
||||||
|
# std++03 is the oldest that Verilator supports
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=gnu++03)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_NEWEST,-std=c++03)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_STD_NEWEST)
|
||||||
|
# And likewise oldest standard (same list above, backwards)
|
||||||
|
# This is used for internal testing
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=std++03)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=std++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=std++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++03)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++11)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++14)
|
||||||
|
_MY_CXX_CHECK_SET(CFG_CXXFLAGS_STD_OLDEST,-std=gnu++17)
|
||||||
|
AC_SUBST(CFG_CXXFLAGS_STD_OLDEST)
|
||||||
|
|
||||||
# Flags for compiling Verilator internals including parser, and Verilated files
|
# Flags for compiling Verilator internals including parser, and Verilated files
|
||||||
# These turn on extra warnings and are only used with 'configure --enable-ccwarn'
|
# These turn on extra warnings and are only used with 'configure --enable-ccwarn'
|
||||||
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wextra)
|
_MY_CXX_CHECK_OPT(CFG_CXXFLAGS_WEXTRA,-Wextra)
|
||||||
|
@ -25,7 +25,6 @@ CPPFLAGS += -MMD -MP
|
|||||||
CPPFLAGS += -DVL_DEBUG=1
|
CPPFLAGS += -DVL_DEBUG=1
|
||||||
# Turn on some more flags (when configured appropriately)
|
# Turn on some more flags (when configured appropriately)
|
||||||
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
CPPFLAGS += -DVL_THREADED=1
|
|
||||||
CPPFLAGS += -W -Werror -Wall
|
CPPFLAGS += -W -Werror -Wall
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ CPPFLAGS += -DVL_DEBUG=1
|
|||||||
CPPFLAGS += -Wno-deprecated
|
CPPFLAGS += -Wno-deprecated
|
||||||
# Turn on some more flags (when configured appropriately)
|
# Turn on some more flags (when configured appropriately)
|
||||||
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
ifeq ($(CFG_WITH_CCWARN),yes) # Local... Else don't burden users
|
||||||
CPPFLAGS += -DVL_THREADED=1
|
|
||||||
CPPFLAGS += -W -Werror -Wall
|
CPPFLAGS += -W -Werror -Wall
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -37,9 +37,9 @@ VerilatedVoidCb Verilated::s_flushCb = NULL;
|
|||||||
|
|
||||||
// Keep below together in one cache line
|
// Keep below together in one cache line
|
||||||
Verilated::Serialized Verilated::s_s;
|
Verilated::Serialized Verilated::s_s;
|
||||||
VL_THREAD const VerilatedScope* Verilated::t_dpiScopep = NULL;
|
VL_THREAD_LOCAL const VerilatedScope* Verilated::t_dpiScopep = NULL;
|
||||||
VL_THREAD const char* Verilated::t_dpiFilename = "";
|
VL_THREAD_LOCAL const char* Verilated::t_dpiFilename = "";
|
||||||
VL_THREAD int Verilated::t_dpiLineno = 0;
|
VL_THREAD_LOCAL int Verilated::t_dpiLineno = 0;
|
||||||
struct Verilated::CommandArgValues Verilated::s_args = {0, NULL};
|
struct Verilated::CommandArgValues Verilated::s_args = {0, NULL};
|
||||||
|
|
||||||
VerilatedImp VerilatedImp::s_s;
|
VerilatedImp VerilatedImp::s_s;
|
||||||
@ -372,8 +372,8 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) {
|
|||||||
// Note uses a single buffer internally; presumes only one usage per printf
|
// Note uses a single buffer internally; presumes only one usage per printf
|
||||||
// Note also assumes variables < 64 are not wide, this assumption is
|
// Note also assumes variables < 64 are not wide, this assumption is
|
||||||
// sometimes not true in low-level routines written here in verilated.cpp
|
// sometimes not true in low-level routines written here in verilated.cpp
|
||||||
static VL_THREAD char tmp[VL_VALUE_STRING_MAX_WIDTH];
|
static VL_THREAD_LOCAL char tmp[VL_VALUE_STRING_MAX_WIDTH];
|
||||||
static VL_THREAD char tmpf[VL_VALUE_STRING_MAX_WIDTH];
|
static VL_THREAD_LOCAL char tmpf[VL_VALUE_STRING_MAX_WIDTH];
|
||||||
const char* pctp = NULL; // Most recent %##.##g format
|
const char* pctp = NULL; // Most recent %##.##g format
|
||||||
bool inPct = false;
|
bool inPct = false;
|
||||||
bool widthSet = false;
|
bool widthSet = false;
|
||||||
@ -657,7 +657,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf
|
|||||||
// Read a Verilog $sscanf/$fscanf style format into the output list
|
// Read a Verilog $sscanf/$fscanf style format into the output list
|
||||||
// The format must be pre-processed (and lower cased) by Verilator
|
// The format must be pre-processed (and lower cased) by Verilator
|
||||||
// Arguments are in "width, arg-value (or WDataIn* if wide)" form
|
// Arguments are in "width, arg-value (or WDataIn* if wide)" form
|
||||||
static VL_THREAD char tmp[VL_VALUE_STRING_MAX_WIDTH];
|
static VL_THREAD_LOCAL char tmp[VL_VALUE_STRING_MAX_WIDTH];
|
||||||
int floc = fbits - 1;
|
int floc = fbits - 1;
|
||||||
IData got = 0;
|
IData got = 0;
|
||||||
bool inPct = false;
|
bool inPct = false;
|
||||||
@ -881,7 +881,7 @@ void VL_FCLOSE_I(IData fdi) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_SFORMAT_X(int obits, CData& destr, const char* formatp, ...) {
|
void VL_SFORMAT_X(int obits, CData& destr, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -892,7 +892,7 @@ void VL_SFORMAT_X(int obits, CData& destr, const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_SFORMAT_X(int obits, SData& destr, const char* formatp, ...) {
|
void VL_SFORMAT_X(int obits, SData& destr, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -903,7 +903,7 @@ void VL_SFORMAT_X(int obits, SData& destr, const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_SFORMAT_X(int obits, IData& destr, const char* formatp, ...) {
|
void VL_SFORMAT_X(int obits, IData& destr, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -914,7 +914,7 @@ void VL_SFORMAT_X(int obits, IData& destr, const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_SFORMAT_X(int obits, QData& destr, const char* formatp, ...) {
|
void VL_SFORMAT_X(int obits, QData& destr, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -925,7 +925,7 @@ void VL_SFORMAT_X(int obits, QData& destr, const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_SFORMAT_X(int obits, void* destp, const char* formatp, ...) {
|
void VL_SFORMAT_X(int obits, void* destp, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -945,7 +945,7 @@ void VL_SFORMAT_X(int obits_ignored, std::string &output, const char* formatp, .
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string VL_SFORMATF_NX(const char* formatp, ...) {
|
std::string VL_SFORMATF_NX(const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -956,7 +956,7 @@ std::string VL_SFORMATF_NX(const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_WRITEF(const char* formatp, ...) {
|
void VL_WRITEF(const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
@ -968,7 +968,7 @@ void VL_WRITEF(const char* formatp, ...) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void VL_FWRITEF(IData fpi, const char* formatp, ...) {
|
void VL_FWRITEF(IData fpi, const char* formatp, ...) {
|
||||||
VL_STATIC_OR_THREAD std::string output; // static only for speed
|
static VL_THREAD_LOCAL std::string output; // static only for speed
|
||||||
output = "";
|
output = "";
|
||||||
FILE* fp = VL_CVT_I_FP(fpi);
|
FILE* fp = VL_CVT_I_FP(fpi);
|
||||||
if (VL_UNLIKELY(!fp)) return;
|
if (VL_UNLIKELY(!fp)) return;
|
||||||
@ -1247,7 +1247,7 @@ IData VL_VALUEPLUSARGS_INN(int, const std::string& ld, std::string& rdr) {
|
|||||||
|
|
||||||
const char* vl_mc_scan_plusargs(const char* prefixp) {
|
const char* vl_mc_scan_plusargs(const char* prefixp) {
|
||||||
const std::string& match = VerilatedImp::argPlusMatch(prefixp);
|
const std::string& match = VerilatedImp::argPlusMatch(prefixp);
|
||||||
static VL_THREAD char outstr[VL_VALUE_STRING_MAX_WIDTH];
|
static VL_THREAD_LOCAL char outstr[VL_VALUE_STRING_MAX_WIDTH];
|
||||||
if (match == "") return NULL;
|
if (match == "") return NULL;
|
||||||
strncpy(outstr, match.c_str()+strlen(prefixp)+1, // +1 to skip the "+"
|
strncpy(outstr, match.c_str()+strlen(prefixp)+1, // +1 to skip the "+"
|
||||||
VL_VALUE_STRING_MAX_WIDTH);
|
VL_VALUE_STRING_MAX_WIDTH);
|
||||||
@ -1315,7 +1315,7 @@ void Verilated::commandArgs(int argc, const char** argv) {
|
|||||||
|
|
||||||
const char* Verilated::commandArgsPlusMatch(const char* prefixp) {
|
const char* Verilated::commandArgsPlusMatch(const char* prefixp) {
|
||||||
const std::string& match = VerilatedImp::argPlusMatch(prefixp);
|
const std::string& match = VerilatedImp::argPlusMatch(prefixp);
|
||||||
static VL_THREAD char outstr[VL_VALUE_STRING_MAX_WIDTH];
|
static VL_THREAD_LOCAL char outstr[VL_VALUE_STRING_MAX_WIDTH];
|
||||||
if (match == "") return "";
|
if (match == "") return "";
|
||||||
strncpy(outstr, match.c_str(), VL_VALUE_STRING_MAX_WIDTH);
|
strncpy(outstr, match.c_str(), VL_VALUE_STRING_MAX_WIDTH);
|
||||||
outstr[VL_VALUE_STRING_MAX_WIDTH-1] = '\0';
|
outstr[VL_VALUE_STRING_MAX_WIDTH-1] = '\0';
|
||||||
|
@ -234,9 +234,9 @@ class Verilated {
|
|||||||
Serialized();
|
Serialized();
|
||||||
} s_s;
|
} s_s;
|
||||||
|
|
||||||
static VL_THREAD const VerilatedScope* t_dpiScopep; ///< DPI context scope
|
static VL_THREAD_LOCAL const VerilatedScope* t_dpiScopep; ///< DPI context scope
|
||||||
static VL_THREAD const char* t_dpiFilename; ///< DPI context filename
|
static VL_THREAD_LOCAL const char* t_dpiFilename; ///< DPI context filename
|
||||||
static VL_THREAD int t_dpiLineno; ///< DPI context line number
|
static VL_THREAD_LOCAL int t_dpiLineno; ///< DPI context line number
|
||||||
|
|
||||||
// no need to be save-restored (serialized) the
|
// no need to be save-restored (serialized) the
|
||||||
// assumption is that the restore is allowed to pass different arguments
|
// assumption is that the restore is allowed to pass different arguments
|
||||||
|
@ -16,6 +16,10 @@ RANLIB = ranlib
|
|||||||
CFG_WITH_CCWARN = @CFG_WITH_CCWARN@
|
CFG_WITH_CCWARN = @CFG_WITH_CCWARN@
|
||||||
CFG_WITH_LONGTESTS = @CFG_WITH_LONGTESTS@
|
CFG_WITH_LONGTESTS = @CFG_WITH_LONGTESTS@
|
||||||
|
|
||||||
|
# Select newest language
|
||||||
|
CFG_CXXFLAGS_STD_NEWEST = @CFG_CXXFLAGS_STD_NEWEST@
|
||||||
|
# Select oldest language (for Verilator internal testing only)
|
||||||
|
CFG_CXXFLAGS_STD_OLDEST = @CFG_CXXFLAGS_STD_OLDEST@
|
||||||
# Compiler flags to use to turn off unused and generated code warnings, such as -Wno-div-by-zero
|
# Compiler flags to use to turn off unused and generated code warnings, such as -Wno-div-by-zero
|
||||||
CFG_CXXFLAGS_NO_UNUSED = @CFG_CXXFLAGS_NO_UNUSED@
|
CFG_CXXFLAGS_NO_UNUSED = @CFG_CXXFLAGS_NO_UNUSED@
|
||||||
# Compiler flags that turn on extra warnings
|
# Compiler flags that turn on extra warnings
|
||||||
|
@ -721,9 +721,9 @@ void vpi_put_delays(vpiHandle object, p_vpi_delay delay_p) {
|
|||||||
// value processing
|
// value processing
|
||||||
|
|
||||||
void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
||||||
static VL_THREAD char outStr[1+VL_MULS_MAX_WORDS*32]; // Maximum required size is for binary string, one byte per bit plus null termination
|
static VL_THREAD_LOCAL char outStr[1+VL_MULS_MAX_WORDS*32]; // Maximum required size is for binary string, one byte per bit plus null termination
|
||||||
// cppcheck-suppress variableScope
|
// cppcheck-suppress variableScope
|
||||||
static VL_THREAD int outStrSz = sizeof(outStr)-1;
|
static VL_THREAD_LOCAL int outStrSz = sizeof(outStr)-1;
|
||||||
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: vpi_get_value %p\n",object););
|
VL_DEBUG_IF_PLI(VL_PRINTF("-vltVpi: vpi_get_value %p\n",object););
|
||||||
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
_VL_VPI_ERROR_RESET(); // reset vpi error status
|
||||||
if (VL_UNLIKELY(!value_p)) return;
|
if (VL_UNLIKELY(!value_p)) return;
|
||||||
@ -733,7 +733,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
if (value_p->format == vpiVectorVal) {
|
if (value_p->format == vpiVectorVal) {
|
||||||
// Vector pointer must come from our memory pool
|
// Vector pointer must come from our memory pool
|
||||||
// It only needs to persist until the next vpi_get_value
|
// It only needs to persist until the next vpi_get_value
|
||||||
static VL_THREAD t_vpi_vecval out[VL_MULS_MAX_WORDS*2];
|
static VL_THREAD_LOCAL t_vpi_vecval out[VL_MULS_MAX_WORDS*2];
|
||||||
value_p->value.vector = out;
|
value_p->value.vector = out;
|
||||||
switch (vop->varp()->vltype()) {
|
switch (vop->varp()->vltype()) {
|
||||||
case VLVT_UINT8:
|
case VLVT_UINT8:
|
||||||
@ -884,7 +884,6 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
}
|
}
|
||||||
for (i=0; i<chars; ++i) {
|
for (i=0; i<chars; ++i) {
|
||||||
char val = (datap[i>>1]>>((i&1)<<2))&15;
|
char val = (datap[i>>1]>>((i&1)<<2))&15;
|
||||||
static char hex[] = "0123456789abcdef";
|
|
||||||
if (i==(chars-1)) {
|
if (i==(chars-1)) {
|
||||||
// most signifcant char, mask off non existant bits when vector
|
// most signifcant char, mask off non existant bits when vector
|
||||||
// size is not a multiple of 4
|
// size is not a multiple of 4
|
||||||
@ -894,7 +893,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
|
|||||||
val &= (1<<rem)-1;
|
val &= (1<<rem)-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
outStr[chars-i-1] = hex[static_cast<int>(val)];
|
outStr[chars-i-1] = "0123456789abcdef"[static_cast<int>(val)];
|
||||||
}
|
}
|
||||||
outStr[i]=0; // NULL terminate
|
outStr[i]=0; // NULL terminate
|
||||||
return;
|
return;
|
||||||
|
@ -215,7 +215,7 @@ public:
|
|||||||
virtual const VerilatedRange* rangep() const { return &get_range(); }
|
virtual const VerilatedRange* rangep() const { return &get_range(); }
|
||||||
virtual const char* name() { return m_varp->name(); }
|
virtual const char* name() { return m_varp->name(); }
|
||||||
virtual const char* fullname() {
|
virtual const char* fullname() {
|
||||||
VL_STATIC_OR_THREAD std::string out;
|
static VL_THREAD_LOCAL std::string out;
|
||||||
out = std::string(m_scopep->name())+"."+name();
|
out = std::string(m_scopep->name())+"."+name();
|
||||||
return out.c_str();
|
return out.c_str();
|
||||||
}
|
}
|
||||||
@ -243,7 +243,7 @@ public:
|
|||||||
virtual vluint32_t size() const { return varp()->range().elements(); }
|
virtual vluint32_t size() const { return varp()->range().elements(); }
|
||||||
virtual const VerilatedRange* rangep() const { return &(varp()->range()); }
|
virtual const VerilatedRange* rangep() const { return &(varp()->range()); }
|
||||||
virtual const char* fullname() {
|
virtual const char* fullname() {
|
||||||
VL_STATIC_OR_THREAD std::string out;
|
static VL_THREAD_LOCAL std::string out;
|
||||||
char num[20]; sprintf(num,"%d",m_index);
|
char num[20]; sprintf(num,"%d",m_index);
|
||||||
out = std::string(scopep()->name())+"."+name()+"["+num+"]";
|
out = std::string(scopep()->name())+"."+name()+"["+num+"]";
|
||||||
return out.c_str();
|
return out.c_str();
|
||||||
@ -464,7 +464,7 @@ public:
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
void setMessage(std::string file, PLI_INT32 line, std::string message, ...) {
|
void setMessage(std::string file, PLI_INT32 line, std::string message, ...) {
|
||||||
static VL_THREAD std::string filehold;
|
static VL_THREAD_LOCAL std::string filehold;
|
||||||
_VL_VPI_ERROR_SET;
|
_VL_VPI_ERROR_SET;
|
||||||
m_errorInfo.state = vpiPLI;
|
m_errorInfo.state = vpiPLI;
|
||||||
filehold = file;
|
filehold = file;
|
||||||
|
@ -77,17 +77,18 @@
|
|||||||
|
|
||||||
#ifdef VL_THREADED
|
#ifdef VL_THREADED
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
# define VL_THREAD __thread ///< Storage class for thread-local storage
|
# if (__cplusplus < 201103L) && !defined(VL_THREADED_NO_C11_WARNING)
|
||||||
|
# error "VL_THREADED support plans to move to C++-11 and later only; use newer --std to be ready"
|
||||||
|
# endif
|
||||||
# else
|
# else
|
||||||
# error "Unsupported compiler for VL_THREADED: No thread-local declarator"
|
# error "Unsupported compiler for VL_THREADED: No thread-local declarator"
|
||||||
# endif
|
# endif
|
||||||
# define VL_STATIC_OR_THREAD ///< Static if unthreaded, as some strings can be faster
|
# define VL_THREAD_LOCAL thread_local ///< Use new C++ static local thread
|
||||||
// ///< if non-dynamic and can't do "static VL_THREAD string"
|
|
||||||
#else
|
#else
|
||||||
# define VL_THREAD ///< Storage class for thread-local storage
|
# define VL_THREAD_LOCAL ///< Use new C++ static local thread
|
||||||
# define VL_STATIC_OR_THREAD static ///< Static if unthreaded, as some strings can be faster
|
|
||||||
// ///< if non-dynamic and can't do "static VL_THREAD string"
|
|
||||||
#endif
|
#endif
|
||||||
|
#define VL_THREAD ///< Deprecated
|
||||||
|
#define VL_STATIC_OR_THREAD static ///< Deprecated
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# define VL_ULL(c) (c##ui64) ///< Add appropriate suffix to 64-bit constant
|
# define VL_ULL(c) (c##ui64) ///< Add appropriate suffix to 64-bit constant
|
||||||
@ -109,9 +110,14 @@
|
|||||||
|
|
||||||
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__)
|
||||||
# define VL_HAS_UNIQUE_PTR
|
# define VL_HAS_UNIQUE_PTR
|
||||||
# define VL_UNIQUE_PTR unique_ptr
|
# define VL_HAS_UNORDERED_MAP
|
||||||
|
# define VL_UNIQUE_PTR std::unique_ptr
|
||||||
|
# define VL_UNORDERED_MAP std::unordered_map
|
||||||
|
# define VL_INCLUDE_UNORDERED_MAP <unordered_map>
|
||||||
#else
|
#else
|
||||||
# define VL_UNIQUE_PTR auto_ptr
|
# define VL_UNIQUE_PTR std::auto_ptr
|
||||||
|
# define VL_UNORDERED_MAP std::map
|
||||||
|
# define VL_INCLUDE_UNORDERED_MAP <map>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <map>
|
#include VL_INCLUDE_UNORDERED_MAP
|
||||||
|
|
||||||
#include "V3Global.h"
|
#include "V3Global.h"
|
||||||
#include "V3Broken.h"
|
#include "V3Broken.h"
|
||||||
@ -47,7 +47,7 @@ class BrokenTable : public AstNVisitor {
|
|||||||
private:
|
private:
|
||||||
// MEMBERS
|
// MEMBERS
|
||||||
// For each node, we keep if it exists or not.
|
// For each node, we keep if it exists or not.
|
||||||
typedef map<const AstNode*,int> NodeMap;
|
typedef VL_UNORDERED_MAP<const AstNode*,int> NodeMap; // Performance matters (when --debug)
|
||||||
static NodeMap s_nodes; // Set of all nodes that exist
|
static NodeMap s_nodes; // Set of all nodes that exist
|
||||||
// BITMASK
|
// BITMASK
|
||||||
enum { FLAG_ALLOCATED = 0x01 }; // new() and not delete()ed
|
enum { FLAG_ALLOCATED = 0x01 }; // new() and not delete()ed
|
||||||
|
@ -35,6 +35,15 @@ CPPFLAGS += $(CPPFLAGS_DRIVER)
|
|||||||
CPPFLAGS += $(CPPFLAGS_DRIVER2)
|
CPPFLAGS += $(CPPFLAGS_DRIVER2)
|
||||||
CPPFLAGS += $(CPPFLAGS_ADD)
|
CPPFLAGS += $(CPPFLAGS_ADD)
|
||||||
|
|
||||||
|
ifeq ($(CFG_WITH_LONGTESTS),yes)
|
||||||
|
ifeq ($(DRIVER_STD),newest)
|
||||||
|
CPPFLAGS += $(CFG_CXXFLAGS_STD_NEWEST)
|
||||||
|
endif
|
||||||
|
ifeq ($(DRIVER_STD),oldest)
|
||||||
|
CPPFLAGS += $(CFG_CXXFLAGS_STD_OLDEST)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
#######################################################################
|
#######################################################################
|
||||||
# Linking final exe
|
# Linking final exe
|
||||||
|
|
||||||
|
25
test_regress/t/t_include_all_newest.pl
Executable file
25
test_regress/t/t_include_all_newest.pl
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2003-2009 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.
|
||||||
|
|
||||||
|
top_filename("t/t_include_all.v");
|
||||||
|
|
||||||
|
my $root = "..";
|
||||||
|
|
||||||
|
compile (
|
||||||
|
# Can't use --coverage and --savable together, so cheat and compile inline
|
||||||
|
verilator_flags2 => ['--cc --coverage-toggle --coverage-line --coverage-user --trace --vpi $root/include/verilated_save.cpp'],
|
||||||
|
make_flags => 'DRIVER_STD=newest CPPFLAGS_ADD=-DVL_THREADED=1',
|
||||||
|
);
|
||||||
|
|
||||||
|
execute (
|
||||||
|
check_finished=>1,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
25
test_regress/t/t_include_all_oldest.pl
Executable file
25
test_regress/t/t_include_all_oldest.pl
Executable file
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; }
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2003-2009 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.
|
||||||
|
|
||||||
|
top_filename("t/t_include_all.v");
|
||||||
|
|
||||||
|
my $root = "..";
|
||||||
|
|
||||||
|
compile (
|
||||||
|
# Can't use --coverage and --savable together, so cheat and compile inline
|
||||||
|
verilator_flags2 => ['--cc --coverage-toggle --coverage-line --coverage-user --trace --vpi $root/include/verilated_save.cpp'],
|
||||||
|
make_flags => 'DRIVER_STD=oldest',
|
||||||
|
);
|
||||||
|
|
||||||
|
execute (
|
||||||
|
check_finished=>1,
|
||||||
|
);
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
Loading…
Reference in New Issue
Block a user