Internals: Rename packagep(). No functional change.

This commit is contained in:
Wilson Snyder 2020-11-24 21:56:03 -05:00
parent b0cb43b2f2
commit e1c45440fc
14 changed files with 126 additions and 123 deletions

View File

@ -2298,7 +2298,7 @@ private:
VAccess m_access; // Left hand side assignment VAccess m_access; // Left hand side assignment
AstVar* m_varp; // [AfterLink] Pointer to variable itself AstVar* m_varp; // [AfterLink] Pointer to variable itself
AstVarScope* m_varScopep = nullptr; // Varscope for hierarchy AstVarScope* m_varScopep = nullptr; // Varscope for hierarchy
AstNodeModule* m_packagep = nullptr; // Package hierarchy AstNodeModule* m_classOrPackagep = nullptr; // Package hierarchy
string m_name; // Name of variable string m_name; // Name of variable
string m_hiername; // Scope converted into name-> for emitting string m_hiername; // Scope converted into name-> for emitting
bool m_hierThis = false; // Hiername points to "this" function bool m_hierThis = false; // Hiername points to "this" function
@ -2336,8 +2336,8 @@ public:
void hiername(const string& hn) { m_hiername = hn; } void hiername(const string& hn) { m_hiername = hn; }
bool hierThis() const { return m_hierThis; } bool hierThis() const { return m_hierThis; }
void hierThis(bool flag) { m_hierThis = flag; } void hierThis(bool flag) { m_hierThis = flag; }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; } void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
// Know no children, and hot function, so skip iterator for speed // Know no children, and hot function, so skip iterator for speed
// See checkTreeIter also that asserts no children // See checkTreeIter also that asserts no children
// cppcheck-suppress functionConst // cppcheck-suppress functionConst
@ -2723,8 +2723,8 @@ public:
void addFvarp(AstNode* nodep) { addNOp1p(nodep); } void addFvarp(AstNode* nodep) { addNOp1p(nodep); }
bool isFunction() const { return fvarp() != nullptr; } bool isFunction() const { return fvarp() != nullptr; }
// op2 = Class/package scope // op2 = Class/package scope
AstNode* packagep() const { return op2p(); } AstNode* classOrPackagep() const { return op2p(); }
void packagep(AstNode* nodep) { setNOp2p(nodep); } void classOrPackagep(AstNode* nodep) { setNOp2p(nodep); }
// op3 = Statements/Ports/Vars // op3 = Statements/Ports/Vars
AstNode* stmtsp() const { return op3p(); } // op3 = List of statements AstNode* stmtsp() const { return op3p(); } // op3 = List of statements
void addStmtsp(AstNode* nodep) { addNOp3p(nodep); } void addStmtsp(AstNode* nodep) { addNOp3p(nodep); }
@ -2774,7 +2774,7 @@ class AstNodeFTaskRef VL_NOT_FINAL : public AstNodeStmt {
// Functions are not statements, while tasks are. AstNodeStmt needs isStatement() to deal. // Functions are not statements, while tasks are. AstNodeStmt needs isStatement() to deal.
private: private:
AstNodeFTask* m_taskp = nullptr; // [AfterLink] Pointer to task referenced AstNodeFTask* m_taskp = nullptr; // [AfterLink] Pointer to task referenced
AstNodeModule* m_packagep = nullptr; // Package hierarchy AstNodeModule* m_classOrPackagep = nullptr; // Package hierarchy
string m_name; // Name of variable string m_name; // Name of variable
string m_dotted; // Dotted part of scope the name()ed task/func is under or "" string m_dotted; // Dotted part of scope the name()ed task/func is under or ""
string m_inlinedDots; // Dotted hierarchy flattened out string m_inlinedDots; // Dotted hierarchy flattened out
@ -2808,8 +2808,8 @@ public:
void taskp(AstNodeFTask* taskp) { m_taskp = taskp; } void taskp(AstNodeFTask* taskp) { m_taskp = taskp; }
virtual void name(const string& name) override { m_name = name; } virtual void name(const string& name) override { m_name = name; }
void dotted(const string& name) { m_dotted = name; } void dotted(const string& name) { m_dotted = name; }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; } void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
bool pli() const { return m_pli; } bool pli() const { return m_pli; }
void pli(bool flag) { m_pli = flag; } void pli(bool flag) { m_pli = flag; }
// op1 = namep // op1 = namep
@ -2994,7 +2994,7 @@ inline VNumRange AstNodeArrayDType::declRange() const {
inline const char* AstNodeFTaskRef::broken() const { inline const char* AstNodeFTaskRef::broken() const {
BROKEN_RTN(m_taskp && !m_taskp->brokeExists()); BROKEN_RTN(m_taskp && !m_taskp->brokeExists());
BROKEN_RTN(m_packagep && !m_packagep->brokeExists()); BROKEN_RTN(m_classOrPackagep && !m_classOrPackagep->brokeExists());
return nullptr; return nullptr;
} }

View File

@ -1528,7 +1528,7 @@ void AstVarScope::dump(std::ostream& str) const {
} }
void AstNodeVarRef::dump(std::ostream& str) const { void AstNodeVarRef::dump(std::ostream& str) const {
this->AstNodeMath::dump(str); this->AstNodeMath::dump(str);
if (packagep()) str << " pkg=" << nodeAddr(packagep()); if (classOrPackagep()) str << " pkg=" << nodeAddr(classOrPackagep());
str << " " << access().arrow() << " "; str << " " << access().arrow() << " ";
} }
void AstVarXRef::dump(std::ostream& str) const { void AstVarXRef::dump(std::ostream& str) const {
@ -1620,7 +1620,7 @@ void AstActive::dump(std::ostream& str) const {
} }
void AstNodeFTaskRef::dump(std::ostream& str) const { void AstNodeFTaskRef::dump(std::ostream& str) const {
this->AstNodeStmt::dump(str); this->AstNodeStmt::dump(str);
if (packagep()) { str << " pkg=" << nodeAddr(packagep()); } if (classOrPackagep()) str << " pkg=" << nodeAddr(classOrPackagep());
str << " -> "; str << " -> ";
if (dotted() != "") { str << ".=" << dotted() << " "; } if (dotted() != "") { str << ".=" << dotted() << " "; }
if (taskp()) { if (taskp()) {

View File

@ -303,7 +303,7 @@ class AstClass final : public AstNodeModule {
typedef std::map<const string, AstNode*> MemberNameMap; typedef std::map<const string, AstNode*> MemberNameMap;
// MEMBERS // MEMBERS
MemberNameMap m_members; // Members or method children MemberNameMap m_members; // Members or method children
AstClassPackage* m_packagep = nullptr; // Class package this is under AstClassPackage* m_classOrPackagep = nullptr; // Class package this is under
bool m_virtual = false; // Virtual class bool m_virtual = false; // Virtual class
bool m_extended = false; // Is extension or extended by other classes bool m_extended = false; // Is extension or extended by other classes
void insertCache(AstNode* nodep); void insertCache(AstNode* nodep);
@ -318,12 +318,12 @@ public:
virtual void dump(std::ostream& str) const override; virtual void dump(std::ostream& str) const override;
virtual const char* broken() const override { virtual const char* broken() const override {
BROKEN_BASE_RTN(AstNodeModule::broken()); BROKEN_BASE_RTN(AstNodeModule::broken());
BROKEN_RTN(m_packagep && !m_packagep->brokeExists()); BROKEN_RTN(m_classOrPackagep && !m_classOrPackagep->brokeExists());
return nullptr; return nullptr;
} }
// op1/op2/op3 in AstNodeModule // op1/op2/op3 in AstNodeModule
AstClassPackage* packagep() const { return m_packagep; } AstClassPackage* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstClassPackage* classpackagep) { m_packagep = classpackagep; } void classOrPackagep(AstClassPackage* classpackagep) { m_classOrPackagep = classpackagep; }
AstNode* membersp() const { return stmtsp(); } // op2 = List of statements AstNode* membersp() const { return stmtsp(); } // op2 = List of statements
void addMembersp(AstNode* nodep) { void addMembersp(AstNode* nodep) {
insertCache(nodep); insertCache(nodep);
@ -990,7 +990,7 @@ class AstClassRefDType final : public AstNodeDType {
// Reference to a class // Reference to a class
private: private:
AstClass* m_classp; // data type pointed to, BELOW the AstTypedef AstClass* m_classp; // data type pointed to, BELOW the AstTypedef
AstNodeModule* m_packagep = nullptr; // Package hierarchy AstNodeModule* m_classOrPackagep = nullptr; // Package hierarchy
public: public:
AstClassRefDType(FileLine* fl, AstClass* classp) AstClassRefDType(FileLine* fl, AstClass* classp)
: ASTGEN_SUPER(fl) : ASTGEN_SUPER(fl)
@ -1008,13 +1008,13 @@ public:
} }
virtual bool same(const AstNode* samep) const override { virtual bool same(const AstNode* samep) const override {
const AstClassRefDType* asamep = static_cast<const AstClassRefDType*>(samep); const AstClassRefDType* asamep = static_cast<const AstClassRefDType*>(samep);
return (m_classp == asamep->m_classp && m_packagep == asamep->m_packagep); return (m_classp == asamep->m_classp && m_classOrPackagep == asamep->m_classOrPackagep);
} }
virtual bool similarDType(AstNodeDType* samep) const override { virtual bool similarDType(AstNodeDType* samep) const override {
return this == samep || same(samep); return this == samep || same(samep);
} }
virtual V3Hash sameHash() const override { virtual V3Hash sameHash() const override {
return V3Hash(V3Hash(m_classp), V3Hash(m_packagep)); return V3Hash(V3Hash(m_classp), V3Hash(m_classOrPackagep));
} }
virtual void dump(std::ostream& str = std::cout) const override; virtual void dump(std::ostream& str = std::cout) const override;
virtual void dumpSmall(std::ostream& str) const override; virtual void dumpSmall(std::ostream& str) const override;
@ -1028,8 +1028,8 @@ public:
virtual AstNodeDType* virtRefDTypep() const override { return nullptr; } virtual AstNodeDType* virtRefDTypep() const override { return nullptr; }
virtual void virtRefDTypep(AstNodeDType* nodep) override {} virtual void virtRefDTypep(AstNodeDType* nodep) override {}
virtual AstNodeDType* subDTypep() const override { return nullptr; } virtual AstNodeDType* subDTypep() const override { return nullptr; }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; } void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
AstClass* classp() const { return m_classp; } AstClass* classp() const { return m_classp; }
void classp(AstClass* nodep) { m_classp = nodep; } void classp(AstClass* nodep) { m_classp = nodep; }
}; };
@ -1167,7 +1167,7 @@ private:
// Post-width typedefs are removed and point to type directly // Post-width typedefs are removed and point to type directly
AstNodeDType* m_refDTypep = nullptr; // data type pointed to, BELOW the AstTypedef AstNodeDType* m_refDTypep = nullptr; // data type pointed to, BELOW the AstTypedef
string m_name; // Name of an AstTypedef string m_name; // Name of an AstTypedef
AstNodeModule* m_packagep = nullptr; // Package hierarchy AstNodeModule* m_classOrPackagep = nullptr; // Package hierarchy
public: public:
AstRefDType(FileLine* fl, const string& name) AstRefDType(FileLine* fl, const string& name)
: ASTGEN_SUPER(fl) : ASTGEN_SUPER(fl)
@ -1197,13 +1197,13 @@ public:
virtual bool same(const AstNode* samep) const override { virtual bool same(const AstNode* samep) const override {
const AstRefDType* asamep = static_cast<const AstRefDType*>(samep); const AstRefDType* asamep = static_cast<const AstRefDType*>(samep);
return (m_typedefp == asamep->m_typedefp && m_refDTypep == asamep->m_refDTypep return (m_typedefp == asamep->m_typedefp && m_refDTypep == asamep->m_refDTypep
&& m_name == asamep->m_name && m_packagep == asamep->m_packagep); && m_name == asamep->m_name && m_classOrPackagep == asamep->m_classOrPackagep);
} }
virtual bool similarDType(AstNodeDType* samep) const override { virtual bool similarDType(AstNodeDType* samep) const override {
return skipRefp()->similarDType(samep->skipRefp()); return skipRefp()->similarDType(samep->skipRefp());
} }
virtual V3Hash sameHash() const override { virtual V3Hash sameHash() const override {
return V3Hash(V3Hash(m_typedefp), V3Hash(m_packagep)); return V3Hash(V3Hash(m_typedefp), V3Hash(m_classOrPackagep));
} }
virtual void dump(std::ostream& str = std::cout) const override; virtual void dump(std::ostream& str = std::cout) const override;
virtual string name() const override { return m_name; } virtual string name() const override { return m_name; }
@ -1253,8 +1253,8 @@ public:
void refDTypep(AstNodeDType* nodep) { m_refDTypep = nodep; } void refDTypep(AstNodeDType* nodep) { m_refDTypep = nodep; }
virtual AstNodeDType* virtRefDTypep() const override { return refDTypep(); } virtual AstNodeDType* virtRefDTypep() const override { return refDTypep(); }
virtual void virtRefDTypep(AstNodeDType* nodep) override { refDTypep(nodep); } virtual void virtRefDTypep(AstNodeDType* nodep) override { refDTypep(nodep); }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; } void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
AstNode* typeofp() const { return op2p(); } AstNode* typeofp() const { return op2p(); }
AstNode* classOrPackageOpp() const { return op3p(); } AstNode* classOrPackageOpp() const { return op3p(); }
AstPin* paramsp() const { return VN_CAST(op4p(), Pin); } AstPin* paramsp() const { return VN_CAST(op4p(), Pin); }
@ -1395,12 +1395,12 @@ public:
class AstEnumItemRef final : public AstNodeMath { class AstEnumItemRef final : public AstNodeMath {
private: private:
AstEnumItem* m_itemp; // [AfterLink] Pointer to item AstEnumItem* m_itemp; // [AfterLink] Pointer to item
AstNodeModule* m_packagep; // Package hierarchy AstNodeModule* m_classOrPackagep; // Package hierarchy
public: public:
AstEnumItemRef(FileLine* fl, AstEnumItem* itemp, AstNodeModule* packagep) AstEnumItemRef(FileLine* fl, AstEnumItem* itemp, AstNodeModule* classOrPackagep)
: ASTGEN_SUPER(fl) : ASTGEN_SUPER(fl)
, m_itemp{itemp} , m_itemp{itemp}
, m_packagep{packagep} { , m_classOrPackagep{classOrPackagep} {
dtypeFrom(m_itemp); dtypeFrom(m_itemp);
} }
ASTNODE_NODE_FUNCS(EnumItemRef) ASTNODE_NODE_FUNCS(EnumItemRef)
@ -1422,8 +1422,8 @@ public:
virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); }
virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); }
virtual bool cleanOut() const override { return true; } virtual bool cleanOut() const override { return true; }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; } void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
}; };
class AstEnumDType final : public AstNodeDType { class AstEnumDType final : public AstNodeDType {

View File

@ -84,7 +84,7 @@ class CUseDTypeVisitor final : public AstNVisitor {
if (nodep->user2SetOnce()) return; // Process once if (nodep->user2SetOnce()) return; // Process once
if (!m_impOnly) m_stater.newUse(nodep, VUseType::INT_FWD_CLASS, nodep->classp()->name()); if (!m_impOnly) m_stater.newUse(nodep, VUseType::INT_FWD_CLASS, nodep->classp()->name());
// No class.h, it's inside the class package's h file // No class.h, it's inside the class package's h file
m_stater.newUse(nodep, VUseType::IMP_INCLUDE, nodep->classp()->packagep()->name()); m_stater.newUse(nodep, VUseType::IMP_INCLUDE, nodep->classp()->classOrPackagep()->name());
// Need to include extends() when we implement, but no need for pointers to know // Need to include extends() when we implement, but no need for pointers to know
VL_RESTORER(m_impOnly); VL_RESTORER(m_impOnly);
{ {

View File

@ -56,7 +56,7 @@ private:
// Note origName is the same as the class origName so errors look correct // Note origName is the same as the class origName so errors look correct
AstClassPackage* packagep = new AstClassPackage(nodep->fileline(), nodep->origName()); AstClassPackage* packagep = new AstClassPackage(nodep->fileline(), nodep->origName());
packagep->name(nodep->name() + "__Vclpkg"); packagep->name(nodep->name() + "__Vclpkg");
nodep->packagep(packagep); nodep->classOrPackagep(packagep);
packagep->classp(nodep); packagep->classp(nodep);
v3Global.rootp()->addModulep(packagep); v3Global.rootp()->addModulep(packagep);
// Add package to hierarchy // Add package to hierarchy

View File

@ -107,7 +107,7 @@ private:
if (AstNode* subnodep = nodep->getChildDTypep()) subnodep->user1Inc(); if (AstNode* subnodep = nodep->getChildDTypep()) subnodep->user1Inc();
} }
void checkVarRef(AstNodeVarRef* nodep) { void checkVarRef(AstNodeVarRef* nodep) {
if (nodep->packagep() && m_elimCells) { nodep->packagep(nullptr); } if (nodep->classOrPackagep() && m_elimCells) nodep->classOrPackagep(nullptr);
} }
void checkDType(AstNodeDType* nodep) { void checkDType(AstNodeDType* nodep) {
if (!nodep->generic() // Don't remove generic types if (!nodep->generic() // Don't remove generic types
@ -130,7 +130,7 @@ private:
checkAll(nodep); checkAll(nodep);
if (AstClass* classp = VN_CAST(nodep, Class)) { if (AstClass* classp = VN_CAST(nodep, Class)) {
if (classp->extendsp()) classp->extendsp()->user1Inc(); if (classp->extendsp()) classp->extendsp()->user1Inc();
if (classp->packagep()) classp->packagep()->user1Inc(); if (classp->classOrPackagep()) classp->classOrPackagep()->user1Inc();
m_classesp.push_back(classp); m_classesp.push_back(classp);
// TODO we don't reclaim dead classes yet - graph implementation instead? // TODO we don't reclaim dead classes yet - graph implementation instead?
classp->user1Inc(); classp->user1Inc();
@ -171,16 +171,16 @@ private:
nodep->varScopep()->varp()->user1Inc(); nodep->varScopep()->varp()->user1Inc();
} }
if (nodep->varp()) nodep->varp()->user1Inc(); if (nodep->varp()) nodep->varp()->user1Inc();
if (nodep->packagep()) nodep->packagep()->user1Inc(); if (nodep->classOrPackagep()) nodep->classOrPackagep()->user1Inc();
} }
virtual void visit(AstNodeFTaskRef* nodep) override { virtual void visit(AstNodeFTaskRef* nodep) override {
iterateChildren(nodep); iterateChildren(nodep);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
if (m_elimCells) { if (m_elimCells) {
nodep->packagep(nullptr); nodep->classOrPackagep(nullptr);
} else { } else {
nodep->packagep()->user1Inc(); nodep->classOrPackagep()->user1Inc();
} }
} }
} }
@ -194,11 +194,11 @@ private:
checkAll(nodep); checkAll(nodep);
UASSERT_OBJ(!(m_elimCells && nodep->typedefp()), nodep, UASSERT_OBJ(!(m_elimCells && nodep->typedefp()), nodep,
"RefDType should point to data type before typedefs removed"); "RefDType should point to data type before typedefs removed");
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
if (m_elimCells) { if (m_elimCells) {
nodep->packagep(nullptr); nodep->classOrPackagep(nullptr);
} else { } else {
nodep->packagep()->user1Inc(); nodep->classOrPackagep()->user1Inc();
} }
} }
} }
@ -206,11 +206,11 @@ private:
iterateChildren(nodep); iterateChildren(nodep);
checkDType(nodep); checkDType(nodep);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
if (m_elimCells) { if (m_elimCells) {
nodep->packagep(nullptr); nodep->classOrPackagep(nullptr);
} else { } else {
nodep->packagep()->user1Inc(); nodep->classOrPackagep()->user1Inc();
} }
} }
if (nodep->classp()) nodep->classp()->user1Inc(); if (nodep->classp()) nodep->classp()->user1Inc();
@ -223,11 +223,11 @@ private:
virtual void visit(AstEnumItemRef* nodep) override { virtual void visit(AstEnumItemRef* nodep) override {
iterateChildren(nodep); iterateChildren(nodep);
checkAll(nodep); checkAll(nodep);
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
if (m_elimCells) { if (m_elimCells) {
nodep->packagep(nullptr); nodep->classOrPackagep(nullptr);
} else { } else {
nodep->packagep()->user1Inc(); nodep->classOrPackagep()->user1Inc();
} }
} }
checkAll(nodep); checkAll(nodep);
@ -372,7 +372,7 @@ private:
if (AstClass* nodep = itr) { // nullptr if deleted earlier if (AstClass* nodep = itr) { // nullptr if deleted earlier
if (nodep->user1() == 0) { if (nodep->user1() == 0) {
if (nodep->extendsp()) nodep->extendsp()->user1Inc(-1); if (nodep->extendsp()) nodep->extendsp()->user1Inc(-1);
if (nodep->packagep()) nodep->packagep()->user1Inc(-1); if (nodep->classOrPackagep()) nodep->classOrPackagep()->user1Inc(-1);
VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep); VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep);
itr = nullptr; itr = nullptr;
retry = true; retry = true;

View File

@ -153,7 +153,7 @@ private:
virtual void visit(AstNodeFTaskRef* nodep) override { virtual void visit(AstNodeFTaskRef* nodep) override {
// Cleanup link until V3LinkDot can correct it // Cleanup link until V3LinkDot can correct it
// MethodCalls not currently supported by inliner, so keep linked // MethodCalls not currently supported by inliner, so keep linked
if (!nodep->packagep() && !VN_IS(nodep, MethodCall)) nodep->taskp(nullptr); if (!nodep->classOrPackagep() && !VN_IS(nodep, MethodCall)) nodep->taskp(nullptr);
iterateChildren(nodep); iterateChildren(nodep);
} }
virtual void visit(AstAlways* nodep) override { virtual void visit(AstAlways* nodep) override {

View File

@ -383,7 +383,7 @@ private:
varrefp->name() + "__BRA__" + index + "__KET__", varrefp->name() + "__BRA__" + index + "__KET__",
"", VAccess::WRITE); "", VAccess::WRITE);
newp->dtypep(nodep->modVarp()->dtypep()); newp->dtypep(nodep->modVarp()->dtypep());
newp->packagep(varrefp->packagep()); newp->classOrPackagep(varrefp->classOrPackagep());
arrselp->addNextHere(newp); arrselp->addNextHere(newp);
VL_DO_DANGLING(arrselp->unlinkFrBack()->deleteTree(), arrselp); VL_DO_DANGLING(arrselp->unlinkFrBack()->deleteTree(), arrselp);
} }

View File

@ -355,7 +355,7 @@ public:
return symp; return symp;
} }
VSymEnt* insertBlock(VSymEnt* abovep, const string& name, AstNode* nodep, VSymEnt* insertBlock(VSymEnt* abovep, const string& name, AstNode* nodep,
AstNodeModule* packagep) { AstNodeModule* classOrPackagep) {
// A fake point in the hierarchy, corresponding to a begin or function/task block // A fake point in the hierarchy, corresponding to a begin or function/task block
// After we remove begins these will go away // After we remove begins these will go away
// Note we fallback to the symbol table of the parent, as we want to find variables there // Note we fallback to the symbol table of the parent, as we want to find variables there
@ -365,7 +365,7 @@ public:
UINFO(9, " INSERTblk se" << cvtToHex(symp) << " above=se" << cvtToHex(abovep) UINFO(9, " INSERTblk se" << cvtToHex(symp) << " above=se" << cvtToHex(abovep)
<< " node=" << nodep << endl); << " node=" << nodep << endl);
symp->parentp(abovep); symp->parentp(abovep);
symp->packagep(packagep); symp->classOrPackagep(classOrPackagep);
symp->fallbackp(abovep); symp->fallbackp(abovep);
nodep->user1p(symp); nodep->user1p(symp);
if (name != "") { checkDuplicate(abovep, nodep, name); } if (name != "") { checkDuplicate(abovep, nodep, name); }
@ -374,14 +374,14 @@ public:
return symp; return symp;
} }
VSymEnt* insertSym(VSymEnt* abovep, const string& name, AstNode* nodep, VSymEnt* insertSym(VSymEnt* abovep, const string& name, AstNode* nodep,
AstNodeModule* packagep) { AstNodeModule* classOrPackagep) {
UASSERT_OBJ(abovep, nodep, "Null symbol table inserting node"); UASSERT_OBJ(abovep, nodep, "Null symbol table inserting node");
VSymEnt* symp = new VSymEnt(&m_syms, nodep); VSymEnt* symp = new VSymEnt(&m_syms, nodep);
UINFO(9, " INSERTsym se" << cvtToHex(symp) << " name='" << name << "' above=se" UINFO(9, " INSERTsym se" << cvtToHex(symp) << " name='" << name << "' above=se"
<< cvtToHex(abovep) << " node=" << nodep << endl); << cvtToHex(abovep) << " node=" << nodep << endl);
// We don't remember the ent associated with each node, because we // We don't remember the ent associated with each node, because we
// need a unique scope entry for each instantiation // need a unique scope entry for each instantiation
symp->packagep(packagep); symp->classOrPackagep(classOrPackagep);
symp->parentp(abovep); symp->parentp(abovep);
symp->fallbackp(abovep); symp->fallbackp(abovep);
nodep->user1p(symp); nodep->user1p(symp);
@ -708,7 +708,7 @@ LinkDotState* LinkDotState::s_errorThisp = nullptr;
class LinkDotFindVisitor final : public AstNVisitor { class LinkDotFindVisitor final : public AstNVisitor {
// STATE // STATE
LinkDotState* m_statep; // State to pass between visitors, including symbol table LinkDotState* m_statep; // State to pass between visitors, including symbol table
AstNodeModule* m_packagep = nullptr; // Current package AstNodeModule* m_classOrPackagep = nullptr; // Current package
VSymEnt* m_modSymp = nullptr; // Symbol Entry for current module VSymEnt* m_modSymp = nullptr; // Symbol Entry for current module
VSymEnt* m_curSymp = nullptr; // Symbol Entry for current table, where to lookup/insert VSymEnt* m_curSymp = nullptr; // Symbol Entry for current table, where to lookup/insert
string m_scope; // Scope text string m_scope; // Scope text
@ -729,7 +729,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
newp->isConstructor(true); newp->isConstructor(true);
nodep->addMembersp(newp); nodep->addMembersp(newp);
UINFO(8, "Made implicit new for " << nodep->name() << ": " << nodep << endl); UINFO(8, "Made implicit new for " << nodep->name() << ": " << nodep << endl);
m_statep->insertBlock(m_curSymp, newp->name(), newp, m_packagep); m_statep->insertBlock(m_curSymp, newp->name(), newp, m_classOrPackagep);
} }
bool isHierBlockWrapper(const string& name) const { bool isHierBlockWrapper(const string& name) const {
@ -777,7 +777,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
bool standalonePkg = !m_modSymp && (m_statep->forPrearray() && VN_IS(nodep, Package)); bool standalonePkg = !m_modSymp && (m_statep->forPrearray() && VN_IS(nodep, Package));
bool doit = (m_modSymp || standalonePkg); bool doit = (m_modSymp || standalonePkg);
VL_RESTORER(m_scope); VL_RESTORER(m_scope);
VL_RESTORER(m_packagep); VL_RESTORER(m_classOrPackagep);
VL_RESTORER(m_modSymp); VL_RESTORER(m_modSymp);
VL_RESTORER(m_curSymp); VL_RESTORER(m_curSymp);
VL_RESTORER(m_paramNum); VL_RESTORER(m_paramNum);
@ -794,7 +794,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
UASSERT_OBJ(!nodep->dead(), nodep, "Module in cell tree mislabeled as dead?"); UASSERT_OBJ(!nodep->dead(), nodep, "Module in cell tree mislabeled as dead?");
VSymEnt* upperSymp = m_curSymp ? m_curSymp : m_statep->rootEntp(); VSymEnt* upperSymp = m_curSymp ? m_curSymp : m_statep->rootEntp();
AstPackage* pkgp = VN_CAST(nodep, Package); AstPackage* pkgp = VN_CAST(nodep, Package);
m_packagep = pkgp; m_classOrPackagep = pkgp;
if (standalonePkg) { if (standalonePkg) {
if (pkgp->isDollarUnit()) { if (pkgp->isDollarUnit()) {
m_curSymp = m_modSymp = m_statep->dunitEntp(); m_curSymp = m_modSymp = m_statep->dunitEntp();
@ -802,7 +802,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
} else { } else {
m_scope = nodep->name(); m_scope = nodep->name();
m_curSymp = m_modSymp = m_statep->insertBlock( m_curSymp = m_modSymp = m_statep->insertBlock(
upperSymp, nodep->name() + "::", nodep, m_packagep); upperSymp, nodep->name() + "::", nodep, m_classOrPackagep);
UINFO(9, "New module scope " << m_curSymp << endl); UINFO(9, "New module scope " << m_curSymp << endl);
} }
} }
@ -826,7 +826,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
m_scope = nodep->name(); m_scope = nodep->name();
VSymEnt* upperSymp = m_curSymp ? m_curSymp : m_statep->rootEntp(); VSymEnt* upperSymp = m_curSymp ? m_curSymp : m_statep->rootEntp();
m_curSymp = m_modSymp m_curSymp = m_modSymp
= m_statep->insertBlock(upperSymp, nodep->name() + "::", nodep, m_packagep); = m_statep->insertBlock(upperSymp, nodep->name() + "::", nodep, m_classOrPackagep);
iterateChildren(nodep); iterateChildren(nodep);
nodep->user4(true); nodep->user4(true);
} else { // !doit } else { // !doit
@ -850,7 +850,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
VSymEnt* upperSymp = m_curSymp; VSymEnt* upperSymp = m_curSymp;
m_scope = m_scope + "." + nodep->name(); m_scope = m_scope + "." + nodep->name();
m_curSymp = m_modSymp m_curSymp = m_modSymp
= m_statep->insertBlock(upperSymp, nodep->name(), nodep, m_packagep); = m_statep->insertBlock(upperSymp, nodep->name(), nodep, m_classOrPackagep);
m_statep->insertMap(m_curSymp, m_scope); m_statep->insertMap(m_curSymp, m_scope);
UINFO(9, "New module scope " << m_curSymp << endl); UINFO(9, "New module scope " << m_curSymp << endl);
// //
@ -965,7 +965,8 @@ class LinkDotFindVisitor final : public AstNVisitor {
{ {
m_blockNum = 0; m_blockNum = 0;
m_blockp = nodep; m_blockp = nodep;
m_curSymp = m_statep->insertBlock(m_curSymp, nodep->name(), nodep, m_packagep); m_curSymp
= m_statep->insertBlock(m_curSymp, nodep->name(), nodep, m_classOrPackagep);
m_curSymp->fallbackp(oldCurSymp); m_curSymp->fallbackp(oldCurSymp);
// Iterate // Iterate
iterateChildren(nodep); iterateChildren(nodep);
@ -982,8 +983,9 @@ class LinkDotFindVisitor final : public AstNVisitor {
VSymEnt* const oldCurSymp = m_curSymp; VSymEnt* const oldCurSymp = m_curSymp;
{ {
// Change to appropriate package if extern declaration (vs definition) // Change to appropriate package if extern declaration (vs definition)
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
AstClassOrPackageRef* cpackagerefp = VN_CAST(nodep->packagep(), ClassOrPackageRef); AstClassOrPackageRef* cpackagerefp
= VN_CAST(nodep->classOrPackagep(), ClassOrPackageRef);
if (!cpackagerefp) { if (!cpackagerefp) {
nodep->v3warn(E_UNSUPPORTED, nodep->v3warn(E_UNSUPPORTED,
"Unsupported: extern function definition with class-in-class"); "Unsupported: extern function definition with class-in-class");
@ -998,14 +1000,14 @@ class LinkDotFindVisitor final : public AstNVisitor {
nodep->unlinkFrBack(); nodep->unlinkFrBack();
classp->addStmtp(nodep); classp->addStmtp(nodep);
nodep->isExternDef(true); // So we check there's a matching extern nodep->isExternDef(true); // So we check there's a matching extern
nodep->packagep()->unlinkFrBack()->deleteTree(); nodep->classOrPackagep()->unlinkFrBack()->deleteTree();
} }
} }
} }
} }
// Create symbol table for the task's vars // Create symbol table for the task's vars
string name = string{nodep->isExternProto() ? "extern " : ""} + nodep->name(); string name = string{nodep->isExternProto() ? "extern " : ""} + nodep->name();
auto pkgp = m_packagep; auto pkgp = m_classOrPackagep;
// Set the class as package for static class methods // Set the class as package for static class methods
if (nodep->lifetime().isStatic() && VN_IS(m_curSymp->nodep(), Class)) { if (nodep->lifetime().isStatic() && VN_IS(m_curSymp->nodep(), Class)) {
pkgp = VN_CAST(m_curSymp->nodep(), Class); pkgp = VN_CAST(m_curSymp->nodep(), Class);
@ -1033,7 +1035,8 @@ class LinkDotFindVisitor final : public AstNVisitor {
newvarp->attrIsolateAssign(nodep->attrIsolateAssign()); newvarp->attrIsolateAssign(nodep->attrIsolateAssign());
nodep->addFvarp(newvarp); nodep->addFvarp(newvarp);
// Explicit insert required, as the var name shadows the upper level's task name // Explicit insert required, as the var name shadows the upper level's task name
m_statep->insertSym(m_curSymp, newvarp->name(), newvarp, nullptr /*packagep*/); m_statep->insertSym(m_curSymp, newvarp->name(), newvarp,
nullptr /*classOrPackagep*/);
} }
m_ftaskp = nodep; m_ftaskp = nodep;
iterateChildren(nodep); iterateChildren(nodep);
@ -1150,11 +1153,13 @@ class LinkDotFindVisitor final : public AstNVisitor {
} }
} }
} }
VSymEnt* insp = m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_packagep); VSymEnt* insp
= m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep);
if (m_statep->forPrimary() && nodep->isGParam()) { if (m_statep->forPrimary() && nodep->isGParam()) {
m_paramNum++; m_paramNum++;
VSymEnt* symp = m_statep->insertSym( VSymEnt* symp
m_curSymp, "__paramNumber" + cvtToStr(m_paramNum), nodep, m_packagep); = m_statep->insertSym(m_curSymp, "__paramNumber" + cvtToStr(m_paramNum),
nodep, m_classOrPackagep);
symp->exported(false); symp->exported(false);
} }
AstIfaceRefDType* ifacerefp = LinkDotState::ifaceRefFromArray(nodep->subDTypep()); AstIfaceRefDType* ifacerefp = LinkDotState::ifaceRefFromArray(nodep->subDTypep());
@ -1169,7 +1174,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
virtual void visit(AstTypedef* nodep) override { virtual void visit(AstTypedef* nodep) override {
UASSERT_OBJ(m_curSymp, nodep, "Typedef not under module/package/$unit"); UASSERT_OBJ(m_curSymp, nodep, "Typedef not under module/package/$unit");
iterateChildren(nodep); iterateChildren(nodep);
m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_packagep); m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep);
} }
virtual void visit(AstTypedefFwd* nodep) override { virtual void visit(AstTypedefFwd* nodep) override {
UASSERT_OBJ(m_curSymp, nodep, "Typedef not under module/package/$unit"); UASSERT_OBJ(m_curSymp, nodep, "Typedef not under module/package/$unit");
@ -1180,7 +1185,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
virtual void visit(AstParamTypeDType* nodep) override { virtual void visit(AstParamTypeDType* nodep) override {
UASSERT_OBJ(m_curSymp, nodep, "Parameter type not under module/package/$unit"); UASSERT_OBJ(m_curSymp, nodep, "Parameter type not under module/package/$unit");
iterateChildren(nodep); iterateChildren(nodep);
m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_packagep); m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep);
} }
virtual void visit(AstCFunc* nodep) override { virtual void visit(AstCFunc* nodep) override {
// For dotted resolution, ignore all AstVars under functions, otherwise shouldn't exist // For dotted resolution, ignore all AstVars under functions, otherwise shouldn't exist
@ -1223,7 +1228,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
ins = true; ins = true;
} }
} }
if (ins) m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_packagep); if (ins) m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep);
} }
virtual void visit(AstPackageImport* nodep) override { virtual void visit(AstPackageImport* nodep) override {
UINFO(4, " Link: " << nodep << endl); UINFO(4, " Link: " << nodep << endl);
@ -1296,7 +1301,7 @@ class LinkDotFindVisitor final : public AstNVisitor {
{ {
++m_modWithNum; ++m_modWithNum;
m_curSymp = m_statep->insertBlock(m_curSymp, "__Vwith" + cvtToStr(m_modWithNum), nodep, m_curSymp = m_statep->insertBlock(m_curSymp, "__Vwith" + cvtToStr(m_modWithNum), nodep,
m_packagep); m_classOrPackagep);
m_curSymp->fallbackp(oldCurSymp); m_curSymp->fallbackp(oldCurSymp);
UASSERT_OBJ(nodep->indexArgRefp(), nodep, "Missing lambda argref"); UASSERT_OBJ(nodep->indexArgRefp(), nodep, "Missing lambda argref");
UASSERT_OBJ(nodep->valueArgRefp(), nodep, "Missing lambda argref"); UASSERT_OBJ(nodep->valueArgRefp(), nodep, "Missing lambda argref");
@ -1427,7 +1432,7 @@ private:
refp->user4(true); refp->user4(true);
VSymEnt* symp = m_statep->insertSym(m_statep->getNodeSym(m_modp), VSymEnt* symp = m_statep->insertSym(m_statep->getNodeSym(m_modp),
"__pinNumber" + cvtToStr(nodep->pinNum()), refp, "__pinNumber" + cvtToStr(nodep->pinNum()), refp,
nullptr /*packagep*/); nullptr /*classOrPackagep*/);
symp->exported(false); symp->exported(false);
} }
// Ports not needed any more // Ports not needed any more
@ -1835,7 +1840,7 @@ private:
modp->addStmtp(newp); modp->addStmtp(newp);
// Link it to signal list, must add the variable under the module; // Link it to signal list, must add the variable under the module;
// current scope might be lower now // current scope might be lower now
m_statep->insertSym(moduleSymp, newp->name(), newp, nullptr /*packagep*/); m_statep->insertSym(moduleSymp, newp->name(), newp, nullptr /*classOrPackagep*/);
} }
} }
AstVar* foundToVarp(const VSymEnt* symp, AstNode* nodep, VAccess access) { AstVar* foundToVarp(const VSymEnt* symp, AstNode* nodep, VAccess access) {
@ -2119,7 +2124,7 @@ private:
bool allowVar = false; bool allowVar = false;
if (m_ds.m_dotPos == DP_PACKAGE) { if (m_ds.m_dotPos == DP_PACKAGE) {
// {package}::{a} // {package}::{a}
AstNodeModule* packagep = nullptr; AstNodeModule* classOrPackagep = nullptr;
expectWhat = "scope/variable"; expectWhat = "scope/variable";
allowScope = true; allowScope = true;
allowVar = true; allowVar = true;
@ -2127,9 +2132,9 @@ private:
"Bad package link"); "Bad package link");
AstClassOrPackageRef* cpackagerefp AstClassOrPackageRef* cpackagerefp
= VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef); = VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef);
packagep = cpackagerefp->classOrPackagep(); classOrPackagep = cpackagerefp->classOrPackagep();
UASSERT_OBJ(packagep, m_ds.m_dotp->lhsp(), "Bad package link"); UASSERT_OBJ(classOrPackagep, m_ds.m_dotp->lhsp(), "Bad package link");
m_ds.m_dotSymp = m_statep->getNodeSym(packagep); m_ds.m_dotSymp = m_statep->getNodeSym(classOrPackagep);
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
} else if (m_ds.m_dotPos == DP_SCOPE) { } else if (m_ds.m_dotPos == DP_SCOPE) {
// {a}.{b}, where {a} maybe a module name // {a}.{b}, where {a} maybe a module name
@ -2246,7 +2251,7 @@ private:
AstVarRef* refp AstVarRef* refp
= new AstVarRef(nodep->fileline(), varp, = new AstVarRef(nodep->fileline(), varp,
VAccess::READ); // lvalue'ness computed later VAccess::READ); // lvalue'ness computed later
refp->packagep(foundp->packagep()); refp->classOrPackagep(foundp->classOrPackagep());
newp = refp; newp = refp;
} }
UINFO(9, " new " << newp << endl); UINFO(9, " new " << newp << endl);
@ -2305,7 +2310,7 @@ private:
} else if (AstEnumItem* valuep = VN_CAST(foundp->nodep(), EnumItem)) { } else if (AstEnumItem* valuep = VN_CAST(foundp->nodep(), EnumItem)) {
if (allowVar) { if (allowVar) {
AstNode* newp AstNode* newp
= new AstEnumItemRef(nodep->fileline(), valuep, foundp->packagep()); = new AstEnumItemRef(nodep->fileline(), valuep, foundp->classOrPackagep());
nodep->replaceWith(newp); nodep->replaceWith(newp);
VL_DO_DANGLING(pushDeletep(nodep), nodep); VL_DO_DANGLING(pushDeletep(nodep), nodep);
ok = true; ok = true;
@ -2379,7 +2384,7 @@ private:
if (AstVar* varp = foundp ? foundToVarp(foundp, nodep, nodep->access()) : nullptr) { if (AstVar* varp = foundp ? foundToVarp(foundp, nodep, nodep->access()) : nullptr) {
nodep->varp(varp); nodep->varp(varp);
// Generally set by parse, but might be an import // Generally set by parse, but might be an import
nodep->packagep(foundp->packagep()); nodep->classOrPackagep(foundp->classOrPackagep());
} }
if (!nodep->varp()) { if (!nodep->varp()) {
nodep->v3error("Can't find definition of signal, again: " << nodep->prettyNameQ()); nodep->v3error("Can't find definition of signal, again: " << nodep->prettyNameQ());
@ -2506,7 +2511,7 @@ private:
nodep->v3warn(E_UNSUPPORTED, "Unsupported: parameterized packages"); nodep->v3warn(E_UNSUPPORTED, "Unsupported: parameterized packages");
} }
UASSERT_OBJ(cpackagerefp->classOrPackagep(), m_ds.m_dotp->lhsp(), "Bad package link"); UASSERT_OBJ(cpackagerefp->classOrPackagep(), m_ds.m_dotp->lhsp(), "Bad package link");
nodep->packagep(cpackagerefp->classOrPackagep()); nodep->classOrPackagep(cpackagerefp->classOrPackagep());
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
m_ds.m_dotp = nullptr; m_ds.m_dotp = nullptr;
} else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) { } else if (m_ds.m_dotp && m_ds.m_dotPos == DP_FINAL) {
@ -2536,7 +2541,7 @@ private:
} else { } else {
checkNoDot(nodep); checkNoDot(nodep);
} }
if (nodep->packagep() && nodep->taskp()) { if (nodep->classOrPackagep() && nodep->taskp()) {
// References into packages don't care about cell hierarchy. // References into packages don't care about cell hierarchy.
} else if (!m_modSymp) { } else if (!m_modSymp) {
// Module that is not in hierarchy. We'll be dead code eliminating it later. // Module that is not in hierarchy. We'll be dead code eliminating it later.
@ -2552,8 +2557,8 @@ private:
// of same name under a subtask isn't a relevant hit however a // of same name under a subtask isn't a relevant hit however a
// function under a begin/end is. So we want begins, but not // function under a begin/end is. So we want begins, but not
// the function // the function
if (nodep->packagep()) { // Look only in specified package if (nodep->classOrPackagep()) { // Look only in specified package
dotSymp = m_statep->getNodeSym(nodep->packagep()); dotSymp = m_statep->getNodeSym(nodep->classOrPackagep());
} else { } else {
if (nodep->inlinedDots() != "") { // Correct for current scope if (nodep->inlinedDots() != "") { // Correct for current scope
// Dotted lookup is always relative to module, as maybe // Dotted lookup is always relative to module, as maybe
@ -2579,7 +2584,7 @@ private:
= foundp ? VN_CAST(foundp->nodep(), NodeFTask) : nullptr; // Maybe nullptr = foundp ? VN_CAST(foundp->nodep(), NodeFTask) : nullptr; // Maybe nullptr
if (taskp) { if (taskp) {
nodep->taskp(taskp); nodep->taskp(taskp);
nodep->packagep(foundp->packagep()); nodep->classOrPackagep(foundp->classOrPackagep());
UINFO(7, " Resolved " << nodep << endl); // Also prints taskp UINFO(7, " Resolved " << nodep << endl); // Also prints taskp
} else { } else {
// Note ParseRef has similar error handling/message output // Note ParseRef has similar error handling/message output
@ -2812,7 +2817,7 @@ private:
if (!nodep->findMember(it->first)) { if (!nodep->findMember(it->first)) {
if (AstEnumItem* aitemp = VN_CAST(itemp, EnumItem)) { if (AstEnumItem* aitemp = VN_CAST(itemp, EnumItem)) {
AstEnumItemRef* newp = new AstEnumItemRef(aitemp->fileline(), aitemp, AstEnumItemRef* newp = new AstEnumItemRef(aitemp->fileline(), aitemp,
it->second->packagep()); it->second->classOrPackagep());
UINFO(8, "Class import noderef '" << it->first << "' " << newp << endl); UINFO(8, "Class import noderef '" << it->first << "' " << newp << endl);
nodep->addMembersp(newp); nodep->addMembersp(newp);
} }
@ -2825,17 +2830,14 @@ private:
if (nodep->user3SetOnce()) return; if (nodep->user3SetOnce()) return;
if (AstNode* cpackagep = nodep->classOrPackageOpp()) { if (AstNode* cpackagep = nodep->classOrPackageOpp()) {
if (AstClassOrPackageRef* cpackagerefp = VN_CAST(cpackagep, ClassOrPackageRef)) { if (AstClassOrPackageRef* cpackagerefp = VN_CAST(cpackagep, ClassOrPackageRef)) {
if (cpackagerefp->packagep()) { nodep->classOrPackagep(cpackagerefp->classOrPackagep());
nodep->packagep(cpackagerefp->packagep()); if (!VN_IS(nodep->classOrPackagep(), Class)
} else { && !VN_IS(nodep->classOrPackagep(), Package)) {
nodep->packagep(cpackagerefp->classOrPackagep());
if (!VN_IS(nodep->packagep(), Class) && !VN_IS(nodep->packagep(), Package)) {
cpackagerefp->v3error( cpackagerefp->v3error(
"'::' expected to reference a class/package but referenced " "'::' expected to reference a class/package but referenced "
<< nodep->packagep()->prettyTypeName() << '\n' << nodep->classOrPackagep()->prettyTypeName() << '\n'
<< cpackagerefp->warnMore() + "... Suggest '.' instead of '::'"); << cpackagerefp->warnMore() + "... Suggest '.' instead of '::'");
} }
}
} else { } else {
cpackagep->v3warn(E_UNSUPPORTED, cpackagep->v3warn(E_UNSUPPORTED,
"Unsupported: Multiple '::' package/class reference"); "Unsupported: Multiple '::' package/class reference");
@ -2847,9 +2849,10 @@ private:
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(), ClassOrPackageRef), 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(), ClassOrPackageRef)->packagep(), UASSERT_OBJ(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->classOrPackagep(),
m_ds.m_dotp->lhsp(), "Bad package link"); m_ds.m_dotp->lhsp(), "Bad package link");
nodep->packagep(VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->packagep()); nodep->classOrPackagep(
VN_CAST(m_ds.m_dotp->lhsp(), ClassOrPackageRef)->classOrPackagep());
m_ds.m_dotPos = DP_SCOPE; m_ds.m_dotPos = DP_SCOPE;
m_ds.m_dotp = nullptr; m_ds.m_dotp = nullptr;
} else { } else {
@ -2858,21 +2861,21 @@ private:
if (nodep->typeofp()) { // Really is a typeof not a reference if (nodep->typeofp()) { // Really is a typeof not a reference
} else if (!nodep->typedefp() && !nodep->subDTypep()) { } else if (!nodep->typedefp() && !nodep->subDTypep()) {
VSymEnt* foundp; VSymEnt* foundp;
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
foundp = m_statep->getNodeSym(nodep->packagep())->findIdFlat(nodep->name()); foundp = m_statep->getNodeSym(nodep->classOrPackagep())->findIdFlat(nodep->name());
} else { } else {
foundp = m_curSymp->findIdFallback(nodep->name()); foundp = m_curSymp->findIdFallback(nodep->name());
} }
if (AstTypedef* defp = foundp ? VN_CAST(foundp->nodep(), Typedef) : nullptr) { if (AstTypedef* defp = foundp ? VN_CAST(foundp->nodep(), Typedef) : nullptr) {
nodep->typedefp(defp); nodep->typedefp(defp);
nodep->packagep(foundp->packagep()); nodep->classOrPackagep(foundp->classOrPackagep());
} else if (AstParamTypeDType* defp } else if (AstParamTypeDType* defp
= foundp ? VN_CAST(foundp->nodep(), ParamTypeDType) : nullptr) { = foundp ? VN_CAST(foundp->nodep(), ParamTypeDType) : nullptr) {
nodep->refDTypep(defp); nodep->refDTypep(defp);
nodep->packagep(foundp->packagep()); nodep->classOrPackagep(foundp->classOrPackagep());
} else if (AstClass* defp = foundp ? VN_CAST(foundp->nodep(), Class) : nullptr) { } else if (AstClass* defp = foundp ? VN_CAST(foundp->nodep(), Class) : nullptr) {
AstClassRefDType* newp = new AstClassRefDType(nodep->fileline(), defp); AstClassRefDType* newp = new AstClassRefDType(nodep->fileline(), defp);
newp->packagep(foundp->packagep()); newp->classOrPackagep(foundp->classOrPackagep());
nodep->replaceWith(newp); nodep->replaceWith(newp);
VL_DO_DANGLING(nodep->deleteTree(), nodep); VL_DO_DANGLING(nodep->deleteTree(), nodep);
return; return;

View File

@ -68,8 +68,8 @@ private:
for (const auto& itr : m_varRefScopes) { for (const auto& itr : m_varRefScopes) {
AstVarRef* nodep = itr.first; AstVarRef* nodep = itr.first;
AstScope* scopep = itr.second; AstScope* scopep = itr.second;
if (nodep->packagep() && !nodep->varp()->isClassMember()) { if (nodep->classOrPackagep() && !nodep->varp()->isClassMember()) {
const auto it2 = m_packageScopes.find(nodep->packagep()); const auto it2 = m_packageScopes.find(nodep->classOrPackagep());
UASSERT_OBJ(it2 != m_packageScopes.end(), nodep, "Can't locate package scope"); UASSERT_OBJ(it2 != m_packageScopes.end(), nodep, "Can't locate package scope");
scopep = it2->second; scopep = it2->second;
} }
@ -365,7 +365,7 @@ private:
virtual void visit(AstNodeFTaskRef* nodep) override { virtual void visit(AstNodeFTaskRef* nodep) override {
// The crossrefs are dealt with in V3LinkDot // The crossrefs are dealt with in V3LinkDot
UINFO(9, " Old pkg-taskref " << nodep << endl); UINFO(9, " Old pkg-taskref " << nodep << endl);
if (nodep->packagep()) { if (nodep->classOrPackagep()) {
// Point to the clone // Point to the clone
UASSERT_OBJ(nodep->taskp(), nodep, "Unlinked"); UASSERT_OBJ(nodep->taskp(), nodep, "Unlinked");
AstNodeFTask* newp = VN_CAST(nodep->taskp()->user2p(), NodeFTask); AstNodeFTask* newp = VN_CAST(nodep->taskp()->user2p(), NodeFTask);

View File

@ -982,7 +982,7 @@ class SplitPackedVarVisitor final : public AstNVisitor, public SplitVarImpl {
const auto refit = m_refs.find(varp); const auto refit = m_refs.find(varp);
if (refit == m_refs.end()) return; // variable without split_var metacomment if (refit == m_refs.end()) return; // variable without split_var metacomment
UASSERT_OBJ(varp->attrSplitVar(), varp, "split_var attribute must be attached"); UASSERT_OBJ(varp->attrSplitVar(), varp, "split_var attribute must be attached");
UASSERT_OBJ(!nodep->packagep(), nodep, UASSERT_OBJ(!nodep->classOrPackagep(), nodep,
"variable in package must have been dropped beforehand."); "variable in package must have been dropped beforehand.");
const AstBasicDType* basicp = refit->second.basicp(); const AstBasicDType* basicp = refit->second.basicp();
refit->second.append(PackedVarRefEntry(nodep, basicp->lsb(), varp->width()), refit->second.append(PackedVarRefEntry(nodep, basicp->lsb(), varp->width()),

View File

@ -46,7 +46,7 @@ class VSymEnt final {
AstNode* m_nodep; // Node that entry belongs to AstNode* m_nodep; // Node that entry belongs to
VSymEnt* m_fallbackp; // Table "above" this one in name scope, for fallback resolution VSymEnt* m_fallbackp; // Table "above" this one in name scope, for fallback resolution
VSymEnt* m_parentp; // Table that created this table, dot notation needed to resolve into it VSymEnt* m_parentp; // Table that created this table, dot notation needed to resolve into it
AstNodeModule* m_packagep; // Package node is in (for V3LinkDot, unused here) AstNodeModule* m_classOrPackagep; // Package node is in (for V3LinkDot, unused here)
string m_symPrefix; // String to prefix symbols with (for V3LinkDot, unused here) string m_symPrefix; // String to prefix symbols with (for V3LinkDot, unused here)
bool m_exported; // Allow importing bool m_exported; // Allow importing
bool m_imported; // Was imported bool m_imported; // Was imported
@ -100,7 +100,7 @@ public:
m_nodep = reinterpret_cast<AstNode*>(1); m_nodep = reinterpret_cast<AstNode*>(1);
m_fallbackp = reinterpret_cast<VSymEnt*>(1); m_fallbackp = reinterpret_cast<VSymEnt*>(1);
m_parentp = reinterpret_cast<VSymEnt*>(1); m_parentp = reinterpret_cast<VSymEnt*>(1);
m_packagep = reinterpret_cast<AstNodeModule*>(1); m_classOrPackagep = reinterpret_cast<AstNodeModule*>(1);
#endif #endif
} }
#if defined(VL_DEBUG) && !defined(VL_LEAK_CHECKS) #if defined(VL_DEBUG) && !defined(VL_LEAK_CHECKS)
@ -111,8 +111,8 @@ public:
VSymEnt* fallbackp() const { return m_fallbackp; } VSymEnt* fallbackp() const { return m_fallbackp; }
void parentp(VSymEnt* entp) { m_parentp = entp; } void parentp(VSymEnt* entp) { m_parentp = entp; }
VSymEnt* parentp() const { return m_parentp; } VSymEnt* parentp() const { return m_parentp; }
void packagep(AstNodeModule* entp) { m_packagep = entp; } void classOrPackagep(AstNodeModule* entp) { m_classOrPackagep = entp; }
AstNodeModule* packagep() const { return m_packagep; } AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
AstNode* nodep() const { return m_nodep; } AstNode* nodep() const { return m_nodep; }
string symPrefix() const { return m_symPrefix; } string symPrefix() const { return m_symPrefix; }
void symPrefix(const string& name) { m_symPrefix = name; } void symPrefix(const string& name) { m_symPrefix = name; }
@ -337,7 +337,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, AstNode* nodep)
// by an earlier search insertion. // by an earlier search insertion.
m_fallbackp = nullptr; m_fallbackp = nullptr;
m_parentp = nullptr; m_parentp = nullptr;
m_packagep = nullptr; m_classOrPackagep = nullptr;
m_exported = true; m_exported = true;
m_imported = false; m_imported = false;
graphp->pushNewEnt(this); graphp->pushNewEnt(this);
@ -347,7 +347,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, const VSymEnt* symp)
: m_nodep(symp->m_nodep) { : m_nodep(symp->m_nodep) {
m_fallbackp = symp->m_fallbackp; m_fallbackp = symp->m_fallbackp;
m_parentp = symp->m_parentp; m_parentp = symp->m_parentp;
m_packagep = symp->m_packagep; m_classOrPackagep = symp->m_classOrPackagep;
m_exported = symp->m_exported; m_exported = symp->m_exported;
m_imported = symp->m_imported; m_imported = symp->m_imported;
graphp->pushNewEnt(this); graphp->pushNewEnt(this);

View File

@ -1415,7 +1415,7 @@ private:
= dimensionVarp(nodep->fromp()->dtypep(), nodep->attrType(), msbdim); = dimensionVarp(nodep->fromp()->dtypep(), nodep->attrType(), msbdim);
AstNode* dimp = nodep->dimp()->unlinkFrBack(); AstNode* dimp = nodep->dimp()->unlinkFrBack();
AstVarRef* varrefp = new AstVarRef(nodep->fileline(), varp, VAccess::READ); AstVarRef* varrefp = new AstVarRef(nodep->fileline(), varp, VAccess::READ);
varrefp->packagep(v3Global.rootp()->dollarUnitPkgAddp()); varrefp->classOrPackagep(v3Global.rootp()->dollarUnitPkgAddp());
AstNode* newp = new AstArraySel(nodep->fileline(), varrefp, dimp); AstNode* newp = new AstArraySel(nodep->fileline(), varrefp, dimp);
nodep->replaceWith(newp); nodep->replaceWith(newp);
VL_DO_DANGLING(nodep->deleteTree(), nodep); VL_DO_DANGLING(nodep->deleteTree(), nodep);
@ -2516,7 +2516,7 @@ private:
int selwidth = V3Number::log2b(msbdim) + 1; // Width to address a bit int selwidth = V3Number::log2b(msbdim) + 1; // Width to address a bit
AstVar* varp = enumVarp(adtypep, attrType, (1ULL << selwidth) - 1); AstVar* varp = enumVarp(adtypep, attrType, (1ULL << selwidth) - 1);
AstVarRef* varrefp = new AstVarRef(nodep->fileline(), varp, VAccess::READ); AstVarRef* varrefp = new AstVarRef(nodep->fileline(), varp, VAccess::READ);
varrefp->packagep(v3Global.rootp()->dollarUnitPkgAddp()); varrefp->classOrPackagep(v3Global.rootp()->dollarUnitPkgAddp());
AstNode* newp = new AstArraySel( AstNode* newp = new AstArraySel(
nodep->fileline(), varrefp, nodep->fileline(), varrefp,
// Select in case widths are // Select in case widths are
@ -2886,7 +2886,7 @@ private:
newp = new AstFuncRef(nodep->fileline(), ftaskp->name(), argsp); newp = new AstFuncRef(nodep->fileline(), ftaskp->name(), argsp);
} }
newp->taskp(ftaskp); newp->taskp(ftaskp);
newp->packagep(classp); newp->classOrPackagep(classp);
nodep->replaceWith(newp); nodep->replaceWith(newp);
VL_DO_DANGLING(nodep->deleteTree(), nodep); VL_DO_DANGLING(nodep->deleteTree(), nodep);
} else { } else {
@ -3101,7 +3101,7 @@ private:
UASSERT_OBJ(classp, nodep, "Unlinked"); UASSERT_OBJ(classp, nodep, "Unlinked");
if (AstNodeFTask* ftaskp = VN_CAST(classp->findMember("new"), Func)) { if (AstNodeFTask* ftaskp = VN_CAST(classp->findMember("new"), Func)) {
nodep->taskp(ftaskp); nodep->taskp(ftaskp);
nodep->packagep(classp); nodep->classOrPackagep(classp);
} else { } else {
// Either made explicitly or V3LinkDot made implicitly // Either made explicitly or V3LinkDot made implicitly
classp->v3fatalSrc("Can't find class's new"); classp->v3fatalSrc("Can't find class's new");

View File

@ -3873,7 +3873,7 @@ taskId<ftaskp>:
// //
| packageClassScope id | packageClassScope id
{ $$ = new AstTask($<fl>$, *$2, nullptr); { $$ = new AstTask($<fl>$, *$2, nullptr);
$$->packagep($1); $$->classOrPackagep($1);
SYMP->pushNewUnderNodeOrCurrent($$, $<scp>1); } SYMP->pushNewUnderNodeOrCurrent($$, $<scp>1); }
; ;
@ -3912,7 +3912,7 @@ funcIdNew<ftaskp>: // IEEE: from class_constructor_declaration
SYMP->pushNewUnder($$, nullptr); } SYMP->pushNewUnder($$, nullptr); }
| packageClassScopeNoId yNEW__PAREN | packageClassScopeNoId yNEW__PAREN
{ $$ = new AstFunc($<fl>2, "new", nullptr, nullptr); { $$ = new AstFunc($<fl>2, "new", nullptr, nullptr);
$$->packagep($1); $$->classOrPackagep($1);
$$->isConstructor(true); $$->isConstructor(true);
SYMP->pushNewUnderNodeOrCurrent($$, $<scp>1); } SYMP->pushNewUnderNodeOrCurrent($$, $<scp>1); }
; ;
@ -3934,7 +3934,7 @@ fIdScoped<funcp>: // IEEE: part of function_body_declaration/task_body_declarat
{ $<fl>$ = $<fl>1; { $<fl>$ = $<fl>1;
$<scp>$ = $<scp>1; $<scp>$ = $<scp>1;
$$ = new AstFunc($<fl>$, *$2, nullptr, nullptr); $$ = new AstFunc($<fl>$, *$2, nullptr, nullptr);
$$->packagep($1); } $$->classOrPackagep($1); }
; ;
tfGuts<nodep>: tfGuts<nodep>: