From af304363570b92e5564259fff3f02ad3abce9e4e Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 22 May 2025 06:54:16 -0400 Subject: [PATCH] Internals: Rename VL_PACK/VL_UNPACK in prep for future fix. No functional change intended. --- include/verilated.h | 3 + include/verilated_funcs.h | 130 +++++++++++++++++++++----------------- src/V3AstNodeExpr.h | 2 +- src/V3EmitCFunc.h | 26 ++++++-- 4 files changed, 97 insertions(+), 64 deletions(-) diff --git a/include/verilated.h b/include/verilated.h index 53c0b869f..799cc4bb4 100644 --- a/include/verilated.h +++ b/include/verilated.h @@ -113,6 +113,7 @@ class VerilatedVcdSc; //========================================================================= // Basic types +// Type letters // clang-format off // P // Packed data of bit type (C/S/I/Q/W) using CData = uint8_t; ///< Data representing 'bit' of 1-8 packed bits @@ -124,6 +125,8 @@ using WData = EData; ///< Data representing >64 packed bits (used as poin // F = float; // No typedef needed; Verilator uses float // D = double; // No typedef needed; Verilator uses double // N = std::string; // No typedef needed; Verilator uses string +// U = VlUnpacked; +// R = VlQueue; // clang-format on using WDataInP = const WData*; ///< 'bit' of >64 packed bits as array input to a function diff --git a/include/verilated_funcs.h b/include/verilated_funcs.h index c971c11ac..712ce7277 100644 --- a/include/verilated_funcs.h +++ b/include/verilated_funcs.h @@ -1594,26 +1594,26 @@ static inline WDataOutP VL_STREAML_WWI(int lbits, WDataOutP owp, WDataInP const return owp; } -static inline IData VL_PACK_II(int obits, int lbits, const VlQueue& q) { +static inline IData VL_PACK_I_RI(int obits, int lbits, const VlQueue& q) { IData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= static_cast(q.at(i)) << (i * lbits); return ret; } -static inline IData VL_PACK_II(int obits, int lbits, const VlQueue& q) { +static inline IData VL_PACK_I_RI(int obits, int lbits, const VlQueue& q) { IData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= static_cast(q.at(i)) << (i * lbits); return ret; } -static inline IData VL_PACK_II(int obits, int lbits, const VlQueue& q) { +static inline IData VL_PACK_I_RI(int obits, int lbits, const VlQueue& q) { IData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= q.at(i) << (i * lbits); return ret; } template -static inline IData VL_PACK_II(int obits, int lbits, const VlUnpacked& q) { +static inline IData VL_PACK_I_UI(int obits, int lbits, const VlUnpacked& q) { IData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= static_cast(q[N_Depth - 1 - i]) << (i * lbits); @@ -1621,7 +1621,7 @@ static inline IData VL_PACK_II(int obits, int lbits, const VlUnpacked -static inline IData VL_PACK_II(int obits, int lbits, const VlUnpacked& q) { +static inline IData VL_PACK_I_UI(int obits, int lbits, const VlUnpacked& q) { IData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= static_cast(q[N_Depth - 1 - i]) << (i * lbits); @@ -1629,32 +1629,32 @@ static inline IData VL_PACK_II(int obits, int lbits, const VlUnpacked -static inline IData VL_PACK_II(int obits, int lbits, const VlUnpacked& q) { +static inline IData VL_PACK_I_UI(int obits, int lbits, const VlUnpacked& q) { IData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= q[N_Depth - 1 - i] << (i * lbits); return ret; } -static inline QData VL_PACK_QI(int obits, int lbits, const VlQueue& q) { +static inline QData VL_PACK_Q_RI(int obits, int lbits, const VlQueue& q) { QData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= static_cast(q.at(i)) << (i * lbits); return ret; } -static inline QData VL_PACK_QI(int obits, int lbits, const VlQueue& q) { +static inline QData VL_PACK_Q_RI(int obits, int lbits, const VlQueue& q) { QData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= static_cast(q.at(i)) << (i * lbits); return ret; } -static inline QData VL_PACK_QI(int obits, int lbits, const VlQueue& q) { +static inline QData VL_PACK_Q_RI(int obits, int lbits, const VlQueue& q) { QData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= static_cast(q.at(i)) << (i * lbits); return ret; } template -static inline QData VL_PACK_QI(int obits, int lbits, const VlUnpacked& q) { +static inline QData VL_PACK_Q_UI(int obits, int lbits, const VlUnpacked& q) { QData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= static_cast(q[N_Depth - 1 - i]) << (i * lbits); @@ -1662,7 +1662,7 @@ static inline QData VL_PACK_QI(int obits, int lbits, const VlUnpacked -static inline QData VL_PACK_QI(int obits, int lbits, const VlUnpacked& q) { +static inline QData VL_PACK_Q_UI(int obits, int lbits, const VlUnpacked& q) { QData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= static_cast(q[N_Depth - 1 - i]) << (i * lbits); @@ -1670,41 +1670,44 @@ static inline QData VL_PACK_QI(int obits, int lbits, const VlUnpacked -static inline QData VL_PACK_QI(int obits, int lbits, const VlUnpacked& q) { +static inline QData VL_PACK_Q_UI(int obits, int lbits, const VlUnpacked& q) { QData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= static_cast(q[N_Depth - 1 - i]) << (i * lbits); return ret; } -static inline QData VL_PACK_QQ(int obits, int lbits, const VlQueue& q) { +static inline QData VL_PACK_Q_RQ(int obits, int lbits, const VlQueue& q) { QData ret = 0; for (size_t i = 0; i < q.size(); ++i) ret |= q.at(i) << (i * lbits); return ret; } template -static inline QData VL_PACK_QQ(int obits, int lbits, const VlUnpacked& q) { +static inline QData VL_PACK_Q_UQ(int obits, int lbits, const VlUnpacked& q) { QData ret = 0; for (size_t i = 0; i < N_Depth; ++i) ret |= q[N_Depth - 1 - i] << (i * lbits); return ret; } -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, const VlQueue& q) { +static inline WDataOutP VL_PACK_W_RI(int obits, int lbits, WDataOutP owp, + const VlQueue& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < q.size(); ++i) _vl_insert_WI(owp, q.at(i), i * lbits + lbits - 1, i * lbits); return owp; } -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, const VlQueue& q) { +static inline WDataOutP VL_PACK_W_RI(int obits, int lbits, WDataOutP owp, + const VlQueue& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < q.size(); ++i) _vl_insert_WI(owp, q.at(i), i * lbits + lbits - 1, i * lbits); return owp; } -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, const VlQueue& q) { +static inline WDataOutP VL_PACK_W_RI(int obits, int lbits, WDataOutP owp, + const VlQueue& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < q.size(); ++i) _vl_insert_WI(owp, q.at(i), i * lbits + lbits - 1, i * lbits); @@ -1712,8 +1715,8 @@ static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, const Vl } template -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, - const VlUnpacked& q) { +static inline WDataOutP VL_PACK_W_UI(int obits, int lbits, WDataOutP owp, + const VlUnpacked& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < N_Depth; ++i) _vl_insert_WI(owp, q[N_Depth - 1 - i], i * lbits + lbits - 1, i * lbits); @@ -1721,8 +1724,8 @@ static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, } template -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, - const VlUnpacked& q) { +static inline WDataOutP VL_PACK_W_UI(int obits, int lbits, WDataOutP owp, + const VlUnpacked& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < N_Depth; ++i) _vl_insert_WI(owp, q[N_Depth - 1 - i], i * lbits + lbits - 1, i * lbits); @@ -1730,15 +1733,16 @@ static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, } template -static inline WDataOutP VL_PACK_WI(int obits, int lbits, WDataOutP owp, - const VlUnpacked& q) { +static inline WDataOutP VL_PACK_W_UI(int obits, int lbits, WDataOutP owp, + const VlUnpacked& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < N_Depth; ++i) _vl_insert_WI(owp, q[N_Depth - 1 - i], i * lbits + lbits - 1, i * lbits); return owp; } -static inline WDataOutP VL_PACK_WQ(int obits, int lbits, WDataOutP owp, const VlQueue& q) { +static inline WDataOutP VL_PACK_W_RQ(int obits, int lbits, WDataOutP owp, + const VlQueue& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < q.size(); ++i) _vl_insert_WQ(owp, q.at(i), i * lbits + lbits - 1, i * lbits); @@ -1746,8 +1750,8 @@ static inline WDataOutP VL_PACK_WQ(int obits, int lbits, WDataOutP owp, const Vl } template -static inline WDataOutP VL_PACK_WQ(int obits, int lbits, WDataOutP owp, - const VlUnpacked& q) { +static inline WDataOutP VL_PACK_W_UQ(int obits, int lbits, WDataOutP owp, + const VlUnpacked& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < N_Depth; ++i) _vl_insert_WQ(owp, q[N_Depth - 1 - i], i * lbits + lbits - 1, i * lbits); @@ -1755,8 +1759,8 @@ static inline WDataOutP VL_PACK_WQ(int obits, int lbits, WDataOutP owp, } template -static inline WDataOutP VL_PACK_WW(int obits, int lbits, WDataOutP owp, - const VlQueue>& q) { +static inline WDataOutP VL_PACK_W_RW(int obits, int lbits, WDataOutP owp, + const VlQueue>& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < q.size(); ++i) _vl_insert_WW(owp, q.at(i), i * lbits + lbits - 1, i * lbits); @@ -1764,8 +1768,8 @@ static inline WDataOutP VL_PACK_WW(int obits, int lbits, WDataOutP owp, } template -static inline WDataOutP VL_PACK_WW(int obits, int lbits, WDataOutP owp, - const VlUnpacked, N_Depth>& q) { +static inline WDataOutP VL_PACK_W_UW(int obits, int lbits, WDataOutP owp, + const VlUnpacked, N_Depth>& q) { VL_MEMSET_ZERO_W(owp + 1, VL_WORDS_I(obits) - 1); for (size_t i = 0; i < N_Depth; ++i) _vl_insert_WW(owp, q[N_Depth - 1 - i], i * lbits + lbits - 1, i * lbits); @@ -2211,56 +2215,56 @@ static inline WDataOutP VL_SEL_WWII(int obits, int lbits, WDataOutP owp, WDataIn //====================================================================== // Expressions needing insert/select -static inline void VL_UNPACK_II(int lbits, int rbits, VlQueue& q, IData from) { +static inline void VL_UNPACK_RI_I(int lbits, int rbits, VlQueue& q, IData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_II(int lbits, int rbits, VlQueue& q, IData from) { +static inline void VL_UNPACK_RI_I(int lbits, int rbits, VlQueue& q, IData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_II(int lbits, int rbits, VlQueue& q, IData from) { +static inline void VL_UNPACK_RI_I(int lbits, int rbits, VlQueue& q, IData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlQueue& q, QData from) { +static inline void VL_UNPACK_RI_Q(int lbits, int rbits, VlQueue& q, QData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlQueue& q, QData from) { +static inline void VL_UNPACK_RI_Q(int lbits, int rbits, VlQueue& q, QData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlQueue& q, QData from) { +static inline void VL_UNPACK_RI_Q(int lbits, int rbits, VlQueue& q, QData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_QQ(int lbits, int rbits, VlQueue& q, QData from) { +static inline void VL_UNPACK_RQ_Q(int lbits, int rbits, VlQueue& q, QData from) { const size_t size = (rbits + lbits - 1) / lbits; q.renew(size); const QData mask = VL_MASK_Q(lbits); for (size_t i = 0; i < size; ++i) q.atWrite(i) = (from >> (i * lbits)) & mask; } -static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataInP rwp) { +static inline void VL_UNPACK_RI_W(int lbits, int rbits, VlQueue& q, WDataInP rwp) { const int size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); @@ -2269,7 +2273,7 @@ static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataIn } } -static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataInP rwp) { +static inline void VL_UNPACK_RI_W(int lbits, int rbits, VlQueue& q, WDataInP rwp) { const int size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); @@ -2278,7 +2282,7 @@ static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataIn } } -static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataInP rwp) { +static inline void VL_UNPACK_RI_W(int lbits, int rbits, VlQueue& q, WDataInP rwp) { const int size = (rbits + lbits - 1) / lbits; q.renew(size); const IData mask = VL_MASK_I(lbits); @@ -2287,7 +2291,7 @@ static inline void VL_UNPACK_IW(int lbits, int rbits, VlQueue& q, WDataIn } } -static inline void VL_UNPACK_QW(int lbits, int rbits, VlQueue& q, WDataInP rwp) { +static inline void VL_UNPACK_RQ_W(int lbits, int rbits, VlQueue& q, WDataInP rwp) { const int size = (rbits + lbits - 1) / lbits; q.renew(size); const QData mask = VL_MASK_Q(lbits); @@ -2297,7 +2301,8 @@ static inline void VL_UNPACK_QW(int lbits, int rbits, VlQueue& q, WDataIn } template -static inline void VL_UNPACK_WW(int lbits, int rbits, VlQueue>& q, WDataInP rwp) { +static inline void VL_UNPACK_RW_W(int lbits, int rbits, VlQueue>& q, + WDataInP rwp) { const int size = (rbits + lbits - 1) / lbits; q.renew(size); for (size_t i = 0; i < size; ++i) { @@ -2306,82 +2311,89 @@ static inline void VL_UNPACK_WW(int lbits, int rbits, VlQueue>& } template -static inline void VL_UNPACK_II(int lbits, int rbits, VlUnpacked& q, IData from) { +static inline void VL_UNPACK_UI_I(int lbits, int rbits, VlUnpacked& q, + IData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_II(int lbits, int rbits, VlUnpacked& q, IData from) { +static inline void VL_UNPACK_UI_I(int lbits, int rbits, VlUnpacked& q, + IData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_II(int lbits, int rbits, VlUnpacked& q, IData from) { +static inline void VL_UNPACK_UI_I(int lbits, int rbits, VlUnpacked& q, + IData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlUnpacked& q, QData from) { +static inline void VL_UNPACK_UI_Q(int lbits, int rbits, VlUnpacked& q, + QData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlUnpacked& q, QData from) { +static inline void VL_UNPACK_UI_Q(int lbits, int rbits, VlUnpacked& q, + QData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_IQ(int lbits, int rbits, VlUnpacked& q, QData from) { +static inline void VL_UNPACK_UI_Q(int lbits, int rbits, VlUnpacked& q, + QData from) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_QQ(int lbits, int rbits, VlUnpacked& q, QData from) { +static inline void VL_UNPACK_UQ_Q(int lbits, int rbits, VlUnpacked& q, + QData from) { const QData mask = VL_MASK_Q(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = (from >> ((N_Depth - 1 - i) * lbits)) & mask; } template -static inline void VL_UNPACK_IW(int lbits, int rbits, VlUnpacked& q, - WDataInP rwp) { +static inline void VL_UNPACK_UI_W(int lbits, int rbits, VlUnpacked& q, + WDataInP rwp) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = VL_SEL_IWII(rbits, rwp, (N_Depth - 1 - i) * lbits, lbits) & mask; } template -static inline void VL_UNPACK_IW(int lbits, int rbits, VlUnpacked& q, - WDataInP rwp) { +static inline void VL_UNPACK_UI_W(int lbits, int rbits, VlUnpacked& q, + WDataInP rwp) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = VL_SEL_IWII(rbits, rwp, (N_Depth - 1 - i) * lbits, lbits) & mask; } template -static inline void VL_UNPACK_IW(int lbits, int rbits, VlUnpacked& q, - WDataInP rwp) { +static inline void VL_UNPACK_UI_W(int lbits, int rbits, VlUnpacked& q, + WDataInP rwp) { const IData mask = VL_MASK_I(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = VL_SEL_IWII(rbits, rwp, (N_Depth - 1 - i) * lbits, lbits) & mask; } template -static inline void VL_UNPACK_QW(int lbits, int rbits, VlUnpacked& q, - WDataInP rwp) { +static inline void VL_UNPACK_UQ_W(int lbits, int rbits, VlUnpacked& q, + WDataInP rwp) { const QData mask = VL_MASK_Q(lbits); for (size_t i = 0; i < N_Depth; ++i) q[i] = VL_SEL_QWII(rbits, rwp, (N_Depth - 1 - i) * lbits, lbits) & mask; } template -static inline void VL_UNPACK_WW(int lbits, int rbits, VlUnpacked, N_Depth>& q, - WDataInP rwp) { +static inline void VL_UNPACK_UW_W(int lbits, int rbits, VlUnpacked, N_Depth>& q, + WDataInP rwp) { for (size_t i = 0; i < N_Depth; ++i) VL_SEL_WWII(lbits, rbits, q[i], rwp, (N_Depth - 1 - i) * lbits, lbits); } diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index ce027827f..aac157825 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -1139,7 +1139,7 @@ public: } ASTGEN_MEMBERS_AstCvtArrayToPacked; string emitVerilog() override { V3ERROR_NA_RETURN(""); } - string emitC() override { return "VL_PACK_%nq%rq(%nw, %rw, %P, %li)"; } + string emitC() override { V3ERROR_NA_RETURN(""); } bool cleanOut() const override { return true; } }; class AstCvtPackedToArray final : public AstNodeExpr { diff --git a/src/V3EmitCFunc.h b/src/V3EmitCFunc.h index 30075f281..d270a9e2a 100644 --- a/src/V3EmitCFunc.h +++ b/src/V3EmitCFunc.h @@ -186,8 +186,17 @@ public: bool emitSimpleOk(AstNodeExpr* nodep); void emitIQW(AstNode* nodep) { - // Other abbrevs: "C"har, "S"hort, "F"loat, "D"ouble, stri"N"g - puts(nodep->dtypep()->charIQWN()); + // See "Type letters" in verilated.h + // Other abbrevs: "C"har, "S"hort, "F"loat, "D"ouble, stri"N"g, "R"=queue, "U"npacked + puts(nodep->dtypep()->skipRefp()->charIQWN()); + } + void emitRU(AstNode* nodep) { + AstNodeDType* dtp = nodep->dtypep()->skipRefp(); + // See "Type letters" in verilated.h + if (VN_IS(dtp, UnpackArrayDType)) + puts("U"); + else if (VN_IS(dtp, QueueDType) || VN_IS(dtp, DynArrayDType)) + puts("R"); } void emitScIQW(AstVar* nodep) { UASSERT_OBJ(nodep->isSc(), nodep, "emitting SystemC operator on non-SC variable"); @@ -387,8 +396,14 @@ public: } void visit(AstCvtArrayToPacked* nodep) override { - AstNodeDType* const elemDTypep = nodep->fromp()->dtypep()->subDTypep(); - emitOpName(nodep, nodep->emitC(), nodep->fromp(), elemDTypep, nullptr); + AstNodeDType* const fromDtp = nodep->fromp()->dtypep()->skipRefp(); + AstNodeDType* const elemDtp = fromDtp->subDTypep()->skipRefp(); + puts("VL_PACK_"); + emitIQW(nodep); + puts("_"); + emitRU(fromDtp); + emitIQW(elemDtp); + emitOpName(nodep, "(%nw, %rw, %P, %li)", nodep->fromp(), elemDtp, nullptr); } void visit(AstCvtUnpackedToQueue* nodep) override { @@ -453,7 +468,10 @@ public: } else if (const AstCvtPackedToArray* const castp = VN_CAST(nodep->rhsp(), CvtPackedToArray)) { putns(castp, "VL_UNPACK_"); + emitRU(nodep); emitIQW(nodep->dtypep()->subDTypep()); + puts("_"); + emitRU(castp->fromp()); emitIQW(castp->fromp()); puts("("); putns(castp->dtypep(), cvtToStr(castp->dtypep()->subDTypep()->widthMin()));