diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index d5ee54c8d..597ae7585 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -1493,12 +1493,12 @@ void AstParseRef::dump(std::ostream& str) const { this->AstNode::dump(str); str << " [" << expect().ascii() << "]"; } -void AstPackageRef::dump(std::ostream& str) const { +void AstClassOrPackageRef::dump(std::ostream& str) const { this->AstNode::dump(str); - if (packagep()) { str << " pkg=" << nodeAddr(packagep()); } + if (classOrPackagep()) { str << " cpkg=" << nodeAddr(classOrPackagep()); } str << " -> "; - if (packagep()) { - packagep()->dump(str); + if (classOrPackagep()) { + classOrPackagep()->dump(str); } else { str << "UNLINKED"; } diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index bb055fb6c..30c5298c9 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -2891,29 +2891,33 @@ public: void ftaskrefp(AstNodeFTaskRef* nodep) { setNOp2p(nodep); } // op2 = Function/task reference }; -class AstPackageRef : public AstNode { +class AstClassOrPackageRef : public AstNode { private: - AstPackage* m_packagep; // Package hierarchy + AstNode* m_classOrPackagep; // Package hierarchy public: - AstPackageRef(FileLine* fl, AstPackage* packagep) + AstClassOrPackageRef(FileLine* fl, AstNode* classOrPackagep) : ASTGEN_SUPER(fl) - , m_packagep(packagep) {} - ASTNODE_NODE_FUNCS(PackageRef) + , m_classOrPackagep(classOrPackagep) {} + ASTNODE_NODE_FUNCS(ClassOrPackageRef) // METHODS virtual const char* broken() const { - BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); + BROKEN_RTN(!m_classOrPackagep || !m_classOrPackagep->brokeExists()); return NULL; } virtual void cloneRelink() { - if (m_packagep && m_packagep->clonep()) { m_packagep = m_packagep->clonep(); } + if (m_classOrPackagep && m_classOrPackagep->clonep()) { + m_classOrPackagep = m_classOrPackagep->clonep(); + } } virtual bool same(const AstNode* samep) const { - return (m_packagep == static_cast(samep)->m_packagep); + return (m_classOrPackagep + == static_cast(samep)->m_classOrPackagep); } - virtual V3Hash sameHash() const { return V3Hash(m_packagep); } + virtual V3Hash sameHash() const { return V3Hash(m_classOrPackagep); } virtual void dump(std::ostream& str = std::cout) const; - AstPackage* packagep() const { return m_packagep; } - void packagep(AstPackage* nodep) { m_packagep = nodep; } + AstNode* classOrPackagep() const { return m_classOrPackagep; } + AstPackage* packagep() const { return VN_CAST(classOrPackagep(), Package); } + void classOrPackagep(AstNode* nodep) { m_classOrPackagep = nodep; } }; class AstDot : public AstNode { @@ -2931,7 +2935,7 @@ public: // For parser, make only if non-null package static AstNode* newIfPkg(FileLine* fl, AstPackage* packagep, AstNode* rhsp) { if (!packagep) return rhsp; - return new AstDot(fl, true, new AstPackageRef(fl, packagep), rhsp); + return new AstDot(fl, true, new AstClassOrPackageRef(fl, packagep), rhsp); } virtual void dump(std::ostream& str) const; virtual string emitVerilog() { V3ERROR_NA_RETURN(""); } diff --git a/src/V3Dead.cpp b/src/V3Dead.cpp index 9739e89da..7a0add24c 100644 --- a/src/V3Dead.cpp +++ b/src/V3Dead.cpp @@ -25,7 +25,7 @@ // The following nodes have package pointers and are cleaned up here: // AstRefDType, AstEnumItemRef, AstNodeVarRef, AstNodeFTask // These have packagep but will not exist at this stage -// AstPackageImport, AstDot, AstPackageRef +// AstPackageImport, AstDot, AstClassOrPackageRef // // Note on packagep: After the V3Scope/V3LinkDotScoped stage, package links // are no longer used, but their presence prevents us from removing empty diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index 99bd1fcb2..fe6b40018 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -1951,7 +1951,7 @@ private: m_ds.m_dotPos = DP_SCOPE; // m_ds.m_dotText communicates the cell prefix between stages - if (VN_IS(nodep->lhsp(), PackageRef)) { + if (VN_IS(nodep->lhsp(), ClassOrPackageRef)) { // if (!start) { nodep->lhsp()->v3error("Package reference may not be embedded in // dotted reference"); m_ds.m_dotErr=true; } m_ds.m_dotPos = DP_PACKAGE; @@ -2047,9 +2047,9 @@ private: expectWhat = "scope/variable"; allowScope = true; allowVar = true; - UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), PackageRef), m_ds.m_dotp->lhsp(), + UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), ClassOrPackageRef), m_ds.m_dotp->lhsp(), "Bad package link"); - packagep = VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep(); + packagep = VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep(); UASSERT_OBJ(packagep, m_ds.m_dotp->lhsp(), "Bad package link"); m_ds.m_dotSymp = m_statep->getNodeSym(packagep); m_ds.m_dotPos = DP_SCOPE; @@ -2399,11 +2399,11 @@ private: if (nodep->user3SetOnce()) return; UINFO(8, " " << nodep << endl); if (m_ds.m_dotp && m_ds.m_dotPos == DP_PACKAGE) { - UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), PackageRef), m_ds.m_dotp->lhsp(), + UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), ClassOrPackageRef), m_ds.m_dotp->lhsp(), "Bad package link"); - UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep(), m_ds.m_dotp->lhsp(), - "Bad package link"); - nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep()); + UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep(), + m_ds.m_dotp->lhsp(), "Bad package link"); + nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep()); m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotp = NULL; } else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) { @@ -2668,11 +2668,11 @@ private: // Resolve its reference if (nodep->user3SetOnce()) return; if (m_ds.m_dotp && m_ds.m_dotPos == DP_PACKAGE) { - UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), PackageRef), m_ds.m_dotp->lhsp(), + UASSERT_OBJ(VN_IS(m_ds.m_dotp->lhsp(), ClassOrPackageRef), m_ds.m_dotp->lhsp(), "Bad package link"); - UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep(), m_ds.m_dotp->lhsp(), - "Bad package link"); - nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep()); + UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep(), + m_ds.m_dotp->lhsp(), "Bad package link"); + nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep()); m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotp = NULL; } else { diff --git a/src/V3ParseImp.h b/src/V3ParseImp.h index 4c904b2cb..d9d5ae2f1 100644 --- a/src/V3ParseImp.h +++ b/src/V3ParseImp.h @@ -139,7 +139,6 @@ struct V3ParseBisonYYSType { AstSenItem* senitemp; AstNodeVarRef* varnodep; AstPackage* packagep; - AstPackageRef* packagerefp; AstParseRef* parserefp; AstPatMember* patmemberp; AstPattern* patternp; diff --git a/src/verilog.y b/src/verilog.y index fa324cdfa..455f17dce 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -2526,7 +2526,7 @@ delay_control: //== IEEE: delay_control delay_value: // ==IEEE:delay_value // // IEEE: ps_identifier - packageClassScopeE varRefBase { $$ = $2; $2->packagep($1); } + packageClassScopeE varRefBase { $$ = AstDot::newIfPkg($2, CAST_PACKAGE_CLASS($1), $2); } | yaINTNUM { $$ = new AstConst($1, *$1); } | yaFLOATNUM { $$ = new AstConst($1, AstConst::RealDouble(), $1); } | timeNumAdjusted { $$ = $1; }