| // Copyright 2020-2022 F4PGA Authors | 
 | // | 
 | // 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 | 
 |  | 
 | `timescale 1ps/1ps | 
 |  | 
 | `default_nettype none | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module sh_dff( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C | 
 | ); | 
 |  | 
 |     initial Q <= 1'b0; | 
 |     always @(posedge C) | 
 |         Q <= D; | 
 | 		 | 
 |     specify | 
 |       (posedge C => (Q +: D)) = 0; | 
 |       $setuphold(posedge C, D, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_box, lib_blackbox *) | 
 | module adder_carry( | 
 |     output wire sumout, | 
 |     output wire cout, | 
 |     input wire p, | 
 |     input wire g, | 
 |     input wire cin | 
 | ); | 
 |     assign sumout = p ^ cin; | 
 |     assign cout = p ? cin : g; | 
 | 	 | 
 |     specify | 
 |         (p => sumout) = 0; | 
 |         (g => sumout) = 0; | 
 |         (cin => sumout) = 0; | 
 |         (p => cout) = 0; | 
 |         (g => cout) = 0; | 
 |         (cin => cout) = 0; | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module dff( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(posedge C) | 
 |       Q <= D; | 
 |  | 
 |     specify | 
 | 	    (posedge C=>(Q+:D)) = 0; | 
 | 	    $setuphold(posedge C, D, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module dffn( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(negedge C) | 
 |       Q <= D; | 
 | 	   | 
 |     specify | 
 | 	    (negedge C=>(Q+:D)) = 0; | 
 | 	    $setuphold(negedge C, D, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module dffsre( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C, | 
 |     input wire E, | 
 |     input wire R, | 
 |     input wire S | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(posedge C or negedge S or negedge R) | 
 |       if (!R) | 
 |         Q <= 1'b0; | 
 |       else if (!S) | 
 |         Q <= 1'b1; | 
 |       else if (E) | 
 |         Q <= D; | 
 |  | 
 |     specify | 
 |       (posedge C => (Q +: D)) = 0; | 
 |       (R => Q) = 0; | 
 |       (S => Q) = 0; | 
 |       $setuphold(posedge C, D, 0, 0); | 
 |       $setuphold(posedge C, E, 0, 0); | 
 |       $setuphold(posedge C, R, 0, 0); | 
 |       $setuphold(posedge C, S, 0, 0); | 
 |       $recrem(posedge R, posedge C, 0, 0); | 
 |       $recrem(posedge S, posedge C, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module dffnsre( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C, | 
 |     input wire E, | 
 |     input wire R, | 
 |     input wire S | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(negedge C or negedge S or negedge R) | 
 |       if (!R) | 
 |         Q <= 1'b0; | 
 |       else if (!S) | 
 |         Q <= 1'b1; | 
 |       else if (E) | 
 |         Q <= D; | 
 | 		 | 
 |     specify | 
 |       (negedge C => (Q +: D)) = 0; | 
 |       (R => Q) = 0; | 
 |       (S => Q) = 0; | 
 |       $setuphold(negedge C, D, 0, 0); | 
 |       $setuphold(negedge C, E, 0, 0); | 
 |       $setuphold(negedge C, R, 0, 0); | 
 |       $setuphold(negedge C, S, 0, 0); | 
 |       $recrem(posedge R, negedge C, 0, 0); | 
 |       $recrem(posedge S, negedge C, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module sdffsre( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C, | 
 |     input wire E, | 
 |     input wire R, | 
 |     input wire S | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(posedge C) | 
 |       if (!R) | 
 |         Q <= 1'b0; | 
 |       else if (!S) | 
 |         Q <= 1'b1; | 
 |       else if (E) | 
 |         Q <= D; | 
 | 		 | 
 |     specify | 
 |         (posedge C => (Q +: D)) = 0; | 
 |         $setuphold(posedge C, D, 0, 0); | 
 |         $setuphold(posedge C, R, 0, 0); | 
 |         $setuphold(posedge C, S, 0, 0); | 
 |         $setuphold(posedge C, E, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module sdffnsre( | 
 |     output reg Q, | 
 |     input wire D, | 
 |     (* clkbuf_sink *) | 
 |     input wire C, | 
 |     input wire E, | 
 |     input wire R, | 
 |     input wire S | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @(negedge C) | 
 |       if (!R) | 
 |         Q <= 1'b0; | 
 |       else if (!S) | 
 |         Q <= 1'b1; | 
 |       else if (E) | 
 |         Q <= D; | 
 | 		 | 
 |     specify | 
 |         (negedge C => (Q +: D)) = 0; | 
 |         $setuphold(negedge C, D, 0, 0); | 
 |         $setuphold(negedge C, R, 0, 0); | 
 |         $setuphold(negedge C, S, 0, 0); | 
 |         $setuphold(negedge C, E, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module latchsre ( | 
 |     output reg Q, | 
 |     input wire S, | 
 |     input wire R, | 
 |     input wire D, | 
 |     input wire G, | 
 |     input wire E | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @* | 
 |       begin | 
 |         if (!R) | 
 |           Q <= 1'b0; | 
 |         else if (!S) | 
 |           Q <= 1'b1; | 
 |         else if (E && G) | 
 |           Q <= D; | 
 |       end | 
 | 	   | 
 |     specify | 
 |       (posedge G => (Q +: D)) = 0; | 
 |       $setuphold(posedge G, D, 0, 0); | 
 |       $setuphold(posedge G, E, 0, 0); | 
 |       $setuphold(posedge G, R, 0, 0); | 
 |       $setuphold(posedge G, S, 0, 0); | 
 |     endspecify       | 
 |  | 
 | endmodule | 
 |  | 
 | (* abc9_flop, lib_whitebox *) | 
 | module latchnsre ( | 
 |     output reg Q, | 
 |     input wire S, | 
 |     input wire R, | 
 |     input wire D, | 
 |     input wire G, | 
 |     input wire E | 
 | ); | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     always @* | 
 |       begin | 
 |         if (!R) | 
 |           Q <= 1'b0; | 
 |         else if (!S) | 
 |           Q <= 1'b1; | 
 |         else if (E && !G) | 
 |           Q <= D; | 
 |       end | 
 | 	   | 
 |     specify | 
 |       (negedge G => (Q +: D)) = 0; | 
 |       $setuphold(negedge G, D, 0, 0); | 
 |       $setuphold(negedge G, E, 0, 0); | 
 |       $setuphold(negedge G, R, 0, 0); | 
 |       $setuphold(negedge G, S, 0, 0); | 
 |     endspecify  | 
 |  | 
 | endmodule | 
 |  |