From 2cd8dc6cf749346ede6cb6746df9fa23dd673693 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Wed, 18 Feb 2026 19:11:33 +0000 Subject: [PATCH] Optimize functions inlined from packages in Dfg (#7091) --- src/V3Broken.cpp | 2 ++ src/V3Scope.cpp | 1 + test_regress/t/t_dfg_synthesis.v | 21 +++++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/V3Broken.cpp b/src/V3Broken.cpp index 0eb93d473..9d02c390c 100644 --- a/src/V3Broken.cpp +++ b/src/V3Broken.cpp @@ -274,6 +274,8 @@ private: UASSERT_OBJ( !(v3Global.assertScoped() && m_inScope && nodep->varp() && !nodep->varScopep()), nodep, "VarRef missing VarScope pointer"); + UASSERT_OBJ(!v3Global.assertScoped() || !nodep->classOrPackagep(), nodep, + "VarRef classOrPackagep must be nullptr after V3Scope"); if (m_cfuncp) { // Check if variable is an in-scope local, otherwise mark as suspect if (const AstVar* const varp = nodep->varp()) { diff --git a/src/V3Scope.cpp b/src/V3Scope.cpp index 2cbef92df..b10ac4999 100644 --- a/src/V3Scope.cpp +++ b/src/V3Scope.cpp @@ -73,6 +73,7 @@ class ScopeVisitor final : public VNVisitor { "Can't locate class or package scope"); scopep = it2->second; } + nodep->classOrPackagep(nullptr); // No longer needed after V3Scope // Search up the scope hierarchy for the variable AstVarScope* varscp = nullptr; AstScope* searchScopep = scopep; diff --git a/test_regress/t/t_dfg_synthesis.v b/test_regress/t/t_dfg_synthesis.v index 42e2e41db..a28c12bc4 100644 --- a/test_regress/t/t_dfg_synthesis.v +++ b/test_regress/t/t_dfg_synthesis.v @@ -6,6 +6,12 @@ `define signal(name, expr) wire [$bits(expr)-1:0] ``name = expr +package pkg; + function automatic logic [7:0] sub(input logic [7:0] a, input logic [7:0] b); + return a - b; + endfunction +endpackage + module t ( `include "portlist.vh" // Boilerplate generated by t_dfg_break_cycles.py rand_a, rand_b, srand_a, srand_b @@ -524,4 +530,19 @@ module t ( end `signal(USES_LOOP_VAR, uses_loop_var); + function automatic logic [7:0] add(input logic [7:0] a, input logic [7:0] b); + return a + b; + endfunction + logic [7:0] func_1; + always_comb begin + func_1 = add(rand_a[7:0], rand_b[7:0]); + end + `signal(FUNC_1, func_1); + + logic [7:0] func_2; + always_comb begin + func_2 = pkg::sub(rand_a[7:0], rand_b[7:0]); + end + `signal(FUNC_2, func_2); + endmodule