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:
parent
b60d2daa41
commit
faea2d904a
3 changed files with 424 additions and 7 deletions
|
|
@ -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
|
||||
|
|
|
|||
86
tests/silimate/opt_compact_prefix_mod.sv
Normal file
86
tests/silimate/opt_compact_prefix_mod.sv
Normal 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
|
||||
Loading…
Add table
Add a link
Reference in a new issue