| /* |
| * yosys -- Yosys Open SYnthesis Suite |
| * |
| * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at> |
| * 2019 Eddie Hung <eddie@fpgeh.com> |
| * |
| * Permission to use, copy, modify, and/or distribute this software for any |
| * purpose with or without fee is hereby granted, provided that the above |
| * copyright notice and this permission notice appear in all copies. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
| * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
| * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
| * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
| * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
| * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| * |
| */ |
| |
| // The following techmapping rules are intended to be run (with -max_iter 1) |
| // before invoking the `abc9` pass in order to transform the design into |
| // a format that it understands. |
| // |
| // For example, (complex) flip-flops are expected to be described as an |
| // combinatorial box (containing all control logic such as clock enable |
| // or synchronous resets) followed by a basic D-Q flop. |
| // Yosys will automatically analyse the simulation model (described in |
| // cells_sim.v) and detach any $_DFF_P_ or $_DFF_N_ cells present in |
| // order to extract the combinatorial control logic left behind. |
| // Specifically, a simulation model similar to the one below: |
| // |
| // ++===================================++ |
| // || Sim model || |
| // || /\/\/\/\ || |
| // D -->>-----< > +------+ || |
| // R -->>-----< Comb. > |$_DFF_| || |
| // CE -->>-----< logic >-----| [NP]_|---+---->>-- Q |
| // || +--< > +------+ | || |
| // || | \/\/\/\/ | || |
| // || | | || |
| // || +----------------------------+ || |
| // || || |
| // ++===================================++ |
| // |
| // is transformed into: |
| // |
| // ++==================++ |
| // || Comb box || |
| // || || |
| // || /\/\/\/\ || |
| // D -->>-----< > || +------+ |
| // R -->>-----< Comb. > || |$__ABC| |
| // CE -->>-----< logic >--->>-- $nextQ --| _FF_ |--+-->> Q |
| // $abc9_currQ +-->>-----< > || +------+ | |
| // | || \/\/\/\/ || | |
| // | || || | |
| // | ++==================++ | |
| // | | |
| // +----------------------------------------------+ |
| // |
| // The purpose of the following FD* rules are to wrap the flop with: |
| // (a) a special $__ABC9_FF_ in front of the FD*'s output, indicating to abc9 |
| // the connectivity of its basic D-Q flop |
| // (b) a special _TECHMAP_REPLACE_.$abc9_clock wire to indicate its clock |
| // signal, used to extract the delay target |
| // (c) a special _TECHMAP_REPLACE_.$abc9_control that captures the control |
| // domain (which, combined with this cell type, encodes to `abc9' which |
| // flops may be merged together) |
| // (d) a special _TECHMAP_REPLACE_.$abc9_currQ wire that will be used for feedback |
| // into the (combinatorial) FD* cell to facilitate clock-enable behaviour |
| module FDRE (output reg Q, input C, CE, D, R); |
| parameter [0:0] INIT = 1'b0; |
| parameter [0:0] IS_C_INVERTED = 1'b0; |
| parameter [0:0] IS_D_INVERTED = 1'b0; |
| parameter [0:0] IS_R_INVERTED = 1'b0; |
| wire $nextQ; |
| FDRE #( |
| .INIT(INIT), |
| .IS_C_INVERTED(IS_C_INVERTED), |
| .IS_D_INVERTED(IS_D_INVERTED), |
| .IS_R_INVERTED(IS_R_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .R(R) |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, IS_D_INVERTED, R, IS_R_INVERTED}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = Q; |
| endmodule |
| module FDRE_1 (output reg Q, input C, CE, D, R); |
| parameter [0:0] INIT = 1'b0; |
| wire $nextQ; |
| FDRE_1 #( |
| .INIT(INIT), |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .R(R) |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, 1'b0 /* IS_D_INVERTED */, R, 1'b0 /* IS_R_INVERTED */}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = Q; |
| endmodule |
| |
| module FDCE (output reg Q, input C, CE, D, CLR); |
| parameter [0:0] INIT = 1'b0; |
| parameter [0:0] IS_C_INVERTED = 1'b0; |
| parameter [0:0] IS_D_INVERTED = 1'b0; |
| parameter [0:0] IS_CLR_INVERTED = 1'b0; |
| wire $nextQ, $abc9_currQ; |
| FDCE #( |
| .INIT(INIT), |
| .IS_C_INVERTED(IS_C_INVERTED), |
| .IS_D_INVERTED(IS_D_INVERTED), |
| .IS_CLR_INVERTED(IS_CLR_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .CLR(CLR) |
| // ^^^ Note that async |
| // control is not directly |
| // supported by abc9 but its |
| // behaviour is captured by |
| // $__ABC9_ASYNC below |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q($abc9_currQ)); |
| // Since this is an async flop, async behaviour is also dealt with |
| // using the $_ABC9_ASYNC box by abc9_map.v |
| \$__ABC9_ASYNC abc_async (.A($abc9_currQ), .S(CLR ^ IS_CLR_INVERTED), .Y(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, IS_D_INVERTED, CLR, IS_CLR_INVERTED}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = $abc9_currQ; |
| endmodule |
| module FDCE_1 (output reg Q, input C, CE, D, CLR); |
| parameter [0:0] INIT = 1'b0; |
| wire $nextQ, $abc9_currQ; |
| FDCE_1 #( |
| .INIT(INIT) |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .CLR(CLR) |
| // ^^^ Note that async |
| // control is not directly |
| // supported by abc9 but its |
| // behaviour is captured by |
| // $__ABC9_ASYNC below |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q($abc9_currQ)); |
| \$__ABC9_ASYNC abc_async (.A($abc9_currQ), .S(CLR), .Y(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, 1'b0 /* IS_D_INVERTED */, CLR, 1'b0 /* IS_CLR_INVERTED */}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = $abc9_currQ; |
| endmodule |
| |
| module FDPE (output reg Q, input C, CE, D, PRE); |
| parameter [0:0] INIT = 1'b0; |
| parameter [0:0] IS_C_INVERTED = 1'b0; |
| parameter [0:0] IS_D_INVERTED = 1'b0; |
| parameter [0:0] IS_PRE_INVERTED = 1'b0; |
| wire $nextQ, $abc9_currQ; |
| FDPE #( |
| .INIT(INIT), |
| .IS_C_INVERTED(IS_C_INVERTED), |
| .IS_D_INVERTED(IS_D_INVERTED), |
| .IS_PRE_INVERTED(IS_PRE_INVERTED), |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .PRE(PRE) |
| // ^^^ Note that async |
| // control is not directly |
| // supported by abc9 but its |
| // behaviour is captured by |
| // $__ABC9_ASYNC below |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q($abc9_currQ)); |
| \$__ABC9_ASYNC abc_async (.A($abc9_currQ), .S(PRE ^ IS_PRE_INVERTED), .Y(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, IS_D_INVERTED, PRE, IS_PRE_INVERTED}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = $abc9_currQ; |
| endmodule |
| module FDPE_1 (output reg Q, input C, CE, D, PRE); |
| parameter [0:0] INIT = 1'b0; |
| wire $nextQ, $abc9_currQ; |
| FDPE_1 #( |
| .INIT(INIT) |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .PRE(PRE) |
| // ^^^ Note that async |
| // control is not directly |
| // supported by abc9 but its |
| // behaviour is captured by |
| // $__ABC9_ASYNC below |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q($abc9_currQ)); |
| \$__ABC9_ASYNC abc_async (.A($abc9_currQ), .S(PRE), .Y(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, 1'b0 /* IS_D_INVERTED */, PRE, 1'b0 /* IS_PRE_INVERTED */}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = $abc9_currQ; |
| endmodule |
| |
| module FDSE (output reg Q, input C, CE, D, S); |
| parameter [0:0] INIT = 1'b1; |
| parameter [0:0] IS_C_INVERTED = 1'b0; |
| parameter [0:0] IS_D_INVERTED = 1'b0; |
| parameter [0:0] IS_S_INVERTED = 1'b0; |
| wire $nextQ; |
| FDSE #( |
| .INIT(INIT), |
| .IS_C_INVERTED(IS_C_INVERTED), |
| .IS_D_INVERTED(IS_D_INVERTED), |
| .IS_S_INVERTED(IS_S_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .S(S) |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, IS_D_INVERTED, S, IS_S_INVERTED}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = Q; |
| endmodule |
| module FDSE_1 (output reg Q, input C, CE, D, S); |
| parameter [0:0] INIT = 1'b1; |
| wire $nextQ; |
| FDSE_1 #( |
| .INIT(INIT), |
| ) _TECHMAP_REPLACE_ ( |
| .D(D), .Q($nextQ), .C(C), .CE(CE), .S(S) |
| ); |
| \$__ABC9_FF_ abc_dff (.D($nextQ), .Q(Q)); |
| |
| // Special signals |
| wire [0:0] _TECHMAP_REPLACE_.$abc9_clock = C; |
| wire [3:0] _TECHMAP_REPLACE_.$abc9_control = {CE, 1'b0 /* IS_D_INVERTED */, S, 1'b0 /* IS_S_INVERTED */}; |
| wire _TECHMAP_REPLACE_.$abc9_currQ = Q; |
| endmodule |
| |
| module RAM32X1D ( |
| output DPO, SPO, |
| (* techmap_autopurge *) input D, |
| (* techmap_autopurge *) input WCLK, |
| (* techmap_autopurge *) input WE, |
| (* techmap_autopurge *) input A0, A1, A2, A3, A4, |
| (* techmap_autopurge *) input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4 |
| ); |
| parameter INIT = 32'h0; |
| parameter IS_WCLK_INVERTED = 1'b0; |
| wire \$DPO , \$SPO ; |
| RAM32X1D #( |
| .INIT(INIT), .IS_WCLK_INVERTED(IS_WCLK_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .DPO(\$DPO ), .SPO(\$SPO ), |
| .D(D), .WCLK(WCLK), .WE(WE), |
| .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), |
| .DPRA0(DPRA0), .DPRA1(DPRA1), .DPRA2(DPRA2), .DPRA3(DPRA3), .DPRA4(DPRA4) |
| ); |
| \$__ABC9_LUT6 dpo (.A(\$DPO ), .S({1'b0, A0, A1, A2, A3, A4}), .Y(DPO)); |
| \$__ABC9_LUT6 spo (.A(\$SPO ), .S({1'b0, A0, A1, A2, A3, A4}), .Y(SPO)); |
| endmodule |
| |
| module RAM64X1D ( |
| output DPO, SPO, |
| (* techmap_autopurge *) input D, |
| (* techmap_autopurge *) input WCLK, |
| (* techmap_autopurge *) input WE, |
| (* techmap_autopurge *) input A0, A1, A2, A3, A4, A5, |
| (* techmap_autopurge *) input DPRA0, DPRA1, DPRA2, DPRA3, DPRA4, DPRA5 |
| ); |
| parameter INIT = 64'h0; |
| parameter IS_WCLK_INVERTED = 1'b0; |
| wire \$DPO , \$SPO ; |
| RAM64X1D #( |
| .INIT(INIT), .IS_WCLK_INVERTED(IS_WCLK_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .DPO(\$DPO ), .SPO(\$SPO ), |
| .D(D), .WCLK(WCLK), .WE(WE), |
| .A0(A0), .A1(A1), .A2(A2), .A3(A3), .A4(A4), .A5(A5), |
| .DPRA0(DPRA0), .DPRA1(DPRA1), .DPRA2(DPRA2), .DPRA3(DPRA3), .DPRA4(DPRA4), .DPRA5(DPRA5) |
| ); |
| \$__ABC9_LUT6 dpo (.A(\$DPO ), .S({A0, A1, A2, A3, A4, A5}), .Y(DPO)); |
| \$__ABC9_LUT6 spo (.A(\$SPO ), .S({A0, A1, A2, A3, A4, A5}), .Y(SPO)); |
| endmodule |
| |
| module RAM128X1D ( |
| output DPO, SPO, |
| (* techmap_autopurge *) input D, |
| (* techmap_autopurge *) input WCLK, |
| (* techmap_autopurge *) input WE, |
| (* techmap_autopurge *) input [6:0] A, DPRA |
| ); |
| parameter INIT = 128'h0; |
| parameter IS_WCLK_INVERTED = 1'b0; |
| wire \$DPO , \$SPO ; |
| RAM128X1D #( |
| .INIT(INIT), .IS_WCLK_INVERTED(IS_WCLK_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .DPO(\$DPO ), .SPO(\$SPO ), |
| .D(D), .WCLK(WCLK), .WE(WE), |
| .A(A), |
| .DPRA(DPRA) |
| ); |
| \$__ABC9_LUT7 dpo (.A(\$DPO ), .S(A), .Y(DPO)); |
| \$__ABC9_LUT7 spo (.A(\$SPO ), .S(A), .Y(SPO)); |
| endmodule |
| |
| module SRL16E ( |
| output Q, |
| (* techmap_autopurge *) input A0, A1, A2, A3, CE, CLK, D |
| ); |
| parameter [15:0] INIT = 16'h0000; |
| parameter [0:0] IS_CLK_INVERTED = 1'b0; |
| wire \$Q ; |
| SRL16E #( |
| .INIT(INIT), .IS_CLK_INVERTED(IS_CLK_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .Q(\$Q ), |
| .A0(A0), .A1(A1), .A2(A2), .A3(A3), .CE(CE), .CLK(CLK), .D(D) |
| ); |
| \$__ABC9_LUT6 q (.A(\$Q ), .S({1'b1, A0, A1, A2, A3, 1'b1}), .Y(Q)); |
| endmodule |
| |
| module SRLC32E ( |
| output Q, |
| output Q31, |
| (* techmap_autopurge *) input [4:0] A, |
| (* techmap_autopurge *) input CE, CLK, D |
| ); |
| parameter [31:0] INIT = 32'h00000000; |
| parameter [0:0] IS_CLK_INVERTED = 1'b0; |
| wire \$Q ; |
| SRLC32E #( |
| .INIT(INIT), .IS_CLK_INVERTED(IS_CLK_INVERTED) |
| ) _TECHMAP_REPLACE_ ( |
| .Q(\$Q ), .Q31(Q31), |
| .A(A), .CE(CE), .CLK(CLK), .D(D) |
| ); |
| \$__ABC9_LUT6 q (.A(\$Q ), .S({1'b1, A}), .Y(Q)); |
| endmodule |
| |
| //module DSP48E1 ( |
| // (* techmap_autopurge *) output [29:0] ACOUT, |
| // (* techmap_autopurge *) output [17:0] BCOUT, |
| // (* techmap_autopurge *) output reg CARRYCASCOUT, |
| // (* techmap_autopurge *) output reg [3:0] CARRYOUT, |
| // (* techmap_autopurge *) output reg MULTSIGNOUT, |
| // (* techmap_autopurge *) output OVERFLOW, |
| // (* techmap_autopurge *) output reg signed [47:0] P, |
| // (* techmap_autopurge *) output PATTERNBDETECT, |
| // (* techmap_autopurge *) output PATTERNDETECT, |
| // (* techmap_autopurge *) output [47:0] PCOUT, |
| // (* techmap_autopurge *) output UNDERFLOW, |
| // (* techmap_autopurge *) input signed [29:0] A, |
| // (* techmap_autopurge *) input [29:0] ACIN, |
| // (* techmap_autopurge *) input [3:0] ALUMODE, |
| // (* techmap_autopurge *) input signed [17:0] B, |
| // (* techmap_autopurge *) input [17:0] BCIN, |
| // (* techmap_autopurge *) input [47:0] C, |
| // (* techmap_autopurge *) input CARRYCASCIN, |
| // (* techmap_autopurge *) input CARRYIN, |
| // (* techmap_autopurge *) input [2:0] CARRYINSEL, |
| // (* techmap_autopurge *) input CEA1, |
| // (* techmap_autopurge *) input CEA2, |
| // (* techmap_autopurge *) input CEAD, |
| // (* techmap_autopurge *) input CEALUMODE, |
| // (* techmap_autopurge *) input CEB1, |
| // (* techmap_autopurge *) input CEB2, |
| // (* techmap_autopurge *) input CEC, |
| // (* techmap_autopurge *) input CECARRYIN, |
| // (* techmap_autopurge *) input CECTRL, |
| // (* techmap_autopurge *) input CED, |
| // (* techmap_autopurge *) input CEINMODE, |
| // (* techmap_autopurge *) input CEM, |
| // (* techmap_autopurge *) input CEP, |
| // (* techmap_autopurge *) input CLK, |
| // (* techmap_autopurge *) input [24:0] D, |
| // (* techmap_autopurge *) input [4:0] INMODE, |
| // (* techmap_autopurge *) input MULTSIGNIN, |
| // (* techmap_autopurge *) input [6:0] OPMODE, |
| // (* techmap_autopurge *) input [47:0] PCIN, |
| // (* techmap_autopurge *) input RSTA, |
| // (* techmap_autopurge *) input RSTALLCARRYIN, |
| // (* techmap_autopurge *) input RSTALUMODE, |
| // (* techmap_autopurge *) input RSTB, |
| // (* techmap_autopurge *) input RSTC, |
| // (* techmap_autopurge *) input RSTCTRL, |
| // (* techmap_autopurge *) input RSTD, |
| // (* techmap_autopurge *) input RSTINMODE, |
| // (* techmap_autopurge *) input RSTM, |
| // (* techmap_autopurge *) input RSTP |
| //); |
| // parameter integer ACASCREG = 1; |
| // parameter integer ADREG = 1; |
| // parameter integer ALUMODEREG = 1; |
| // parameter integer AREG = 1; |
| // parameter AUTORESET_PATDET = "NO_RESET"; |
| // parameter A_INPUT = "DIRECT"; |
| // parameter integer BCASCREG = 1; |
| // parameter integer BREG = 1; |
| // parameter B_INPUT = "DIRECT"; |
| // parameter integer CARRYINREG = 1; |
| // parameter integer CARRYINSELREG = 1; |
| // parameter integer CREG = 1; |
| // parameter integer DREG = 1; |
| // parameter integer INMODEREG = 1; |
| // parameter integer MREG = 1; |
| // parameter integer OPMODEREG = 1; |
| // parameter integer PREG = 1; |
| // parameter SEL_MASK = "MASK"; |
| // parameter SEL_PATTERN = "PATTERN"; |
| // parameter USE_DPORT = "FALSE"; |
| // parameter USE_MULT = "MULTIPLY"; |
| // parameter USE_PATTERN_DETECT = "NO_PATDET"; |
| // parameter USE_SIMD = "ONE48"; |
| // parameter [47:0] MASK = 48'h3FFFFFFFFFFF; |
| // parameter [47:0] PATTERN = 48'h000000000000; |
| // parameter [3:0] IS_ALUMODE_INVERTED = 4'b0; |
| // parameter [0:0] IS_CARRYIN_INVERTED = 1'b0; |
| // parameter [0:0] IS_CLK_INVERTED = 1'b0; |
| // parameter [4:0] IS_INMODE_INVERTED = 5'b0; |
| // parameter [6:0] IS_OPMODE_INVERTED = 7'b0; |
| // |
| // parameter _TECHMAP_CELLTYPE_ = ""; |
| // localparam techmap_guard = (_TECHMAP_CELLTYPE_ != ""); |
| // |
| //`define DSP48E1_INST(__CELL__) """ |
| //__CELL__ #( |
| // .ACASCREG(ACASCREG), |
| // .ADREG(ADREG), |
| // .ALUMODEREG(ALUMODEREG), |
| // .AREG(AREG), |
| // .AUTORESET_PATDET(AUTORESET_PATDET), |
| // .A_INPUT(A_INPUT), |
| // .BCASCREG(BCASCREG), |
| // .BREG(BREG), |
| // .B_INPUT(B_INPUT), |
| // .CARRYINREG(CARRYINREG), |
| // .CARRYINSELREG(CARRYINSELREG), |
| // .CREG(CREG), |
| // .DREG(DREG), |
| // .INMODEREG(INMODEREG), |
| // .MREG(MREG), |
| // .OPMODEREG(OPMODEREG), |
| // .PREG(PREG), |
| // .SEL_MASK(SEL_MASK), |
| // .SEL_PATTERN(SEL_PATTERN), |
| // .USE_DPORT(USE_DPORT), |
| // .USE_MULT(USE_MULT), |
| // .USE_PATTERN_DETECT(USE_PATTERN_DETECT), |
| // .USE_SIMD(USE_SIMD), |
| // .MASK(MASK), |
| // .PATTERN(PATTERN), |
| // .IS_ALUMODE_INVERTED(IS_ALUMODE_INVERTED), |
| // .IS_CARRYIN_INVERTED(IS_CARRYIN_INVERTED), |
| // .IS_CLK_INVERTED(IS_CLK_INVERTED), |
| // .IS_INMODE_INVERTED(IS_INMODE_INVERTED), |
| // .IS_OPMODE_INVERTED(IS_OPMODE_INVERTED) |
| // ) _TECHMAP_REPLACE_ ( |
| // .ACOUT(ACOUT), |
| // .BCOUT(BCOUT), |
| // .CARRYCASCOUT(CARRYCASCOUT), |
| // .CARRYOUT(CARRYOUT), |
| // .MULTSIGNOUT(MULTSIGNOUT), |
| // .OVERFLOW(OVERFLOW), |
| // .P(oP), |
| // .PATTERNBDETECT(PATTERNBDETECT), |
| // .PATTERNDETECT(PATTERNDETECT), |
| // .PCOUT(oPCOUT), |
| // .UNDERFLOW(UNDERFLOW), |
| // .A(iA), |
| // .ACIN(ACIN), |
| // .ALUMODE(ALUMODE), |
| // .B(iB), |
| // .BCIN(BCIN), |
| // .C(iC), |
| // .CARRYCASCIN(CARRYCASCIN), |
| // .CARRYIN(CARRYIN), |
| // .CARRYINSEL(CARRYINSEL), |
| // .CEA1(CEA1), |
| // .CEA2(CEA2), |
| // .CEAD(CEAD), |
| // .CEALUMODE(CEALUMODE), |
| // .CEB1(CEB1), |
| // .CEB2(CEB2), |
| // .CEC(CEC), |
| // .CECARRYIN(CECARRYIN), |
| // .CECTRL(CECTRL), |
| // .CED(CED), |
| // .CEINMODE(CEINMODE), |
| // .CEM(CEM), |
| // .CEP(CEP), |
| // .CLK(CLK), |
| // .D(iD), |
| // .INMODE(INMODE), |
| // .MULTSIGNIN(MULTSIGNIN), |
| // .OPMODE(OPMODE), |
| // .PCIN(PCIN), |
| // .RSTA(RSTA), |
| // .RSTALLCARRYIN(RSTALLCARRYIN), |
| // .RSTALUMODE(RSTALUMODE), |
| // .RSTB(RSTB), |
| // .RSTC(RSTC), |
| // .RSTCTRL(RSTCTRL), |
| // .RSTD(RSTD), |
| // .RSTINMODE(RSTINMODE), |
| // .RSTM(RSTM), |
| // .RSTP(RSTP) |
| // ); |
| //""" |
| // |
| // wire [29:0] iA; |
| // wire [17:0] iB; |
| // wire [47:0] iC; |
| // wire [24:0] iD; |
| // |
| // wire pA, pB, pC, pD, pAD, pM, pP; |
| // wire [47:0] oP, mP; |
| // wire [47:0] oPCOUT, mPCOUT; |
| // |
| // generate |
| // if (USE_MULT == "MULTIPLY" && USE_DPORT == "FALSE") begin |
| // // Disconnect the A-input if MREG is enabled, since |
| // // combinatorial path is broken |
| // if (AREG == 0 && MREG == 0 && PREG == 0) |
| // assign iA = A, pA = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(30)) rA (.I(A), .O(iA), .Q(pA)); |
| // if (BREG == 0 && MREG == 0 && PREG == 0) |
| // assign iB = B, pB = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(18)) rB (.I(B), .O(iB), .Q(pB)); |
| // if (CREG == 0 && PREG == 0) |
| // assign iC = C, pC = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(48)) rC (.I(C), .O(iC), .Q(pC)); |
| // if (DREG == 0) |
| // assign iD = D; |
| // else if (techmap_guard) |
| // $error("Invalid DSP48E1 configuration: DREG enabled but USE_DPORT == \"FALSE\""); |
| // assign pD = 1'bx; |
| // if (ADREG == 1 && techmap_guard) |
| // $error("Invalid DSP48E1 configuration: ADREG enabled but USE_DPORT == \"FALSE\""); |
| // assign pAD = 1'bx; |
| // if (PREG == 0) begin |
| // if (MREG == 1) |
| // \$__ABC9_REG rM (.Q(pM)); |
| // else |
| // assign pM = 1'bx; |
| // assign pP = 1'bx; |
| // end else begin |
| // assign pM = 1'bx; |
| // \$__ABC9_REG rP (.Q(pP)); |
| // end |
| // |
| // if (MREG == 0 && PREG == 0) |
| // assign mP = oP, mPCOUT = oPCOUT; |
| // else |
| // assign mP = 1'bx, mPCOUT = 1'bx; |
| // \$__ABC9_DSP48E1_MULT_P_MUX muxP ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oP), .Mq(pM), .P(mP), .Pq(pP), .O(P) |
| // ); |
| // \$__ABC9_DSP48E1_MULT_PCOUT_MUX muxPCOUT ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oPCOUT), .Mq(pM), .P(mPCOUT), .Pq(pP), .O(PCOUT) |
| // ); |
| // |
| // `DSP48E1_INST(\$__ABC9_DSP48E1_MULT ) |
| // end |
| // else if (USE_MULT == "MULTIPLY" && USE_DPORT == "TRUE") begin |
| // // Disconnect the A-input if MREG is enabled, since |
| // // combinatorial path is broken |
| // if (AREG == 0 && ADREG == 0 && MREG == 0 && PREG == 0) |
| // assign iA = A, pA = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(30)) rA (.I(A), .O(iA), .Q(pA)); |
| // if (BREG == 0 && MREG == 0 && PREG == 0) |
| // assign iB = B, pB = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(18)) rB (.I(B), .O(iB), .Q(pB)); |
| // if (CREG == 0 && PREG == 0) |
| // assign iC = C, pC = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(48)) rC (.I(C), .O(iC), .Q(pC)); |
| // if (DREG == 0 && ADREG == 0) |
| // assign iD = D, pD = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(25)) rD (.I(D), .O(iD), .Q(pD)); |
| // if (PREG == 0) begin |
| // if (MREG == 1) begin |
| // assign pAD = 1'bx; |
| // \$__ABC9_REG rM (.Q(pM)); |
| // end else begin |
| // if (ADREG == 1) |
| // \$__ABC9_REG rAD (.Q(pAD)); |
| // else |
| // assign pAD = 1'bx; |
| // assign pM = 1'bx; |
| // end |
| // assign pP = 1'bx; |
| // end else begin |
| // assign pAD = 1'bx, pM = 1'bx; |
| // \$__ABC9_REG rP (.Q(pP)); |
| // end |
| // |
| // if (MREG == 0 && PREG == 0) |
| // assign mP = oP, mPCOUT = oPCOUT; |
| // else |
| // assign mP = 1'bx, mPCOUT = 1'bx; |
| // \$__ABC9_DSP48E1_MULT_DPORT_P_MUX muxP ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oP), .Mq(pM), .P(mP), .Pq(pP), .O(P) |
| // ); |
| // \$__ABC9_DSP48E1_MULT_DPORT_PCOUT_MUX muxPCOUT ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oPCOUT), .Mq(pM), .P(mPCOUT), .Pq(pP), .O(PCOUT) |
| // ); |
| // |
| // `DSP48E1_INST(\$__ABC9_DSP48E1_MULT_DPORT ) |
| // end |
| // else if (USE_MULT == "NONE" && USE_DPORT == "FALSE") begin |
| // // Disconnect the A-input if MREG is enabled, since |
| // // combinatorial path is broken |
| // if (AREG == 0 && PREG == 0) |
| // assign iA = A, pA = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(30)) rA (.I(A), .O(iA), .Q(pA)); |
| // if (BREG == 0 && PREG == 0) |
| // assign iB = B, pB = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(18)) rB (.I(B), .O(iB), .Q(pB)); |
| // if (CREG == 0 && PREG == 0) |
| // assign iC = C, pC = 1'bx; |
| // else |
| // \$__ABC9_REG #(.WIDTH(48)) rC (.I(C), .O(iC), .Q(pC)); |
| // if (DREG == 1 && techmap_guard) |
| // $error("Invalid DSP48E1 configuration: DREG enabled but USE_DPORT == \"FALSE\""); |
| // assign pD = 1'bx; |
| // if (ADREG == 1 && techmap_guard) |
| // $error("Invalid DSP48E1 configuration: ADREG enabled but USE_DPORT == \"FALSE\""); |
| // assign pAD = 1'bx; |
| // if (MREG == 1 && techmap_guard) |
| // $error("Invalid DSP48E1 configuration: MREG enabled but USE_MULT == \"NONE\""); |
| // assign pM = 1'bx; |
| // if (PREG == 1) |
| // \$__ABC9_REG rP (.Q(pP)); |
| // else |
| // assign pP = 1'bx; |
| // |
| // if (MREG == 0 && PREG == 0) |
| // assign mP = oP, mPCOUT = oPCOUT; |
| // else |
| // assign mP = 1'bx, mPCOUT = 1'bx; |
| // \$__ABC9_DSP48E1_P_MUX muxP ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oP), .Mq(pM), .P(mP), .Pq(pP), .O(P) |
| // ); |
| // \$__ABC9_DSP48E1_PCOUT_MUX muxPCOUT ( |
| // .Aq(pA), .Bq(pB), .Cq(pC), .Dq(pD), .ADq(pAD), .I(oPCOUT), .Mq(pM), .P(mPCOUT), .Pq(pP), .O(PCOUT) |
| // ); |
| // |
| // `DSP48E1_INST(\$__ABC9_DSP48E1 ) |
| // end |
| // else |
| // $error("Invalid DSP48E1 configuration"); |
| // endgenerate |
| // `undef DSP48E1_INST |
| //endmodule |