diff --git a/techlibs/common/Makefile.inc b/techlibs/common/Makefile.inc index cb67d6329..e76d70a1a 100644 --- a/techlibs/common/Makefile.inc +++ b/techlibs/common/Makefile.inc @@ -37,3 +37,4 @@ $(eval $(call add_share_file,share,techlibs/common/cmp2lcu.v)) $(eval $(call add_share_file,share,techlibs/common/cmp2softlogic.v)) $(eval $(call add_share_file,share/choices,techlibs/common/choices/kogge-stone.v)) $(eval $(call add_share_file,share/choices,techlibs/common/choices/han-carlson.v)) +$(eval $(call add_share_file,share/choices,techlibs/common/choices/sklansky.v)) diff --git a/techlibs/common/choices/sklansky.v b/techlibs/common/choices/sklansky.v new file mode 100644 index 000000000..2a79e76a5 --- /dev/null +++ b/techlibs/common/choices/sklansky.v @@ -0,0 +1,37 @@ +(* techmap_celltype = "$lcu" *) +module _80_lcu_sklansky (P, G, CI, CO); + parameter WIDTH = 2; + + (* force_downto *) + input [WIDTH-1:0] P, G; + input CI; + + (* force_downto *) + output [WIDTH-1:0] CO; + + integer i, j; + (* force_downto *) + reg [WIDTH-1:0] p, g; + + wire [1023:0] _TECHMAP_DO_ = "proc; opt -fast"; + + always @* begin + p = P; + g = G; + + // in almost all cases CI will be constant zero + g[0] = g[0] | (p[0] & CI); + + for (i = 0; i < $clog2(WIDTH); i = i + 1) begin + // iterate in reverse so we don't confuse a result from this stage and the previous + for (j = WIDTH - 1; j >= 0; j = j - 1) begin + if (j & 2**i) begin + g[j] = g[j] | p[j] & g[(j & ~(2**i - 1)) - 1]; + p[j] = p[j] & p[(j & ~(2**i - 1)) - 1]; + end + end + end + end + + assign CO = g; +endmodule diff --git a/tests/techmap/sklansky.tcl b/tests/techmap/sklansky.tcl new file mode 100644 index 000000000..bf3b44485 --- /dev/null +++ b/tests/techmap/sklansky.tcl @@ -0,0 +1,15 @@ +yosys -import + +read_verilog +/choices/sklansky.v +read_verilog -icells lcu_refined.v +design -save init + +for {set i 1} {$i <= 16} {incr i} { + design -load init + chparam -set WIDTH $i + yosys proc + opt_clean + equiv_make lcu _80_lcu_sklansky equiv + equiv_simple equiv + equiv_status -assert equiv +}