From 579acced998b4613adee1cf53828db80c62d2a5c Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Sun, 22 Feb 2026 14:40:51 +0000 Subject: [PATCH] Internals: Make AstArg into an AstNode, not Expr (#7122) --- src/V3AstNodeExpr.h | 40 ++++++++++++++++++---------------------- src/V3DfgOptimizer.cpp | 4 ++-- src/V3Inst.cpp | 1 - src/V3Randomize.cpp | 6 ++++++ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index 165f29933..c762ded81 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -502,6 +502,24 @@ public: // === Concrete node types ===================================================== +// === AstNode === +class AstArg final : public AstNode { + // An argument to a function/task, which is either an expression, or is a placeholder for an + // omitted argument. + // @astgen op1 := exprp : Optional[AstNodeExpr] // nullptr if omitted + std::string m_name; // Argument name, or "" for number based interconnect +public: + AstArg(FileLine* fl, const std::string& name, AstNodeExpr* exprp) + : ASTGEN_SUPER_Arg(fl) + , m_name{name} { + this->exprp(exprp); + } + ASTGEN_MEMBERS_AstArg; + std::string name() const override VL_MT_STABLE { return m_name; } + void name(const std::string& name) override { m_name = name; } + bool emptyConnectNoNext() const { return !exprp() && name() == "" && !nextp(); } +}; + // === AstNodeExpr === class AstAddrOfCFunc final : public AstNodeExpr { // Get address of CFunc @@ -522,28 +540,6 @@ public: bool cleanOut() const override { return true; } AstCFunc* funcp() const { return m_funcp; } }; -class AstArg final : public AstNodeExpr { - // An argument to a function/task, which is either an expression, or is a placeholder for an - // omitted argument. - // TODO: AstArg should not be AstNodeExpr, but is currently used as such widely. Fix later. - // @astgen op1 := exprp : Optional[AstNodeExpr] // nullptr if omitted - string m_name; // Pin name, or "" for number based interconnect -public: - AstArg(FileLine* fl, const string& name, AstNodeExpr* exprp) - : ASTGEN_SUPER_Arg(fl) - , m_name{name} { - this->exprp(exprp); - } - ASTGEN_MEMBERS_AstArg; - bool hasDType() const override VL_MT_SAFE { return false; } - string name() const override VL_MT_STABLE { return m_name; } // * = Pin name, ""=go by number - void name(const string& name) override { m_name = name; } - bool emptyConnectNoNext() const { return !exprp() && name() == "" && !nextp(); } - - string emitVerilog() override { V3ERROR_NA_RETURN(""); } - string emitC() override { V3ERROR_NA_RETURN(""); } - bool cleanOut() const override { V3ERROR_NA_RETURN(true); } -}; class AstAttrOf final : public AstNodeExpr { // Return a value of a attribute, for example a LSB or array LSB of a signal // @astgen op1 := fromp : Optional[AstNode] diff --git a/src/V3DfgOptimizer.cpp b/src/V3DfgOptimizer.cpp index 78a21deb6..682008412 100644 --- a/src/V3DfgOptimizer.cpp +++ b/src/V3DfgOptimizer.cpp @@ -204,6 +204,7 @@ class DataflowExtractVisitor final : public VNVisitor { } void visit(AstNodeExpr* nodep) override { iterateChildrenConst(nodep); } + void visit(AstArg* nodep) override { iterateChildrenConst(nodep); } void visit(AstNodeVarRef* nodep) override { if (nodep->access().isWriteOrRW()) { @@ -218,8 +219,7 @@ class DataflowExtractVisitor final : public VNVisitor { } void visit(AstNode* nodep) override { - // Conservatively assume unhandled nodes are impure. This covers all AstNodeFTaskRef - // as AstNodeFTaskRef are sadly not AstNodeExpr. + // Conservatively assume unhandled nodes are impure. m_impure = true; // Still need to gather all references/force/release, etc. iterateChildrenConst(nodep); diff --git a/src/V3Inst.cpp b/src/V3Inst.cpp index 834b3a2c2..5122eafbf 100644 --- a/src/V3Inst.cpp +++ b/src/V3Inst.cpp @@ -566,7 +566,6 @@ private: void visit(AstNode* nodep) override { iterateChildren(nodep); } void visit(AstNew* nodep) override { iterateChildren(nodep); } void visit(AstMethodCall* nodep) override { iterateChildren(nodep); } - void visit(AstArg* nodep) override { iterateChildren(nodep); } public: // CONSTRUCTORS diff --git a/src/V3Randomize.cpp b/src/V3Randomize.cpp index d0eb41e53..621206d63 100644 --- a/src/V3Randomize.cpp +++ b/src/V3Randomize.cpp @@ -699,6 +699,12 @@ class RandomizeMarkVisitor final : public VNVisitor { || (nodep->op3p() && nodep->op3p()->user1()) || (nodep->op4p() && nodep->op4p()->user1())); } + void visit(AstArg* nodep) override { + iterateChildrenConst(nodep); + if (!m_constraintExprGenp && !m_inStdWith) return; + nodep->user1(nodep->exprp() && nodep->exprp()->user1()); + } + void visit(AstNode* nodep) override { iterateChildrenConst(nodep); } public: