| // Copyright (C) 2020-2021 The SymbiFlow Authors. |
| // |
| // Use of this source code is governed by a ISC-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/ISC |
| // |
| // SPDX-License-Identifier:ISC |
| |
| (* abc9_box, lib_whitebox *) |
| module adder_lut4( |
| output lut4_out, |
| (* abc9_carry *) |
| output cout, |
| input [0:3] in, |
| (* abc9_carry *) |
| input cin |
| ); |
| parameter [0:15] LUT=0; |
| parameter IN2_IS_CIN = 0; |
| |
| wire [0:3] li = (IN2_IS_CIN) ? {in[0], in[1], cin, in[3]} : {in[0], in[1], in[2], in[3]}; |
| |
| // Output function |
| wire [0:7] s1 = li[0] ? |
| {LUT[0], LUT[2], LUT[4], LUT[6], LUT[8], LUT[10], LUT[12], LUT[14]}: |
| {LUT[1], LUT[3], LUT[5], LUT[7], LUT[9], LUT[11], LUT[13], LUT[15]}; |
| |
| wire [0:3] s2 = li[1] ? {s1[0], s1[2], s1[4], s1[6]} : |
| {s1[1], s1[3], s1[5], s1[7]}; |
| |
| wire [0:1] s3 = li[2] ? {s2[0], s2[2]} : {s2[1], s2[3]}; |
| |
| assign lut4_out = li[3] ? s3[0] : s3[1]; |
| |
| // Carry out function |
| assign cout = (s2[2]) ? cin : s2[3]; |
| endmodule |
| |
| (* abc9_lut=1, lib_whitebox *) |
| module frac_lut4( |
| input [0:3] in, |
| output [0:1] lut2_out, |
| output lut4_out |
| ); |
| parameter [0:15] LUT = 0; |
| |
| // Effective LUT input |
| wire [0:3] li = in; |
| |
| // Output function |
| wire [0:7] s1 = li[0] ? |
| {LUT[0], LUT[2], LUT[4], LUT[6], LUT[8], LUT[10], LUT[12], LUT[14]}: |
| {LUT[1], LUT[3], LUT[5], LUT[7], LUT[9], LUT[11], LUT[13], LUT[15]}; |
| |
| wire [0:3] s2 = li[1] ? {s1[0], s1[2], s1[4], s1[6]} : |
| {s1[1], s1[3], s1[5], s1[7]}; |
| |
| wire [0:1] s3 = li[2] ? {s2[0], s2[2]} : {s2[1], s2[3]}; |
| |
| assign lut2_out[0] = s2[2]; |
| assign lut2_out[1] = s2[3]; |
| |
| assign lut4_out = li[3] ? s3[0] : s3[1]; |
| |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module scff( |
| output reg Q, |
| input D, |
| input clk |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge clk) |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dff( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge C) |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffr( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input R |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge C or negedge R) |
| if (!R) |
| Q <= 1'b0; |
| else |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module sh_dff( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge C) |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffs( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input S |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge C or negedge S) |
| if (!S) |
| Q <= 1'b1; |
| else |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffn( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(negedge C) |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffnr( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input R |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(negedge C or negedge R) |
| if (!R) |
| Q <= 1'b0; |
| else |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffns( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input S |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(negedge C or negedge S) |
| if (!S) |
| Q <= 1'b1; |
| else |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffsr( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input R, |
| input S |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(posedge C or negedge S or negedge R) |
| if (!S) |
| Q <= 1'b1; |
| else if (!R) |
| Q <= 1'b0; |
| else |
| Q <= D; |
| endmodule |
| |
| (* abc9_flop, lib_whitebox *) |
| module dffnsr( |
| output reg Q, |
| input D, |
| (* clkbuf_sink *) |
| input C, |
| input R, |
| input S |
| ); |
| parameter [0:0] INIT = 1'b0; |
| initial Q = INIT; |
| |
| always @(negedge C or negedge S or negedge R) |
| if (!S) |
| Q <= 1'b1; |
| else if (!R) |
| Q <= 1'b0; |
| else |
| Q <= D; |
| endmodule |