| 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 |