From 4b273a4ae9e4fc43b9580de82015a56d4095c85b Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Tue, 15 Apr 2025 12:04:09 +0200 Subject: [PATCH] share: Cleanup and additional testing Fixes a typo and adds another test case that triggers the fallback behavior as the existing tests all trigger the new optimization. --- passes/opt/share.cc | 16 ++++++++-------- tests/sat/share.v | 23 +++++++++++++++++++++++ tests/sat/share.ys | 6 +++++- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/passes/opt/share.cc b/passes/opt/share.cc index 580549e4d..1d7ba7d98 100644 --- a/passes/opt/share.cc +++ b/passes/opt/share.cc @@ -1013,10 +1013,10 @@ struct ShareWorker return bits; } - bool onesided_restrict_activiation_patterns( + bool onesided_restrict_activation_patterns( pool &activation_patterns, const pool> &other_bits) { - pool new_activiation_patterns; + pool new_activation_patterns; bool simplified = false; @@ -1032,22 +1032,22 @@ struct ShareWorker simplified = true; } } - new_activiation_patterns.emplace(std::move(new_pair)); + new_activation_patterns.emplace(std::move(new_pair)); } - activation_patterns = std::move(new_activiation_patterns); + activation_patterns = std::move(new_activation_patterns); return simplified; } // Only valid if the patterns on their own (i.e. without considering their input cone) are mutually exclusive! - bool restrict_activiation_patterns(pool &activation_patterns, pool &other_activation_patterns) + bool restrict_activation_patterns(pool &activation_patterns, pool &other_activation_patterns) { pool> bits = pattern_bits(activation_patterns); pool> other_bits = pattern_bits(other_activation_patterns); bool simplified = false; - simplified |= onesided_restrict_activiation_patterns(activation_patterns, other_bits); - simplified |= onesided_restrict_activiation_patterns(other_activation_patterns, bits); + simplified |= onesided_restrict_activation_patterns(activation_patterns, other_bits); + simplified |= onesided_restrict_activation_patterns(other_activation_patterns, bits); optimize_activation_patterns(activation_patterns); optimize_activation_patterns(other_activation_patterns); @@ -1401,7 +1401,7 @@ struct ShareWorker } else { log(" According to the SAT solver this pair of cells can be shared. (Pattern only case)\n"); - if (restrict_activiation_patterns(optimized_cell_activation_patterns, optimized_other_cell_activation_patterns)) { + if (restrict_activation_patterns(optimized_cell_activation_patterns, optimized_other_cell_activation_patterns)) { for (auto &p : optimized_cell_activation_patterns) log(" Simplified activation pattern for cell %s: %s = %s\n", log_id(cell), log_signal(p.first), log_signal(p.second)); diff --git a/tests/sat/share.v b/tests/sat/share.v index e06fc8f1e..29e423137 100644 --- a/tests/sat/share.v +++ b/tests/sat/share.v @@ -30,3 +30,26 @@ module test_2( end endmodule + +module test_3( + input [3:0] s, + input [7:0] a, b, c, + output reg [7:0] y0, + output reg [7:0] y1, + output reg [7:0] y2, + output reg [7:0] y3, +); + wire is_onehot = s & (s - 1); + + always @* begin + y0 <= 0; + y1 <= 0; + y2 <= 0; + y3 <= 0; + if (s < 3) y0 <= b / c; + if (3 <= s && s < 6) y1 <= c / b; + if (6 <= s && s < 9) y2 <= a / b; + if (9 <= s && s < 12) y3 <= b / a; + end +endmodule + diff --git a/tests/sat/share.ys b/tests/sat/share.ys index f2f5d649d..ef88d55c3 100644 --- a/tests/sat/share.ys +++ b/tests/sat/share.ys @@ -3,11 +3,13 @@ proc;; copy test_1 gold_1 copy test_2 gold_2 -share test_1 test_2;; +copy test_3 gold_3 +share test_1 test_2 test_3;; select -assert-count 1 test_1/t:$mul select -assert-count 1 test_2/t:$mul select -assert-count 1 test_2/t:$div +select -assert-count 1 test_3/t:$div miter -equiv -flatten -make_outputs -make_outcmp gold_1 test_1 miter_1 sat -verify -prove trigger 0 -show-inputs -show-outputs miter_1 @@ -15,3 +17,5 @@ sat -verify -prove trigger 0 -show-inputs -show-outputs miter_1 miter -equiv -flatten -make_outputs -make_outcmp gold_2 test_2 miter_2 sat -verify -prove trigger 0 -show-inputs -show-outputs miter_2 +miter -equiv -flatten -make_outputs -make_outcmp gold_3 test_3 miter_3 +sat -verify -prove trigger 0 -show-inputs -show-outputs miter_3