From 5c070558aebcb70bbcf5ce635bf7ba73f0fe746e Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 29 Oct 2020 21:27:19 -0400 Subject: [PATCH] Internals: Misc cleanups in prep for interface bugfix. No functional change intended. --- src/V3Inst.cpp | 3 +-- src/V3LinkDot.cpp | 26 ++++++++++---------------- src/V3Param.cpp | 18 +++++++----------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/src/V3Inst.cpp b/src/V3Inst.cpp index 6c4c1922f..4a7a9040f 100644 --- a/src/V3Inst.cpp +++ b/src/V3Inst.cpp @@ -278,8 +278,7 @@ private: = VN_CAST(arrdtype->subDTypep(), IfaceRefDType); origIfaceRefp->cellp(nullptr); AstVar* varNewp = ifaceVarp->cloneTree(false); - AstIfaceRefDType* ifaceRefp - = VN_CAST(arrdtype->subDTypep(), IfaceRefDType)->cloneTree(false); + AstIfaceRefDType* ifaceRefp = origIfaceRefp->cloneTree(false); arrdtype->addNextHere(ifaceRefp); ifaceRefp->cellp(newp); ifaceRefp->cellName(newp->name()); diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index b1bb00978..822a43692 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -108,12 +108,6 @@ public: return varp->isParam(); } }; -class LinkNodeMatcherVarOrScope : public VNodeMatcher { -public: - virtual bool nodeMatch(const AstNode* nodep) const override { - return VN_IS(nodep, Var) || VN_IS(nodep, Scope); - } -}; //###################################################################### // LinkDot state, as a visitor of each AstNode @@ -1718,7 +1712,7 @@ private: VSymEnt* m_dotSymp; // SymEnt for dotted AstParse lookup AstDot* m_dotp; // Current dot bool m_unresolved; // Unresolved, needs help from V3Param - AstNode* m_unlinkedScope; // Unresolved scope, needs corresponding VarXRef + AstNode* m_unlinkedScopep; // Unresolved scope, needs corresponding VarXRef bool m_dotErr; // Error found in dotted resolution, ignore upwards string m_dotText; // String of dotted names found in below parseref DotStates() { init(nullptr); } @@ -1730,7 +1724,7 @@ private: m_dotErr = false; m_dotText = ""; m_unresolved = false; - m_unlinkedScope = nullptr; + m_unlinkedScopep = nullptr; } string ascii() const { static const char* const names[] = {"NONE", "PACKAGE", "SCOPE", "FINAL", "MEMBER"}; @@ -1983,7 +1977,7 @@ private: } if (m_ds.m_unresolved && (VN_IS(nodep->lhsp(), CellRef) || VN_IS(nodep->lhsp(), CellArrayRef))) { - m_ds.m_unlinkedScope = nodep->lhsp(); + m_ds.m_unlinkedScopep = nodep->lhsp(); } if (!m_ds.m_dotErr) { // Once something wrong, give up // Top 'final' dot RHS is final RHS, else it's a @@ -2173,19 +2167,19 @@ private: varp->attrSplitVar(false); } m_ds.m_dotText = ""; - if (m_ds.m_unresolved && m_ds.m_unlinkedScope) { + if (m_ds.m_unresolved && m_ds.m_unlinkedScopep) { string dotted = refp->dotted(); size_t pos = dotted.find("__BRA__??__KET__"); // Arrays of interfaces all have the same parameters if (pos != string::npos && varp->isParam() - && VN_IS(m_ds.m_unlinkedScope, CellArrayRef)) { + && VN_IS(m_ds.m_unlinkedScopep, CellArrayRef)) { refp->dotted(dotted.substr(0, pos)); newp = refp; } else { newp = new AstUnlinkedRef(nodep->fileline(), VN_CAST(refp, VarXRef), refp->name(), - m_ds.m_unlinkedScope->unlinkFrBack()); - m_ds.m_unlinkedScope = nullptr; + m_ds.m_unlinkedScopep->unlinkFrBack()); + m_ds.m_unlinkedScopep = nullptr; m_ds.m_unresolved = false; } } else { @@ -2439,12 +2433,12 @@ private: m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotp = nullptr; } else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) { - if (m_ds.m_unresolved && m_ds.m_unlinkedScope) { + if (m_ds.m_unresolved && m_ds.m_unlinkedScopep) { AstNodeFTaskRef* newftaskp = nodep->cloneTree(false); newftaskp->dotted(m_ds.m_dotText); AstNode* newp = new AstUnlinkedRef(nodep->fileline(), newftaskp, nodep->name(), - m_ds.m_unlinkedScope->unlinkFrBack()); - m_ds.m_unlinkedScope = nullptr; + m_ds.m_unlinkedScopep->unlinkFrBack()); + m_ds.m_unlinkedScopep = nullptr; m_ds.m_unresolved = false; nodep->replaceWith(newp); return; diff --git a/src/V3Param.cpp b/src/V3Param.cpp index bc21b11f8..7c384c685 100644 --- a/src/V3Param.cpp +++ b/src/V3Param.cpp @@ -892,10 +892,13 @@ void ParamVisitor::visitCell(AstCell* nodep, const string& hierName) { AstIfaceRefDType* pinIrefp = nullptr; AstNode* exprp = pinp->exprp(); - if (exprp && VN_IS(exprp, VarRef) && VN_CAST(exprp, VarRef)->varp() - && VN_CAST(exprp, VarRef)->varp()->subDTypep() - && VN_IS(VN_CAST(exprp, VarRef)->varp()->subDTypep(), IfaceRefDType)) { - pinIrefp = VN_CAST(VN_CAST(exprp, VarRef)->varp()->subDTypep(), IfaceRefDType); + AstVar* varp + = (exprp && VN_IS(exprp, VarRef)) ? VN_CAST(exprp, VarRef)->varp() : nullptr; + if (varp && varp->subDTypep() && VN_IS(varp->subDTypep(), IfaceRefDType)) { + pinIrefp = VN_CAST(varp->subDTypep(), IfaceRefDType); + } else if (varp && varp->subDTypep() && arraySubDTypep(varp->subDTypep()) + && VN_CAST(arraySubDTypep(varp->subDTypep()), IfaceRefDType)) { + pinIrefp = VN_CAST(arraySubDTypep(varp->subDTypep()), IfaceRefDType); } else if (exprp && exprp->op1p() && VN_IS(exprp->op1p(), VarRef) && VN_CAST(exprp->op1p(), VarRef)->varp() && VN_CAST(exprp->op1p(), VarRef)->varp()->subDTypep() @@ -906,13 +909,6 @@ void ParamVisitor::visitCell(AstCell* nodep, const string& hierName) { pinIrefp = VN_CAST( arraySubDTypep(VN_CAST(exprp->op1p(), VarRef)->varp()->subDTypep()), IfaceRefDType); - } else if (exprp && VN_IS(exprp, VarRef) && VN_CAST(exprp, VarRef)->varp() - && VN_CAST(exprp, VarRef)->varp()->subDTypep() - && arraySubDTypep(VN_CAST(exprp, VarRef)->varp()->subDTypep()) - && VN_CAST(arraySubDTypep(VN_CAST(exprp, VarRef)->varp()->subDTypep()), - IfaceRefDType)) { - pinIrefp = VN_CAST(arraySubDTypep(VN_CAST(exprp, VarRef)->varp()->subDTypep()), - IfaceRefDType); } UINFO(9, " portIfaceRef " << portIrefp << endl);