Merge pull request #22 from alainmarcel/new_peepopts

muxadd breaks Quicklogic dsp inference, make it optional
This commit is contained in:
alaindargelas 2024-12-20 16:39:56 -08:00 committed by GitHub
commit 0b32e09c1a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 34 additions and 22 deletions

View File

@ -45,8 +45,6 @@ struct PeepoptPass : public Pass {
log("\n"); log("\n");
log("This pass employs the following rules by default:\n"); log("This pass employs the following rules by default:\n");
log("\n"); log("\n");
log(" * muxadd - Replace S?(A+B):A with A+(S?B:0)\n");
log("\n");
log(" * muldiv - Replace (A*B)/B with A\n"); log(" * muldiv - Replace (A*B)/B with A\n");
log("\n"); log("\n");
log(" * muldiv_c - Replace (A*B)/C with A*(B/C) when C is a const divisible by B.\n"); log(" * muldiv_c - Replace (A*B)/C with A*(B/C) when C is a const divisible by B.\n");
@ -70,13 +68,17 @@ struct PeepoptPass : public Pass {
log(" based pattern to prevent combinational paths from the\n"); log(" based pattern to prevent combinational paths from the\n");
log(" output to the enable input after running clk2fflogic.\n"); log(" output to the enable input after running clk2fflogic.\n");
log("\n"); log("\n");
log("If -withmuxadd is specified it adds the following rule:\n");
log("\n");
log(" * muxadd - Replace S?(A+B):A with A+(S?B:0)\n");
log("\n");
} }
void execute(std::vector<std::string> args, RTLIL::Design *design) override void execute(std::vector<std::string> args, RTLIL::Design *design) override
{ {
log_header(design, "Executing PEEPOPT pass (run peephole optimizers).\n"); log_header(design, "Executing PEEPOPT pass (run peephole optimizers).\n");
bool formalclk = false; bool formalclk = false;
bool withmuxadd = false;
size_t argidx; size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) for (argidx = 1; argidx < args.size(); argidx++)
{ {
@ -84,6 +86,10 @@ struct PeepoptPass : public Pass {
formalclk = true; formalclk = true;
continue; continue;
} }
if (args[argidx] == "-withmuxadd") {
withmuxadd = true;
continue;
}
break; break;
} }
extra_args(args, argidx, design); extra_args(args, argidx, design);
@ -113,7 +119,8 @@ struct PeepoptPass : public Pass {
pm.run_shiftmul_left(); pm.run_shiftmul_left();
pm.run_muldiv(); pm.run_muldiv();
pm.run_muldiv_c(); pm.run_muldiv_c();
pm.run_muxadd(); if (withmuxadd)
pm.run_muxadd();
} }
} }
} }

View File

@ -1,3 +1,8 @@
log -header "Test basic s?(a+b):a pattern gets transformed (a,b module inputs)"
log -push
design -reset
log -header "Test basic s?(a+b):a pattern gets transformed (a,b module inputs)" log -header "Test basic s?(a+b):a pattern gets transformed (a,b module inputs)"
log -push log -push
design -reset design -reset
@ -13,7 +18,7 @@ module top(a, b, s, y);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
log -pop log -pop
@ -31,7 +36,7 @@ module top(a, b, s, y);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
log -pop log -pop
@ -51,7 +56,7 @@ module top(a, b, s, y);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
log -pop log -pop
@ -72,7 +77,7 @@ module top(a_, b, s, y);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
log -pop log -pop
@ -96,7 +101,7 @@ module top(a, b_, f, s, y_);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
log -pop log -pop
@ -116,7 +121,7 @@ module top(a, b, ab, s, y);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
log -pop log -pop
@ -136,7 +141,7 @@ module top(a, b, s, y, z);
endmodule endmodule
EOF EOF
check -assert check -assert
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
@ -157,7 +162,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
@ -178,7 +183,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
@ -199,7 +204,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
@ -221,7 +226,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-none t:$add %co1 %a w:y %i select -assert-none t:$add %co1 %a w:y %i
@ -242,7 +247,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i select -assert-any t:$add %co1 %a w:y %i
@ -263,7 +268,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i select -assert-any t:$add %co1 %a w:y %i
@ -284,7 +289,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
@ -305,7 +310,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
@ -326,7 +331,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
@ -347,7 +352,7 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired
@ -368,6 +373,6 @@ EOF
check -assert check -assert
wreduce wreduce
opt_clean opt_clean
equiv_opt -assert peepopt equiv_opt -assert peepopt -withmuxadd
design -load postopt design -load postopt
select -assert-any t:$add %co1 %a w:y %i # assert adder rewired select -assert-any t:$add %co1 %a w:y %i # assert adder rewired