mirror of
https://github.com/verilator/verilator.git
synced 2026-09-07 01:52:17 +02:00
Change array tracing to always dump left index to right index (#7205)
Also add array bounds and struct/union member counts to trace pushPrefix (not used by vcd/fst/saif). Together these improve consistency in some waveform formats.
This commit is contained in:
+23
-8
@@ -574,7 +574,8 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
VL_RESTORER(m_traName);
|
||||
FileLine* const flp = nodep->fileline();
|
||||
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_UNPACKED});
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_UNPACKED,
|
||||
nodep->left(), nodep->right()});
|
||||
|
||||
if (VN_IS(nodep->subDTypep()->skipRefToEnump(),
|
||||
BasicDType) // Nothing lower than this array
|
||||
@@ -589,7 +590,9 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
}
|
||||
} else {
|
||||
AstNodeDType* const subtypep = nodep->subDTypep()->skipRefToEnump();
|
||||
for (int i = nodep->lo(); i <= nodep->hi(); ++i) {
|
||||
// Always iterate left index to right index
|
||||
const int inc = nodep->rangep()->ascending() ? 1 : -1;
|
||||
for (int i = nodep->left(); i != nodep->right() + inc; i += inc) {
|
||||
VL_RESTORER(m_traValuep);
|
||||
m_traName = '[' + std::to_string(i) + ']';
|
||||
m_traValuep = m_traValuep->cloneTree(false);
|
||||
@@ -615,10 +618,14 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
|
||||
VL_RESTORER(m_traName);
|
||||
FileLine* const flp = nodep->fileline();
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_PACKED});
|
||||
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_PACKED,
|
||||
nodep->left(), nodep->right()});
|
||||
|
||||
AstNodeDType* const subtypep = nodep->subDTypep()->skipRefToEnump();
|
||||
for (int i = nodep->lo(); i <= nodep->hi(); ++i) {
|
||||
// Always iterate left index to right index
|
||||
const int inc = nodep->rangep()->ascending() ? 1 : -1;
|
||||
for (int i = nodep->left(); i != nodep->right() + inc; i += inc) {
|
||||
VL_RESTORER(m_traValuep);
|
||||
m_traName = '[' + std::to_string(i) + ']';
|
||||
const int lsb = (i - nodep->lo()) * subtypep->width();
|
||||
@@ -645,9 +652,12 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
VL_RESTORER(m_traName);
|
||||
FileLine* const flp = nodep->fileline();
|
||||
|
||||
int nMembers = 0;
|
||||
for (AstNode* mp = nodep->membersp(); mp; mp = mp->nextp()) ++nMembers;
|
||||
|
||||
if (!nodep->packed()) {
|
||||
addToSubFunc(
|
||||
new AstTracePushPrefix{flp, m_traName, VTracePrefixType::STRUCT_UNPACKED});
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, //
|
||||
VTracePrefixType::STRUCT_UNPACKED, nMembers});
|
||||
for (const AstMemberDType *itemp = nodep->membersp(), *nextp; itemp; itemp = nextp) {
|
||||
nextp = VN_AS(itemp->nextp(), MemberDType);
|
||||
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefToEnump();
|
||||
@@ -661,7 +671,8 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
}
|
||||
addToSubFunc(new AstTracePopPrefix{flp});
|
||||
} else {
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::STRUCT_PACKED});
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, //
|
||||
VTracePrefixType::STRUCT_PACKED, nMembers});
|
||||
for (const AstMemberDType *itemp = nodep->membersp(), *nextp; itemp; itemp = nextp) {
|
||||
nextp = VN_AS(itemp->nextp(), MemberDType);
|
||||
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefToEnump();
|
||||
@@ -690,10 +701,14 @@ class TraceDeclVisitor final : public VNVisitor {
|
||||
VL_RESTORER(m_traName);
|
||||
FileLine* const flp = nodep->fileline();
|
||||
|
||||
int nMembers = 0;
|
||||
for (AstNode* mp = nodep->membersp(); mp; mp = mp->nextp()) ++nMembers;
|
||||
|
||||
if (!nodep->packed()) {
|
||||
addIgnore("Unsupported: Unpacked union");
|
||||
} else {
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::UNION_PACKED});
|
||||
addToSubFunc(new AstTracePushPrefix{flp, m_traName, //
|
||||
VTracePrefixType::UNION_PACKED, nMembers});
|
||||
for (const AstMemberDType *itemp = nodep->membersp(), *nextp; itemp; itemp = nextp) {
|
||||
nextp = VN_AS(itemp->nextp(), MemberDType);
|
||||
AstNodeDType* const subtypep = itemp->subDTypep()->skipRefToEnump();
|
||||
|
||||
Reference in New Issue
Block a user