Merge pull request #718 from whitequark/gate2lut

gate2lut: new techlib, for converting Yosys gates to FPGA LUTs
This commit is contained in:
Clifford Wolf 2018-12-05 09:16:35 -08:00 committed by GitHub
commit 728a251a95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 151 additions and 4 deletions

View File

@ -25,5 +25,6 @@ $(eval $(call add_share_file,share,techlibs/common/techmap.v))
$(eval $(call add_share_file,share,techlibs/common/pmux2mux.v)) $(eval $(call add_share_file,share,techlibs/common/pmux2mux.v))
$(eval $(call add_share_file,share,techlibs/common/adff2dff.v)) $(eval $(call add_share_file,share,techlibs/common/adff2dff.v))
$(eval $(call add_share_file,share,techlibs/common/dff2ff.v)) $(eval $(call add_share_file,share,techlibs/common/dff2ff.v))
$(eval $(call add_share_file,share,techlibs/common/gate2lut.v))
$(eval $(call add_share_file,share,techlibs/common/cells.lib)) $(eval $(call add_share_file,share,techlibs/common/cells.lib))

View File

@ -0,0 +1,87 @@
(* techmap_celltype = "$_NOT_" *)
module _90_lut_not (A, Y);
input A;
output Y;
wire [`LUT_WIDTH-1:0] AA;
assign AA = {A};
\$lut #(
.WIDTH(`LUT_WIDTH),
.LUT(4'b01)
) lut (
.A(AA),
.Y(Y)
);
endmodule
(* techmap_celltype = "$_OR_" *)
module _90_lut_or (A, B, Y);
input A, B;
output Y;
wire [`LUT_WIDTH-1:0] AA;
assign AA = {B, A};
\$lut #(
.WIDTH(`LUT_WIDTH),
.LUT(4'b1110)
) lut (
.A(AA),
.Y(Y)
);
endmodule
(* techmap_celltype = "$_AND_" *)
module _90_lut_and (A, B, Y);
input A, B;
output Y;
wire [`LUT_WIDTH-1:0] AA;
assign AA = {B, A};
\$lut #(
.WIDTH(`LUT_WIDTH),
.LUT(4'b1000)
) lut (
.A(AA),
.Y(Y)
);
endmodule
(* techmap_celltype = "$_XOR_" *)
module _90_lut_xor (A, B, Y);
input A, B;
output Y;
wire [`LUT_WIDTH-1:0] AA;
assign AA = {B, A};
\$lut #(
.WIDTH(`LUT_WIDTH),
.LUT(4'b0110)
) lut (
.A(AA),
.Y(Y)
);
endmodule
(* techmap_celltype = "$_MUX_" *)
module _90_lut_mux (A, B, S, Y);
input A, B, S;
output Y;
wire [`LUT_WIDTH-1:0] AA;
assign AA = {S, B, A};
\$lut #(
.WIDTH(`LUT_WIDTH),
// A 1010 1010
// B 1100 1100
// S 1111 0000
.LUT(8'b_1100_1010)
) lut (
.A(AA),
.Y(Y)
);
endmodule

View File

@ -465,7 +465,7 @@ endmodule
//- //-
//- $_SR_NP_ (S, R, Q) //- $_SR_NP_ (S, R, Q)
//- //-
//- A set-reset latch with negative polarity SET and positive polarioty RESET. //- A set-reset latch with negative polarity SET and positive polarity RESET.
//- //-
//- Truth table: S R | Q //- Truth table: S R | Q
//- -----+--- //- -----+---
@ -489,7 +489,7 @@ endmodule
//- //-
//- $_SR_PN_ (S, R, Q) //- $_SR_PN_ (S, R, Q)
//- //-
//- A set-reset latch with positive polarity SET and negative polarioty RESET. //- A set-reset latch with positive polarity SET and negative polarity RESET.
//- //-
//- Truth table: S R | Q //- Truth table: S R | Q
//- -----+--- //- -----+---

View File

@ -79,6 +79,9 @@ struct SynthIce40Pass : public ScriptPass
log(" -nobram\n"); log(" -nobram\n");
log(" do not use SB_RAM40_4K* cells in output netlist\n"); log(" do not use SB_RAM40_4K* cells in output netlist\n");
log("\n"); log("\n");
log(" -noabc\n");
log(" use built-in Yosys LUT techmapping instead of abc\n");
log("\n");
log(" -abc2\n"); log(" -abc2\n");
log(" run two passes of 'abc' for slightly improved logic density\n"); log(" run two passes of 'abc' for slightly improved logic density\n");
log("\n"); log("\n");
@ -93,7 +96,7 @@ struct SynthIce40Pass : public ScriptPass
} }
string top_opt, blif_file, edif_file, json_file; string top_opt, blif_file, edif_file, json_file;
bool nocarry, nodffe, nobram, flatten, retime, relut, abc2, vpr; bool nocarry, nodffe, nobram, flatten, retime, relut, noabc, abc2, vpr;
int min_ce_use; int min_ce_use;
void clear_flags() YS_OVERRIDE void clear_flags() YS_OVERRIDE
@ -109,6 +112,7 @@ struct SynthIce40Pass : public ScriptPass
flatten = true; flatten = true;
retime = false; retime = false;
relut = false; relut = false;
noabc = false;
abc2 = false; abc2 = false;
vpr = false; vpr = false;
} }
@ -177,6 +181,10 @@ struct SynthIce40Pass : public ScriptPass
nobram = true; nobram = true;
continue; continue;
} }
if (args[argidx] == "-noabc") {
noabc = true;
continue;
}
if (args[argidx] == "-abc2") { if (args[argidx] == "-abc2") {
abc2 = true; abc2 = true;
continue; continue;
@ -265,7 +273,13 @@ struct SynthIce40Pass : public ScriptPass
run("ice40_opt", "(only if -abc2)"); run("ice40_opt", "(only if -abc2)");
} }
run("techmap -map +/ice40/latches_map.v"); run("techmap -map +/ice40/latches_map.v");
run("abc -lut 4"); if (noabc || help_mode) {
run("simplemap", " (only if -noabc)");
run("techmap -map +/gate2lut.v -D LUT_WIDTH=4", "(only if -noabc)");
}
if (!noabc) {
run("abc -lut 4", "(skip if -noabc)");
}
run("clean"); run("clean");
if (relut || help_mode) { if (relut || help_mode) {
run("ice40_unlut", " (only if -relut)"); run("ice40_unlut", " (only if -relut)");

1
tests/lut/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
*.log

13
tests/lut/check_map.ys Normal file
View File

@ -0,0 +1,13 @@
design -save preopt
simplemap
techmap -map +/gate2lut.v -D LUT_WIDTH=4
select -assert-count 1 t:$lut
design -stash postopt
design -copy-from preopt -as preopt top
design -copy-from postopt -as postopt top
equiv_make preopt postopt equiv
prep -flatten -top equiv
equiv_induct
equiv_status -assert

5
tests/lut/map_and.v Normal file
View File

@ -0,0 +1,5 @@
module top(...);
input a, b;
output y;
assign y = a&b;
endmodule

5
tests/lut/map_mux.v Normal file
View File

@ -0,0 +1,5 @@
module top(...);
input a, b, s;
output y;
assign y = s?a:b;
endmodule

5
tests/lut/map_not.v Normal file
View File

@ -0,0 +1,5 @@
module top(...);
input a;
output y;
assign y = ~a;
endmodule

5
tests/lut/map_or.v Normal file
View File

@ -0,0 +1,5 @@
module top(...);
input a, b;
output y;
assign y = a|b;
endmodule

5
tests/lut/map_xor.v Normal file
View File

@ -0,0 +1,5 @@
module top(...);
input a, b;
output y;
assign y = a^b;
endmodule

6
tests/lut/run-test.sh Normal file
View File

@ -0,0 +1,6 @@
#!/bin/bash
set -e
for x in *.v; do
echo "Running $x.."
../../yosys -q -s check_map.ys -l ${x%.v}.log $x
done