Internals: V3Coverage cleanup. No functional change. (#6033)

This commit is contained in:
Ryszard Rozak 2025-05-23 23:38:34 +02:00 committed by GitHub
parent 7c427d4cc3
commit 90d4cf1361
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 33 additions and 34 deletions

View File

@ -386,7 +386,7 @@ class CoverageVisitor final : public VNVisitor {
ToggleEnt newvec{""s, new AstVarRef{fl_nowarn, nodep, VAccess::READ}, ToggleEnt newvec{""s, new AstVarRef{fl_nowarn, nodep, VAccess::READ},
new AstVarRef{fl_nowarn, chgVarp, VAccess::WRITE}}; new AstVarRef{fl_nowarn, chgVarp, VAccess::WRITE}};
toggleVarRecurse(nodep->dtypeSkipRefp(), 0, newvec, nodep, chgVarp); toggleVarRecurse(nodep->dtypeSkipRefp(), 0, newvec, nodep);
newvec.cleanup(); newvec.cleanup();
} }
} }
@ -399,22 +399,22 @@ class CoverageVisitor final : public VNVisitor {
varp->fileline(), varp->fileline(),
newCoverInc(varp->fileline(), "", "v_toggle", newCoverInc(varp->fileline(), "", "v_toggle",
hierPrefix + varp->name() + above.m_comment, "", 0, ""), hierPrefix + varp->name() + above.m_comment, "", 0, ""),
above.m_varRefp->cloneTree(true), above.m_chgRefp->cloneTree(true)}; above.m_varRefp->cloneTree(false), above.m_chgRefp->cloneTree(false)};
m_modp->addStmtsp(newp); m_modp->addStmtsp(newp);
} }
void toggleVarRecurse(AstNodeDType* dtypep, int depth, // per-iteration void toggleVarRecurse(const AstNodeDType* const dtypep, const int depth, // per-iteration
const ToggleEnt& above, AstVar* varp, AstVar* chgVarp) { // Constant const ToggleEnt& above, const AstVar* const varp) { // Constant
if (const AstBasicDType* const bdtypep = VN_CAST(dtypep, BasicDType)) { if (const AstBasicDType* const bdtypep = VN_CAST(dtypep, BasicDType)) {
if (bdtypep->isRanged()) { if (bdtypep->isRanged()) {
for (int index_docs = bdtypep->lo(); index_docs < bdtypep->hi() + 1; for (int index_docs = bdtypep->lo(); index_docs < bdtypep->hi() + 1;
++index_docs) { ++index_docs) {
const int index_code = index_docs - bdtypep->lo(); const int index_code = index_docs - bdtypep->lo();
ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]", ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]",
new AstSel{varp->fileline(), above.m_varRefp->cloneTree(true), new AstSel{varp->fileline(),
index_code, 1}, above.m_varRefp->cloneTree(false), index_code, 1},
new AstSel{varp->fileline(), above.m_chgRefp->cloneTree(true), new AstSel{varp->fileline(),
index_code, 1}}; above.m_chgRefp->cloneTree(false), index_code, 1}};
toggleVarBottom(newent, varp); toggleVarBottom(newent, varp);
newent.cleanup(); newent.cleanup();
} }
@ -426,11 +426,10 @@ class CoverageVisitor final : public VNVisitor {
const int index_code = index_docs - adtypep->lo(); const int index_code = index_docs - adtypep->lo();
ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]", ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]",
new AstArraySel{varp->fileline(), new AstArraySel{varp->fileline(),
above.m_varRefp->cloneTree(true), index_code}, above.m_varRefp->cloneTree(false), index_code},
new AstArraySel{varp->fileline(), new AstArraySel{varp->fileline(),
above.m_chgRefp->cloneTree(true), index_code}}; above.m_chgRefp->cloneTree(false), index_code}};
toggleVarRecurse(adtypep->subDTypep()->skipRefp(), depth + 1, newent, varp, toggleVarRecurse(adtypep->subDTypep()->skipRefp(), depth + 1, newent, varp);
chgVarp);
newent.cleanup(); newent.cleanup();
} }
} else if (const AstPackArrayDType* const adtypep = VN_CAST(dtypep, PackArrayDType)) { } else if (const AstPackArrayDType* const adtypep = VN_CAST(dtypep, PackArrayDType)) {
@ -438,12 +437,11 @@ class CoverageVisitor final : public VNVisitor {
const AstNodeDType* const subtypep = adtypep->subDTypep()->skipRefp(); const AstNodeDType* const subtypep = adtypep->subDTypep()->skipRefp();
const int index_code = index_docs - adtypep->lo(); const int index_code = index_docs - adtypep->lo();
ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]", ToggleEnt newent{above.m_comment + "["s + cvtToStr(index_docs) + "]",
new AstSel{varp->fileline(), above.m_varRefp->cloneTree(true), new AstSel{varp->fileline(), above.m_varRefp->cloneTree(false),
index_code * subtypep->width(), subtypep->width()}, index_code * subtypep->width(), subtypep->width()},
new AstSel{varp->fileline(), above.m_chgRefp->cloneTree(true), new AstSel{varp->fileline(), above.m_chgRefp->cloneTree(false),
index_code * subtypep->width(), subtypep->width()}}; index_code * subtypep->width(), subtypep->width()}};
toggleVarRecurse(adtypep->subDTypep()->skipRefp(), depth + 1, newent, varp, toggleVarRecurse(adtypep->subDTypep()->skipRefp(), depth + 1, newent, varp);
chgVarp);
newent.cleanup(); newent.cleanup();
} }
} else if (const AstStructDType* const adtypep = VN_CAST(dtypep, StructDType)) { } else if (const AstStructDType* const adtypep = VN_CAST(dtypep, StructDType)) {
@ -452,12 +450,13 @@ class CoverageVisitor final : public VNVisitor {
itemp = VN_AS(itemp->nextp(), MemberDType)) { itemp = VN_AS(itemp->nextp(), MemberDType)) {
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp(); AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp();
const int index_code = itemp->lsb(); const int index_code = itemp->lsb();
ToggleEnt newent{above.m_comment + "."s + itemp->name(), ToggleEnt newent{
new AstSel{varp->fileline(), above.m_varRefp->cloneTree(true), above.m_comment + "."s + itemp->name(),
index_code, subtypep->width()}, new AstSel{varp->fileline(), above.m_varRefp->cloneTree(false), index_code,
new AstSel{varp->fileline(), above.m_chgRefp->cloneTree(true), subtypep->width()},
index_code, subtypep->width()}}; new AstSel{varp->fileline(), above.m_chgRefp->cloneTree(false), index_code,
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); subtypep->width()}};
toggleVarRecurse(subtypep, depth + 1, newent, varp);
newent.cleanup(); newent.cleanup();
} }
} else { } else {
@ -465,13 +464,13 @@ class CoverageVisitor final : public VNVisitor {
itemp = VN_AS(itemp->nextp(), MemberDType)) { itemp = VN_AS(itemp->nextp(), MemberDType)) {
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp(); AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp();
AstNodeExpr* const varRefp = new AstStructSel{ AstNodeExpr* const varRefp = new AstStructSel{
varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()}; varp->fileline(), above.m_varRefp->cloneTree(false), itemp->name()};
AstNodeExpr* const chgRefp = new AstStructSel{ AstNodeExpr* const chgRefp = new AstStructSel{
varp->fileline(), above.m_chgRefp->cloneTree(true), itemp->name()}; varp->fileline(), above.m_chgRefp->cloneTree(false), itemp->name()};
varRefp->dtypep(subtypep); varRefp->dtypep(subtypep);
chgRefp->dtypep(subtypep); chgRefp->dtypep(subtypep);
ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp}; ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp};
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); toggleVarRecurse(subtypep, depth + 1, newent, varp);
newent.cleanup(); newent.cleanup();
} }
} }
@ -481,19 +480,19 @@ class CoverageVisitor final : public VNVisitor {
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp(); AstNodeDType* const subtypep = itemp->subDTypep()->skipRefp();
if (adtypep->packed()) { if (adtypep->packed()) {
ToggleEnt newent{above.m_comment + "."s + itemp->name(), ToggleEnt newent{above.m_comment + "."s + itemp->name(),
above.m_varRefp->cloneTree(true), above.m_varRefp->cloneTree(false),
above.m_chgRefp->cloneTree(true)}; above.m_chgRefp->cloneTree(false)};
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); toggleVarRecurse(subtypep, depth + 1, newent, varp);
newent.cleanup(); newent.cleanup();
} else { } else {
AstNodeExpr* const varRefp = new AstStructSel{ AstNodeExpr* const varRefp = new AstStructSel{
varp->fileline(), above.m_varRefp->cloneTree(true), itemp->name()}; varp->fileline(), above.m_varRefp->cloneTree(false), itemp->name()};
AstNodeExpr* const chgRefp = new AstStructSel{ AstNodeExpr* const chgRefp = new AstStructSel{
varp->fileline(), above.m_chgRefp->cloneTree(true), itemp->name()}; varp->fileline(), above.m_chgRefp->cloneTree(false), itemp->name()};
varRefp->dtypep(subtypep); varRefp->dtypep(subtypep);
chgRefp->dtypep(subtypep); chgRefp->dtypep(subtypep);
ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp}; ToggleEnt newent{above.m_comment + "."s + itemp->name(), varRefp, chgRefp};
toggleVarRecurse(subtypep, depth + 1, newent, varp, chgVarp); toggleVarRecurse(subtypep, depth + 1, newent, varp);
newent.cleanup(); newent.cleanup();
} }
} }
@ -734,7 +733,7 @@ class CoverageVisitor final : public VNVisitor {
for (CoverTerm& term : expr) { for (CoverTerm& term : expr) {
comment += (first ? "" : " && ") + term.m_emitV comment += (first ? "" : " && ") + term.m_emitV
+ "==" + (term.m_objective ? "1" : "0"); + "==" + (term.m_objective ? "1" : "0");
AstNodeExpr* const clonep = term.m_exprp->cloneTree(true); AstNodeExpr* const clonep = term.m_exprp->cloneTree(false);
AstNodeExpr* const termp = term.m_objective ? clonep : new AstLogNot{fl, clonep}; AstNodeExpr* const termp = term.m_objective ? clonep : new AstLogNot{fl, clonep};
if (condp) { if (condp) {
condp = new AstLogAnd{fl, condp, termp}; condp = new AstLogAnd{fl, condp, termp};
@ -932,11 +931,11 @@ class CoverageVisitor final : public VNVisitor {
const int width = lhsp->dtypep()->width(); const int width = lhsp->dtypep()->width();
const size_t expected = std::is_same<T_Oper, AstXor>::value ? 0x1 << width : width + 1; const size_t expected = std::is_same<T_Oper, AstXor>::value ? 0x1 << width : width + 1;
if (checkMaxExprs(expected)) return; if (checkMaxExprs(expected)) return;
AstNodeExpr* unrolledp = new AstSel{fl, lhsp->cloneTree(true), AstNodeExpr* unrolledp = new AstSel{fl, lhsp->cloneTree(false),
new AstConst{fl, static_cast<uint32_t>(width - 1)}, new AstConst{fl, static_cast<uint32_t>(width - 1)},
new AstConst{fl, 1}}; new AstConst{fl, 1}};
for (int bit = width - 2; bit >= 0; bit--) { for (int bit = width - 2; bit >= 0; bit--) {
AstSel* const selp = new AstSel{fl, lhsp->cloneTree(true), AstSel* const selp = new AstSel{fl, lhsp->cloneTree(false),
new AstConst{fl, static_cast<uint32_t>(bit)}, new AstConst{fl, static_cast<uint32_t>(bit)},
new AstConst{fl, 1}}; new AstConst{fl, 1}};
unrolledp = new T_Oper{fl, selp, unrolledp}; unrolledp = new T_Oper{fl, selp, unrolledp};