mirror of
https://github.com/verilator/verilator.git
synced 2025-04-29 12:06:54 +00:00
Show file and line info when possible on internal graph errors.
This commit is contained in:
parent
d065662afc
commit
cf4bf9b7a5
@ -73,6 +73,7 @@ public:
|
||||
, m_asyncPath(false) {}
|
||||
virtual ~CdcEitherVertex() {}
|
||||
// ACCESSORS
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
AstScope* scopep() const { return m_scopep; }
|
||||
AstNode* nodep() const { return m_nodep; }
|
||||
AstSenTree* srcDomainp() const { return m_srcDomainp; }
|
||||
|
@ -172,6 +172,7 @@ public:
|
||||
// ACCESSORS
|
||||
virtual string name() const { return (cvtToStr((void*)m_nodep)+"@"+scopep()->prettyName()); }
|
||||
virtual string dotColor() const { return "yellow"; }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
AstNode* nodep() const { return m_nodep; }
|
||||
AstActive* activep() const { return m_activep; }
|
||||
bool slow() const { return m_slow; }
|
||||
|
@ -118,6 +118,23 @@ uint32_t V3GraphVertex::outHash() const {
|
||||
return hash;
|
||||
}
|
||||
|
||||
void V3GraphVertex::v3errorEnd(std::ostringstream& str) const {
|
||||
std::ostringstream nsstr;
|
||||
nsstr<<str.str();
|
||||
if (debug()) {
|
||||
nsstr<<endl;
|
||||
nsstr<<"-vertex: "<<this<<endl;
|
||||
}
|
||||
if (!fileline()) {
|
||||
V3Error::v3errorEnd(nsstr);
|
||||
} else {
|
||||
fileline()->v3errorEnd(nsstr);
|
||||
}
|
||||
}
|
||||
void V3GraphVertex::v3errorEndFatal(std::ostringstream& str) const {
|
||||
v3errorEnd(str); assert(0);
|
||||
}
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, V3GraphVertex* vertexp) {
|
||||
os<<" VERTEX="<<vertexp->name();
|
||||
if (vertexp->rank()) os<<" r"<<vertexp->rank();
|
||||
|
@ -217,6 +217,7 @@ public:
|
||||
virtual string dotStyle() const { return ""; }
|
||||
virtual string dotName() const { return ""; }
|
||||
virtual uint32_t rankAdder() const { return 1; }
|
||||
virtual FileLine* fileline() const { return NULL; } // NULL for unknown
|
||||
virtual int sortCmp(const V3GraphVertex* rhsp) const {
|
||||
// LHS goes first if of lower rank, or lower fanout
|
||||
if (m_rank < rhsp->m_rank) return -1;
|
||||
@ -249,6 +250,8 @@ public:
|
||||
// METHODS
|
||||
/// Edges are routed around this vertex to point from "from" directly to "to"
|
||||
void rerouteEdges(V3Graph* graphp);
|
||||
void v3errorEnd(std::ostringstream& str) const;
|
||||
void v3errorEndFatal(std::ostringstream& str) const;
|
||||
};
|
||||
|
||||
std::ostream& operator<<(std::ostream& os, V3GraphVertex* vertexp);
|
||||
|
@ -56,6 +56,7 @@ public:
|
||||
bool isDelete() const { return m_deleted; }
|
||||
virtual string name() const { return m_origVertexp->name(); }
|
||||
virtual string dotColor() const { return m_origVertexp->dotColor(); }
|
||||
virtual FileLine* fileline() const { return m_origVertexp->fileline(); }
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
|
@ -532,7 +532,7 @@ double V3Graph::orderDFSIterate(V3GraphVertex* vertexp) {
|
||||
// Compute fanouts of each node
|
||||
// If forward edge, don't double count that fanout
|
||||
if (vertexp->user() == 2) return vertexp->fanout(); // Already processed it
|
||||
if (vertexp->user() == 1) v3fatalSrc("Loop found, backward edges should be dead");
|
||||
if (vertexp->user() == 1) vertexp->v3fatalSrc("Loop found, backward edges should be dead");
|
||||
vertexp->user(1);
|
||||
double fanout = 0;
|
||||
for (V3GraphEdge* edgep = vertexp->outBeginp(); edgep; edgep = edgep->outNextp()) {
|
||||
|
@ -62,6 +62,7 @@ public:
|
||||
virtual ~LinkCellsVertex() {}
|
||||
AstNodeModule* modp() const { return m_modp; }
|
||||
virtual string name() const { return modp()->name(); }
|
||||
virtual FileLine* fileline() const { return modp()->fileline(); }
|
||||
// Recursive modules get space for maximum recursion
|
||||
virtual uint32_t rankAdder() const { return m_modp->recursiveClone() ? (1+v3Global.opt.moduleRecursionDepth()) : 1; }
|
||||
};
|
||||
|
@ -222,6 +222,7 @@ public:
|
||||
virtual ~OrderVarVertex() {}
|
||||
virtual OrderVarVertex* clone (V3Graph* graphp) const = 0;
|
||||
virtual OrderVEdgeType type() const = 0;
|
||||
virtual FileLine* fileline() const { return varScp()->fileline(); }
|
||||
// ACCESSORS
|
||||
AstVarScope* varScp() const { return m_varScp; }
|
||||
void isClock(bool flag) { m_isClock=flag; }
|
||||
@ -328,11 +329,12 @@ public:
|
||||
// METHODS
|
||||
virtual OrderVEdgeType type() const { return OrderVEdgeType::VERTEX_MOVE; }
|
||||
virtual string dotColor() const {
|
||||
if (logicp()) {
|
||||
return logicp()->dotColor();
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
if (logicp()) return logicp()->dotColor();
|
||||
else return "";
|
||||
}
|
||||
virtual FileLine* fileline() const {
|
||||
if (logicp()) return logicp()->fileline();
|
||||
else return NULL;
|
||||
}
|
||||
virtual string name() const {
|
||||
string nm;
|
||||
|
@ -117,6 +117,7 @@ protected:
|
||||
return m_nodep->name();
|
||||
}
|
||||
}
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
public:
|
||||
virtual AstNode* nodep() const { return m_nodep; }
|
||||
};
|
||||
|
@ -73,6 +73,7 @@ public:
|
||||
AstNodeFTask* nodep() const { return m_nodep; }
|
||||
virtual string name() const { return nodep()->name(); }
|
||||
virtual string dotColor() const { return pure() ? "black" : "red"; }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
AstCFunc* cFuncp() const { return m_cFuncp; }
|
||||
void cFuncp(AstCFunc* nodep) { m_cFuncp=nodep; }
|
||||
};
|
||||
|
@ -115,6 +115,7 @@ public:
|
||||
AstCFunc* nodep() const { return m_nodep; }
|
||||
virtual string name() const { return nodep()->name(); }
|
||||
virtual string dotColor() const { return "yellow"; }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
};
|
||||
|
||||
class TraceTraceVertex : public V3GraphVertex {
|
||||
@ -128,6 +129,7 @@ public:
|
||||
AstTraceInc* nodep() const { return m_nodep; }
|
||||
virtual string name() const { return nodep()->declp()->name(); }
|
||||
virtual string dotColor() const { return "red"; }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
TraceTraceVertex* duplicatep() const { return m_duplicatep; }
|
||||
void duplicatep(TraceTraceVertex* dupp) {
|
||||
if (duplicatep()) nodep()->v3fatalSrc("Assigning duplicatep() to already duplicated node");
|
||||
@ -144,6 +146,7 @@ public:
|
||||
AstVarScope* nodep() const { return m_nodep; }
|
||||
virtual string name() const { return nodep()->name(); }
|
||||
virtual string dotColor() const { return "skyblue"; }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
};
|
||||
|
||||
//######################################################################
|
||||
|
@ -108,6 +108,7 @@ public:
|
||||
:feedsTri() ? "blue" : "lightblue")
|
||||
: (isTristate() ? "darkgreen"
|
||||
:feedsTri() ? "green" : "lightgreen")); }
|
||||
virtual FileLine* fileline() const { return nodep()->fileline(); }
|
||||
void isTristate(bool flag) { m_isTristate = flag; }
|
||||
bool isTristate() const { return m_isTristate; }
|
||||
void feedsTri(bool flag) { m_feedsTri = flag; }
|
||||
|
Loading…
Reference in New Issue
Block a user