mirror of
https://github.com/verilator/verilator.git
synced 2025-04-21 12:06:55 +00:00
Internals: Fix compares to null, part of bug1030. No functional change intended.
This commit is contained in:
parent
850100c9c2
commit
d56179df17
@ -122,8 +122,14 @@ private:
|
||||
return (nodep->user1p()->castGraphVertex());
|
||||
}
|
||||
|
||||
AstNodeModule* findModuleSym(const string& modName) {
|
||||
VSymEnt* foundp = m_mods.rootp()->findIdFallback(modName);
|
||||
if (!foundp) return NULL;
|
||||
else return foundp->nodep()->castNodeModule();
|
||||
}
|
||||
|
||||
AstNodeModule* resolveModule(AstNode* nodep, const string& modName) {
|
||||
AstNodeModule* modp = m_mods.rootp()->findIdFallback(modName)->nodep()->castNodeModule();
|
||||
AstNodeModule* modp = findModuleSym(modName);
|
||||
if (!modp) {
|
||||
// Read-subfile
|
||||
// If file not found, make AstNotFoundModule, rather than error out.
|
||||
@ -135,7 +141,7 @@ private:
|
||||
// We've read new modules, grab new pointers to their names
|
||||
readModNames();
|
||||
// Check again
|
||||
modp = m_mods.rootp()->findIdFallback(modName)->nodep()->castNodeModule();
|
||||
modp = findModuleSym(modName);
|
||||
if (!modp) {
|
||||
// This shouldn't throw a message as parseFile will create a AstNotFoundModule for us
|
||||
nodep->v3error("Can't resolve module reference: "<<prettyName);
|
||||
@ -387,7 +393,7 @@ private:
|
||||
// Look at all modules, and store pointers to all module names
|
||||
for (AstNodeModule* nextp,* nodep = v3Global.rootp()->modulesp(); nodep; nodep=nextp) {
|
||||
nextp = nodep->nextp()->castNodeModule();
|
||||
AstNode* foundp = m_mods.rootp()->findIdFallback(nodep->name())->nodep();
|
||||
AstNodeModule* foundp = findModuleSym(nodep->name());
|
||||
if (foundp && foundp != nodep) {
|
||||
if (!(foundp->fileline()->warnIsOff(V3ErrorCode::MODDUP) || nodep->fileline()->warnIsOff(V3ErrorCode::MODDUP))) {
|
||||
nodep->v3warn(MODDUP,"Duplicate declaration of module: "<<nodep->prettyName()<<endl
|
||||
|
@ -207,7 +207,7 @@ public:
|
||||
// Note we only check for conflicts at the same level; it's ok if one block hides another
|
||||
// We also wouldn't want to not insert it even though it's lower down
|
||||
VSymEnt* foundp = lookupSymp->findIdFlat(name);
|
||||
AstNode* fnodep = foundp->nodep();
|
||||
AstNode* fnodep = foundp ? foundp->nodep() : NULL;
|
||||
if (!fnodep) {
|
||||
// Not found, will add in a moment.
|
||||
} else if (nodep==fnodep) { // Already inserted.
|
||||
@ -378,7 +378,7 @@ public:
|
||||
void computeIfaceVarSyms() {
|
||||
for (IfaceVarSyms::iterator it = m_ifaceVarSyms.begin(); it != m_ifaceVarSyms.end(); ++it) {
|
||||
VSymEnt* varSymp = *it;
|
||||
AstVar* varp = varSymp->nodep()->castVar();
|
||||
AstVar* varp = varSymp ? varSymp->nodep()->castVar() : NULL;
|
||||
UINFO(9, " insAllIface se"<<(void*)varSymp<<" "<<varp<<endl);
|
||||
AstIfaceRefDType* ifacerefp = ifaceRefFromArray(varp->subDTypep());
|
||||
if (!ifacerefp) varp->v3fatalSrc("Non-ifacerefs on list!");
|
||||
@ -489,8 +489,8 @@ public:
|
||||
// then look up (inst name or modname)
|
||||
if (firstId) {
|
||||
// Check this module - subcellnames
|
||||
AstCell* cellp = lookupSymp->nodep()->castCell(); // Replicated below
|
||||
AstCellInline* inlinep = lookupSymp->nodep()->castCellInline(); // Replicated below
|
||||
AstCell* cellp = lookupSymp ? lookupSymp->nodep()->castCell() : NULL; // Replicated below
|
||||
AstCellInline* inlinep = lookupSymp ? lookupSymp->nodep()->castCellInline() : NULL; // Replicated below
|
||||
if (VSymEnt* findSymp = findWithAltFallback(lookupSymp, ident, altIdent)) {
|
||||
lookupSymp = findSymp;
|
||||
}
|
||||
@ -501,8 +501,8 @@ public:
|
||||
else {
|
||||
while (lookupSymp) {
|
||||
lookupSymp = lookupSymp->parentp();
|
||||
cellp = lookupSymp->nodep()->castCell(); // Replicated above
|
||||
inlinep = lookupSymp->nodep()->castCellInline(); // Replicated above
|
||||
cellp = lookupSymp ? lookupSymp->nodep()->castCell() : NULL; // Replicated above
|
||||
inlinep = lookupSymp ? lookupSymp->nodep()->castCellInline() : NULL; // Replicated above
|
||||
if (lookupSymp) {
|
||||
UINFO(9,"\t\tUp to "<<lookupSymp<<endl);
|
||||
if ((cellp && cellp->modp()->origName() == ident)
|
||||
@ -1033,7 +1033,7 @@ private:
|
||||
nodep->iterateChildren(*this);
|
||||
nodep->v3warn(DEFPARAM,"Suggest replace defparam with Verilog 2001 #(."<<nodep->prettyName()<<"(...etc...))");
|
||||
VSymEnt* foundp = m_statep->getNodeSym(nodep)->findIdFallback(nodep->path());
|
||||
AstCell* cellp = foundp->nodep()->castCell();
|
||||
AstCell* cellp = foundp ? foundp->nodep()->castCell() : NULL;
|
||||
if (!cellp) {
|
||||
nodep->v3error("In defparam, cell "<<nodep->path()<<" never declared");
|
||||
} else {
|
||||
@ -1055,7 +1055,7 @@ private:
|
||||
// Need to set pin numbers after varnames are created
|
||||
// But before we do the final resolution based on names
|
||||
VSymEnt* foundp = m_statep->getNodeSym(m_modp)->findIdFlat(nodep->name());
|
||||
AstVar* refp = foundp->nodep()->castVar();
|
||||
AstVar* refp = foundp ? foundp->nodep()->castVar() : NULL;
|
||||
if (!refp) {
|
||||
nodep->v3error("Input/output/inout declaration not found for port: "<<nodep->prettyName());
|
||||
} else if (!refp->isIO() && !refp->isIfaceRef()) {
|
||||
@ -1513,7 +1513,7 @@ private:
|
||||
if (!nodep->modVarp()) {
|
||||
if (!m_pinSymp) nodep->v3fatalSrc("Pin not under cell?\n");
|
||||
VSymEnt* foundp = m_pinSymp->findIdFlat(nodep->name());
|
||||
AstVar* refp = foundp->nodep()->castVar();
|
||||
AstVar* refp = foundp ? foundp->nodep()->castVar() : NULL;
|
||||
const char* whatp = nodep->param() ? "parameter pin" : "pin";
|
||||
if (!refp) {
|
||||
if (nodep->name() == "__paramNumber1" && m_cellp->modp()->castPrimitive()) {
|
||||
@ -1661,8 +1661,10 @@ private:
|
||||
<<" n="<<foundp->nodep()<<endl);
|
||||
// What fell out?
|
||||
bool ok = false;
|
||||
if (foundp->nodep()->castCell() || foundp->nodep()->castBegin()
|
||||
|| foundp->nodep()->castModule()) { // if top
|
||||
if (!foundp) {
|
||||
} else if (foundp->nodep()->castCell()
|
||||
|| foundp->nodep()->castBegin()
|
||||
|| foundp->nodep()->castModule()) { // if top
|
||||
if (allowScope) {
|
||||
ok = true;
|
||||
if (m_ds.m_dotText!="") m_ds.m_dotText += ".";
|
||||
@ -1679,7 +1681,8 @@ private:
|
||||
VSymEnt* cellEntp = m_statep->getNodeSym(cellp); if (!cellEntp) nodep->v3fatalSrc("No interface sym entry");
|
||||
VSymEnt* parentEntp = cellEntp->parentp(); // Container of the var; probably a module or generate begin
|
||||
string findName = nodep->name()+"__Viftop";
|
||||
AstVar* ifaceRefVarp = parentEntp->findIdFallback(findName)->nodep()->castVar();
|
||||
VSymEnt* ifaceSymp = parentEntp->findIdFallback(findName);
|
||||
AstVar* ifaceRefVarp = ifaceSymp ? ifaceSymp->nodep()->castVar() : NULL;
|
||||
if (!ifaceRefVarp) nodep->v3fatalSrc("Can't find interface var ref: "<<findName);
|
||||
//
|
||||
ok = true;
|
||||
@ -1811,7 +1814,7 @@ private:
|
||||
UINFO(9," linkVarRef se"<<(void*)m_curSymp<<" n="<<nodep<<endl);
|
||||
if (!m_curSymp) nodep->v3fatalSrc("NULL lookup symbol table");
|
||||
VSymEnt* foundp = m_curSymp->findIdFallback(nodep->name());
|
||||
if (AstVar* varp = foundp->nodep()->castVar()) {
|
||||
if (AstVar* varp = foundp ? foundp->nodep()->castVar() : NULL) {
|
||||
nodep->varp(varp);
|
||||
nodep->packagep(foundp->packagep()); // Generally set by parse, but might be an import
|
||||
}
|
||||
@ -1845,7 +1848,7 @@ private:
|
||||
dotSymp = m_statep->findDotted(dotSymp, nodep->dotted(), baddot, okSymp); // Maybe NULL
|
||||
if (!m_statep->forScopeCreation()) {
|
||||
VSymEnt* foundp = m_statep->findSymPrefixed(dotSymp, nodep->name(), baddot);
|
||||
AstVar* varp = foundp->nodep()->castVar(); // maybe NULL
|
||||
AstVar* varp = foundp ? foundp->nodep()->castVar() : NULL;
|
||||
nodep->varp(varp);
|
||||
UINFO(7," Resolved "<<nodep<<endl); // Also prints varp
|
||||
if (!nodep->varp()) {
|
||||
@ -1864,7 +1867,7 @@ private:
|
||||
} else {
|
||||
string baddot;
|
||||
VSymEnt* foundp = m_statep->findSymPrefixed(dotSymp, nodep->name(), baddot);
|
||||
AstVarScope* vscp = foundp->nodep()->castVarScope(); // maybe NULL
|
||||
AstVarScope* vscp = foundp ? foundp->nodep()->castVarScope() : NULL;
|
||||
if (!vscp) {
|
||||
nodep->v3error("Can't find varpin scope of '"<<baddot<<"' in dotted signal: "<<nodep->dotted()+"."+nodep->prettyName());
|
||||
okSymp->cellErrorScopes(nodep);
|
||||
@ -2085,7 +2088,7 @@ private:
|
||||
} else {
|
||||
foundp = m_curSymp->findIdFallback(nodep->name());
|
||||
}
|
||||
if (AstTypedef* defp = foundp->nodep()->castTypedef()) {
|
||||
if (AstTypedef* defp = foundp ? foundp->nodep()->castTypedef() : NULL) {
|
||||
nodep->refDTypep(defp->subDTypep());
|
||||
nodep->packagep(foundp->packagep());
|
||||
} else {
|
||||
@ -2099,7 +2102,7 @@ private:
|
||||
nodep->iterateChildren(*this);
|
||||
checkNoDot(nodep);
|
||||
VSymEnt* foundp = m_curSymp->findIdFallback(nodep->name());
|
||||
AstNodeFTask* taskp = foundp->nodep()->castNodeFTask();
|
||||
AstNodeFTask* taskp = foundp ? foundp->nodep()->castNodeFTask() : NULL;
|
||||
if (!taskp) { nodep->v3error("Can't find definition of exported task/function: "<<nodep->prettyName()); }
|
||||
else if (taskp->dpiExport()) {
|
||||
nodep->v3error("Function was already DPI Exported, duplicate not allowed: "<<nodep->prettyName());
|
||||
|
@ -118,7 +118,9 @@ public:
|
||||
}
|
||||
AstNode* findEntUpward (const string& name) {
|
||||
// Lookup the given string as an identifier, return type of the id, scanning upward
|
||||
return symCurrentp()->findIdFallback(name)->nodep();
|
||||
VSymEnt* foundp = symCurrentp()->findIdFallback(name);
|
||||
if (foundp) return foundp->nodep();
|
||||
else return NULL;
|
||||
}
|
||||
void import(AstNode* packagep, const string& id_or_star) {
|
||||
// Import from package::id_or_star to this
|
||||
|
@ -107,7 +107,7 @@ public:
|
||||
VSymEnt* parentp() const { return m_parentp; }
|
||||
void packagep(AstPackage* entp) { m_packagep = entp; }
|
||||
AstPackage* packagep() const { return m_packagep; }
|
||||
AstNode* nodep() const { if (!this) return NULL; else return m_nodep; } // null check so can call .findId(...)->nodep()
|
||||
AstNode* nodep() const { return m_nodep; }
|
||||
string symPrefix() const { return m_symPrefix; }
|
||||
void symPrefix(const string& name) { m_symPrefix = name; }
|
||||
bool exported() const { return m_exported; }
|
||||
@ -284,7 +284,7 @@ inline VSymEnt::VSymEnt(VSymGraph* graphp, AstNode* nodep)
|
||||
}
|
||||
|
||||
inline VSymEnt::VSymEnt(VSymGraph* graphp, const VSymEnt* symp)
|
||||
: m_nodep(symp->nodep()) {
|
||||
: m_nodep(symp->m_nodep) {
|
||||
m_fallbackp = symp->m_fallbackp;
|
||||
m_parentp = symp->m_parentp;
|
||||
m_packagep = symp->m_packagep;
|
||||
|
@ -137,9 +137,7 @@ public:
|
||||
bool prelim() const { return m_stage & PRELIM; }
|
||||
bool final() const { return m_stage & FINAL; }
|
||||
void dump(ostream& str) const {
|
||||
if (!this) {
|
||||
str<<" VUP(NULL)";
|
||||
} else if (!m_dtypep) {
|
||||
if (!m_dtypep) {
|
||||
str<<" VUP(s="<<m_stage<<",self)";
|
||||
} else {
|
||||
str<<" VUP(s="<<m_stage<<",dt="<<(void*)dtypep()<<")";
|
||||
@ -147,7 +145,7 @@ public:
|
||||
}
|
||||
};
|
||||
ostream& operator<<(ostream& str, const WidthVP* vup) {
|
||||
vup->dump(str);
|
||||
if (vup) vup->dump(str);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
@ -1030,19 +1030,20 @@ int V3ParseImp::lexToken() {
|
||||
// If an id, change the type based on symbol table
|
||||
// Note above sometimes converts yGLOBAL to a yaID__LEX
|
||||
if (token == yaID__LEX) {
|
||||
AstNode* scp;
|
||||
VSymEnt* foundp;
|
||||
if (VSymEnt* look_underp = SYMP->nextId()) {
|
||||
if (debugFlex()) { cout<<" lexToken: next id lookup forced under "<<look_underp<<endl; }
|
||||
scp = look_underp->findIdFallback(*(yylval.strp))->nodep();
|
||||
foundp = look_underp->findIdFallback(*(yylval.strp));
|
||||
// "consume" it. Must set again if want another token under temp scope
|
||||
SYMP->nextId(NULL);
|
||||
} else {
|
||||
UINFO(7," lexToken: find upward "<<SYMP->symCurrentp()<<" for '"<<*(yylval.strp)<<"'"<<endl);
|
||||
//if (debug()>=9) SYMP->symCurrentp()->dump(cout," -findtree: ",true);
|
||||
scp = SYMP->symCurrentp()->findIdFallback(*(yylval.strp))->nodep();
|
||||
foundp = SYMP->symCurrentp()->findIdFallback(*(yylval.strp));
|
||||
}
|
||||
yylval.scp = scp;
|
||||
if (scp) {
|
||||
if (foundp) {
|
||||
AstNode* scp = foundp->nodep();
|
||||
yylval.scp = scp;
|
||||
UINFO(7," lexToken: Found "<<scp<<endl);
|
||||
if (scp->castTypedef()) token = yaID__aTYPE;
|
||||
else if (scp->castTypedefFwd()) token = yaID__aTYPE;
|
||||
@ -1051,6 +1052,7 @@ int V3ParseImp::lexToken() {
|
||||
//UNSUP else if (scp->castCoverGroup()) token = yaID__aCOVERGROUP;
|
||||
else token = yaID__ETC;
|
||||
} else { // Not found
|
||||
yylval.scp = NULL;
|
||||
token = yaID__ETC;
|
||||
}
|
||||
}
|
||||
|
@ -121,10 +121,13 @@ public:
|
||||
}
|
||||
AstPackage* unitPackage(FileLine* fl) {
|
||||
// Find one made earlier?
|
||||
AstPackage* pkgp = SYMP->symRootp()->findIdFlat(AstPackage::dollarUnitName())->nodep()->castPackage();
|
||||
if (!pkgp) {
|
||||
VSymEnt* symp = SYMP->symRootp()->findIdFlat(AstPackage::dollarUnitName());
|
||||
AstPackage* pkgp;
|
||||
if (!symp) {
|
||||
pkgp = PARSEP->rootp()->dollarUnitPkgAddp();
|
||||
SYMP->reinsert(pkgp, SYMP->symRootp()); // Don't push/pop scope as they're global
|
||||
} else {
|
||||
pkgp = symp->nodep()->castPackage();
|
||||
}
|
||||
return pkgp;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user