aboutsummaryrefslogtreecommitdiffstats
path: root/techlibs
diff options
context:
space:
mode:
authorTristan Gingold <tristan.gingold@cern.ch>2021-11-24 17:08:47 +0100
committerTristan Gingold <tristan.gingold@cern.ch>2022-08-31 08:40:44 +0200
commitc25f3ff3df8ec0c6979af6fa938716e461c8261b (patch)
tree18097531ee75e4c261b8973c45ec73092b118151 /techlibs
parent13ccdd032d5a17f7190014b9964b3eda644dca55 (diff)
downloadyosys-c25f3ff3df8ec0c6979af6fa938716e461c8261b.tar.gz
yosys-c25f3ff3df8ec0c6979af6fa938716e461c8261b.tar.bz2
yosys-c25f3ff3df8ec0c6979af6fa938716e461c8261b.zip
sf2: suport $alu gate and ARI1 implementation
Diffstat (limited to 'techlibs')
-rw-r--r--techlibs/sf2/arith_map.v50
-rw-r--r--techlibs/sf2/cells_sim.v17
2 files changed, 65 insertions, 2 deletions
diff --git a/techlibs/sf2/arith_map.v b/techlibs/sf2/arith_map.v
index f16b1abb8..eb367799b 100644
--- a/techlibs/sf2/arith_map.v
+++ b/techlibs/sf2/arith_map.v
@@ -17,5 +17,53 @@
*
*/
+(* techmap_celltype = "$alu" *)
+module \$__SF2_ALU (A, B, CI, BI, X, Y, CO);
+ parameter A_SIGNED = 0;
+ parameter B_SIGNED = 0;
+ parameter A_WIDTH = 1;
+ parameter B_WIDTH = 1;
+ parameter Y_WIDTH = 1;
+
+ (* force_downto *)
+ input [A_WIDTH-1:0] A;
+ (* force_downto *)
+ input [B_WIDTH-1:0] B;
+ (* force_downto *)
+ output [Y_WIDTH-1:0] X, Y;
+
+ input CI, BI;
+ (* force_downto *)
+ output [Y_WIDTH-1:0] CO;
+
+ wire _TECHMAP_FAIL_ = Y_WIDTH <= 2;
+
+ (* force_downto *)
+ wire [Y_WIDTH-1:0] AA, BB;
+ \$pos #(.A_SIGNED(A_SIGNED), .A_WIDTH(A_WIDTH), .Y_WIDTH(Y_WIDTH)) A_conv (.A(A), .Y(AA));
+ \$pos #(.A_SIGNED(B_SIGNED), .A_WIDTH(B_WIDTH), .Y_WIDTH(Y_WIDTH)) B_conv (.A(B), .Y(BB));
+
+ (* force_downto *)
+ wire [Y_WIDTH-1:0] C = {CO, CI};
+
+ genvar i;
+ generate for (i = 0; i < Y_WIDTH; i = i + 1) begin:slice
+ ARI1 #(
+ // G = F1 = A[i] & (B[i]^BI)
+ // Y = F0 = A[i]^B[i]^BI
+ // P = Y
+ // ADCB
+ .INIT(20'b 01_11_0010_1000_1001_0110)
+ ) carry (
+ .A(1'b0),
+ .B(AA[i]),
+ .C(BB[i]),
+ .D(BI),
+ .FCI(C[i]),
+ .Y(X[i]),
+ .S(Y[i]),
+ .FCO(CO[i])
+ );
+ end endgenerate
+endmodule
-// nothing here yet
diff --git a/techlibs/sf2/cells_sim.v b/techlibs/sf2/cells_sim.v
index c0b50382f..02335404b 100644
--- a/techlibs/sf2/cells_sim.v
+++ b/techlibs/sf2/cells_sim.v
@@ -152,7 +152,22 @@ module SLE (
assign Q = LAT ? q_latch : q_ff;
endmodule
-// module AR1
+module ARI1 (
+ input A, B, C, D, FCI,
+ output Y, S, FCO
+);
+ parameter [19:0] INIT = 20'h0;
+ wire [2:0] Fsel = {D, C, B};
+ wire F0 = INIT[Fsel];
+ wire F1 = INIT[8 + Fsel];
+ wire Yout = A ? F1 : F0;
+ assign Y = Yout;
+ wire S = FCI ^ Yout;
+ wire G = INIT[16] ? (INIT[17] ? F1 : F0) : INIT[17];
+ wire P = INIT[19] ? 1'b1 : (INIT[18] ? Yout : 1'b0);
+ assign FCO = P ? FCI : G;
+endmodule
+
// module FCEND_BUFF
// module FCINIT_BUFF
// module FLASH_FREEZE