| // Copyright 2022 AUC Open Source Hardware Lab | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License");  | 
 | // you may not use this file except in compliance with the License.  | 
 | // You may obtain a copy of the License at: | 
 | // | 
 | //     http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software  | 
 | // distributed under the License is distributed on an "AS IS" BASIS,  | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  | 
 | // See the License for the specific language governing permissions and  | 
 | // limitations under the License. | 
 | // | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 |  | 
 |  | 
 | module \$adffe (ARST, CLK, D, EN, Q); | 
 |     parameter ARST_POLARITY =1'b1; | 
 |     parameter ARST_VALUE  =1'b0; | 
 |     parameter CLK_POLARITY =1'b1; | 
 |     parameter EN_POLARITY =1'b1; | 
 |     parameter WIDTH =1; | 
 |  | 
 |     input ARST, CLK, EN; | 
 |     input [WIDTH -1 :0] D;  | 
 |     output [WIDTH -1 :0] Q; | 
 |  | 
 |     wire GCLK; | 
 |  | 
 |     generate | 
 |         if (WIDTH < 5) begin | 
 |                 sky130_fd_sc_hd__dlclkp_1  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else if (WIDTH < 17) begin | 
 |                 sky130_fd_sc_hd__dlclkp_2  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else begin | 
 |                 sky130_fd_sc_hd__dlclkp_4  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |         end | 
 |     endgenerate | 
 |  | 
 |     $adff  #(  | 
 |             .WIDTH(WIDTH),  | 
 |             .CLK_POLARITY(CLK_POLARITY), | 
 |             .ARST_VALUE(ARST_VALUE) , | 
 |             .ARST_POLARITY (ARST_POLARITY) | 
 |             )  | 
 |             flipflop(   | 
 |             .CLK(GCLK),  | 
 |             .ARST(ARST), | 
 |             .D(D),  | 
 |             .Q(Q) | 
 |             ); | 
 | endmodule | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | module \$dffe ( CLK, D, EN, Q); | 
 |     parameter CLK_POLARITY =1'b1; | 
 |     parameter EN_POLARITY =1'b1; | 
 |     parameter WIDTH =1; | 
 |  | 
 |     input  CLK, EN; | 
 |     input [WIDTH -1:0] D;  | 
 |     output [WIDTH -1:0] Q; | 
 |  | 
 |     wire GCLK; | 
 |  | 
 |     generate | 
 |         if (WIDTH < 5) begin | 
 |                 sky130_fd_sc_hd__dlclkp_1  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else if (WIDTH < 17) begin | 
 |                 sky130_fd_sc_hd__dlclkp_2  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else begin | 
 |                 sky130_fd_sc_hd__dlclkp_4  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |         end | 
 |     endgenerate | 
 |  | 
 |     $dff  #(  | 
 |             .WIDTH(WIDTH),  | 
 |             .CLK_POLARITY(CLK_POLARITY), | 
 |             )  | 
 |             flipflop(   | 
 |             .CLK(GCLK),  | 
 |             .D(D),  | 
 |             .Q(Q) | 
 |             ); | 
 | endmodule | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | module \$dffsre ( CLK, EN, CLR, SET, D, Q); | 
 |     parameter CLK_POLARITY =1'b1; | 
 |     parameter EN_POLARITY =1'b1; | 
 |     parameter CLR_POLARITY =1'b1; | 
 |     parameter SET_POLARITY =1'b1; | 
 |     parameter WIDTH =1; | 
 |  | 
 |     input  CLK, EN, CLR, SET; | 
 |     input [WIDTH -1:0] D;  | 
 |     output [WIDTH -1:0] Q; | 
 |  | 
 |     wire GCLK; | 
 |  | 
 |     generate | 
 |         if (WIDTH < 5) begin | 
 |                 sky130_fd_sc_hd__dlclkp_1  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else if (WIDTH < 17) begin | 
 |                 sky130_fd_sc_hd__dlclkp_2  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else begin | 
 |                 sky130_fd_sc_hd__dlclkp_4  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |         end | 
 |     endgenerate | 
 |  | 
 |     $dffsr  #(  | 
 |             .WIDTH(WIDTH),  | 
 |             .CLK_POLARITY(CLK_POLARITY), | 
 |             .CLR_POLARITY(CLR_POLARITY),  | 
 |             .SET_POLARITY(SET_POLARITY) | 
 |             )  | 
 |             flipflop(   | 
 |             .CLK(GCLK),  | 
 |             .CLR(CLR), | 
 |             .SET(SET), | 
 |             .D(D),  | 
 |             .Q(Q) | 
 |             ); | 
 | endmodule | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | module \$aldffe ( CLK, EN, ALOAD, AD, D, Q); | 
 |     parameter CLK_POLARITY =1'b1; | 
 |     parameter EN_POLARITY =1'b1; | 
 |     parameter ALOAD_POLARITY =1'b1; | 
 |     parameter WIDTH =1; | 
 |  | 
 |     input  CLK, EN, ALOAD; | 
 |     input [WIDTH -1:0] D;  | 
 |     input [WIDTH-1:0] AD; | 
 |     output [WIDTH -1:0] Q; | 
 |  | 
 |     wire GCLK; | 
 |  | 
 |     generate | 
 |         if (WIDTH < 5) begin | 
 |                 sky130_fd_sc_hd__dlclkp_1  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else if (WIDTH < 17) begin | 
 |                 sky130_fd_sc_hd__dlclkp_2  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else begin | 
 |                 sky130_fd_sc_hd__dlclkp_4  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |         end | 
 |     endgenerate | 
 |  | 
 |     $aldff  #(  | 
 |             .WIDTH(WIDTH),  | 
 |             .CLK_POLARITY(CLK_POLARITY), | 
 |             .ALOAD_POLARITY(ALOAD_POLARITY),  | 
 |             )  | 
 |             flipflop(   | 
 |             .CLK(GCLK),  | 
 |             .D(D), | 
 |             .AD(AD), | 
 |             .Q(Q) | 
 |             ); | 
 | endmodule | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | // todoo: add support for other $sdffe  | 
 |  | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 | ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | module \$sdffce ( CLK, EN, SRST, D, Q); | 
 |     parameter CLK_POLARITY =1'b1; | 
 |     parameter EN_POLARITY =1'b1; | 
 |     parameter SRST_POLARITY =1'b1; | 
 |     parameter SRST_VALUE =1'b1; | 
 |     parameter WIDTH =1; | 
 |  | 
 |     input  CLK, EN, SRST; | 
 |     input [WIDTH -1:0] D;  | 
 |     output [WIDTH -1:0] Q; | 
 |  | 
 |     wire GCLK; | 
 |  | 
 |     generate | 
 |         if (WIDTH < 5) begin | 
 |                 sky130_fd_sc_hd__dlclkp_1  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else if (WIDTH < 17) begin | 
 |                 sky130_fd_sc_hd__dlclkp_2  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |                 end | 
 |             else begin | 
 |                 sky130_fd_sc_hd__dlclkp_4  clk_gate ( .GCLK(GCLK), .CLK(CLK), .GATE(EN) ); | 
 |         end | 
 |     endgenerate | 
 |  | 
 |     $sdff  #(  | 
 |             .WIDTH(WIDTH),  | 
 |             .CLK_POLARITY(CLK_POLARITY), | 
 |             .SRST_POLARITY(SRST_POLARITY),  | 
 |             .SRST_VALUE(SRST_VALUE) | 
 |             )  | 
 |             flipflop(   | 
 |             .CLK(GCLK),  | 
 |             .SRST(SRST), | 
 |             .D(D),  | 
 |             .Q(Q) | 
 |             ); | 
 | endmodule |