Internals: Cleanup VL_VALUE_STRING_MAX widths ().

This commit is contained in:
Wilson Snyder 2021-08-23 21:13:33 -04:00
parent c3d64d9743
commit 959793cde3
4 changed files with 25 additions and 24 deletions

View File

@ -1338,7 +1338,7 @@ IData VL_FGETS_IXI(int obits, void* destp, IData fpi) VL_MT_SAFE {
if (VL_UNLIKELY(str.empty())) return 0; if (VL_UNLIKELY(str.empty())) return 0;
// V3Emit has static check that bytes < VL_TO_STRING_MAX_WORDS, but be safe // V3Emit has static check that bytes < VL_VALUE_STRING_MAX_WORDS, but be safe
if (VL_UNCOVERABLE(bytes < str.size())) { if (VL_UNCOVERABLE(bytes < str.size())) {
VL_FATAL_MT(__FILE__, __LINE__, "", "Internal: fgets buffer overrun"); // LCOV_EXCL_LINE VL_FATAL_MT(__FILE__, __LINE__, "", "Internal: fgets buffer overrun"); // LCOV_EXCL_LINE
} }
@ -1579,7 +1579,7 @@ IData VL_SYSTEM_IQ(QData lhs) VL_MT_SAFE {
return VL_SYSTEM_IW(VL_WQ_WORDS_E, lhsw); return VL_SYSTEM_IW(VL_WQ_WORDS_E, lhsw);
} }
IData VL_SYSTEM_IW(int lhswords, const WDataInP lhsp) VL_MT_SAFE { IData VL_SYSTEM_IW(int lhswords, const WDataInP lhsp) VL_MT_SAFE {
char filenamez[VL_TO_STRING_MAX_WORDS * VL_EDATASIZE + 1]; char filenamez[VL_VALUE_STRING_MAX_CHARS + 1];
_vl_vint_to_string(lhswords * VL_EDATASIZE, filenamez, lhsp); _vl_vint_to_string(lhswords * VL_EDATASIZE, filenamez, lhsp);
const int code = std::system(filenamez); // Yes, std::system() is threadsafe const int code = std::system(filenamez); // Yes, std::system() is threadsafe
return code >> 8; // Want exit status return code >> 8; // Want exit status
@ -1726,7 +1726,7 @@ std::string VL_TOUPPER_NN(const std::string& ld) VL_MT_SAFE {
std::string VL_CVT_PACK_STR_NW(int lwords, const WDataInP lwp) VL_MT_SAFE { std::string VL_CVT_PACK_STR_NW(int lwords, const WDataInP lwp) VL_MT_SAFE {
// See also _vl_vint_to_string // See also _vl_vint_to_string
char destout[VL_TO_STRING_MAX_WORDS * VL_EDATASIZE + 1]; char destout[VL_VALUE_STRING_MAX_CHARS + 1];
int obits = lwords * VL_EDATASIZE; int obits = lwords * VL_EDATASIZE;
int lsb = obits - 1; int lsb = obits - 1;
bool start = true; bool start = true;

View File

@ -1695,7 +1695,7 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
const char* fullname) { const char* fullname) {
if (!vl_check_format(varp, valuep, fullname, true)) return; if (!vl_check_format(varp, valuep, fullname, true)) return;
// Maximum required size is for binary string, one byte per bit plus null termination // Maximum required size is for binary string, one byte per bit plus null termination
static VL_THREAD_LOCAL char t_outStr[1 + VL_MULS_MAX_WORDS * 32]; static VL_THREAD_LOCAL char t_outStr[VL_VALUE_STRING_MAX_WORDS * VL_EDATASIZE + 1];
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
static VL_THREAD_LOCAL int t_outStrSz = sizeof(t_outStr) - 1; static VL_THREAD_LOCAL int t_outStrSz = sizeof(t_outStr) - 1;
// We used to presume vpiValue.format = vpiIntVal or if single bit vpiScalarVal // We used to presume vpiValue.format = vpiIntVal or if single bit vpiScalarVal
@ -1703,7 +1703,7 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
if (valuep->format == vpiVectorVal) { if (valuep->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_LOCAL t_vpi_vecval t_out[VL_MULS_MAX_WORDS * 2]; static VL_THREAD_LOCAL t_vpi_vecval t_out[VL_VALUE_STRING_MAX_WORDS * 2];
valuep->value.vector = t_out; valuep->value.vector = t_out;
if (varp->vltype() == VLVT_UINT8) { if (varp->vltype() == VLVT_UINT8) {
t_out[0].aval = *(reinterpret_cast<CData*>(varDatap)); t_out[0].aval = *(reinterpret_cast<CData*>(varDatap));
@ -1726,10 +1726,10 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
return; return;
} else if (varp->vltype() == VLVT_WDATA) { } else if (varp->vltype() == VLVT_WDATA) {
int words = VL_WORDS_I(varp->packed().elements()); int words = VL_WORDS_I(varp->packed().elements());
if (VL_UNCOVERABLE(words >= VL_MULS_MAX_WORDS)) { if (VL_UNCOVERABLE(words >= VL_VALUE_STRING_MAX_WORDS)) {
VL_FATAL_MT( VL_FATAL_MT(__FILE__, __LINE__, "",
__FILE__, __LINE__, "", "vpi_get_value with more than VL_VALUE_STRING_MAX_WORDS; increase and "
"vpi_get_value with more than VL_MULS_MAX_WORDS; increase and recompile"); "recompile");
} }
const WDataInP datap = (reinterpret_cast<EData*>(varDatap)); const WDataInP datap = (reinterpret_cast<EData*>(varDatap));
for (int i = 0; i < words; ++i) { for (int i = 0; i < words; ++i) {
@ -1749,9 +1749,9 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
VL_VPI_WARNING_( VL_VPI_WARNING_(
__FILE__, __LINE__, __FILE__, __LINE__,
"%s: Truncating string value of %s for %s" "%s: Truncating string value of %s for %s"
" as buffer size (%d, VL_MULS_MAX_WORDS=%d) is less than required (%d)", " as buffer size (%d, VL_VALUE_STRING_MAX_WORDS=%d) is less than required (%d)",
__func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz, __func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz,
VL_MULS_MAX_WORDS, bits); VL_VALUE_STRING_MAX_WORDS, bits);
} }
for (i = 0; i < bits; ++i) { for (i = 0; i < bits; ++i) {
char val = (datap[i >> 3] >> (i & 7)) & 1; char val = (datap[i >> 3] >> (i & 7)) & 1;
@ -1770,9 +1770,9 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
VL_VPI_WARNING_( VL_VPI_WARNING_(
__FILE__, __LINE__, __FILE__, __LINE__,
"%s: Truncating string value of %s for %s" "%s: Truncating string value of %s for %s"
" as buffer size (%d, VL_MULS_MAX_WORDS=%d) is less than required (%d)", " as buffer size (%d, VL_VALUE_STRING_MAX_WORDS=%d) is less than required (%d)",
__func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz, __func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz,
VL_MULS_MAX_WORDS, chars); VL_VALUE_STRING_MAX_WORDS, chars);
chars = t_outStrSz; chars = t_outStrSz;
} }
for (i = 0; i < chars; ++i) { for (i = 0; i < chars; ++i) {
@ -1828,9 +1828,9 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
VL_VPI_WARNING_( VL_VPI_WARNING_(
__FILE__, __LINE__, __FILE__, __LINE__,
"%s: Truncating string value of %s for %s" "%s: Truncating string value of %s for %s"
" as buffer size (%d, VL_MULS_MAX_WORDS=%d) is less than required (%d)", " as buffer size (%d, VL_VALUE_STRING_MAX_WORDS=%d) is less than required (%d)",
__func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz, __func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, t_outStrSz,
VL_MULS_MAX_WORDS, chars); VL_VALUE_STRING_MAX_WORDS, chars);
chars = t_outStrSz; chars = t_outStrSz;
} }
for (i = 0; i < chars; ++i) { for (i = 0; i < chars; ++i) {
@ -1859,12 +1859,12 @@ void vl_get_value(const VerilatedVar* varp, void* varDatap, p_vpi_value valuep,
int i; int i;
if (bytes > t_outStrSz) { if (bytes > t_outStrSz) {
// limit maximum size of output to size of buffer to prevent overrun. // limit maximum size of output to size of buffer to prevent overrun.
VL_VPI_WARNING_( VL_VPI_WARNING_(__FILE__, __LINE__,
__FILE__, __LINE__, "%s: Truncating string value of %s for %s"
"%s: Truncating string value of %s for %s" " as buffer size (%d, VL_VALUE_STRING_MAX_WORDS=%d) is less than "
" as buffer size (%d, VL_MULS_MAX_WORDS=%d) is less than required (%d)", "required (%d)",
__func__, VerilatedVpiError::strFromVpiVal(valuep->format), fullname, __func__, VerilatedVpiError::strFromVpiVal(valuep->format),
t_outStrSz, VL_MULS_MAX_WORDS, bytes); fullname, t_outStrSz, VL_VALUE_STRING_MAX_WORDS, bytes);
bytes = t_outStrSz; bytes = t_outStrSz;
} }
for (i = 0; i < bytes; ++i) { for (i = 0; i < bytes; ++i) {

View File

@ -421,7 +421,8 @@ typedef unsigned long long vluint64_t; ///< 64-bit unsigned type
// Verilated function size macros // Verilated function size macros
#define VL_MULS_MAX_WORDS 16 ///< Max size in words of MULS operation #define VL_MULS_MAX_WORDS 16 ///< Max size in words of MULS operation
#define VL_TO_STRING_MAX_WORDS 64 ///< Max size in words of String conversion operation #define VL_VALUE_STRING_MAX_WORDS 64 ///< Max size in words of String conversion operation
#define VL_VALUE_STRING_MAX_CHARS (VL_VALUE_STRING_MAX_WORDS * VL_EDATASIZE / VL_BYTESIZE)
//========================================================================= //=========================================================================
// Base macros // Base macros

View File

@ -595,11 +595,11 @@ public:
} }
void checkMaxWords(AstNode* nodep) { void checkMaxWords(AstNode* nodep) {
if (nodep->widthWords() > VL_TO_STRING_MAX_WORDS) { if (nodep->widthWords() > VL_VALUE_STRING_MAX_WORDS) {
nodep->v3error( nodep->v3error(
"String of " "String of "
<< nodep->width() << nodep->width()
<< " bits exceeds hardcoded limit VL_TO_STRING_MAX_WORDS in verilatedos.h"); << " bits exceeds hardcoded limit VL_VALUE_STRING_MAX_WORDS in verilatedos.h");
} }
} }
virtual void visit(AstFOpen* nodep) override { virtual void visit(AstFOpen* nodep) override {