mirror of https://github.com/YosysHQ/yosys.git
315 lines
12 KiB
Verilog
315 lines
12 KiB
Verilog
(* techmap_celltype = "$_DFF_N_ $_DFF_P_" *)
|
|
module \$_DFF_x_ (input D, C, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
|
localparam REGSET = "SET";
|
|
else
|
|
localparam REGSET = "RESET";
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET)) _TECHMAP_REPLACE_ (.CLK(C), .LSR(1'b0), .DI(D), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$_DFFE_NN_ $_DFFE_PN_ $_DFFE_NP_ $_DFFE_PP_" *)
|
|
module \$_DFFE_xx_ (input D, C, E, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "N")
|
|
localparam CEMUX = "INV";
|
|
else
|
|
localparam CEMUX = "CE";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
|
localparam REGSET = "SET";
|
|
else
|
|
localparam REGSET = "RESET";
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX(CEMUX), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET)) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(1'b0), .DI(D), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$_DFF_NN0_ $_DFF_NN1_ $_DFF_PN0_ $_DFF_PN1_ $_DFF_NP0_ $_DFF_NP1_ $_DFF_PP0_ $_DFF_PP1_" *)
|
|
module \$_DFF_xxx_ (input D, C, R, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[3*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
// TODO: Why not use LSRMUX param?
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
wire LSR_ = !R;
|
|
else
|
|
wire LSR_ = R;
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "1") begin
|
|
localparam REGSET = "SET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
|
$error("ECP5 doesn't support FFs with asynchronous set initialized to 0");
|
|
end
|
|
else begin
|
|
localparam REGSET = "RESET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
|
$error("ECP5 doesn't support FFs with asynchronous reset initialized to 1");
|
|
end
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(LSR_), .DI(D), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$__DFFS_NN0_ $__DFFS_NN1_ $__DFFS_PN0_ $__DFFS_PN1_ $__DFFS_NP0_ $__DFFS_NP1_ $__DFFS_PP0_ $__DFFS_PP1_" *)
|
|
module \$__DFFS_xxx_ (input D, C, R, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[3*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
// TODO: Why not use LSRMUX param?
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
wire LSR_ = !R;
|
|
else
|
|
wire LSR_ = R;
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "1") begin
|
|
localparam REGSET = "SET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
|
// init is 0, reset to 1
|
|
wire D_ = D || LSR_;
|
|
else
|
|
wire D_ = D;
|
|
end
|
|
else begin
|
|
localparam REGSET = "RESET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
|
// init is 1, reset to 0
|
|
wire D_ = !(D && LSR_);
|
|
else
|
|
wire D_ = D;
|
|
end
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX("1"), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(LSR_), .DI(D_), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$__DFFE_NN0 $__DFFE_NN1 $__DFFE_PN0 $__DFFE_PN1 $__DFFE_NP0 $__DFFE_NP1 $__DFFE_PP0 $__DFFE_PP1" *)
|
|
module \$__DFFE_xxx_ (input D, C, E, R, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[3*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
// TODO: Why not use LSRMUX param?
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
wire LSR_ = !R;
|
|
else
|
|
wire LSR_ = R;
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "1") begin
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b0)
|
|
$error("ECP5 doesn't support FFs with asynchronous set initialized to 0");
|
|
else
|
|
localparam REGSET = "SET";
|
|
end
|
|
else begin
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1)
|
|
$error("ECP5 doesn't support FFs with asynchronous reset initialized to 1");
|
|
else
|
|
localparam REGSET = "RESET";
|
|
end
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E), .LSR(LSR_), .DI(D), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$__DFFSE_NN0 $__DFFSE_NN1 $__DFFSE_PN0 $__DFFSE_PN1 $__DFFSE_NP0 $__DFFSE_NP1 $__DFFSE_PP0 $__DFFSE_PP1" *)
|
|
module \$__DFFSE_xxx_ (input D, C, E, R, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[3*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
// TODO: Why not use LSRMUX param?
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
wire LSR_ = !R;
|
|
else
|
|
wire LSR_ = R;
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "1") begin
|
|
localparam REGSET = "SET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b0) begin
|
|
// init is 0, reset to 1
|
|
wire D_ = D || LSR_;
|
|
wire E_ = E || LSR_;
|
|
end
|
|
else begin
|
|
wire D_ = D;
|
|
wire E_ = E;
|
|
end
|
|
end
|
|
else begin
|
|
localparam REGSET = "RESET";
|
|
if (_TECHMAP_WIREINIT_Q_ === 1'b1) begin
|
|
// init is 1, reset to 0
|
|
wire D_ = !(D && LSR_);
|
|
wire E_ = !(E && LSR_);
|
|
end
|
|
else begin
|
|
wire D_ = D;
|
|
wire E_ = E;
|
|
end
|
|
end
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("AUTO"), .CEMUX("CE"), .CLKMUX(CLKMUX), .LSRMUX("LSR"), .REGSET(REGSET), .SRMODE("LSR_OVER_CE")) _TECHMAP_REPLACE_ (.CLK(C), .CE(E_), .LSR(LSR_), .DI(D_), .Q(Q));
|
|
endmodule
|
|
|
|
`ifdef ASYNC_PRLD
|
|
(* techmap_celltype = "$_DLATCH_N_ $_DLATCH_P_" *)
|
|
module \$_DLATCH_x_ (input E, input D, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
// TODO: Why not use LSRMUX param?
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "N")
|
|
wire LSR_ = !E;
|
|
else
|
|
wire LSR_ = E;
|
|
if (_TECHMAP_WIREINIT_Q_ !== 1'bx)
|
|
$error("ECP5 doesn't support latches with initial values"); // TODO: Check
|
|
endgenerate
|
|
TRELLIS_FF #(.GSR("DISABLED"), .CEMUX("1"), .LSRMODE("PRLD"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.LSR(LSR_), .DI(1'b0), .M(D), .Q(Q));
|
|
endmodule
|
|
|
|
(* techmap_celltype = "$_DFFSR_NNN_ $_DFFSR_NNP_ $_DFFSR_PNN_ $_DFFSR_PNP_ $_DFFSR_NPN_ $_DFFSR_NPP_ $_DFFSR_PPN_ $_DFFSR_PPP_" *)
|
|
module \$_DFFSR_xxx_ (input C, S, R, D, output Q);
|
|
parameter [0:0] _TECHMAP_WIREINIT_Q_ = 1'bx;
|
|
parameter _TECHMAP_CELLTYPE_ = "";
|
|
wire _TECHMAP_REMOVEINIT_Q_ = 1'b1;
|
|
generate
|
|
if (_TECHMAP_CELLTYPE_[3*8+:8] == "N")
|
|
localparam CLKMUX = "INV";
|
|
else
|
|
localparam CLKMUX = "CLK";
|
|
if (_TECHMAP_CELLTYPE_[2*8+:8] == "N")
|
|
wire S_ = !S;
|
|
else
|
|
wire S_ = S;
|
|
if (_TECHMAP_CELLTYPE_[1*8+:8] == "N")
|
|
wire R_ = !R;
|
|
else
|
|
wire R_ = R;
|
|
if (_TECHMAP_WIREINIT_Q_ !== 1'bx)
|
|
$error("ECP5 doesn't support FFs with asynchronous set and reset with initial values");
|
|
endgenerate
|
|
|
|
TRELLIS_FF #(.GSR("DISABLED"), .CEMUX("1"), .CLKMUX(CLKINV), .LSRMODE("PRLD"), .LSRMUX("LSR"), .REGSET("RESET"), .SRMODE("ASYNC")) _TECHMAP_REPLACE_ (.CLK(C), .LSR(S_ || R_), .DI(D), .M(!R_), .Q(Q));
|
|
endmodule
|
|
`endif
|
|
|
|
`include "cells_ff.vh"
|
|
`include "cells_io.vh"
|
|
|
|
`ifndef NO_LUT
|
|
module \$lut (A, Y);
|
|
parameter WIDTH = 0;
|
|
parameter LUT = 0;
|
|
|
|
input [WIDTH-1:0] A;
|
|
output Y;
|
|
|
|
generate
|
|
if (WIDTH == 1) begin
|
|
localparam [15:0] INIT = {{8{LUT[1]}}, {8{LUT[0]}}};
|
|
LUT4 #(.INIT(INIT)) _TECHMAP_REPLACE_ (.Z(Y),
|
|
.A(1'b0), .B(1'b0), .C(1'b0), .D(A[0]));
|
|
end else
|
|
if (WIDTH == 2) begin
|
|
localparam [15:0] INIT = {{4{LUT[3]}}, {4{LUT[2]}}, {4{LUT[1]}}, {4{LUT[0]}}};
|
|
LUT4 #(.INIT(INIT)) _TECHMAP_REPLACE_ (.Z(Y),
|
|
.A(1'b0), .B(1'b0), .C(A[0]), .D(A[1]));
|
|
end else
|
|
if (WIDTH == 3) begin
|
|
localparam [15:0] INIT = {{2{LUT[7]}}, {2{LUT[6]}}, {2{LUT[5]}}, {2{LUT[4]}}, {2{LUT[3]}}, {2{LUT[2]}}, {2{LUT[1]}}, {2{LUT[0]}}};
|
|
LUT4 #(.INIT(INIT)) _TECHMAP_REPLACE_ (.Z(Y),
|
|
.A(1'b0), .B(A[0]), .C(A[1]), .D(A[2]));
|
|
end else
|
|
if (WIDTH == 4) begin
|
|
LUT4 #(.INIT(LUT)) _TECHMAP_REPLACE_ (.Z(Y),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
`ifndef NO_PFUMUX
|
|
end else
|
|
if (WIDTH == 5) begin
|
|
wire f0, f1;
|
|
LUT4 #(.INIT(LUT[15: 0])) lut0 (.Z(f0),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[31:16])) lut1 (.Z(f1),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
PFUMX mux5(.ALUT(f1), .BLUT(f0), .C0(A[4]), .Z(Y));
|
|
end else
|
|
if (WIDTH == 6) begin
|
|
wire f0, f1, f2, f3, g0, g1;
|
|
LUT4 #(.INIT(LUT[15: 0])) lut0 (.Z(f0),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[31:16])) lut1 (.Z(f1),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
LUT4 #(.INIT(LUT[47:32])) lut2 (.Z(f2),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[63:48])) lut3 (.Z(f3),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
PFUMX mux50(.ALUT(f1), .BLUT(f0), .C0(A[4]), .Z(g0));
|
|
PFUMX mux51(.ALUT(f3), .BLUT(f2), .C0(A[4]), .Z(g1));
|
|
L6MUX21 mux6 (.D0(g0), .D1(g1), .SD(A[5]), .Z(Y));
|
|
end else
|
|
if (WIDTH == 7) begin
|
|
wire f0, f1, f2, f3, f4, f5, f6, f7, g0, g1, g2, g3, h0, h1;
|
|
LUT4 #(.INIT(LUT[15: 0])) lut0 (.Z(f0),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[31:16])) lut1 (.Z(f1),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
LUT4 #(.INIT(LUT[47:32])) lut2 (.Z(f2),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[63:48])) lut3 (.Z(f3),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
LUT4 #(.INIT(LUT[79:64])) lut4 (.Z(f4),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[95:80])) lut5 (.Z(f5),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
LUT4 #(.INIT(LUT[111: 96])) lut6 (.Z(f6),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
LUT4 #(.INIT(LUT[127:112])) lut7 (.Z(f7),
|
|
.A(A[0]), .B(A[1]), .C(A[2]), .D(A[3]));
|
|
|
|
PFUMX mux50(.ALUT(f1), .BLUT(f0), .C0(A[4]), .Z(g0));
|
|
PFUMX mux51(.ALUT(f3), .BLUT(f2), .C0(A[4]), .Z(g1));
|
|
PFUMX mux52(.ALUT(f5), .BLUT(f4), .C0(A[4]), .Z(g2));
|
|
PFUMX mux53(.ALUT(f7), .BLUT(f6), .C0(A[4]), .Z(g3));
|
|
L6MUX21 mux60 (.D0(g0), .D1(g1), .SD(A[5]), .Z(h0));
|
|
L6MUX21 mux61 (.D0(g2), .D1(g3), .SD(A[5]), .Z(h1));
|
|
L6MUX21 mux7 (.D0(h0), .D1(h1), .SD(A[6]), .Z(Y));
|
|
`endif
|
|
end else begin
|
|
wire _TECHMAP_FAIL_ = 1;
|
|
end
|
|
endgenerate
|
|
endmodule
|
|
`endif
|