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
AstVar* m_varp; // [AfterLink] Pointer to variable itself
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_hiername; // Scope converted into name-> for emitting
bool m_hierThis = false; // Hiername points to "this" function
@ -2336,8 +2336,8 @@ public:
void hiername(const string& hn) { m_hiername = hn; }
bool hierThis() const { return m_hierThis; }
void hierThis(bool flag) { m_hierThis = flag; }
AstNodeModule* packagep() const { return m_packagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; }
AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
// Know no children, and hot function, so skip iterator for speed
// See checkTreeIter also that asserts no children
// cppcheck-suppress functionConst
@ -2723,8 +2723,8 @@ public:
void addFvarp(AstNode* nodep) { addNOp1p(nodep); }
bool isFunction() const { return fvarp() != nullptr; }
// op2 = Class/package scope
AstNode* packagep() const { return op2p(); }
void packagep(AstNode* nodep) { setNOp2p(nodep); }
AstNode* classOrPackagep() const { return op2p(); }
void classOrPackagep(AstNode* nodep) { setNOp2p(nodep); }
// op3 = Statements/Ports/Vars
AstNode* stmtsp() const { return op3p(); } // op3 = List of statements
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.
private:
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_dotted; // Dotted part of scope the name()ed task/func is under or ""
string m_inlinedDots; // Dotted hierarchy flattened out
@ -2808,8 +2808,8 @@ public:
void taskp(AstNodeFTask* taskp) { m_taskp = taskp; }
virtual void name(const string& name) override { m_name = name; }
void dotted(const string& name) { m_dotted = name; }
AstNodeModule* packagep() const { return m_packagep; }
void packagep(AstNodeModule* nodep) { m_packagep = nodep; }
AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
void classOrPackagep(AstNodeModule* nodep) { m_classOrPackagep = nodep; }
bool pli() const { return m_pli; }
void pli(bool flag) { m_pli = flag; }
// op1 = namep
@ -2994,7 +2994,7 @@ inline VNumRange AstNodeArrayDType::declRange() const {
inline const char* AstNodeFTaskRef::broken() const {
BROKEN_RTN(m_taskp && !m_taskp->brokeExists());
BROKEN_RTN(m_packagep && !m_packagep->brokeExists());
BROKEN_RTN(m_classOrPackagep && !m_classOrPackagep->brokeExists());
return nullptr;
}

View File

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

View File

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

View File

@ -84,7 +84,7 @@ class CUseDTypeVisitor final : public AstNVisitor {
if (nodep->user2SetOnce()) return; // Process once
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
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
VL_RESTORER(m_impOnly);
{

View File

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

View File

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

View File

@ -153,7 +153,7 @@ private:
virtual void visit(AstNodeFTaskRef* nodep) override {
// Cleanup link until V3LinkDot can correct it
// 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);
}
virtual void visit(AstAlways* nodep) override {

View File

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

View File

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

View File

@ -68,8 +68,8 @@ private:
for (const auto& itr : m_varRefScopes) {
AstVarRef* nodep = itr.first;
AstScope* scopep = itr.second;
if (nodep->packagep() && !nodep->varp()->isClassMember()) {
const auto it2 = m_packageScopes.find(nodep->packagep());
if (nodep->classOrPackagep() && !nodep->varp()->isClassMember()) {
const auto it2 = m_packageScopes.find(nodep->classOrPackagep());
UASSERT_OBJ(it2 != m_packageScopes.end(), nodep, "Can't locate package scope");
scopep = it2->second;
}
@ -365,7 +365,7 @@ private:
virtual void visit(AstNodeFTaskRef* nodep) override {
// The crossrefs are dealt with in V3LinkDot
UINFO(9, " Old pkg-taskref " << nodep << endl);
if (nodep->packagep()) {
if (nodep->classOrPackagep()) {
// Point to the clone
UASSERT_OBJ(nodep->taskp(), nodep, "Unlinked");
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);
if (refit == m_refs.end()) return; // variable without split_var metacomment
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.");
const AstBasicDType* basicp = refit->second.basicp();
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
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
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)
bool m_exported; // Allow importing
bool m_imported; // Was imported
@ -100,7 +100,7 @@ public:
m_nodep = reinterpret_cast<AstNode*>(1);
m_fallbackp = reinterpret_cast<VSymEnt*>(1);
m_parentp = reinterpret_cast<VSymEnt*>(1);
m_packagep = reinterpret_cast<AstNodeModule*>(1);
m_classOrPackagep = reinterpret_cast<AstNodeModule*>(1);
#endif
}
#if defined(VL_DEBUG) && !defined(VL_LEAK_CHECKS)
@ -111,8 +111,8 @@ public:
VSymEnt* fallbackp() const { return m_fallbackp; }
void parentp(VSymEnt* entp) { m_parentp = entp; }
VSymEnt* parentp() const { return m_parentp; }
void packagep(AstNodeModule* entp) { m_packagep = entp; }
AstNodeModule* packagep() const { return m_packagep; }
void classOrPackagep(AstNodeModule* entp) { m_classOrPackagep = entp; }
AstNodeModule* classOrPackagep() const { return m_classOrPackagep; }
AstNode* nodep() const { return m_nodep; }
string symPrefix() const { return m_symPrefix; }
void symPrefix(const string& name) { m_symPrefix = name; }
@ -337,7 +337,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, AstNode* nodep)
// by an earlier search insertion.
m_fallbackp = nullptr;
m_parentp = nullptr;
m_packagep = nullptr;
m_classOrPackagep = nullptr;
m_exported = true;
m_imported = false;
graphp->pushNewEnt(this);
@ -347,7 +347,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, const VSymEnt* symp)
: m_nodep(symp->m_nodep) {
m_fallbackp = symp->m_fallbackp;
m_parentp = symp->m_parentp;
m_packagep = symp->m_packagep;
m_classOrPackagep = symp->m_classOrPackagep;
m_exported = symp->m_exported;
m_imported = symp->m_imported;
graphp->pushNewEnt(this);

View File

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

View File

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