Internals: Rename AstPackageRef as may point to class.

This commit is contained in:
Wilson Snyder 2020-07-11 10:29:15 -04:00
parent 1194dbf19c
commit bb8899f307
6 changed files with 33 additions and 30 deletions

View File

@ -1493,12 +1493,12 @@ void AstParseRef::dump(std::ostream& str) const {
this->AstNode::dump(str); this->AstNode::dump(str);
str << " [" << expect().ascii() << "]"; str << " [" << expect().ascii() << "]";
} }
void AstPackageRef::dump(std::ostream& str) const { void AstClassOrPackageRef::dump(std::ostream& str) const {
this->AstNode::dump(str); this->AstNode::dump(str);
if (packagep()) { str << " pkg=" << nodeAddr(packagep()); } if (classOrPackagep()) { str << " cpkg=" << nodeAddr(classOrPackagep()); }
str << " -> "; str << " -> ";
if (packagep()) { if (classOrPackagep()) {
packagep()->dump(str); classOrPackagep()->dump(str);
} else { } else {
str << "UNLINKED"; str << "UNLINKED";
} }

View File

@ -2891,29 +2891,33 @@ public:
void ftaskrefp(AstNodeFTaskRef* nodep) { setNOp2p(nodep); } // op2 = Function/task reference void ftaskrefp(AstNodeFTaskRef* nodep) { setNOp2p(nodep); } // op2 = Function/task reference
}; };
class AstPackageRef : public AstNode { class AstClassOrPackageRef : public AstNode {
private: private:
AstPackage* m_packagep; // Package hierarchy AstNode* m_classOrPackagep; // Package hierarchy
public: public:
AstPackageRef(FileLine* fl, AstPackage* packagep) AstClassOrPackageRef(FileLine* fl, AstNode* classOrPackagep)
: ASTGEN_SUPER(fl) : ASTGEN_SUPER(fl)
, m_packagep(packagep) {} , m_classOrPackagep(classOrPackagep) {}
ASTNODE_NODE_FUNCS(PackageRef) ASTNODE_NODE_FUNCS(ClassOrPackageRef)
// METHODS // METHODS
virtual const char* broken() const { virtual const char* broken() const {
BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); BROKEN_RTN(!m_classOrPackagep || !m_classOrPackagep->brokeExists());
return NULL; return NULL;
} }
virtual void cloneRelink() { 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 { virtual bool same(const AstNode* samep) const {
return (m_packagep == static_cast<const AstPackageRef*>(samep)->m_packagep); return (m_classOrPackagep
== static_cast<const AstClassOrPackageRef*>(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; virtual void dump(std::ostream& str = std::cout) const;
AstPackage* packagep() const { return m_packagep; } AstNode* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstPackage* nodep) { m_packagep = nodep; } AstPackage* packagep() const { return VN_CAST(classOrPackagep(), Package); }
void classOrPackagep(AstNode* nodep) { m_classOrPackagep = nodep; }
}; };
class AstDot : public AstNode { class AstDot : public AstNode {
@ -2931,7 +2935,7 @@ public:
// For parser, make only if non-null package // For parser, make only if non-null package
static AstNode* newIfPkg(FileLine* fl, AstPackage* packagep, AstNode* rhsp) { static AstNode* newIfPkg(FileLine* fl, AstPackage* packagep, AstNode* rhsp) {
if (!packagep) return 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 void dump(std::ostream& str) const;
virtual string emitVerilog() { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() { V3ERROR_NA_RETURN(""); }

View File

@ -25,7 +25,7 @@
// The following nodes have package pointers and are cleaned up here: // The following nodes have package pointers and are cleaned up here:
// AstRefDType, AstEnumItemRef, AstNodeVarRef, AstNodeFTask // AstRefDType, AstEnumItemRef, AstNodeVarRef, AstNodeFTask
// These have packagep but will not exist at this stage // 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 // Note on packagep: After the V3Scope/V3LinkDotScoped stage, package links
// are no longer used, but their presence prevents us from removing empty // are no longer used, but their presence prevents us from removing empty

View File

@ -1951,7 +1951,7 @@ private:
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
// m_ds.m_dotText communicates the cell prefix between stages // 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 // if (!start) { nodep->lhsp()->v3error("Package reference may not be embedded in
// dotted reference"); m_ds.m_dotErr=true; } // dotted reference"); m_ds.m_dotErr=true; }
m_ds.m_dotPos = DP_PACKAGE; m_ds.m_dotPos = DP_PACKAGE;
@ -2047,9 +2047,9 @@ private:
expectWhat = "scope/variable"; expectWhat = "scope/variable";
allowScope = true; allowScope = true;
allowVar = 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"); "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"); UASSERT_OBJ(packagep, m_ds.m_dotp->lhsp(), "Bad package link");
m_ds.m_dotSymp = m_statep->getNodeSym(packagep); m_ds.m_dotSymp = m_statep->getNodeSym(packagep);
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
@ -2399,11 +2399,11 @@ private:
if (nodep->user3SetOnce()) return; if (nodep->user3SetOnce()) return;
UINFO(8, " " << nodep << endl); UINFO(8, " " << nodep << endl);
if (m_ds.m_dotp && m_ds.m_dotPos == DP_PACKAGE) { 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"); "Bad package link");
UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep(), m_ds.m_dotp->lhsp(), UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep(),
"Bad package link"); m_ds.m_dotp->lhsp(), "Bad package link");
nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep()); nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep());
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
m_ds.m_dotp = NULL; m_ds.m_dotp = NULL;
} else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) { } else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) {
@ -2668,11 +2668,11 @@ private:
// Resolve its reference // Resolve its reference
if (nodep->user3SetOnce()) return; if (nodep->user3SetOnce()) return;
if (m_ds.m_dotp && m_ds.m_dotPos == DP_PACKAGE) { 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"); "Bad package link");
UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep(), m_ds.m_dotp->lhsp(), UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep(),
"Bad package link"); m_ds.m_dotp->lhsp(), "Bad package link");
nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), PackageRef)->packagep()); nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep());
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
m_ds.m_dotp = NULL; m_ds.m_dotp = NULL;
} else { } else {

View File

@ -139,7 +139,6 @@ struct V3ParseBisonYYSType {
AstSenItem* senitemp; AstSenItem* senitemp;
AstNodeVarRef* varnodep; AstNodeVarRef* varnodep;
AstPackage* packagep; AstPackage* packagep;
AstPackageRef* packagerefp;
AstParseRef* parserefp; AstParseRef* parserefp;
AstPatMember* patmemberp; AstPatMember* patmemberp;
AstPattern* patternp; AstPattern* patternp;

View File

@ -2526,7 +2526,7 @@ delay_control<nodep>: //== IEEE: delay_control
delay_value<nodep>: // ==IEEE:delay_value delay_value<nodep>: // ==IEEE:delay_value
// // IEEE: ps_identifier // // IEEE: ps_identifier
packageClassScopeE varRefBase { $$ = $2; $2->packagep($1); } packageClassScopeE varRefBase { $$ = AstDot::newIfPkg($<fl>2, CAST_PACKAGE_CLASS($1), $2); }
| yaINTNUM { $$ = new AstConst($<fl>1, *$1); } | yaINTNUM { $$ = new AstConst($<fl>1, *$1); }
| yaFLOATNUM { $$ = new AstConst($<fl>1, AstConst::RealDouble(), $1); } | yaFLOATNUM { $$ = new AstConst($<fl>1, AstConst::RealDouble(), $1); }
| timeNumAdjusted { $$ = $1; } | timeNumAdjusted { $$ = $1; }