Internals: Merge from struct branch, rename SymTable calls. No functional change intended.

This commit is contained in:
Wilson Snyder 2012-06-20 06:09:07 -04:00
parent 09aa9f87d8
commit 365034d7dd
6 changed files with 55 additions and 52 deletions

View File

@ -125,7 +125,7 @@ private:
bool linkVarName (AstVarRef* nodep) { bool linkVarName (AstVarRef* nodep) {
// Return true if changed, and caller should end processing // Return true if changed, and caller should end processing
if (!nodep->varp()) { if (!nodep->varp()) {
AstNode* foundp = m_curVarsp->findIdUpward(nodep->name()); AstNode* foundp = m_curVarsp->findIdFallback(nodep->name());
if (AstVar* varp = foundp->castVar()) { if (AstVar* varp = foundp->castVar()) {
nodep->varp(varp); nodep->varp(varp);
nodep->packagep(packageFor(varp)); nodep->packagep(packageFor(varp));
@ -280,7 +280,7 @@ private:
nodep->trace(false); nodep->trace(false);
} }
// Find under either a task or the module's vars // Find under either a task or the module's vars
AstNode* foundp = m_curVarsp->findIdUpward(nodep->name()); AstNode* foundp = m_curVarsp->findIdFallback(nodep->name());
AstVar* findvarp = foundp->castVar(); AstVar* findvarp = foundp->castVar();
bool ins=false; bool ins=false;
if (!foundp) { if (!foundp) {
@ -290,7 +290,7 @@ private:
<<nodeTextType(foundp)<<": "<<nodep->prettyName()); <<nodeTextType(foundp)<<": "<<nodep->prettyName());
} else if (findvarp != nodep) { } else if (findvarp != nodep) {
UINFO(4,"DupVar: "<<nodep<<" ;; "<<foundp<<endl); UINFO(4,"DupVar: "<<nodep<<" ;; "<<foundp<<endl);
if (findvarp && findvarp->user3p() == m_curVarsp) { // Only when on same level if (findvarp && findvarp->user3p()->castSymTable() == m_curVarsp) { // Only when on same level
if ((findvarp->isIO() && nodep->isSignal()) if ((findvarp->isIO() && nodep->isSignal())
|| (findvarp->isSignal() && nodep->isIO())) { || (findvarp->isSignal() && nodep->isIO())) {
findvarp->combineType(nodep); findvarp->combineType(nodep);
@ -354,14 +354,14 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_idState==ID_FIND) { if (m_idState==ID_FIND) {
// Find under either a task or the module's vars // Find under either a task or the module's vars
AstNode* foundp = m_curVarsp->findIdUpward(nodep->name()); AstNode* foundp = m_curVarsp->findIdFallback(nodep->name());
AstEnumItem* findvarp = foundp->castEnumItem(); AstEnumItem* findvarp = foundp->castEnumItem();
bool ins=false; bool ins=false;
if (!foundp) { if (!foundp) {
ins=true; ins=true;
} else if (findvarp != nodep) { } else if (findvarp != nodep) {
UINFO(4,"DupVar: "<<nodep<<" ;; "<<foundp<<endl); UINFO(4,"DupVar: "<<nodep<<" ;; "<<foundp<<endl);
if (findvarp && findvarp->user3p() == m_curVarsp) { // Only when on same level if (findvarp && findvarp->user3p()->castSymTable() == m_curVarsp) { // Only when on same level
nodep->v3error("Duplicate declaration of enum value: "<<nodep->prettyName()<<endl nodep->v3error("Duplicate declaration of enum value: "<<nodep->prettyName()<<endl
<<findvarp->warnMore()<<"... Location of original declaration"); <<findvarp->warnMore()<<"... Location of original declaration");
} else { } else {
@ -464,9 +464,9 @@ private:
if (nodep->dotted() == "") { if (nodep->dotted() == "") {
AstNodeFTask* taskp; AstNodeFTask* taskp;
if (nodep->packagep()) { if (nodep->packagep()) {
taskp = symsFind(nodep->packagep())->findIdUpward(nodep->name())->castNodeFTask(); taskp = symsFind(nodep->packagep())->findIdFallback(nodep->name())->castNodeFTask();
} else { } else {
taskp = m_curVarsp->findIdUpward(nodep->name())->castNodeFTask(); taskp = m_curVarsp->findIdFallback(nodep->name())->castNodeFTask();
} }
if (!taskp) { nodep->v3error("Can't find definition of task/function: "<<nodep->prettyName()); } if (!taskp) { nodep->v3error("Can't find definition of task/function: "<<nodep->prettyName()); }
nodep->taskp(taskp); nodep->taskp(taskp);
@ -481,7 +481,7 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_idState==ID_RESOLVE) { if (m_idState==ID_RESOLVE) {
AstNodeFTask* taskp; AstNodeFTask* taskp;
taskp = m_curVarsp->findIdUpward(nodep->name())->castNodeFTask(); taskp = m_curVarsp->findIdFallback(nodep->name())->castNodeFTask();
if (!taskp) { nodep->v3error("Can't find definition of exported task/function: "<<nodep->prettyName()); } if (!taskp) { nodep->v3error("Can't find definition of exported task/function: "<<nodep->prettyName()); }
else if (taskp->dpiExport()) { else if (taskp->dpiExport()) {
nodep->v3error("Function was already DPI Exported, duplicate not allowed: "<<nodep->prettyName()); nodep->v3error("Function was already DPI Exported, duplicate not allowed: "<<nodep->prettyName());
@ -508,7 +508,7 @@ private:
if (nodep->packagep()) { if (nodep->packagep()) {
defp = symsFind(nodep->packagep())->findIdFlat(nodep->name())->castTypedef(); defp = symsFind(nodep->packagep())->findIdFlat(nodep->name())->castTypedef();
} else { } else {
defp = m_curVarsp->findIdUpward(nodep->name())->castTypedef(); defp = m_curVarsp->findIdFallback(nodep->name())->castTypedef();
} }
if (!defp) { nodep->v3error("Can't find typedef: "<<nodep->prettyName()); } if (!defp) { nodep->v3error("Can't find typedef: "<<nodep->prettyName()); }
nodep->refDTypep(defp->subDTypep()); nodep->refDTypep(defp->subDTypep());
@ -656,7 +656,7 @@ private:
nodep->iterateChildren(*this); nodep->iterateChildren(*this);
if (m_idState==ID_PARAM) { if (m_idState==ID_PARAM) {
nodep->v3warn(DEFPARAM,"Suggest replace defparam with Verilog 2001 #(."<<nodep->name()<<"(...etc...))"); nodep->v3warn(DEFPARAM,"Suggest replace defparam with Verilog 2001 #(."<<nodep->name()<<"(...etc...))");
AstNode* foundp = m_curVarsp->findIdUpward(nodep->path()); AstNode* foundp = m_curVarsp->findIdFallback(nodep->path());
AstCell* cellp = foundp->castCell(); AstCell* cellp = foundp->castCell();
if (!cellp) { if (!cellp) {
nodep->v3error("In defparam, cell "<<nodep->path()<<" never declared"); nodep->v3error("In defparam, cell "<<nodep->path()<<" never declared");

View File

@ -195,9 +195,9 @@ private:
// Cell: Resolve its filename. If necessary, parse it. // Cell: Resolve its filename. If necessary, parse it.
if (!nodep->modp()) { if (!nodep->modp()) {
UINFO(4,"Link Cell: "<<nodep<<endl); UINFO(4,"Link Cell: "<<nodep<<endl);
// Use findIdUpward instead of findIdFlat; it doesn't matter for now // Use findIdFallback instead of findIdFlat; it doesn't matter for now
// but we might support modules-under-modules someday. // but we might support modules-under-modules someday.
AstNodeModule* modp = m_mods.findIdUpward(nodep->modName())->castNodeModule(); AstNodeModule* modp = m_mods.findIdFallback(nodep->modName())->castNodeModule();
if (!modp) { if (!modp) {
// Read-subfile // Read-subfile
// If file not found, make AstNotFoundModule, rather than error out. // If file not found, make AstNotFoundModule, rather than error out.
@ -208,7 +208,7 @@ private:
// We've read new modules, grab new pointers to their names // We've read new modules, grab new pointers to their names
readModNames(); readModNames();
// Check again // Check again
modp = m_mods.findIdUpward(nodep->modName())->castNodeModule(); modp = m_mods.findIdFallback(nodep->modName())->castNodeModule();
if (!modp) { if (!modp) {
nodep->v3error("Can't resolve module reference: "<<nodep->modName()); nodep->v3error("Can't resolve module reference: "<<nodep->modName());
} }
@ -251,20 +251,20 @@ private:
} }
if (nodep->modp()) { if (nodep->modp()) {
// Note what pins exist // Note what pins exist
V3SymTable ports; // Symbol table of all connected port names set<string> ports; // Symbol table of all connected port names
for (AstPin* pinp = nodep->pinsp(); pinp; pinp=pinp->nextp()->castPin()) { for (AstPin* pinp = nodep->pinsp(); pinp; pinp=pinp->nextp()->castPin()) {
if (pinp->name()=="") pinp->v3error("Connect by position is illegal in .* connected cells"); if (pinp->name()=="") pinp->v3error("Connect by position is illegal in .* connected cells");
if (!pinp->exprp()) pinp->v3warn(PINNOCONNECT,"Cell pin is not connected: "<<pinp->prettyName()); if (!pinp->exprp()) pinp->v3warn(PINNOCONNECT,"Cell pin is not connected: "<<pinp->prettyName());
if (!ports.findIdFlat(pinp->name())) { if (ports.find(pinp->name()) == ports.end()) {
ports.insert(pinp->name(), pinp); ports.insert(pinp->name());
} }
} }
// We search ports, rather than in/out declarations as they aren't resolved yet, // We search ports, rather than in/out declarations as they aren't resolved yet,
// and it's easier to do it now than in V3Link when we'd need to repeat steps. // and it's easier to do it now than in V3Link when we'd need to repeat steps.
for (AstNode* portnodep = nodep->modp()->stmtsp(); portnodep; portnodep=portnodep->nextp()) { for (AstNode* portnodep = nodep->modp()->stmtsp(); portnodep; portnodep=portnodep->nextp()) {
if (AstPort* portp = portnodep->castPort()) { if (AstPort* portp = portnodep->castPort()) {
if (!ports.findIdFlat(portp->name()) if (ports.find(portp->name()) == ports.end()
&& !ports.findIdFlat("__pinNumber"+cvtToStr(portp->pinNum()))) { && ports.find("__pinNumber"+cvtToStr(portp->pinNum())) == ports.end()) {
if (pinStar) { if (pinStar) {
UINFO(9," need .* PORT "<<portp<<endl); UINFO(9," need .* PORT "<<portp<<endl);
// Create any not already connected // Create any not already connected
@ -299,7 +299,7 @@ private:
// Look at all modules, and store pointers to all module names // Look at all modules, and store pointers to all module names
for (AstNodeModule* nextp,* nodep = v3Global.rootp()->modulesp(); nodep; nodep=nextp) { for (AstNodeModule* nextp,* nodep = v3Global.rootp()->modulesp(); nodep; nodep=nextp) {
nextp = nodep->nextp()->castNodeModule(); nextp = nodep->nextp()->castNodeModule();
AstNode* foundp = m_mods.findIdUpward(nodep->name()); AstNode* foundp = m_mods.findIdFallback(nodep->name());
if (foundp && foundp != nodep) { if (foundp && foundp != nodep) {
if (!(foundp->fileline()->warnIsOff(V3ErrorCode::MODDUP) || nodep->fileline()->warnIsOff(V3ErrorCode::MODDUP))) { if (!(foundp->fileline()->warnIsOff(V3ErrorCode::MODDUP) || nodep->fileline()->warnIsOff(V3ErrorCode::MODDUP))) {
nodep->v3warn(MODDUP,"Duplicate declaration of module: "<<nodep->prettyName()<<endl nodep->v3warn(MODDUP,"Duplicate declaration of module: "<<nodep->prettyName()<<endl

View File

@ -27,6 +27,14 @@
// VarXRef/Func's: // VarXRef/Func's:
// Find appropriate named cell and link to var they reference // Find appropriate named cell and link to var they reference
//************************************************************************* //*************************************************************************
// Top
// a (LinkDotCellVertex->AstCell)
// aa (LinkDotCellVertex->AstCell)
// var (AstVar) -- in syms(), not a vertex
// beg (LinkDotBeginVertex->AstBegin) -- can see "upper" a's symbol table
// a__DOT__aa (LinkDotInlineVertex->AstCellInline) -- points to a.aa's symbol table
// b (LinkDotCellVertex->AstCell)
//*************************************************************************
#include "config_build.h" #include "config_build.h"
#include "verilatedos.h" #include "verilatedos.h"
@ -65,8 +73,9 @@ public:
virtual string cellName() const = 0; virtual string cellName() const = 0;
virtual V3SymTable& syms() = 0; virtual V3SymTable& syms() = 0;
string symPrefix() const { return m_symPrefix; } string symPrefix() const { return m_symPrefix; }
void insertSubcellName(const string& name, LinkDotBaseVertex* toVertexp) { void insertSubcellName(LinkDotGraph* graphp, const string& name, LinkDotBaseVertex* toVertexp) {
m_nameToVtxMap.insert(make_pair(name,toVertexp)); m_nameToVtxMap.insert(make_pair(name, toVertexp));
new V3GraphEdge(graphp, this, toVertexp, 1, false);
} }
LinkDotBaseVertex* findSubcell(const string& name, const string& altname) { LinkDotBaseVertex* findSubcell(const string& name, const string& altname) {
// Find a vertex under this one by name. // Find a vertex under this one by name.
@ -104,27 +113,27 @@ public:
}; };
class LinkDotCellVertex : public LinkDotBaseVertex { class LinkDotCellVertex : public LinkDotBaseVertex {
// A real point in the hierarchy, corresponding to a instantiated module // A real point in the hierarchy, corresponding to an instantiated module
AstNodeModule* m_modp; // Module AstNodeModule* m_modp; // Module
AstCell* m_cellp; // Cell creating this vertex **NULL AT TOP** AstCell* m_nodep; // Cell creating this vertex **NULL AT TOP**
V3SymTable m_syms; // Symbol table of variable/task names for global lookup V3SymTable m_syms; // Symbol table of variable/task names for global lookup
public: public:
LinkDotCellVertex(V3Graph* graphp, AstCell* nodep) LinkDotCellVertex(V3Graph* graphp, AstCell* nodep)
: LinkDotBaseVertex(graphp, ""), m_modp(nodep->modp()), m_cellp(nodep) {} : LinkDotBaseVertex(graphp, ""), m_modp(nodep->modp()), m_nodep(nodep) {}
LinkDotCellVertex(V3Graph* graphp, AstNodeModule* nodep) LinkDotCellVertex(V3Graph* graphp, AstNodeModule* nodep)
: LinkDotBaseVertex(graphp, ""), m_modp(nodep), m_cellp(NULL) {} : LinkDotBaseVertex(graphp, ""), m_modp(nodep), m_nodep(NULL) {}
virtual ~LinkDotCellVertex() {} virtual ~LinkDotCellVertex() {}
AstNodeModule* modp() const { return m_modp; } // May be NULL AstNodeModule* modp() const { return m_modp; } // May be NULL
AstCell* cellp() const { return m_cellp; } // Is NULL at TOP AstCell* nodep() const { return m_nodep; } // Is NULL at TOP
virtual V3SymTable& syms() { return m_syms; } virtual V3SymTable& syms() { return m_syms; }
// We need to use origName as parameters may have renamed the modname // We need to use origName as parameters may have renamed the modname
virtual string modName() const { return (modp() ? modp()->origName() : "*NULL*"); } virtual string modName() const { return (modp() ? modp()->origName() : "*NULL*"); }
virtual string cellName() const { return (cellp() ? cellp()->origName() : "*NULL*"); } virtual string cellName() const { return (nodep() ? nodep()->origName() : "*NULL*"); }
virtual string name() const { return (string)("C:")+cellName()+" M:"+modName(); } virtual string name() const { return (string)("C:")+cellName()+" M:"+modName(); }
}; };
class LinkDotInlineVertex : public LinkDotBaseVertex { class LinkDotInlineVertex : public LinkDotBaseVertex {
// A fake point in the hierarchy, corresponding to a inlined module // A fake point in the hierarchy, corresponding to an inlined module
// This refrences to another vertex, and eventually resolves to a module with a prefix // This refrences to another vertex, and eventually resolves to a module with a prefix
string m_basename; // Name with dotteds stripped string m_basename; // Name with dotteds stripped
AstCellInline* m_cellInlinep; // Inlined cell AstCellInline* m_cellInlinep; // Inlined cell
@ -198,9 +207,6 @@ public:
UINFO(4,__FUNCTION__<<": "<<endl); UINFO(4,__FUNCTION__<<": "<<endl);
m_forPrearray = forPrearray; m_forPrearray = forPrearray;
m_forScopeCreation = forScopeCreation; m_forScopeCreation = forScopeCreation;
//VV***** We reset all userp() on each netlist!!!
AstNode::user1ClearTree();
AstNode::user2ClearTree();
} }
~LinkDotState() {} ~LinkDotState() {}
@ -221,11 +227,10 @@ public:
UINFO(9," INSERTcell "<<scopename<<" "<<nodep<<endl); UINFO(9," INSERTcell "<<scopename<<" "<<nodep<<endl);
LinkDotCellVertex* vxp = new LinkDotCellVertex(&m_graph, nodep); LinkDotCellVertex* vxp = new LinkDotCellVertex(&m_graph, nodep);
if (nodep->modp()) nodep->modp()->user1p(vxp); if (nodep->modp()) nodep->modp()->user1p(vxp);
new V3GraphEdge(&m_graph, abovep, vxp, 1, false); abovep->insertSubcellName(&m_graph, nodep->origName(), vxp);
abovep->insertSubcellName(nodep->origName(), vxp);
if (abovep != cellVxp) { if (abovep != cellVxp) {
// If it's foo_DOT_bar, we need to be able to find it under that too. // If it's foo_DOT_bar, we need to be able to find it under that too.
cellVxp->insertSubcellName(nodep->name(), vxp); cellVxp->insertSubcellName(&m_graph, nodep->name(), vxp);
} }
if (forScopeCreation()) m_nameScopeMap.insert(make_pair(scopename, vxp)); if (forScopeCreation()) m_nameScopeMap.insert(make_pair(scopename, vxp));
return vxp; return vxp;
@ -234,11 +239,10 @@ public:
AstCellInline* nodep, const string& basename) { AstCellInline* nodep, const string& basename) {
UINFO(9," INSERTcinl "<<nodep<<endl); UINFO(9," INSERTcinl "<<nodep<<endl);
LinkDotInlineVertex* vxp = new LinkDotInlineVertex(&m_graph, nodep, cellVxp, basename); LinkDotInlineVertex* vxp = new LinkDotInlineVertex(&m_graph, nodep, cellVxp, basename);
new V3GraphEdge(&m_graph, abovep, vxp, 1, false); abovep->insertSubcellName(&m_graph, basename, vxp);
abovep->insertSubcellName(basename, vxp);
if (abovep != cellVxp) { if (abovep != cellVxp) {
// If it's foo_DOT_bar, we need to be able to find it under that too. // If it's foo_DOT_bar, we need to be able to find it under that too.
cellVxp->insertSubcellName(nodep->name(), vxp); cellVxp->insertSubcellName(&m_graph, nodep->name(), vxp);
} }
return vxp; return vxp;
} }
@ -246,8 +250,7 @@ public:
AstBegin* nodep) { AstBegin* nodep) {
UINFO(9," INSERTbeg "<<nodep<<endl); UINFO(9," INSERTbeg "<<nodep<<endl);
LinkDotBeginVertex* vxp = new LinkDotBeginVertex(&m_graph, nodep, cellVxp); LinkDotBeginVertex* vxp = new LinkDotBeginVertex(&m_graph, nodep, cellVxp);
new V3GraphEdge(&m_graph, abovep, vxp, 1, false); abovep->insertSubcellName(&m_graph, nodep->name(), vxp);
abovep->insertSubcellName(nodep->name(), vxp);
return vxp; return vxp;
} }
void insertSym(LinkDotCellVertex* abovep, const string& name, AstNode* nodep) { void insertSym(LinkDotCellVertex* abovep, const string& name, AstNode* nodep) {

View File

@ -92,11 +92,11 @@ class V3ParseSym {
private: private:
// MEMBERS // MEMBERS
static int s_anonNum; // Number of next anonymous object static int s_anonNum; // Number of next anonymous object (parser use only)
V3SymTable* m_symTableNextId; // Symbol table for next lexer lookup V3SymTable* m_symTableNextId; // Symbol table for next lexer lookup (parser use only)
V3SymTable* m_symCurrentp; // Active symbol table for additions/lookups V3SymTable* m_symCurrentp; // Active symbol table for additions/lookups
V3SymTable* m_symRootp; // Root symbol table V3SymTable* m_symRootp; // Root symbol table
SymStack m_sympStack; // Stack of nodes with symbol tables SymStack m_sympStack; // Stack of upper nodes with pending symbol tables
SymStack m_symsp; // All symbol tables, to cleanup SymStack m_symsp; // All symbol tables, to cleanup
private: private:
@ -175,7 +175,7 @@ public:
} }
AstNode* findEntUpward (const string& name) { AstNode* findEntUpward (const string& name) {
// Lookup the given string as an identifier, return type of the id, scanning upward // Lookup the given string as an identifier, return type of the id, scanning upward
return symCurrentp()->findIdUpward(name); return symCurrentp()->findIdFallback(name);
} }
void import(AstNode* packagep, const string& id_or_star) { void import(AstNode* packagep, const string& id_or_star) {
// Import from package::id_or_star to this // Import from package::id_or_star to this

View File

@ -35,20 +35,20 @@
//###################################################################### //######################################################################
// Symbol table // Symbol table
class V3SymTable : public AstNUser { class V3SymTable {
// Symbol table that can have a "superior" table for resolving upper references // Symbol table that can have a "superior" table for resolving upper references
private: private:
// MEMBERS // MEMBERS
typedef std::map<string,AstNode*> IdNameMap; typedef std::map<string,AstNode*> IdNameMap;
IdNameMap m_idNameMap; // Hash of variables by name IdNameMap m_idNameMap; // Hash of variables by name
AstNode* m_ownerp; // Node that table belongs to AstNode* m_ownerp; // Node that table belongs to
V3SymTable* m_upperp; // Table "above" this one in name scope V3SymTable* m_fallbackp; // Table "above" this one in name scope
public: public:
// METHODS // METHODS
V3SymTable(AstNode* ownerp, V3SymTable* upperTablep) { V3SymTable(AstNode* ownerp, V3SymTable* upperTablep) {
m_ownerp = ownerp; m_upperp = upperTablep; } m_ownerp = ownerp; m_fallbackp = upperTablep; }
V3SymTable() { V3SymTable() {
m_ownerp = NULL; m_upperp = NULL; } m_ownerp = NULL; m_fallbackp = NULL; }
~V3SymTable() {} ~V3SymTable() {}
AstNode* ownerp() const { return m_ownerp; } AstNode* ownerp() const { return m_ownerp; }
void insert(const string& name, AstNode* nodep) { void insert(const string& name, AstNode* nodep) {
@ -78,12 +78,12 @@ class V3SymTable : public AstNUser {
if (iter != m_idNameMap.end()) return (iter->second); if (iter != m_idNameMap.end()) return (iter->second);
return NULL; return NULL;
} }
AstNode* findIdUpward(const string& name) const { AstNode* findIdFallback(const string& name) const {
// Find identifier looking upward through symbol hierarchy // Find identifier looking upward through symbol hierarchy
// First, scan this begin/end block or module for the name // First, scan this begin/end block or module for the name
if (AstNode* nodep = findIdFlat(name)) return nodep; if (AstNode* nodep = findIdFlat(name)) return nodep;
// Then scan the upper begin/end block or module for the name // Then scan the upper begin/end block or module for the name
if (m_upperp) return m_upperp->findIdUpward(name); if (m_fallbackp) return m_fallbackp->findIdFallback(name);
return NULL; return NULL;
} }
bool import(const V3SymTable* srcp, const string& id_or_star) { bool import(const V3SymTable* srcp, const string& id_or_star) {

View File

@ -538,7 +538,7 @@ word [a-zA-Z0-9_]+
"$"[a-zA-Z_$][a-zA-Z0-9_$]* { string str (yytext,yyleng); "$"[a-zA-Z_$][a-zA-Z0-9_$]* { string str (yytext,yyleng);
yylval.strp = PARSEP->newString(AstNode::encodeName(str)); yylval.strp = PARSEP->newString(AstNode::encodeName(str));
// Lookup unencoded name including the $, to avoid hitting normal signals // Lookup unencoded name including the $, to avoid hitting normal signals
if (SYMP->symCurrentp()->findIdUpward(str)) { if (SYMP->symCurrentp()->findIdFallback(str)) {
FL; return yaD_DPI; FL; return yaD_DPI;
} else { FL; RETURN_BBOX_SYS_OR_MSG("Unsupported or unknown PLI call: %s",yytext); } } else { FL; RETURN_BBOX_SYS_OR_MSG("Unsupported or unknown PLI call: %s",yytext); }
} }
@ -1120,13 +1120,13 @@ int V3ParseImp::lexToken() {
AstNode* scp; AstNode* scp;
if (V3SymTable* look_underp = SYMP->nextId()) { if (V3SymTable* look_underp = SYMP->nextId()) {
if (debugFlex()) { cout<<" lexToken: next id lookup forced under "<<look_underp<<endl; } if (debugFlex()) { cout<<" lexToken: next id lookup forced under "<<look_underp<<endl; }
scp = look_underp->findIdUpward(*(yylval.strp)); scp = look_underp->findIdFallback(*(yylval.strp));
// "consume" it. Must set again if want another token under temp scope // "consume" it. Must set again if want another token under temp scope
SYMP->nextId(NULL); SYMP->nextId(NULL);
} else { } else {
UINFO(7," lexToken: find upward "<<SYMP->symCurrentp()<<" for '"<<*(yylval.strp)<<"'"<<endl); UINFO(7," lexToken: find upward "<<SYMP->symCurrentp()<<" for '"<<*(yylval.strp)<<"'"<<endl);
//if (debug()>=9) SYMP->symCurrentp()->dump(cout," -findtree: ",true); //if (debug()>=9) SYMP->symCurrentp()->dump(cout," -findtree: ",true);
scp = SYMP->symCurrentp()->findIdUpward(*(yylval.strp)); scp = SYMP->symCurrentp()->findIdFallback(*(yylval.strp));
} }
yylval.scp = scp; yylval.scp = scp;
if (scp) { if (scp) {