From 5fddf51e8c77e4d73cb1f77fb268b7695761f9fd Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 17 Jun 2021 21:17:15 -0400 Subject: [PATCH] Internals: Favor VlWide over WData arrays. No functional change intended. --- include/verilated.cpp | 34 +++++++++++++++++----------------- include/verilated_dpi.cpp | 4 ++-- include/verilated_dpi.h | 3 ++- include/verilated_heavy.h | 14 +++++++------- include/verilated_vpi.cpp | 2 +- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/include/verilated.cpp b/include/verilated.cpp index aa4bb49c3..0885d9505 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -484,9 +484,9 @@ WDataOutP VL_POW_WWW(int obits, int, int rbits, WDataOutP owp, WDataInP lwp, owp[0] = 1; for (int i = 1; i < VL_WORDS_I(obits); i++) owp[i] = 0; // cppcheck-suppress variableScope - WData powstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here - WData lastpowstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here - WData lastoutstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here + VlWide powstore; // Fixed size, as MSVC++ doesn't allow [words] here + VlWide lastpowstore; // Fixed size, as MSVC++ doesn't allow [words] here + VlWide lastoutstore; // Fixed size, as MSVC++ doesn't allow [words] here // cppcheck-suppress variableScope VL_ASSIGN_W(obits, powstore, lwp); for (int bit = 0; bit < rbits; bit++) { @@ -503,7 +503,7 @@ WDataOutP VL_POW_WWW(int obits, int, int rbits, WDataOutP owp, WDataInP lwp, } WDataOutP VL_POW_WWQ(int obits, int lbits, int rbits, WDataOutP owp, WDataInP lwp, QData rhs) VL_MT_SAFE { - WData rhsw[VL_WQ_WORDS_E]; + VlWide rhsw; VL_SET_WQ(rhsw, rhs); return VL_POW_WWW(obits, lbits, rbits, owp, lwp, rhsw); } @@ -547,7 +547,7 @@ WDataOutP VL_POWSS_WWW(int obits, int, int rbits, WDataOutP owp, WDataInP lwp, W } WDataOutP VL_POWSS_WWQ(int obits, int lbits, int rbits, WDataOutP owp, WDataInP lwp, QData rhs, bool lsign, bool rsign) VL_MT_SAFE { - WData rhsw[VL_WQ_WORDS_E]; + VlWide rhsw; VL_SET_WQ(rhsw, rhs); return VL_POWSS_WWW(obits, lbits, rbits, owp, lwp, rhsw, lsign, rsign); } @@ -602,10 +602,10 @@ double VL_ISTOR_D_W(int lbits, WDataInP lwp) VL_PURE { std::string VL_DECIMAL_NW(int width, WDataInP lwp) VL_MT_SAFE { int maxdecwidth = (width + 3) * 4 / 3; // Or (maxdecwidth+7)/8], but can't have more than 4 BCD bits per word - WData bcd[VL_VALUE_STRING_MAX_WIDTH / 4 + 2]; + VlWide bcd; VL_ZERO_RESET_W(maxdecwidth, bcd); - WData tmp[VL_VALUE_STRING_MAX_WIDTH / 4 + 2]; - WData tmp2[VL_VALUE_STRING_MAX_WIDTH / 4 + 2]; + VlWide tmp; + VlWide tmp2; int from_bit = width - 1; // Skip all leading zeros for (; from_bit >= 0 && !(VL_BITRSHIFT_W(lwp, from_bit) & 1); --from_bit) {} @@ -648,7 +648,7 @@ std::string _vl_vsformat_time(char* tmp, T ld, int timeunit, bool left, size_t w if (std::numeric_limits::is_integer) { constexpr int b = 128; constexpr int w = VL_WORDS_I(b); - WData tmp0[w], tmp1[w], tmp2[w], tmp3[w]; + VlWide tmp0, tmp1, tmp2, tmp3; WDataInP shifted = VL_EXTEND_WQ(b, 0, tmp0, static_cast(ld)); if (shift < 0) { @@ -666,7 +666,7 @@ std::string _vl_vsformat_time(char* tmp, T ld, int timeunit, bool left, size_t w = VL_EXTEND_WQ(b, 0, tmp2, std::numeric_limits::max()); // breaks shifted if (VL_GT_W(w, integer, max64Bit)) { WDataOutP v = VL_ASSIGN_W(b, tmp3, integer); // breaks fracDigitsPow10 - WData zero[w], ten[w]; + VlWide zero, ten; VL_ZERO_W(b, zero); VL_EXTEND_WI(b, 0, ten, 10); char buf[128]; // 128B is obviously long enough to represent 128bit integer in decimal @@ -676,7 +676,7 @@ std::string _vl_vsformat_time(char* tmp, T ld, int timeunit, bool left, size_t w --ptr; WDataInP mod = VL_MODDIV_WWW(b, tmp2, v, ten); // breaks max64Bit *ptr = "0123456789"[VL_SET_QW(mod)]; - WData divided[w]; + VlWide divided; VL_DIV_WWW(b, divided, v, ten); VL_ASSIGN_W(b, v, divided); } @@ -818,7 +818,7 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA // Deal with all read-and-print somethings const int lbits = va_arg(ap, int); QData ld = 0; - WData qlwp[VL_WQ_WORDS_E]; + VlWide qlwp; WDataInP lwp = nullptr; if (lbits <= VL_QUADSIZE) { ld = VL_VA_ARG_Q_(ap, lbits); @@ -860,7 +860,7 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA append = t_tmp; } else { if (VL_SIGN_E(lbits, lwp[VL_WORDS_I(lbits) - 1])) { - WData neg[VL_VALUE_STRING_MAX_WIDTH / 4 + 2]; + VlWide neg; VL_NEGATE_W(VL_WORDS_I(lbits), neg, lwp); append = std::string("-") + VL_DECIMAL_NW(lbits, neg); } else { @@ -1119,7 +1119,7 @@ IData _vl_vsscanf(FILE* fp, // If a fscanf // Deal with all read-and-scan somethings // Note LSBs are preserved if there's an overflow const int obits = inIgnore ? 0 : va_arg(ap, int); - WData qowp[VL_WQ_WORDS_E]; + VlWide qowp; VL_SET_WQ(qowp, 0ULL); WDataOutP owp = qowp; if (obits == -1) { // string @@ -1485,7 +1485,7 @@ IData VL_FSCANF_IX(IData fpi, const char* formatp, ...) VL_MT_SAFE { } IData VL_SSCANF_IIX(int lbits, IData ld, const char* formatp, ...) VL_MT_SAFE { - WData fnw[VL_WQ_WORDS_E]; + VlWide fnw; VL_SET_WI(fnw, ld); va_list ap; @@ -1495,7 +1495,7 @@ IData VL_SSCANF_IIX(int lbits, IData ld, const char* formatp, ...) VL_MT_SAFE { return got; } IData VL_SSCANF_IQX(int lbits, QData ld, const char* formatp, ...) VL_MT_SAFE { - WData fnw[VL_WQ_WORDS_E]; + VlWide fnw; VL_SET_WQ(fnw, ld); va_list ap; @@ -1572,7 +1572,7 @@ IData VL_FREAD_I(int width, int array_lsb, int array_size, void* memp, IData fpi } IData VL_SYSTEM_IQ(QData lhs) VL_MT_SAFE { - WData lhsw[VL_WQ_WORDS_E]; + VlWide lhsw; VL_SET_WQ(lhsw, lhs); return VL_SYSTEM_IW(VL_WQ_WORDS_E, lhsw); } diff --git a/include/verilated_dpi.cpp b/include/verilated_dpi.cpp index 47139cd1e..c40ec5c9a 100644 --- a/include/verilated_dpi.cpp +++ b/include/verilated_dpi.cpp @@ -279,7 +279,7 @@ static void _vl_svGetBitArrElemVecVal(svBitVecVal* d, const svOpenArrayHandle s, case VLVT_UINT16: d[0] = *(reinterpret_cast(datap)); return; case VLVT_UINT32: d[0] = *(reinterpret_cast(datap)); return; case VLVT_UINT64: { - WData lwp[2]; + VlWide<2> lwp; VL_SET_WQ(lwp, *(reinterpret_cast(datap))); d[0] = lwp[0]; d[1] = lwp[1]; @@ -316,7 +316,7 @@ static void _vl_svGetLogicArrElemVecVal(svLogicVecVal* d, const svOpenArrayHandl d[0].bval = 0; return; case VLVT_UINT64: { - WData lwp[2]; + VlWide<2> lwp; VL_SET_WQ(lwp, *(reinterpret_cast(datap))); d[0].aval = lwp[0]; d[0].bval = 0; diff --git a/include/verilated_dpi.h b/include/verilated_dpi.h index 8ad748e6a..8834342b9 100644 --- a/include/verilated_dpi.h +++ b/include/verilated_dpi.h @@ -28,6 +28,7 @@ #include "verilatedos.h" #include "verilated.h" // Also presumably included by caller +#include "verilated_heavy.h" // Also presumably included by caller #include "verilated_sym_props.h" #include "svdpi.h" @@ -82,7 +83,7 @@ static inline void VL_SET_SVLV_I(int, svLogicVecVal* owp, IData ld) VL_MT_SAFE { owp[0].bval = 0; } static inline void VL_SET_SVLV_Q(int, svLogicVecVal* owp, QData ld) VL_MT_SAFE { - WData lwp[2]; + VlWide<2> lwp; VL_SET_WQ(lwp, ld); owp[0].aval = lwp[0]; owp[0].bval = 0; diff --git a/include/verilated_heavy.h b/include/verilated_heavy.h index 97b44c92b..7b9218ff1 100644 --- a/include/verilated_heavy.h +++ b/include/verilated_heavy.h @@ -878,14 +878,14 @@ static inline bool VL_CAST_DYNAMIC(VlClassRef in, VlClassRef& outr) { extern std::string VL_CVT_PACK_STR_NW(int lwords, WDataInP lwp) VL_MT_SAFE; inline std::string VL_CVT_PACK_STR_NQ(QData lhs) VL_PURE { - WData lw[VL_WQ_WORDS_E]; + VlWide lw; VL_SET_WQ(lw, lhs); return VL_CVT_PACK_STR_NW(VL_WQ_WORDS_E, lw); } inline std::string VL_CVT_PACK_STR_NN(const std::string& lhs) VL_PURE { return lhs; } inline std::string& VL_CVT_PACK_STR_NN(std::string& lhs) VL_PURE { return lhs; } inline std::string VL_CVT_PACK_STR_NI(IData lhs) VL_PURE { - WData lw[VL_WQ_WORDS_E]; + VlWide lw; VL_SET_WI(lw, lhs); return VL_CVT_PACK_STR_NW(1, lw); } @@ -924,31 +924,31 @@ extern void VL_TIMEFORMAT_IINI(int units, int precision, const std::string& suff VerilatedContext* contextp) VL_MT_SAFE; extern IData VL_VALUEPLUSARGS_INW(int rbits, const std::string& ld, WDataOutP rwp) VL_MT_SAFE; inline IData VL_VALUEPLUSARGS_INI(int rbits, const std::string& ld, CData& rdr) VL_MT_SAFE { - WData rwp[2]; // WData must always be at least 2 + VlWide<2> rwp; // WData must always be at least 2 IData got = VL_VALUEPLUSARGS_INW(rbits, ld, rwp); if (got) rdr = rwp[0]; return got; } inline IData VL_VALUEPLUSARGS_INI(int rbits, const std::string& ld, SData& rdr) VL_MT_SAFE { - WData rwp[2]; // WData must always be at least 2 + VlWide<2> rwp; // WData must always be at least 2 IData got = VL_VALUEPLUSARGS_INW(rbits, ld, rwp); if (got) rdr = rwp[0]; return got; } inline IData VL_VALUEPLUSARGS_INI(int rbits, const std::string& ld, IData& rdr) VL_MT_SAFE { - WData rwp[2]; + VlWide<2> rwp; IData got = VL_VALUEPLUSARGS_INW(rbits, ld, rwp); if (got) rdr = rwp[0]; return got; } inline IData VL_VALUEPLUSARGS_INQ(int rbits, const std::string& ld, QData& rdr) VL_MT_SAFE { - WData rwp[2]; + VlWide<2> rwp; IData got = VL_VALUEPLUSARGS_INW(rbits, ld, rwp); if (got) rdr = VL_SET_QW(rwp); return got; } inline IData VL_VALUEPLUSARGS_INQ(int rbits, const std::string& ld, double& rdr) VL_MT_SAFE { - WData rwp[2]; + VlWide<2> rwp; IData got = VL_VALUEPLUSARGS_INW(rbits, ld, rwp); if (got) rdr = VL_CVT_D_Q(VL_SET_QW(rwp)); return got; diff --git a/include/verilated_vpi.cpp b/include/verilated_vpi.cpp index c3346429e..d0f1178b5 100644 --- a/include/verilated_vpi.cpp +++ b/include/verilated_vpi.cpp @@ -2154,7 +2154,7 @@ void vpi_get_time(vpiHandle object, p_vpi_time time_p) { } if (time_p->type == vpiSimTime) { QData qtime = VL_TIME_Q(); - WData itime[2]; + VlWide<2> itime; VL_SET_WQ(itime, qtime); time_p->low = itime[0]; time_p->high = itime[1];