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.
This commit is contained in:
parent
233b6eafba
commit
3b98db17cc
1
Changes
1
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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()
|
|
@ -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
|
|
@ -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"}
|
||||
]}
|
||||
|
|
|
@ -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": []}
|
||||
]}
|
||||
]}
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -63,6 +63,12 @@
|
|||
<varref loc="d,24,20,24,23" name="i_a" dtype_id="1"/>
|
||||
<varref loc="d,15,57,15,60" name="__Vfunc_vlvbound_test.foo__0__val" dtype_id="1"/>
|
||||
</assign>
|
||||
<creset loc="d,16,17,16,20">
|
||||
<varref loc="d,16,17,16,20" name="__Vfunc_vlvbound_test.foo__0__ret" dtype_id="2"/>
|
||||
</creset>
|
||||
<creset loc="d,17,13,17,14">
|
||||
<varref loc="d,17,13,17,14" name="__Vfunc_vlvbound_test.foo__0__i" dtype_id="3"/>
|
||||
</creset>
|
||||
<assign loc="d,18,11,18,12" dtype_id="3">
|
||||
<const loc="d,18,12,18,13" name="32'sh0" dtype_id="4"/>
|
||||
<varref loc="d,18,10,18,11" name="__Vfunc_vlvbound_test.foo__0__i" dtype_id="3"/>
|
||||
|
@ -129,6 +135,12 @@
|
|||
<varref loc="d,25,20,25,23" name="i_b" dtype_id="1"/>
|
||||
<varref loc="d,15,57,15,60" name="__Vfunc_vlvbound_test.foo__1__val" dtype_id="1"/>
|
||||
</assign>
|
||||
<creset loc="d,16,17,16,20">
|
||||
<varref loc="d,16,17,16,20" name="__Vfunc_vlvbound_test.foo__1__ret" dtype_id="2"/>
|
||||
</creset>
|
||||
<creset loc="d,17,13,17,14">
|
||||
<varref loc="d,17,13,17,14" name="__Vfunc_vlvbound_test.foo__1__i" dtype_id="3"/>
|
||||
</creset>
|
||||
<assign loc="d,18,11,18,12" dtype_id="3">
|
||||
<const loc="d,18,12,18,13" name="32'sh0" dtype_id="4"/>
|
||||
<varref loc="d,18,10,18,11" name="__Vfunc_vlvbound_test.foo__1__i" dtype_id="3"/>
|
||||
|
|
Loading…
Reference in New Issue