mirror of https://github.com/YosysHQ/yosys.git
Merge pull request #718 from whitequark/gate2lut
gate2lut: new techlib, for converting Yosys gates to FPGA LUTs
This commit is contained in:
commit
728a251a95
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
//- -----+---
|
//- -----+---
|
||||||
|
|
|
@ -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)");
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
*.log
|
|
@ -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
|
|
@ -0,0 +1,5 @@
|
||||||
|
module top(...);
|
||||||
|
input a, b;
|
||||||
|
output y;
|
||||||
|
assign y = a&b;
|
||||||
|
endmodule
|
|
@ -0,0 +1,5 @@
|
||||||
|
module top(...);
|
||||||
|
input a, b, s;
|
||||||
|
output y;
|
||||||
|
assign y = s?a:b;
|
||||||
|
endmodule
|
|
@ -0,0 +1,5 @@
|
||||||
|
module top(...);
|
||||||
|
input a;
|
||||||
|
output y;
|
||||||
|
assign y = ~a;
|
||||||
|
endmodule
|
|
@ -0,0 +1,5 @@
|
||||||
|
module top(...);
|
||||||
|
input a, b;
|
||||||
|
output y;
|
||||||
|
assign y = a|b;
|
||||||
|
endmodule
|
|
@ -0,0 +1,5 @@
|
||||||
|
module top(...);
|
||||||
|
input a, b;
|
||||||
|
output y;
|
||||||
|
assign y = a^b;
|
||||||
|
endmodule
|
|
@ -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
|
Loading…
Reference in New Issue