Add V3Number::opSetRange

This commit is contained in:
Geza Lore 2025-07-21 19:09:24 +01:00
parent ce75d27c52
commit 49620c4892
3 changed files with 11 additions and 7 deletions

View File

@ -587,10 +587,6 @@ class IndependentBits final : public DfgVisitor {
std::ofstream m_lineCoverageFile; // Line coverage file, just for testing
// METHODS
static void setRangeZero(V3Number& num, uint32_t msb, uint32_t lsb) {
for (uint32_t i = lsb; i <= msb; ++i) num.setBit(i, '0');
}
// Retrieve the mask for the given vertex (create it with value 0 if needed)
V3Number& mask(const DfgVertex* vtxp) {
// Look up (or create) mask for 'vtxp'
@ -661,7 +657,7 @@ class IndependentBits final : public DfgVisitor {
const uint32_t sWidth = srcp->width();
V3Number& m = MASK(vtxp);
m.opSelInto(MASK(srcp), 0, sWidth);
setRangeZero(m, vtxp->width() - 1, sWidth);
m.opSetRange(sWidth, vtxp->width() - sWidth, '0');
}
void visit(DfgNot* vtxp) override { //
@ -691,7 +687,7 @@ class IndependentBits final : public DfgVisitor {
shiftedMask.opShiftR(MASK(lhsp), rConstp->num());
V3Number& m = MASK(vtxp);
m.opSelInto(shiftedMask, 0, width - shiftAmount);
setRangeZero(m, width - 1, width - shiftAmount);
m.opSetRange(width - shiftAmount, shiftAmount, '0');
return;
}
@ -717,7 +713,7 @@ class IndependentBits final : public DfgVisitor {
shiftedMask.opShiftL(MASK(lhsp), rConstp->num());
V3Number& m = MASK(vtxp);
m.opSelInto(shiftedMask, shiftAmount, width - shiftAmount);
setRangeZero(m, shiftAmount - 1, 0);
m.opSetRange(0, shiftAmount, '0');
return;
}

View File

@ -2242,6 +2242,13 @@ V3Number& V3Number::opBufIf1(const V3Number& ens, const V3Number& if1s) {
return *this;
}
// Sets all bits in range to the given value
V3Number& V3Number::opSetRange(uint32_t lsb, uint32_t width, char bitValue) {
const uint32_t msb = lsb + width - 1;
for (uint32_t i = lsb; i <= msb; ++i) setBit(i, bitValue);
return *this;
}
V3Number& V3Number::opAssign(const V3Number& lhs) { return opAssignNonXZ(lhs, false); }
V3Number& V3Number::opAssignNonXZ(const V3Number& lhs, bool ignoreXZ) {
// Note may be a width change during the assign.

View File

@ -716,6 +716,7 @@ public:
V3Number& opWildEq(const V3Number& lhs, const V3Number& rhs);
V3Number& opWildNeq(const V3Number& lhs, const V3Number& rhs);
V3Number& opBufIf1(const V3Number& ens, const V3Number& if1s);
V3Number& opSetRange(uint32_t lsb, uint32_t width, char bitValue);
// "standard" math
V3Number& opNot(const V3Number& lhs);
V3Number& opLogNot(const V3Number& lhs);