diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index f83def594..f21b2b178 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -3415,6 +3415,65 @@ public: int instrCount() const override { return widthInstrs() * 2; } bool stringFlavor() const override { return true; } }; +class AstSel final : public AstNodeBiop { + // *Resolved* (tyep checked) multiple bit range extraction. Always const width + // @astgen alias op1 := fromp + // @astgen alias op2 := lsbp + VNumRange m_declRange; // Range of the 'from' array if isRanged() is set, else invalid + int m_declElWidth; // If a packed array, the number of bits per element + // Selection width (!= this->width() from V3Clean onwards, != this->widthMin() in V3Width) + int m_widthConst; + +public: + AstSel(FileLine* fl, AstNodeExpr* fromp, AstNodeExpr* lsbp, int bitwidth) + : ASTGEN_SUPER_Sel(fl, fromp, lsbp) + , m_declElWidth{1} + , m_widthConst{bitwidth} { + dtypeSetLogicSized(bitwidth, VSigning::UNSIGNED); + } + AstSel(FileLine* fl, AstNodeExpr* fromp, int lsb, int bitwidth) + : ASTGEN_SUPER_Sel(fl, fromp, new AstConst(fl, lsb)) // Need () constructor + , m_declElWidth{1} + , m_widthConst{bitwidth} { + dtypeSetLogicSized(bitwidth, VSigning::UNSIGNED); + } + ASTGEN_MEMBERS_AstSel; + AstNodeExpr* cloneType(AstNodeExpr* lhsp, AstNodeExpr* rhsp) override { + return new AstSel{fileline(), lhsp, rhsp, widthConst()}; + } + void dump(std::ostream& str) const override; + void dumpJson(std::ostream& str) const override; + void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit) override { + out.opSel(from, bit.toUInt() + widthConst() - 1, bit.toUInt()); + } + string emitVerilog() override { V3ERROR_NA_RETURN(""); } + string emitC() override { + return widthConst() == 1 ? "VL_BITSEL_%nq%lq%rqI(%lw, %P, %li, %ri)" + : isWide() ? "VL_SEL_%nq%lq%rqI(%nw, %lw, %P, %li, %ri, %nw)" + : "VL_SEL_%nq%lq%rqI(%lw, %P, %li, %ri, %nw)"; + } + string emitSMT() const override { return "((_ extract %t %r) %l)"; } + bool cleanOut() const override { return false; } + bool cleanLhs() const override { return true; } + bool cleanRhs() const override { return true; } + bool sizeMattersLhs() const override { return false; } + bool sizeMattersRhs() const override { return false; } + bool sameNode(const AstNode* otherp) const override { + return widthConst() == VN_DBG_AS(otherp, Sel)->widthConst(); + } + int instrCount() const override { + return widthInstrs() * (VN_CAST(lsbp(), Const) ? 3 : 10) + 1; + } + int widthConst() const { return m_widthConst; } + void widthConst(int value) { m_widthConst = value; } + int lsbConst() const { return VN_AS(lsbp(), Const)->toSInt(); } + int msbConst() const { return lsbConst() + widthConst() - 1; } + VNumRange& declRange() VL_MT_STABLE { return m_declRange; } + const VNumRange& declRange() const VL_MT_STABLE { return m_declRange; } + void declRange(const VNumRange& flag) { m_declRange = flag; } + int declElWidth() const { return m_declElWidth; } + void declElWidth(int flag) { m_declElWidth = flag; } +}; class AstShiftL final : public AstNodeBiop { public: AstShiftL(FileLine* fl, AstNodeExpr* lhsp, AstNodeExpr* rhsp, int setwidth = 0) @@ -4693,59 +4752,6 @@ public: bool sizeMattersRhs() const override { return false; } bool sizeMattersThs() const override { return false; } }; -class AstSel final : public AstNodeTriop { - // Multiple bit range extraction - // @astgen alias op1 := fromp - // @astgen alias op2 := lsbp - // @astgen alias op3 := widthp - VNumRange m_declRange; // Range of the 'from' array if isRanged() is set, else invalid - int m_declElWidth; // If a packed array, the number of bits per element -public: - AstSel(FileLine* fl, AstNodeExpr* fromp, AstNodeExpr* lsbp, AstNodeExpr* widthp) - : ASTGEN_SUPER_Sel(fl, fromp, lsbp, widthp) - , m_declElWidth{1} { - if (VN_IS(widthp, Const)) { - dtypeSetLogicSized(VN_AS(widthp, Const)->toUInt(), VSigning::UNSIGNED); - } - } - AstSel(FileLine* fl, AstNodeExpr* fromp, int lsb, int bitwidth) - : ASTGEN_SUPER_Sel(fl, fromp, new AstConst(fl, lsb), // Need () constructor - new AstConst(fl, bitwidth)) // Need () constructor - , m_declElWidth{1} { - dtypeSetLogicSized(bitwidth, VSigning::UNSIGNED); - } - ASTGEN_MEMBERS_AstSel; - void dump(std::ostream& str) const override; - void dumpJson(std::ostream& str) const override; - void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit, - const V3Number& width) override { - out.opSel(from, bit.toUInt() + width.toUInt() - 1, bit.toUInt()); - } - string emitVerilog() override { V3ERROR_NA_RETURN(""); } - string emitC() override { - return widthp()->isOne() ? "VL_BITSEL_%nq%lq%rq%tq(%lw, %P, %li, %ri)" - : isWide() ? "VL_SEL_%nq%lq%rq%tq(%nw,%lw, %P, %li, %ri, %ti)" - : "VL_SEL_%nq%lq%rq%tq(%lw, %P, %li, %ri, %ti)"; - } - string emitSMT() const override { return "((_ extract %t %r) %l)"; } - bool cleanOut() const override { return false; } - bool cleanLhs() const override { return true; } - bool cleanRhs() const override { return true; } - bool cleanThs() const override { return true; } - bool sizeMattersLhs() const override { return false; } - bool sizeMattersRhs() const override { return false; } - bool sizeMattersThs() const override { return false; } - bool sameNode(const AstNode*) const override { return true; } - int instrCount() const override { return widthInstrs() * (VN_CAST(lsbp(), Const) ? 3 : 10); } - int widthConst() const { return VN_AS(widthp(), Const)->toSInt(); } - int lsbConst() const { return VN_AS(lsbp(), Const)->toSInt(); } - int msbConst() const { return lsbConst() + widthConst() - 1; } - VNumRange& declRange() VL_MT_STABLE { return m_declRange; } - const VNumRange& declRange() const VL_MT_STABLE { return m_declRange; } - void declRange(const VNumRange& flag) { m_declRange = flag; } - int declElWidth() const { return m_declElWidth; } - void declElWidth(int flag) { m_declElWidth = flag; } -}; class AstSliceSel final : public AstNodeTriop { // Multiple array element extraction // @astgen alias op1 := fromp diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index 2e6e8b792..59bed182c 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -2358,13 +2358,15 @@ void AstPatMember::dumpJson(std::ostream& str) const { void AstNodeTriop::dump(std::ostream& str) const { this->AstNodeExpr::dump(str); } void AstNodeTriop::dumpJson(std::ostream& str) const { dumpJsonGen(str); } void AstSel::dump(std::ostream& str) const { - this->AstNodeTriop::dump(str); + this->AstNodeBiop::dump(str); + str << " widthConst=" << this->widthConst(); if (declRange().ranged()) { str << " decl" << declRange() << "]"; if (declElWidth() != 1) str << "/" << declElWidth(); } } void AstSel::dumpJson(std::ostream& str) const { + dumpJsonNumFunc(str, widthConst); if (declRange().ranged()) { dumpJsonStr(str, "declRange", cvtToStr(declRange())); dumpJsonNumFunc(str, declElWidth); diff --git a/src/V3Clean.cpp b/src/V3Clean.cpp index c4dc07ff3..35a84f778 100644 --- a/src/V3Clean.cpp +++ b/src/V3Clean.cpp @@ -233,7 +233,7 @@ class CleanVisitor final : public VNVisitor { setClean(nodep, true); } void visit(AstSel* nodep) override { - operandTriop(nodep); + operandBiop(nodep); setClean(nodep, nodep->cleanOut()); } void visit(AstUCFunc* nodep) override { diff --git a/src/V3Const.cpp b/src/V3Const.cpp index b5c89be43..9c94bab16 100644 --- a/src/V3Const.cpp +++ b/src/V3Const.cpp @@ -1310,8 +1310,7 @@ class ConstVisitor final : public VNVisitor { >= VN_AS(nodep->fromp(), NodeVarRef)->varp()->widthWords())); } bool operandSelFull(const AstSel* nodep) { - return (VN_IS(nodep->lsbp(), Const) && VN_IS(nodep->widthp(), Const) - && nodep->lsbConst() == 0 + return (VN_IS(nodep->lsbp(), Const) && nodep->lsbConst() == 0 && static_cast(nodep->widthConst()) == nodep->fromp()->width()); } bool operandSelExtend(AstSel* nodep) { @@ -1319,8 +1318,7 @@ class ConstVisitor final : public VNVisitor { // SEL(EXTEND(any,width,...),(width-1),0) -> ... // Since select's return unsigned, this is always an extend AstExtend* const extendp = VN_CAST(nodep->fromp(), Extend); - if (!(m_doV && extendp && VN_IS(nodep->lsbp(), Const) && VN_IS(nodep->widthp(), Const) - && nodep->lsbConst() == 0 + if (!(m_doV && extendp && VN_IS(nodep->lsbp(), Const) && nodep->lsbConst() == 0 && static_cast(nodep->widthConst()) == extendp->lhsp()->width())) return false; VL_DO_DANGLING(replaceWChild(nodep, extendp->lhsp()), nodep); @@ -1330,9 +1328,7 @@ class ConstVisitor final : public VNVisitor { // SEL(ADD(a,b),(width-1),0) -> ADD(SEL(a),SEL(b)) // Add or any operation which doesn't care if we discard top bits AstNodeBiop* const bip = VN_CAST(nodep->fromp(), NodeBiop); - if (!(m_doV && bip && VN_IS(nodep->lsbp(), Const) && VN_IS(nodep->widthp(), Const) - && nodep->lsbConst() == 0)) - return false; + if (!(m_doV && bip && VN_IS(nodep->lsbp(), Const) && nodep->lsbConst() == 0)) return false; if (debug() >= 9) nodep->dumpTree("- SEL(BI)-in: "); AstNodeExpr* const bilhsp = bip->lhsp()->unlinkFrBack(); AstNodeExpr* const birhsp = bip->rhsp()->unlinkFrBack(); @@ -1347,8 +1343,7 @@ class ConstVisitor final : public VNVisitor { // becomes thought other optimizations // SEL(SHIFTR({a},{b}),{lsb},{width}) -> SEL({a},{lsb+b},{width}) AstShiftR* const shiftp = VN_CAST(nodep->fromp(), ShiftR); - if (!(m_doV && shiftp && VN_IS(shiftp->rhsp(), Const) && VN_IS(nodep->lsbp(), Const) - && VN_IS(nodep->widthp(), Const))) { + if (!(m_doV && shiftp && VN_IS(shiftp->rhsp(), Const) && VN_IS(nodep->lsbp(), Const))) { return false; } AstNodeExpr* const ap = shiftp->lhsp(); @@ -1420,14 +1415,13 @@ class ConstVisitor final : public VNVisitor { // Find range of dtype we are selecting from // Similar code in V3Unknown::AstSel const bool doit = true; - if (m_warn && VN_IS(nodep->lsbp(), Const) && VN_IS(nodep->widthp(), Const) && doit) { + if (m_warn && VN_IS(nodep->lsbp(), Const) && doit) { const int maxDeclBit = nodep->declRange().hiMaxSelect() * nodep->declElWidth() + (nodep->declElWidth() - 1); - if (VN_AS(nodep->lsbp(), Const)->num().isFourState() - || VN_AS(nodep->widthp(), Const)->num().isFourState()) { + if (VN_AS(nodep->lsbp(), Const)->num().isFourState()) { nodep->v3error("Selection index is constantly unknown or tristated: " "lsb=" - << nodep->lsbp()->name() << " width=" << nodep->widthp()->name()); + << nodep->lsbp()->name() << " width=" << nodep->widthConst()); // Replacing nodep will make a mess above, so we replace the offender replaceZero(nodep->lsbp()); } else if (nodep->declRange().ranged() @@ -1510,10 +1504,8 @@ class ConstVisitor final : public VNVisitor { if (!lfromp || !rfromp || !lfromp->sameGateTree(rfromp)) return false; const AstConst* const lstart = VN_CAST(lhsp->lsbp(), Const); const AstConst* const rstart = VN_CAST(rhsp->lsbp(), Const); - const AstConst* const lwidth = VN_CAST(lhsp->widthp(), Const); - const AstConst* const rwidth = VN_CAST(rhsp->widthp(), Const); - if (!lstart || !rstart || !lwidth || !rwidth) return false; // too complicated - const int rend = (rstart->toSInt() + rwidth->toSInt()); + if (!lstart || !rstart) return false; // too complicated + const int rend = (rstart->toSInt() + rhsp->widthConst()); return (rend == lstart->toSInt()); } bool ifMergeAdjacent(AstNodeExpr* lhsp, AstNodeExpr* rhsp) { @@ -1543,10 +1535,8 @@ class ConstVisitor final : public VNVisitor { if (!lfromp || !rfromp || !lfromp->sameGateTree(rfromp)) return false; AstConst* const lstart = VN_CAST(lselp->lsbp(), Const); AstConst* const rstart = VN_CAST(rselp->lsbp(), Const); - AstConst* const lwidth = VN_CAST(lselp->widthp(), Const); - AstConst* const rwidth = VN_CAST(rselp->widthp(), Const); - if (!lstart || !rstart || !lwidth || !rwidth) return false; // too complicated - const int rend = (rstart->toSInt() + rwidth->toSInt()); + if (!lstart || !rstart) return false; // too complicated + const int rend = (rstart->toSInt() + rselp->widthConst()); // a[i:j] a[j-1:k] if (rend == lstart->toSInt()) return true; // a[i:0] a[msb:j] @@ -2566,7 +2556,6 @@ class ConstVisitor final : public VNVisitor { // SEL(SEL({x},a,b),c,d) => SEL({x},a+c,d) AstSel* const belowp = VN_AS(nodep->fromp(), Sel); AstNodeExpr* const fromp = belowp->fromp()->unlinkFrBack(); - AstNodeExpr* const widthp = nodep->widthp()->unlinkFrBack(); AstNodeExpr* const lsb1p = nodep->lsbp()->unlinkFrBack(); AstNodeExpr* const lsb2p = belowp->lsbp()->unlinkFrBack(); // Eliminate lower range @@ -2594,7 +2583,7 @@ class ConstVisitor final : public VNVisitor { newlsbp = new AstAdd{lsb1p->fileline(), lhsp, rhsp}; newlsbp->dtypeFrom(widep); } - AstSel* const newp = new AstSel{nodep->fileline(), fromp, newlsbp, widthp}; + AstSel* const newp = new AstSel{nodep->fileline(), fromp, newlsbp, nodep->widthConst()}; nodep->replaceWithKeepDType(newp); VL_DO_DANGLING(pushDeletep(nodep), nodep); } @@ -2636,8 +2625,6 @@ class ConstVisitor final : public VNVisitor { AstNodeExpr* const fromp = repp->srcp(); AstConst* const lsbp = VN_CAST(nodep->lsbp(), Const); if (!lsbp) return false; - AstNodeExpr* const widthp = nodep->widthp(); - if (!VN_IS(widthp, Const)) return false; UASSERT_OBJ(fromp->width(), nodep, "Not widthed"); if ((lsbp->toUInt() / fromp->width()) != ((lsbp->toUInt() + nodep->width() - 1) / fromp->width())) { @@ -2645,10 +2632,9 @@ class ConstVisitor final : public VNVisitor { } // fromp->unlinkFrBack(); - widthp->unlinkFrBack(); - AstSel* const newp - = new AstSel{nodep->fileline(), fromp, - new AstConst{lsbp->fileline(), lsbp->toUInt() % fromp->width()}, widthp}; + AstSel* const newp = new AstSel{ + nodep->fileline(), fromp, + new AstConst{lsbp->fileline(), lsbp->toUInt() % fromp->width()}, nodep->widthConst()}; nodep->replaceWithKeepDType(newp); VL_DO_DANGLING(pushDeletep(nodep), nodep); return true; @@ -2705,14 +2691,13 @@ class ConstVisitor final : public VNVisitor { AstNodeBiop* const fromp = VN_AS(nodep->fromp()->unlinkFrBack(), NodeBiop); UASSERT_OBJ(fromp, nodep, "Called on non biop"); AstNodeExpr* const lsbp = nodep->lsbp()->unlinkFrBack(); - AstNodeExpr* const widthp = nodep->widthp()->unlinkFrBack(); // AstNodeExpr* const bilhsp = fromp->lhsp()->unlinkFrBack(); AstNodeExpr* const birhsp = fromp->rhsp()->unlinkFrBack(); // - fromp->lhsp(new AstSel{nodep->fileline(), bilhsp, lsbp->cloneTreePure(true), - widthp->cloneTreePure(true)}); - fromp->rhsp(new AstSel{nodep->fileline(), birhsp, lsbp, widthp}); + fromp->lhsp( + new AstSel{nodep->fileline(), bilhsp, lsbp->cloneTreePure(true), nodep->widthConst()}); + fromp->rhsp(new AstSel{nodep->fileline(), birhsp, lsbp, nodep->widthConst()}); nodep->replaceWithKeepDType(fromp); VL_DO_DANGLING(pushDeletep(nodep), nodep); } @@ -2721,11 +2706,10 @@ class ConstVisitor final : public VNVisitor { AstNodeUniop* const fromp = VN_AS(nodep->fromp()->unlinkFrBack(), NodeUniop); UASSERT_OBJ(fromp, nodep, "Called on non biop"); AstNodeExpr* const lsbp = nodep->lsbp()->unlinkFrBack(); - AstNodeExpr* const widthp = nodep->widthp()->unlinkFrBack(); // AstNodeExpr* const bilhsp = fromp->lhsp()->unlinkFrBack(); // - fromp->lhsp(new AstSel{nodep->fileline(), bilhsp, lsbp, widthp}); + fromp->lhsp(new AstSel{nodep->fileline(), bilhsp, lsbp, nodep->widthConst()}); nodep->replaceWithKeepDType(fromp); VL_DO_DANGLING(pushDeletep(nodep), nodep); } @@ -3771,9 +3755,9 @@ class ConstVisitor final : public VNVisitor { TREEOPV("AstSel{$fromp.castSub, operandSelBiLower(nodep)}", "DONE"); TREEOPV("AstSel{$fromp.castXor, operandSelBiLower(nodep)}", "DONE"); TREEOPV("AstSel{$fromp.castShiftR, operandSelShiftLower(nodep)}", "DONE"); - TREEOPA("AstSel{$fromp.castConst, $lsbp.castConst, $widthp.castConst, }", "replaceConst(nodep)"); - TREEOPV("AstSel{$fromp.castConcat, $lsbp.castConst, $widthp.castConst, }", "replaceSelConcat(nodep)"); - TREEOPV("AstSel{$fromp.castReplicate, $lsbp.castConst, $widthp.castConst, operandSelReplicate(nodep) }", "DONE"); + TREEOPA("AstSel{$fromp.castConst, $lsbp.castConst, }", "replaceConst(nodep)"); + TREEOPV("AstSel{$fromp.castConcat, $lsbp.castConst, }", "replaceSelConcat(nodep)"); + TREEOPV("AstSel{$fromp.castReplicate, $lsbp.castConst, operandSelReplicate(nodep) }", "DONE"); // V3Tristate requires selects below BufIf1. // Also do additional operators that are bit-independent, but only definite // win if bit select is a constant (otherwise we may need to compute bit index several times) diff --git a/src/V3Coverage.cpp b/src/V3Coverage.cpp index 0ee911e69..a5ef8f363 100644 --- a/src/V3Coverage.cpp +++ b/src/V3Coverage.cpp @@ -931,13 +931,11 @@ class CoverageVisitor final : public VNVisitor { const int width = lhsp->dtypep()->width(); const size_t expected = std::is_same::value ? 0x1 << width : width + 1; if (checkMaxExprs(expected)) return; - AstNodeExpr* unrolledp = new AstSel{fl, lhsp->cloneTree(false), - new AstConst{fl, static_cast(width - 1)}, - new AstConst{fl, 1}}; + AstNodeExpr* unrolledp = new AstSel{ + fl, lhsp->cloneTree(false), new AstConst{fl, static_cast(width - 1)}, 1}; for (int bit = width - 2; bit >= 0; bit--) { AstSel* const selp = new AstSel{fl, lhsp->cloneTree(false), - new AstConst{fl, static_cast(bit)}, - new AstConst{fl, 1}}; + new AstConst{fl, static_cast(bit)}, 1}; unrolledp = new T_Oper{fl, selp, unrolledp}; } iterate(unrolledp); diff --git a/src/V3Delayed.cpp b/src/V3Delayed.cpp index 56bef3a3d..0ff531812 100644 --- a/src/V3Delayed.cpp +++ b/src/V3Delayed.cpp @@ -358,7 +358,7 @@ class DelayedVisitor final : public VNVisitor { // Insert new statements before 'insertp'. // Returns a read reference to the temporary variable. AstVarRef* createWidened(FileLine* flp, AstScope* scopep, AstNodeDType* dtypep, - AstNodeExpr* sLsbp, AstNodeExpr* sWidthp, const std::string& name, + AstNodeExpr* sLsbp, int sWidth, const std::string& name, AstNodeExpr* valuep, AstNode* insertp) { // Create temporary variable. AstVarScope* const tp = createTemp(flp, scopep, name, dtypep); @@ -369,7 +369,7 @@ class DelayedVisitor final : public VNVisitor { new AstAssign{flp, new AstVarRef{flp, tp, VAccess::WRITE}, zerop}); // Set the selected bits to 'valuep' AstSel* const selp = new AstSel{flp, new AstVarRef{flp, tp, VAccess::WRITE}, - sLsbp->cloneTreePure(true), sWidthp->cloneTreePure(true)}; + sLsbp->cloneTreePure(true), sWidth}; insertp->addHereThisAsNext(new AstAssign{flp, selp, valuep}); // This is the expression to get the value of the temporary return new AstVarRef{flp, tp, VAccess::READ}; @@ -633,22 +633,21 @@ class DelayedVisitor final : public VNVisitor { // Need to create a mask and widen the value to element size. lhsNodep = lSelp->fromp(); AstNodeExpr* const sLsbp = lSelp->lsbp(); - AstConst* const sWidthp = VN_AS(lSelp->widthp(), Const); + const int sWidth = lSelp->widthConst(); // Create mask value maskp = [&]() -> AstNodeExpr* { // Constant mask we can compute here if (AstConst* const cLsbp = VN_CAST(sLsbp, Const)) { AstConst* const cp = new AstConst{flp, AstConst::DTyped{}, eDTypep}; - cp->num().setMask(sWidthp->toSInt(), cLsbp->toSInt()); + cp->num().setMask(sWidth, cLsbp->toSInt()); return cp; } // A non-constant mask we must compute at run-time. - AstConst* const onesp - = new AstConst{flp, AstConst::WidthedValue{}, sWidthp->toSInt(), 0}; + AstConst* const onesp = new AstConst{flp, AstConst::WidthedValue{}, sWidth, 0}; onesp->num().setAllBits1(); - return createWidened(flp, scopep, eDTypep, sLsbp, sWidthp, + return createWidened(flp, scopep, eDTypep, sLsbp, sWidth, "__VdlyMask" + baseName, onesp, nodep); }(); @@ -659,14 +658,13 @@ class DelayedVisitor final : public VNVisitor { if (AstConst* const cLsbp = VN_CAST(sLsbp, Const)) { AstConst* const cp = new AstConst{flp, AstConst::DTyped{}, eDTypep}; cp->num().setAllBits0(); - cp->num().opSelInto(cValuep->num(), cLsbp->toSInt(), - sWidthp->toSInt()); + cp->num().opSelInto(cValuep->num(), cLsbp->toSInt(), sWidth); return cp; } } // A non-constant value we must adjust. - return createWidened(flp, scopep, eDTypep, sLsbp, sWidthp, // + return createWidened(flp, scopep, eDTypep, sLsbp, sWidth, // "__VdlyElem" + baseName, valuep, nodep); }(); } else { diff --git a/src/V3DfgAstToDfg.cpp b/src/V3DfgAstToDfg.cpp index aa5f8715e..e02a14e3f 100644 --- a/src/V3DfgAstToDfg.cpp +++ b/src/V3DfgAstToDfg.cpp @@ -172,7 +172,7 @@ class AstToDfgVisitor final : public VNVisitor { if (AstSel* const selp = VN_CAST(nodep, Sel)) { AstVarRef* const vrefp = VN_CAST(selp->fromp(), VarRef); const AstConst* const lsbp = VN_CAST(selp->lsbp(), Const); - if (!vrefp || !lsbp || !VN_IS(selp->widthp(), Const)) { + if (!vrefp || !lsbp) { ++m_ctx.m_nonRepLhs; return false; } @@ -555,11 +555,7 @@ class AstToDfgVisitor final : public VNVisitor { void visit(AstSel* nodep) override { UASSERT_OBJ(!nodep->user1p(), nodep, "Already has Dfg vertex"); if (unhandled(nodep)) return; - if (!VN_IS(nodep->widthp(), Const)) { // This should never be taken, but paranoia - m_foundUnhandled = true; - ++m_ctx.m_nonRepNode; - return; - } + iterate(nodep->fromp()); if (m_foundUnhandled) return; diff --git a/src/V3DfgDfgToAst.cpp b/src/V3DfgDfgToAst.cpp index ce094ccd0..410d98e48 100644 --- a/src/V3DfgDfgToAst.cpp +++ b/src/V3DfgDfgToAst.cpp @@ -173,8 +173,8 @@ class DfgToAstVisitor final : DfgVisitor { FileLine* const flp = dfgVarp->driverFileLine(idx); AstVarRef* const refp = new AstVarRef{flp, dfgVarp->varp(), VAccess::WRITE}; AstConst* const lsbp = new AstConst{flp, dfgVarp->driverLsb(idx)}; - AstConst* const widthp = new AstConst{flp, edge.sourcep()->width()}; - AstSel* const lhsp = new AstSel{flp, refp, lsbp, widthp}; + const int width = static_cast(edge.sourcep()->width()); + AstSel* const lhsp = new AstSel{flp, refp, lsbp, width}; // Add assignment of the value to the selected bits addResultEquation(flp, lhsp, rhsp); }); @@ -218,16 +218,14 @@ class DfgToAstVisitor final : DfgVisitor { FileLine* const flp = vtxp->fileline(); AstNodeExpr* const fromp = convertDfgVertexToAstNodeExpr(vtxp->fromp()); AstConst* const lsbp = new AstConst{flp, vtxp->lsb()}; - AstConst* const widthp = new AstConst{flp, vtxp->width()}; - m_resultp = new AstSel{flp, fromp, lsbp, widthp}; + m_resultp = new AstSel{flp, fromp, lsbp, static_cast(vtxp->width())}; } void visit(DfgMux* vtxp) override { FileLine* const flp = vtxp->fileline(); AstNodeExpr* const fromp = convertDfgVertexToAstNodeExpr(vtxp->fromp()); AstNodeExpr* const lsbp = convertDfgVertexToAstNodeExpr(vtxp->lsbp()); - AstConst* const widthp = new AstConst{flp, vtxp->width()}; - m_resultp = new AstSel{flp, fromp, lsbp, widthp}; + m_resultp = new AstSel{flp, fromp, lsbp, static_cast(vtxp->width())}; } // The rest of the 'visit' methods are generated by 'astgen' diff --git a/src/V3EmitCFunc.h b/src/V3EmitCFunc.h index 13399eee0..99cc3a259 100644 --- a/src/V3EmitCFunc.h +++ b/src/V3EmitCFunc.h @@ -421,6 +421,7 @@ public: bool decind = false; bool rhs = true; if (AstSel* const selp = VN_CAST(nodep->lhsp(), Sel)) { + UASSERT_OBJ(selp->widthMin() == selp->widthConst(), selp, "Width mismatch"); if (selp->widthMin() == 1) { putnbs(nodep, "VL_ASSIGNBIT_"); emitIQW(selp->fromp()); @@ -1260,7 +1261,8 @@ public: } void visit(AstSel* nodep) override { // Note ASSIGN checks for this on a LHS - emitOpName(nodep, nodep->emitC(), nodep->fromp(), nodep->lsbp(), nodep->widthp()); + UASSERT_OBJ(nodep->widthMin() == nodep->widthConst(), nodep, "Width mismatch"); + emitOpName(nodep, nodep->emitC(), nodep->fromp(), nodep->lsbp(), nullptr); } void visit(AstReplicate* nodep) override { if (nodep->srcp()->widthMin() == 1 && !nodep->isWide()) { diff --git a/src/V3EmitV.cpp b/src/V3EmitV.cpp index 3facbbc5d..794c64b73 100644 --- a/src/V3EmitV.cpp +++ b/src/V3EmitV.cpp @@ -642,11 +642,11 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public EmitCBaseVisitorConst { } puts("["); if (VN_IS(nodep->lsbp(), Const)) { - if (nodep->widthp()->isOne()) { + if (nodep->widthConst() == 1) { puts(cvtToStr(VN_AS(nodep->lsbp(), Const)->toSInt() + offset)); } else { - puts(cvtToStr(VN_AS(nodep->lsbp(), Const)->toSInt() - + VN_AS(nodep->widthp(), Const)->toSInt() + offset - 1)); + puts(cvtToStr(VN_AS(nodep->lsbp(), Const)->toSInt() + nodep->widthConst() + offset + - 1)); puts(":"); puts(cvtToStr(VN_AS(nodep->lsbp(), Const)->toSInt() + offset)); } @@ -657,7 +657,7 @@ class EmitVBaseVisitorConst VL_NOT_FINAL : public EmitCBaseVisitorConst { puts(cvtToStr(offset)); } putfs(nodep, "+:"); - iterateAndNextConstNull(nodep->widthp()); + puts(cvtToStr(nodep->widthConst())); puts("]"); } puts("]"); diff --git a/src/V3EmitXml.cpp b/src/V3EmitXml.cpp index 2fb2d1896..ee43b621f 100644 --- a/src/V3EmitXml.cpp +++ b/src/V3EmitXml.cpp @@ -255,6 +255,11 @@ class EmitXmlFileVisitor final : public VNVisitorConst { putsQuoted(nodep->funcp() ? nodep->funcp()->name() : nodep->name()); outputChildrenEnd(nodep, ""); } + void visit(AstSel* nodep) override { + outputTag(nodep, ""); + puts(" widthConst=\"" + cvtToStr(nodep->widthConst()) + "\""); + outputChildrenEnd(nodep, ""); + } // Data types void visit(AstBasicDType* nodep) override { diff --git a/src/V3Gate.cpp b/src/V3Gate.cpp index b19e2516f..e7368142f 100644 --- a/src/V3Gate.cpp +++ b/src/V3Gate.cpp @@ -457,7 +457,7 @@ class GateClkDecomp final { // RHS if (const AstSel* const rselp = VN_CAST(rhsp, Sel)) { - if (VN_IS(rselp->lsbp(), Const) && VN_IS(rselp->widthp(), Const)) { + if (VN_IS(rselp->lsbp(), Const)) { if (clkOffset < rselp->lsbConst() || clkOffset > rselp->msbConst()) return; clkOffset -= rselp->lsbConst(); } else { @@ -473,7 +473,7 @@ class GateClkDecomp final { // LHS if (const AstSel* const lselp = VN_CAST(lhsp, Sel)) { - if (VN_IS(lselp->lsbp(), Const) && VN_IS(lselp->widthp(), Const)) { + if (VN_IS(lselp->lsbp(), Const)) { clkOffset += lselp->lsbConst(); } else { return; @@ -1248,10 +1248,8 @@ class GateMergeAssignments final { if (!pRefp || !cRefp || !cRefp->sameNode(pRefp)) return nullptr; // not the same var const AstConst* const pstart = VN_CAST(prevSelp->lsbp(), Const); - const AstConst* const pwidth = VN_CAST(prevSelp->widthp(), Const); const AstConst* const cstart = VN_CAST(currSelp->lsbp(), Const); - const AstConst* const cwidth = VN_CAST(currSelp->widthp(), Const); - if (!pstart || !pwidth || !cstart || !cwidth) return nullptr; // too complicated + if (!pstart || !cstart) return nullptr; // too complicated if (currSelp->msbConst() + 1 == prevSelp->lsbConst()) { return new AstSel{cRefp->fileline(), cRefp->cloneTree(false), currSelp->lsbConst(), diff --git a/src/V3Hasher.cpp b/src/V3Hasher.cpp index b6fee854b..c9561cc2f 100644 --- a/src/V3Hasher.cpp +++ b/src/V3Hasher.cpp @@ -215,6 +215,11 @@ class HasherVisitor final : public VNVisitorConst { void visit(AstNodeExpr* nodep) override { m_hash += hashNodeAndIterate(nodep, HASH_DTYPE, HASH_CHILDREN, []() {}); } + void visit(AstSel* nodep) override { + m_hash += hashNodeAndIterate(nodep, HASH_DTYPE, HASH_CHILDREN, [this, nodep]() { // + m_hash += nodep->widthConst(); + }); + } void visit(AstConst* nodep) override { m_hash += hashNodeAndIterate(nodep, HASH_DTYPE, HASH_CHILDREN, [this, nodep]() { // m_hash += nodep->num().toHash(); diff --git a/src/V3InstrCount.cpp b/src/V3InstrCount.cpp index 404f61166..15851c9c4 100644 --- a/src/V3InstrCount.cpp +++ b/src/V3InstrCount.cpp @@ -140,7 +140,6 @@ private: // the fromp() node which could be disproportionately large. const VisitBase vb{this, nodep}; iterateAndNextConstNull(nodep->lsbp()); - iterateAndNextConstNull(nodep->widthp()); } void visit(AstConcat* nodep) override { if (m_ignoreRemaining) return; diff --git a/src/V3LinkLValue.cpp b/src/V3LinkLValue.cpp index 79a22193d..39de33ef1 100644 --- a/src/V3LinkLValue.cpp +++ b/src/V3LinkLValue.cpp @@ -270,7 +270,6 @@ class LinkLValueVisitor final : public VNVisitor { // Only set lvalues on the from m_setRefLvalue = VAccess::NOCHANGE; iterateAndNextNull(nodep->lsbp()); - iterateAndNextNull(nodep->widthp()); } void visit(AstNodeSel* nodep) override { VL_RESTORER(m_setRefLvalue); diff --git a/src/V3Randomize.cpp b/src/V3Randomize.cpp index 1f9f0edbd..97b38e744 100644 --- a/src/V3Randomize.cpp +++ b/src/V3Randomize.cpp @@ -503,9 +503,15 @@ class ConstraintExprVisitor final : public VNVisitor { UASSERT_OBJ(smtExpr != "", nodep, "Node needs randomization constraint, but no emitSMT: " << nodep); - if (lhsp) lhsp = VN_AS(iterateSubtreeReturnEdits(lhsp->unlinkFrBack()), NodeExpr); - if (rhsp) rhsp = VN_AS(iterateSubtreeReturnEdits(rhsp->unlinkFrBack()), NodeExpr); - if (thsp) thsp = VN_AS(iterateSubtreeReturnEdits(thsp->unlinkFrBack()), NodeExpr); + if (lhsp) + lhsp = VN_AS(iterateSubtreeReturnEdits(lhsp->backp() ? lhsp->unlinkFrBack() : lhsp), + NodeExpr); + if (rhsp) + rhsp = VN_AS(iterateSubtreeReturnEdits(rhsp->backp() ? rhsp->unlinkFrBack() : rhsp), + NodeExpr); + if (thsp) + thsp = VN_AS(iterateSubtreeReturnEdits(thsp->backp() ? thsp->unlinkFrBack() : thsp), + NodeExpr); AstNodeExpr* argsp = nullptr; for (string::iterator pos = smtExpr.begin(); pos != smtExpr.end(); ++pos) { @@ -704,13 +710,11 @@ class ConstraintExprVisitor final : public VNVisitor { void visit(AstSel* nodep) override { if (editFormat(nodep)) return; VNRelinker handle; - AstNodeExpr* const widthp = nodep->widthp()->unlinkFrBack(&handle); FileLine* const fl = nodep->fileline(); - AstNodeExpr* const msbp - = new AstSFormatF{fl, "%1d", false, - new AstAdd{fl, nodep->lsbp()->cloneTreePure(false), - new AstSub{fl, widthp, new AstConst{fl, 1}}}}; - handle.relink(msbp); + AstNodeExpr* const msbp = new AstSFormatF{ + fl, "%1d", false, + new AstAdd{fl, nodep->lsbp()->cloneTreePure(false), + new AstConst{fl, static_cast(nodep->widthConst() - 1)}}}; AstNodeExpr* const lsbp = new AstSFormatF{fl, "%1d", false, nodep->lsbp()->unlinkFrBack(&handle)}; handle.relink(lsbp); @@ -1562,9 +1566,7 @@ class RandomizeVisitor final : public VNVisitor { fl, new AstSub{fl, tempRefp, new AstConst{fl, static_cast(aryDTypep->lo())}}, - new AstConst{fl, 0}, - new AstConst{ - fl, static_cast(V3Number::log2b(aryDTypep->hi()) + 1)}}}; + new AstConst{fl, 0}, V3Number::log2b(aryDTypep->hi()) + 1}}; } else if (VN_IS(tempDTypep, AssocArrayDType)) tempElementp = new AstAssocSel{fl, tempExprp, tempRefp}; else if (VN_IS(tempDTypep, QueueDType)) diff --git a/src/V3Simulate.h b/src/V3Simulate.h index f62f7dc75..f92183ea8 100644 --- a/src/V3Simulate.h +++ b/src/V3Simulate.h @@ -581,23 +581,13 @@ private: } } void visit(AstNodeBiop* nodep) override { - if (!optimizable()) return; // Accelerate - checkNodeInfo(nodep); - iterateChildrenConst(nodep); - if (!m_checkOnly && optimizable()) { - nodep->numberOperate(newConst(nodep)->num(), fetchConst(nodep->lhsp())->num(), - fetchConst(nodep->rhsp())->num()); - } - } - void visit(AstNodeTriop* nodep) override { if (!optimizable()) return; // Accelerate checkNodeInfo(nodep); iterateChildrenConst(nodep); if (!m_checkOnly && optimizable()) { AstConst* const valuep = newConst(nodep); nodep->numberOperate(newConst(nodep)->num(), fetchConst(nodep->lhsp())->num(), - fetchConst(nodep->rhsp())->num(), - fetchConst(nodep->thsp())->num()); + fetchConst(nodep->rhsp())->num()); // See #5490. 'numberOperate' on partially out of range select yields 'x' bits, // but in reality it would yield '0's without V3Table, so force 'x' bits to '0', // to ensure the result is the same with and without V3Table. @@ -607,6 +597,16 @@ private: } } } + void visit(AstNodeTriop* nodep) override { + if (!optimizable()) return; // Accelerate + checkNodeInfo(nodep); + iterateChildrenConst(nodep); + if (!m_checkOnly && optimizable()) { + nodep->numberOperate(newConst(nodep)->num(), fetchConst(nodep->lhsp())->num(), + fetchConst(nodep->rhsp())->num(), + fetchConst(nodep->thsp())->num()); + } + } void visit(AstNodeQuadop* nodep) override { if (!optimizable()) return; // Accelerate checkNodeInfo(nodep); diff --git a/src/V3SplitVar.cpp b/src/V3SplitVar.cpp index 346e98961..7bbfe1ed5 100644 --- a/src/V3SplitVar.cpp +++ b/src/V3SplitVar.cpp @@ -381,8 +381,6 @@ public: m_refs.erase(refp); } else if (AstVarRef* const refp = VN_CAST(selp->lsbp(), VarRef)) { m_refs.erase(refp); - } else if (AstVarRef* const refp = VN_CAST(selp->widthp(), VarRef)) { - m_refs.erase(refp); } UASSERT_OBJ(reinterpret_cast(selp->op1p()) != 1, selp, "stale"); visitor->iterate(selp); @@ -1010,28 +1008,19 @@ class SplitPackedVarVisitor final : public VNVisitor, public SplitVarImpl { } UASSERT_OBJ(varp->attrSplitVar() || varp->user2(), varp, "must be a split candidate"); - const std::array consts - = {{VN_CAST(nodep->lsbp(), Const), - VN_CAST(nodep->widthp(), Const)}}; // GCC 3.8.0 wants {{}} - if (consts[0] && consts[1]) { // OK + if (AstConst* const lsbConstp = VN_CAST(nodep->lsbp(), Const)) { // OK refit->second.append( - PackedVarRefEntry(nodep, consts[0]->toSInt() + refit->second.basicp()->lo(), - consts[1]->toUInt()), + PackedVarRefEntry(nodep, lsbConstp->toSInt() + refit->second.basicp()->lo(), + nodep->widthConst()), vrefp->access()); UINFO(5, varp->prettyName() - << " [" << consts[0]->toSInt() << ":+" << consts[1]->toSInt() + << " [" << lsbConstp->toSInt() << ":+" << nodep->widthConst() << "] lsb:" << refit->second.basicp()->lo()); } else { if (varp->attrSplitVar()) { warnNoSplit(vrefp->varp(), nodep, "its bit range cannot be determined statically"); varp->attrSplitVar(false); } - if (!consts[0]) { - UINFO(4, "LSB " << nodep->lsbp() << " is expected to be constant, but not"); - } - if (!consts[1]) { - UINFO(4, "WIDTH " << nodep->widthp() << " is expected to be constant, but not"); - } m_refs.erase(varp); iterateChildren(nodep); } @@ -1261,15 +1250,10 @@ class SplitPackedVarVisitor final : public VNVisitor, public SplitVarImpl { info.ineligible = true; continue; } - AstConst* const widthConstp = VN_CAST(selp->widthp(), Const); - if (!widthConstp) { - info.ineligible = true; - continue; - } // All good, record the selection range const int32_t lsb = lsbConstp->toSInt(); - const int32_t msb = lsb + widthConstp->toSInt() - 1; + const int32_t msb = lsb + selp->widthConst() - 1; info.ranges.emplace_back(lsb, msb); } diff --git a/src/V3Tristate.cpp b/src/V3Tristate.cpp index c5edf8c12..be40fec9a 100644 --- a/src/V3Tristate.cpp +++ b/src/V3Tristate.cpp @@ -1160,7 +1160,7 @@ class TristateVisitor final : public TristateBaseVisitor { AstNodeExpr* const en1p = getEnp(nodep->fromp()); AstNodeExpr* const enp = new AstSel{nodep->fileline(), en1p, nodep->lsbp()->cloneTreePure(true), - nodep->widthp()->cloneTree(true)}; + nodep->widthConst()}; UINFO(9, " newsel " << enp); nodep->user1p(enp); // propagate up SEL(fromp->enable, value) m_tgraph.didProcess(nodep); diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 86e7ef5b1..048480fb9 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -972,16 +972,7 @@ class WidthVisitor final : public VNVisitor { userIterateAndNext(nodep->fromp(), WidthVP{CONTEXT_DET, PRELIM}.p()); userIterateAndNext(nodep->lsbp(), WidthVP{SELF, PRELIM}.p()); checkCvtUS(nodep->fromp()); - iterateCheckSizedSelf(nodep, "Select Width", nodep->widthp(), SELF, BOTH); iterateCheckSizedSelf(nodep, "Select LHS", nodep->fromp(), SELF, BOTH); - V3Const::constifyParamsEdit(nodep->widthp()); // widthp may change - const AstConst* const widthConstp = VN_CAST(nodep->widthp(), Const); - if (!widthConstp) { - nodep->v3error( - "Width of bit extract isn't a constant"); // Impossible? // LCOV_EXCL_LINE - nodep->dtypeSetBit(); - return; - } int width = nodep->widthConst(); if (width <= 0) { nodep->v3error("Width of bit extract must be positive (IEEE 1800-2023 11.5.1)"); @@ -997,8 +988,7 @@ class WidthVisitor final : public VNVisitor { << nodep->msbConst() << "<" << nodep->lsbConst()); width = (nodep->lsbConst() - nodep->msbConst() + 1); nodep->dtypeSetLogicSized(width, VSigning::UNSIGNED); - pushDeletep(nodep->widthp()); - nodep->widthp()->replaceWith(new AstConst(nodep->widthp()->fileline(), width)); + nodep->widthConst(width); pushDeletep(nodep->lsbp()); nodep->lsbp()->replaceWith(new AstConst{nodep->lsbp()->fileline(), 0}); } diff --git a/src/V3WidthSel.cpp b/src/V3WidthSel.cpp index 38fbd3b25..b53e2ae3c 100644 --- a/src/V3WidthSel.cpp +++ b/src/V3WidthSel.cpp @@ -262,8 +262,7 @@ class WidthSelVisitor final : public VNVisitor { // cppcheck-suppress zerodivcond const int elwidth = adtypep->width() / fromRange.elements(); AstSel* const newp = new AstSel{ - nodep->fileline(), fromp, newMulConst(nodep->fileline(), elwidth, subp), - new AstConst(nodep->fileline(), AstConst::Unsized32{}, elwidth)}; + nodep->fileline(), fromp, newMulConst(nodep->fileline(), elwidth, subp), elwidth}; newp->declRange(fromRange); newp->declElWidth(elwidth); newp->dtypeFrom(adtypep->subDTypep()); // Need to strip off array reference @@ -333,9 +332,7 @@ class WidthSelVisitor final : public VNVisitor { } else if (VN_IS(ddtypep, BasicDType)) { // SELBIT(range, index) -> SEL(array, index, 1) AstSel* const newp - = new AstSel{nodep->fileline(), fromp, newSubLsbOf(rhsp, fromRange), - // Unsized so width from user - new AstConst{nodep->fileline(), AstConst::Unsized32{}, 1}}; + = new AstSel{nodep->fileline(), fromp, newSubLsbOf(rhsp, fromRange), 1}; newp->declRange(fromRange); UINFO(6, " new " << newp); if (debug() >= 9) newp->dumpTree("- SELBTn: "); @@ -344,9 +341,7 @@ class WidthSelVisitor final : public VNVisitor { } else if (VN_IS(ddtypep, NodeUOrStructDType)) { // A bit from the packed struct // SELBIT(range, index) -> SEL(array, index, 1) AstSel* const newp - = new AstSel{nodep->fileline(), fromp, newSubLsbOf(rhsp, fromRange), - // Unsized so width from user - new AstConst{nodep->fileline(), AstConst::Unsized32{}, 1}}; + = new AstSel{nodep->fileline(), fromp, newSubLsbOf(rhsp, fromRange), 1}; newp->declRange(fromRange); UINFO(6, " new " << newp); if (debug() >= 9) newp->dumpTree("- SELBTn: "); @@ -449,10 +444,10 @@ class WidthSelVisitor final : public VNVisitor { lsb = x; } const int elwidth = adtypep->width() / fromRange.elements(); - AstSel* const newp = new AstSel{ - nodep->fileline(), fromp, - newMulConst(nodep->fileline(), elwidth, newSubLsbOf(lsbp, fromRange)), - new AstConst(nodep->fileline(), AstConst::Unsized32{}, (msb - lsb + 1) * elwidth)}; + AstSel* const newp + = new AstSel{nodep->fileline(), fromp, + newMulConst(nodep->fileline(), elwidth, newSubLsbOf(lsbp, fromRange)), + (msb - lsb + 1) * elwidth}; newp->declRange(fromRange); newp->declElWidth(elwidth); newp->dtypeFrom(sliceDType(adtypep, msb, lsb)); @@ -477,11 +472,8 @@ class WidthSelVisitor final : public VNVisitor { msb = lsb; lsb = x; } - AstNodeExpr* const widthp = new AstConst( - msbp->fileline(), AstConst::Unsized32{}, // Unsized so width from user - msb + 1 - lsb); - AstSel* const newp - = new AstSel{nodep->fileline(), fromp, newSubLsbOf(lsbp, fromRange), widthp}; + AstSel* const newp = new AstSel{nodep->fileline(), fromp, newSubLsbOf(lsbp, fromRange), + msb + 1 - lsb}; newp->declRange(fromRange); UINFO(6, " new " << newp); // if (debug() >= 9) newp->dumpTree("- SELEXnew: "); @@ -499,11 +491,8 @@ class WidthSelVisitor final : public VNVisitor { msb = lsb; lsb = x; } - AstNodeExpr* const widthp = new AstConst( - msbp->fileline(), AstConst::Unsized32{}, // Unsized so width from user - msb + 1 - lsb); - AstSel* const newp - = new AstSel{nodep->fileline(), fromp, newSubLsbOf(lsbp, fromRange), widthp}; + AstSel* const newp = new AstSel{nodep->fileline(), fromp, newSubLsbOf(lsbp, fromRange), + msb + 1 - lsb}; newp->declRange(fromRange); UINFO(6, " new " << newp); // if (debug() >= 9) newp->dumpTree("- SELEXnew: "); @@ -581,11 +570,10 @@ class WidthSelVisitor final : public VNVisitor { || (VN_IS(ddtypep, NodeUOrStructDType) && VN_AS(ddtypep, NodeUOrStructDType)->packedUnsup())) { int elwidth = 1; - AstNodeExpr* newwidthp = widthp; + int newwidth = width; if (const AstPackArrayDType* const adtypep = VN_CAST(ddtypep, PackArrayDType)) { elwidth = adtypep->width() / fromRange.elements(); - newwidthp - = new AstConst(nodep->fileline(), AstConst::Unsized32{}, width * elwidth); + newwidth = width * elwidth; } AstNodeExpr* newlsbp = nullptr; if (VN_IS(nodep, SelPlus)) { @@ -608,7 +596,7 @@ class WidthSelVisitor final : public VNVisitor { nodep->v3fatalSrc("Bad Case"); } if (elwidth != 1) newlsbp = newMulConst(nodep->fileline(), elwidth, newlsbp); - AstSel* const newp = new AstSel{nodep->fileline(), fromp, newlsbp, newwidthp}; + AstSel* const newp = new AstSel{nodep->fileline(), fromp, newlsbp, newwidth}; newp->declRange(fromRange); newp->declElWidth(elwidth); UINFO(6, " new " << newp); diff --git a/test_regress/t/t_cover_expr.out b/test_regress/t/t_cover_expr.out index 7f74da584..2886f1501 100644 --- a/test_regress/t/t_cover_expr.out +++ b/test_regress/t/t_cover_expr.out @@ -206,15 +206,15 @@ if (0 == 1) begin for (int loop_var = 0; loop_var < 1; loop_var++) begin %000000 if (cyc[loop_var] && t2) $write(""); --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==0) => 0 hier=top.t --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==1 && t2==1) => 1 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==0) => 0 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==1 && t2==1) => 1 hier=top.t -000000 point: comment=(t2==0) => 0 hier=top.t end end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1 && t2)+:2] == cyc[5+32'(t3 || t4)+:2]) || cyc[31]) $write(""); --000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==0 && cyc[31]==0) => 0 hier=top.t --000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==1) => 1 hier=top.t +-000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==0 && cyc[31]==0) => 0 hier=top.t +-000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==1) => 1 hier=top.t -000000 point: comment=(cyc[31]==1) => 1 hier=top.t // impossible branches and redundant terms %000005 if ((t1 && t2) && ~(t1 && t3) && (t1 || t4)) $write(""); @@ -233,12 +233,12 @@ -000005 point: comment=(cyc[1]==0) => 0 hier=top.t // demonstrate current limitations of term matching scheme %000005 if ((cyc[0] && cyc[1]) && ~(cyc[1-1] && cyc[2]) && (cyc[2-2] || cyc[3])) $write(""); --000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==1 && cyc[2]==1) => 0 hier=top.t --000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==0 && cyc[3]==0) => 0 hier=top.t +-000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==1 && cyc[2]==1) => 0 hier=top.t +-000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==0 && cyc[3]==0) => 0 hier=top.t -000004 point: comment=(cyc[0]==0) => 0 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[3]==1) => 1 hier=top.t --000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[3]==1) => 1 hier=top.t +-000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t -000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[3]==1) => 1 hier=top.t -000005 point: comment=(cyc[1]==0) => 0 hier=top.t //verilator coverage_off diff --git a/test_regress/t/t_cover_expr_max.out b/test_regress/t/t_cover_expr_max.out index a8f977fc3..ee7dca17a 100644 --- a/test_regress/t/t_cover_expr_max.out +++ b/test_regress/t/t_cover_expr_max.out @@ -206,15 +206,15 @@ if (0 == 1) begin for (int loop_var = 0; loop_var < 1; loop_var++) begin %000000 if (cyc[loop_var] && t2) $write(""); --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==0) => 0 hier=top.t --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==1 && t2==1) => 1 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==0) => 0 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==1 && t2==1) => 1 hier=top.t -000000 point: comment=(t2==0) => 0 hier=top.t end end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1 && t2)+:2] == cyc[5+32'(t3 || t4)+:2]) || cyc[31]) $write(""); --000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==0 && cyc[31]==0) => 0 hier=top.t --000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==1) => 1 hier=top.t +-000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==0 && cyc[31]==0) => 0 hier=top.t +-000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==1) => 1 hier=top.t -000000 point: comment=(cyc[31]==1) => 1 hier=top.t // impossible branches and redundant terms %000005 if ((t1 && t2) && ~(t1 && t3) && (t1 || t4)) $write(""); @@ -233,12 +233,12 @@ -000005 point: comment=(cyc[1]==0) => 0 hier=top.t // demonstrate current limitations of term matching scheme %000005 if ((cyc[0] && cyc[1]) && ~(cyc[1-1] && cyc[2]) && (cyc[2-2] || cyc[3])) $write(""); --000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==1 && cyc[2]==1) => 0 hier=top.t --000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==0 && cyc[3]==0) => 0 hier=top.t +-000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==1 && cyc[2]==1) => 0 hier=top.t +-000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==0 && cyc[3]==0) => 0 hier=top.t -000004 point: comment=(cyc[0]==0) => 0 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[3]==1) => 1 hier=top.t --000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[3]==1) => 1 hier=top.t +-000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t -000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[3]==1) => 1 hier=top.t -000005 point: comment=(cyc[1]==0) => 0 hier=top.t //verilator coverage_off diff --git a/test_regress/t/t_cover_expr_trace.out b/test_regress/t/t_cover_expr_trace.out index 7f74da584..2886f1501 100644 --- a/test_regress/t/t_cover_expr_trace.out +++ b/test_regress/t/t_cover_expr_trace.out @@ -206,15 +206,15 @@ if (0 == 1) begin for (int loop_var = 0; loop_var < 1; loop_var++) begin %000000 if (cyc[loop_var] && t2) $write(""); --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==0) => 0 hier=top.t --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==1 && t2==1) => 1 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==0) => 0 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==1 && t2==1) => 1 hier=top.t -000000 point: comment=(t2==0) => 0 hier=top.t end end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1 && t2)+:2] == cyc[5+32'(t3 || t4)+:2]) || cyc[31]) $write(""); --000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==0 && cyc[31]==0) => 0 hier=top.t --000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==1) => 1 hier=top.t +-000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==0 && cyc[31]==0) => 0 hier=top.t +-000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==1) => 1 hier=top.t -000000 point: comment=(cyc[31]==1) => 1 hier=top.t // impossible branches and redundant terms %000005 if ((t1 && t2) && ~(t1 && t3) && (t1 || t4)) $write(""); @@ -233,12 +233,12 @@ -000005 point: comment=(cyc[1]==0) => 0 hier=top.t // demonstrate current limitations of term matching scheme %000005 if ((cyc[0] && cyc[1]) && ~(cyc[1-1] && cyc[2]) && (cyc[2-2] || cyc[3])) $write(""); --000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==1 && cyc[2]==1) => 0 hier=top.t --000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==0 && cyc[3]==0) => 0 hier=top.t +-000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==1 && cyc[2]==1) => 0 hier=top.t +-000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==0 && cyc[3]==0) => 0 hier=top.t -000004 point: comment=(cyc[0]==0) => 0 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[3]==1) => 1 hier=top.t --000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[3]==1) => 1 hier=top.t +-000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t -000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[3]==1) => 1 hier=top.t -000005 point: comment=(cyc[1]==0) => 0 hier=top.t //verilator coverage_off diff --git a/test_regress/t/t_cover_line_expr.out b/test_regress/t/t_cover_line_expr.out index 27b905e6d..e6a1ec2b0 100644 --- a/test_regress/t/t_cover_line_expr.out +++ b/test_regress/t/t_cover_line_expr.out @@ -282,16 +282,16 @@ %000000 if (cyc[loop_var] && t2) $write(""); -000000 point: comment=if hier=top.t -000000 point: comment=else hier=top.t --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==0) => 0 hier=top.t --000000 point: comment=(cyc[loop_var[4:0]+:32'h1]]==1 && t2==1) => 1 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==0) => 0 hier=top.t +-000000 point: comment=(cyc[loop_var[4:0]+:1]]==1 && t2==1) => 1 hier=top.t -000000 point: comment=(t2==0) => 0 hier=top.t end end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1 && t2)+:2] == cyc[5+32'(t3 || t4)+:2]) || cyc[31]) $write(""); -000002 point: comment=else hier=top.t --000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==0 && cyc[31]==0) => 0 hier=top.t --000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:32'sh2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:32'sh2]])==1) => 1 hier=top.t +-000002 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==0 && cyc[31]==0) => 0 hier=top.t +-000007 point: comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2]] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2]])==1) => 1 hier=top.t -000000 point: comment=(cyc[31]==1) => 1 hier=top.t -000007 point: comment=if hier=top.t // impossible branches and redundant terms @@ -316,12 +316,12 @@ // demonstrate current limitations of term matching scheme %000008 if ((cyc[0] && cyc[1]) && ~(cyc[1-1] && cyc[2]) && (cyc[2-2] || cyc[3])) $write(""); -000008 point: comment=else hier=top.t --000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==1 && cyc[2]==1) => 0 hier=top.t --000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==0 && cyc[3]==0) => 0 hier=top.t +-000002 point: comment=(cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==1 && cyc[2]==1) => 0 hier=top.t +-000003 point: comment=(cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==0 && cyc[3]==0) => 0 hier=top.t -000004 point: comment=(cyc[0]==0) => 0 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t --000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:32'h1]]==0 && cyc[3]==1) => 1 hier=top.t --000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:32'h1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t +-000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[(32'sh1 - 32'sh1)[4:0]+:1]]==0 && cyc[3]==1) => 1 hier=top.t +-000001 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[(32'sh2 - 32'sh2)[4:0]+:1]]==1) => 1 hier=top.t -000000 point: comment=(cyc[0]==1 && cyc[1]==1 && cyc[2]==0 && cyc[3]==1) => 1 hier=top.t -000005 point: comment=(cyc[1]==0) => 0 hier=top.t -000001 point: comment=if hier=top.t diff --git a/test_regress/t/t_debug_emitv.out b/test_regress/t/t_debug_emitv.out index f4a7202ff..322c8fcfb 100644 --- a/test_regress/t/t_debug_emitv.out +++ b/test_regress/t/t_debug_emitv.out @@ -59,7 +59,7 @@ module Vt_debug_emitv_t; $write(""); end if (downto_32[(ident('sh21) - 'h20)[5:0] + 32 - +:'h1]]) begin + +:1]]) begin $write(""); end if ((| downto_32[48:40])) begin diff --git a/test_regress/t/t_json_only_flat_vlvbound.out b/test_regress/t/t_json_only_flat_vlvbound.out index 6200acfad..286b824e9 100644 --- a/test_regress/t/t_json_only_flat_vlvbound.out +++ b/test_regress/t/t_json_only_flat_vlvbound.out @@ -103,12 +103,12 @@ {"type":"CONST","name":"2'h0","addr":"(WC)","loc":"d,19:34,19:39","dtypep":"(XC)"} ], "rhsp": [ - {"type":"SEL","name":"","addr":"(YC)","loc":"d,19:20,19:21","dtypep":"(XC)","declRange":"[15:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(YC)","loc":"d,19:20,19:21","dtypep":"(XC)","widthConst":2,"declRange":"[15:0]","declElWidth":1, "fromp": [ {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__val","addr":"(ZC)","loc":"d,19:17,19:20","dtypep":"(H)","access":"RD","varp":"(CB)","varScopep":"(BB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(AD)","loc":"d,19:22,19:23","dtypep":"(BD)", + {"type":"SEL","name":"","addr":"(AD)","loc":"d,19:22,19:23","dtypep":"(BD)","widthConst":4, "fromp": [ {"type":"MULS","name":"","addr":"(CD)","loc":"d,19:22,19:23","dtypep":"(NC)", "lhsp": [ @@ -120,188 +120,164 @@ ], "lsbp": [ {"type":"CONST","name":"32'h0","addr":"(FD)","loc":"d,19:22,19:23","dtypep":"(GD)"} - ], - "widthp": [ - {"type":"CONST","name":"32'h4","addr":"(HD)","loc":"d,19:22,19:23","dtypep":"(GD)"} ]} - ], - "widthp": [ - {"type":"CONST","name":"32'sh2","addr":"(ID)","loc":"d,19:28,19:29","dtypep":"(NC)"} ]} ]} ], "lhsp": [ - {"type":"SEL","name":"","addr":"(JD)","loc":"d,19:10,19:11","dtypep":"(RC)","declRange":"[6:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(HD)","loc":"d,19:10,19:11","dtypep":"(RC)","widthConst":1,"declRange":"[6:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(KD)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(ID)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(LD)","loc":"d,19:11,19:12","dtypep":"(MD)", + {"type":"SEL","name":"","addr":"(JD)","loc":"d,19:11,19:12","dtypep":"(KD)","widthConst":3, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(ND)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(LD)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(OD)","loc":"d,19:11,19:12","dtypep":"(GD)"} - ], - "widthp": [ - {"type":"CONST","name":"32'h3","addr":"(PD)","loc":"d,19:11,19:12","dtypep":"(GD)"} + {"type":"CONST","name":"32'h0","addr":"(MD)","loc":"d,19:11,19:12","dtypep":"(GD)"} ]} - ], - "widthp": [ - {"type":"CONST","name":"32'h1","addr":"(QD)","loc":"d,19:10,19:11","dtypep":"(GD)"} ]} ],"timingControlp": []} ], "incsp": [ - {"type":"ASSIGN","name":"","addr":"(RD)","loc":"d,18:24,18:26","dtypep":"(GB)", + {"type":"ASSIGN","name":"","addr":"(ND)","loc":"d,18:24,18:26","dtypep":"(GB)", "rhsp": [ - {"type":"ADD","name":"","addr":"(SD)","loc":"d,18:24,18:26","dtypep":"(GD)", + {"type":"ADD","name":"","addr":"(OD)","loc":"d,18:24,18:26","dtypep":"(GD)", "lhsp": [ - {"type":"CONST","name":"32'h1","addr":"(TD)","loc":"d,18:24,18:26","dtypep":"(GD)"} + {"type":"CONST","name":"32'h1","addr":"(PD)","loc":"d,18:24,18:26","dtypep":"(GD)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(UD)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(QD)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ]} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(VD)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"WR","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(RD)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"WR","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]}, - {"type":"ASSIGN","name":"","addr":"(WD)","loc":"d,21:5,21:11","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(SD)","loc":"d,21:5,21:11","dtypep":"(K)", "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(XD)","loc":"d,21:12,21:15","dtypep":"(K)","access":"RD","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(TD)","loc":"d,21:12,21:15","dtypep":"(K)","access":"RD","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__Vfuncout","addr":"(YD)","loc":"d,21:5,21:11","dtypep":"(K)","access":"WR","varp":"(AB)","varScopep":"(Z)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__Vfuncout","addr":"(UD)","loc":"d,21:5,21:11","dtypep":"(K)","access":"WR","varp":"(AB)","varScopep":"(Z)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(ZD)","loc":"d,24:14,24:15","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(VD)","loc":"d,24:14,24:15","dtypep":"(K)", "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__Vfuncout","addr":"(AE)","loc":"d,24:16,24:19","dtypep":"(K)","access":"RD","varp":"(AB)","varScopep":"(Z)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__Vfuncout","addr":"(WD)","loc":"d,24:16,24:19","dtypep":"(K)","access":"RD","varp":"(AB)","varScopep":"(Z)","classOrPackagep":"UNLINKED"} ], "lhsp": [ - {"type":"VARREF","name":"o_a","addr":"(BE)","loc":"d,24:10,24:13","dtypep":"(K)","access":"WR","varp":"(J)","varScopep":"(T)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"o_a","addr":"(XD)","loc":"d,24:10,24:13","dtypep":"(K)","access":"WR","varp":"(J)","varScopep":"(T)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]}, - {"type":"ALWAYS","name":"","addr":"(CE)","loc":"d,25:14,25:15","keyword":"always","isSuspendable":false,"needProcess":false,"sensesp": [], + {"type":"ALWAYS","name":"","addr":"(YD)","loc":"d,25:14,25:15","keyword":"always","isSuspendable":false,"needProcess":false,"sensesp": [], "stmtsp": [ - {"type":"COMMENT","name":"Function: foo","addr":"(DE)","loc":"d,25:16,25:19"}, - {"type":"ASSIGN","name":"","addr":"(EE)","loc":"d,25:20,25:23","dtypep":"(H)", + {"type":"COMMENT","name":"Function: foo","addr":"(ZD)","loc":"d,25:16,25:19"}, + {"type":"ASSIGN","name":"","addr":"(AE)","loc":"d,25:20,25:23","dtypep":"(H)", "rhsp": [ - {"type":"VARREF","name":"i_b","addr":"(FE)","loc":"d,25:20,25:23","dtypep":"(H)","access":"RD","varp":"(I)","varScopep":"(S)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"i_b","addr":"(BE)","loc":"d,25:20,25:23","dtypep":"(H)","access":"RD","varp":"(I)","varScopep":"(S)","classOrPackagep":"UNLINKED"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__val","addr":"(GE)","loc":"d,15:57,15:60","dtypep":"(H)","access":"WR","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__val","addr":"(CE)","loc":"d,15:57,15:60","dtypep":"(H)","access":"WR","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"CRESET","name":"","addr":"(HE)","loc":"d,16:17,16:20","constructing":false, + {"type":"CRESET","name":"","addr":"(DE)","loc":"d,16:17,16:20","constructing":false, "varrefp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(IE)","loc":"d,16:17,16:20","dtypep":"(K)","access":"WR","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(EE)","loc":"d,16:17,16:20","dtypep":"(K)","access":"WR","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(JE)","loc":"d,17:13,17:14","constructing":false, + {"type":"CRESET","name":"","addr":"(FE)","loc":"d,17:13,17:14","constructing":false, "varrefp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(KE)","loc":"d,17:13,17:14","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(GE)","loc":"d,17:13,17:14","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]}, - {"type":"ASSIGN","name":"","addr":"(LE)","loc":"d,18:11,18:12","dtypep":"(GB)", + {"type":"ASSIGN","name":"","addr":"(HE)","loc":"d,18:11,18:12","dtypep":"(GB)", "rhsp": [ - {"type":"CONST","name":"32'sh0","addr":"(ME)","loc":"d,18:12,18:13","dtypep":"(NC)"} + {"type":"CONST","name":"32'sh0","addr":"(IE)","loc":"d,18:12,18:13","dtypep":"(NC)"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(NE)","loc":"d,18:10,18:11","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(JE)","loc":"d,18:10,18:11","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"WHILE","name":"","addr":"(OE)","loc":"d,18:5,18:8","precondsp": [], + {"type":"WHILE","name":"","addr":"(KE)","loc":"d,18:5,18:8","precondsp": [], "condp": [ - {"type":"GTS","name":"","addr":"(PE)","loc":"d,18:18,18:19","dtypep":"(RC)", + {"type":"GTS","name":"","addr":"(LE)","loc":"d,18:18,18:19","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"32'sh7","addr":"(QE)","loc":"d,18:20,18:21","dtypep":"(NC)"} + {"type":"CONST","name":"32'sh7","addr":"(ME)","loc":"d,18:20,18:21","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(RE)","loc":"d,18:16,18:17","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(NE)","loc":"d,18:16,18:17","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]} ], "stmtsp": [ - {"type":"ASSIGN","name":"","addr":"(SE)","loc":"d,19:14,19:15","dtypep":"(RC)", + {"type":"ASSIGN","name":"","addr":"(OE)","loc":"d,19:14,19:15","dtypep":"(RC)", "rhsp": [ - {"type":"EQ","name":"","addr":"(TE)","loc":"d,19:31,19:33","dtypep":"(RC)", + {"type":"EQ","name":"","addr":"(PE)","loc":"d,19:31,19:33","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"2'h0","addr":"(UE)","loc":"d,19:34,19:39","dtypep":"(XC)"} + {"type":"CONST","name":"2'h0","addr":"(QE)","loc":"d,19:34,19:39","dtypep":"(XC)"} ], "rhsp": [ - {"type":"SEL","name":"","addr":"(VE)","loc":"d,19:20,19:21","dtypep":"(XC)","declRange":"[15:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(RE)","loc":"d,19:20,19:21","dtypep":"(XC)","widthConst":2,"declRange":"[15:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__val","addr":"(WE)","loc":"d,19:17,19:20","dtypep":"(H)","access":"RD","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__val","addr":"(SE)","loc":"d,19:17,19:20","dtypep":"(H)","access":"RD","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(XE)","loc":"d,19:22,19:23","dtypep":"(BD)", + {"type":"SEL","name":"","addr":"(TE)","loc":"d,19:22,19:23","dtypep":"(BD)","widthConst":4, "fromp": [ - {"type":"MULS","name":"","addr":"(YE)","loc":"d,19:22,19:23","dtypep":"(NC)", + {"type":"MULS","name":"","addr":"(UE)","loc":"d,19:22,19:23","dtypep":"(NC)", "lhsp": [ - {"type":"CONST","name":"32'sh2","addr":"(ZE)","loc":"d,19:23,19:24","dtypep":"(NC)"} + {"type":"CONST","name":"32'sh2","addr":"(VE)","loc":"d,19:23,19:24","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(AF)","loc":"d,19:21,19:22","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(WE)","loc":"d,19:21,19:22","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(BF)","loc":"d,19:22,19:23","dtypep":"(GD)"} - ], - "widthp": [ - {"type":"CONST","name":"32'h4","addr":"(CF)","loc":"d,19:22,19:23","dtypep":"(GD)"} + {"type":"CONST","name":"32'h0","addr":"(XE)","loc":"d,19:22,19:23","dtypep":"(GD)"} ]} - ], - "widthp": [ - {"type":"CONST","name":"32'sh2","addr":"(DF)","loc":"d,19:28,19:29","dtypep":"(NC)"} ]} ]} ], "lhsp": [ - {"type":"SEL","name":"","addr":"(EF)","loc":"d,19:10,19:11","dtypep":"(RC)","declRange":"[6:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(YE)","loc":"d,19:10,19:11","dtypep":"(RC)","widthConst":1,"declRange":"[6:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(FF)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(ZE)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(GF)","loc":"d,19:11,19:12","dtypep":"(MD)", + {"type":"SEL","name":"","addr":"(AF)","loc":"d,19:11,19:12","dtypep":"(KD)","widthConst":3, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(HF)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(BF)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(IF)","loc":"d,19:11,19:12","dtypep":"(GD)"} - ], - "widthp": [ - {"type":"CONST","name":"32'h3","addr":"(JF)","loc":"d,19:11,19:12","dtypep":"(GD)"} + {"type":"CONST","name":"32'h0","addr":"(CF)","loc":"d,19:11,19:12","dtypep":"(GD)"} ]} - ], - "widthp": [ - {"type":"CONST","name":"32'h1","addr":"(KF)","loc":"d,19:10,19:11","dtypep":"(GD)"} ]} ],"timingControlp": []} ], "incsp": [ - {"type":"ASSIGN","name":"","addr":"(LF)","loc":"d,18:24,18:26","dtypep":"(GB)", + {"type":"ASSIGN","name":"","addr":"(DF)","loc":"d,18:24,18:26","dtypep":"(GB)", "rhsp": [ - {"type":"ADD","name":"","addr":"(MF)","loc":"d,18:24,18:26","dtypep":"(GD)", + {"type":"ADD","name":"","addr":"(EF)","loc":"d,18:24,18:26","dtypep":"(GD)", "lhsp": [ - {"type":"CONST","name":"32'h1","addr":"(NF)","loc":"d,18:24,18:26","dtypep":"(GD)"} + {"type":"CONST","name":"32'h1","addr":"(FF)","loc":"d,18:24,18:26","dtypep":"(GD)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(OF)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(GF)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(PF)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(HF)","loc":"d,18:23,18:24","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]}, - {"type":"ASSIGN","name":"","addr":"(QF)","loc":"d,21:5,21:11","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(IF)","loc":"d,21:5,21:11","dtypep":"(K)", "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(RF)","loc":"d,21:12,21:15","dtypep":"(K)","access":"RD","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(JF)","loc":"d,21:12,21:15","dtypep":"(K)","access":"RD","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__Vfuncout","addr":"(SF)","loc":"d,21:5,21:11","dtypep":"(K)","access":"WR","varp":"(JB)","varScopep":"(IB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__Vfuncout","addr":"(KF)","loc":"d,21:5,21:11","dtypep":"(K)","access":"WR","varp":"(JB)","varScopep":"(IB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(TF)","loc":"d,25:14,25:15","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(LF)","loc":"d,25:14,25:15","dtypep":"(K)", "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__Vfuncout","addr":"(UF)","loc":"d,25:16,25:19","dtypep":"(K)","access":"RD","varp":"(JB)","varScopep":"(IB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__Vfuncout","addr":"(MF)","loc":"d,25:16,25:19","dtypep":"(K)","access":"RD","varp":"(JB)","varScopep":"(IB)","classOrPackagep":"UNLINKED"} ], "lhsp": [ - {"type":"VARREF","name":"o_b","addr":"(VF)","loc":"d,25:10,25:13","dtypep":"(K)","access":"WR","varp":"(L)","varScopep":"(U)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"o_b","addr":"(NF)","loc":"d,25:10,25:13","dtypep":"(K)","access":"WR","varp":"(L)","varScopep":"(U)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]} ],"inlinesp": []} @@ -324,16 +300,16 @@ {"type":"BASICDTYPE","name":"logic","addr":"(H)","loc":"d,9:11,9:16","dtypep":"(H)","keyword":"logic","range":"15:0","generic":true,"rangep": []}, {"type":"BASICDTYPE","name":"logic","addr":"(K)","loc":"d,11:12,11:17","dtypep":"(K)","keyword":"logic","range":"6:0","generic":true,"rangep": []}, {"type":"BASICDTYPE","name":"integer","addr":"(GB)","loc":"d,17:5,17:12","dtypep":"(GB)","keyword":"integer","range":"31:0","generic":true,"rangep": []}, - {"type":"BASICDTYPE","name":"logic","addr":"(MD)","loc":"d,19:10,19:11","dtypep":"(MD)","keyword":"logic","range":"2:0","generic":true,"rangep": []}, + {"type":"BASICDTYPE","name":"logic","addr":"(KD)","loc":"d,19:10,19:11","dtypep":"(KD)","keyword":"logic","range":"2:0","generic":true,"rangep": []}, {"type":"BASICDTYPE","name":"logic","addr":"(GD)","loc":"d,19:11,19:12","dtypep":"(GD)","keyword":"logic","range":"31:0","generic":true,"rangep": []}, {"type":"BASICDTYPE","name":"logic","addr":"(BD)","loc":"d,19:20,19:21","dtypep":"(BD)","keyword":"logic","range":"3:0","generic":true,"rangep": []}, {"type":"BASICDTYPE","name":"logic","addr":"(NC)","loc":"d,18:12,18:13","dtypep":"(NC)","keyword":"logic","range":"31:0","generic":true,"rangep": []} ]}, {"type":"CONSTPOOL","name":"","addr":"(D)","loc":"a,0:0,0:0", "modulep": [ - {"type":"MODULE","name":"@CONST-POOL@","addr":"(WF)","loc":"a,0:0,0:0","isChecker":false,"isProgram":false,"origName":"@CONST-POOL@","level":0,"modPublic":false,"inLibrary":false,"dead":false,"recursiveClone":false,"recursive":false,"timeunit":"NONE","inlinesp": [], + {"type":"MODULE","name":"@CONST-POOL@","addr":"(OF)","loc":"a,0:0,0:0","isChecker":false,"isProgram":false,"origName":"@CONST-POOL@","level":0,"modPublic":false,"inLibrary":false,"dead":false,"recursiveClone":false,"recursive":false,"timeunit":"NONE","inlinesp": [], "stmtsp": [ - {"type":"SCOPE","name":"@CONST-POOL@","addr":"(XF)","loc":"a,0:0,0:0","aboveScopep":"UNLINKED","aboveCellp":"UNLINKED","modp":"(WF)","varsp": [],"blocksp": [],"inlinesp": []} + {"type":"SCOPE","name":"@CONST-POOL@","addr":"(PF)","loc":"a,0:0,0:0","aboveScopep":"UNLINKED","aboveCellp":"UNLINKED","modp":"(OF)","varsp": [],"blocksp": [],"inlinesp": []} ],"activesp": []} ]} ]} diff --git a/test_regress/t/t_xml_flat_vlvbound.out b/test_regress/t/t_xml_flat_vlvbound.out index 3864164df..9361e33ee 100644 --- a/test_regress/t/t_xml_flat_vlvbound.out +++ b/test_regress/t/t_xml_flat_vlvbound.out @@ -86,27 +86,23 @@ - + - + - - - + - + - - @@ -158,27 +154,23 @@ - + - + - - - + - + - -