diff --git a/src/V3Force.cpp b/src/V3Force.cpp index fef1fce69..3ddc21489 100644 --- a/src/V3Force.cpp +++ b/src/V3Force.cpp @@ -203,7 +203,7 @@ public: return VN_IS(dtypep->skipRefp(), UnpackArrayDType); } - static bool isBitwiseDType(AstNode* nodep) { + static bool isBitwiseDType(const AstNode* nodep) { const AstBasicDType* const basicp = nodep->dtypep()->skipRefp()->basicp(); return basicp && !basicp->isDouble() && !basicp->isString() && !basicp->isOpaque(); } @@ -863,9 +863,7 @@ class ForceDiscoveryVisitor final : public VNVisitorConst { "buildForceableUnpackedArray called with non-unpacked dtype"); const AstNodeDType* const leafDtypep = dims.back()->subDTypep()->skipRefp(); const AstBasicDType* const innerBasicp = leafDtypep->basicp(); - const bool innerBitwise = innerBasicp && !innerBasicp->isDouble() - && !innerBasicp->isString() && !innerBasicp->isOpaque(); - if (!innerBitwise) { + if (!ForceState::isBitwiseDType(innerBasicp)) { varp->v3warn(E_UNSUPPORTED, "Unsupported: Forcing unpacked arrays of non-bitwise inner type: " << varp->name()); // (#4735) diff --git a/src/V3Inline.cpp b/src/V3Inline.cpp index 4e71852a3..24296d2a4 100644 --- a/src/V3Inline.cpp +++ b/src/V3Inline.cpp @@ -698,9 +698,7 @@ void connectPort(AstNodeModule* modp, AstVar* nodep, AstNodeExpr* pinExprp) { const auto pinRefAsExpr = [&](VAccess access) -> AstNodeExpr* { if (const AstVarRef* const vrp = VN_CAST(pinRefp, VarRef)) { - AstVarRef* const newp = new AstVarRef{vrp->fileline(), vrp->varp(), access}; - newp->classOrPackagep(vrp->classOrPackagep()); - return newp; + return pinRefAsVarRef(access); } else { const AstVarXRef* const xrp = VN_AS(pinRefp, VarXRef); AstVarXRef* const newp diff --git a/src/V3Number.cpp b/src/V3Number.cpp index d97e4ed50..17eaac079 100644 --- a/src/V3Number.cpp +++ b/src/V3Number.cpp @@ -438,20 +438,20 @@ V3Number& V3Number::setZero() { return *this; } V3Number& V3Number::setQuad(uint64_t value) { - for (int i = 0; i < words(); ++i) m_data.num()[i] = {0, 0}; + setZero(); m_data.num()[0].m_value = value & 0xffffffffULL; if (width() > 32) m_data.num()[1].m_value = (value >> 32ULL) & 0xffffffffULL; opCleanThis(); return *this; } V3Number& V3Number::setLong(uint32_t value) { - for (int i = 0; i < words(); ++i) m_data.num()[i] = {0, 0}; + setZero(); m_data.num()[0].m_value = value; opCleanThis(); return *this; } V3Number& V3Number::setLongS(int32_t value) { - for (int i = 0; i < words(); ++i) m_data.num()[i] = {0, 0}; + setZero(); union { uint32_t u; int32_t s; @@ -484,7 +484,7 @@ V3Number& V3Number::setSingleBits(char value) { } V3Number& V3Number::setAllBits0() { - for (int i = 0; i < words(); ++i) m_data.num()[i] = {0, 0}; + setZero(); return *this; } V3Number& V3Number::setAllBits1() {