From 3b98db17cc4f5fbee3c55c4c3a35105c45e0fb4d Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Tue, 25 Feb 2025 22:48:53 -0500 Subject: [PATCH] Fix reset of automatic function variables (#5747). Also required V3Life optimize CRESET(x) ... ASSIGN(rhs, x) to remove the extraneous CRESET to avoid creating new UNOPTFLAT situations. --- Changes | 1 + src/V3AstNodeOther.h | 21 +- src/V3AstNodes.cpp | 9 + src/V3CCtors.cpp | 13 +- src/V3EmitCFunc.cpp | 51 +++-- src/V3EmitCFunc.h | 9 +- src/V3Life.cpp | 56 +++++- src/V3Task.cpp | 12 +- test_regress/t/t_func_automatic_clear.py | 18 ++ test_regress/t/t_func_automatic_clear.v | 162 ++++++++++++++++ test_regress/t/t_json_only_debugcheck.out | 22 +-- test_regress/t/t_json_only_flat_vlvbound.out | 190 ++++++++++--------- test_regress/t/t_var_life.py | 3 +- test_regress/t/t_var_life.v | 10 + test_regress/t/t_xml_flat_vlvbound.out | 12 ++ 15 files changed, 443 insertions(+), 146 deletions(-) create mode 100755 test_regress/t/t_func_automatic_clear.py create mode 100644 test_regress/t/t_func_automatic_clear.v diff --git a/Changes b/Changes index 910ed36d0..35571d7e1 100644 --- a/Changes +++ b/Changes @@ -16,6 +16,7 @@ Verilator 5.035 devel * Change `--output-groups` to default to value of `--build-jobs` (#5751). Those using build farms may need to now use `--output-groups 0` or otherwise. * Add used language to `--preproc-resolve` output (#5795). [Kamil Rakoczy, Antmicro Ltd.] +* Fix reset of automatic function variables (#5747). [Augustin Fabre] Verilator 5.034 2025-02-24 diff --git a/src/V3AstNodeOther.h b/src/V3AstNodeOther.h index 524c57bc9..684298ecb 100644 --- a/src/V3AstNodeOther.h +++ b/src/V3AstNodeOther.h @@ -2165,6 +2165,8 @@ public: string verilogKwd() const override; void lifetime(const VLifetime& flag) { m_lifetime = flag; } VLifetime lifetime() const { return m_lifetime; } + void pinNum(int id) { m_pinNum = id; } + int pinNum() const { return m_pinNum; } void propagateAttrFrom(const AstVar* fromp) { // This is getting connected to fromp; keep attributes // Note the method below too @@ -2197,9 +2199,11 @@ public: m_direction = VDirection::NONE; m_name = name; } + bool needsCReset() const { + return !isIfaceParent() && !isIfaceRef() && !noReset() && !isParam() && !isStatementTemp() + && !(basicp() && (basicp()->isEvent() || basicp()->isTriggerVec())); + } static AstVar* scVarRecurse(AstNode* nodep); - void pinNum(int id) { m_pinNum = id; } - int pinNum() const { return m_pinNum; } }; class AstVarScope final : public AstNode { // A particular scoped usage of a variable @@ -2740,15 +2744,22 @@ public: class AstCReset final : public AstNodeStmt { // Reset variable at startup // @astgen op1 := varrefp : AstVarRef + const bool m_constructing; // Previously cleared by constructor public: - AstCReset(FileLine* fl, AstVarRef* varrefp) - : ASTGEN_SUPER_CReset(fl) { + AstCReset(FileLine* fl, AstVarRef* varrefp, bool constructing) + : ASTGEN_SUPER_CReset(fl) + , m_constructing(constructing) { this->varrefp(varrefp); } ASTGEN_MEMBERS_AstCReset; + void dump(std::ostream& str) const override; + void dumpJson(std::ostream& str) const override; bool isGateOptimizable() const override { return false; } bool isPredictOptimizable() const override { return false; } - bool sameNode(const AstNode* /*samep*/) const override { return true; } + bool sameNode(const AstNode* samep) const override { + return constructing() == VN_DBG_AS(samep, CReset)->constructing(); + } + bool constructing() const { return m_constructing; } }; class AstCReturn final : public AstNodeStmt { // C++ return from a function diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index 9e20b8b07..251765273 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -327,6 +327,15 @@ AstNodeExpr* AstInsideRange::newAndFromInside(AstNodeExpr* exprp, AstNodeExpr* l return new AstLogAnd{fileline(), ap, bp}; } +void AstCReset::dump(std::ostream& str) const { + this->AstNode::dump(str); + if (constructing()) str << " [CONS]"; +} +void AstCReset::dumpJson(std::ostream& str) const { + dumpJsonBoolFunc(str, constructing); + dumpJsonGen(str); +} + AstVar* AstClocking::ensureEventp(bool childDType) { if (!eventp()) { AstVar* const evp diff --git a/src/V3CCtors.cpp b/src/V3CCtors.cpp index 30b5d5f69..2d0c1305d 100644 --- a/src/V3CCtors.cpp +++ b/src/V3CCtors.cpp @@ -179,16 +179,13 @@ class CCtorsVisitor final : public VNVisitor { iterateChildren(nodep); } void visit(AstVar* nodep) override { - if (!nodep->isIfaceParent() && !nodep->isIfaceRef() && !nodep->noReset() - && !nodep->isParam() && !nodep->isStatementTemp() - && !(nodep->basicp() - && (nodep->basicp()->isEvent() || nodep->basicp()->isTriggerVec()))) { + if (nodep->needsCReset()) { if (m_varResetp) { - const auto vrefp = new AstVarRef{nodep->fileline(), nodep, VAccess::WRITE}; - m_varResetp->add(new AstCReset{nodep->fileline(), vrefp}); + AstVarRef* const vrefp = new AstVarRef{nodep->fileline(), nodep, VAccess::WRITE}; + m_varResetp->add(new AstCReset{nodep->fileline(), vrefp, true}); } else if (m_cfuncp) { - const auto vrefp = new AstVarRef{nodep->fileline(), nodep, VAccess::WRITE}; - nodep->addNextHere(new AstCReset{nodep->fileline(), vrefp}); + AstVarRef* const vrefp = new AstVarRef{nodep->fileline(), nodep, VAccess::WRITE}; + nodep->addNextHere(new AstCReset{nodep->fileline(), vrefp, true}); } } } diff --git a/src/V3EmitCFunc.cpp b/src/V3EmitCFunc.cpp index 97335c62e..294fb3ab4 100644 --- a/src/V3EmitCFunc.cpp +++ b/src/V3EmitCFunc.cpp @@ -606,7 +606,8 @@ void EmitCFunc::emitSetVarConstant(const string& assignString, AstConst* constp) puts(";\n"); } -void EmitCFunc::emitVarReset(AstVar* varp) { +void EmitCFunc::emitVarReset(AstVar* varp, bool constructing) { + // 'constructing' indicates that the object was just constructed, so no need to clear it also AstNodeDType* const dtypep = varp->dtypep()->skipRefp(); const string varNameProtected = (VN_IS(m_modp, Class) || varp->isFuncLocal()) ? varp->nameProtect() @@ -624,6 +625,7 @@ void EmitCFunc::emitVarReset(AstVar* varp) { emitSetVarConstant(varNameProtected + ".atDefault()", VN_AS(initarp->defaultp(), Const)); } + if (!constructing) puts(varNameProtected + ".clear();"); const auto& mapr = initarp->map(); for (const auto& itr : mapr) { AstNode* const valuep = itr.second->valuep(); @@ -635,6 +637,7 @@ void EmitCFunc::emitVarReset(AstVar* varp) { emitSetVarConstant(varNameProtected + ".atDefault()", VN_AS(initarp->defaultp(), Const)); } + if (!constructing) puts(varNameProtected + ".clear();"); const auto& mapr = initarp->map(); for (const auto& itr : mapr) { AstNode* const valuep = itr.second->valuep(); @@ -658,25 +661,30 @@ void EmitCFunc::emitVarReset(AstVar* varp) { varp->v3fatalSrc("InitArray under non-arrayed var"); } } else { - putns(varp, emitVarResetRecurse(varp, varNameProtected, dtypep, 0, "")); + putns(varp, emitVarResetRecurse(varp, constructing, varNameProtected, dtypep, 0, "")); } } -string EmitCFunc::emitVarResetRecurse(const AstVar* varp, const string& varNameProtected, - AstNodeDType* dtypep, int depth, const string& suffix) { +string EmitCFunc::emitVarResetRecurse(const AstVar* varp, bool constructing, + const string& varNameProtected, AstNodeDType* dtypep, + int depth, const string& suffix) { dtypep = dtypep->skipRefp(); AstBasicDType* const basicp = dtypep->basicp(); // Returns string to do resetting, empty to do nothing (which caller should handle) if (AstAssocArrayDType* const adtypep = VN_CAST(dtypep, AssocArrayDType)) { // Access std::array as C array const string cvtarray = (adtypep->subDTypep()->isWide() ? ".data()" : ""); - return emitVarResetRecurse(varp, varNameProtected, adtypep->subDTypep(), depth + 1, - suffix + ".atDefault()" + cvtarray); + const string pre = constructing ? "" : varNameProtected + suffix + ".clear();\n"; + return pre + + emitVarResetRecurse(varp, constructing, varNameProtected, adtypep->subDTypep(), + depth + 1, suffix + ".atDefault()" + cvtarray); } else if (AstWildcardArrayDType* const adtypep = VN_CAST(dtypep, WildcardArrayDType)) { // Access std::array as C array const string cvtarray = (adtypep->subDTypep()->isWide() ? ".data()" : ""); - return emitVarResetRecurse(varp, varNameProtected, adtypep->subDTypep(), depth + 1, - suffix + ".atDefault()" + cvtarray); + const string pre = constructing ? "" : varNameProtected + suffix + ".clear();\n"; + return pre + + emitVarResetRecurse(varp, constructing, varNameProtected, adtypep->subDTypep(), + depth + 1, suffix + ".atDefault()" + cvtarray); } else if (VN_IS(dtypep, CDType)) { return ""; // Constructor does it } else if (VN_IS(dtypep, ClassRefDType)) { @@ -686,13 +694,17 @@ string EmitCFunc::emitVarResetRecurse(const AstVar* varp, const string& varNameP } else if (const AstDynArrayDType* const adtypep = VN_CAST(dtypep, DynArrayDType)) { // Access std::array as C array const string cvtarray = (adtypep->subDTypep()->isWide() ? ".data()" : ""); - return emitVarResetRecurse(varp, varNameProtected, adtypep->subDTypep(), depth + 1, - suffix + ".atDefault()" + cvtarray); + const string pre = constructing ? "" : varNameProtected + suffix + ".clear();\n"; + return pre + + emitVarResetRecurse(varp, constructing, varNameProtected, adtypep->subDTypep(), + depth + 1, suffix + ".atDefault()" + cvtarray); } else if (const AstQueueDType* const adtypep = VN_CAST(dtypep, QueueDType)) { // Access std::array as C array const string cvtarray = (adtypep->subDTypep()->isWide() ? ".data()" : ""); - return emitVarResetRecurse(varp, varNameProtected, adtypep->subDTypep(), depth + 1, - suffix + ".atDefault()" + cvtarray); + const string pre = constructing ? "" : varNameProtected + suffix + ".clear();\n"; + return pre + + emitVarResetRecurse(varp, constructing, varNameProtected, adtypep->subDTypep(), + depth + 1, suffix + ".atDefault()" + cvtarray); } else if (VN_IS(dtypep, SampleQueueDType)) { return ""; } else if (const AstUnpackArrayDType* const adtypep = VN_CAST(dtypep, UnpackArrayDType)) { @@ -701,8 +713,9 @@ string EmitCFunc::emitVarResetRecurse(const AstVar* varp, const string& varNameP const string ivar = "__Vi"s + cvtToStr(depth); const string pre = ("for (int " + ivar + " = " + cvtToStr(0) + "; " + ivar + " < " + cvtToStr(adtypep->elementsConst()) + "; ++" + ivar + ") {\n"); - const string below = emitVarResetRecurse(varp, varNameProtected, adtypep->subDTypep(), - depth + 1, suffix + "[" + ivar + "]"); + const string below + = emitVarResetRecurse(varp, constructing, varNameProtected, adtypep->subDTypep(), + depth + 1, suffix + "[" + ivar + "]"); const string post = "}\n"; return below.empty() ? "" : pre + below + post; } else if (VN_IS(dtypep, NodeUOrStructDType) && !VN_AS(dtypep, NodeUOrStructDType)->packed()) { @@ -710,15 +723,15 @@ string EmitCFunc::emitVarResetRecurse(const AstVar* varp, const string& varNameP string literal; for (const AstMemberDType* itemp = sdtypep->membersp(); itemp; itemp = VN_AS(itemp->nextp(), MemberDType)) { - const std::string line - = emitVarResetRecurse(varp, varNameProtected + suffix + "." + itemp->nameProtect(), - itemp->dtypep(), depth + 1, ""); + const std::string line = emitVarResetRecurse( + varp, constructing, varNameProtected + suffix + "." + itemp->nameProtect(), + itemp->dtypep(), depth + 1, ""); if (!line.empty()) literal += line; } return literal; } else if (basicp && basicp->keyword() == VBasicDTypeKwd::STRING) { - // String's constructor deals with it - return ""; + if (constructing) return ""; // String's constructor deals with it + return varNameProtected + suffix + ".clear();\n"; } else if (basicp && basicp->isForkSync()) { return ""; } else if (basicp && basicp->isProcessRef()) { diff --git a/src/V3EmitCFunc.h b/src/V3EmitCFunc.h index 00374ae1f..ac4530ea1 100644 --- a/src/V3EmitCFunc.h +++ b/src/V3EmitCFunc.h @@ -210,9 +210,10 @@ public: void emitConstant(AstConst* nodep, AstVarRef* assigntop, const string& assignString); void emitConstantString(const AstConst* nodep); void emitSetVarConstant(const string& assignString, AstConst* constp); - void emitVarReset(AstVar* varp); - string emitVarResetRecurse(const AstVar* varp, const string& varNameProtected, - AstNodeDType* dtypep, int depth, const string& suffix); + void emitVarReset(AstVar* varp, bool constructing); + string emitVarResetRecurse(const AstVar* varp, bool constructing, + const string& varNameProtected, AstNodeDType* dtypep, int depth, + const string& suffix); void emitChangeDet(); void emitConstInit(AstNode* initp) { // We should refactor emit to produce output into a provided buffer, not go through members @@ -1436,7 +1437,7 @@ public: } void visit(AstCReset* nodep) override { AstVar* const varp = nodep->varrefp()->varp(); - emitVarReset(varp); + emitVarReset(varp, nodep->constructing()); } void visit(AstExecGraph* nodep) override { // The location of the AstExecGraph within the containing AstCFunc is where we want to diff --git a/src/V3Life.cpp b/src/V3Life.cpp index 556fc23c0..22e6c7272 100644 --- a/src/V3Life.cpp +++ b/src/V3Life.cpp @@ -46,11 +46,13 @@ class LifeState final { public: VDouble0 m_statAssnDel; // Statistic tracking VDouble0 m_statAssnCon; // Statistic tracking + VDouble0 m_statCResetDel; // Statistic tracking // CONSTRUCTORS LifeState() = default; ~LifeState() { V3Stats::addStatSum("Optimizations, Lifetime assign deletions", m_statAssnDel); + V3Stats::addStatSum("Optimizations, Lifetime creset deletions", m_statCResetDel); V3Stats::addStatSum("Optimizations, Lifetime constant prop", m_statAssnCon); } }; @@ -60,7 +62,7 @@ public: class LifeVarEntry final { // Last assignment to this varscope, nullptr if no longer relevant - AstNodeAssign* m_assignp = nullptr; + AstNodeStmt* m_assignp = nullptr; AstConst* m_constp = nullptr; // Known constant value // First access was a set (and thus block above may have a set that can be deleted bool m_setBeforeUse; @@ -68,13 +70,18 @@ class LifeVarEntry final { bool m_everSet = false; public: + class CRESET {}; class SIMPLEASSIGN {}; class COMPLEXASSIGN {}; class CONSUMED {}; - LifeVarEntry(SIMPLEASSIGN, AstNodeAssign* assp) + LifeVarEntry(CRESET, AstCReset* nodep) : m_setBeforeUse{true} { - simpleAssign(assp); + resetStatement(nodep); + } + LifeVarEntry(SIMPLEASSIGN, AstNodeAssign* nodep) + : m_setBeforeUse{true} { + simpleAssign(nodep); } explicit LifeVarEntry(COMPLEXASSIGN) : m_setBeforeUse{false} { @@ -85,11 +92,16 @@ public: consumed(); } ~LifeVarEntry() = default; - void simpleAssign(AstNodeAssign* assp) { // New simple A=.... assignment - m_assignp = assp; + void simpleAssign(AstNodeAssign* nodep) { // New simple A=.... assignment + m_assignp = nodep; + m_constp = nullptr; + m_everSet = true; + if (VN_IS(nodep->rhsp(), Const)) m_constp = VN_AS(nodep->rhsp(), Const); + } + void resetStatement(AstCReset* nodep) { // New CReset(A) assignment + m_assignp = nodep; m_constp = nullptr; m_everSet = true; - if (VN_IS(assp->rhsp(), Const)) m_constp = VN_AS(assp->rhsp(), Const); } void complexAssign() { // A[x]=... or some complicated assignment m_assignp = nullptr; @@ -99,7 +111,7 @@ public: void consumed() { // Rvalue read of A m_assignp = nullptr; } - AstNodeAssign* assignp() const { return m_assignp; } + AstNodeStmt* assignp() const { return m_assignp; } AstConst* constNodep() const { return m_constp; } bool setBeforeUse() const { return m_setBeforeUse; } bool everSet() const { return m_everSet; } @@ -135,7 +147,7 @@ public: // Rather than track what sigs AstUCFunc/AstUCStmt may change, // we just don't optimize any public sigs // Check the var entry, and remove if appropriate - if (AstNode* const oldassp = entp->assignp()) { + if (AstNodeStmt* const oldassp = entp->assignp()) { UINFO(7, " PREV: " << oldassp << endl); // Redundant assignment, in same level block // Don't delete it now as it will confuse iteration since it maybe WAY @@ -143,11 +155,28 @@ public: if (debug() > 4) oldassp->dumpTree("- REMOVE/SAMEBLK: "); entp->complexAssign(); oldassp->unlinkFrBack(); + if (VN_IS(oldassp, CReset)) { + ++m_statep->m_statCResetDel; + } else { + ++m_statep->m_statAssnDel; + } VL_DO_DANGLING(m_deleter.pushDeletep(oldassp), oldassp); - ++m_statep->m_statAssnDel; } } } + void resetStatement(AstVarScope* nodep, AstCReset* rstp) { + // Do we have a old assignment we can nuke? + UINFO(4, " CRESETof: " << nodep << endl); + UINFO(7, " new: " << rstp << endl); + const auto pair = m_map.emplace(std::piecewise_construct, // + std::forward_as_tuple(nodep), + std::forward_as_tuple(LifeVarEntry::CRESET{}, rstp)); + if (!pair.second) { + checkRemoveAssign(pair.first); + pair.first->second.resetStatement(rstp); + } + // lifeDump(); + } void simpleAssign(AstVarScope* nodep, AstNodeAssign* assp) { // Do we have a old assignment we can nuke? UINFO(4, " ASSIGNof: " << nodep << endl); @@ -313,6 +342,15 @@ class LifeVisitor final : public VNVisitor { iterateAndNextNull(nodep->lhsp()); } } + void visit(AstCReset* nodep) override { + if (!m_noopt) { + AstVarScope* const vscp = nodep->varrefp()->varScopep(); + UASSERT_OBJ(vscp, nodep, "Scope lost on variable"); + m_lifep->resetStatement(vscp, nodep); + } else { + iterateAndNextNull(nodep->varrefp()); + } + } void visit(AstAssignDly* nodep) override { // V3Life doesn't understand time sense if (nodep->isTimingControl()) { diff --git a/src/V3Task.cpp b/src/V3Task.cpp index eb8716133..588031257 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -604,11 +604,19 @@ class TaskVisitor final : public VNVisitor { // Any I/O variables that fell out of above loop were already linked if (!portp->user2p()) { // Move it to a new localized variable - portp->unlinkFrBack(); - pushDeletep(portp); // Remove it from the clone (not original) AstVarScope* const localVscp = createVarScope(portp, namePrefix + "__" + portp->shortName()); portp->user2p(localVscp); + if (portp->needsCReset() && portp->lifetime().isAutomatic() + && !portp->valuep()) { + // Reset automatic var to its default, on each invocation of function + AstVarRef* const vrefp + = new AstVarRef{portp->fileline(), portp, VAccess::WRITE}; + portp->replaceWith(new AstCReset{portp->fileline(), vrefp, false}); + } else { + portp->unlinkFrBack(); + } + pushDeletep(portp); // Remove it from the clone (not original) } } } diff --git a/test_regress/t/t_func_automatic_clear.py b/test_regress/t/t_func_automatic_clear.py new file mode 100755 index 000000000..f989a35fb --- /dev/null +++ b/test_regress/t/t_func_automatic_clear.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2025 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +import vltest_bootstrap + +test.scenarios('simulator') + +test.compile() + +test.execute() + +test.passes() diff --git a/test_regress/t/t_func_automatic_clear.v b/test_regress/t/t_func_automatic_clear.v new file mode 100644 index 000000000..4f88849e4 --- /dev/null +++ b/test_regress/t/t_func_automatic_clear.v @@ -0,0 +1,162 @@ +// DESCRIPTION: Verilator: Test automatic function variables lifetime +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2025 by Augustin Fabre. +// SPDX-License-Identifier: CC0-1.0 + +`define stop $stop +`define checkh(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0x exp=%0x (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0); +`define checks(gotv,expv) do if ((gotv) != (expv)) begin $write("%%Error: %s:%0d: got='%s' exp='%s'\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0); + +// Bug5747: Make sure that a variable with automatic storage is freshly +// allocated when entering the function. + +module t(); + function automatic int ts_queue(); + static int qs[$]; + qs.push_back(0); + // $display(" qs: %p", qs); + return qs.size(); + endfunction + + function automatic int t_queue(); + int q[$]; + q.push_back(0); + // $display(" q: %p", q); + return q.size(); + endfunction + + function automatic int t_scalar(); + int x; + ++x; + return x; + endfunction + + typedef struct { + int y; + } y_t; + + function automatic int t_struct(); + y_t y; + ++y.y; + return y.y; + endfunction + + function automatic string t_string(); + string x; + x = {x, "s"}; + return x; + endfunction + +class ClsZ; + int z; +endclass + + function automatic int t_class(); + ClsZ z = new(); + ++z.z; + return z.z; + endfunction + + typedef string dyn_t[]; + function automatic dyn_t t_dyn(); + dyn_t x; + x = {x, "s"}; + return x; + endfunction + + typedef string assoc_t[int]; + function automatic assoc_t t_assoc(); + static int ins = 0; + assoc_t x; + ins = ins + 1; + x[ins] = "s"; + return x; + endfunction + + typedef string wild_t[*]; + function automatic wild_t t_wild(); + static int ins = 0; + wild_t x; + ins = ins + 1; + x[ins] = "s"; + return x; + endfunction + + typedef int unpack_t[8]; + function automatic unpack_t t_unpack(); + static int ins = 0; + unpack_t x; + ins = ins + 1; + x[ins] = ins; + return x; + endfunction + + // ======================= + + function automatic void main(); + for (int i = 0; i < 3; ++i) begin + int qn = ts_queue(); + int qo = ts_queue(); + `checkh(qn, i * 2 + 1); + `checkh(qo, i * 2 + 2); + end + + for (int i = 0; i < 3; ++i) begin + int qn = t_queue(); + `checkh(qn, 1); + end + + for (int i = 0; i < 3; ++i) begin + int x = t_scalar(); + `checkh(x, 1); + end + + for (int i = 0; i < 3; ++i) begin + int y = t_struct(); + `checkh(y, 1); + end + + for (int i = 0; i < 3; ++i) begin + int z = t_class(); + `checkh(z, 1); + end + + for (int i = 0; i < 3; ++i) begin + string z = t_string(); + `checks(z, "s"); + end + + for (int i = 0; i < 3; ++i) begin + dyn_t z = t_dyn(); + `checkh(z.size(), 1); + end + + for (int i = 0; i < 3; ++i) begin + assoc_t z = t_assoc(); + `checkh(z.size(), 1); + end + + for (int i = 0; i < 3; ++i) begin + wild_t z = t_wild(); + `checkh(z.size(), 1); + end + + for (int i = 0; i < 3; ++i) begin + int cnt; + unpack_t z = t_unpack(); + cnt = 0; + for (int j = 0; j < $high(z); ++j) begin + if (z[j] != 0) cnt = cnt + 1; + end + `checkh(cnt, 1); + end + + endfunction + + initial begin + main(); + $write("*-* All Finished *-*\n"); + $finish; + end +endmodule diff --git a/test_regress/t/t_json_only_debugcheck.out b/test_regress/t/t_json_only_debugcheck.out index d8f2eeb9a..343d19495 100644 --- a/test_regress/t/t_json_only_debugcheck.out +++ b/test_regress/t/t_json_only_debugcheck.out @@ -49,12 +49,12 @@ {"type":"CFUNC","name":"_eval_initial__TOP","addr":"(LB)","loc":"d,11:8,11:9","slow":true,"isStatic":false,"dpiExportDispatcher":false,"dpiExportImpl":false,"dpiImportPrototype":false,"dpiImportWrapper":false,"dpiContext":false,"isConstructor":false,"isDestructor":false,"isVirtual":false,"isCoroutine":false,"needProcess":false,"scopep":"(Y)","argsp": [], "initsp": [ {"type":"VAR","name":"t.all","addr":"(QB)","loc":"d,28:11,28:14","dtypep":"(RB)","origName":"t__DOT__all","isSc":false,"isPrimaryIO":false,"direction":"NONE","isConst":false,"isPullup":false,"isPulldown":false,"isUsedClock":false,"isSigPublic":false,"isLatched":false,"isUsedLoopIdx":false,"noReset":false,"attrIsolateAssign":false,"attrFileDescr":false,"isDpiOpenArray":false,"isFuncReturn":false,"isFuncLocal":true,"attrClocker":"UNKNOWN","lifetime":"NONE","varType":"VAR","dtypeName":"string","isSigUserRdPublic":false,"isSigUserRWPublic":false,"isGParam":false,"isParam":false,"attrScBv":false,"attrSFormat":false,"sensIfacep":"UNLINKED","childDTypep": [],"delayp": [],"valuep": [],"attrsp": []}, - {"type":"CRESET","name":"","addr":"(SB)","loc":"d,28:11,28:14", + {"type":"CRESET","name":"","addr":"(SB)","loc":"d,28:11,28:14","constructing":true, "varrefp": [ {"type":"VARREF","name":"t.all","addr":"(TB)","loc":"d,28:11,28:14","dtypep":"(RB)","access":"WR","varp":"(QB)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, {"type":"VAR","name":"t.unnamedblk1.e","addr":"(UB)","loc":"d,52:17,52:18","dtypep":"(VB)","origName":"t__DOT__unnamedblk1__DOT__e","isSc":false,"isPrimaryIO":false,"direction":"NONE","isConst":false,"isPullup":false,"isPulldown":false,"isUsedClock":false,"isSigPublic":false,"isLatched":false,"isUsedLoopIdx":false,"noReset":false,"attrIsolateAssign":false,"attrFileDescr":false,"isDpiOpenArray":false,"isFuncReturn":false,"isFuncLocal":true,"attrClocker":"UNKNOWN","lifetime":"NONE","varType":"VAR","dtypeName":"my_t","isSigUserRdPublic":false,"isSigUserRWPublic":false,"isGParam":false,"isParam":false,"attrScBv":false,"attrSFormat":false,"sensIfacep":"UNLINKED","childDTypep": [],"delayp": [],"valuep": [],"attrsp": []}, - {"type":"CRESET","name":"","addr":"(WB)","loc":"d,52:17,52:18", + {"type":"CRESET","name":"","addr":"(WB)","loc":"d,52:17,52:18","constructing":true, "varrefp": [ {"type":"VARREF","name":"t.unnamedblk1.e","addr":"(XB)","loc":"d,52:17,52:18","dtypep":"(VB)","access":"WR","varp":"(UB)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, @@ -1147,12 +1147,12 @@ {"type":"CFUNC","name":"_nba_sequent__TOP__0","addr":"(LR)","loc":"d,23:17,23:20","slow":false,"isStatic":false,"dpiExportDispatcher":false,"dpiExportImpl":false,"dpiImportPrototype":false,"dpiImportWrapper":false,"dpiContext":false,"isConstructor":false,"isDestructor":false,"isVirtual":false,"isCoroutine":false,"needProcess":false,"scopep":"(Y)","argsp": [], "initsp": [ {"type":"VAR","name":"__Vdly__t.cyc","addr":"(MR)","loc":"d,23:17,23:20","dtypep":"(R)","origName":"__Vdly__t__DOT__cyc","isSc":false,"isPrimaryIO":false,"direction":"NONE","isConst":false,"isPullup":false,"isPulldown":false,"isUsedClock":false,"isSigPublic":false,"isLatched":false,"isUsedLoopIdx":false,"noReset":false,"attrIsolateAssign":false,"attrFileDescr":false,"isDpiOpenArray":false,"isFuncReturn":false,"isFuncLocal":true,"attrClocker":"UNKNOWN","lifetime":"NONE","varType":"BLOCKTEMP","dtypeName":"integer","isSigUserRdPublic":false,"isSigUserRWPublic":false,"isGParam":false,"isParam":false,"attrScBv":false,"attrSFormat":false,"sensIfacep":"UNLINKED","childDTypep": [],"delayp": [],"valuep": [],"attrsp": []}, - {"type":"CRESET","name":"","addr":"(NR)","loc":"d,23:17,23:20", + {"type":"CRESET","name":"","addr":"(NR)","loc":"d,23:17,23:20","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Vdly__t.cyc","addr":"(OR)","loc":"d,23:17,23:20","dtypep":"(R)","access":"WR","varp":"(MR)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, {"type":"VAR","name":"__Vdly__t.e","addr":"(PR)","loc":"d,24:9,24:10","dtypep":"(M)","origName":"__Vdly__t__DOT__e","isSc":false,"isPrimaryIO":false,"direction":"NONE","isConst":false,"isPullup":false,"isPulldown":false,"isUsedClock":false,"isSigPublic":false,"isLatched":false,"isUsedLoopIdx":false,"noReset":false,"attrIsolateAssign":false,"attrFileDescr":false,"isDpiOpenArray":false,"isFuncReturn":false,"isFuncLocal":true,"attrClocker":"UNKNOWN","lifetime":"NONE","varType":"BLOCKTEMP","dtypeName":"my_t","isSigUserRdPublic":false,"isSigUserRWPublic":false,"isGParam":false,"isParam":false,"attrScBv":false,"attrSFormat":false,"sensIfacep":"UNLINKED","childDTypep": [],"delayp": [],"valuep": [],"attrsp": []}, - {"type":"CRESET","name":"","addr":"(QR)","loc":"d,24:9,24:10", + {"type":"CRESET","name":"","addr":"(QR)","loc":"d,24:9,24:10","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Vdly__t.e","addr":"(RR)","loc":"d,24:9,24:10","dtypep":"(M)","access":"WR","varp":"(PR)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, @@ -2801,19 +2801,19 @@ ],"finalsp": []}, {"type":"CFUNC","name":"_ctor_var_reset","addr":"(APB)","loc":"d,11:8,11:9","slow":true,"isStatic":false,"dpiExportDispatcher":false,"dpiExportImpl":false,"dpiImportPrototype":false,"dpiImportWrapper":false,"dpiContext":false,"isConstructor":false,"isDestructor":false,"isVirtual":false,"isCoroutine":false,"needProcess":false,"scopep":"UNLINKED","argsp": [],"initsp": [], "stmtsp": [ - {"type":"CRESET","name":"","addr":"(BPB)","loc":"d,15:10,15:13", + {"type":"CRESET","name":"","addr":"(BPB)","loc":"d,15:10,15:13","constructing":true, "varrefp": [ {"type":"VARREF","name":"clk","addr":"(CPB)","loc":"d,15:10,15:13","dtypep":"(K)","access":"WR","varp":"(J)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(DPB)","loc":"d,23:17,23:20", + {"type":"CRESET","name":"","addr":"(DPB)","loc":"d,23:17,23:20","constructing":true, "varrefp": [ {"type":"VARREF","name":"t.cyc","addr":"(EPB)","loc":"d,23:17,23:20","dtypep":"(R)","access":"WR","varp":"(Q)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(FPB)","loc":"d,24:9,24:10", + {"type":"CRESET","name":"","addr":"(FPB)","loc":"d,24:9,24:10","constructing":true, "varrefp": [ {"type":"VARREF","name":"t.e","addr":"(GPB)","loc":"d,24:9,24:10","dtypep":"(M)","access":"WR","varp":"(L)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(HPB)","loc":"d,11:8,11:9", + {"type":"CRESET","name":"","addr":"(HPB)","loc":"d,11:8,11:9","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Vtrigprevexpr___TOP__clk__0","addr":"(IPB)","loc":"d,11:8,11:9","dtypep":"(K)","access":"WR","varp":"(N)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]} @@ -2888,15 +2888,15 @@ {"type":"SCOPE","name":"$unit","addr":"(IQB)","loc":"a,0:0,0:0","aboveScopep":"(Y)","aboveCellp":"(X)","modp":"(E)","varsp": [],"blocksp": [],"inlinesp": []}, {"type":"CFUNC","name":"_ctor_var_reset","addr":"(JQB)","loc":"a,0:0,0:0","slow":true,"isStatic":false,"dpiExportDispatcher":false,"dpiExportImpl":false,"dpiImportPrototype":false,"dpiImportWrapper":false,"dpiContext":false,"isConstructor":false,"isDestructor":false,"isVirtual":false,"isCoroutine":false,"needProcess":false,"scopep":"UNLINKED","argsp": [],"initsp": [], "stmtsp": [ - {"type":"CRESET","name":"","addr":"(KQB)","loc":"d,17:12,17:16", + {"type":"CRESET","name":"","addr":"(KQB)","loc":"d,17:12,17:16","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Venumtab_enum_next1","addr":"(LQB)","loc":"d,17:12,17:16","dtypep":"(IC)","access":"WR","varp":"(JC)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(MQB)","loc":"d,17:12,17:16", + {"type":"CRESET","name":"","addr":"(MQB)","loc":"d,17:12,17:16","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Venumtab_enum_prev1","addr":"(NQB)","loc":"d,17:12,17:16","dtypep":"(CJ)","access":"WR","varp":"(DJ)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]}, - {"type":"CRESET","name":"","addr":"(OQB)","loc":"d,17:12,17:16", + {"type":"CRESET","name":"","addr":"(OQB)","loc":"d,17:12,17:16","constructing":true, "varrefp": [ {"type":"VARREF","name":"__Venumtab_enum_name1","addr":"(PQB)","loc":"d,17:12,17:16","dtypep":"(OM)","access":"WR","varp":"(PM)","varScopep":"UNLINKED","classOrPackagep":"UNLINKED"} ]} diff --git a/test_regress/t/t_json_only_flat_vlvbound.out b/test_regress/t/t_json_only_flat_vlvbound.out index 9745e13a3..2214aa2e9 100644 --- a/test_regress/t/t_json_only_flat_vlvbound.out +++ b/test_regress/t/t_json_only_flat_vlvbound.out @@ -70,222 +70,238 @@ "lhsp": [ {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__val","addr":"(GC)","loc":"d,15:57,15:60","dtypep":"(H)","access":"WR","varp":"(CB)","varScopep":"(BB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(HC)","loc":"d,18:11,18:12","dtypep":"(GB)", + {"type":"CRESET","name":"","addr":"(HC)","loc":"d,16:17,16:20","constructing":false, + "varrefp": [ + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(IC)","loc":"d,16:17,16:20","dtypep":"(K)","access":"WR","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} + ]}, + {"type":"CRESET","name":"","addr":"(JC)","loc":"d,17:13,17:14","constructing":false, + "varrefp": [ + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(KC)","loc":"d,17:13,17:14","dtypep":"(GB)","access":"WR","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + ]}, + {"type":"ASSIGN","name":"","addr":"(LC)","loc":"d,18:11,18:12","dtypep":"(GB)", "rhsp": [ - {"type":"CONST","name":"32'sh0","addr":"(IC)","loc":"d,18:12,18:13","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh0","addr":"(MC)","loc":"d,18:12,18:13","dtypep":"(NC)"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(KC)","loc":"d,18:10,18:11","dtypep":"(GB)","access":"WR","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(OC)","loc":"d,18:10,18:11","dtypep":"(GB)","access":"WR","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"WHILE","name":"","addr":"(LC)","loc":"d,18:5,18:8","precondsp": [], + {"type":"WHILE","name":"","addr":"(PC)","loc":"d,18:5,18:8","precondsp": [], "condp": [ - {"type":"GTS","name":"","addr":"(MC)","loc":"d,18:18,18:19","dtypep":"(NC)", + {"type":"GTS","name":"","addr":"(QC)","loc":"d,18:18,18:19","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"32'sh7","addr":"(OC)","loc":"d,18:20,18:21","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh7","addr":"(SC)","loc":"d,18:20,18:21","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(PC)","loc":"d,18:16,18:17","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(TC)","loc":"d,18:16,18:17","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ]} ], "stmtsp": [ - {"type":"ASSIGN","name":"","addr":"(QC)","loc":"d,19:14,19:15","dtypep":"(NC)", + {"type":"ASSIGN","name":"","addr":"(UC)","loc":"d,19:14,19:15","dtypep":"(RC)", "rhsp": [ - {"type":"EQ","name":"","addr":"(RC)","loc":"d,19:31,19:33","dtypep":"(NC)", + {"type":"EQ","name":"","addr":"(VC)","loc":"d,19:31,19:33","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"2'h0","addr":"(SC)","loc":"d,19:34,19:39","dtypep":"(TC)"} + {"type":"CONST","name":"2'h0","addr":"(WC)","loc":"d,19:34,19:39","dtypep":"(XC)"} ], "rhsp": [ - {"type":"SEL","name":"","addr":"(UC)","loc":"d,19:20,19:21","dtypep":"(TC)","declRange":"[15:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(YC)","loc":"d,19:20,19:21","dtypep":"(XC)","declRange":"[15:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__val","addr":"(VC)","loc":"d,19:17,19:20","dtypep":"(H)","access":"RD","varp":"(CB)","varScopep":"(BB)","classOrPackagep":"UNLINKED"} + {"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":"(WC)","loc":"d,19:22,19:23","dtypep":"(XC)", + {"type":"SEL","name":"","addr":"(AD)","loc":"d,19:22,19:23","dtypep":"(BD)", "fromp": [ - {"type":"MULS","name":"","addr":"(YC)","loc":"d,19:22,19:23","dtypep":"(JC)", + {"type":"MULS","name":"","addr":"(CD)","loc":"d,19:22,19:23","dtypep":"(NC)", "lhsp": [ - {"type":"CONST","name":"32'sh2","addr":"(ZC)","loc":"d,19:23,19:24","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh2","addr":"(DD)","loc":"d,19:23,19:24","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(AD)","loc":"d,19:21,19:22","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(ED)","loc":"d,19:21,19:22","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ]} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(BD)","loc":"d,19:22,19:23","dtypep":"(CD)"} + {"type":"CONST","name":"32'h0","addr":"(FD)","loc":"d,19:22,19:23","dtypep":"(GD)"} ], "widthp": [ - {"type":"CONST","name":"32'h4","addr":"(DD)","loc":"d,19:22,19:23","dtypep":"(CD)"} + {"type":"CONST","name":"32'h4","addr":"(HD)","loc":"d,19:22,19:23","dtypep":"(GD)"} ]} ], "widthp": [ - {"type":"CONST","name":"32'sh2","addr":"(ED)","loc":"d,19:28,19:29","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh2","addr":"(ID)","loc":"d,19:28,19:29","dtypep":"(NC)"} ]} ]} ], "lhsp": [ - {"type":"SEL","name":"","addr":"(FD)","loc":"d,19:10,19:11","dtypep":"(NC)","declRange":"[6:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(JD)","loc":"d,19:10,19:11","dtypep":"(RC)","declRange":"[6:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__ret","addr":"(GD)","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":"(KD)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(EB)","varScopep":"(DB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(HD)","loc":"d,19:11,19:12","dtypep":"(ID)", + {"type":"SEL","name":"","addr":"(LD)","loc":"d,19:11,19:12","dtypep":"(MD)", "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__0__i","addr":"(JD)","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":"(ND)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(HB)","varScopep":"(FB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(KD)","loc":"d,19:11,19:12","dtypep":"(CD)"} + {"type":"CONST","name":"32'h0","addr":"(OD)","loc":"d,19:11,19:12","dtypep":"(GD)"} ], "widthp": [ - {"type":"CONST","name":"32'h3","addr":"(LD)","loc":"d,19:11,19:12","dtypep":"(CD)"} + {"type":"CONST","name":"32'h3","addr":"(PD)","loc":"d,19:11,19:12","dtypep":"(GD)"} ]} ], "widthp": [ - {"type":"CONST","name":"32'h1","addr":"(MD)","loc":"d,19:10,19:11","dtypep":"(CD)"} + {"type":"CONST","name":"32'h1","addr":"(QD)","loc":"d,19:10,19:11","dtypep":"(GD)"} ]} ],"timingControlp": []} ], "incsp": [ - {"type":"ASSIGN","name":"","addr":"(ND)","loc":"d,18:24,18:26","dtypep":"(GB)", + {"type":"ASSIGN","name":"","addr":"(RD)","loc":"d,18:24,18:26","dtypep":"(GB)", "rhsp": [ - {"type":"ADD","name":"","addr":"(OD)","loc":"d,18:24,18:26","dtypep":"(CD)", + {"type":"ADD","name":"","addr":"(SD)","loc":"d,18:24,18:26","dtypep":"(GD)", "lhsp": [ - {"type":"CONST","name":"32'h1","addr":"(PD)","loc":"d,18:24,18:26","dtypep":"(CD)"} + {"type":"CONST","name":"32'h1","addr":"(TD)","loc":"d,18:24,18:26","dtypep":"(GD)"} ], "rhsp": [ - {"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"} + {"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"} ]} ], "lhsp": [ - {"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"} + {"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"} ],"timingControlp": []} ]}, - {"type":"ASSIGN","name":"","addr":"(SD)","loc":"d,21:5,21:11","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(WD)","loc":"d,21:5,21:11","dtypep":"(K)", "rhsp": [ - {"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"} + {"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"} ], "lhsp": [ - {"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"} + {"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"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(VD)","loc":"d,24:14,24:15","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(ZD)","loc":"d,24:14,24:15","dtypep":"(K)", "rhsp": [ - {"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"} + {"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"} ], "lhsp": [ - {"type":"VARREF","name":"o_a","addr":"(XD)","loc":"d,24:10,24:13","dtypep":"(K)","access":"WR","varp":"(J)","varScopep":"(T)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"o_a","addr":"(BE)","loc":"d,24:10,24:13","dtypep":"(K)","access":"WR","varp":"(J)","varScopep":"(T)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]}, - {"type":"ALWAYS","name":"","addr":"(YD)","loc":"d,25:14,25:15","keyword":"always","isSuspendable":false,"needProcess":false,"sensesp": [], + {"type":"ALWAYS","name":"","addr":"(CE)","loc":"d,25:14,25:15","keyword":"always","isSuspendable":false,"needProcess":false,"sensesp": [], "stmtsp": [ - {"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)", + {"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)", "rhsp": [ - {"type":"VARREF","name":"i_b","addr":"(BE)","loc":"d,25:20,25:23","dtypep":"(H)","access":"RD","varp":"(I)","varScopep":"(S)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"i_b","addr":"(FE)","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":"(CE)","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":"(GE)","loc":"d,15:57,15:60","dtypep":"(H)","access":"WR","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(DE)","loc":"d,18:11,18:12","dtypep":"(GB)", + {"type":"CRESET","name":"","addr":"(HE)","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":"CRESET","name":"","addr":"(JE)","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":"ASSIGN","name":"","addr":"(LE)","loc":"d,18:11,18:12","dtypep":"(GB)", "rhsp": [ - {"type":"CONST","name":"32'sh0","addr":"(EE)","loc":"d,18:12,18:13","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh0","addr":"(ME)","loc":"d,18:12,18:13","dtypep":"(NC)"} ], "lhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(FE)","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":"(NE)","loc":"d,18:10,18:11","dtypep":"(GB)","access":"WR","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ],"timingControlp": []}, - {"type":"WHILE","name":"","addr":"(GE)","loc":"d,18:5,18:8","precondsp": [], + {"type":"WHILE","name":"","addr":"(OE)","loc":"d,18:5,18:8","precondsp": [], "condp": [ - {"type":"GTS","name":"","addr":"(HE)","loc":"d,18:18,18:19","dtypep":"(NC)", + {"type":"GTS","name":"","addr":"(PE)","loc":"d,18:18,18:19","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"32'sh7","addr":"(IE)","loc":"d,18:20,18:21","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh7","addr":"(QE)","loc":"d,18:20,18:21","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(JE)","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":"(RE)","loc":"d,18:16,18:17","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]} ], "stmtsp": [ - {"type":"ASSIGN","name":"","addr":"(KE)","loc":"d,19:14,19:15","dtypep":"(NC)", + {"type":"ASSIGN","name":"","addr":"(SE)","loc":"d,19:14,19:15","dtypep":"(RC)", "rhsp": [ - {"type":"EQ","name":"","addr":"(LE)","loc":"d,19:31,19:33","dtypep":"(NC)", + {"type":"EQ","name":"","addr":"(TE)","loc":"d,19:31,19:33","dtypep":"(RC)", "lhsp": [ - {"type":"CONST","name":"2'h0","addr":"(ME)","loc":"d,19:34,19:39","dtypep":"(TC)"} + {"type":"CONST","name":"2'h0","addr":"(UE)","loc":"d,19:34,19:39","dtypep":"(XC)"} ], "rhsp": [ - {"type":"SEL","name":"","addr":"(NE)","loc":"d,19:20,19:21","dtypep":"(TC)","declRange":"[15:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(VE)","loc":"d,19:20,19:21","dtypep":"(XC)","declRange":"[15:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__val","addr":"(OE)","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":"(WE)","loc":"d,19:17,19:20","dtypep":"(H)","access":"RD","varp":"(LB)","varScopep":"(KB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(PE)","loc":"d,19:22,19:23","dtypep":"(XC)", + {"type":"SEL","name":"","addr":"(XE)","loc":"d,19:22,19:23","dtypep":"(BD)", "fromp": [ - {"type":"MULS","name":"","addr":"(QE)","loc":"d,19:22,19:23","dtypep":"(JC)", + {"type":"MULS","name":"","addr":"(YE)","loc":"d,19:22,19:23","dtypep":"(NC)", "lhsp": [ - {"type":"CONST","name":"32'sh2","addr":"(RE)","loc":"d,19:23,19:24","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh2","addr":"(ZE)","loc":"d,19:23,19:24","dtypep":"(NC)"} ], "rhsp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(SE)","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":"(AF)","loc":"d,19:21,19:22","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ]} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(TE)","loc":"d,19:22,19:23","dtypep":"(CD)"} + {"type":"CONST","name":"32'h0","addr":"(BF)","loc":"d,19:22,19:23","dtypep":"(GD)"} ], "widthp": [ - {"type":"CONST","name":"32'h4","addr":"(UE)","loc":"d,19:22,19:23","dtypep":"(CD)"} + {"type":"CONST","name":"32'h4","addr":"(CF)","loc":"d,19:22,19:23","dtypep":"(GD)"} ]} ], "widthp": [ - {"type":"CONST","name":"32'sh2","addr":"(VE)","loc":"d,19:28,19:29","dtypep":"(JC)"} + {"type":"CONST","name":"32'sh2","addr":"(DF)","loc":"d,19:28,19:29","dtypep":"(NC)"} ]} ]} ], "lhsp": [ - {"type":"SEL","name":"","addr":"(WE)","loc":"d,19:10,19:11","dtypep":"(NC)","declRange":"[6:0]","declElWidth":1, + {"type":"SEL","name":"","addr":"(EF)","loc":"d,19:10,19:11","dtypep":"(RC)","declRange":"[6:0]","declElWidth":1, "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__ret","addr":"(XE)","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":"(FF)","loc":"d,19:7,19:10","dtypep":"(K)","access":"WR","varp":"(NB)","varScopep":"(MB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"SEL","name":"","addr":"(YE)","loc":"d,19:11,19:12","dtypep":"(ID)", + {"type":"SEL","name":"","addr":"(GF)","loc":"d,19:11,19:12","dtypep":"(MD)", "fromp": [ - {"type":"VARREF","name":"__Vfunc_vlvbound_test.foo__1__i","addr":"(ZE)","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":"(HF)","loc":"d,19:11,19:12","dtypep":"(GB)","access":"RD","varp":"(PB)","varScopep":"(OB)","classOrPackagep":"UNLINKED"} ], "lsbp": [ - {"type":"CONST","name":"32'h0","addr":"(AF)","loc":"d,19:11,19:12","dtypep":"(CD)"} + {"type":"CONST","name":"32'h0","addr":"(IF)","loc":"d,19:11,19:12","dtypep":"(GD)"} ], "widthp": [ - {"type":"CONST","name":"32'h3","addr":"(BF)","loc":"d,19:11,19:12","dtypep":"(CD)"} + {"type":"CONST","name":"32'h3","addr":"(JF)","loc":"d,19:11,19:12","dtypep":"(GD)"} ]} ], "widthp": [ - {"type":"CONST","name":"32'h1","addr":"(CF)","loc":"d,19:10,19:11","dtypep":"(CD)"} + {"type":"CONST","name":"32'h1","addr":"(KF)","loc":"d,19:10,19:11","dtypep":"(GD)"} ]} ],"timingControlp": []} ], "incsp": [ - {"type":"ASSIGN","name":"","addr":"(DF)","loc":"d,18:24,18:26","dtypep":"(GB)", + {"type":"ASSIGN","name":"","addr":"(LF)","loc":"d,18:24,18:26","dtypep":"(GB)", "rhsp": [ - {"type":"ADD","name":"","addr":"(EF)","loc":"d,18:24,18:26","dtypep":"(CD)", + {"type":"ADD","name":"","addr":"(MF)","loc":"d,18:24,18:26","dtypep":"(GD)", "lhsp": [ - {"type":"CONST","name":"32'h1","addr":"(FF)","loc":"d,18:24,18:26","dtypep":"(CD)"} + {"type":"CONST","name":"32'h1","addr":"(NF)","loc":"d,18:24,18:26","dtypep":"(GD)"} ], "rhsp": [ - {"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"} + {"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"} ]} ], "lhsp": [ - {"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"} + {"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"} ],"timingControlp": []} ]}, - {"type":"ASSIGN","name":"","addr":"(IF)","loc":"d,21:5,21:11","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(QF)","loc":"d,21:5,21:11","dtypep":"(K)", "rhsp": [ - {"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"} + {"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"} ], "lhsp": [ - {"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"} + {"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"} ],"timingControlp": []}, - {"type":"ASSIGN","name":"","addr":"(LF)","loc":"d,25:14,25:15","dtypep":"(K)", + {"type":"ASSIGN","name":"","addr":"(TF)","loc":"d,25:14,25:15","dtypep":"(K)", "rhsp": [ - {"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"} + {"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"} ], "lhsp": [ - {"type":"VARREF","name":"o_b","addr":"(NF)","loc":"d,25:10,25:13","dtypep":"(K)","access":"WR","varp":"(L)","varScopep":"(U)","classOrPackagep":"UNLINKED"} + {"type":"VARREF","name":"o_b","addr":"(VF)","loc":"d,25:10,25:13","dtypep":"(K)","access":"WR","varp":"(L)","varScopep":"(U)","classOrPackagep":"UNLINKED"} ],"timingControlp": []} ]} ],"inlinesp": []} @@ -303,21 +319,21 @@ "miscsp": [ {"type":"TYPETABLE","name":"","addr":"(C)","loc":"a,0:0,0:0","constraintRefp":"UNLINKED","emptyQueuep":"UNLINKED","queueIndexp":"UNLINKED","streamp":"UNLINKED","voidp":"UNLINKED", "typesp": [ - {"type":"BASICDTYPE","name":"logic","addr":"(NC)","loc":"d,18:18,18:19","dtypep":"(NC)","keyword":"logic","generic":true,"rangep": []}, - {"type":"BASICDTYPE","name":"logic","addr":"(TC)","loc":"d,19:34,19:39","dtypep":"(TC)","keyword":"logic","range":"1:0","generic":true,"rangep": []}, + {"type":"BASICDTYPE","name":"logic","addr":"(RC)","loc":"d,18:18,18:19","dtypep":"(RC)","keyword":"logic","generic":true,"rangep": []}, + {"type":"BASICDTYPE","name":"logic","addr":"(XC)","loc":"d,19:34,19:39","dtypep":"(XC)","keyword":"logic","range":"1:0","generic":true,"rangep": []}, {"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":"(ID)","loc":"d,19:10,19:11","dtypep":"(ID)","keyword":"logic","range":"2:0","generic":true,"rangep": []}, - {"type":"BASICDTYPE","name":"logic","addr":"(CD)","loc":"d,19:11,19:12","dtypep":"(CD)","keyword":"logic","range":"31:0","generic":true,"rangep": []}, - {"type":"BASICDTYPE","name":"logic","addr":"(XC)","loc":"d,19:20,19:21","dtypep":"(XC)","keyword":"logic","range":"3:0","generic":true,"rangep": []}, - {"type":"BASICDTYPE","name":"logic","addr":"(JC)","loc":"d,18:12,18:13","dtypep":"(JC)","keyword":"logic","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":"(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":"(OF)","loc":"a,0:0,0:0","origName":"@CONST-POOL@","level":0,"modPublic":false,"inLibrary":false,"dead":false,"recursiveClone":false,"recursive":false,"timeunit":"NONE","inlinesp": [], + {"type":"MODULE","name":"@CONST-POOL@","addr":"(WF)","loc":"a,0:0,0:0","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":"(PF)","loc":"a,0:0,0:0","aboveScopep":"UNLINKED","aboveCellp":"UNLINKED","modp":"(OF)","varsp": [],"blocksp": [],"inlinesp": []} + {"type":"SCOPE","name":"@CONST-POOL@","addr":"(XF)","loc":"a,0:0,0:0","aboveScopep":"UNLINKED","aboveCellp":"UNLINKED","modp":"(WF)","varsp": [],"blocksp": [],"inlinesp": []} ],"activesp": []} ]} ]} diff --git a/test_regress/t/t_var_life.py b/test_regress/t/t_var_life.py index 09d396a1b..235481a3b 100755 --- a/test_regress/t/t_var_life.py +++ b/test_regress/t/t_var_life.py @@ -15,7 +15,8 @@ test.compile(verilator_flags2=["--stats"]) if test.vlt_all: test.file_grep(test.stats, r'Optimizations, Lifetime assign deletions\s+(\d+)', 4) - test.file_grep(test.stats, r'Optimizations, Lifetime constant prop\s+(\d+)', 2) + test.file_grep(test.stats, r'Optimizations, Lifetime creset deletions\s+(\d+)', 1) + test.file_grep(test.stats, r'Optimizations, Lifetime constant prop\s+(\d+)', 5) test.execute() diff --git a/test_regress/t/t_var_life.v b/test_regress/t/t_var_life.v index 2ec1c4d7d..d6aa4e605 100644 --- a/test_regress/t/t_var_life.v +++ b/test_regress/t/t_var_life.v @@ -40,6 +40,13 @@ module t (/*AUTOARG*/ endcase end + // Remove CResets + function int f(int in); + automatic int aut; + aut = in; + return aut; + endfunction + always @ (posedge clk) begin if (cyc!=0) begin cyc<=cyc+1; @@ -96,6 +103,9 @@ module t (/*AUTOARG*/ if (cyc==6) begin if (fixin != 16'hb7b7) $stop; end + if (cyc==8) begin + if (f(123) != 123) $stop; + end if (cyc==9) begin $write("*-* All Finished *-*\n"); $finish; diff --git a/test_regress/t/t_xml_flat_vlvbound.out b/test_regress/t/t_xml_flat_vlvbound.out index 2cba16ed9..3864164df 100644 --- a/test_regress/t/t_xml_flat_vlvbound.out +++ b/test_regress/t/t_xml_flat_vlvbound.out @@ -63,6 +63,12 @@ + + + + + + @@ -129,6 +135,12 @@ + + + + + +