From a37af8b2d9bde95840f6ddeb2ff684c3e3225367 Mon Sep 17 00:00:00 2001 From: Geza Lore Date: Sun, 15 Feb 2026 17:59:26 +0000 Subject: [PATCH] Add stats --- src/V3Timing.cpp | 22 ++++++++++++++++++- ...0delay.out => t_scheduling_zero_delay.out} | 0 ...g_0delay.py => t_scheduling_zero_delay.py} | 6 ++++- ...ing_0delay.v => t_scheduling_zero_delay.v} | 0 4 files changed, 26 insertions(+), 2 deletions(-) rename test_regress/t/{t_scheduling_0delay.out => t_scheduling_zero_delay.out} (100%) rename test_regress/t/{t_scheduling_0delay.py => t_scheduling_zero_delay.py} (65%) rename test_regress/t/{t_scheduling_0delay.v => t_scheduling_zero_delay.v} (100%) diff --git a/src/V3Timing.cpp b/src/V3Timing.cpp index 6f6a31b52..a053b047e 100644 --- a/src/V3Timing.cpp +++ b/src/V3Timing.cpp @@ -71,6 +71,7 @@ #include "V3MemberMap.h" #include "V3SenExprBuilder.h" #include "V3SenTree.h" +#include "V3Stats.h" #include "V3UniqueNames.h" #include @@ -504,6 +505,11 @@ class TimingControlVisitor final : public VNVisitor { SenTreeFinder m_finder{m_netlistp}; // Sentree finder and uniquifier SenExprBuilder* m_senExprBuilderp = nullptr; // Sens expression builder for current m_scope + // Stats + size_t m_statZeroDelays = 0; // Number of statically known #0 delays + size_t m_statConstDelays = 0; // Number of statically known #const (non-zero) delays + size_t m_statVariableDelays = 0; // Number of delays with value unknown at compile time + // METHODS // Transform an assignment with an intra timing control into a timing control with the // assignment under it @@ -947,6 +953,16 @@ class TimingControlVisitor final : public VNVisitor { valuep = V3Const::constifyEdit(valuep); } + // Statistics + if (valuep->isZero()) { + ++m_statZeroDelays; + } else if (VN_IS(valuep, Const)) { + ++m_statConstDelays; + } else { + ++m_statVariableDelays; + } + + // Decide scheduling support for #0 if (v3Global.opt.schedZeroDelay().isSetTrue()) { // User said to schedule for #0 support, nothing else to do v3Global.setUsesZeroDelay(); @@ -1381,7 +1397,11 @@ public: << "... use '--sched-zero-delay' to suppress this warning."); } } - ~TimingControlVisitor() override = default; + ~TimingControlVisitor() override { + V3Stats::addStat("Timing, known #0 delays", m_statZeroDelays); + V3Stats::addStat("Timing, known #const delays", m_statConstDelays); + V3Stats::addStat("Timing, unknown #variable delays", m_statVariableDelays); + } }; //###################################################################### diff --git a/test_regress/t/t_scheduling_0delay.out b/test_regress/t/t_scheduling_zero_delay.out similarity index 100% rename from test_regress/t/t_scheduling_0delay.out rename to test_regress/t/t_scheduling_zero_delay.out diff --git a/test_regress/t/t_scheduling_0delay.py b/test_regress/t/t_scheduling_zero_delay.py similarity index 65% rename from test_regress/t/t_scheduling_0delay.py rename to test_regress/t/t_scheduling_zero_delay.py index fe0ab6714..1eaed2d2b 100755 --- a/test_regress/t/t_scheduling_0delay.py +++ b/test_regress/t/t_scheduling_zero_delay.py @@ -11,8 +11,12 @@ import vltest_bootstrap test.scenarios('simulator') -test.compile(verilator_flags2=["--binary", "--timing"]) +test.compile(verilator_flags2=["--binary", "--stats"]) test.execute(expect_filename=test.golden_filename) +test.file_grep(test.stats, r'Timing, known #0 delays\s+(\d+)', 1) +test.file_grep(test.stats, r'Timing, known #const delays\s+(\d+)', 2) +test.file_grep(test.stats, r'Timing, unknown #variable delays\s+(\d+)', 0) + test.passes() diff --git a/test_regress/t/t_scheduling_0delay.v b/test_regress/t/t_scheduling_zero_delay.v similarity index 100% rename from test_regress/t/t_scheduling_0delay.v rename to test_regress/t/t_scheduling_zero_delay.v