Internals: V3Coverage cleanup. No functional change. (#6033)
This commit is contained in:
parent
7c427d4cc3
commit
90d4cf1361
|
|
@ -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};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue