From e77e8fe9272c38f1ecb0579a93547b48850c99a5 Mon Sep 17 00:00:00 2001 From: Yutetsu TAKATSUKASA Date: Sun, 16 Feb 2020 15:36:23 +0900 Subject: [PATCH] simple optimization to just check a module with split variables --- src/V3SplitVar.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/V3SplitVar.cpp b/src/V3SplitVar.cpp index 403bbb6d5..73c617f89 100644 --- a/src/V3SplitVar.cpp +++ b/src/V3SplitVar.cpp @@ -323,6 +323,8 @@ class SplitUnpackedVarVisitor : public AstNVisitor { AstNode* m_context; bool m_inFTask; size_t m_numSplit; + // List for SplitPackedVarVisitor + vl_unordered_set m_modulesForPackedSplit; static AstVarRef* isTargetVref(AstNode* nodep) { if (AstVarRef* refp = VN_CAST(nodep, VarRef)) { @@ -439,6 +441,8 @@ class SplitUnpackedVarVisitor : public AstNVisitor { if (!cannotSplitReason(nodep)) { m_refs.registerVar(nodep); UINFO(4, nodep->name() << " is added to candidate list.\n"); + } else { // For SplitPackedVarVisitor + m_modulesForPackedSplit.insert(m_modp); } } virtual void visit(AstVarRef* nodep) VL_OVERRIDE { @@ -627,6 +631,8 @@ class SplitUnpackedVarVisitor : public AstNVisitor { if (!(varp->isFuncLocal() || varp->isFuncReturn())) // AssignW will be created, so just once connectPort(varp, vars, NULL); varp->attrSplitVar(!cannotSplitPackedVarReason(varp)); + if (varp->attrSplitVar()) + m_modulesForPackedSplit.insert(m_modp); } else { pushDeletep(varp->unlinkFrBack()); } @@ -659,6 +665,7 @@ public: UASSERT(m_refs.empty(), "Don't forget to call split()"); V3Stats::addStat("SplitVar, Split unpacked arrays", m_numSplit); } + const vl_unordered_set& getModulesWithPackedVar() const { return m_modulesForPackedSplit; } VL_DEBUG_FUNC; // Declare debug() // Check if the passed variable can be split. @@ -1057,11 +1064,16 @@ class SplitPackedVarVisitor : public AstNVisitor { } public: - explicit SplitPackedVarVisitor(AstNetlist* nodep) + SplitPackedVarVisitor(AstNetlist* nodep, const vl_unordered_set& modules) : m_netp(nodep) , m_modp(NULL) , m_numSplit(0) { - iterate(nodep); + for (vl_unordered_set::const_iterator it = modules.begin(), + it_end = modules.end(); + it != it_end; + ++it) { + iterate(*it); + } } ~SplitPackedVarVisitor() { UASSERT(m_refs.empty(), "Don't forget to call split()"); @@ -1100,9 +1112,13 @@ static const char* cannotSplitPackedVarReason(const AstVar* varp) { void V3SplitVar::splitVariable(AstNetlist* nodep) { UINFO(2, __FUNCTION__ << ": " << endl); - { SplitUnpackedVarVisitor visitor(nodep); } + vl_unordered_set modules; + { + SplitUnpackedVarVisitor visitor(nodep); + modules = visitor.getModulesWithPackedVar(); + } V3Global::dumpCheckGlobalTree("split_var", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 9); - { SplitPackedVarVisitor visitor(nodep); } + { SplitPackedVarVisitor visitor(nodep, modules); } V3Global::dumpCheckGlobalTree("split_var", 0, v3Global.opt.dumpTreeLevel(__FILE__) >= 9); }