From bbd132f6ba026efcb647a9634850dbbedb636d34 Mon Sep 17 00:00:00 2001 From: williamzhu17 Date: Tue, 1 Apr 2025 10:10:06 -0700 Subject: [PATCH 01/10] updated extract_reduce to not consider xnors --- passes/techmap/extract_reduce.cc | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/passes/techmap/extract_reduce.cc b/passes/techmap/extract_reduce.cc index 376f2a9d3..6b538c589 100644 --- a/passes/techmap/extract_reduce.cc +++ b/passes/techmap/extract_reduce.cc @@ -30,7 +30,6 @@ struct ExtractReducePass : public Pass And, Or, Xor, - Xnor, Mux }; @@ -51,8 +50,8 @@ struct ExtractReducePass : public Pass log("to map the design to only $_AND_ cells, run extract_reduce, map the remaining\n"); log("parts of the design to AND/OR/XOR cells, and run extract_reduce a second time.\n"); log("\n"); - log("Silimate has modified this pass to support word-level cells ($and, $or, $xor,\n"); - log("and $xnor) as well as the single-bit cells ($_AND_, $_OR_, $_XOR_, and $_XNOR_).\n"); + log("Silimate has modified this pass to support word-level cells ($and, $or, \n"); + log("and $xor) as well as the single-bit cells ($_AND_, $_OR_, and $_XOR_).\n"); log("Mux cells ($mux, $_MUX_) can also be reduced to $pmux cells with the mods.\n"); log("\n"); log(" -allow-off-chain\n"); @@ -85,12 +84,10 @@ struct ExtractReducePass : public Pass return (cell->type == ID($_AND_) && gt == GateType::And) || (cell->type == ID($_OR_) && gt == GateType::Or) || (cell->type == ID($_XOR_) && gt == GateType::Xor) || - (cell->type == ID($_XNOR_) && gt == GateType::Xnor) || (cell->type == ID($_MUX_) && gt == GateType::Mux) || (cell->type == ID($and) && IsSingleBit(cell) && gt == GateType::And) || (cell->type == ID($or) && IsSingleBit(cell) && gt == GateType::Or) || (cell->type == ID($xor) && IsSingleBit(cell) && gt == GateType::Xor) || - (cell->type == ID($xnor) && IsSingleBit(cell) && gt == GateType::Xnor) || (cell->type == ID($mux) && IsSingleBit(cell) && gt == GateType::Mux); } @@ -176,8 +173,6 @@ struct ExtractReducePass : public Pass gt = GateType::Or; else if (cell->type == ID($_XOR_)) gt = GateType::Xor; - else if (cell->type == ID($_XNOR_)) - gt = GateType::Xnor; else if (cell->type == ID($_MUX_)) gt = GateType::Mux; else if (cell->type == ID($and) && IsSingleBit(cell)) @@ -186,8 +181,6 @@ struct ExtractReducePass : public Pass gt = GateType::Or; else if (cell->type == ID($xor) && IsSingleBit(cell)) gt = GateType::Xor; - else if (cell->type == ID($xnor) && IsSingleBit(cell)) - gt = GateType::Xnor; else if (cell->type == ID($mux) && IsSingleBit(cell)) gt = GateType::Mux; else @@ -352,7 +345,7 @@ struct ExtractReducePass : public Pass SigSpec input, sel; for (auto it : sources) { bool cond; - if (head_cell->type == ID($_XOR_) || head_cell->type == ID($xor) || head_cell->type == ID($_XNOR_) || head_cell->type == ID($xnor)) + if (head_cell->type == ID($_XOR_) || head_cell->type == ID($xor)) cond = it.second & 1; else cond = it.second != 0; @@ -372,8 +365,6 @@ struct ExtractReducePass : public Pass module->addReduceOr(NEW_ID2_SUFFIX("reduce_or"), input, output, false, cell->get_src_attribute()); // SILIMATE: Improve the naming } else if (head_cell->type == ID($_XOR_) || head_cell->type == ID($xor)) { module->addReduceXor(NEW_ID2_SUFFIX("reduce_xor"), input, output, false, cell->get_src_attribute()); // SILIMATE: Improve the naming - } else if (head_cell->type == ID($_XNOR_) || head_cell->type == ID($xnor)) { - module->addReduceXnor(NEW_ID2_SUFFIX("reduce_xnor"), input, output, false, cell->get_src_attribute()); // SILIMATE: Improve the naming } else if (head_cell->type == ID($_MUX_) || head_cell->type == ID($mux)) { module->addPmux(NEW_ID2_SUFFIX("pmux"), State::Sx, input, sel, output, cell->get_src_attribute()); // SILIMATE: Improve the naming } else { From 8f5f4ecab4a1303c61f6482d4e728fc9da1a9d34 Mon Sep 17 00:00:00 2001 From: williamzhu17 Date: Tue, 1 Apr 2025 10:11:17 -0700 Subject: [PATCH 02/10] inital extract_reduce tests --- tests/silimate/extract_reduce.ys | 605 +++++++++++++++++++++++++++++++ 1 file changed, 605 insertions(+) create mode 100644 tests/silimate/extract_reduce.ys diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys new file mode 100644 index 000000000..1fbf1a06c --- /dev/null +++ b/tests/silimate/extract_reduce.ys @@ -0,0 +1,605 @@ +################################################################### +# Extract Reduce AND Gates Tests +################################################################### + +log -header "Simple AND chain" +log -push +design -reset +read_verilog < Date: Tue, 1 Apr 2025 10:18:20 -0700 Subject: [PATCH 03/10] added extra test for muxes --- tests/silimate/extract_reduce.ys | 47 +++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys index 1fbf1a06c..6cf9880fd 100644 --- a/tests/silimate/extract_reduce.ys +++ b/tests/silimate/extract_reduce.ys @@ -485,7 +485,7 @@ design -reset log -pop -# TODO + log -header "MUX chain with multiple branches" log -push design -reset @@ -520,6 +520,51 @@ log -pop +log -header "MUX chain with multiple uneven branches" +log -push +design -reset +read_verilog < Date: Tue, 1 Apr 2025 10:19:54 -0700 Subject: [PATCH 04/10] zero indexed wires --- tests/silimate/extract_reduce.ys | 174 +++++++++++++++---------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys index 6cf9880fd..888f0182a 100644 --- a/tests/silimate/extract_reduce.ys +++ b/tests/silimate/extract_reduce.ys @@ -39,13 +39,13 @@ module top ( input wire [5:0] a, output wire x ); - wire w1, w2, w3, w4; + wire w0, w1, w2, w3; - assign w1 = a[0] & a[1]; - assign w2 = a[2] & a[3]; - assign w3 = a[4] & a[5]; - assign w4 = w1 & w2; - assign x = w3 & w4; + assign w0 = a[0] & a[1]; + assign w1 = a[2] & a[3]; + assign w2 = a[4] & a[5]; + assign w3 = w0 & w1; + assign x = w2 & w3; endmodule EOF check -assert @@ -75,15 +75,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] & a[1]; - assign w2 = w1 & a[2]; - assign w3 = w2 & a[3]; - assign x = w3 & a[4]; + assign w0 = a[0] & a[1]; + assign w1 = w0 & a[2]; + assign w2 = w1 & a[3]; + assign x = w2 & a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -116,15 +116,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] & a[1]; - assign w2 = w1 & a[2]; - assign w3 = w2 & a[3]; - assign x = w3 & a[4]; + assign w0 = a[0] & a[1]; + assign w1 = w0 & a[2]; + assign w2 = w1 & a[3]; + assign x = w2 & a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -188,13 +188,13 @@ module top ( input wire [5:0] a, output wire x ); - wire w1, w2, w3, w4; + wire w0, w1, w2, w3; - assign w1 = a[0] | a[1]; - assign w2 = a[2] | a[3]; - assign w3 = a[4] | a[5]; - assign w4 = w1 | w2; - assign x = w3 | w4; + assign w0 = a[0] | a[1]; + assign w1 = a[2] | a[3]; + assign w2 = a[4] | a[5]; + assign w3 = w0 | w1; + assign x = w2 | w3; endmodule EOF check -assert @@ -224,15 +224,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] | a[1]; - assign w2 = w1 | a[2]; - assign w3 = w2 | a[3]; - assign x = w3 | a[4]; + assign w0 = a[0] | a[1]; + assign w1 = w0 | a[2]; + assign w2 = w1 | a[3]; + assign x = w2 | a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -265,15 +265,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] | a[1]; - assign w2 = w1 | a[2]; - assign w3 = w2 | a[3]; - assign x = w3 | a[4]; + assign w0 = a[0] | a[1]; + assign w1 = w0 | a[2]; + assign w2 = w1 | a[3]; + assign x = w2 | a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -337,13 +337,13 @@ module top ( input wire [5:0] a, output wire x ); - wire w1, w2, w3, w4; + wire w0, w1, w2, w3; - assign w1 = a[0] ^ a[1]; - assign w2 = a[2] ^ a[3]; - assign w3 = a[4] ^ a[5]; - assign w4 = w1 ^ w2; - assign x = w3 ^ w4; + assign w0 = a[0] ^ a[1]; + assign w1 = a[2] ^ a[3]; + assign w2 = a[4] ^ a[5]; + assign w3 = w0 ^ w1; + assign x = w2 ^ w3; endmodule EOF check -assert @@ -373,15 +373,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] ^ a[1]; - assign w2 = w1 ^ a[2]; - assign w3 = w2 ^ a[3]; - assign x = w3 ^ a[4]; + assign w0 = a[0] ^ a[1]; + assign w1 = w0 ^ a[2]; + assign w2 = w1 ^ a[3]; + assign x = w2 ^ a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -415,15 +415,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = a[0] ^ a[1]; - assign w2 = w1 ^ a[2]; - assign w3 = w2 ^ a[3]; - assign x = w3 ^ a[4]; + assign w0 = a[0] ^ a[1]; + assign w1 = w0 ^ a[2]; + assign w2 = w1 ^ a[3]; + assign x = w2 ^ a[4]; - // Off-chain use of w2 - assign y = w2; + // Off-chain use of w1 + assign y = w1; endmodule EOF check -assert @@ -461,11 +461,11 @@ module top ( input wire [3:0] a, output wire x ); - wire w1, w2; + wire w0, w1; - assign w1 = sel[0] ? a[1] : a[0]; - assign w2 = sel[1] ? a[2] : w1; - assign x = sel[2] ? a[3] : w2; + assign w0 = sel[0] ? a[1] : a[0]; + assign w1 = sel[1] ? a[2] : w0; + assign x = sel[2] ? a[3] : w1; endmodule EOF check -assert @@ -495,11 +495,11 @@ module top ( input wire [3:0] a, output wire x ); - wire w1, w2; + wire w0, w1; - assign w1 = sel[0] ? a[1] : a[0]; - assign w2 = sel[1] ? a[2] : a[3]; - assign x = sel[2] ? w1 : w2; + assign w0 = sel[0] ? a[1] : a[0]; + assign w1 = sel[1] ? a[2] : a[3]; + assign x = sel[2] ? w0 : w1; endmodule EOF check -assert @@ -529,14 +529,14 @@ module top ( input wire [6:0] a, output wire x ); - wire w1, w2, w3, w4, w5; + wire w0, w1, w2, w3, w4; - assign w1 = sel[0] ? a[1] : a[0]; - assign w2 = sel[1] ? a[2] : w1; - assign w3 = sel[2] ? a[3] : w2; - assign w4 = sel[3] ? w3 : w5; - assign w5 = sel[5] ? a[4] : a[5]; - assign x = sel[4] ? w4 : a[6]; + assign w0 = sel[0] ? a[1] : a[0]; + assign w1 = sel[1] ? a[2] : w0; + assign w2 = sel[2] ? a[3] : w1; + assign w3 = sel[3] ? w2 : w4; + assign w4 = sel[5] ? a[4] : a[5]; + assign x = sel[4] ? w3 : a[6]; endmodule EOF check -assert @@ -575,15 +575,15 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = sel[0] ? a[1] : a[0]; - assign w2 = sel[1] ? a[2] : w1; - assign w3 = sel[2] ? a[3] : w2; - assign x = sel[3] ? a[4] : w3; + assign w0 = sel[0] ? a[1] : a[0]; + assign w1 = sel[1] ? a[2] : w0; + assign w2 = sel[2] ? a[3] : w1; + assign x = sel[3] ? a[4] : w2; // Off-chain use of intermediate wire - assign y = w2; + assign y = w1; endmodule EOF check -assert @@ -618,14 +618,14 @@ module top ( output wire x, output wire y ); - wire w1, w2, w3; + wire w0, w1, w2; - assign w1 = sel[0] ? a[1] : a[0]; - assign w2 = sel[1] ? a[2] : w1; - assign w3 = sel[2] ? a[3] : w2; - assign x = sel[3] ? a[4] : w3; + assign w0 = sel[0] ? a[1] : a[0]; + assign w1 = sel[1] ? a[2] : w0; + assign w2 = sel[2] ? a[3] : w1; + assign x = sel[3] ? a[4] : w2; - assign y = w2; + assign y = w1; endmodule EOF check -assert From 2f9e6e08f0ce0f7b20d84cd033264feb6c89c381 Mon Sep 17 00:00:00 2001 From: williamzhu17 Date: Tue, 1 Apr 2025 10:39:33 -0700 Subject: [PATCH 05/10] added tests with constants --- tests/silimate/extract_reduce.ys | 165 ++++++++++++++++++++++++++----- 1 file changed, 139 insertions(+), 26 deletions(-) diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys index 888f0182a..50bb09078 100644 --- a/tests/silimate/extract_reduce.ys +++ b/tests/silimate/extract_reduce.ys @@ -22,9 +22,38 @@ equiv_opt -assert extract_reduce design -load postopt opt_clean -# Check final design has correct number of gates +# Check final design has correct number of gates and inputs select -assert-count 0 t:$and -select -assert-count 1 t:$reduce_and +select -assert-count 1 t:$reduce_and r:A_WIDTH=4 %i + +design -reset +log -pop + + + +log -header "AND chain with constants" +log -push +design -reset +read_verilog < Date: Tue, 1 Apr 2025 11:10:50 -0700 Subject: [PATCH 06/10] added deeper cases for gates --- tests/silimate/extract_reduce.ys | 237 ++++++++++++++++++++++++++++++- 1 file changed, 236 insertions(+), 1 deletion(-) diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys index 50bb09078..8b642e70c 100644 --- a/tests/silimate/extract_reduce.ys +++ b/tests/silimate/extract_reduce.ys @@ -95,7 +95,7 @@ log -pop -log -header "No off-chain" +log -header "No off-chain for AND" log -push design -reset read_verilog < Date: Tue, 1 Apr 2025 17:17:39 -0700 Subject: [PATCH 07/10] wip tests --- tests/silimate/extract_reduce_gates.ys | 862 +++++++++++++++++++++++++ tests/silimate/extract_reduce_muxes.ys | 440 +++++++++++++ 2 files changed, 1302 insertions(+) create mode 100644 tests/silimate/extract_reduce_gates.ys create mode 100644 tests/silimate/extract_reduce_muxes.ys diff --git a/tests/silimate/extract_reduce_gates.ys b/tests/silimate/extract_reduce_gates.ys new file mode 100644 index 000000000..c3a505651 --- /dev/null +++ b/tests/silimate/extract_reduce_gates.ys @@ -0,0 +1,862 @@ +################################################################### +# Extract Reduce AND Gates Tests +################################################################### + +log -header "Simple AND chain" +log -push +design -reset +read_verilog < Date: Tue, 1 Apr 2025 17:19:04 -0700 Subject: [PATCH 08/10] deleted old file --- tests/silimate/extract_reduce.ys | 998 ------------------------------- 1 file changed, 998 deletions(-) delete mode 100644 tests/silimate/extract_reduce.ys diff --git a/tests/silimate/extract_reduce.ys b/tests/silimate/extract_reduce.ys deleted file mode 100644 index 8b642e70c..000000000 --- a/tests/silimate/extract_reduce.ys +++ /dev/null @@ -1,998 +0,0 @@ -################################################################### -# Extract Reduce AND Gates Tests -################################################################### - -log -header "Simple AND chain" -log -push -design -reset -read_verilog < Date: Thu, 3 Apr 2025 10:37:32 -0700 Subject: [PATCH 09/10] added stress tests --- tests/silimate/extract_reduce_gates.ys | 116 +++++++++++++-- tests/silimate/extract_reduce_muxes.ys | 188 ++++++++++++++++++++++--- 2 files changed, 268 insertions(+), 36 deletions(-) diff --git a/tests/silimate/extract_reduce_gates.ys b/tests/silimate/extract_reduce_gates.ys index c3a505651..c50db9bc7 100644 --- a/tests/silimate/extract_reduce_gates.ys +++ b/tests/silimate/extract_reduce_gates.ys @@ -824,29 +824,119 @@ log -pop -# TODO -log -header "Combinational feedback loop" +log -header "Stress test" log -push design -reset read_verilog < Date: Thu, 3 Apr 2025 10:38:55 -0700 Subject: [PATCH 10/10] small name change --- tests/silimate/extract_reduce_muxes.ys | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/silimate/extract_reduce_muxes.ys b/tests/silimate/extract_reduce_muxes.ys index 4950f1a6b..3f065b864 100644 --- a/tests/silimate/extract_reduce_muxes.ys +++ b/tests/silimate/extract_reduce_muxes.ys @@ -394,7 +394,7 @@ log -pop -log -header "Stress test" +log -header "Normal stress test" log -push design -reset read_verilog <