Add --dump-treei-<srcfile>, bug894.
This commit is contained in:
parent
486d69da5f
commit
0ee5743853
2
Changes
2
Changes
|
@ -9,6 +9,8 @@ indicates the contributor was also the author of the fix; Thanks!
|
|||
|
||||
*** Add --clk and related optimizations, msg1533. [Jie Xu]
|
||||
|
||||
**** Add --dump-treei-<srcfile>, bug894. [Jie Xu]
|
||||
|
||||
**** Fix comma-instantiations with parameters, bug884. [Franck Jullien]
|
||||
|
||||
**** Fix SystemC arrayed bit vectors, bug886. [David Poole]
|
||||
|
|
|
@ -263,6 +263,7 @@ descriptions in the next sections for more information.
|
|||
+define+<var>=<value> Set preprocessor define
|
||||
--dump-tree Enable dumping .tree files
|
||||
--dump-treei <level> Enable dumping .tree files at a level
|
||||
--dump-treei-<srcfile> <level> Enable dumping .tree file at a source file at a level
|
||||
-E Preprocess, but do not compile
|
||||
--error-limit <value> Abort after this number of errors
|
||||
--exe Link to create executable
|
||||
|
@ -592,7 +593,7 @@ alias for GCC compatibility.
|
|||
Select the debug built image of Verilator (if available), and enable more
|
||||
internal assertions (equivelent to C<--debug-check>), debugging messages
|
||||
(equivelent to C<--debugi 4>), and intermediate form dump files (equivilent
|
||||
to C<--dump-tree>).
|
||||
to C<--dump-treei 3>).
|
||||
|
||||
=item --debug-check
|
||||
|
||||
|
@ -645,8 +646,12 @@ large and not desired.
|
|||
|
||||
=item --dump-treei <level>
|
||||
|
||||
Rarely needed. Enable writing .tree debug files with a specific dumping
|
||||
level, 0 disbles dumps and is equivalent to "--no-dump-tree". Level 9
|
||||
=item --dump-treei-<srcfile> <level>
|
||||
|
||||
Rarely needed - for developer use. Set internal tree dumping level
|
||||
globally to a specific dumping level or set the specified Verilator source
|
||||
file to the specified tree dumping level (e.g. C<--dump-treei-V3Order 9>).
|
||||
Level 0 disbles dumps and is equivalent to "--no-dump-tree". Level 9
|
||||
enables dumping of every stage.
|
||||
|
||||
=item -E
|
||||
|
|
|
@ -436,4 +436,5 @@ public:
|
|||
void V3Active::activeAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ActiveVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("active.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -160,4 +160,5 @@ public:
|
|||
void V3ActiveTop::activeTopAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ActiveTopVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("activetop.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -337,4 +337,5 @@ public:
|
|||
void V3Assert::assertAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
AssertVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("assert.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -137,4 +137,5 @@ public:
|
|||
void V3AssertPre::assertPreAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
AssertPreVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("assertpre.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -1013,7 +1013,7 @@ void AstNode::dumpTreeAndNext(ostream& os, const string& indent, int maxDepth) {
|
|||
}
|
||||
|
||||
void AstNode::dumpTreeFile(const string& filename, bool append, bool doDump) {
|
||||
if (v3Global.opt.dumpTree() && doDump) {
|
||||
if (doDump) {
|
||||
{ // Write log & close
|
||||
UINFO(2,"Dumping "<<filename<<endl);
|
||||
const auto_ptr<ofstream> logsp (V3File::new_ofstream(filename, append));
|
||||
|
|
|
@ -271,4 +271,5 @@ void V3Begin::debeginAll(AstNetlist* nodep) {
|
|||
if (state.anyFuncInBegin()) {
|
||||
BeginRelinkVisitor brvisitor (nodep,&state);
|
||||
}
|
||||
V3Global::dumpCheckGlobalTree("begin.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -491,6 +491,7 @@ public:
|
|||
void V3Case::caseAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CaseVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("case.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
void V3Case::caseLint(AstNodeCase* nodep) {
|
||||
UINFO(4,__FUNCTION__<<": "<<endl);
|
||||
|
|
|
@ -188,4 +188,5 @@ public:
|
|||
void V3Cast::castAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CastVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("cast.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -252,4 +252,5 @@ void V3Changed::changedAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ChangedState state;
|
||||
ChangedVisitor visitor (nodep, &state);
|
||||
V3Global::dumpCheckGlobalTree("changed.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -292,4 +292,5 @@ public:
|
|||
void V3Clean::cleanAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CleanVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("clean.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -914,4 +914,5 @@ void V3ClkGater::clkGaterAll(AstNetlist* nodep) {
|
|||
// While the gater does well at some modules, it seems to slow down many others
|
||||
UINFO(5,"ClkGater is disabled due to performance issues\n");
|
||||
//GaterVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("clkgater.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -407,4 +407,5 @@ public:
|
|||
void V3Clock::clockAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ClockVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("clock.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -474,4 +474,5 @@ public:
|
|||
void V3Combine::combineAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CombineVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("combine.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -2383,12 +2383,14 @@ void V3Const::constifyAllLint(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ConstVisitor visitor (ConstVisitor::PROC_V_WARN);
|
||||
(void)visitor.mainAcceptEdit(nodep);
|
||||
V3Global::dumpCheckGlobalTree("const.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
void V3Const::constifyCpp(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ConstVisitor visitor (ConstVisitor::PROC_CPP);
|
||||
(void)visitor.mainAcceptEdit(nodep);
|
||||
V3Global::dumpCheckGlobalTree("const_cpp.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
AstNode* V3Const::constifyEdit(AstNode* nodep) {
|
||||
|
@ -2404,6 +2406,7 @@ void V3Const::constifyAllLive(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ConstVisitor visitor (ConstVisitor::PROC_LIVE);
|
||||
(void)visitor.mainAcceptEdit(nodep);
|
||||
V3Global::dumpCheckGlobalTree("const.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
void V3Const::constifyAll(AstNetlist* nodep) {
|
||||
|
@ -2411,6 +2414,7 @@ void V3Const::constifyAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ConstVisitor visitor (ConstVisitor::PROC_V_EXPENSIVE);
|
||||
(void)visitor.mainAcceptEdit(nodep);
|
||||
V3Global::dumpCheckGlobalTree("const.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
AstNode* V3Const::constifyExpensiveEdit(AstNode* nodep) {
|
||||
|
|
|
@ -395,4 +395,5 @@ public:
|
|||
void V3Coverage::coverage(AstNetlist* rootp) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CoverageVisitor visitor (rootp);
|
||||
V3Global::dumpCheckGlobalTree("coverage.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -135,4 +135,5 @@ public:
|
|||
void V3CoverageJoin::coverageJoin(AstNetlist* rootp) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
CoverageJoinVisitor visitor (rootp);
|
||||
V3Global::dumpCheckGlobalTree("coveragejoin.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -291,12 +291,15 @@ public:
|
|||
void V3Dead::deadifyModules(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DeadVisitor visitor (nodep, false, false);
|
||||
V3Global::dumpCheckGlobalTree("deadModules.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
void V3Dead::deadifyDTypes(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DeadVisitor visitor (nodep, false, true);
|
||||
V3Global::dumpCheckGlobalTree("deadDType.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
void V3Dead::deadifyAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DeadVisitor visitor (nodep, true, true);
|
||||
V3Global::dumpCheckGlobalTree("deadAll.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -471,4 +471,5 @@ public:
|
|||
void V3Delayed::delayedAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DelayedVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("delayed.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -175,4 +175,5 @@ public:
|
|||
void V3Depth::depthAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DepthVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("depth.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -140,4 +140,5 @@ public:
|
|||
void V3DepthBlock::depthBlockAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DepthBlockVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("deepblock.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -262,4 +262,5 @@ public:
|
|||
void V3Descope::descopeAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
DescopeVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("descope.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -937,4 +937,5 @@ public:
|
|||
void V3Expand::expandAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ExpandVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("expand.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -1266,4 +1266,5 @@ void V3Gate::gateAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
GateVisitor visitor (nodep);
|
||||
GateDeassignVisitor deassign (nodep);
|
||||
V3Global::dumpCheckGlobalTree("gate.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -228,4 +228,5 @@ public:
|
|||
void V3GenClk::genClkAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
GenClkReadVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("genclk.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -563,4 +563,5 @@ void V3Inline::inlineAll(AstNetlist* nodep) {
|
|||
modp->unlinkFrBack()->deleteTree(); modp=NULL;
|
||||
}
|
||||
}
|
||||
V3Global::dumpCheckGlobalTree("inline.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -322,9 +322,11 @@ AstAssignW* V3Inst::pinReconnectSimple(AstPin* pinp, AstCell* cellp, AstNodeModu
|
|||
void V3Inst::instAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
InstVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("inst.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
void V3Inst::dearrayAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
InstDeVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("dearray.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -515,4 +515,5 @@ void V3Life::lifeAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
LifeState state;
|
||||
LifeTopVisitor visitor (nodep, &state);
|
||||
V3Global::dumpCheckGlobalTree("life.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -193,4 +193,5 @@ void V3LifePost::lifepostAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
// Mark redundant AssignPost
|
||||
LifePostDlyVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("life_post.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -35,13 +35,21 @@ private:
|
|||
static void linkDotGuts(AstNetlist* nodep, VLinkDotStep step);
|
||||
public:
|
||||
static void linkDotPrimary(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_PRIMARY); }
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_PRIMARY);
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
static void linkDotParamed(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_PARAMED); }
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_PARAMED);
|
||||
V3Global::dumpCheckGlobalTree("paramlink.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
static void linkDotArrayed(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_ARRAYED); }
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_ARRAYED);
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
static void linkDotScope(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_SCOPED); }
|
||||
UINFO(2,__FUNCTION__<<": "<<endl); linkDotGuts(nodep,LDS_SCOPED);
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // Guard
|
||||
|
|
|
@ -263,4 +263,5 @@ public:
|
|||
void V3LinkJump::linkJump(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
LinkJumpVisitor bvisitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("link.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -269,6 +269,7 @@ public:
|
|||
void V3LinkLValue::linkLValue(AstNetlist* rootp) {
|
||||
UINFO(4,__FUNCTION__<<": "<<endl);
|
||||
LinkLValueVisitor visitor(rootp, false);
|
||||
V3Global::dumpCheckGlobalTree("linklvalue.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
void V3LinkLValue::linkLValueSet(AstNode* nodep) {
|
||||
// Called by later link functions when it is known a node needs
|
||||
|
|
|
@ -80,6 +80,7 @@ void V3LinkLevel::modSortByLevel() {
|
|||
v3Global.rootp()->addModulep(nodep);
|
||||
}
|
||||
UINFO(9,"modSortByLevel() done\n"); // Comment required for gcc4.6.3 / bug666
|
||||
V3Global::dumpCheckGlobalTree("cells.tree", false, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
//######################################################################
|
||||
|
|
|
@ -369,4 +369,5 @@ public:
|
|||
void V3LinkParse::linkParse(AstNetlist* rootp) {
|
||||
UINFO(4,__FUNCTION__<<": "<<endl);
|
||||
LinkParseVisitor visitor(rootp);
|
||||
V3Global::dumpCheckGlobalTree("linkparse.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -462,4 +462,5 @@ void V3LinkResolve::linkResolve(AstNetlist* rootp) {
|
|||
UINFO(4,__FUNCTION__<<": "<<endl);
|
||||
LinkResolveVisitor visitor(rootp);
|
||||
LinkBotupVisitor visitorb(rootp);
|
||||
V3Global::dumpCheckGlobalTree("linkresolve.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -250,4 +250,5 @@ void V3Localize::localizeAll(AstNetlist* nodep) {
|
|||
LocalizeVisitor visitor (nodep);
|
||||
// Fix up hiernames
|
||||
LocalizeDehierVisitor dvisitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("localize.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -149,4 +149,5 @@ public:
|
|||
void V3Name::nameAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
NameVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("name.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -734,6 +734,11 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc, char
|
|||
shift;
|
||||
m_dumpTree = atoi(argv[i]);
|
||||
}
|
||||
else if ( !strncmp (sw, "-dump-treei-", strlen("-dump-treei-"))) {
|
||||
const char* src = sw+strlen("-dump-treei-");
|
||||
shift;
|
||||
setDumpTreeLevel(src, atoi(argv[i]));
|
||||
}
|
||||
else if ( !strcmp (sw, "-error-limit") && (i+1)<argc ) {
|
||||
shift;
|
||||
V3Error::errorLimit(atoi(argv[i]));
|
||||
|
@ -1199,7 +1204,7 @@ V3Options::~V3Options() {
|
|||
|
||||
void V3Options::setDebugMode(int level) {
|
||||
V3Error::debugDefault(level);
|
||||
if (!m_dumpTree) m_dumpTree = true; // Don't override if already set.
|
||||
if (!m_dumpTree) m_dumpTree = 3; // Don't override if already set.
|
||||
m_stats = true;
|
||||
m_debugCheck = true;
|
||||
cout << "Starting "<<version()<<endl;
|
||||
|
@ -1226,6 +1231,27 @@ int V3Options::debugSrcLevel(const string& srcfile_path, int default_level) {
|
|||
}
|
||||
}
|
||||
|
||||
void V3Options::setDumpTreeLevel(const string& srcfile, int level) {
|
||||
DebugSrcMap::iterator iter = m_dumpTrees.find(srcfile);
|
||||
if (iter!=m_dumpTrees.end()) {
|
||||
iter->second = level;
|
||||
} else {
|
||||
m_dumpTrees.insert(make_pair(srcfile,level));
|
||||
}
|
||||
}
|
||||
|
||||
int V3Options::dumpTreeLevel(const string& srcfile_path) {
|
||||
// For simplicity, calling functions can just use __FILE__ for srcfile.
|
||||
// That means though we need to cleanup the filename from ../Foo.cpp -> Foo
|
||||
string srcfile = V3Os::filenameNonDirExt(srcfile_path);
|
||||
DebugSrcMap::iterator iter = m_dumpTrees.find(srcfile);
|
||||
if (iter!=m_dumpTrees.end()) {
|
||||
return iter->second;
|
||||
} else {
|
||||
return m_dumpTree;
|
||||
}
|
||||
}
|
||||
|
||||
void V3Options::optimize(int level) {
|
||||
// Set all optimizations to on/off
|
||||
bool flag = level > 0;
|
||||
|
|
|
@ -57,6 +57,7 @@ class V3Options {
|
|||
V3StringSet m_noClockers; // argument: Verilog -noclk signals
|
||||
V3StringList m_vFiles; // argument: Verilog files to read
|
||||
DebugSrcMap m_debugSrcs; // argument: --debugi-<srcfile>=<level>
|
||||
DebugSrcMap m_dumpTrees; // argument: --dump-treei-<srcfile>=<level>
|
||||
|
||||
bool m_preprocOnly; // main switch: -E
|
||||
bool m_makeDepend; // main switch: -MMD
|
||||
|
@ -180,6 +181,8 @@ class V3Options {
|
|||
void setDebugMode(int level);
|
||||
void setDebugSrcLevel(const string& srcfile, int level);
|
||||
int debugSrcLevel(const string& srcfile, int default_level=V3Error::debugDefault());
|
||||
void setDumpTreeLevel(const string& srcfile, int level);
|
||||
int dumpTreeLevel(const string& srcfile);
|
||||
|
||||
// METHODS
|
||||
void addCppFile(const string& filename);
|
||||
|
|
|
@ -1660,4 +1660,5 @@ void V3Order::orderAll(AstNetlist* nodep) {
|
|||
OrderClkMarkVisitor markVisitor(nodep);
|
||||
OrderVisitor visitor;
|
||||
visitor.main(nodep);
|
||||
V3Global::dumpCheckGlobalTree("order.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -570,4 +570,5 @@ void ParamVisitor::visitCell(AstCell* nodep) {
|
|||
void V3Param::param(AstNetlist* rootp) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ParamVisitor visitor (rootp);
|
||||
V3Global::dumpCheckGlobalTree("param.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -403,4 +403,5 @@ public:
|
|||
void V3Premit::premitAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
PremitVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("premit.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -416,4 +416,5 @@ void V3Scope::scopeAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
ScopeVisitor visitor (nodep);
|
||||
ScopeCleanupVisitor cleanVisitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("scope.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -501,4 +501,5 @@ public:
|
|||
void V3Slice::sliceAll(AstNetlist* rootp) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
SliceVisitor visitor(rootp);
|
||||
V3Global::dumpCheckGlobalTree("slices.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -578,8 +578,10 @@ public:
|
|||
void V3Split::splitReorderAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
SplitVisitor visitor (nodep, true);
|
||||
V3Global::dumpCheckGlobalTree("reorder.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
void V3Split::splitAlwaysAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
SplitVisitor visitor (nodep, false);
|
||||
V3Global::dumpCheckGlobalTree("split.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -216,4 +216,5 @@ public:
|
|||
void V3SplitAs::splitAsAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
SplitAsVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("splitas.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -401,4 +401,5 @@ public:
|
|||
void V3Subst::substituteAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
SubstVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("subst.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -466,4 +466,5 @@ void TableSimulateVisitor::varRefCb(AstVarRef* nodep) {
|
|||
void V3Table::tableAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
TableVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("table.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -1294,4 +1294,5 @@ void V3Task::taskAll(AstNetlist* nodep) {
|
|||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
TaskStateVisitor visitors (nodep);
|
||||
TaskVisitor visitor (nodep, &visitors);
|
||||
V3Global::dumpCheckGlobalTree("task.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -709,4 +709,5 @@ public:
|
|||
void V3Trace::traceAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
TraceVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("trace.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -329,4 +329,5 @@ public:
|
|||
void V3TraceDecl::traceDeclAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
TraceDeclVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("tracedecl.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -1323,4 +1323,5 @@ public:
|
|||
void V3Tristate::tristateAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
TristateVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("tristate.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -475,4 +475,5 @@ public:
|
|||
void V3Unknown::unknownAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
UnknownVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("unknown.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
|
|
@ -463,6 +463,7 @@ public:
|
|||
void V3Unroll::unrollAll(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
UnrollVisitor visitor (nodep, false, "");
|
||||
V3Global::dumpCheckGlobalTree("unroll.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
void V3Unroll::unrollGen(AstNodeFor* nodep, string beginName) {
|
||||
|
|
|
@ -3483,6 +3483,7 @@ void V3Width::width(AstNetlist* nodep) {
|
|||
(void)visitor.mainAcceptEdit(nodep);
|
||||
WidthRemoveVisitor rvisitor;
|
||||
(void)rvisitor.mainAcceptEdit(nodep);
|
||||
V3Global::dumpCheckGlobalTree("width.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
}
|
||||
|
||||
//! Single node parameter propagation
|
||||
|
@ -3520,4 +3521,5 @@ AstNode* V3Width::widthGenerateParamsEdit(
|
|||
void V3Width::widthCommit(AstNetlist* nodep) {
|
||||
UINFO(2,__FUNCTION__<<": "<<endl);
|
||||
WidthCommitVisitor visitor (nodep);
|
||||
V3Global::dumpCheckGlobalTree("widthcommit.tree", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 6);
|
||||
}
|
||||
|
|
|
@ -149,30 +149,22 @@ void V3Global::dumpCheckGlobalTree(const string& filename, int newNumber, bool d
|
|||
//######################################################################
|
||||
|
||||
void process () {
|
||||
bool dumpMore = (v3Global.opt.dumpTree() >= 9);
|
||||
|
||||
// Sort modules by level so later algorithms don't need to care
|
||||
V3LinkLevel::modSortByLevel();
|
||||
V3Global::dumpCheckGlobalTree("cells.tree");
|
||||
V3Error::abortIfErrors();
|
||||
|
||||
// Convert parseref's to varrefs, and other directly post parsing fixups
|
||||
V3LinkParse::linkParse(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("linkparse.tree", 0, dumpMore);
|
||||
// Cross-link signal names
|
||||
// Cross-link dotted hierarchical references
|
||||
V3LinkDot::linkDotPrimary(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree", 0, dumpMore);
|
||||
v3Global.checkTree(); // Force a check, as link is most likely place for problems
|
||||
// Correct state we couldn't know at parse time, repair SEL's
|
||||
V3LinkResolve::linkResolve(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("linkresolve.tree", 0, dumpMore);
|
||||
// Set Lvalue's in variable refs
|
||||
V3LinkLValue::linkLValue(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("linklvalue.tree", 0, dumpMore);
|
||||
// Convert return/continue/disable to jumps
|
||||
V3LinkJump::linkJump(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("link.tree");
|
||||
V3Error::abortIfErrors();
|
||||
|
||||
if (v3Global.opt.stats()) V3Stats::statsStageAll(v3Global.rootp(), "Link");
|
||||
|
@ -180,19 +172,15 @@ void process () {
|
|||
// Remove parameters by cloning modules to de-parameterized versions
|
||||
// This requires some width calculations and constant propagation
|
||||
V3Param::param(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("param.tree", 0, dumpMore);
|
||||
V3LinkDot::linkDotParamed(v3Global.rootp()); // Cleanup as made new modules
|
||||
V3Global::dumpCheckGlobalTree("paramlink.tree");
|
||||
V3Error::abortIfErrors();
|
||||
|
||||
// Remove any modules that were parameterized and are no longer referenced.
|
||||
V3Dead::deadifyModules(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("dead.tree", 0, dumpMore);
|
||||
v3Global.checkTree();
|
||||
|
||||
// Calculate and check widths, edit tree to TRUNC/EXTRACT any width mismatches
|
||||
V3Width::width(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("width.tree");
|
||||
|
||||
V3Error::abortIfErrors();
|
||||
|
||||
|
@ -200,19 +188,16 @@ void process () {
|
|||
V3Width::widthCommit(v3Global.rootp());
|
||||
v3Global.assertDTypesResolved(true);
|
||||
v3Global.assertWidthsMatch(true);
|
||||
V3Global::dumpCheckGlobalTree("widthcommit.tree", 0, dumpMore);
|
||||
|
||||
// Coverage insertion
|
||||
// Before we do dead code elimination and inlining, or we'll lose it.
|
||||
if (v3Global.opt.coverage()) {
|
||||
V3Coverage::coverage(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("coverage.tree");
|
||||
}
|
||||
|
||||
// Push constants, but only true constants preserving liveness
|
||||
// so V3Undriven sees variables to be eliminated, ie "if (0 && foo) ..."
|
||||
V3Const::constifyAllLive(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Signal based lint checks, no change to structures
|
||||
// Must be before first constification pass drops dead code
|
||||
|
@ -221,10 +206,8 @@ void process () {
|
|||
// Assertion insertion
|
||||
// After we've added block coverage, but before other nasty transforms
|
||||
V3AssertPre::assertPreAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("assertpre.tree");
|
||||
//
|
||||
V3Assert::assertAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("assert.tree");
|
||||
|
||||
if (!v3Global.opt.xmlOnly()) {
|
||||
// Add top level wrapper with instance pointing to old top
|
||||
|
@ -235,39 +218,32 @@ void process () {
|
|||
|
||||
// Propagate constants into expressions
|
||||
V3Const::constifyAllLint(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
if (!v3Global.opt.xmlOnly()) {
|
||||
// Remove cell arrays (must be between V3Width and scoping)
|
||||
V3Inst::dearrayAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("dearray.tree", 0, dumpMore);
|
||||
}
|
||||
|
||||
if (!v3Global.opt.xmlOnly()) {
|
||||
// Expand inouts, stage 2
|
||||
// Also simplify pin connections to always be AssignWs in prep for V3Unknown
|
||||
V3Tristate::tristateAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("tristate.tree");
|
||||
|
||||
// Task inlining & pushing BEGINs names to variables/cells
|
||||
// Begin processing must be after Param, before module inlining
|
||||
V3Begin::debeginAll(v3Global.rootp()); // Flatten cell names, before inliner
|
||||
V3Global::dumpCheckGlobalTree("begin.tree");
|
||||
|
||||
// Move assignments from X into MODULE temps.
|
||||
// (Before flattening, so each new X variable is shared between all scopes of that module.)
|
||||
V3Unknown::unknownAll(v3Global.rootp());
|
||||
v3Global.constRemoveXs(true);
|
||||
V3Global::dumpCheckGlobalTree("unknown.tree");
|
||||
|
||||
// Module inlining
|
||||
// Cannot remove dead variables after this, as alias information for final
|
||||
// V3Scope's V3LinkDot is in the AstVar.
|
||||
if (v3Global.opt.oInline()) {
|
||||
V3Inline::inlineAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("inline.tree");
|
||||
V3LinkDot::linkDotArrayed(v3Global.rootp()); // Cleanup as made new modules
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree", 0, dumpMore);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -275,11 +251,9 @@ void process () {
|
|||
|
||||
// Initial const/dead to reduce work for ordering code
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
v3Global.checkTree();
|
||||
|
||||
V3Dead::deadifyDTypes(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
v3Global.checkTree();
|
||||
|
||||
V3Error::abortIfErrors();
|
||||
|
@ -292,17 +266,13 @@ void process () {
|
|||
|
||||
// Convert instantiations to wassigns and always blocks
|
||||
V3Inst::instAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("inst.tree");
|
||||
|
||||
// Inst may have made lots of concats; fix them
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Flatten hierarchy, creating a SCOPE for each module's usage as a cell
|
||||
V3Scope::scopeAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("scope.tree");
|
||||
V3LinkDot::linkDotScope(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("linkdot.tree");
|
||||
}
|
||||
|
||||
//--SCOPE BASED OPTIMIZATIONS--------------
|
||||
|
@ -310,87 +280,69 @@ void process () {
|
|||
if (!v3Global.opt.xmlOnly()) {
|
||||
// Cleanup
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
V3Dead::deadifyDTypes(v3Global.rootp());
|
||||
v3Global.checkTree();
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Convert case statements to if() blocks. Must be after V3Unknown
|
||||
// Must be before V3Task so don't need to deal with task in case value compares
|
||||
V3Case::caseAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("case.tree");
|
||||
|
||||
// Inline all tasks
|
||||
V3Task::taskAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("task.tree");
|
||||
|
||||
// Add __PVT's
|
||||
// After V3Task so task internal variables will get renamed
|
||||
V3Name::nameAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("name.tree", 0, dumpMore);
|
||||
|
||||
// Loop unrolling & convert FORs to WHILEs
|
||||
V3Unroll::unrollAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("unroll.tree");
|
||||
|
||||
// Expand slices of arrays
|
||||
V3Slice::sliceAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("slices.tree");
|
||||
|
||||
// Push constants across variables and remove redundant assignments
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
if (v3Global.opt.oLife()) {
|
||||
V3Life::lifeAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("life.tree");
|
||||
}
|
||||
|
||||
// Make large low-fanin logic blocks into lookup tables
|
||||
// This should probably be done much later, once we have common logic elimination.
|
||||
if (!v3Global.opt.lintOnly() && v3Global.opt.oTable()) {
|
||||
V3Table::tableAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("table.tree");
|
||||
}
|
||||
|
||||
// Cleanup
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
V3Dead::deadifyDTypes(v3Global.rootp());
|
||||
v3Global.checkTree();
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Detect clock enables and mode into sensitives, and split always based on clocks
|
||||
// (so this is a good prelude to splitAlways.)
|
||||
if (v3Global.opt.oFlopGater()) {
|
||||
V3ClkGater::clkGaterAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("clkgater.tree");
|
||||
}
|
||||
|
||||
// Move assignments/sensitives into a SBLOCK for each unique sensitivity list
|
||||
// (May convert some ALWAYS to combo blocks, so should be before V3Gate step.)
|
||||
V3Active::activeAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("active.tree");
|
||||
|
||||
// Split single ALWAYS blocks into multiple blocks for better ordering chances
|
||||
if (v3Global.opt.oSplit()) {
|
||||
V3Split::splitAlwaysAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("split.tree", 0, dumpMore);
|
||||
}
|
||||
V3SplitAs::splitAsAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("splitas.tree");
|
||||
|
||||
// Create tracing sample points, before we start eliminating signals
|
||||
if (v3Global.opt.trace()) {
|
||||
V3TraceDecl::traceDeclAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("tracedecl.tree");
|
||||
}
|
||||
|
||||
// Gate-based logic elimination; eliminate signals and push constant across cell boundaries
|
||||
// Instant propagation makes lots-o-constant reduction possibilities.
|
||||
if (v3Global.opt.oGate()) {
|
||||
V3Gate::gateAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("gate.tree");
|
||||
// V3Gate calls constant propagation itself.
|
||||
} else {
|
||||
v3info("Command Line disabled gate optimization with -Og/-O0. This may cause ordering problems.");
|
||||
|
@ -399,14 +351,11 @@ void process () {
|
|||
// Combine COVERINCs with duplicate terms
|
||||
if (v3Global.opt.coverage()) {
|
||||
V3CoverageJoin::coverageJoin(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("coveragejoin.tree");
|
||||
}
|
||||
|
||||
// Remove unused vars
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
V3Dead::deadifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Clock domain crossing analysis
|
||||
if (v3Global.opt.cdc()) {
|
||||
|
@ -418,32 +367,26 @@ void process () {
|
|||
// Reorder assignments in pipelined blocks
|
||||
if (v3Global.opt.oReorder()) {
|
||||
V3Split::splitReorderAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("reorder.tree");
|
||||
}
|
||||
|
||||
// Create delayed assignments
|
||||
// This creates lots of duplicate ACTIVES so ActiveTop needs to be after this step
|
||||
V3Delayed::delayedAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("delayed.tree");
|
||||
|
||||
// Make Active's on the top level
|
||||
// Differs from V3Active, because identical clocks may be pushed down to a module and now be identical
|
||||
V3ActiveTop::activeTopAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("activetop.tree");
|
||||
|
||||
if (v3Global.opt.stats()) V3Stats::statsStageAll(v3Global.rootp(), "PreOrder");
|
||||
|
||||
// Order the code; form SBLOCKs and BLOCKCALLs
|
||||
V3Order::orderAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("order.tree");
|
||||
|
||||
// Change generated clocks to look at delayed signals
|
||||
V3GenClk::genClkAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("genclk.tree");
|
||||
|
||||
// Convert sense lists into IF statements.
|
||||
V3Clock::clockAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("clock.tree");
|
||||
|
||||
// Cleanup any dly vars or other temps that are simple assignments
|
||||
// Life must be done before Subst, as it assumes each CFunc under _eval is called only once.
|
||||
|
@ -454,33 +397,25 @@ void process () {
|
|||
if (v3Global.opt.oLifePost()) {
|
||||
V3LifePost::lifepostAll(v3Global.rootp());
|
||||
}
|
||||
if (v3Global.opt.oLife() || v3Global.opt.oLifePost()) {
|
||||
V3Global::dumpCheckGlobalTree("life.tree");
|
||||
}
|
||||
|
||||
// Remove unused vars
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
V3Dead::deadifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Detect change loop
|
||||
V3Changed::changedAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("changed.tree");
|
||||
|
||||
// Create tracing logic, since we ripped out some signals the user might want to trace
|
||||
// Note past this point, we presume traced variables won't move between CFuncs
|
||||
// (It's OK if untraced temporaries move around, or vars "effectively" activate the same way.)
|
||||
if (v3Global.opt.trace()) {
|
||||
V3Trace::traceAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("trace.tree");
|
||||
}
|
||||
|
||||
if (v3Global.opt.stats()) V3Stats::statsStageAll(v3Global.rootp(), "Scoped");
|
||||
|
||||
// Remove scopes; make varrefs/funccalls relative to current module
|
||||
V3Descope::descopeAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("descope.tree");
|
||||
}
|
||||
|
||||
//--MODULE OPTIMIZATIONS--------------
|
||||
|
@ -489,19 +424,16 @@ void process () {
|
|||
// Split deep blocks to appease MSVC++. Must be before Localize.
|
||||
if (!v3Global.opt.lintOnly() && v3Global.opt.compLimitBlocks()) {
|
||||
V3DepthBlock::depthBlockAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("deepblock.tree");
|
||||
}
|
||||
|
||||
// Move BLOCKTEMPS from class to local variables
|
||||
if (v3Global.opt.oLocalize()) {
|
||||
V3Localize::localizeAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("localize.tree", 0, dumpMore);
|
||||
}
|
||||
|
||||
// Icache packing; combine common code in each module's functions into subroutines
|
||||
if (v3Global.opt.oCombine()) {
|
||||
V3Combine::combineAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("combine.tree");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -512,9 +444,7 @@ void process () {
|
|||
if (!v3Global.opt.xmlOnly()) {
|
||||
// Remove unused vars
|
||||
V3Const::constifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const_predead.tree", 0, dumpMore);
|
||||
V3Dead::deadifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
|
||||
// Here down, widthMin() is the Verilog width, and width() is the C++ width
|
||||
// Bits between widthMin() and width() are irrelevant, but may be non zero.
|
||||
|
@ -522,18 +452,15 @@ void process () {
|
|||
|
||||
// Make all math operations either 8, 16, 32 or 64 bits
|
||||
V3Clean::cleanAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("clean.tree");
|
||||
|
||||
// Move wide constants to BLOCK temps.
|
||||
V3Premit::premitAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("premit.tree");
|
||||
}
|
||||
|
||||
// Expand macros and wide operators into C++ primitives
|
||||
if (!v3Global.opt.xmlOnly()
|
||||
&& v3Global.opt.oExpand()) {
|
||||
V3Expand::expandAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("expand.tree");
|
||||
}
|
||||
|
||||
// Propagate constants across WORDSEL arrayed temporaries
|
||||
|
@ -541,18 +468,14 @@ void process () {
|
|||
&& v3Global.opt.oSubst()) {
|
||||
// Constant folding of expanded stuff
|
||||
V3Const::constifyCpp(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("const.tree");
|
||||
V3Subst::substituteAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("subst.tree");
|
||||
}
|
||||
if (!v3Global.opt.xmlOnly()
|
||||
&& v3Global.opt.oSubstConst()) {
|
||||
// Constant folding of substitutions
|
||||
V3Const::constifyCpp(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("constc.tree", 0, dumpMore);
|
||||
|
||||
V3Dead::deadifyAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("dead.tree");
|
||||
}
|
||||
|
||||
if (!v3Global.opt.lintOnly()
|
||||
|
@ -560,7 +483,6 @@ void process () {
|
|||
// Fix very deep expressions
|
||||
// Mark evaluation functions as member functions, if needed.
|
||||
V3Depth::depthAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("depth.tree", 0, dumpMore);
|
||||
|
||||
// Branch prediction
|
||||
V3Branch::branchAll(v3Global.rootp());
|
||||
|
@ -568,7 +490,6 @@ void process () {
|
|||
// Add C casts when longs need to become long-long and vice-versa
|
||||
// Note depth may insert something needing a cast, so this must be last.
|
||||
V3Cast::castAll(v3Global.rootp());
|
||||
V3Global::dumpCheckGlobalTree("cast.tree");
|
||||
}
|
||||
|
||||
V3Error::abortIfErrors();
|
||||
|
@ -674,7 +595,7 @@ int main(int argc, char** argv, char** env) {
|
|||
}
|
||||
|
||||
// Final steps
|
||||
V3Global::dumpCheckGlobalTree("final.tree",990);
|
||||
V3Global::dumpCheckGlobalTree("final.tree", 990, v3Global.opt.dumpTreeLevel(__FILE__) >= 3);
|
||||
V3Error::abortIfWarnings();
|
||||
|
||||
if (!v3Global.opt.lintOnly() && !v3Global.opt.cdc()
|
||||
|
|
Loading…
Reference in New Issue