| // It looks like for the models to be correctly annotated with timings from | 
 | // SDF in Icarus Verilog the timescale provided here must match the one in SDF. | 
 | // VPR writes SDFs in picoseconds hence here it is set to picoseconds as well. | 
 | `timescale 1ps/1ps | 
 |  | 
 | // VPR routing interconnect module | 
 | module fpga_interconnect(datain, dataout); | 
 |     input  datain; | 
 |     output dataout; | 
 |  | 
 |     // Behavioral model | 
 |     assign dataout = datain; | 
 |  | 
 |     // Timing paths. The values are dummy and are intended to be replaced by | 
 |     // ones from a SDF file during simulation. | 
 |     specify | 
 |         (datain => dataout) = 0; | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 |  | 
 | module frac_lut4_arith (in ,cin, lut4_out, cout); | 
 |  | 
 |     parameter [15:0] LUT  = 16'd0; | 
 |     parameter [0: 0] MODE = 0; | 
 |  | 
 |     input  [3:0] in; | 
 |     input  [0:0] cin; | 
 |     output [0:0] lut4_out; | 
 |     output [0:0] cout; | 
 |  | 
 |     // Mode bits of frac_lut4_arith are responsible for the LI2 mux which | 
 |     // selects between the LI2 and CIN inputs. | 
 |     wire [3:0] li = (MODE == 1'b1) ? | 
 |         {in[3], cin, in[1], in[0]} : | 
 |         {in[3], in[2], in[1], in[0]}; | 
 |  | 
 |     // Output function | 
 |     wire [7:0] s1 = li[0] ? | 
 |         {LUT[14], LUT[12], LUT[10], LUT[8], LUT[6], LUT[4], LUT[2], LUT[0]} : | 
 |         {LUT[15], LUT[13], LUT[11], LUT[9], LUT[7], LUT[5], LUT[3], LUT[1]}; | 
 |  | 
 |     wire [3:0] s2 = li[1] ? | 
 |         {s1[6], s1[4], s1[2], s1[0]} : | 
 |         {s1[7], s1[5], s1[3], s1[1]}; | 
 |  | 
 |     wire [1:0] s3 = li[2] ? | 
 |         {s2[2], s2[0]} : | 
 |         {s2[3], s2[1]}; | 
 |  | 
 |     assign lut4_out = li[3] ? s3[0] : s3[1]; | 
 |  | 
 |     // Carry out function | 
 |     assign cout = s2[2] ? cin : s2[3]; | 
 |  | 
 |     // Timing paths. The values are dummy and are intended to be replaced by | 
 |     // ones from a SDF file during simulation. | 
 |     specify | 
 |         (cin => lut4_out) = 0; | 
 |         (cin => cout) = 0; | 
 |     endspecify | 
 |  | 
 | endmodule | 
 |  | 
 |  | 
 | module scff (D, DI, clk, reset, Q); // QL_IOFF | 
 |  | 
 |     parameter  [0:0] MODE = 1; // The default | 
 |  | 
 |     input  [0:0] D; | 
 |     input  [0:0] DI; | 
 |     input  [0:0] clk; | 
 |     input  [0:0] reset; | 
 |     output [0:0] Q; | 
 |  | 
 |     scff_1 #(.MODE(MODE)) scff_1 ( | 
 |         .D      (D), | 
 |         .DI     (DI), | 
 |         .clk    (clk), | 
 |         .preset (1'b1), | 
 |         .reset  (reset), | 
 |         .Q      (Q) | 
 |     ); | 
 |  | 
 | endmodule | 
 |  | 
 |  | 
 | module scff_1 (D, DI, clk, preset, reset, Q); // QL_FF | 
 |  | 
 |     parameter  [0:0] MODE = 1; // The default | 
 |  | 
 |     input      [0:0] D; | 
 |     input      [0:0] DI; | 
 |     input      [0:0] clk; | 
 |     input      [0:0] preset; | 
 |     input      [0:0] reset; | 
 |     output reg [0:0] Q; | 
 |  | 
 |     initial Q <= 1'b0; | 
 |  | 
 |     // Clock inverter | 
 |     wire ck = (MODE == 1'b1) ? clk : !clk; | 
 |  | 
 |     // FLip-flop behavioral model | 
 |     always @(posedge ck or negedge reset or negedge preset) begin | 
 |         if      (!reset)  Q <= 1'b0; | 
 |         else if (!preset) Q <= 1'b1; | 
 |         else              Q <= D; | 
 |     end | 
 |  | 
 |     // Timing paths. The values are dummy and are intended to be replaced by | 
 |     // ones from a SDF file during simulation. | 
 |     specify | 
 |       (posedge clk => (Q +: D)) = 0; | 
 |       $setuphold(posedge clk, D, 0, 0); | 
 |       $recrem(posedge reset, posedge clk, 0, 0); | 
 |       $recrem(posedge preset, posedge clk, 0, 0); | 
 |     endspecify | 
 |  | 
 | endmodule |