blob: fadcec45fdd0899cb1ab1e6e55b27de63c281a27 [file] [log] [blame] [edit]
module CARRY4(
output [3:0] CO,
output [3:0] O,
input CI,
input CYINIT,
input [3:0] DI, S
);
parameter _TECHMAP_CONSTMSK_CI_ = 1;
parameter _TECHMAP_CONSTVAL_CI_ = 1'b0;
parameter _TECHMAP_CONSTMSK_CYINIT_ = 1;
parameter _TECHMAP_CONSTVAL_CYINIT_ = 1'b0;
localparam [0:0] IS_CI_ZERO = (
_TECHMAP_CONSTMSK_CI_ == 1 && _TECHMAP_CONSTVAL_CI_ == 0 &&
_TECHMAP_CONSTMSK_CYINIT_ == 1 && _TECHMAP_CONSTVAL_CYINIT_ == 0);
localparam [0:0] IS_CI_ONE = (
_TECHMAP_CONSTMSK_CI_ == 1 && _TECHMAP_CONSTVAL_CI_ == 0 &&
_TECHMAP_CONSTMSK_CYINIT_ == 1 && _TECHMAP_CONSTVAL_CYINIT_ == 1);
localparam [0:0] IS_CYINIT_FABRIC = _TECHMAP_CONSTMSK_CYINIT_ == 0;
localparam [0:0] IS_CI_DISCONNECTED = _TECHMAP_CONSTMSK_CI_ == 1 &&
_TECHMAP_CONSTVAL_CI_ != 1;
localparam [0:0] IS_CYINIT_DISCONNECTED = _TECHMAP_CONSTMSK_CYINIT_ == 1 &&
_TECHMAP_CONSTVAL_CYINIT_ != 1;
wire [1023:0] _TECHMAP_DO_ = "proc; clean";
wire [3:0] O;
wire [3:0] CO;
wire [3:0] CO_output;
// Put in a placeholder object CARRY_CO_DIRECT.
//
// It will be used for 3 purposes:
// - Remain as CARRY_CO_DIRECT when OUT only connects to CARRY_COUT_PLUG
// - Remain as CARRY_CO_DIRECT when CO is used, but O is not used.
// - Change into CARRY_CO_LUT when O and CO are required (e.g. compute CO
// from O ^ S).
genvar i;
generate for (i = 0; i < 3; i = i + 1) begin:co_outputs
CARRY_CO_DIRECT #(.TOP_OF_CHAIN(0)) co_output(
.CO(CO_output[i]),
.O(O[i+1]),
.S(S[i+1]),
.OUT(CO[i])
);
end endgenerate
CARRY_CO_DIRECT #(.TOP_OF_CHAIN(1)) co_output(
.CO(CO_output[3]),
.O(O[3]),
.S(S[3]),
.DI(DI[3]),
.OUT(CO[3])
);
if(IS_CYINIT_FABRIC) begin
CARRY4_VPR #(
.CYINIT_AX(1'b1),
.CYINIT_C0(1'b0),
.CYINIT_C1(1'b0)
) _TECHMAP_REPLACE_ (
.CO0(CO_output[0]),
.CO1(CO_output[1]),
.CO2(CO_output[2]),
.CO3(CO_output[3]),
.CYINIT(CYINIT),
.O0(O[0]),
.O1(O[1]),
.O2(O[2]),
.O3(O[3]),
.DI0(DI[0]),
.DI1(DI[1]),
.DI2(DI[2]),
.DI3(DI[3]),
.S0(S[0]),
.S1(S[1]),
.S2(S[2]),
.S3(S[3])
);
end else if(IS_CI_ZERO || IS_CI_ONE) begin
CARRY4_VPR #(
.CYINIT_AX(1'b0),
.CYINIT_C0(IS_CI_ZERO),
.CYINIT_C1(IS_CI_ONE)
) _TECHMAP_REPLACE_ (
.CO0(CO_output[0]),
.CO1(CO_output[1]),
.CO2(CO_output[2]),
.CO3(CO_output[3]),
.O0(O[0]),
.O1(O[1]),
.O2(O[2]),
.O3(O[3]),
.DI0(DI[0]),
.DI1(DI[1]),
.DI2(DI[2]),
.DI3(DI[3]),
.S0(S[0]),
.S1(S[1]),
.S2(S[2]),
.S3(S[3])
);
end else begin
wire cin_from_below;
CARRY_COUT_PLUG cin_plug(
.CIN(CI),
.COUT(cin_from_below)
);
CARRY4_VPR #(
.CYINIT_AX(1'b0),
.CYINIT_C0(1'b0),
.CYINIT_C1(1'b0)
) _TECHMAP_REPLACE_ (
.CO0(CO_output[0]),
.CO1(CO_output[1]),
.CO2(CO_output[2]),
.CO3(CO_output[3]),
.O0(O[0]),
.O1(O[1]),
.O2(O[2]),
.O3(O[3]),
.DI0(DI[0]),
.DI1(DI[1]),
.DI2(DI[2]),
.DI3(DI[3]),
.S0(S[0]),
.S1(S[1]),
.S2(S[2]),
.S3(S[3]),
.CIN(cin_from_below)
);
end
endmodule