xilinx/ecp5/ice40: add (* abc9_flop *) to bypass-able cells
authorEddie Hung <eddie@fpgeh.com>
Tue, 21 Apr 2020 21:13:38 +0000 (14:13 -0700)
committerEddie Hung <eddie@fpgeh.com>
Thu, 14 May 2020 17:33:56 +0000 (10:33 -0700)
techlibs/ecp5/cells_sim.v
techlibs/ice40/cells_sim.v
techlibs/xilinx/cells_sim.v

index 563592218defcb076a7850e860db2ce86e6439e9..6f37823e4f7d525459500293673f940f93ff3b2d 100644 (file)
@@ -186,6 +186,7 @@ module PFUMX (input ALUT, BLUT, C0, output Z);
 endmodule
 
 // ---------------------------------------
+(* abc9_box, lib_whitebox *)
 module TRELLIS_DPR16X4 (
        input  [3:0] DI,
        input  [3:0] WAD,
@@ -222,10 +223,16 @@ module TRELLIS_DPR16X4 (
                        mem[WAD] <= DI;
 
        assign DO = mem[RAD];
+
+       specify
+               // TODO
+               (RAD *> DO) = 0;
+       endspecify
 endmodule
 
 // ---------------------------------------
 
+(* abc9_box, lib_whitebox *)
 module DPR16X4C (
                input [3:0] DI,
                input WCK, WRE,
@@ -281,6 +288,10 @@ module DPR16X4C (
 
        assign DO = ram[RAD];
 
+       specify
+               // TODO
+               (RAD *> DO) = 0;
+       endspecify
 endmodule
 
 // ---------------------------------------
@@ -295,7 +306,7 @@ endmodule
 // ---------------------------------------
 
 `ifdef YOSYS
-(* abc9_flop=(SRMODE != "ASYNC"), lib_whitebox=(SRMODE != "ASYNC") *)
+(* abc9_flop=(SRMODE != "ASYNC"), abc9_box=(SRMODE == "ASYNC"), lib_whitebox *)
 `endif
 module TRELLIS_FF(input CLK, LSR, CE, DI, M, output reg Q);
        parameter GSR = "ENABLED";
@@ -351,15 +362,27 @@ module TRELLIS_FF(input CLK, LSR, CE, DI, M, output reg Q);
                                $setup(DI, negedge CLK, 0);
                                $setup(CE, negedge CLK, 0);
                                $setup(LSR, negedge CLK, 0);
-                               if (muxlsr) (negedge CLK => (Q : DI)) = 0;
-                               if (!muxlsr && muxce) (negedge CLK => (Q : srval)) = 0;
+`ifndef YOSYS
+                               if (muxlsr) (negedge CLK => (Q : srval)) = 0;
+`else
+                               if (muxlsr) (LSR => Q) = 0;     // Technically, this should be an edge sensitive path
+                                                               // but for facilitating a bypass box, let's pretend it's
+                                                               // a simple path
+`endif
+                               if (!muxlsr && muxce) (negedge CLK => (Q : DI)) = 0;
                        endspecify
                else
                        specify
                                $setup(DI, posedge CLK, 0);
                                $setup(CE, posedge CLK, 0);
                                $setup(LSR, posedge CLK, 0);
+`ifndef YOSYS
                                if (muxlsr) (posedge CLK => (Q : srval)) = 0;
+`else
+                               if (muxlsr) (LSR => Q) = 0;     // Technically, this should be an edge sensitive path
+                                                               // but for facilitating a bypass box, let's pretend it's
+                                                               // a simple path
+`endif
                                if (!muxlsr && muxce) (posedge CLK => (Q : DI)) = 0;
                        endspecify
        endgenerate
index 1b759a28f3adb4bbaa5c54895df0bb8309e4e399..ad572c877b2e98a4f2251a88ca81447083abb1de 100644 (file)
@@ -372,6 +372,7 @@ module SB_DFFSR (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFR (
        output `SB_DFF_REG,
        input C, R, D
@@ -389,7 +390,13 @@ module SB_DFFR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge R, posedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 599;
+`else
+               if (R) (R => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (!R) (posedge C => (Q : D)) = 540;
        endspecify
@@ -402,7 +409,13 @@ module SB_DFFR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge R, posedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 883;
+`else
+               if (R) (R => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (!R) (posedge C => (Q : D)) = 796;
        endspecify
@@ -415,7 +428,13 @@ module SB_DFFR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge R, posedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 1589;
+`else
+               if (R) (R => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (!R) (posedge C => (Q : D)) = 1391;
        endspecify
@@ -470,6 +489,7 @@ module SB_DFFSS (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFS (
        output `SB_DFF_REG,
        input C, S, D
@@ -487,7 +507,13 @@ module SB_DFFS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge S, posedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 599;
+`else
+               if (S) (S => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (!S) (posedge C => (Q : D)) = 540;
        endspecify
@@ -500,7 +526,13 @@ module SB_DFFS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge S, posedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 883;
+`else
+               if (S) (S => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (!S) (posedge C => (Q : D)) = 796;
        endspecify
@@ -513,7 +545,13 @@ module SB_DFFS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge S, posedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 1589;
+`else
+               if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (!S) (posedge C => (Q : D)) = 1391;
        endspecify
@@ -576,6 +614,7 @@ module SB_DFFESR (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFER (
        output `SB_DFF_REG,
        input C, E, R, D
@@ -595,7 +634,13 @@ module SB_DFFER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge R, posedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 599;
+`else
+               if (R) (R => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (E && !R) (posedge C => (Q : D)) = 540;
        endspecify
@@ -610,7 +655,13 @@ module SB_DFFER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge R, posedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 883;
+`else
+               if (R) (R => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (E && !R) (posedge C => (Q : D)) = 796;
        endspecify
@@ -625,7 +676,13 @@ module SB_DFFER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge R, posedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 1589;
+`else
+               if (R) (R => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (E && !R) (posedge C => (Q : D)) = 1391;
        endspecify
@@ -688,6 +745,7 @@ module SB_DFFESS (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFES (
        output `SB_DFF_REG,
        input C, E, S, D
@@ -707,7 +765,13 @@ module SB_DFFES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(posedge S, posedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 599;
+`else
+               if (S) (S => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (E && !S) (posedge C => (Q : D)) = 540;
        endspecify
@@ -722,7 +786,13 @@ module SB_DFFES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(posedge S, posedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 883;
+`else
+               if (S) (S => Q) = 883; // Technically, this should be an edge sensitive path
+                                                          // but for facilitating a bypass box, let's pretend it's
+                                                          // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (E && !S) (posedge C => (Q : D)) = 796;
        endspecify
@@ -737,7 +807,13 @@ module SB_DFFES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(posedge S, posedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 1589;
+`else
+               if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path
+                                                          // but for facilitating a bypass box, let's pretend it's
+                                                          // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (E && !S) (posedge C => (Q : D)) = 1391;
        endspecify
@@ -891,7 +967,13 @@ module SB_DFFNR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge R, negedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 599;
+`else
+               if (R) (R => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (!R) (negedge C => (Q : D)) = 540;
        endspecify
@@ -904,7 +986,13 @@ module SB_DFFNR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge R, negedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 883;
+`else
+               if (R) (R => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (!R) (negedge C => (Q : D)) = 796;
        endspecify
@@ -917,7 +1005,13 @@ module SB_DFFNR (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge R, negedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 1589;
+`else
+               if (R) (R => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (!R) (negedge C => (Q : D)) = 1391;
        endspecify
@@ -972,6 +1066,7 @@ module SB_DFFNSS (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFNS (
        output `SB_DFF_REG,
        input C, S, D
@@ -989,7 +1084,13 @@ module SB_DFFNS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge S, negedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 599;
+`else
+               if (S) (S => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (!S) (negedge C => (Q : D)) = 540;
        endspecify
@@ -1002,7 +1103,13 @@ module SB_DFFNS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge S, negedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 883;
+`else
+               if (S) (S => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (!S) (negedge C => (Q : D)) = 796;
        endspecify
@@ -1015,7 +1122,13 @@ module SB_DFFNS (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge S, negedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 1589;
+`else
+               if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (!S) (negedge C => (Q : D)) = 1391;
        endspecify
@@ -1078,6 +1191,7 @@ module SB_DFFNESR (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFNER (
        output `SB_DFF_REG,
        input C, E, R, D
@@ -1097,7 +1211,13 @@ module SB_DFFNER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(R, negedge C, 2160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 599;
+`else
+               if (R) (R => Q) = 599;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (E && !R) (negedge C => (Q : D)) = 540;
        endspecify
@@ -1112,7 +1232,13 @@ module SB_DFFNER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(R, negedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 883;
+`else
+               if (R) (R => Q) = 883;  // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (E && !R) (negedge C => (Q : D)) = 796;
        endspecify
@@ -1127,7 +1253,13 @@ module SB_DFFNER (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge R, negedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge R => (Q : 1'b0)) = 1589;
+`else
+               if (R) (R => Q) = 1589; // Technically, this should be an edge sensitive path
+                                       // but for facilitating a bypass box, let's pretend it's
+                                       // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (E && !R) (negedge C => (Q : D)) = 1391;
        endspecify
@@ -1190,6 +1322,7 @@ module SB_DFFNESS (
 `endif
 endmodule
 
+(* abc9_box, lib_whitebox *)
 module SB_DFFNES (
        output `SB_DFF_REG,
        input C, E, S, D
@@ -1209,7 +1342,14 @@ module SB_DFFNES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L63
                $setup(negedge S, negedge C, 160);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 599;
+`else
+        if (S) (S => Q) = 599; // Technically, this should be an edge sensitive path
+                               // but for facilitating a bypass box, let's pretend it's
+                               // a simple path
+`endif
+
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
                if (E && !S) (negedge C => (Q : D)) = 540;
        endspecify
@@ -1224,7 +1364,13 @@ module SB_DFFNES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L63
                $setup(negedge S, negedge C, 235);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L91
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 883;
+`else
+        if (S) (S => Q) = 883; // Technically, this should be an edge sensitive path
+                               // but for facilitating a bypass box, let's pretend it's
+                               // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
                if (E && !S) (negedge C => (Q : D)) = 796;
        endspecify
@@ -1239,7 +1385,13 @@ module SB_DFFNES (
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L75
                $setup(negedge S, negedge C, 424);
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L103
+`ifndef YOSYS
                (posedge S => (Q : 1'b1)) = 1589;
+`else
+        if (S) (S => Q) = 1589; // Technically, this should be an edge sensitive path
+                               // but for facilitating a bypass box, let's pretend it's
+                               // a simple path
+`endif
                // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
                if (E && !S) (negedge C => (Q : D)) = 1391;
        endspecify
@@ -2736,6 +2888,7 @@ module SB_IO_OD (
 `endif
 endmodule
 
+//(* abc9_box, lib_whitebox *) // TODO
 module SB_MAC16 (
        input CLK, CE,
        input [15:0] C, A, B, D,
index a6eb9a90e1e572130db34d61d201fcac07bbd140..cd611399e9b407f645e2a9a4f3c28203f7a61900 100644 (file)
@@ -692,9 +692,14 @@ module FDCE (
     $setup(CLR, posedge C &&& !IS_C_INVERTED, 404);
     $setup(CLR, negedge C &&&  IS_C_INVERTED, 404);
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
+`ifndef YOSYS
+    if (!IS_CLR_INVERTED) (posedge CLR => (Q : 1'b0)) = 764;
+    if ( IS_CLR_INVERTED) (negedge CLR => (Q : 1'b0)) = 764;
+`else
     if (IS_CLR_INVERTED != CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
                                                   // but for facilitating a bypass box, let's pretend it's
                                                   // a simple path
+`endif
     if (!IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
     if ( IS_C_INVERTED && CLR == IS_CLR_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
   endspecify
@@ -720,14 +725,18 @@ module FDCE_1 (
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
     $setup(CLR, negedge C, 404);
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
+`ifndef YOSYS
+    (posedge CLR => (Q : 1'b0)) = 764;
+`else
     if (CLR) (CLR => Q) = 764; // Technically, this should be an edge sensitive path
                                // but for facilitating a bypass box, let's pretend it's
                                // a simple path
+`endif
     if (!CLR && CE) (negedge C => (Q : D)) = 303;
   endspecify
 endmodule
 
-//(* abc9_box, lib_whitebox *)
+(* abc9_box, lib_whitebox *)
 module FDPE (
   output reg Q,
   (* clkbuf_sink *)
@@ -762,9 +771,14 @@ module FDPE (
     $setup(PRE, posedge C &&& !IS_C_INVERTED, 404);
     $setup(PRE, negedge C &&&  IS_C_INVERTED, 404);
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
+`ifndef YOSYS
+    if (!IS_PRE_INVERTED) (posedge PRE => (Q : 1'b1)) = 764;
+    if ( IS_PRE_INVERTED) (negedge PRE => (Q : 1'b1)) = 764;
+`else
     if (IS_PRE_INVERTED != PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
                                                   // but for facilitating a bypass box, let's pretend it's
                                                   // a simple path
+`endif
     if (!IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (posedge C => (Q : D ^ IS_D_INVERTED)) = 303;
     if ( IS_C_INVERTED && PRE == IS_PRE_INVERTED && CE) (negedge C => (Q : D ^ IS_D_INVERTED)) = 303;
   endspecify
@@ -790,9 +804,13 @@ module FDPE_1 (
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L274
     $setup(PRE, negedge C, 404);
     // https://github.com/SymbiFlow/prjxray-db/blob/23c8b0851f979f0799318eaca90174413a46b257/artix7/timings/slicel.sdf#L270
+`ifndef YOSYS
+    (posedge PRE => (Q : 1'b1)) = 764;
+`else
     if (PRE) (PRE => Q) = 764; // Technically, this should be an edge sensitive path
                                // but for facilitating a bypass box, let's pretend it's
                                // a simple path
+`endif
     if (!PRE && CE) (negedge C => (Q : D)) = 303;
   endspecify
 endmodule