mirror of
https://github.com/verilator/verilator.git
synced 2024-12-29 10:47:34 +00:00
Internals: Some V3LinkCells debug improvements. No functional change.
This commit is contained in:
parent
5021989cb6
commit
a51e26e62d
@ -56,7 +56,7 @@ public:
|
|||||||
, m_modp{modp} {}
|
, m_modp{modp} {}
|
||||||
~LinkCellsVertex() override = default;
|
~LinkCellsVertex() override = default;
|
||||||
AstNodeModule* modp() const VL_MT_STABLE { return m_modp; }
|
AstNodeModule* modp() const VL_MT_STABLE { return m_modp; }
|
||||||
string name() const override VL_MT_STABLE { return modp()->name(); }
|
string name() const override VL_MT_STABLE { return cvtToHex(modp()) + ' ' + modp()->name(); }
|
||||||
FileLine* fileline() const override { return modp()->fileline(); }
|
FileLine* fileline() const override { return modp()->fileline(); }
|
||||||
// Recursive modules get space for maximum recursion
|
// Recursive modules get space for maximum recursion
|
||||||
uint32_t rankAdder() const override {
|
uint32_t rankAdder() const override {
|
||||||
@ -124,6 +124,10 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
if (!nodep->user1p()) nodep->user1p(new LinkCellsVertex{&m_graph, nodep});
|
if (!nodep->user1p()) nodep->user1p(new LinkCellsVertex{&m_graph, nodep});
|
||||||
return nodep->user1u().toGraphVertex();
|
return nodep->user1u().toGraphVertex();
|
||||||
}
|
}
|
||||||
|
void newEdge(V3GraphVertex* fromp, V3GraphVertex* top, int weight, bool cuttable) {
|
||||||
|
UINFO(9, "newEdge " << fromp->name() << " -> " << top->name() << endl);
|
||||||
|
new V3GraphEdge{&m_graph, fromp, top, weight, cuttable};
|
||||||
|
}
|
||||||
|
|
||||||
AstNodeModule* findModuleSym(const string& modName) {
|
AstNodeModule* findModuleSym(const string& modName) {
|
||||||
const VSymEnt* const foundp = m_mods.rootp()->findIdFallback(modName);
|
const VSymEnt* const foundp = m_mods.rootp()->findIdFallback(modName);
|
||||||
@ -184,7 +188,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
VL_RESTORER(m_modp);
|
VL_RESTORER(m_modp);
|
||||||
{
|
{
|
||||||
// For nested modules/classes, child below parent
|
// For nested modules/classes, child below parent
|
||||||
if (m_modp) new V3GraphEdge{&m_graph, vertex(m_modp), vertex(nodep), 1};
|
if (m_modp) newEdge(vertex(m_modp), vertex(nodep), 1, false);
|
||||||
//
|
//
|
||||||
m_modp = nodep;
|
m_modp = nodep;
|
||||||
UINFO(4, "Link Module: " << nodep << endl);
|
UINFO(4, "Link Module: " << nodep << endl);
|
||||||
@ -216,7 +220,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
// Put under a fake vertex so that the graph ranking won't indicate
|
// Put under a fake vertex so that the graph ranking won't indicate
|
||||||
// this is a top level module
|
// this is a top level module
|
||||||
if (!m_libVertexp) m_libVertexp = new LibraryVertex{&m_graph};
|
if (!m_libVertexp) m_libVertexp = new LibraryVertex{&m_graph};
|
||||||
new V3GraphEdge{&m_graph, m_libVertexp, vertex(nodep), 1, false};
|
newEdge(m_libVertexp, vertex(nodep), 1, false);
|
||||||
}
|
}
|
||||||
// Note AstBind also has iteration on cells
|
// Note AstBind also has iteration on cells
|
||||||
iterateChildren(nodep);
|
iterateChildren(nodep);
|
||||||
@ -233,7 +237,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
if (modp) {
|
if (modp) {
|
||||||
if (VN_IS(modp, Iface)) {
|
if (VN_IS(modp, Iface)) {
|
||||||
// Track module depths, so can sort list from parent down to children
|
// Track module depths, so can sort list from parent down to children
|
||||||
new V3GraphEdge{&m_graph, vertex(m_modp), vertex(modp), 1, false};
|
newEdge(vertex(m_modp), vertex(modp), 1, false);
|
||||||
if (!nodep->cellp()) nodep->ifacep(VN_AS(modp, Iface));
|
if (!nodep->cellp()) nodep->ifacep(VN_AS(modp, Iface));
|
||||||
} else if (VN_IS(modp, NotFoundModule)) { // Will error out later
|
} else if (VN_IS(modp, NotFoundModule)) { // Will error out later
|
||||||
} else {
|
} else {
|
||||||
@ -279,7 +283,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new V3GraphEdge{&m_graph, vertex(m_modp), vertex(nodep->packagep()), 1, false};
|
newEdge(vertex(m_modp), vertex(nodep->packagep()), 1, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void visit(AstBind* nodep) override {
|
void visit(AstBind* nodep) override {
|
||||||
@ -349,8 +353,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
// user1 etc will retain its pre-clone value
|
// user1 etc will retain its pre-clone value
|
||||||
cellmodp->user2p(otherModp);
|
cellmodp->user2p(otherModp);
|
||||||
v3Global.rootp()->addModulesp(otherModp);
|
v3Global.rootp()->addModulesp(otherModp);
|
||||||
new V3GraphEdge{&m_graph, vertex(cellmodp), vertex(otherModp), 1,
|
newEdge(vertex(cellmodp), vertex(otherModp), 1, false);
|
||||||
false};
|
|
||||||
}
|
}
|
||||||
cellmodp = otherModp;
|
cellmodp = otherModp;
|
||||||
nodep->modp(cellmodp);
|
nodep->modp(cellmodp);
|
||||||
@ -363,7 +366,7 @@ class LinkCellsVisitor final : public VNVisitor {
|
|||||||
} else { // Non-recursive
|
} else { // Non-recursive
|
||||||
// Track module depths, so can sort list from parent down to children
|
// Track module depths, so can sort list from parent down to children
|
||||||
nodep->modp(cellmodp);
|
nodep->modp(cellmodp);
|
||||||
new V3GraphEdge{&m_graph, vertex(m_modp), vertex(cellmodp), 1, false};
|
newEdge(vertex(m_modp), vertex(cellmodp), 1, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3134,7 +3134,6 @@ class LinkDotResolveVisitor final : public VNVisitor {
|
|||||||
if (m_ds.m_dotText != "") m_ds.m_dotText += "." + nodep->name();
|
if (m_ds.m_dotText != "") m_ds.m_dotText += "." + nodep->name();
|
||||||
ok = m_ds.m_dotPos == DP_SCOPE || m_ds.m_dotPos == DP_FIRST;
|
ok = m_ds.m_dotPos == DP_SCOPE || m_ds.m_dotPos == DP_FIRST;
|
||||||
} else if (const AstNodeFTask* const ftaskp = VN_CAST(foundp->nodep(), NodeFTask)) {
|
} else if (const AstNodeFTask* const ftaskp = VN_CAST(foundp->nodep(), NodeFTask)) {
|
||||||
|
|
||||||
if (!ftaskp->isFunction() || ftaskp->classMethod()) {
|
if (!ftaskp->isFunction() || ftaskp->classMethod()) {
|
||||||
ok = m_ds.m_dotPos == DP_NONE;
|
ok = m_ds.m_dotPos == DP_NONE;
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
Loading…
Reference in New Issue
Block a user