From d16619fe8645a51e748c606ff04e9f27b0098ed0 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Thu, 15 Sep 2022 19:43:56 +0100 Subject: [PATCH] astgen: Explicitly generate AstNode members Generate boilerplate members of AstNode sub-types directly via astgen. This is in preparation for generating additional members. --- src/V3Ast.h | 38 +---- src/V3AstNodeDType.h | 52 +++--- src/V3AstNodeMath.h | 387 ++++++++++++++++++++++--------------------- src/V3AstNodeOther.h | 375 ++++++++++++++++++++--------------------- src/V3AstNodes.cpp | 2 +- src/astgen | 82 +++++++-- 6 files changed, 488 insertions(+), 448 deletions(-) diff --git a/src/V3Ast.h b/src/V3Ast.h index 86d4a324f..ff3cce31b 100644 --- a/src/V3Ast.h +++ b/src/V3Ast.h @@ -2391,36 +2391,14 @@ inline AstNode* VNVisitor::iterateSubtreeReturnEdits(AstNode* nodep) { return nodep->iterateSubtreeReturnEdits(*this); } -// ###################################################################### -// Standard defines for all AstNode subclasses - -#define ASTNODE_BASE_FUNCS(name) \ - virtual ~Ast##name() override = default; \ - static Ast##name* cloneTreeNull(Ast##name* nodep, bool cloneNextLink) { \ - return nodep ? nodep->cloneTree(cloneNextLink) : nullptr; \ - } \ - Ast##name* cloneTree(bool cloneNext) { \ - return static_cast(AstNode::cloneTree(cloneNext)); \ - } \ - Ast##name* clonep() const { return static_cast(AstNode::clonep()); } - -#define ASTNODE_NODE_FUNCS_NO_DTOR(name) \ - virtual void accept(VNVisitor& v) override { v.visit(this); } \ - virtual AstNode* clone() override { return new Ast##name{*this}; } \ - static Ast##name* cloneTreeNull(Ast##name* nodep, bool cloneNextLink) { \ - return nodep ? nodep->cloneTree(cloneNextLink) : nullptr; \ - } \ - Ast##name* cloneTree(bool cloneNext) { \ - return static_cast(AstNode::cloneTree(cloneNext)); \ - } \ - Ast##name* clonep() const { return static_cast(AstNode::clonep()); } - -#define ASTNODE_NODE_FUNCS(name) \ - virtual ~Ast##name() override = default; \ - ASTNODE_NODE_FUNCS_NO_DTOR(name) - -// Macros generated by 'astgen' -#include "V3AstNodes__gen_macros.h" +// Include macros generated by 'astgen'. These include ASTGEN_MEMBERS_ +// for each AstNode sub-type, and ASTGEN_SUPER_ for concrete final +// AstNode sub-types. The generated members include boilerplate methods related +// to cloning, visitor dispatch, and other functionality. ASTGEN_SUPER_ +// is the necessary constructor invocation for concrete AstNode sub-types +// that passes the generated type-id numbers all the way back to AstNode. +// For precise details please read the generated macros. +#include "V3Ast__gen_macros.h" // AstNode subclasses #include "V3AstNodeDType.h" diff --git a/src/V3AstNodeDType.h b/src/V3AstNodeDType.h index 9066caeed..3615650af 100644 --- a/src/V3AstNodeDType.h +++ b/src/V3AstNodeDType.h @@ -50,7 +50,7 @@ protected: : AstNode{t, fl} {} public: - ASTNODE_BASE_FUNCS(NodeDType) + ASTGEN_MEMBERS_NodeDType; // ACCESSORS virtual void dump(std::ostream& str) const override; virtual void dumpSmall(std::ostream& str) const; @@ -142,7 +142,7 @@ protected: : AstNodeDType{t, fl} {} public: - ASTNODE_BASE_FUNCS(NodeArrayDType) + ASTGEN_MEMBERS_NodeArrayDType; virtual void dump(std::ostream& str) const override; virtual void dumpSmall(std::ostream& str) const override; virtual const char* broken() const override { @@ -215,7 +215,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeUOrStructDType) + ASTGEN_MEMBERS_NodeUOrStructDType; int uniqueNum() const { return m_uniqueNum; } virtual const char* broken() const override; virtual void dump(std::ostream& str) const override; @@ -276,7 +276,7 @@ public: addNOp1p(rangep); addNOp2p(initp); } - ASTNODE_NODE_FUNCS(EnumItem) + ASTGEN_MEMBERS_EnumItem; virtual string name() const override { return m_name; } virtual bool maybePointedTo() const override { return true; } virtual bool hasDType() const override { return true; } @@ -310,7 +310,7 @@ public: keyDTypep(keyDtp); dtypep(dtp); } - ASTNODE_NODE_FUNCS(AssocArrayDType) + ASTGEN_MEMBERS_AssocArrayDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -403,7 +403,7 @@ private: AstRange* rangep); public: - ASTNODE_NODE_FUNCS(BasicDType) + ASTGEN_MEMBERS_BasicDType; virtual void dump(std::ostream& str) const override; // width/widthMin/numeric compared elsewhere virtual bool same(const AstNode* samep) const override { @@ -482,7 +482,7 @@ public: setOp1p(dtp); // Only for parser setOp2p(elementsp); // Only for parser } - ASTNODE_NODE_FUNCS(BracketArrayDType) + ASTGEN_MEMBERS_BracketArrayDType; virtual bool similarDType(AstNodeDType* samep) const override { V3ERROR_NA_RETURN(false); } // op1 = Range of variable AstNodeDType* childDTypep() const { return VN_AS(op1p(), NodeDType); } @@ -514,7 +514,7 @@ public: dtypep(this); addNOp4p(paramsp); } - ASTNODE_NODE_FUNCS(ClassRefDType) + ASTGEN_MEMBERS_ClassRefDType; // METHODS const char* broken() const override; void cloneRelink() override; @@ -558,7 +558,7 @@ public: dtypep(nullptr); // V3Width will resolve widthFromSub(subDTypep()); } - ASTNODE_NODE_FUNCS(ConstDType) + ASTGEN_MEMBERS_ConstDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -616,7 +616,7 @@ public: childDTypep(dtp); // Only for parser dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(DefImplicitDType) + ASTGEN_MEMBERS_DefImplicitDType; int uniqueNum() const { return m_uniqueNum; } virtual bool same(const AstNode* samep) const override { const AstDefImplicitDType* const sp = static_cast(samep); @@ -663,7 +663,7 @@ public: refDTypep(dtp); dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(DynArrayDType) + ASTGEN_MEMBERS_DynArrayDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -710,7 +710,7 @@ public: : ASTGEN_SUPER_EmptyQueueDType(fl) { dtypep(this); } - ASTNODE_NODE_FUNCS(EmptyQueueDType) + ASTGEN_MEMBERS_EmptyQueueDType; virtual void dumpSmall(std::ostream& str) const override; virtual bool hasDType() const override { return true; } virtual bool maybePointedTo() const override { return true; } @@ -748,7 +748,7 @@ public: dtypep(nullptr); // V3Width will resolve widthFromSub(subDTypep()); } - ASTNODE_NODE_FUNCS(EnumDType) + ASTGEN_MEMBERS_EnumDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -817,7 +817,7 @@ public: , m_cellName{cellName} , m_ifaceName{ifaceName} , m_modportName{modport} {} - ASTNODE_NODE_FUNCS(IfaceRefDType) + ASTGEN_MEMBERS_IfaceRefDType; // METHODS virtual const char* broken() const override; virtual void dump(std::ostream& str = std::cout) const override; @@ -871,7 +871,7 @@ public: dtypep(this); widthFromSub(subDTypep()); } - ASTNODE_NODE_FUNCS(MemberDType) + ASTGEN_MEMBERS_MemberDType; virtual string name() const override { return m_name; } // * = Var name virtual bool hasDType() const override { return true; } virtual bool maybePointedTo() const override { return true; } @@ -934,7 +934,7 @@ public: childDTypep(dtp); // Only for parser dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(ParamTypeDType) + ASTGEN_MEMBERS_ParamTypeDType; virtual AstNodeDType* getChildDTypep() const override { return childDTypep(); } // op1 = Type assigning to AstNodeDType* childDTypep() const { return VN_AS(op1p(), NodeDType); } @@ -975,7 +975,7 @@ class AstParseTypeDType final : public AstNodeDType { public: explicit AstParseTypeDType(FileLine* fl) : ASTGEN_SUPER_ParseTypeDType(fl) {} - ASTNODE_NODE_FUNCS(ParseTypeDType) + ASTGEN_MEMBERS_ParseTypeDType; AstNodeDType* dtypep() const { return nullptr; } // METHODS virtual bool similarDType(AstNodeDType* samep) const override { return this == samep; } @@ -1011,7 +1011,7 @@ public: refDTypep(dtp); dtypep(dtp); } - ASTNODE_NODE_FUNCS(QueueDType) + ASTGEN_MEMBERS_QueueDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -1081,7 +1081,7 @@ public: : ASTGEN_SUPER_RefDType(fl) { setOp2p(typeofp); } - ASTNODE_NODE_FUNCS(RefDType) + ASTGEN_MEMBERS_RefDType; // METHODS const char* broken() const override; void cloneRelink() override; @@ -1160,7 +1160,7 @@ public: refDTypep(nullptr); dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(UnsizedArrayDType) + ASTGEN_MEMBERS_UnsizedArrayDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -1198,7 +1198,7 @@ public: : ASTGEN_SUPER_VoidDType(fl) { dtypep(this); } - ASTNODE_NODE_FUNCS(VoidDType) + ASTGEN_MEMBERS_VoidDType; virtual void dumpSmall(std::ostream& str) const override; virtual bool hasDType() const override { return true; } virtual bool maybePointedTo() const override { return true; } @@ -1230,7 +1230,7 @@ public: refDTypep(nullptr); dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(WildcardArrayDType) + ASTGEN_MEMBERS_WildcardArrayDType; virtual const char* broken() const override { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); @@ -1274,7 +1274,7 @@ class AstPackArrayDType final : public AstNodeArrayDType { public: inline AstPackArrayDType(FileLine* fl, VFlagChildDType, AstNodeDType* dtp, AstRange* rangep); inline AstPackArrayDType(FileLine* fl, AstNodeDType* dtp, AstRange* rangep); - ASTNODE_NODE_FUNCS(PackArrayDType) + ASTGEN_MEMBERS_PackArrayDType; virtual string prettyDTypeName() const override; virtual bool isCompound() const override { return false; } }; @@ -1303,7 +1303,7 @@ public: // width and signing from the subDType/base type widthFromSub(subDTypep()); } - ASTNODE_NODE_FUNCS(UnpackArrayDType) + ASTGEN_MEMBERS_UnpackArrayDType; virtual string prettyDTypeName() const override; virtual bool same(const AstNode* samep) const override { const AstUnpackArrayDType* const sp = static_cast(samep); @@ -1321,7 +1321,7 @@ public: // VSigning below is mispurposed to indicate if packed or not AstStructDType(FileLine* fl, VSigning numericUnpack) : ASTGEN_SUPER_StructDType(fl, numericUnpack) {} - ASTNODE_NODE_FUNCS(StructDType) + ASTGEN_MEMBERS_StructDType; virtual string verilogKwd() const override { return "struct"; } }; class AstUnionDType final : public AstNodeUOrStructDType { @@ -1330,7 +1330,7 @@ public: // VSigning below is mispurposed to indicate if packed or not AstUnionDType(FileLine* fl, VSigning numericUnpack) : ASTGEN_SUPER_UnionDType(fl, numericUnpack) {} - ASTNODE_NODE_FUNCS(UnionDType) + ASTGEN_MEMBERS_UnionDType; virtual string verilogKwd() const override { return "union"; } }; diff --git a/src/V3AstNodeMath.h b/src/V3AstNodeMath.h index e019298f9..78360c3c2 100644 --- a/src/V3AstNodeMath.h +++ b/src/V3AstNodeMath.h @@ -44,7 +44,7 @@ protected: : AstNode{t, fl} {} public: - ASTNODE_BASE_FUNCS(NodeMath) + ASTGEN_MEMBERS_NodeMath; // METHODS virtual void dump(std::ostream& str) const override; virtual bool hasDType() const override { return true; } @@ -68,7 +68,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeBiop) + ASTGEN_MEMBERS_NodeBiop; // Clone single node, just get same type back. virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) = 0; // ACCESSORS @@ -97,7 +97,7 @@ protected: : AstNodeBiop{t, fl, lhs, rhs} {} public: - ASTNODE_BASE_FUNCS(NodeBiCom) + ASTGEN_MEMBERS_NodeBiCom; }; class AstNodeBiComAsv VL_NOT_FINAL : public AstNodeBiCom { // Binary math with commutative & associative properties @@ -106,7 +106,7 @@ protected: : AstNodeBiCom{t, fl, lhs, rhs} {} public: - ASTNODE_BASE_FUNCS(NodeBiComAsv) + ASTGEN_MEMBERS_NodeBiComAsv; }; class AstNodeSel VL_NOT_FINAL : public AstNodeBiop { // Single bit range extraction, perhaps with non-constant selection or array selection @@ -115,7 +115,7 @@ protected: : AstNodeBiop{t, fl, fromp, bitp} {} public: - ASTNODE_BASE_FUNCS(NodeSel) + ASTGEN_MEMBERS_NodeSel; AstNode* fromp() const { return op1p(); } // op1 = Extracting what (nullptr=TBD during parsing) @@ -134,7 +134,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeStream) + ASTGEN_MEMBERS_NodeStream; }; class AstNodeSystemBiop VL_NOT_FINAL : public AstNodeBiop { public: @@ -142,6 +142,7 @@ public: : AstNodeBiop(t, fl, lhsp, rhsp) { dtypeSetDouble(); } + ASTGEN_MEMBERS_NodeSystemBiop; virtual bool cleanOut() const override { return false; } virtual bool cleanLhs() const override { return false; } virtual bool cleanRhs() const override { return false; } @@ -162,7 +163,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeQuadop) + ASTGEN_MEMBERS_NodeQuadop; AstNode* lhsp() const { return op1p(); } AstNode* rhsp() const { return op2p(); } AstNode* thsp() const { return op3p(); } @@ -194,7 +195,7 @@ protected: : AstNodeMath{t, fl} {} public: - ASTNODE_BASE_FUNCS(NodeTermop) + ASTGEN_MEMBERS_NodeTermop; // Know no children, and hot function, so skip iterator for speed // See checkTreeIter also that asserts no children // cppcheck-suppress functionConst @@ -212,7 +213,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeTriop) + ASTGEN_MEMBERS_NodeTriop; AstNode* lhsp() const { return op1p(); } AstNode* rhsp() const { return op2p(); } AstNode* thsp() const { return op3p(); } @@ -246,7 +247,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeCond) + ASTGEN_MEMBERS_NodeCond; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override; AstNode* condp() const { return op1p(); } // op1 = Condition @@ -274,7 +275,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeUniop) + ASTGEN_MEMBERS_NodeUniop; AstNode* lhsp() const { return op1p(); } void lhsp(AstNode* nodep) { return setOp1p(nodep); } // METHODS @@ -296,7 +297,7 @@ public: : AstNodeUniop(t, fl, lhsp) { dtypeSetDouble(); } - ASTNODE_BASE_FUNCS(NodeSystemUniop) + ASTGEN_MEMBERS_NodeSystemUniop; virtual bool cleanOut() const override { return true; } virtual bool cleanLhs() const override { return false; } virtual bool sizeMattersLhs() const override { return false; } @@ -329,7 +330,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeVarRef) + ASTGEN_MEMBERS_NodeVarRef; virtual void dump(std::ostream& str) const override; virtual bool hasDType() const override { return true; } virtual const char* broken() const override; @@ -370,7 +371,7 @@ public: } public: - ASTNODE_NODE_FUNCS(AddrOfCFunc) + ASTGEN_MEMBERS_AddrOfCFunc; virtual void cloneRelink() override; virtual const char* broken() const override; virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } @@ -392,7 +393,7 @@ public: dtypeFrom(exprsp); } inline AstCMath(FileLine* fl, const string& textStmt, int setwidth, bool cleanOut = true); - ASTNODE_NODE_FUNCS(CMath) + ASTGEN_MEMBERS_CMath; virtual bool isGateOptimizable() const override { return m_pure; } virtual bool isPredictOptimizable() const override { return m_pure; } virtual bool cleanOut() const override { return m_cleanOut; } @@ -413,7 +414,7 @@ public: : ASTGEN_SUPER_ConsAssoc(fl) { setNOp1p(defaultp); } - ASTNODE_NODE_FUNCS(ConsAssoc) + ASTGEN_MEMBERS_ConsAssoc; virtual string emitVerilog() override { return "'{}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -432,7 +433,7 @@ public: setNOp1p(lhsp); setNOp2p(rhsp); } - ASTNODE_NODE_FUNCS(ConsDynArray) + ASTGEN_MEMBERS_ConsDynArray; virtual string emitVerilog() override { return "'{%l, %r}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -452,7 +453,7 @@ public: setNOp1p(lhsp); setNOp2p(rhsp); } - ASTNODE_NODE_FUNCS(ConsQueue) + ASTGEN_MEMBERS_ConsQueue; virtual string emitVerilog() override { return "'{%l, %r}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -471,7 +472,7 @@ public: : ASTGEN_SUPER_ConsWildcard(fl) { setNOp1p(defaultp); } - ASTNODE_NODE_FUNCS(ConsWildcard) + ASTGEN_MEMBERS_ConsWildcard; virtual string emitVerilog() override { return "'{}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -593,7 +594,7 @@ public: dtypeSetBit(); // Events 1 bit, objects 64 bits, so autoExtend=1 and use bit here initWithNumber(); } - ASTNODE_NODE_FUNCS(Const) + ASTGEN_MEMBERS_Const; virtual string name() const override { return num().ascii(); } // * = Value const V3Number& num() const { return m_num; } // * = Value V3Number& num() { return m_num; } // * = Value @@ -618,7 +619,7 @@ class AstEmptyQueue final : public AstNodeMath { public: explicit AstEmptyQueue(FileLine* fl) : ASTGEN_SUPER_EmptyQueue(fl) {} - ASTNODE_NODE_FUNCS(EmptyQueue) + ASTGEN_MEMBERS_EmptyQueue; virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() override { return "{}"; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -635,7 +636,7 @@ public: , m_classOrPackagep{classOrPackagep} { dtypeFrom(m_itemp); } - ASTNODE_NODE_FUNCS(EnumItemRef) + ASTGEN_MEMBERS_EnumItemRef; virtual void dump(std::ostream& str) const override; virtual string name() const override { return itemp()->name(); } virtual int instrCount() const override { return 0; } @@ -665,7 +666,7 @@ public: setOp2p(resultp); // Possibly in future nullptr could mean return rhsp() dtypeFrom(resultp); } - ASTNODE_NODE_FUNCS(ExprStmt) + ASTGEN_MEMBERS_ExprStmt; // ACCESSORS AstNode* stmtsp() const { return op1p(); } void addStmtsp(AstNode* nodep) { addOp1p(nodep); } @@ -683,7 +684,7 @@ public: setOp1p(filep); setOp2p(strp); } - ASTNODE_NODE_FUNCS(FError) + ASTGEN_MEMBERS_FError; virtual string emitVerilog() override { return "%f$ferror(%l, %r)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -713,7 +714,7 @@ public: setNOp3p(startp); setNOp4p(countp); } - ASTNODE_NODE_FUNCS(FRead) + ASTGEN_MEMBERS_FRead; virtual string verilogKwd() const override { return "$fread"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -740,7 +741,7 @@ public: : ASTGEN_SUPER_FRewind(fl) { setNOp2p(filep); } - ASTNODE_NODE_FUNCS(FRewind) + ASTGEN_MEMBERS_FRewind; virtual string verilogKwd() const override { return "$frewind"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -768,7 +769,7 @@ public: addNOp1p(exprsp); setNOp2p(filep); } - ASTNODE_NODE_FUNCS(FScanF) + ASTGEN_MEMBERS_FScanF; virtual string name() const override { return m_text; } virtual string verilogKwd() const override { return "$fscanf"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } @@ -800,7 +801,7 @@ public: setNOp3p(offset); setNOp4p(operation); } - ASTNODE_NODE_FUNCS(FSeek) + ASTGEN_MEMBERS_FSeek; virtual string verilogKwd() const override { return "$fseek"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -825,7 +826,7 @@ public: : ASTGEN_SUPER_FTell(fl) { setNOp2p(filep); } - ASTNODE_NODE_FUNCS(FTell) + ASTGEN_MEMBERS_FTell; virtual string verilogKwd() const override { return "$ftell"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -848,7 +849,7 @@ public: : ASTGEN_SUPER_Fell(fl) { addOp1p(exprp); } - ASTNODE_NODE_FUNCS(Fell) + ASTGEN_MEMBERS_Fell; virtual string emitVerilog() override { return "$fell(%l)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -867,7 +868,7 @@ public: setOp1p(lhsp); setOp2p((AstNode*)rangep); } - ASTNODE_NODE_FUNCS(GatePin) + ASTGEN_MEMBERS_GatePin; virtual string emitVerilog() override { return "%l"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -884,7 +885,7 @@ public: setOp1p(lhs); setOp2p(rhs); } - ASTNODE_NODE_FUNCS(Implication) + ASTGEN_MEMBERS_Implication; virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -906,7 +907,7 @@ public: addOp2p(itemsp); dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Inside) + ASTGEN_MEMBERS_Inside; AstNode* exprp() const { return op1p(); } // op1 = LHS expression to compare with // op2 = RHS, possibly a list of expr or AstInsideRange AstNode* itemsp() const { return op2p(); } @@ -921,7 +922,7 @@ public: addOp1p(lhsp); addOp2p(rhsp); } - ASTNODE_NODE_FUNCS(InsideRange) + ASTGEN_MEMBERS_InsideRange; AstNode* lhsp() const { return op1p(); } // op1 = LHS AstNode* rhsp() const { return op2p(); } // op2 = RHS virtual string emitVerilog() override { return "[%l:%r]"; } @@ -943,7 +944,7 @@ public: : ASTGEN_SUPER_LambdaArgRef(fl) , m_name{name} , m_index(index) {} - ASTNODE_NODE_FUNCS(LambdaArgRef) + ASTGEN_MEMBERS_LambdaArgRef; virtual bool same(const AstNode* /*samep*/) const override { return true; } virtual string emitVerilog() override { return name(); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -974,7 +975,7 @@ public: setOp1p(fromp); dtypep(dtp); } - ASTNODE_NODE_FUNCS(MemberSel) + ASTGEN_MEMBERS_MemberSel; void cloneRelink() override; const char* broken() const override; virtual void dump(std::ostream& str) const override; @@ -1003,7 +1004,7 @@ public: dtypeFrom(rhsp); // otherwise V3Width will resolve setNOp1p(rhsp); } - ASTNODE_NODE_FUNCS(NewCopy) + ASTGEN_MEMBERS_NewCopy; virtual string emitVerilog() override { return "new"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -1022,7 +1023,7 @@ public: setNOp1p(sizep); setNOp2p(rhsp); } - ASTNODE_NODE_FUNCS(NewDynamic) + ASTGEN_MEMBERS_NewDynamic; virtual string emitVerilog() override { return "new"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -1041,7 +1042,7 @@ public: addOp1p(exprp); addNOp2p(ticksp); } - ASTNODE_NODE_FUNCS(Past) + ASTGEN_MEMBERS_Past; virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1065,7 +1066,7 @@ public: : ASTGEN_SUPER_PatMember(fl) { addOp1p(lhsp), setNOp2p(keyp), setNOp3p(repp); } - ASTNODE_NODE_FUNCS(PatMember) + ASTGEN_MEMBERS_PatMember; virtual string emitVerilog() override { return lhssp() ? "%f{%r{%k%l}}" : "%l"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1088,7 +1089,7 @@ public: : ASTGEN_SUPER_Pattern(fl) { addNOp2p(itemsp); } - ASTNODE_NODE_FUNCS(Pattern) + ASTGEN_MEMBERS_Pattern; virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1120,7 +1121,7 @@ public: , m_urandom{urandom} { setNOp1p(seedp); } - ASTNODE_NODE_FUNCS(Rand) + ASTGEN_MEMBERS_Rand; virtual string emitVerilog() override { return seedp() ? (m_urandom ? "%f$urandom(%l)" : "%f$random(%l)") : (m_urandom ? "%f$urandom()" : "%f$random()"); @@ -1154,7 +1155,7 @@ public: : ASTGEN_SUPER_Rose(fl) { addOp1p(exprp); } - ASTNODE_NODE_FUNCS(Rose) + ASTGEN_MEMBERS_Rose; virtual string emitVerilog() override { return "$rose(%l)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1179,7 +1180,7 @@ public: addNOp1p(exprsp); setOp2p(fromp); } - ASTNODE_NODE_FUNCS(SScanF) + ASTGEN_MEMBERS_SScanF; virtual string name() const override { return m_text; } virtual string verilogKwd() const override { return "$sscanf"; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } @@ -1208,7 +1209,7 @@ public: : ASTGEN_SUPER_Sampled(fl) { addOp1p(exprp); } - ASTNODE_NODE_FUNCS(Sampled) + ASTGEN_MEMBERS_Sampled; virtual string emitVerilog() override { return "$sampled(%l)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1234,7 +1235,7 @@ public: , m_forFormat{forFormat} { dtypeSetUInt64(); } - ASTNODE_NODE_FUNCS(ScopeName) + ASTGEN_MEMBERS_ScopeName; virtual bool same(const AstNode* samep) const override { return (m_dpiExport == static_cast(samep)->m_dpiExport && m_forFormat == static_cast(samep)->m_forFormat); @@ -1274,7 +1275,7 @@ public: setNOp2p(keyp); setOp3p(valuep); } - ASTNODE_NODE_FUNCS(SetAssoc) + ASTGEN_MEMBERS_SetAssoc; virtual string emitVerilog() override { return "'{}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1296,7 +1297,7 @@ public: setNOp2p(keyp); setOp3p(valuep); } - ASTNODE_NODE_FUNCS(SetWildcard) + ASTGEN_MEMBERS_SetWildcard; virtual string emitVerilog() override { return "'{}"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1316,7 +1317,7 @@ public: : ASTGEN_SUPER_Stable(fl) { addOp1p(exprp); } - ASTNODE_NODE_FUNCS(Stable) + ASTGEN_MEMBERS_Stable; virtual string emitVerilog() override { return "$stable(%l)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual string emitSimpleOperator() override { V3ERROR_NA_RETURN(""); } @@ -1334,7 +1335,7 @@ public: : ASTGEN_SUPER_SystemF(fl) { setOp1p(lhsp); } - ASTNODE_NODE_FUNCS(SystemF) + ASTGEN_MEMBERS_SystemF; virtual string verilogKwd() const override { return "$system"; } virtual string emitVerilog() override { return verilogKwd(); } virtual string emitC() override { return "VL_SYSTEM_%nq(%lw, %P)"; } @@ -1355,7 +1356,7 @@ public: : ASTGEN_SUPER_TestPlusArgs(fl) { setOp1p(searchp); } - ASTNODE_NODE_FUNCS(TestPlusArgs) + ASTGEN_MEMBERS_TestPlusArgs; virtual string verilogKwd() const override { return "$test$plusargs"; } virtual string emitVerilog() override { return verilogKwd(); } virtual string emitC() override { return "VL_VALUEPLUSARGS_%nq(%lw, %P, nullptr)"; } @@ -1374,7 +1375,7 @@ public: : ASTGEN_SUPER_UCFunc(fl) { addNOp1p(exprsp); } - ASTNODE_NODE_FUNCS(UCFunc) + ASTGEN_MEMBERS_UCFunc; virtual bool cleanOut() const override { return false; } virtual string emitVerilog() override { V3ERROR_NA_RETURN(""); } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -1395,7 +1396,7 @@ public: : ASTGEN_SUPER_Unbounded(fl) { dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(Unbounded) + ASTGEN_MEMBERS_Unbounded; virtual string emitVerilog() override { return "$"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -1409,7 +1410,7 @@ public: setOp1p(searchp); setOp2p(outp); } - ASTNODE_NODE_FUNCS(ValuePlusArgs) + ASTGEN_MEMBERS_ValuePlusArgs; virtual string verilogKwd() const override { return "$value$plusargs"; } virtual string emitVerilog() override { return "%f$value$plusargs(%l, %k%r)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -1434,7 +1435,7 @@ public: : ASTGEN_SUPER_BufIf1(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(BufIf1) + ASTGEN_MEMBERS_BufIf1; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstBufIf1(this->fileline(), lhsp, rhsp); } @@ -1461,7 +1462,7 @@ class AstCastDynamic final : public AstNodeBiop { public: AstCastDynamic(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_CastDynamic(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(CastDynamic) + ASTGEN_MEMBERS_CastDynamic; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) override { V3ERROR_NA; } @@ -1490,7 +1491,7 @@ public: , m_ignoreCase{ignoreCase} { dtypeSetUInt32(); } - ASTNODE_NODE_FUNCS(CompareNN) + ASTGEN_MEMBERS_CompareNN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstCompareNN(this->fileline(), lhsp, rhsp, m_ignoreCase); } @@ -1521,7 +1522,7 @@ public: VSigning::UNSIGNED); } } - ASTNODE_NODE_FUNCS(Concat) + ASTGEN_MEMBERS_Concat; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstConcat(this->fileline(), lhsp, rhsp); } @@ -1544,7 +1545,7 @@ public: : ASTGEN_SUPER_ConcatN(fl, lhsp, rhsp) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(ConcatN) + ASTGEN_MEMBERS_ConcatN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstConcatN(this->fileline(), lhsp, rhsp); } @@ -1567,7 +1568,7 @@ public: : ASTGEN_SUPER_Div(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Div) + ASTGEN_MEMBERS_Div; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstDiv(this->fileline(), lhsp, rhsp); } @@ -1589,7 +1590,7 @@ public: : ASTGEN_SUPER_DivD(fl, lhsp, rhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(DivD) + ASTGEN_MEMBERS_DivD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstDivD(this->fileline(), lhsp, rhsp); } @@ -1613,7 +1614,7 @@ public: : ASTGEN_SUPER_DivS(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(DivS) + ASTGEN_MEMBERS_DivS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstDivS(this->fileline(), lhsp, rhsp); } @@ -1637,7 +1638,7 @@ public: : ASTGEN_SUPER_EqWild(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(EqWild) + ASTGEN_MEMBERS_EqWild; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstEqWild(this->fileline(), lhsp, rhsp); } @@ -1659,7 +1660,7 @@ class AstFGetS final : public AstNodeBiop { public: AstFGetS(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_FGetS(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(FGetS) + ASTGEN_MEMBERS_FGetS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstFGetS(this->fileline(), lhsp, rhsp); } @@ -1684,7 +1685,7 @@ class AstFUngetC final : public AstNodeBiop { public: AstFUngetC(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_FUngetC(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(FUngetC) + ASTGEN_MEMBERS_FUngetC; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) override { V3ERROR_NA; } @@ -1715,7 +1716,7 @@ public: : ASTGEN_SUPER_GetcN(fl, lhsp, rhsp) { dtypeSetBitSized(8, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(GetcN) + ASTGEN_MEMBERS_GetcN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGetcN(this->fileline(), lhsp, rhsp); } @@ -1740,7 +1741,7 @@ public: : ASTGEN_SUPER_GetcRefN(fl, lhsp, rhsp) { dtypeSetBitSized(8, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(GetcRefN) + ASTGEN_MEMBERS_GetcRefN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGetcRefN(this->fileline(), lhsp, rhsp); } @@ -1762,7 +1763,7 @@ public: : ASTGEN_SUPER_Gt(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Gt) + ASTGEN_MEMBERS_Gt; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGt(this->fileline(), lhsp, rhsp); } @@ -1784,7 +1785,7 @@ public: : ASTGEN_SUPER_GtD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GtD) + ASTGEN_MEMBERS_GtD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGtD(this->fileline(), lhsp, rhsp); } @@ -1808,7 +1809,7 @@ public: : ASTGEN_SUPER_GtN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GtN) + ASTGEN_MEMBERS_GtN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGtN(this->fileline(), lhsp, rhsp); } @@ -1832,7 +1833,7 @@ public: : ASTGEN_SUPER_GtS(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GtS) + ASTGEN_MEMBERS_GtS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGtS(this->fileline(), lhsp, rhsp); } @@ -1855,7 +1856,7 @@ public: : ASTGEN_SUPER_Gte(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Gte) + ASTGEN_MEMBERS_Gte; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGte(this->fileline(), lhsp, rhsp); } @@ -1877,7 +1878,7 @@ public: : ASTGEN_SUPER_GteD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GteD) + ASTGEN_MEMBERS_GteD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGteD(this->fileline(), lhsp, rhsp); } @@ -1901,7 +1902,7 @@ public: : ASTGEN_SUPER_GteN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GteN) + ASTGEN_MEMBERS_GteN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGteN(this->fileline(), lhsp, rhsp); } @@ -1925,7 +1926,7 @@ public: : ASTGEN_SUPER_GteS(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(GteS) + ASTGEN_MEMBERS_GteS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstGteS(this->fileline(), lhsp, rhsp); } @@ -1948,7 +1949,7 @@ public: : ASTGEN_SUPER_LogAnd(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LogAnd) + ASTGEN_MEMBERS_LogAnd; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLogAnd(this->fileline(), lhsp, rhsp); } @@ -1971,7 +1972,7 @@ public: : ASTGEN_SUPER_LogIf(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LogIf) + ASTGEN_MEMBERS_LogIf; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLogIf(this->fileline(), lhsp, rhsp); } @@ -1999,7 +2000,7 @@ public: : ASTGEN_SUPER_LogOr(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LogOr) + ASTGEN_MEMBERS_LogOr; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLogOr(this->fileline(), lhsp, rhsp); } @@ -2030,7 +2031,7 @@ public: : ASTGEN_SUPER_Lt(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Lt) + ASTGEN_MEMBERS_Lt; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLt(this->fileline(), lhsp, rhsp); } @@ -2052,7 +2053,7 @@ public: : ASTGEN_SUPER_LtD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LtD) + ASTGEN_MEMBERS_LtD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLtD(this->fileline(), lhsp, rhsp); } @@ -2076,7 +2077,7 @@ public: : ASTGEN_SUPER_LtN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LtN) + ASTGEN_MEMBERS_LtN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLtN(this->fileline(), lhsp, rhsp); } @@ -2100,7 +2101,7 @@ public: : ASTGEN_SUPER_LtS(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LtS) + ASTGEN_MEMBERS_LtS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLtS(this->fileline(), lhsp, rhsp); } @@ -2123,7 +2124,7 @@ public: : ASTGEN_SUPER_Lte(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Lte) + ASTGEN_MEMBERS_Lte; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLte(this->fileline(), lhsp, rhsp); } @@ -2145,7 +2146,7 @@ public: : ASTGEN_SUPER_LteD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LteD) + ASTGEN_MEMBERS_LteD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLteD(this->fileline(), lhsp, rhsp); } @@ -2169,7 +2170,7 @@ public: : ASTGEN_SUPER_LteN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LteN) + ASTGEN_MEMBERS_LteN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLteN(this->fileline(), lhsp, rhsp); } @@ -2193,7 +2194,7 @@ public: : ASTGEN_SUPER_LteS(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LteS) + ASTGEN_MEMBERS_LteS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLteS(this->fileline(), lhsp, rhsp); } @@ -2216,7 +2217,7 @@ public: : ASTGEN_SUPER_ModDiv(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(ModDiv) + ASTGEN_MEMBERS_ModDiv; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstModDiv(this->fileline(), lhsp, rhsp); } @@ -2238,7 +2239,7 @@ public: : ASTGEN_SUPER_ModDivS(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(ModDivS) + ASTGEN_MEMBERS_ModDivS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstModDivS(this->fileline(), lhsp, rhsp); } @@ -2261,7 +2262,7 @@ public: : ASTGEN_SUPER_NeqWild(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(NeqWild) + ASTGEN_MEMBERS_NeqWild; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstNeqWild(this->fileline(), lhsp, rhsp); } @@ -2283,7 +2284,7 @@ public: : ASTGEN_SUPER_Pow(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Pow) + ASTGEN_MEMBERS_Pow; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstPow(this->fileline(), lhsp, rhsp); } @@ -2306,7 +2307,7 @@ public: : ASTGEN_SUPER_PowD(fl, lhsp, rhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(PowD) + ASTGEN_MEMBERS_PowD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstPowD(this->fileline(), lhsp, rhsp); } @@ -2329,7 +2330,7 @@ public: : ASTGEN_SUPER_PowSS(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(PowSS) + ASTGEN_MEMBERS_PowSS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstPowSS(this->fileline(), lhsp, rhsp); } @@ -2355,7 +2356,7 @@ public: : ASTGEN_SUPER_PowSU(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(PowSU) + ASTGEN_MEMBERS_PowSU; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstPowSU(this->fileline(), lhsp, rhsp); } @@ -2381,7 +2382,7 @@ public: : ASTGEN_SUPER_PowUS(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(PowUS) + ASTGEN_MEMBERS_PowUS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstPowUS(this->fileline(), lhsp, rhsp); } @@ -2415,7 +2416,7 @@ public: } AstReplicate(FileLine* fl, AstNode* lhsp, uint32_t repCount) : AstReplicate(fl, lhsp, new AstConst(fl, repCount)) {} - ASTNODE_NODE_FUNCS(Replicate) + ASTGEN_MEMBERS_Replicate; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstReplicate(this->fileline(), lhsp, rhsp); } @@ -2440,7 +2441,7 @@ public: } AstReplicateN(FileLine* fl, AstNode* lhsp, uint32_t repCount) : AstReplicateN(fl, lhsp, new AstConst(fl, repCount)) {} - ASTNODE_NODE_FUNCS(ReplicateN) + ASTGEN_MEMBERS_ReplicateN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstReplicateN(this->fileline(), lhsp, rhsp); } @@ -2463,7 +2464,7 @@ public: : ASTGEN_SUPER_ShiftL(fl, lhsp, rhsp) { if (setwidth) dtypeSetLogicSized(setwidth, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(ShiftL) + ASTGEN_MEMBERS_ShiftL; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstShiftL(this->fileline(), lhsp, rhsp); } @@ -2487,7 +2488,7 @@ public: : ASTGEN_SUPER_ShiftR(fl, lhsp, rhsp) { if (setwidth) dtypeSetLogicSized(setwidth, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(ShiftR) + ASTGEN_MEMBERS_ShiftR; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstShiftR(this->fileline(), lhsp, rhsp); } @@ -2515,7 +2516,7 @@ public: // Important that widthMin be correct, as opExtend requires it after V3Expand if (setwidth) dtypeSetLogicSized(setwidth, VSigning::SIGNED); } - ASTNODE_NODE_FUNCS(ShiftRS) + ASTGEN_MEMBERS_ShiftRS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstShiftRS(this->fileline(), lhsp, rhsp); } @@ -2538,7 +2539,7 @@ public: : ASTGEN_SUPER_Sub(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Sub) + ASTGEN_MEMBERS_Sub; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstSub(this->fileline(), lhsp, rhsp); } @@ -2560,7 +2561,7 @@ public: : ASTGEN_SUPER_SubD(fl, lhsp, rhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(SubD) + ASTGEN_MEMBERS_SubD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstSubD(this->fileline(), lhsp, rhsp); } @@ -2585,7 +2586,7 @@ public: : ASTGEN_SUPER_URandomRange(fl, lhsp, rhsp) { dtypeSetUInt32(); // Says IEEE } - ASTNODE_NODE_FUNCS(URandomRange) + ASTGEN_MEMBERS_URandomRange; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstURandomRange(fileline(), lhsp, rhsp); } @@ -2611,7 +2612,7 @@ public: : ASTGEN_SUPER_Eq(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Eq) + ASTGEN_MEMBERS_Eq; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstEq(this->fileline(), lhsp, rhsp); } @@ -2635,7 +2636,7 @@ public: : ASTGEN_SUPER_EqCase(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(EqCase) + ASTGEN_MEMBERS_EqCase; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstEqCase(this->fileline(), lhsp, rhsp); } @@ -2657,7 +2658,7 @@ public: : ASTGEN_SUPER_EqD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(EqD) + ASTGEN_MEMBERS_EqD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstEqD(this->fileline(), lhsp, rhsp); } @@ -2681,7 +2682,7 @@ public: : ASTGEN_SUPER_EqN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(EqN) + ASTGEN_MEMBERS_EqN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstEqN(this->fileline(), lhsp, rhsp); } @@ -2705,7 +2706,7 @@ public: : ASTGEN_SUPER_LogEq(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LogEq) + ASTGEN_MEMBERS_LogEq; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstLogEq(this->fileline(), lhsp, rhsp); } @@ -2728,7 +2729,7 @@ public: : ASTGEN_SUPER_Neq(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(Neq) + ASTGEN_MEMBERS_Neq; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstNeq(this->fileline(), lhsp, rhsp); } @@ -2750,7 +2751,7 @@ public: : ASTGEN_SUPER_NeqCase(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(NeqCase) + ASTGEN_MEMBERS_NeqCase; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstNeqCase(this->fileline(), lhsp, rhsp); } @@ -2772,7 +2773,7 @@ public: : ASTGEN_SUPER_NeqD(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(NeqD) + ASTGEN_MEMBERS_NeqD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstNeqD(this->fileline(), lhsp, rhsp); } @@ -2796,7 +2797,7 @@ public: : ASTGEN_SUPER_NeqN(fl, lhsp, rhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(NeqN) + ASTGEN_MEMBERS_NeqN; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstNeqN(this->fileline(), lhsp, rhsp); } @@ -2822,7 +2823,7 @@ public: : ASTGEN_SUPER_Add(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Add) + ASTGEN_MEMBERS_Add; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAdd(this->fileline(), lhsp, rhsp); } @@ -2844,7 +2845,7 @@ public: : ASTGEN_SUPER_AddD(fl, lhsp, rhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(AddD) + ASTGEN_MEMBERS_AddD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAddD(this->fileline(), lhsp, rhsp); } @@ -2868,7 +2869,7 @@ public: : ASTGEN_SUPER_And(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(And) + ASTGEN_MEMBERS_And; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAnd(this->fileline(), lhsp, rhsp); } @@ -2890,7 +2891,7 @@ public: : ASTGEN_SUPER_Mul(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Mul) + ASTGEN_MEMBERS_Mul; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstMul(this->fileline(), lhsp, rhsp); } @@ -2913,7 +2914,7 @@ public: : ASTGEN_SUPER_MulD(fl, lhsp, rhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(MulD) + ASTGEN_MEMBERS_MulD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstMulD(this->fileline(), lhsp, rhsp); } @@ -2937,7 +2938,7 @@ public: : ASTGEN_SUPER_MulS(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(MulS) + ASTGEN_MEMBERS_MulS; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstMulS(this->fileline(), lhsp, rhsp); } @@ -2962,7 +2963,7 @@ public: : ASTGEN_SUPER_Or(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Or) + ASTGEN_MEMBERS_Or; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstOr(this->fileline(), lhsp, rhsp); } @@ -2984,7 +2985,7 @@ public: : ASTGEN_SUPER_Xor(fl, lhsp, rhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Xor) + ASTGEN_MEMBERS_Xor; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstXor(this->fileline(), lhsp, rhsp); } @@ -3022,7 +3023,7 @@ public: : ASTGEN_SUPER_ArraySel(fl, fromp, new AstConst(fl, bit)) { init(fromp); } - ASTNODE_NODE_FUNCS(ArraySel) + ASTGEN_MEMBERS_ArraySel; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstArraySel(this->fileline(), lhsp, rhsp); } @@ -3062,7 +3063,7 @@ public: : ASTGEN_SUPER_AssocSel(fl, fromp, bitp) { init(fromp); } - ASTNODE_NODE_FUNCS(AssocSel) + ASTGEN_MEMBERS_AssocSel; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssocSel(this->fileline(), lhsp, rhsp); } @@ -3099,7 +3100,7 @@ public: : ASTGEN_SUPER_WildcardSel(fl, fromp, bitp) { init(fromp); } - ASTNODE_NODE_FUNCS(WildcardSel) + ASTGEN_MEMBERS_WildcardSel; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstWildcardSel{this->fileline(), lhsp, rhsp}; } @@ -3127,7 +3128,7 @@ public: : ASTGEN_SUPER_WordSel(fl, fromp, bitp) { dtypeSetUInt32(); // Always used on WData arrays so returns edata size } - ASTNODE_NODE_FUNCS(WordSel) + ASTGEN_MEMBERS_WordSel; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstWordSel(this->fileline(), lhsp, rhsp); } @@ -3152,7 +3153,7 @@ class AstStreamL final : public AstNodeStream { public: AstStreamL(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_StreamL(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(StreamL) + ASTGEN_MEMBERS_StreamL; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstStreamL(this->fileline(), lhsp, rhsp); } @@ -3173,7 +3174,7 @@ class AstStreamR final : public AstNodeStream { public: AstStreamR(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_StreamR(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(StreamR) + ASTGEN_MEMBERS_StreamR; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstStreamR(this->fileline(), lhsp, rhsp); } @@ -3195,7 +3196,7 @@ class AstAtan2D final : public AstNodeSystemBiop { public: AstAtan2D(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_Atan2D(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(Atan2D) + ASTGEN_MEMBERS_Atan2D; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAtan2D(this->fileline(), lhsp, rhsp); } @@ -3209,7 +3210,7 @@ class AstHypotD final : public AstNodeSystemBiop { public: AstHypotD(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_HypotD(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(HypotD) + ASTGEN_MEMBERS_HypotD; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstHypotD(this->fileline(), lhsp, rhsp); } @@ -3231,7 +3232,7 @@ public: : ASTGEN_SUPER_CountBits(fl, exprp, ctrl1p, ctrl2p, ctrl2p->cloneTree(false)) {} AstCountBits(FileLine* fl, AstNode* exprp, AstNode* ctrl1p, AstNode* ctrl2p, AstNode* ctrl3p) : ASTGEN_SUPER_CountBits(fl, exprp, ctrl1p, ctrl2p, ctrl3p) {} - ASTNODE_NODE_FUNCS(CountBits) + ASTGEN_MEMBERS_CountBits; virtual void numberOperate(V3Number& out, const V3Number& expr, const V3Number& ctrl1, const V3Number& ctrl2, const V3Number& ctrl3) override { out.opCountBits(expr, ctrl1, ctrl2, ctrl3); @@ -3259,7 +3260,7 @@ public: , m_timeunit{timeunit} { dtypeSetUInt64(); } - ASTNODE_NODE_FUNCS(Time) + ASTGEN_MEMBERS_Time; virtual string emitVerilog() override { return "%f$time"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -3279,7 +3280,7 @@ public: , m_timeunit{timeunit} { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(TimeD) + ASTGEN_MEMBERS_TimeD; virtual string emitVerilog() override { return "%f$realtime"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const override { return true; } @@ -3302,7 +3303,7 @@ class AstPostAdd final : public AstNodeTriop { public: AstPostAdd(FileLine* fl, AstNode* lhsp, AstNode* rhsp, AstNode* thsp) : ASTGEN_SUPER_PostAdd(fl, lhsp, rhsp, thsp) {} - ASTNODE_NODE_FUNCS(PostAdd) + ASTGEN_MEMBERS_PostAdd; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { V3ERROR_NA; // Need to modify lhs @@ -3327,7 +3328,7 @@ class AstPostSub final : public AstNodeTriop { public: AstPostSub(FileLine* fl, AstNode* lhsp, AstNode* rhsp, AstNode* thsp) : ASTGEN_SUPER_PostSub(fl, lhsp, rhsp, thsp) {} - ASTNODE_NODE_FUNCS(PostSub) + ASTGEN_MEMBERS_PostSub; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { V3ERROR_NA; // Need to modify lhs @@ -3352,7 +3353,7 @@ class AstPreAdd final : public AstNodeTriop { public: AstPreAdd(FileLine* fl, AstNode* lhsp, AstNode* rhsp, AstNode* thsp) : ASTGEN_SUPER_PreAdd(fl, lhsp, rhsp, thsp) {} - ASTNODE_NODE_FUNCS(PreAdd) + ASTGEN_MEMBERS_PreAdd; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { V3ERROR_NA; // Need to modify lhs @@ -3377,7 +3378,7 @@ class AstPreSub final : public AstNodeTriop { public: AstPreSub(FileLine* fl, AstNode* lhsp, AstNode* rhsp, AstNode* thsp) : ASTGEN_SUPER_PreSub(fl, lhsp, rhsp, thsp) {} - ASTNODE_NODE_FUNCS(PreSub) + ASTGEN_MEMBERS_PreSub; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { V3ERROR_NA; // Need to modify lhs @@ -3400,7 +3401,7 @@ public: : ASTGEN_SUPER_PutcN(fl, lhsp, rhsp, ths) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(PutcN) + ASTGEN_MEMBERS_PutcN; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { out.opPutcN(lhs, rhs, ths); @@ -3439,7 +3440,7 @@ public: , m_declElWidth{1} { dtypeSetLogicSized(bitwidth, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(Sel) + ASTGEN_MEMBERS_Sel; virtual void dump(std::ostream& str) const override; virtual void numberOperate(V3Number& out, const V3Number& from, const V3Number& bit, const V3Number& width) override { @@ -3487,7 +3488,7 @@ public: : ASTGEN_SUPER_SliceSel(fl, fromp, new AstConst(fl, declRange.lo()), new AstConst(fl, declRange.elements())) , m_declRange{declRange} {} - ASTNODE_NODE_FUNCS(SliceSel) + ASTGEN_MEMBERS_SliceSel; virtual void dump(std::ostream& str) const override; virtual void numberOperate(V3Number& out, const V3Number& from, const V3Number& lo, const V3Number& width) override { @@ -3519,7 +3520,7 @@ public: : ASTGEN_SUPER_SubstrN(fl, lhsp, rhsp, ths) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(SubstrN) + ASTGEN_MEMBERS_SubstrN; virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs, const V3Number& ths) override { out.opSubstrN(lhs, rhs, ths); @@ -3545,7 +3546,7 @@ class AstCond final : public AstNodeCond { public: AstCond(FileLine* fl, AstNode* condp, AstNode* expr1p, AstNode* expr2p) : ASTGEN_SUPER_Cond(fl, condp, expr1p, expr2p) {} - ASTNODE_NODE_FUNCS(Cond) + ASTGEN_MEMBERS_Cond; virtual AstNode* cloneType(AstNode* condp, AstNode* expr1p, AstNode* expr2p) override { return new AstCond(this->fileline(), condp, expr1p, expr2p); } @@ -3557,7 +3558,7 @@ class AstCondBound final : public AstNodeCond { public: AstCondBound(FileLine* fl, AstNode* condp, AstNode* expr1p, AstNode* expr2p) : ASTGEN_SUPER_CondBound(fl, condp, expr1p, expr2p) {} - ASTNODE_NODE_FUNCS(CondBound) + ASTGEN_MEMBERS_CondBound; virtual AstNode* cloneType(AstNode* condp, AstNode* expr1p, AstNode* expr2p) override { return new AstCondBound(this->fileline(), condp, expr1p, expr2p); } @@ -3577,7 +3578,7 @@ public: , m_fmt{fmt} { fmt == ATOREAL ? dtypeSetDouble() : dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(AtoN) + ASTGEN_MEMBERS_AtoN; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opAtoN(lhs, m_fmt); } @@ -3613,7 +3614,7 @@ public: : ASTGEN_SUPER_BitsToRealD(fl, lhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(BitsToRealD) + ASTGEN_MEMBERS_BitsToRealD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opBitsToRealD(lhs); } @@ -3643,7 +3644,7 @@ public: dtypeFrom(typeFromp); m_size = width(); } - ASTNODE_NODE_FUNCS(CCast) + ASTGEN_MEMBERS_CCast; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opAssign(lhs); } virtual string emitVerilog() override { return "%f$_CAST(%l)"; } virtual string emitC() override { return "VL_CAST_%nq%lq(%nw,%lw, %P, %li)"; } @@ -3663,7 +3664,7 @@ public: : ASTGEN_SUPER_CLog2(fl, lhsp) { dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(CLog2) + ASTGEN_MEMBERS_CLog2; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opCLog2(lhs); } virtual string emitVerilog() override { return "%f$clog2(%l)"; } virtual string emitC() override { return "VL_CLOG2_%lq(%lW, %P, %li)"; } @@ -3677,7 +3678,7 @@ class AstCountOnes final : public AstNodeUniop { public: AstCountOnes(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_CountOnes(fl, lhsp) {} - ASTNODE_NODE_FUNCS(CountOnes) + ASTGEN_MEMBERS_CountOnes; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opCountOnes(lhs); } @@ -3695,7 +3696,7 @@ public: : ASTGEN_SUPER_CvtPackString(fl, lhsp) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(CvtPackString) + ASTGEN_MEMBERS_CvtPackString; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { V3ERROR_NA; } virtual string emitVerilog() override { return "%f$_CAST(%l)"; } virtual string emitC() override { return "VL_CVT_PACK_STR_N%lq(%lW, %li)"; } @@ -3713,7 +3714,7 @@ public: : ASTGEN_SUPER_Extend(fl, lhsp) { dtypeSetLogicSized(width, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(Extend) + ASTGEN_MEMBERS_Extend; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opAssign(lhs); } virtual string emitVerilog() override { return "%l"; } virtual string emitC() override { return "VL_EXTEND_%nq%lq(%nw,%lw, %P, %li)"; } @@ -3734,7 +3735,7 @@ public: : ASTGEN_SUPER_ExtendS(fl, lhsp) { dtypeSetLogicSized(width, VSigning::UNSIGNED); } - ASTNODE_NODE_FUNCS(ExtendS) + ASTGEN_MEMBERS_ExtendS; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opExtendS(lhs, lhsp()->widthMinV()); } @@ -3752,7 +3753,7 @@ class AstFEof final : public AstNodeUniop { public: AstFEof(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_FEof(fl, lhsp) {} - ASTNODE_NODE_FUNCS(FEof) + ASTGEN_MEMBERS_FEof; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { V3ERROR_NA; } virtual string emitVerilog() override { return "%f$feof(%l)"; } virtual string emitC() override { return "(%li ? feof(VL_CVT_I_FP(%li)) : true)"; } @@ -3769,7 +3770,7 @@ class AstFGetC final : public AstNodeUniop { public: AstFGetC(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_FGetC(fl, lhsp) {} - ASTNODE_NODE_FUNCS(FGetC) + ASTGEN_MEMBERS_FGetC; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { V3ERROR_NA; } virtual string emitVerilog() override { return "%f$fgetc(%l)"; } // Non-existent filehandle returns EOF @@ -3790,7 +3791,7 @@ public: : ASTGEN_SUPER_ISToRD(fl, lhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(ISToRD) + ASTGEN_MEMBERS_ISToRD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opISToRD(lhs); } virtual string emitVerilog() override { return "%f$itor($signed(%l))"; } virtual string emitC() override { return "VL_ISTOR_D_%lq(%lw, %li)"; } @@ -3807,7 +3808,7 @@ public: : ASTGEN_SUPER_IToRD(fl, lhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(IToRD) + ASTGEN_MEMBERS_IToRD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opIToRD(lhs); } virtual string emitVerilog() override { return "%f$itor(%l)"; } virtual string emitC() override { return "VL_ITOR_D_%lq(%lw, %li)"; } @@ -3823,7 +3824,7 @@ public: : ASTGEN_SUPER_IsUnbounded(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(IsUnbounded) + ASTGEN_MEMBERS_IsUnbounded; virtual void numberOperate(V3Number& out, const V3Number&) override { // Any constant isn't unbounded out.setZero(); @@ -3841,7 +3842,7 @@ public: : ASTGEN_SUPER_IsUnknown(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(IsUnknown) + ASTGEN_MEMBERS_IsUnknown; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opIsUnknown(lhs); } @@ -3858,7 +3859,7 @@ public: : ASTGEN_SUPER_LenN(fl, lhsp) { dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(LenN) + ASTGEN_MEMBERS_LenN; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opLenN(lhs); } virtual string emitVerilog() override { return "%f(%l)"; } virtual string emitC() override { return "VL_LEN_IN(%li)"; } @@ -3872,7 +3873,7 @@ public: : ASTGEN_SUPER_LogNot(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(LogNot) + ASTGEN_MEMBERS_LogNot; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opLogNot(lhs); } virtual string emitVerilog() override { return "%f(! %l)"; } virtual string emitC() override { return "VL_LOGNOT_%nq%lq(%nw,%lw, %P, %li)"; } @@ -3887,7 +3888,7 @@ public: : ASTGEN_SUPER_Negate(fl, lhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Negate) + ASTGEN_MEMBERS_Negate; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opNegate(lhs); } virtual string emitVerilog() override { return "%f(- %l)"; } virtual string emitC() override { return "VL_NEGATE_%lq(%lW, %P, %li)"; } @@ -3902,7 +3903,7 @@ public: : ASTGEN_SUPER_NegateD(fl, lhsp) { dtypeSetDouble(); } - ASTNODE_NODE_FUNCS(NegateD) + ASTGEN_MEMBERS_NegateD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opNegateD(lhs); } virtual string emitVerilog() override { return "%f(- %l)"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -3919,7 +3920,7 @@ public: : ASTGEN_SUPER_Not(fl, lhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Not) + ASTGEN_MEMBERS_Not; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opNot(lhs); } virtual string emitVerilog() override { return "%f(~ %l)"; } virtual string emitC() override { return "VL_NOT_%lq(%lW, %P, %li)"; } @@ -3936,7 +3937,7 @@ public: : ASTGEN_SUPER_NullCheck(fl, lhsp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(NullCheck) + ASTGEN_MEMBERS_NullCheck; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { V3ERROR_NA; } virtual int instrCount() const override { return 1; } // Rarely executes virtual string emitVerilog() override { return "%l"; } @@ -3956,7 +3957,7 @@ public: : ASTGEN_SUPER_OneHot(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(OneHot) + ASTGEN_MEMBERS_OneHot; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opOneHot(lhs); } virtual string emitVerilog() override { return "%f$onehot(%l)"; } virtual string emitC() override { return "VL_ONEHOT_%lq(%lW, %P, %li)"; } @@ -3972,7 +3973,7 @@ public: : ASTGEN_SUPER_OneHot0(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(OneHot0) + ASTGEN_MEMBERS_OneHot0; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opOneHot0(lhs); } virtual string emitVerilog() override { return "%f$onehot0(%l)"; } virtual string emitC() override { return "VL_ONEHOT0_%lq(%lW, %P, %li)"; } @@ -3988,7 +3989,7 @@ public: : ASTGEN_SUPER_RToIRoundS(fl, lhsp) { dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(RToIRoundS) + ASTGEN_MEMBERS_RToIRoundS; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRToIRoundS(lhs); } @@ -4008,7 +4009,7 @@ public: : ASTGEN_SUPER_RToIS(fl, lhsp) { dtypeSetSigned32(); } - ASTNODE_NODE_FUNCS(RToIS) + ASTGEN_MEMBERS_RToIS; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRToIS(lhs); } virtual string emitVerilog() override { return "%f$rtoi(%l)"; } virtual string emitC() override { return "VL_RTOI_I_D(%li)"; } @@ -4023,7 +4024,7 @@ public: : ASTGEN_SUPER_RealToBits(fl, lhsp) { dtypeSetUInt64(); } - ASTNODE_NODE_FUNCS(RealToBits) + ASTGEN_MEMBERS_RealToBits; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRealToBits(lhs); } @@ -4040,7 +4041,7 @@ public: : ASTGEN_SUPER_RedAnd(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(RedAnd) + ASTGEN_MEMBERS_RedAnd; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRedAnd(lhs); } virtual string emitVerilog() override { return "%f(& %l)"; } virtual string emitC() override { return "VL_REDAND_%nq%lq(%lw, %P, %li)"; } @@ -4054,7 +4055,7 @@ public: : ASTGEN_SUPER_RedOr(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(RedOr) + ASTGEN_MEMBERS_RedOr; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRedOr(lhs); } virtual string emitVerilog() override { return "%f(| %l)"; } virtual string emitC() override { return "VL_REDOR_%lq(%lW, %P, %li)"; } @@ -4068,7 +4069,7 @@ public: : ASTGEN_SUPER_RedXor(fl, lhsp) { dtypeSetBit(); } - ASTNODE_NODE_FUNCS(RedXor) + ASTGEN_MEMBERS_RedXor; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opRedXor(lhs); } virtual string emitVerilog() override { return "%f(^ %l)"; } virtual string emitC() override { return "VL_REDXOR_%lq(%lW, %P, %li)"; } @@ -4088,7 +4089,7 @@ public: UASSERT_OBJ(!v3Global.assertDTypesResolved(), this, "not coded to create after dtypes resolved"); } - ASTNODE_NODE_FUNCS(Signed) + ASTGEN_MEMBERS_Signed; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opAssign(lhs); out.isSigned(false); @@ -4106,7 +4107,7 @@ class AstTimeImport final : public AstNodeUniop { public: AstTimeImport(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_TimeImport(fl, lhsp) {} - ASTNODE_NODE_FUNCS(TimeImport) + ASTGEN_MEMBERS_TimeImport; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { V3ERROR_NA; } virtual string emitVerilog() override { return "%l"; } virtual string emitC() override { V3ERROR_NA_RETURN(""); } @@ -4124,7 +4125,7 @@ public: : ASTGEN_SUPER_ToLowerN(fl, lhsp) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(ToLowerN) + ASTGEN_MEMBERS_ToLowerN; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opToLowerN(lhs); } @@ -4141,7 +4142,7 @@ public: : ASTGEN_SUPER_ToUpperN(fl, lhsp) { dtypeSetString(); } - ASTNODE_NODE_FUNCS(ToUpperN) + ASTGEN_MEMBERS_ToUpperN; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opToUpperN(lhs); } @@ -4159,7 +4160,7 @@ public: UASSERT_OBJ(!v3Global.assertDTypesResolved(), this, "not coded to create after dtypes resolved"); } - ASTNODE_NODE_FUNCS(Unsigned) + ASTGEN_MEMBERS_Unsigned; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.opAssign(lhs); out.isSigned(false); @@ -4177,7 +4178,7 @@ class AstAcosD final : public AstNodeSystemUniop { public: AstAcosD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AcosD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AcosD) + ASTGEN_MEMBERS_AcosD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::acos(lhs.toDouble())); } @@ -4188,7 +4189,7 @@ class AstAcoshD final : public AstNodeSystemUniop { public: AstAcoshD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AcoshD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AcoshD) + ASTGEN_MEMBERS_AcoshD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::acosh(lhs.toDouble())); } @@ -4199,7 +4200,7 @@ class AstAsinD final : public AstNodeSystemUniop { public: AstAsinD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AsinD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AsinD) + ASTGEN_MEMBERS_AsinD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::asin(lhs.toDouble())); } @@ -4210,7 +4211,7 @@ class AstAsinhD final : public AstNodeSystemUniop { public: AstAsinhD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AsinhD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AsinhD) + ASTGEN_MEMBERS_AsinhD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::asinh(lhs.toDouble())); } @@ -4221,7 +4222,7 @@ class AstAtanD final : public AstNodeSystemUniop { public: AstAtanD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AtanD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AtanD) + ASTGEN_MEMBERS_AtanD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::atan(lhs.toDouble())); } @@ -4232,7 +4233,7 @@ class AstAtanhD final : public AstNodeSystemUniop { public: AstAtanhD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_AtanhD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(AtanhD) + ASTGEN_MEMBERS_AtanhD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::atanh(lhs.toDouble())); } @@ -4243,7 +4244,7 @@ class AstCeilD final : public AstNodeSystemUniop { public: AstCeilD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_CeilD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(CeilD) + ASTGEN_MEMBERS_CeilD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::ceil(lhs.toDouble())); } @@ -4254,7 +4255,7 @@ class AstCosD final : public AstNodeSystemUniop { public: AstCosD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_CosD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(CosD) + ASTGEN_MEMBERS_CosD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::cos(lhs.toDouble())); } @@ -4265,7 +4266,7 @@ class AstCoshD final : public AstNodeSystemUniop { public: AstCoshD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_CoshD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(CoshD) + ASTGEN_MEMBERS_CoshD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::cosh(lhs.toDouble())); } @@ -4276,7 +4277,7 @@ class AstExpD final : public AstNodeSystemUniop { public: AstExpD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_ExpD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(ExpD) + ASTGEN_MEMBERS_ExpD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::exp(lhs.toDouble())); } @@ -4287,7 +4288,7 @@ class AstFloorD final : public AstNodeSystemUniop { public: AstFloorD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_FloorD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(FloorD) + ASTGEN_MEMBERS_FloorD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::floor(lhs.toDouble())); } @@ -4298,7 +4299,7 @@ class AstLog10D final : public AstNodeSystemUniop { public: AstLog10D(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_Log10D(fl, lhsp) {} - ASTNODE_NODE_FUNCS(Log10D) + ASTGEN_MEMBERS_Log10D; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::log10(lhs.toDouble())); } @@ -4309,7 +4310,7 @@ class AstLogD final : public AstNodeSystemUniop { public: AstLogD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_LogD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(LogD) + ASTGEN_MEMBERS_LogD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::log(lhs.toDouble())); } @@ -4320,7 +4321,7 @@ class AstSinD final : public AstNodeSystemUniop { public: AstSinD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_SinD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(SinD) + ASTGEN_MEMBERS_SinD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::sin(lhs.toDouble())); } @@ -4331,7 +4332,7 @@ class AstSinhD final : public AstNodeSystemUniop { public: AstSinhD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_SinhD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(SinhD) + ASTGEN_MEMBERS_SinhD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::sinh(lhs.toDouble())); } @@ -4342,7 +4343,7 @@ class AstSqrtD final : public AstNodeSystemUniop { public: AstSqrtD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_SqrtD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(SqrtD) + ASTGEN_MEMBERS_SqrtD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::sqrt(lhs.toDouble())); } @@ -4353,7 +4354,7 @@ class AstTanD final : public AstNodeSystemUniop { public: AstTanD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_TanD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(TanD) + ASTGEN_MEMBERS_TanD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::tan(lhs.toDouble())); } @@ -4364,7 +4365,7 @@ class AstTanhD final : public AstNodeSystemUniop { public: AstTanhD(FileLine* fl, AstNode* lhsp) : ASTGEN_SUPER_TanhD(fl, lhsp) {} - ASTNODE_NODE_FUNCS(TanhD) + ASTGEN_MEMBERS_TanhD; virtual void numberOperate(V3Number& out, const V3Number& lhs) override { out.setDouble(std::tanh(lhs.toDouble())); } @@ -4383,7 +4384,7 @@ public: inline AstVarRef(FileLine* fl, AstVar* varp, const VAccess& access); // This form only allowed post-link (see above) inline AstVarRef(FileLine* fl, AstVarScope* varscp, const VAccess& access); - ASTNODE_NODE_FUNCS(VarRef) + ASTGEN_MEMBERS_VarRef; virtual void dump(std::ostream& str) const override; bool same(const AstNode* samep) const override; inline bool same(const AstVarRef* samep) const; @@ -4406,7 +4407,7 @@ public: : ASTGEN_SUPER_VarXRef(fl, name, nullptr, access) , m_dotted{dotted} {} inline AstVarXRef(FileLine* fl, AstVar* varp, const string& dotted, const VAccess& access); - ASTNODE_NODE_FUNCS(VarXRef) + ASTGEN_MEMBERS_VarXRef; virtual void dump(std::ostream& str) const override; string dotted() const { return m_dotted; } void dotted(const string& dotted) { m_dotted = dotted; } diff --git a/src/V3AstNodeOther.h b/src/V3AstNodeOther.h index aa35e36a2..da62b28d3 100644 --- a/src/V3AstNodeOther.h +++ b/src/V3AstNodeOther.h @@ -46,7 +46,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeBlock) + ASTGEN_MEMBERS_NodeBlock; virtual void dump(std::ostream& str) const override; virtual string name() const override { return m_name; } // * = Block name virtual void name(const string& name) override { m_name = name; } @@ -111,7 +111,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeFTask) + ASTGEN_MEMBERS_NodeFTask; virtual void dump(std::ostream& str = std::cout) const override; virtual string name() const override { return m_name; } // * = Var name virtual bool maybePointedTo() const override { return true; } @@ -193,7 +193,7 @@ public: AstNodeFile(VNType t, FileLine* fl, const string& name) : AstNode{t, fl} , m_name{name} {} - ASTNODE_BASE_FUNCS(NodeFile) + ASTGEN_MEMBERS_NodeFile; virtual void dump(std::ostream& str) const override; virtual string name() const override { return m_name; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -236,7 +236,7 @@ protected: , m_recursiveClone{false} {} public: - ASTNODE_BASE_FUNCS(NodeModule) + ASTGEN_MEMBERS_NodeModule; virtual void dump(std::ostream& str) const override; virtual bool maybePointedTo() const override { return true; } virtual string name() const override { return m_name; } @@ -289,7 +289,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodePreSel) + ASTGEN_MEMBERS_NodePreSel; AstNode* fromp() const { return op1p(); } AstNode* rhsp() const { return op2p(); } AstNode* thsp() const { return op3p(); } @@ -310,7 +310,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeProcedure) + ASTGEN_MEMBERS_NodeProcedure; // METHODS virtual void dump(std::ostream& str) const override; AstNode* bodysp() const { return op2p(); } // op2 = Statements to evaluate @@ -324,7 +324,7 @@ protected: : AstNode{t, fl} {} public: - ASTNODE_BASE_FUNCS(NodeRange) + ASTGEN_MEMBERS_NodeRange; virtual void dump(std::ostream& str) const override; }; class AstNodeStmt VL_NOT_FINAL : public AstNode { @@ -336,7 +336,7 @@ protected: , m_statement{statement} {} public: - ASTNODE_BASE_FUNCS(NodeStmt) + ASTGEN_MEMBERS_NodeStmt; // METHODS bool isStatement() const { return m_statement; } // Really a statement void statement(bool flag) { m_statement = flag; } @@ -358,7 +358,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeAssign) + ASTGEN_MEMBERS_NodeAssign; // Clone single node, just get same type back. virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) = 0; // So iteration hits the RHS which is "earlier" in execution order, it's op1, not op2 @@ -390,7 +390,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeCCall) + ASTGEN_MEMBERS_NodeCCall; virtual void dump(std::ostream& str = std::cout) const override; virtual void cloneRelink() override; virtual const char* broken() const override; @@ -421,7 +421,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeCase) + ASTGEN_MEMBERS_NodeCase; virtual int instrCount() const override { return INSTR_COUNT_BRANCH; } AstNode* exprp() const { return op1p(); } // op1 = case condition AstCaseItem* itemsp() const { @@ -447,7 +447,7 @@ public: addOp1p(propp); addNOp4p(passsp); } - ASTNODE_BASE_FUNCS(NodeCoverOrAssert) + ASTGEN_MEMBERS_NodeCoverOrAssert; virtual string name() const override { return m_name; } // * = Var name virtual bool same(const AstNode* samep) const override { return samep->name() == name(); } virtual void name(const string& name) override { m_name = name; } @@ -481,7 +481,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeFTaskRef) + ASTGEN_MEMBERS_NodeFTaskRef; virtual const char* broken() const override; virtual void cloneRelink() override; virtual void dump(std::ostream& str = std::cout) const override; @@ -522,7 +522,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeFor) + ASTGEN_MEMBERS_NodeFor; AstNode* initsp() const { return op1p(); } // op1 = initial statements AstNode* condp() const { return op2p(); } // op2 = condition to continue AstNode* incsp() const { return op3p(); } // op3 = increment statements @@ -545,7 +545,7 @@ protected: } public: - ASTNODE_BASE_FUNCS(NodeIf) + ASTGEN_MEMBERS_NodeIf; AstNode* condp() const { return op1p(); } // op1 = condition AstNode* ifsp() const { return op2p(); } // op2 = list of true statements AstNode* elsesp() const { return op3p(); } // op3 = list of false statements @@ -577,6 +577,7 @@ public: setNOp3p(lsbp); setNOp4p(msbp); } + ASTGEN_MEMBERS_NodeReadWriteMem; virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } virtual bool isPure() const override { return false; } @@ -603,7 +604,7 @@ protected: , m_text{text} {} public: - ASTNODE_BASE_FUNCS(NodeText) + ASTGEN_MEMBERS_NodeText; virtual void dump(std::ostream& str = std::cout) const override; virtual bool same(const AstNode* samep) const override { const AstNodeText* asamep = static_cast(samep); @@ -618,7 +619,7 @@ public: AstNodeSimpleText(VNType t, FileLine* fl, const string& textp, bool tracking = false) : AstNodeText(t, fl, textp) , m_tracking(tracking) {} - ASTNODE_BASE_FUNCS(NodeSimpleText) + ASTGEN_MEMBERS_NodeSimpleText; void tracking(bool flag) { m_tracking = flag; } bool tracking() const { return m_tracking; } }; @@ -641,7 +642,7 @@ public: , m_sensesp{sensesp} { UASSERT(sensesp, "Sensesp required arg"); } - ASTNODE_NODE_FUNCS(Active) + ASTGEN_MEMBERS_Active; virtual void dump(std::ostream& str = std::cout) const override; virtual string name() const override { return m_name; } const char* broken() const override; @@ -670,7 +671,7 @@ public: , m_name{name} { setNOp1p(exprp); } - ASTNODE_NODE_FUNCS(Arg) + ASTGEN_MEMBERS_Arg; virtual string name() const override { return m_name; } // * = Pin name, ""=go by number virtual void name(const string& name) override { m_name = name; } void exprp(AstNode* nodep) { addOp1p(nodep); } @@ -689,7 +690,7 @@ public: setNOp2p(dimp); m_attrType = attrtype; } - ASTNODE_NODE_FUNCS(AttrOf) + ASTGEN_MEMBERS_AttrOf; AstNode* fromp() const { return op1p(); } AstNode* dimp() const { return op2p(); } VAttrType attrType() const { return m_attrType; } @@ -707,7 +708,7 @@ public: UASSERT_OBJ(VN_IS(cellsp, Cell), cellsp, "Only instances allowed to be bound"); addNOp1p(cellsp); } - ASTNODE_NODE_FUNCS(Bind) + ASTGEN_MEMBERS_Bind; // ACCESSORS virtual string name() const override { return m_name; } // * = Bind Target name virtual void name(const string& name) override { m_name = name; } @@ -777,7 +778,7 @@ public: m_dpiImportWrapper = false; m_dpiTraceInit = false; } - ASTNODE_NODE_FUNCS(CFunc) + ASTGEN_MEMBERS_CFunc; virtual string name() const override { return m_name; } const char* broken() const override; void cloneRelink() override; @@ -881,7 +882,7 @@ public: : ASTGEN_SUPER_CUse(fl) , m_useType{useType} , m_name{name} {} - ASTNODE_NODE_FUNCS(CUse) + ASTGEN_MEMBERS_CUse; virtual void dump(std::ostream& str = std::cout) const override; virtual string name() const override { return m_name; } VUseType useType() const { return m_useType; } @@ -897,7 +898,7 @@ public: addNOp1p(condsp); addNOp2p(bodysp); } - ASTNODE_NODE_FUNCS(CaseItem) + ASTGEN_MEMBERS_CaseItem; virtual int instrCount() const override { return widthInstrs() + INSTR_COUNT_BRANCH; } AstNode* condsp() const { return op1p(); } // op1 = list of possible matching expressions AstNode* bodysp() const { return op2p(); } // op2 = what to do @@ -920,7 +921,7 @@ public: setOp1p(lhsp); dtypeFrom(dtp); } - ASTNODE_NODE_FUNCS(Cast) + ASTGEN_MEMBERS_Cast; virtual bool hasDType() const override { return true; } virtual string emitVerilog() { return "((%d)'(%l))"; } virtual bool cleanOut() const { V3ERROR_NA_RETURN(true); } @@ -941,7 +942,7 @@ public: setOp1p(lhsp); setOp2p(dtp); } - ASTNODE_NODE_FUNCS(CastParse) + ASTGEN_MEMBERS_CastParse; virtual string emitVerilog() { return "((%d)'(%l))"; } virtual string emitC() { V3ERROR_NA_RETURN(""); } virtual bool cleanOut() const { V3ERROR_NA_RETURN(true); } @@ -958,7 +959,7 @@ public: setOp1p(lhsp); setOp2p((AstNode*)rhsp); } - ASTNODE_NODE_FUNCS(CastSize) + ASTGEN_MEMBERS_CastSize; // No hasDType because widthing removes this node before the hasDType check virtual string emitVerilog() { return "((%r)'(%l))"; } virtual bool cleanOut() const { V3ERROR_NA_RETURN(true); } @@ -993,7 +994,7 @@ public: addNOp2p((AstNode*)paramsp); setNOp3p((AstNode*)rangep); } - ASTNODE_NODE_FUNCS(Cell) + ASTGEN_MEMBERS_Cell; // No cloneRelink, we presume cloneee's want the same module linkages virtual void dump(std::ostream& str) const override; const char* broken() const override; @@ -1035,7 +1036,7 @@ public: , m_name{name} { addNOp1p(selectExprp); } - ASTNODE_NODE_FUNCS(CellArrayRef) + ASTGEN_MEMBERS_CellArrayRef; // ACCESSORS virtual string name() const override { return m_name; } // * = Array name AstNode* selp() const { return op1p(); } // op1 = Select expression @@ -1059,7 +1060,7 @@ public: , m_name{name} , m_origModName{origModName} , m_timeunit{timeunit} {} - ASTNODE_NODE_FUNCS(CellInline) + ASTGEN_MEMBERS_CellInline; virtual void dump(std::ostream& str) const override; const char* broken() const override; // ACCESSORS @@ -1082,7 +1083,7 @@ public: addNOp1p(cellp); addNOp2p(exprp); } - ASTNODE_NODE_FUNCS(CellRef) + ASTGEN_MEMBERS_CellRef; // ACCESSORS virtual string name() const override { return m_name; } // * = Array name AstNode* cellp() const { return op1p(); } // op1 = Cell @@ -1096,7 +1097,7 @@ public: : ASTGEN_SUPER_ClassExtends(fl) { setNOp2p(classOrPkgsp); // Only for parser } - ASTNODE_NODE_FUNCS(ClassExtends) + ASTGEN_MEMBERS_ClassExtends; virtual bool hasDType() const override { return true; } virtual string verilogKwd() const override { return "extends"; } AstNodeDType* childDTypep() const { return VN_AS(op1p(), NodeDType); } @@ -1117,7 +1118,7 @@ public: , m_classOrPackageNodep{classOrPackageNodep} { addNOp4p(paramsp); } - ASTNODE_NODE_FUNCS(ClassOrPackageRef) + ASTGEN_MEMBERS_ClassOrPackageRef; // METHODS virtual const char* broken() const override { BROKEN_RTN(m_classOrPackageNodep && !m_classOrPackageNodep->brokeExists()); @@ -1151,7 +1152,7 @@ public: addOp1p((AstNode*)sensesp); addNOp2p(bodysp); } - ASTNODE_NODE_FUNCS(Clocking) + ASTGEN_MEMBERS_Clocking; // op1 = Sensitivity list AstSenItem* sensesp() const { return VN_AS(op1p(), SenItem); } AstNode* bodysp() const { return op2p(); } // op2 = Body @@ -1167,7 +1168,7 @@ class AstConstPool final : public AstNode { public: explicit AstConstPool(FileLine* fl); - ASTNODE_NODE_FUNCS(ConstPool) + ASTGEN_MEMBERS_ConstPool; virtual bool maybePointedTo() const override { return true; } const char* broken() const override; virtual void cloneRelink() override { V3ERROR_NA; } @@ -1201,7 +1202,7 @@ public: setOp1p(rhsp); } virtual string name() const override { return m_name; } // * = Scope name - ASTNODE_NODE_FUNCS(DefParam) + ASTGEN_MEMBERS_DefParam; virtual bool same(const AstNode*) const override { return true; } AstNode* rhsp() const { return op1p(); } // op1 = Assign from string path() const { return m_path; } @@ -1217,7 +1218,7 @@ public: setOp1p(lhsp); setOp2p(rhsp); } - ASTNODE_NODE_FUNCS(Dot) + ASTGEN_MEMBERS_Dot; // For parser, make only if non-null package static AstNode* newIfPkg(FileLine* fl, AstNode* packageOrClassp, AstNode* rhsp) { if (!packageOrClassp) return rhsp; @@ -1241,7 +1242,7 @@ public: : ASTGEN_SUPER_DpiExport(fl) , m_name{vname} , m_cname{cname} {} - ASTNODE_NODE_FUNCS(DpiExport) + ASTGEN_MEMBERS_DpiExport; virtual string name() const override { return m_name; } virtual void name(const string& name) override { m_name = name; } string cname() const { return m_cname; } @@ -1255,7 +1256,7 @@ private: public: inline AstElabDisplay(FileLine* fl, VDisplayType dispType, AstNode* exprsp); - ASTNODE_NODE_FUNCS(ElabDisplay) + ASTGEN_MEMBERS_ElabDisplay; virtual const char* broken() const override { BROKEN_RTN(!fmtp()); return nullptr; @@ -1284,7 +1285,7 @@ class AstEmpty final : public AstNode { public: explicit AstEmpty(FileLine* fl) : ASTGEN_SUPER_Empty(fl) {} - ASTNODE_NODE_FUNCS(Empty) + ASTGEN_MEMBERS_Empty; virtual bool same(const AstNode* /*samep*/) const override { return true; } }; class AstExecGraph final : public AstNode { @@ -1300,8 +1301,8 @@ private: public: explicit AstExecGraph(FileLine* fl, const string& name); - ASTNODE_NODE_FUNCS_NO_DTOR(ExecGraph) - virtual ~AstExecGraph() override; + ASTGEN_MEMBERS_ExecGraph; + ~AstExecGraph() override; virtual const char* broken() const override { BROKEN_RTN(!m_depGraphp); return nullptr; @@ -1323,7 +1324,7 @@ public: : ASTGEN_SUPER_Implicit(fl) { addNOp1p(exprsp); } - ASTNODE_NODE_FUNCS(Implicit) + ASTGEN_MEMBERS_Implicit; AstNode* exprsp() const { return op1p(); } // op1 = Assign from }; class AstInitArray final : public AstNode { @@ -1344,7 +1345,7 @@ public: dtypep(newDTypep); addNOp1p(defaultp); } - ASTNODE_NODE_FUNCS(InitArray) + ASTGEN_MEMBERS_InitArray; virtual void dump(std::ostream& str) const override; const char* broken() const override; void cloneRelink() override; @@ -1373,7 +1374,7 @@ public: : ASTGEN_SUPER_InitItem(fl) { addOp1p(valuep); } - ASTNODE_NODE_FUNCS(InitItem) + ASTGEN_MEMBERS_InitItem; virtual bool maybePointedTo() const override { return true; } virtual bool hasDType() const override { return false; } // See valuep()'s dtype instead AstNode* valuep() const { return op1p(); } // op1 = Value @@ -1388,7 +1389,7 @@ public: : ASTGEN_SUPER_IntfRef(fl) , m_name{name} {} virtual string name() const override { return m_name; } - ASTNODE_NODE_FUNCS(IntfRef) + ASTGEN_MEMBERS_IntfRef; }; class AstMTaskBody final : public AstNode { // Hold statements for each MTask @@ -1398,7 +1399,7 @@ private: public: explicit AstMTaskBody(FileLine* fl) : ASTGEN_SUPER_MTaskBody(fl) {} - ASTNODE_NODE_FUNCS(MTaskBody); + ASTGEN_MEMBERS_MTaskBody; virtual const char* broken() const override { BROKEN_RTN(!m_execMTaskp); return nullptr; @@ -1428,7 +1429,7 @@ public: } virtual string name() const override { return m_name; } virtual bool maybePointedTo() const override { return true; } - ASTNODE_NODE_FUNCS(Modport) + ASTGEN_MEMBERS_Modport; AstNode* varsp() const { return op1p(); } // op1 = List of Vars }; class AstModportFTaskRef final : public AstNode { @@ -1445,7 +1446,7 @@ public: : ASTGEN_SUPER_ModportFTaskRef(fl) , m_name{name} , m_export{isExport} {} - ASTNODE_NODE_FUNCS(ModportFTaskRef) + ASTGEN_MEMBERS_ModportFTaskRef; const char* broken() const override; void cloneRelink() override; virtual void dump(std::ostream& str) const override; @@ -1468,7 +1469,7 @@ public: : ASTGEN_SUPER_ModportVarRef(fl) , m_name{name} , m_direction{direction} {} - ASTNODE_NODE_FUNCS(ModportVarRef) + ASTGEN_MEMBERS_ModportVarRef; const char* broken() const override; void cloneRelink() override; virtual void dump(std::ostream& str) const override; @@ -1498,7 +1499,7 @@ private: uint32_t m_nextFreeMTaskProfilingID = 0; // Next unique ID to use for PGO public: AstNetlist(); - ASTNODE_NODE_FUNCS(Netlist) + ASTGEN_MEMBERS_Netlist; const char* broken() const override; virtual void cloneRelink() override { V3ERROR_NA; } virtual string name() const override { return "$root"; } @@ -1549,7 +1550,7 @@ public: : ASTGEN_SUPER_PackageExport(fl) , m_name{name} , m_packagep{packagep} {} - ASTNODE_NODE_FUNCS(PackageExport) + ASTGEN_MEMBERS_PackageExport; const char* broken() const override; void cloneRelink() override; virtual void dump(std::ostream& str) const override; @@ -1563,7 +1564,7 @@ public: // cppcheck-suppress noExplicitConstructor AstPackageExportStarStar(FileLine* fl) : ASTGEN_SUPER_PackageExportStarStar(fl) {} - ASTNODE_NODE_FUNCS(PackageExportStarStar) + ASTGEN_MEMBERS_PackageExportStarStar; }; class AstPackageImport final : public AstNode { private: @@ -1575,7 +1576,7 @@ public: : ASTGEN_SUPER_PackageImport(fl) , m_name{name} , m_packagep{packagep} {} - ASTNODE_NODE_FUNCS(PackageImport) + ASTGEN_MEMBERS_PackageImport; const char* broken() const override; void cloneRelink() override; virtual void dump(std::ostream& str) const override; @@ -1602,7 +1603,7 @@ public: setNOp1p(lhsp); setNOp2p((AstNode*)ftaskrefp); } - ASTNODE_NODE_FUNCS(ParseRef) + ASTGEN_MEMBERS_ParseRef; virtual void dump(std::ostream& str) const override; virtual string name() const override { return m_name; } // * = Var name virtual bool same(const AstNode* samep) const override { @@ -1635,7 +1636,7 @@ public: setNOp1p(exprp); } inline AstPin(FileLine* fl, int pinNum, AstVarRef* varname, AstNode* exprp); - ASTNODE_NODE_FUNCS(Pin) + ASTGEN_MEMBERS_Pin; virtual void dump(std::ostream& str) const override; const char* broken() const override; virtual string name() const override { return m_name; } // * = Pin name, ""=go by number @@ -1666,7 +1667,7 @@ public: : ASTGEN_SUPER_Port(fl) , m_pinNum{pinnum} , m_name{name} {} - ASTNODE_NODE_FUNCS(Port) + ASTGEN_MEMBERS_Port; virtual string name() const override { return m_name; } // * = Port name int pinNum() const { return m_pinNum; } // * = Pin number, for order based instantiation AstNode* exprp() const { return op1p(); } // op1 = Expression connected to port @@ -1680,7 +1681,7 @@ public: AstPragma(FileLine* fl, VPragmaType pragType) : ASTGEN_SUPER_Pragma(fl) , m_pragType{pragType} {} - ASTNODE_NODE_FUNCS(Pragma) + ASTGEN_MEMBERS_Pragma; VPragmaType pragType() const { return m_pragType; } // *=type of the pragma virtual bool isPredictOptimizable() const override { return false; } virtual bool same(const AstNode* samep) const override { @@ -1698,7 +1699,7 @@ public: addNOp2p(disablep); addOp3p(propp); } - ASTNODE_NODE_FUNCS(PropClocked) + ASTGEN_MEMBERS_PropClocked; virtual bool hasDType() const override { return true; } // Used under Cover, which expects a bool child @@ -1716,7 +1717,7 @@ public: , m_direction{direction} { setOp1p(lhsp); } - ASTNODE_NODE_FUNCS(Pull) + ASTGEN_MEMBERS_Pull; virtual bool same(const AstNode* samep) const override { return direction() == static_cast(samep)->direction(); } @@ -1756,7 +1757,7 @@ public: addNOp1p(exprsp); addNOp2p(nullptr); } - ASTNODE_NODE_FUNCS(SFormatF) + ASTGEN_MEMBERS_SFormatF; virtual string name() const override { return m_text; } virtual int instrCount() const override { return INSTR_COUNT_PLI; } virtual bool hasDType() const override { return true; } @@ -1798,7 +1799,7 @@ public: , m_aboveScopep{aboveScopep} , m_aboveCellp{aboveCellp} , m_modp{modp} {} - ASTNODE_NODE_FUNCS(Scope) + ASTGEN_MEMBERS_Scope; virtual void cloneRelink() override; virtual const char* broken() const override; virtual bool maybePointedTo() const override { return true; } @@ -1827,7 +1828,7 @@ public: setOp1p(fromp); addNOp2p(elementsp); } - ASTNODE_NODE_FUNCS(SelLoopVars) + ASTGEN_MEMBERS_SelLoopVars; virtual bool same(const AstNode* /*samep*/) const override { return true; } virtual bool maybePointedTo() const override { return false; } AstNode* fromp() const { return op1p(); } @@ -1865,7 +1866,7 @@ public: AstSenItem(FileLine* fl, Never) : ASTGEN_SUPER_SenItem(fl) , m_edgeType{VEdgeType::ET_NEVER} {} - ASTNODE_NODE_FUNCS(SenItem) + ASTGEN_MEMBERS_SenItem; virtual void dump(std::ostream& str) const override; virtual bool same(const AstNode* samep) const override { return edgeType() == static_cast(samep)->edgeType(); @@ -1899,7 +1900,7 @@ public: : ASTGEN_SUPER_SenTree(fl) { addNOp1p(sensesp); } - ASTNODE_NODE_FUNCS(SenTree) + ASTGEN_MEMBERS_SenTree; virtual void dump(std::ostream& str) const override; virtual bool maybePointedTo() const override { return true; } bool isMulti() const { return m_multi; } @@ -1918,7 +1919,7 @@ public: // Dummy node used within V3Split; never exists outside of V3Split. explicit AstSplitPlaceholder(FileLine* fl) : ASTGEN_SUPER_SplitPlaceholder(fl) {} - ASTNODE_NODE_FUNCS(SplitPlaceholder) + ASTGEN_MEMBERS_SplitPlaceholder; }; class AstStrengthSpec final : public AstNode { private: @@ -1931,7 +1932,7 @@ public: , m_s0{s0} , m_s1{s1} {} - ASTNODE_NODE_FUNCS(StrengthSpec) + ASTGEN_MEMBERS_StrengthSpec; VStrength strength0() { return m_s0; } VStrength strength1() { return m_s1; } virtual void dump(std::ostream& str) const override; @@ -1948,7 +1949,7 @@ class AstTopScope final : public AstNode { } public: - ASTNODE_NODE_FUNCS(TopScope) + ASTGEN_MEMBERS_TopScope; virtual bool maybePointedTo() const override { return true; } AstSenTree* senTreesp() const { return VN_AS(op1p(), SenTree); } void addSenTreep(AstSenTree* nodep) { addOp1p((AstNode*)nodep); } @@ -1967,7 +1968,7 @@ class AstTypeTable final : public AstNode { public: explicit AstTypeTable(FileLine* fl); - ASTNODE_NODE_FUNCS(TypeTable) + ASTGEN_MEMBERS_TypeTable; virtual bool maybePointedTo() const override { return true; } virtual const char* broken() const override { BROKEN_RTN(m_emptyQueuep && !m_emptyQueuep->brokeExists()); @@ -2005,7 +2006,7 @@ public: addAttrsp(attrsp); dtypep(nullptr); // V3Width will resolve } - ASTNODE_NODE_FUNCS(Typedef) + ASTGEN_MEMBERS_Typedef; virtual void dump(std::ostream& str) const override; virtual AstNodeDType* getChildDTypep() const override { return childDTypep(); } // op1 = Type assigning to @@ -2033,7 +2034,7 @@ public: AstTypedefFwd(FileLine* fl, const string& name) : ASTGEN_SUPER_TypedefFwd(fl) , m_name{name} {} - ASTNODE_NODE_FUNCS(TypedefFwd) + ASTGEN_MEMBERS_TypedefFwd; // METHODS virtual string name() const override { return m_name; } virtual bool maybePointedTo() const override { return true; } @@ -2044,7 +2045,7 @@ public: : ASTGEN_SUPER_UdpTable(fl) { addNOp1p(bodysp); } - ASTNODE_NODE_FUNCS(UdpTable) + ASTGEN_MEMBERS_UdpTable; // op1 = List of UdpTableLines AstUdpTableLine* bodysp() const { return VN_AS(op1p(), UdpTableLine); } }; @@ -2055,7 +2056,7 @@ public: AstUdpTableLine(FileLine* fl, const string& text) : ASTGEN_SUPER_UdpTableLine(fl) , m_text{text} {} - ASTNODE_NODE_FUNCS(UdpTableLine) + ASTGEN_MEMBERS_UdpTableLine; virtual string name() const override { return m_text; } string text() const { return m_text; } }; @@ -2070,7 +2071,7 @@ public: addNOp1p(refp); addNOp2p(crp); } - ASTNODE_NODE_FUNCS(UnlinkedRef) + ASTGEN_MEMBERS_UnlinkedRef; // ACCESSORS virtual string name() const override { return m_name; } // * = Var name AstNode* refp() const { return op1p(); } // op1 = VarXRef or AstNodeFTaskRef @@ -2230,7 +2231,7 @@ public: dtypeFrom(examplep); m_declKwd = examplep->declKwd(); } - ASTNODE_NODE_FUNCS(Var) + ASTGEN_MEMBERS_Var; virtual void dump(std::ostream& str) const override; virtual string name() const override { return m_name; } // * = Var name virtual bool hasDType() const override { return true; } @@ -2467,7 +2468,7 @@ public: m_trace = true; dtypeFrom(varp); } - ASTNODE_NODE_FUNCS(VarScope) + ASTGEN_MEMBERS_VarScope; virtual void cloneRelink() override { if (m_varp && m_varp->clonep()) { m_varp = m_varp->clonep(); @@ -2508,7 +2509,7 @@ public: : ASTGEN_SUPER_Begin(fl, name, stmtsp) , m_generate{generate} , m_implied{implied} {} - ASTNODE_NODE_FUNCS(Begin) + ASTGEN_MEMBERS_Begin; virtual void dump(std::ostream& str) const override; // op1p is statements in NodeBlock AstNode* genforp() const { return op2p(); } // op2 = GENFOR, if applicable, @@ -2528,7 +2529,7 @@ public: // Node that puts name into the output stream AstFork(FileLine* fl, const string& name, AstNode* stmtsp) : ASTGEN_SUPER_Fork(fl, name, stmtsp) {} - ASTNODE_NODE_FUNCS(Fork) + ASTGEN_MEMBERS_Fork; virtual void dump(std::ostream& str) const override; VJoinType joinType() const { return m_joinType; } void joinType(const VJoinType& flag) { m_joinType = flag; } @@ -2542,7 +2543,7 @@ public: : ASTGEN_SUPER_Func(fl, name, stmtp) { addNOp1p(fvarsp); } - ASTNODE_NODE_FUNCS(Func) + ASTGEN_MEMBERS_Func; virtual bool hasDType() const override { return true; } }; class AstTask final : public AstNodeFTask { @@ -2550,7 +2551,7 @@ class AstTask final : public AstNodeFTask { public: AstTask(FileLine* fl, const string& name, AstNode* stmtp) : ASTGEN_SUPER_Task(fl, name, stmtp) {} - ASTNODE_NODE_FUNCS(Task) + ASTGEN_MEMBERS_Task; }; // === AstNodeFile === @@ -2567,7 +2568,7 @@ public: , m_slow{false} , m_source{false} , m_support{false} {} - ASTNODE_NODE_FUNCS(CFile) + ASTGEN_MEMBERS_CFile; virtual void dump(std::ostream& str = std::cout) const override; bool slow() const { return m_slow; } void slow(bool flag) { m_slow = flag; } @@ -2582,7 +2583,7 @@ class AstVFile final : public AstNodeFile { public: AstVFile(FileLine* fl, const string& name) : ASTGEN_SUPER_VFile(fl, name) {} - ASTNODE_NODE_FUNCS(VFile) + ASTGEN_MEMBERS_VFile; virtual void dump(std::ostream& str = std::cout) const override; }; @@ -2600,7 +2601,7 @@ class AstClass final : public AstNodeModule { public: AstClass(FileLine* fl, const string& name) : ASTGEN_SUPER_Class(fl, name) {} - ASTNODE_NODE_FUNCS(Class) + ASTGEN_MEMBERS_Class; virtual string verilogKwd() const override { return "class"; } virtual bool maybePointedTo() const override { return true; } virtual void dump(std::ostream& str) const override; @@ -2638,7 +2639,7 @@ class AstClassPackage final : public AstNodeModule { public: AstClassPackage(FileLine* fl, const string& name) : ASTGEN_SUPER_ClassPackage(fl, name) {} - ASTNODE_NODE_FUNCS(ClassPackage) + ASTGEN_MEMBERS_ClassPackage; virtual string verilogKwd() const override { return "classpackage"; } virtual const char* broken() const override; virtual void cloneRelink() override; @@ -2651,7 +2652,7 @@ class AstIface final : public AstNodeModule { public: AstIface(FileLine* fl, const string& name) : ASTGEN_SUPER_Iface(fl, name) {} - ASTNODE_NODE_FUNCS(Iface) + ASTGEN_MEMBERS_Iface; // Interfaces have `timescale applicability but lots of code seems to // get false warnings if we enable this virtual string verilogKwd() const override { return "interface"; } @@ -2665,7 +2666,7 @@ public: AstModule(FileLine* fl, const string& name, bool program = false) : ASTGEN_SUPER_Module(fl, name) , m_isProgram{program} {} - ASTNODE_NODE_FUNCS(Module) + ASTGEN_MEMBERS_Module; virtual string verilogKwd() const override { return m_isProgram ? "program" : "module"; } virtual bool timescaleMatters() const override { return true; } }; @@ -2674,7 +2675,7 @@ class AstNotFoundModule final : public AstNodeModule { public: AstNotFoundModule(FileLine* fl, const string& name) : ASTGEN_SUPER_NotFoundModule(fl, name) {} - ASTNODE_NODE_FUNCS(NotFoundModule) + ASTGEN_MEMBERS_NotFoundModule; virtual string verilogKwd() const override { return "/*not-found-*/ module"; } virtual bool timescaleMatters() const override { return false; } }; @@ -2683,7 +2684,7 @@ class AstPackage final : public AstNodeModule { public: AstPackage(FileLine* fl, const string& name) : ASTGEN_SUPER_Package(fl, name) {} - ASTNODE_NODE_FUNCS(Package) + ASTGEN_MEMBERS_Package; virtual string verilogKwd() const override { return "package"; } virtual bool timescaleMatters() const override { return !isDollarUnit(); } static string dollarUnitName() { return AstNode::encodeName("$unit"); } @@ -2694,7 +2695,7 @@ class AstPrimitive final : public AstNodeModule { public: AstPrimitive(FileLine* fl, const string& name) : ASTGEN_SUPER_Primitive(fl, name) {} - ASTNODE_NODE_FUNCS(Primitive) + ASTGEN_MEMBERS_Primitive; virtual string verilogKwd() const override { return "primitive"; } virtual bool timescaleMatters() const override { return false; } }; @@ -2709,7 +2710,7 @@ public: UASSERT_OBJ(!v3Global.assertDTypesResolved(), this, "not coded to create after dtypes resolved"); } - ASTNODE_NODE_FUNCS(SelBit) + ASTGEN_MEMBERS_SelBit; AstNode* bitp() const { return rhsp(); } }; class AstSelExtract final : public AstNodePreSel { @@ -2717,7 +2718,7 @@ class AstSelExtract final : public AstNodePreSel { public: AstSelExtract(FileLine* fl, AstNode* fromp, AstNode* msbp, AstNode* lsbp) : ASTGEN_SUPER_SelExtract(fl, fromp, msbp, lsbp) {} - ASTNODE_NODE_FUNCS(SelExtract) + ASTGEN_MEMBERS_SelExtract; AstNode* leftp() const { return rhsp(); } AstNode* rightp() const { return thsp(); } }; @@ -2727,7 +2728,7 @@ class AstSelMinus final : public AstNodePreSel { public: AstSelMinus(FileLine* fl, AstNode* fromp, AstNode* bitp, AstNode* widthp) : ASTGEN_SUPER_SelMinus(fl, fromp, bitp, widthp) {} - ASTNODE_NODE_FUNCS(SelMinus) + ASTGEN_MEMBERS_SelMinus; AstNode* bitp() const { return rhsp(); } AstNode* widthp() const { return thsp(); } }; @@ -2737,7 +2738,7 @@ class AstSelPlus final : public AstNodePreSel { public: AstSelPlus(FileLine* fl, AstNode* fromp, AstNode* bitp, AstNode* widthp) : ASTGEN_SUPER_SelPlus(fl, fromp, bitp, widthp) {} - ASTNODE_NODE_FUNCS(SelPlus) + ASTGEN_MEMBERS_SelPlus; AstNode* bitp() const { return rhsp(); } AstNode* widthp() const { return thsp(); } }; @@ -2752,7 +2753,7 @@ public: , m_keyword{keyword} { addNOp1p(sensesp); } - ASTNODE_NODE_FUNCS(Always) + ASTGEN_MEMBERS_Always; // virtual void dump(std::ostream& str) const override; AstSenTree* sensesp() const { return VN_AS(op1p(), SenTree); } // op1 = Sensitivity list @@ -2766,7 +2767,7 @@ public: : ASTGEN_SUPER_AlwaysPost(fl, bodysp) { addNOp1p(sensesp); } - ASTNODE_NODE_FUNCS(AlwaysPost) + ASTGEN_MEMBERS_AlwaysPost; }; class AstAlwaysPostponed final : public AstNodeProcedure { // Like always but postponement scheduling region @@ -2774,19 +2775,19 @@ class AstAlwaysPostponed final : public AstNodeProcedure { public: AstAlwaysPostponed(FileLine* fl, AstNode* bodysp) : ASTGEN_SUPER_AlwaysPostponed(fl, bodysp) {} - ASTNODE_NODE_FUNCS(AlwaysPostponed) + ASTGEN_MEMBERS_AlwaysPostponed; }; class AstFinal final : public AstNodeProcedure { public: AstFinal(FileLine* fl, AstNode* bodysp) : ASTGEN_SUPER_Final(fl, bodysp) {} - ASTNODE_NODE_FUNCS(Final) + ASTGEN_MEMBERS_Final; }; class AstInitial final : public AstNodeProcedure { public: AstInitial(FileLine* fl, AstNode* bodysp) : ASTGEN_SUPER_Initial(fl, bodysp) {} - ASTNODE_NODE_FUNCS(Initial) + ASTGEN_MEMBERS_Initial; }; class AstInitialAutomatic final : public AstNodeProcedure { // Automatic variable initialization @@ -2794,7 +2795,7 @@ class AstInitialAutomatic final : public AstNodeProcedure { public: AstInitialAutomatic(FileLine* fl, AstNode* bodysp) : ASTGEN_SUPER_InitialAutomatic(fl, bodysp) {} - ASTNODE_NODE_FUNCS(InitialAutomatic) + ASTGEN_MEMBERS_InitialAutomatic; }; class AstInitialStatic final : public AstNodeProcedure { // Static variable initialization @@ -2802,7 +2803,7 @@ class AstInitialStatic final : public AstNodeProcedure { public: AstInitialStatic(FileLine* fl, AstNode* bodysp) : ASTGEN_SUPER_InitialStatic(fl, bodysp) {} - ASTNODE_NODE_FUNCS(InitialStatic) + ASTGEN_MEMBERS_InitialStatic; }; // === AstNodeRange === @@ -2814,7 +2815,7 @@ public: : ASTGEN_SUPER_BracketRange(fl) { setOp1p(elementsp); } - ASTNODE_NODE_FUNCS(BracketRange) + ASTGEN_MEMBERS_BracketRange; virtual string emitC() { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() { V3ERROR_NA_RETURN(""); } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -2833,7 +2834,7 @@ public: } inline AstRange(FileLine* fl, int left, int right); inline AstRange(FileLine* fl, const VNumRange& range); - ASTNODE_NODE_FUNCS(Range) + ASTGEN_MEMBERS_Range; AstNode* leftp() const { return op2p(); } AstNode* rightp() const { return op3p(); } inline int leftConst() const; @@ -2859,7 +2860,7 @@ class AstUnsizedRange final : public AstNodeRange { public: explicit AstUnsizedRange(FileLine* fl) : ASTGEN_SUPER_UnsizedRange(fl) {} - ASTNODE_NODE_FUNCS(UnsizedRange) + ASTGEN_MEMBERS_UnsizedRange; virtual string emitC() { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() { return "[]"; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -2869,7 +2870,7 @@ class AstWildcardRange final : public AstNodeRange { public: explicit AstWildcardRange(FileLine* fl) : ASTGEN_SUPER_WildcardRange(fl) {} - ASTNODE_NODE_FUNCS(WildcardRange) + ASTGEN_MEMBERS_WildcardRange; virtual string emitC() { V3ERROR_NA_RETURN(""); } virtual string emitVerilog() { return "[*]"; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -2885,7 +2886,7 @@ public: addNOp1p(sensesp); addNOp2p(bodysp); } - ASTNODE_NODE_FUNCS(AlwaysPublic) + ASTGEN_MEMBERS_AlwaysPublic; virtual bool same(const AstNode* /*samep*/) const override { return true; } // AstSenTree* sensesp() const { return VN_AS(op1p(), SenTree); } // op1 = Sensitivity list @@ -2899,7 +2900,7 @@ class AstBreak final : public AstNodeStmt { public: explicit AstBreak(FileLine* fl) : ASTGEN_SUPER_Break(fl) {} - ASTNODE_NODE_FUNCS(Break) + ASTGEN_MEMBERS_Break; virtual string verilogKwd() const override { return "break"; } virtual bool isBrancher() const override { return true; // SPECIAL: We don't process code after breaks @@ -2927,7 +2928,7 @@ public: setOp1p(fromp); addNOp2p(pinsp); } - ASTNODE_NODE_FUNCS(CMethodHard) + ASTGEN_MEMBERS_CMethodHard; virtual string name() const override { return m_name; } // * = Var name virtual bool hasDType() const override { return true; } virtual void name(const string& name) override { m_name = name; } @@ -2955,7 +2956,7 @@ public: : ASTGEN_SUPER_CReset(fl) { addNOp1p((AstNode*)exprsp); } - ASTNODE_NODE_FUNCS(CReset) + ASTGEN_MEMBERS_CReset; virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -2970,7 +2971,7 @@ public: : ASTGEN_SUPER_CReturn(fl) { setOp1p(lhsp); } - ASTNODE_NODE_FUNCS(CReturn) + ASTGEN_MEMBERS_CReturn; virtual int instrCount() const override { return widthInstrs(); } virtual bool same(const AstNode* /*samep*/) const override { return true; } // @@ -2984,7 +2985,7 @@ public: addNOp1p(exprsp); } inline AstCStmt(FileLine* fl, const string& textStmt); - ASTNODE_NODE_FUNCS(CStmt) + ASTGEN_MEMBERS_CStmt; virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -3000,7 +3001,7 @@ public: setNOp1p(lhsp); setNOp2p(rhsp); } - ASTNODE_NODE_FUNCS(ChangeDet) + ASTGEN_MEMBERS_ChangeDet; AstNode* lhsp() const { return op1p(); } AstNode* rhsp() const { return op2p(); } virtual bool isGateOptimizable() const override { return false; } @@ -3020,7 +3021,7 @@ public: : ASTGEN_SUPER_Comment(fl) , m_showAt{showAt} , m_name{name} {} - ASTNODE_NODE_FUNCS(Comment) + ASTGEN_MEMBERS_Comment; virtual string name() const override { return m_name; } // * = Text virtual bool same(const AstNode* samep) const override { return true; @@ -3031,7 +3032,7 @@ class AstContinue final : public AstNodeStmt { public: explicit AstContinue(FileLine* fl) : ASTGEN_SUPER_Continue(fl) {} - ASTNODE_NODE_FUNCS(Continue) + ASTGEN_MEMBERS_Continue; virtual string verilogKwd() const override { return "continue"; } virtual bool isBrancher() const override { return true; // SPECIAL: We don't process code after breaks @@ -3058,7 +3059,7 @@ public: , m_text{comment} , m_linescov{linescov} , m_offset{offset} {} - ASTNODE_NODE_FUNCS(CoverDecl) + ASTGEN_MEMBERS_CoverDecl; virtual const char* broken() const override { BROKEN_RTN(m_dataDeclp && !m_dataDeclp->brokeExists()); if (m_dataDeclp && m_dataDeclp->m_dataDeclp) { // Avoid O(n^2) accessing @@ -3103,7 +3104,7 @@ public: AstCoverInc(FileLine* fl, AstCoverDecl* declp) : ASTGEN_SUPER_CoverInc(fl) , m_declp{declp} {} - ASTNODE_NODE_FUNCS(CoverInc) + ASTGEN_MEMBERS_CoverInc; virtual const char* broken() const override { BROKEN_RTN(!declp()->brokeExists()); return nullptr; @@ -3133,7 +3134,7 @@ public: setOp2p(origp); setOp3p(changep); } - ASTNODE_NODE_FUNCS(CoverToggle) + ASTGEN_MEMBERS_CoverToggle; virtual int instrCount() const override { return 3 + INSTR_COUNT_BRANCH + INSTR_COUNT_LD; } virtual bool same(const AstNode* /*samep*/) const override { return true; } virtual bool isGateOptimizable() const override { return false; } @@ -3155,7 +3156,7 @@ public: setOp1p(lhsp); setNOp2p(stmtsp); } - ASTNODE_NODE_FUNCS(Delay) + ASTGEN_MEMBERS_Delay; virtual bool same(const AstNode* /*samep*/) const override { return true; } // AstNode* lhsp() const { return op1p(); } // op1 = delay value @@ -3170,7 +3171,7 @@ public: AstDisable(FileLine* fl, const string& name) : ASTGEN_SUPER_Disable(fl) , m_name{name} {} - ASTNODE_NODE_FUNCS(Disable) + ASTGEN_MEMBERS_Disable; virtual string name() const override { return m_name; } // * = Block name virtual void name(const string& flag) override { m_name = flag; } virtual bool isBrancher() const override { @@ -3182,7 +3183,7 @@ class AstDisableFork final : public AstNodeStmt { public: explicit AstDisableFork(FileLine* fl) : ASTGEN_SUPER_DisableFork(fl) {} - ASTNODE_NODE_FUNCS(DisableFork) + ASTGEN_MEMBERS_DisableFork; }; class AstDisplay final : public AstNodeStmt { // Parents: stmtlist @@ -3206,7 +3207,7 @@ public: setOp1p(new AstSFormatF{fl, AstSFormatF::NoFormat(), exprsp, missingArgChar}); setNOp3p(filep); } - ASTNODE_NODE_FUNCS(Display) + ASTGEN_MEMBERS_Display; virtual void dump(std::ostream& str) const override; virtual const char* broken() const override { BROKEN_RTN(!fmtp()); @@ -3240,7 +3241,7 @@ class AstDpiExportUpdated final : public AstNodeStmt { // Denotes that the referenced variable may have been updated via a DPI Export public: inline AstDpiExportUpdated(FileLine* fl, AstVarScope* varScopep); - ASTNODE_NODE_FUNCS(DpiExportUpdated) + ASTGEN_MEMBERS_DpiExportUpdated; inline AstVarScope* varScopep() const; }; class AstDumpCtl final : public AstNodeStmt { @@ -3254,7 +3255,7 @@ public: , m_ctlType{ctlType} { setNOp1p(exprp); } - ASTNODE_NODE_FUNCS(DumpCtl) + ASTGEN_MEMBERS_DumpCtl; virtual string verilogKwd() const override { return ctlType().ascii(); } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3273,7 +3274,7 @@ public: setNOp1p(sensesp); setNOp2p(stmtsp); } - ASTNODE_NODE_FUNCS(EventControl) + ASTGEN_MEMBERS_EventControl; virtual string verilogKwd() const override { return "@(%l) %r"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3291,7 +3292,7 @@ public: : ASTGEN_SUPER_FClose(fl) { setNOp2p(filep); } - ASTNODE_NODE_FUNCS(FClose) + ASTGEN_MEMBERS_FClose; virtual string verilogKwd() const override { return "$fclose"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3310,7 +3311,7 @@ public: : ASTGEN_SUPER_FFlush(fl) { setNOp2p(filep); } - ASTNODE_NODE_FUNCS(FFlush) + ASTGEN_MEMBERS_FFlush; virtual string verilogKwd() const override { return "$fflush"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3330,7 +3331,7 @@ public: setOp2p(filenamep); setOp3p(modep); } - ASTNODE_NODE_FUNCS(FOpen) + ASTGEN_MEMBERS_FOpen; virtual string verilogKwd() const override { return "$fopen"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3350,7 +3351,7 @@ public: setOp1p(filep); setOp2p(filenamep); } - ASTNODE_NODE_FUNCS(FOpenMcd) + ASTGEN_MEMBERS_FOpenMcd; virtual string verilogKwd() const override { return "$fopen"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3365,7 +3366,7 @@ class AstFinish final : public AstNodeStmt { public: explicit AstFinish(FileLine* fl) : ASTGEN_SUPER_Finish(fl) {} - ASTNODE_NODE_FUNCS(Finish) + ASTGEN_MEMBERS_Finish; virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } virtual bool isPure() const override { @@ -3385,7 +3386,7 @@ public: setOp1p(arrayp); addNOp4p(bodysp); } - ASTNODE_NODE_FUNCS(Foreach) + ASTGEN_MEMBERS_Foreach; AstNode* arrayp() const { return op1p(); } // op1 = array and index vars AstNode* bodysp() const { return op4p(); } // op4 = body of loop virtual bool isGateOptimizable() const override { return false; } @@ -3408,7 +3409,7 @@ public: } virtual const char* broken() const override; virtual void cloneRelink() override; - ASTNODE_NODE_FUNCS(JumpBlock) + ASTGEN_MEMBERS_JumpBlock; virtual int instrCount() const override { return 0; } virtual bool maybePointedTo() const override { return true; } virtual bool same(const AstNode* /*samep*/) const override { return true; } @@ -3433,7 +3434,7 @@ public: AstJumpGo(FileLine* fl, AstJumpLabel* labelp) : ASTGEN_SUPER_JumpGo(fl) , m_labelp{labelp} {} - ASTNODE_NODE_FUNCS(JumpGo); + ASTGEN_MEMBERS_JumpGo; const char* broken() const override; void cloneRelink() override; virtual void dump(std::ostream& str) const override; @@ -3457,7 +3458,7 @@ public: AstJumpLabel(FileLine* fl, AstJumpBlock* blockp) : ASTGEN_SUPER_JumpLabel(fl) , m_blockp{blockp} {} - ASTNODE_NODE_FUNCS(JumpLabel) + ASTGEN_MEMBERS_JumpLabel; virtual bool maybePointedTo() const override { return true; } virtual const char* broken() const override { BROKEN_RTN(!blockp()->brokeExistsAbove()); @@ -3481,7 +3482,7 @@ public: AstMonitorOff(FileLine* fl, bool off) : ASTGEN_SUPER_MonitorOff(fl) , m_off{off} {} - ASTNODE_NODE_FUNCS(MonitorOff) + ASTGEN_MEMBERS_MonitorOff; virtual string verilogKwd() const override { return m_off ? "$monitoroff" : "$monitoron"; } virtual bool isGateOptimizable() const override { return false; } // Though deleted before opt virtual bool isPredictOptimizable() const override { @@ -3502,7 +3503,7 @@ class AstPrintTimeScale final : public AstNodeStmt { public: explicit AstPrintTimeScale(FileLine* fl) : ASTGEN_SUPER_PrintTimeScale(fl) {} - ASTNODE_NODE_FUNCS(PrintTimeScale) + ASTGEN_MEMBERS_PrintTimeScale; virtual void name(const string& name) override { m_name = name; } virtual string name() const override { return m_name; } // * = Var name virtual void dump(std::ostream& str) const override; @@ -3522,7 +3523,7 @@ public: : ASTGEN_SUPER_Release(fl) { setOp1p(lhsp); } - ASTNODE_NODE_FUNCS(Release); + ASTGEN_MEMBERS_Release; AstNode* lhsp() const { return op1p(); } }; class AstRepeat final : public AstNodeStmt { @@ -3532,7 +3533,7 @@ public: setOp2p(countp); addNOp3p(bodysp); } - ASTNODE_NODE_FUNCS(Repeat) + ASTGEN_MEMBERS_Repeat; AstNode* countp() const { return op2p(); } // op2 = condition to continue AstNode* bodysp() const { return op3p(); } // op3 = body of loop virtual bool isGateOptimizable() const override { @@ -3548,7 +3549,7 @@ public: : ASTGEN_SUPER_Return(fl) { setNOp1p(lhsp); } - ASTNODE_NODE_FUNCS(Return) + ASTGEN_MEMBERS_Return; virtual string verilogKwd() const override { return "return"; } AstNode* lhsp() const { return op1p(); } virtual bool isBrancher() const override { @@ -3571,7 +3572,7 @@ public: setOp1p(new AstSFormatF(fl, AstSFormatF::NoFormat(), exprsp, missingArgChar)); setOp3p(lhsp); } - ASTNODE_NODE_FUNCS(SFormat) + ASTGEN_MEMBERS_SFormat; virtual const char* broken() const override { BROKEN_RTN(!fmtp()); return nullptr; @@ -3593,7 +3594,7 @@ class AstStop final : public AstNodeStmt { public: AstStop(FileLine* fl, bool maybe) : ASTGEN_SUPER_Stop(fl) {} - ASTNODE_NODE_FUNCS(Stop) + ASTGEN_MEMBERS_Stop; virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } virtual bool isPure() const override { @@ -3615,7 +3616,7 @@ public: : ASTGEN_SUPER_SysFuncAsTask(fl) { addNOp1p(exprsp); } - ASTNODE_NODE_FUNCS(SysFuncAsTask) + ASTGEN_MEMBERS_SysFuncAsTask; virtual string verilogKwd() const override { return ""; } virtual bool isGateOptimizable() const override { return true; } virtual bool isPredictOptimizable() const override { return true; } @@ -3634,7 +3635,7 @@ public: : ASTGEN_SUPER_SysIgnore(fl) { addNOp1p(exprsp); } - ASTNODE_NODE_FUNCS(SysIgnore) + ASTGEN_MEMBERS_SysIgnore; virtual string verilogKwd() const override { return "$ignored"; } virtual bool isGateOptimizable() const override { return false; } // Though deleted before opt virtual bool isPredictOptimizable() const override { @@ -3653,7 +3654,7 @@ public: : ASTGEN_SUPER_SystemT(fl) { setOp1p(lhsp); } - ASTNODE_NODE_FUNCS(SystemT) + ASTGEN_MEMBERS_SystemT; virtual string verilogKwd() const override { return "$system"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3674,7 +3675,7 @@ public: setOp3p(suffixp); setOp4p(widthp); } - ASTNODE_NODE_FUNCS(TimeFormat) + ASTGEN_MEMBERS_TimeFormat; virtual string verilogKwd() const override { return "$timeformat"; } virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3719,7 +3720,7 @@ public: } virtual void dump(std::ostream& str) const override; virtual int instrCount() const override { return 100; } // Large... - ASTNODE_NODE_FUNCS(TraceDecl) + ASTGEN_MEMBERS_TraceDecl; virtual string name() const override { return m_showname; } virtual bool maybePointedTo() const override { return true; } virtual bool hasDType() const override { return true; } @@ -3756,7 +3757,7 @@ public: dtypeFrom(declp); addOp2p(declp->valuep()->cloneTree(true)); } - ASTNODE_NODE_FUNCS(TraceInc) + ASTGEN_MEMBERS_TraceInc; virtual const char* broken() const override { BROKEN_RTN(!declp()->brokeExists()); return nullptr; @@ -3788,7 +3789,7 @@ public: AstTracePopNamePrefix(FileLine* fl, unsigned count) : ASTGEN_SUPER_TracePopNamePrefix(fl) , m_count{count} {} - ASTNODE_NODE_FUNCS(TracePopNamePrefix) + ASTGEN_MEMBERS_TracePopNamePrefix; virtual bool same(const AstNode* samep) const override { return false; } unsigned count() const { return m_count; } }; @@ -3798,7 +3799,7 @@ public: AstTracePushNamePrefix(FileLine* fl, const string& prefix) : ASTGEN_SUPER_TracePushNamePrefix(fl) , m_prefix{prefix} {} - ASTNODE_NODE_FUNCS(TracePushNamePrefix) + ASTGEN_MEMBERS_TracePushNamePrefix; virtual bool same(const AstNode* samep) const override { return false; } string prefix() const { return m_prefix; } }; @@ -3809,7 +3810,7 @@ public: : ASTGEN_SUPER_UCStmt(fl) { addNOp1p(exprsp); } - ASTNODE_NODE_FUNCS(UCStmt) + ASTGEN_MEMBERS_UCStmt; AstNode* bodysp() const { return op1p(); } // op1 = expressions to print virtual bool isGateOptimizable() const override { return false; } virtual bool isPredictOptimizable() const override { return false; } @@ -3824,7 +3825,7 @@ public: setOp2p(condp); addNOp3p(bodysp); } - ASTNODE_NODE_FUNCS(Wait) + ASTGEN_MEMBERS_Wait; AstNode* bodysp() const { return op3p(); } // op3 = body of loop bool isFirstInMyListOfStatements(AstNode* n) const override { return n == bodysp(); } }; @@ -3833,7 +3834,7 @@ class AstWaitFork final : public AstNodeStmt { public: explicit AstWaitFork(FileLine* fl) : ASTGEN_SUPER_WaitFork(fl) {} - ASTNODE_NODE_FUNCS(WaitFork) + ASTGEN_MEMBERS_WaitFork; }; class AstWhile final : public AstNodeStmt { public: @@ -3843,7 +3844,7 @@ public: addNOp3p(bodysp); addNOp4p(incsp); } - ASTNODE_NODE_FUNCS(While) + ASTGEN_MEMBERS_While; // op1 = prepare statements for condition (exec every loop) AstNode* precondsp() const { return op1p(); } AstNode* condp() const { return op2p(); } // op2 = condition to continue @@ -3876,7 +3877,7 @@ public: addOp2p((AstNode*)valueArgRefp); addNOp3p(exprp); } - ASTNODE_NODE_FUNCS(With) + ASTGEN_MEMBERS_With; virtual bool same(const AstNode* /*samep*/) const override { return true; } virtual bool hasDType() const override { return true; } virtual const char* broken() const override { @@ -3901,7 +3902,7 @@ public: setOp1p(funcrefp); addNOp2p(exprp); } - ASTNODE_NODE_FUNCS(WithParse) + ASTGEN_MEMBERS_WithParse; virtual bool same(const AstNode* /*samep*/) const override { return true; } // AstNode* funcrefp() const { return op1p(); } @@ -3915,7 +3916,7 @@ public: : ASTGEN_SUPER_Assign(fl, lhsp, rhsp, timingControlp) { dtypeFrom(lhsp); } - ASTNODE_NODE_FUNCS(Assign) + ASTGEN_MEMBERS_Assign; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssign(this->fileline(), lhsp, rhsp); } @@ -3927,7 +3928,7 @@ class AstAssignAlias final : public AstNodeAssign { public: AstAssignAlias(FileLine* fl, AstVarRef* lhsp, AstVarRef* rhsp) : ASTGEN_SUPER_AssignAlias(fl, (AstNode*)lhsp, (AstNode*)rhsp) {} - ASTNODE_NODE_FUNCS(AssignAlias) + ASTGEN_MEMBERS_AssignAlias; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { V3ERROR_NA_RETURN(nullptr); } @@ -3937,7 +3938,7 @@ class AstAssignDly final : public AstNodeAssign { public: AstAssignDly(FileLine* fl, AstNode* lhsp, AstNode* rhsp, AstNode* timingControlp = nullptr) : ASTGEN_SUPER_AssignDly(fl, lhsp, rhsp, timingControlp) {} - ASTNODE_NODE_FUNCS(AssignDly) + ASTGEN_MEMBERS_AssignDly; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssignDly(this->fileline(), lhsp, rhsp); } @@ -3950,7 +3951,7 @@ class AstAssignForce final : public AstNodeAssign { public: AstAssignForce(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_AssignForce(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(AssignForce) + ASTGEN_MEMBERS_AssignForce; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssignForce{this->fileline(), lhsp, rhsp}; } @@ -3961,7 +3962,7 @@ class AstAssignPost final : public AstNodeAssign { public: AstAssignPost(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_AssignPost(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(AssignPost) + ASTGEN_MEMBERS_AssignPost; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssignPost(this->fileline(), lhsp, rhsp); } @@ -3972,7 +3973,7 @@ class AstAssignPre final : public AstNodeAssign { public: AstAssignPre(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_AssignPre(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(AssignPre) + ASTGEN_MEMBERS_AssignPre; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssignPre(this->fileline(), lhsp, rhsp); } @@ -3985,7 +3986,7 @@ public: : ASTGEN_SUPER_AssignVarScope(fl, lhsp, rhsp) { dtypeFrom(rhsp); } - ASTNODE_NODE_FUNCS(AssignVarScope) + ASTGEN_MEMBERS_AssignVarScope; virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { return new AstAssignVarScope(this->fileline(), lhsp, rhsp); } @@ -3996,7 +3997,7 @@ class AstAssignW final : public AstNodeAssign { public: AstAssignW(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : ASTGEN_SUPER_AssignW(fl, lhsp, rhsp) {} - ASTNODE_NODE_FUNCS(AssignW) + ASTGEN_MEMBERS_AssignW; AstStrengthSpec* strengthSpecp() const { return VN_AS(op4p(), StrengthSpec); } void strengthSpecp(AstStrengthSpec* const strengthSpecp) { setOp4p((AstNode*)strengthSpecp); } virtual AstNode* cloneType(AstNode* lhsp, AstNode* rhsp) override { @@ -4024,7 +4025,7 @@ class AstCCall final : public AstNodeCCall { public: AstCCall(FileLine* fl, AstCFunc* funcp, AstNode* argsp = nullptr) : ASTGEN_SUPER_CCall(fl, funcp, argsp) {} - ASTNODE_NODE_FUNCS(CCall) + ASTGEN_MEMBERS_CCall; string selfPointer() const { return m_selfPointer; } void selfPointer(const string& value) { m_selfPointer = value; } @@ -4039,7 +4040,7 @@ public: : ASTGEN_SUPER_CMethodCall(fl, funcp, argsp) { setOp1p(fromp); } - ASTNODE_NODE_FUNCS(CMethodCall) + ASTGEN_MEMBERS_CMethodCall; virtual const char* broken() const override { BROKEN_BASE_RTN(AstNodeCCall::broken()); BROKEN_RTN(!fromp()); @@ -4060,7 +4061,7 @@ public: statement(false); } virtual bool hasDType() const override { return true; } - ASTNODE_NODE_FUNCS(CNew) + ASTGEN_MEMBERS_CNew; }; // === AstNodeCase === @@ -4080,7 +4081,7 @@ public: AstCase(FileLine* fl, VCaseType casex, AstNode* exprp, AstNode* casesp) : ASTGEN_SUPER_Case(fl, exprp, casesp) , m_casex{casex} {} - ASTNODE_NODE_FUNCS(Case) + ASTGEN_MEMBERS_Case; virtual string verilogKwd() const override { return casez() ? "casez" : casex() ? "casex" : "case"; } @@ -4111,13 +4112,13 @@ class AstGenCase final : public AstNodeCase { public: AstGenCase(FileLine* fl, AstNode* exprp, AstNode* casesp) : ASTGEN_SUPER_GenCase(fl, exprp, casesp) {} - ASTNODE_NODE_FUNCS(GenCase) + ASTGEN_MEMBERS_GenCase; }; // === AstNodeCoverOrAssert === class AstAssert final : public AstNodeCoverOrAssert { public: - ASTNODE_NODE_FUNCS(Assert) + ASTGEN_MEMBERS_Assert; AstAssert(FileLine* fl, AstNode* propp, AstNode* passsp, AstNode* failsp, bool immediate, const string& name = "") : ASTGEN_SUPER_Assert(fl, propp, passsp, immediate, name) { @@ -4128,7 +4129,7 @@ public: class AstAssertIntrinsic final : public AstNodeCoverOrAssert { // A $cast or other compiler inserted assert, that must run even without --assert option public: - ASTNODE_NODE_FUNCS(AssertIntrinsic) + ASTGEN_MEMBERS_AssertIntrinsic; AstAssertIntrinsic(FileLine* fl, AstNode* propp, AstNode* passsp, AstNode* failsp, bool immediate, const string& name = "") : ASTGEN_SUPER_AssertIntrinsic(fl, propp, passsp, immediate, name) { @@ -4138,7 +4139,7 @@ public: }; class AstCover final : public AstNodeCoverOrAssert { public: - ASTNODE_NODE_FUNCS(Cover) + ASTGEN_MEMBERS_Cover; AstCover(FileLine* fl, AstNode* propp, AstNode* stmtsp, bool immediate, const string& name = "") : ASTGEN_SUPER_Cover(fl, propp, stmtsp, immediate, name) {} @@ -4148,7 +4149,7 @@ public: }; class AstRestrict final : public AstNodeCoverOrAssert { public: - ASTNODE_NODE_FUNCS(Restrict) + ASTGEN_MEMBERS_Restrict; AstRestrict(FileLine* fl, AstNode* propp) : ASTGEN_SUPER_Restrict(fl, propp, nullptr, false, "") {} }; @@ -4161,7 +4162,7 @@ public: : ASTGEN_SUPER_FuncRef(fl, false, namep, pinsp) {} AstFuncRef(FileLine* fl, const string& name, AstNode* pinsp) : ASTGEN_SUPER_FuncRef(fl, false, name, pinsp) {} - ASTNODE_NODE_FUNCS(FuncRef) + ASTGEN_MEMBERS_FuncRef; virtual bool hasDType() const override { return true; } }; class AstMethodCall final : public AstNodeFTaskRef { @@ -4180,7 +4181,7 @@ public: : ASTGEN_SUPER_MethodCall(fl, false, name, pinsp) { setOp2p(fromp); } - ASTNODE_NODE_FUNCS(MethodCall) + ASTGEN_MEMBERS_MethodCall; virtual const char* broken() const override { BROKEN_BASE_RTN(AstNodeFTaskRef::broken()); BROKEN_RTN(!fromp()); @@ -4205,7 +4206,7 @@ class AstNew final : public AstNodeFTaskRef { public: AstNew(FileLine* fl, AstNode* pinsp) : ASTGEN_SUPER_New(fl, false, "new", pinsp) {} - ASTNODE_NODE_FUNCS(New) + ASTGEN_MEMBERS_New; virtual bool cleanOut() const { return true; } virtual bool same(const AstNode* /*samep*/) const override { return true; } virtual bool hasDType() const override { return true; } @@ -4220,7 +4221,7 @@ public: } AstTaskRef(FileLine* fl, const string& name, AstNode* pinsp) : ASTGEN_SUPER_TaskRef(fl, true, name, pinsp) {} - ASTNODE_NODE_FUNCS(TaskRef) + ASTGEN_MEMBERS_TaskRef; }; // === AstNodeFor === @@ -4228,7 +4229,7 @@ class AstGenFor final : public AstNodeFor { public: AstGenFor(FileLine* fl, AstNode* initsp, AstNode* condp, AstNode* incsp, AstNode* bodysp) : ASTGEN_SUPER_GenFor(fl, initsp, condp, incsp, bodysp) {} - ASTNODE_NODE_FUNCS(GenFor) + ASTGEN_MEMBERS_GenFor; }; // === AstNodeIf === @@ -4236,7 +4237,7 @@ class AstGenIf final : public AstNodeIf { public: AstGenIf(FileLine* fl, AstNode* condp, AstNode* ifsp, AstNode* elsesp) : ASTGEN_SUPER_GenIf(fl, condp, ifsp, elsesp) {} - ASTNODE_NODE_FUNCS(GenIf) + ASTGEN_MEMBERS_GenIf; }; class AstIf final : public AstNodeIf { private: @@ -4246,7 +4247,7 @@ private: public: AstIf(FileLine* fl, AstNode* condp, AstNode* ifsp = nullptr, AstNode* elsesp = nullptr) : ASTGEN_SUPER_If(fl, condp, ifsp, elsesp) {} - ASTNODE_NODE_FUNCS(If) + ASTGEN_MEMBERS_If; bool uniquePragma() const { return m_uniquePragma; } void uniquePragma(bool flag) { m_uniquePragma = flag; } bool unique0Pragma() const { return m_unique0Pragma; } @@ -4261,7 +4262,7 @@ public: AstReadMem(FileLine* fl, bool hex, AstNode* filenamep, AstNode* memp, AstNode* lsbp, AstNode* msbp) : ASTGEN_SUPER_ReadMem(fl, hex, filenamep, memp, lsbp, msbp) {} - ASTNODE_NODE_FUNCS(ReadMem); + ASTGEN_MEMBERS_ReadMem; virtual string verilogKwd() const override { return (isHex() ? "$readmemh" : "$readmemb"); } virtual const char* cFuncPrefixp() const override { return "VL_READMEM_"; } }; @@ -4270,7 +4271,7 @@ public: AstWriteMem(FileLine* fl, bool hex, AstNode* filenamep, AstNode* memp, AstNode* lsbp, AstNode* msbp) : ASTGEN_SUPER_WriteMem(fl, hex, filenamep, memp, lsbp, msbp) {} - ASTNODE_NODE_FUNCS(WriteMem) + ASTGEN_MEMBERS_WriteMem; virtual string verilogKwd() const override { return (isHex() ? "$writememh" : "$writememb"); } virtual const char* cFuncPrefixp() const override { return "VL_WRITEMEM_"; } }; @@ -4280,7 +4281,7 @@ class AstScCtor final : public AstNodeText { public: AstScCtor(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScCtor(fl, textp) {} - ASTNODE_NODE_FUNCS(ScCtor) + ASTGEN_MEMBERS_ScCtor; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4288,7 +4289,7 @@ class AstScDtor final : public AstNodeText { public: AstScDtor(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScDtor(fl, textp) {} - ASTNODE_NODE_FUNCS(ScDtor) + ASTGEN_MEMBERS_ScDtor; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4296,7 +4297,7 @@ class AstScHdr final : public AstNodeText { public: AstScHdr(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScHdr(fl, textp) {} - ASTNODE_NODE_FUNCS(ScHdr) + ASTGEN_MEMBERS_ScHdr; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4304,7 +4305,7 @@ class AstScImp final : public AstNodeText { public: AstScImp(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScImp(fl, textp) {} - ASTNODE_NODE_FUNCS(ScImp) + ASTGEN_MEMBERS_ScImp; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4312,7 +4313,7 @@ class AstScImpHdr final : public AstNodeText { public: AstScImpHdr(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScImpHdr(fl, textp) {} - ASTNODE_NODE_FUNCS(ScImpHdr) + ASTGEN_MEMBERS_ScImpHdr; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4320,7 +4321,7 @@ class AstScInt final : public AstNodeText { public: AstScInt(FileLine* fl, const string& textp) : ASTGEN_SUPER_ScInt(fl, textp) {} - ASTNODE_NODE_FUNCS(ScInt) + ASTGEN_MEMBERS_ScInt; virtual bool isPure() const override { return false; } // SPECIAL: User may order w/other sigs virtual bool isOutputter() const override { return true; } }; @@ -4330,7 +4331,7 @@ class AstText final : public AstNodeSimpleText { public: AstText(FileLine* fl, const string& textp, bool tracking = false) : ASTGEN_SUPER_Text(fl, textp, tracking) {} - ASTNODE_NODE_FUNCS(Text) + ASTGEN_MEMBERS_Text; }; class AstTextBlock final : public AstNodeSimpleText { private: @@ -4340,7 +4341,7 @@ public: bool commas = false) : ASTGEN_SUPER_TextBlock(fl, textp, tracking) , m_commas(commas) {} - ASTNODE_NODE_FUNCS(TextBlock) + ASTGEN_MEMBERS_TextBlock; void commas(bool flag) { m_commas = flag; } bool commas() const { return m_commas; } AstNode* nodesp() const { return op1p(); } diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index bf1cac868..4dd3d6e77 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -26,7 +26,7 @@ #include "V3PartitionGraph.h" // Just for mtask dumping #include "V3String.h" -#include "V3AstNodes__gen_macros.h" // Generated by 'astgen' +#include "V3Ast__gen_macros.h" // Generated by 'astgen' #include #include diff --git a/src/astgen b/src/astgen index d1fa39f31..02d8d06d6 100755 --- a/src/astgen +++ b/src/astgen @@ -7,6 +7,7 @@ import glob import os import re import sys +import textwrap # from pprint import pprint, pformat @@ -493,28 +494,59 @@ class Cpt: def read_types(filename): + hasErrors = False + + def error(lineno, message): + nonlocal hasErrors + print(filename + ":" + str(lineno) + ": %Error: " + message, + file=sys.stderr) + hasErrors = True + + node = None + hasAstgenMembers = False + + def checkFinishedNode(node): + nonlocal hasAstgenMembers + if not node: + return + if not hasAstgenMembers: + error( + node.lineno, "'Ast" + node.name + + "' does not contain 'ASTGEN_MEMBERS_" + node.name + ";'") + hasAstgenMembers = False + with open(filename) as fh: for (lineno, line) in enumerate(fh, start=1): - line = re.sub(r'//.*$', '', line) - if re.match(r'^\s*$', line): + line = line.strip() + if not line: continue + match = re.search(r'^\s*(class|struct)\s*(\S+)', line) if match: classn = match.group(2) match = re.search(r':\s*public\s+(\S+)', line) supern = match.group(1) if match else "" - assert classn != "AstNode" or supern == "", "AstNode can't have a superclass" - if re.search(r'Ast', supern) or classn == "AstNode": + if re.search(r'Ast', supern): classn = re.sub(r'^Ast', '', classn) supern = re.sub(r'^Ast', '', supern) if not supern: sys.exit("%Error: 'Ast{}' has no super-class".format( classn)) + checkFinishedNode(node) superClass = Nodes[supern] node = Node(classn, superClass, filename, lineno) superClass.addSubClass(node) Nodes[classn] = node + if not node: + continue + + if re.match(r'^\s*ASTGEN_MEMBERS_' + node.name + ';', line): + hasAstgenMembers = True + checkFinishedNode(node) + if hasErrors: + sys.exit("%Error: Stopping due to errors reported above") + def read_stages(filename): with open(filename) as fh: @@ -698,13 +730,41 @@ def write_yystype(filename): def write_macros(filename): with open_file(filename) as fh: - for node in SortedNodes: - # Only care about leaf classes - if not node.isLeaf: - continue + + def emitBlock(pattern, **fmt): fh.write( - "#define ASTGEN_SUPER_{t}(...) Ast{b}(VNType::at{t}, __VA_ARGS__)\n" - .format(t=node.name, b=node.superClass.name)) + textwrap.indent(textwrap.dedent(pattern), + " ").format(**fmt).replace("\n", " \\\n")) + + for node in SortedNodes: + fh.write("#define ASTGEN_MEMBERS_{t} \\\n".format(t=node.name)) + emitBlock('''\ + static Ast{t}* cloneTreeNull(Ast{t}* nodep, bool cloneNextLink) {{ + return nodep ? nodep->cloneTree(cloneNextLink) : nullptr; + }} + Ast{t}* cloneTree(bool cloneNext) {{ + return static_cast(AstNode::cloneTree(cloneNext)); + }} + Ast{t}* clonep() const {{ return static_cast(AstNode::clonep()); }} + ''', + t=node.name) + + if node.isLeaf: + emitBlock('''\ + virtual void accept(VNVisitor& v) override {{ v.visit(this); }} + virtual AstNode* clone() override {{ return new Ast{t}(*this); }} + ''', + t=node.name) + + fh.write( + " static_assert(true, \"\")\n") # Swallowing the semicolon + + # Only care about leaf classes for the rest + if node.isLeaf: + fh.write( + "#define ASTGEN_SUPER_{t}(...) Ast{b}(VNType::at{t}, __VA_ARGS__)\n" + .format(t=node.name, b=node.superClass.name)) + fh.write("\n") ###################################################################### @@ -807,7 +867,7 @@ if Args.classes: write_impl("V3Ast__gen_impl.h") write_types("V3Ast__gen_types.h") write_yystype("V3Ast__gen_yystype.h") - write_macros("V3AstNodes__gen_macros.h") + write_macros("V3Ast__gen_macros.h") for cpt in Args.infiles: if not re.search(r'.cpp$', cpt):