From e334740dd68f7c21e0d86284e703c096f5c98e4d Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sun, 2 Jan 2022 12:35:44 -0500 Subject: [PATCH] Add AstInitialAutomatic as prep for static class members --- src/V3AstNodes.h | 9 +++++++++ src/V3Cdc.cpp | 1 + src/V3EmitV.cpp | 3 +++ src/V3LinkParse.cpp | 6 +++++- src/V3LinkResolve.cpp | 2 +- src/V3Order.cpp | 3 +++ src/V3SplitVar.cpp | 2 ++ src/V3Task.cpp | 6 +++--- 8 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index 4328e391a..2a7d55839 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -3401,6 +3401,15 @@ public: ASTNODE_NODE_FUNCS(Initial) }; +class AstInitialAutomatic final : public AstNodeProcedure { + // initial for automatic variables + // That is, it runs every function start, or class construction +public: + AstInitialAutomatic(FileLine* fl, AstNode* bodysp) + : ASTGEN_SUPER_InitialAutomatic(fl, bodysp) {} + ASTNODE_NODE_FUNCS(InitialAutomatic) +}; + class AstAlways final : public AstNodeProcedure { const VAlwaysKwd m_keyword; diff --git a/src/V3Cdc.cpp b/src/V3Cdc.cpp index 6ab8d3023..0dc6b57f0 100644 --- a/src/V3Cdc.cpp +++ b/src/V3Cdc.cpp @@ -715,6 +715,7 @@ private: // Ignores virtual void visit(AstInitial*) override {} + virtual void visit(AstInitialAutomatic*) override {} virtual void visit(AstTraceDecl*) override {} virtual void visit(AstCoverToggle*) override {} virtual void visit(AstNodeDType*) override {} diff --git a/src/V3EmitV.cpp b/src/V3EmitV.cpp index 49774cf52..cdeb69856 100644 --- a/src/V3EmitV.cpp +++ b/src/V3EmitV.cpp @@ -99,6 +99,9 @@ class EmitVBaseVisitor VL_NOT_FINAL : public EmitCBaseVisitor { iterateChildren(nodep); putqs(nodep, "end\n"); } + virtual void visit(AstInitialAutomatic* nodep) override { + iterateChildren(nodep); + } virtual void visit(AstAlways* nodep) override { putfs(nodep, "always "); if (m_sensesp) { diff --git a/src/V3LinkParse.cpp b/src/V3LinkParse.cpp index 890900cf9..1da77a3dc 100644 --- a/src/V3LinkParse.cpp +++ b/src/V3LinkParse.cpp @@ -272,7 +272,11 @@ private: auto* const assp = new AstAssign(newfl, new AstVarRef(newfl, nodep->name(), VAccess::WRITE), nodep->valuep()->unlinkFrBack()); - nodep->addNextHere(new AstInitial(newfl, assp)); + if (nodep->lifetime().isAutomatic()) { + nodep->addNextHere(new AstInitialAutomatic{newfl, assp}); + } else { + nodep->addNextHere(new AstInitial{newfl, assp}); + } } // 4. Under blocks, it's an initial value to be under an assign else { nodep->addNextHere(new AstAssign(fl, diff --git a/src/V3LinkResolve.cpp b/src/V3LinkResolve.cpp index 7068332f9..9f5d13977 100644 --- a/src/V3LinkResolve.cpp +++ b/src/V3LinkResolve.cpp @@ -80,7 +80,7 @@ private: iterateChildren(nodep); } } - virtual void visit(AstInitial* nodep) override { + virtual void visit(AstInitialAutomatic* nodep) override { iterateChildren(nodep); // Initial assignments under function/tasks can just be simple // assignments without the initial diff --git a/src/V3Order.cpp b/src/V3Order.cpp index 3ec715f06..eecf337c9 100644 --- a/src/V3Order.cpp +++ b/src/V3Order.cpp @@ -644,6 +644,9 @@ class OrderBuildVisitor final : public AstNVisitor { virtual void visit(AstInitial* nodep) override { // iterateLogic(nodep); } + virtual void visit(AstInitialAutomatic* nodep) override { // + iterateLogic(nodep); + } virtual void visit(AstAlways* nodep) override { // iterateLogic(nodep); } diff --git a/src/V3SplitVar.cpp b/src/V3SplitVar.cpp index fa6dc7196..9d309f437 100644 --- a/src/V3SplitVar.cpp +++ b/src/V3SplitVar.cpp @@ -217,6 +217,8 @@ struct SplitVarImpl { insertBeginCore(ap, stmtp, modp); } else if (AstInitial* const ap = VN_CAST(backp, Initial)) { insertBeginCore(ap, stmtp, modp); + } else if (auto* const ap = VN_CAST(backp, Initial)) { + insertBeginCore(ap, stmtp, modp); } } diff --git a/src/V3Task.cpp b/src/V3Task.cpp index ba38b8566..03da101b7 100644 --- a/src/V3Task.cpp +++ b/src/V3Task.cpp @@ -112,7 +112,7 @@ private: AstClass* m_classp = nullptr; // Current class V3Graph m_callGraph; // Task call graph TaskBaseVertex* m_curVxp; // Current vertex we're adding to - std::vector m_initialps; // Initial blocks to move + std::vector m_initialps; // Initial blocks to move public: // METHODS @@ -246,7 +246,7 @@ private: iterateChildren(nodep); } UASSERT_OBJ(m_ctorp, nodep, "class constructor missing"); // LinkDot always makes it - for (AstInitial* initialp : m_initialps) { + for (AstInitialAutomatic* initialp : m_initialps) { if (AstNode* const newp = initialp->bodysp()) { newp->unlinkFrBackWithNext(); if (!m_ctorp->stmtsp()) { @@ -261,7 +261,7 @@ private: m_ctorp = nullptr; m_classp = nullptr; } - virtual void visit(AstInitial* nodep) override { + virtual void visit(AstInitialAutomatic* nodep) override { m_initialps.push_back(nodep); iterateChildren(nodep); }