From 6ab3d8f3ed9e3ba69dcc918a54d43f378f7775dc Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Tue, 5 May 2020 19:12:36 -0400 Subject: [PATCH] Internals: Refactor to add AstNodeProcedure. No functional change intended. --- src/V3ActiveTop.cpp | 8 +------- src/V3Ast.h | 14 ++++++++++++++ src/V3AstNodes.h | 45 ++++++++++++++++----------------------------- src/V3Life.cpp | 10 +--------- src/V3LinkParse.cpp | 3 +-- src/V3Scope.cpp | 24 +++--------------------- 6 files changed, 36 insertions(+), 68 deletions(-) diff --git a/src/V3ActiveTop.cpp b/src/V3ActiveTop.cpp index e7548a7c5..4a5f8ffe7 100644 --- a/src/V3ActiveTop.cpp +++ b/src/V3ActiveTop.cpp @@ -108,7 +108,7 @@ private: // No need to do statements under it, they're already moved. // iterateChildren(nodep); } - virtual void visit(AstInitial* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE + virtual void visit(AstNodeProcedure* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE nodep->v3fatalSrc("Node should have been under ACTIVE"); } virtual void visit(AstAssignAlias* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE @@ -117,15 +117,9 @@ private: virtual void visit(AstAssignW* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE nodep->v3fatalSrc("Node should have been under ACTIVE"); } - virtual void visit(AstAlways* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE - nodep->v3fatalSrc("Node should have been under ACTIVE"); - } virtual void visit(AstAlwaysPublic* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE nodep->v3fatalSrc("Node should have been under ACTIVE"); } - virtual void visit(AstFinal* nodep) VL_OVERRIDE { // LCOV_EXCL_LINE - nodep->v3fatalSrc("Node should have been deleted"); - } //-------------------- virtual void visit(AstNodeMath*) VL_OVERRIDE {} // Accelerate virtual void visit(AstVarScope*) VL_OVERRIDE {} // Accelerate diff --git a/src/V3Ast.h b/src/V3Ast.h index ae501831e..0383f6d9d 100644 --- a/src/V3Ast.h +++ b/src/V3Ast.h @@ -2090,6 +2090,20 @@ public: virtual bool same(const AstNode*) const { return true; } }; +class AstNodeProcedure : public AstNode { + // IEEE procedure: initial, final, always +public: + AstNodeProcedure(AstType t, FileLine* fl, AstNode* bodysp) + : AstNode(t, fl) { + addNOp2p(bodysp); + } + ASTNODE_BASE_FUNCS(NodeProcedure) + // METHODS + AstNode* bodysp() const { return op2p(); } // op2 = Statements to evaluate + void addStmtp(AstNode* nodep) { addOp2p(nodep); } + bool isJustOneBodyStmt() const { return bodysp() && !bodysp()->nextp(); } +}; + class AstNodeStmt : public AstNode { // Statement -- anything that's directly under a function bool m_statement; // Really a statement (e.g. not a function with return) diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index f113607b7..420deba68 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -3076,25 +3076,34 @@ public: bool hasCombo() const; // Includes a COMBO SenItem }; -class AstAlways : public AstNode { +class AstFinal : public AstNodeProcedure { +public: + AstFinal(FileLine* fl, AstNode* bodysp) + : ASTGEN_SUPER(fl, bodysp) {} + ASTNODE_NODE_FUNCS(Final) +}; + +class AstInitial : public AstNodeProcedure { +public: + AstInitial(FileLine* fl, AstNode* bodysp) + : ASTGEN_SUPER(fl, bodysp) {} + ASTNODE_NODE_FUNCS(Initial) +}; + +class AstAlways : public AstNodeProcedure { VAlwaysKwd m_keyword; public: AstAlways(FileLine* fl, VAlwaysKwd keyword, AstSenTree* sensesp, AstNode* bodysp) - : ASTGEN_SUPER(fl) + : ASTGEN_SUPER(fl, bodysp) , m_keyword(keyword) { addNOp1p(sensesp); - addNOp2p(bodysp); } ASTNODE_NODE_FUNCS(Always) // virtual void dump(std::ostream& str) const; AstSenTree* sensesp() const { return VN_CAST(op1p(), SenTree); } // op1 = Sensitivity list - AstNode* bodysp() const { return op2p(); } // op2 = Statements to evaluate - void addStmtp(AstNode* nodep) { addOp2p(nodep); } VAlwaysKwd keyword() const { return m_keyword; } - // Special accessors - bool isJustOneBodyStmt() const { return bodysp() && !bodysp()->nextp(); } }; class AstAlwaysPublic : public AstNodeStmt { @@ -4433,28 +4442,6 @@ public: void joinType(const VJoinType& flag) { m_joinType = flag; } }; -class AstInitial : public AstNode { -public: - AstInitial(FileLine* fl, AstNode* bodysp) - : ASTGEN_SUPER(fl) { - addNOp1p(bodysp); - } - ASTNODE_NODE_FUNCS(Initial) - AstNode* bodysp() const { return op1p(); } // op1 = Expressions to evaluate - // Special accessors - bool isJustOneBodyStmt() const { return bodysp() && !bodysp()->nextp(); } -}; - -class AstFinal : public AstNode { -public: - AstFinal(FileLine* fl, AstNode* bodysp) - : ASTGEN_SUPER(fl) { - addNOp1p(bodysp); - } - ASTNODE_NODE_FUNCS(Final) - AstNode* bodysp() const { return op1p(); } // op1 = Expressions to evaluate -}; - class AstInside : public AstNodeMath { public: AstInside(FileLine* fl, AstNode* exprp, AstNode* itemsp) diff --git a/src/V3Life.cpp b/src/V3Life.cpp index f8788bafe..fdad0d2e2 100644 --- a/src/V3Life.cpp +++ b/src/V3Life.cpp @@ -476,15 +476,7 @@ private: LifeVisitor visitor(nodep, m_statep); } } - virtual void visit(AstAlways* nodep) VL_OVERRIDE { - // Usage model 2: Cleanup basic blocks - LifeVisitor visitor(nodep, m_statep); - } - virtual void visit(AstInitial* nodep) VL_OVERRIDE { - // Usage model 2: Cleanup basic blocks - LifeVisitor visitor(nodep, m_statep); - } - virtual void visit(AstFinal* nodep) VL_OVERRIDE { + virtual void visit(AstNodeProcedure* nodep) VL_OVERRIDE { // Usage model 2: Cleanup basic blocks LifeVisitor visitor(nodep, m_statep); } diff --git a/src/V3LinkParse.cpp b/src/V3LinkParse.cpp index ad875a432..51051876e 100644 --- a/src/V3LinkParse.cpp +++ b/src/V3LinkParse.cpp @@ -463,8 +463,7 @@ private: iterateChildren(nodep); m_valueModp = upperValueModp; } - virtual void visit(AstInitial* nodep) VL_OVERRIDE { visitIterateNoValueMod(nodep); } - virtual void visit(AstFinal* nodep) VL_OVERRIDE { visitIterateNoValueMod(nodep); } + virtual void visit(AstNodeProcedure* nodep) VL_OVERRIDE { visitIterateNoValueMod(nodep); } virtual void visit(AstAlways* nodep) VL_OVERRIDE { m_inAlways = true; visitIterateNoValueMod(nodep); diff --git a/src/V3Scope.cpp b/src/V3Scope.cpp index 4ce1a1485..cfd04dca6 100644 --- a/src/V3Scope.cpp +++ b/src/V3Scope.cpp @@ -192,18 +192,10 @@ private: virtual void visit(AstActive* nodep) VL_OVERRIDE { nodep->v3fatalSrc("Actives now made after scoping"); } - virtual void visit(AstInitial* nodep) VL_OVERRIDE { + virtual void visit(AstNodeProcedure* nodep) VL_OVERRIDE { // Add to list of blocks under this scope UINFO(4, " Move " << nodep << endl); - AstInitial* clonep = nodep->cloneTree(false); - nodep->user2p(clonep); - m_scopep->addActivep(clonep); - iterateChildren(clonep); // We iterate under the *clone* - } - virtual void visit(AstFinal* nodep) VL_OVERRIDE { - // Add to list of blocks under this scope - UINFO(4, " Move " << nodep << endl); - AstFinal* clonep = nodep->cloneTree(false); + AstNode* clonep = nodep->cloneTree(false); nodep->user2p(clonep); m_scopep->addActivep(clonep); iterateChildren(clonep); // We iterate under the *clone* @@ -232,14 +224,6 @@ private: m_scopep->addActivep(clonep); iterateChildren(clonep); // We iterate under the *clone* } - virtual void visit(AstAlways* nodep) VL_OVERRIDE { - // Add to list of blocks under this scope - UINFO(4, " Move " << nodep << endl); - AstNode* clonep = nodep->cloneTree(false); - nodep->user2p(clonep); - m_scopep->addActivep(clonep); - iterateChildren(clonep); // We iterate under the *clone* - } virtual void visit(AstAlwaysPublic* nodep) VL_OVERRIDE { // Add to list of blocks under this scope UINFO(4, " Move " << nodep << endl); @@ -380,12 +364,10 @@ private: } } - virtual void visit(AstInitial* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } - virtual void visit(AstFinal* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } + virtual void visit(AstNodeProcedure* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstAssignAlias* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstAssignVarScope* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstAssignW* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } - virtual void visit(AstAlways* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstAlwaysPublic* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstCoverToggle* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); } virtual void visit(AstNodeFTask* nodep) VL_OVERRIDE { movedDeleteOrIterate(nodep); }