3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2026-07-18 13:15:46 +00:00

Make opt_compact_prefix match more

This commit is contained in:
Akash Levy 2026-06-09 10:55:10 -07:00
parent b60d2daa41
commit faea2d904a
3 changed files with 424 additions and 7 deletions

View file

@ -350,3 +350,117 @@ select -assert-none opt_compact_prefix_multi_match/t:$mux
select -assert-count 1 opt_compact_prefix_multi_keep/t:$mux
design -reset
log -pop
log -header "Modulo decimation self-equivalence (MSB-first)"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod8
proc; opt_clean
rename opt_compact_prefix_mod8 gold
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod8
proc; opt_clean
opt_compact_prefix
opt_clean
bmuxmap
rename opt_compact_prefix_mod8 gate
miter -equiv -flatten -make_assert gold gate miter
hierarchy -top miter
proc; opt; memory; opt
sat -prove-asserts -verify
design -reset
log -pop
log -header "Modulo decimation self-equivalence (LSB-first)"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod_lsb8
proc; opt_clean
rename opt_compact_prefix_mod_lsb8 gold
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod_lsb8
proc; opt_clean
opt_compact_prefix
opt_clean
bmuxmap
rename opt_compact_prefix_mod_lsb8 gate
miter -equiv -flatten -make_assert gold gate miter
hierarchy -top miter
proc; opt; memory; opt
sat -prove-asserts -verify
design -reset
log -pop
log -header "Modulo decimation structural rewrite"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod16
proc; opt_clean
opt_compact_prefix
opt_clean
select -assert-none t:$mux
select -assert-none t:$sub
select -assert-min 1 t:$add
select -assert-min 1 t:$eq
select -assert-min 1 t:$bmux
design -reset
log -pop
log -header "Modulo decimation: opt_parallel_prefix collapses the popcount cascade"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod16
proc; opt_clean
opt_compact_prefix
opt_clean
opt_parallel_prefix -arith
opt_clean
select -assert-none t:$mux
select -assert-none t:$sub
select -assert-min 1 t:$add
design -reset
log -pop
log -header "Negative: modulo off-by-one near miss unchanged"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod_offbyone
proc; opt_clean
opt_compact_prefix
select -assert-none w:*compact*
design -reset
log -pop
log -header "Max width: modulo decimation left unchanged"
log -push
design -reset
verific -cfg veri_optimize_wide_selector 1
verific -cfg db_infer_wide_muxes_post_elaboration 0
read -sv opt_compact_prefix_mod.sv
verific -import opt_compact_prefix_mod16
proc; opt_clean
select -assert-min 1 t:$mux
opt_compact_prefix -max_width 8
select -assert-min 1 t:$mux
select -assert-none w:*compact*
design -reset
log -pop

View file

@ -0,0 +1,86 @@
// Modulo-n decimation loops: scanning the enable vector, mark every n-th
// enabled bit. Exercised by opt_compact_prefix's modulo decimation rewrite
// (cf. the qor_spi_ra_add_chain2 regression).
module opt_compact_prefix_mod8 (
input logic [7:0] en,
input logic [3:0] n,
output logic [7:0] mask
);
always_comb begin
mask = '0;
for (int I = 7, cnt = 0; I >= 0; I--) begin
if (en[I] && (n > 0)) begin
if (cnt == (n - 1)) begin
mask[I] = 1'b1;
cnt = 0;
end else begin
cnt++;
end
end
end
end
endmodule
module opt_compact_prefix_mod16 (
input logic [15:0] en,
input logic [4:0] n,
output logic [15:0] mask
);
always_comb begin
mask = '0;
for (int I = 15, cnt = 0; I >= 0; I--) begin
if (en[I] && (n > 0)) begin
if (cnt == (n - 1)) begin
mask[I] = 1'b1;
cnt = 0;
end else begin
cnt++;
end
end
end
end
endmodule
// Same function, but scanned LSB-first (exercises the mirrored direction).
module opt_compact_prefix_mod_lsb8 (
input logic [7:0] en,
input logic [3:0] n,
output logic [7:0] mask
);
always_comb begin
mask = '0;
for (int I = 0, cnt = 0; I < 8; I++) begin
if (en[I] && (n > 0)) begin
if (cnt == (n - 1)) begin
mask[I] = 1'b1;
cnt = 0;
end else begin
cnt++;
end
end
end
end
endmodule
// Negative near-miss: marks every (n+1)-th enabled bit (reset on cnt == n),
// a different function that must NOT be rewritten.
module opt_compact_prefix_mod_offbyone (
input logic [7:0] en,
input logic [3:0] n,
output logic [7:0] mask
);
always_comb begin
mask = '0;
for (int I = 7, cnt = 0; I >= 0; I--) begin
if (en[I] && (n > 0)) begin
if (cnt == n) begin
mask[I] = 1'b1;
cnt = 0;
end else begin
cnt++;
end
end
end
end
endmodule