aboutsummaryrefslogtreecommitdiffstats
path: root/techlibs/ice40
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2019-11-22 15:13:18 -0800
committerEddie Hung <eddie@fpgeh.com>2019-11-22 15:13:18 -0800
commit2a54fa41c40969841ba0574ba725caa436b0212f (patch)
tree1dbf518fc73dbe253612bdb5e466c50b78bce44b /techlibs/ice40
parent6b9f90de789b1d0daf93ac1d2b608b057e7ca272 (diff)
parentc03b6a3e9cab9fc05b2d5b256676f5ddc6c2d763 (diff)
downloadyosys-2a54fa41c40969841ba0574ba725caa436b0212f.tar.gz
yosys-2a54fa41c40969841ba0574ba725caa436b0212f.tar.bz2
yosys-2a54fa41c40969841ba0574ba725caa436b0212f.zip
Merge branch 'master' of github.com:YosysHQ/yosys
Diffstat (limited to 'techlibs/ice40')
-rw-r--r--techlibs/ice40/Makefile.inc16
-rw-r--r--techlibs/ice40/abc9_hx.box (renamed from techlibs/ice40/abc_hx.box)0
-rw-r--r--techlibs/ice40/abc9_hx.lut (renamed from techlibs/ice40/abc_hx.lut)0
-rw-r--r--techlibs/ice40/abc9_lp.box (renamed from techlibs/ice40/abc_lp.box)0
-rw-r--r--techlibs/ice40/abc9_lp.lut (renamed from techlibs/ice40/abc_lp.lut)0
-rw-r--r--techlibs/ice40/abc9_model.v27
-rw-r--r--techlibs/ice40/abc9_u.box (renamed from techlibs/ice40/abc_u.box)0
-rw-r--r--techlibs/ice40/abc9_u.lut (renamed from techlibs/ice40/abc_u.lut)0
-rw-r--r--techlibs/ice40/cells_sim.v635
-rw-r--r--techlibs/ice40/dsp_map.v34
-rw-r--r--techlibs/ice40/synth_ice40.cc21
11 files changed, 601 insertions, 132 deletions
diff --git a/techlibs/ice40/Makefile.inc b/techlibs/ice40/Makefile.inc
index 76a89b107..31478e80e 100644
--- a/techlibs/ice40/Makefile.inc
+++ b/techlibs/ice40/Makefile.inc
@@ -14,7 +14,7 @@ EXTRA_OBJS += techlibs/ice40/brams_init.mk
techlibs/ice40/brams_init.mk: techlibs/ice40/brams_init.py
$(Q) mkdir -p techlibs/ice40
- $(P) python3 $<
+ $(P) $(PYTHON_EXECUTABLE) $<
$(Q) touch techlibs/ice40/brams_init.mk
techlibs/ice40/brams_init1.vh: techlibs/ice40/brams_init.mk
@@ -27,12 +27,14 @@ $(eval $(call add_share_file,share/ice40,techlibs/ice40/cells_sim.v))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/latches_map.v))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/brams.txt))
$(eval $(call add_share_file,share/ice40,techlibs/ice40/brams_map.v))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_hx.box))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_hx.lut))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_lp.box))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_lp.lut))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_u.box))
-$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc_u.lut))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/dsp_map.v))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_model.v))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_hx.box))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_hx.lut))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_lp.box))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_lp.lut))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_u.box))
+$(eval $(call add_share_file,share/ice40,techlibs/ice40/abc9_u.lut))
$(eval $(call add_gen_share_file,share/ice40,techlibs/ice40/brams_init1.vh))
$(eval $(call add_gen_share_file,share/ice40,techlibs/ice40/brams_init2.vh))
diff --git a/techlibs/ice40/abc_hx.box b/techlibs/ice40/abc9_hx.box
index 3ea70bc91..3ea70bc91 100644
--- a/techlibs/ice40/abc_hx.box
+++ b/techlibs/ice40/abc9_hx.box
diff --git a/techlibs/ice40/abc_hx.lut b/techlibs/ice40/abc9_hx.lut
index 3b3bb11e2..3b3bb11e2 100644
--- a/techlibs/ice40/abc_hx.lut
+++ b/techlibs/ice40/abc9_hx.lut
diff --git a/techlibs/ice40/abc_lp.box b/techlibs/ice40/abc9_lp.box
index 473e92fe9..473e92fe9 100644
--- a/techlibs/ice40/abc_lp.box
+++ b/techlibs/ice40/abc9_lp.box
diff --git a/techlibs/ice40/abc_lp.lut b/techlibs/ice40/abc9_lp.lut
index e72f760a2..e72f760a2 100644
--- a/techlibs/ice40/abc_lp.lut
+++ b/techlibs/ice40/abc9_lp.lut
diff --git a/techlibs/ice40/abc9_model.v b/techlibs/ice40/abc9_model.v
new file mode 100644
index 000000000..26cf6cc22
--- /dev/null
+++ b/techlibs/ice40/abc9_model.v
@@ -0,0 +1,27 @@
+(* abc9_box_id = 1, lib_whitebox *)
+module \$__ICE40_CARRY_WRAPPER (
+ (* abc9_carry *)
+ output CO,
+ output O,
+ input A, B,
+ (* abc9_carry *)
+ input CI,
+ input I0, I3
+);
+ parameter LUT = 0;
+ SB_CARRY carry (
+ .I0(A),
+ .I1(B),
+ .CI(CI),
+ .CO(CO)
+ );
+ SB_LUT4 #(
+ .LUT_INIT(LUT)
+ ) adder (
+ .I0(I0),
+ .I1(A),
+ .I2(B),
+ .I3(I3),
+ .O(O)
+ );
+endmodule
diff --git a/techlibs/ice40/abc_u.box b/techlibs/ice40/abc9_u.box
index f00e247b8..f00e247b8 100644
--- a/techlibs/ice40/abc_u.box
+++ b/techlibs/ice40/abc9_u.box
diff --git a/techlibs/ice40/abc_u.lut b/techlibs/ice40/abc9_u.lut
index 1e4fcadb6..1e4fcadb6 100644
--- a/techlibs/ice40/abc_u.lut
+++ b/techlibs/ice40/abc9_u.lut
diff --git a/techlibs/ice40/cells_sim.v b/techlibs/ice40/cells_sim.v
index 8e5e0358e..7d1b37fd6 100644
--- a/techlibs/ice40/cells_sim.v
+++ b/techlibs/ice40/cells_sim.v
@@ -1,10 +1,10 @@
-
+`timescale 1ps / 1ps
`define SB_DFF_REG reg Q = 0
// `define SB_DFF_REG reg Q
-`define ABC_ARRIVAL_HX(TIME) `ifdef ICE40_HX (* abc_arrival=TIME *) `endif
-`define ABC_ARRIVAL_LP(TIME) `ifdef ICE40_LP (* abc_arrival=TIME *) `endif
-`define ABC_ARRIVAL_U(TIME) `ifdef ICE40_U (* abc_arrival=TIME *) `endif
+`define ABC9_ARRIVAL_HX(TIME) `ifdef ICE40_HX (* abc9_arrival=TIME *) `endif
+`define ABC9_ARRIVAL_LP(TIME) `ifdef ICE40_LP (* abc9_arrival=TIME *) `endif
+`define ABC9_ARRIVAL_U(TIME) `ifdef ICE40_U (* abc9_arrival=TIME *) `endif
// SiliconBlue IO Cells
@@ -81,6 +81,37 @@ module SB_IO (
if (PIN_TYPE[5:4] == 2'b11) assign PACKAGE_PIN = outena_q ? dout : 1'bz;
endgenerate
`endif
+`ifdef TIMING
+specify
+ (INPUT_CLK => D_IN_0) = (0:0:0, 0:0:0);
+ (INPUT_CLK => D_IN_1) = (0:0:0, 0:0:0);
+ (PACKAGE_PIN => D_IN_0) = (0:0:0, 0:0:0);
+ (OUTPUT_CLK => PACKAGE_PIN) = (0:0:0, 0:0:0);
+ (D_OUT_0 => PACKAGE_PIN) = (0:0:0, 0:0:0);
+ (OUTPUT_ENABLE => PACKAGE_PIN) = (0:0:0, 0:0:0);
+
+ $setuphold(posedge OUTPUT_CLK, posedge D_OUT_0, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, negedge D_OUT_0, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, posedge D_OUT_1, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, negedge D_OUT_1, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, posedge D_OUT_0, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, negedge D_OUT_0, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, posedge D_OUT_1, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, negedge D_OUT_1, 0:0:0, 0:0:0);
+ $setuphold(posedge INPUT_CLK, posedge CLOCK_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(posedge INPUT_CLK, negedge CLOCK_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, posedge CLOCK_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, negedge CLOCK_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(posedge INPUT_CLK, posedge PACKAGE_PIN, 0:0:0, 0:0:0);
+ $setuphold(posedge INPUT_CLK, negedge PACKAGE_PIN, 0:0:0, 0:0:0);
+ $setuphold(negedge INPUT_CLK, posedge PACKAGE_PIN, 0:0:0, 0:0:0);
+ $setuphold(negedge INPUT_CLK, negedge PACKAGE_PIN, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, posedge OUTPUT_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(posedge OUTPUT_CLK, negedge OUTPUT_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, posedge OUTPUT_ENABLE, 0:0:0, 0:0:0);
+ $setuphold(negedge OUTPUT_CLK, negedge OUTPUT_ENABLE, 0:0:0, 0:0:0);
+endspecify
+`endif
endmodule
module SB_GB_IO (
@@ -127,6 +158,11 @@ module SB_GB (
output GLOBAL_BUFFER_OUTPUT
);
assign GLOBAL_BUFFER_OUTPUT = USER_SIGNAL_TO_GLOBAL_BUFFER;
+`ifdef TIMING
+specify
+ (USER_SIGNAL_TO_GLOBAL_BUFFER => GLOBAL_BUFFER_OUTPUT) = (0:0:0, 0:0:0);
+endspecify
+`endif
endmodule
// SiliconBlue Logic Cells
@@ -145,34 +181,6 @@ module SB_CARRY (output CO, input I0, I1, CI);
assign CO = (I0 && I1) || ((I0 || I1) && CI);
endmodule
-(* abc_box_id = 1, lib_whitebox *)
-module \$__ICE40_CARRY_WRAPPER (
- (* abc_carry *)
- output CO,
- output O,
- input A, B,
- (* abc_carry *)
- input CI,
- input I0, I3
-);
- parameter LUT = 0;
- SB_CARRY carry (
- .I0(A),
- .I1(B),
- .CI(CI),
- .CO(CO)
- );
- SB_LUT4 #(
- .LUT_INIT(LUT)
- ) adder (
- .I0(I0),
- .I1(A),
- .I2(B),
- .I3(I3),
- .O(O)
- );
-endmodule
-
// Max delay from: https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L90
// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L90
// https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L102
@@ -180,9 +188,9 @@ endmodule
// Positive Edge SiliconBlue FF Cells
module SB_DFF (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, D
);
@@ -191,9 +199,9 @@ module SB_DFF (
endmodule
module SB_DFFE (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, D
);
@@ -203,9 +211,9 @@ module SB_DFFE (
endmodule
module SB_DFFSR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, R, D
);
@@ -217,9 +225,9 @@ module SB_DFFSR (
endmodule
module SB_DFFR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, R, D
);
@@ -231,9 +239,9 @@ module SB_DFFR (
endmodule
module SB_DFFSS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, S, D
);
@@ -245,9 +253,9 @@ module SB_DFFSS (
endmodule
module SB_DFFS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, S, D
);
@@ -259,9 +267,9 @@ module SB_DFFS (
endmodule
module SB_DFFESR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, R, D
);
@@ -275,9 +283,9 @@ module SB_DFFESR (
endmodule
module SB_DFFER (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, R, D
);
@@ -289,9 +297,9 @@ module SB_DFFER (
endmodule
module SB_DFFESS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, S, D
);
@@ -305,9 +313,9 @@ module SB_DFFESS (
endmodule
module SB_DFFES (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, S, D
);
@@ -321,9 +329,9 @@ endmodule
// Negative Edge SiliconBlue FF Cells
module SB_DFFN (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, D
);
@@ -332,9 +340,9 @@ module SB_DFFN (
endmodule
module SB_DFFNE (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, D
);
@@ -344,9 +352,9 @@ module SB_DFFNE (
endmodule
module SB_DFFNSR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, R, D
);
@@ -358,9 +366,9 @@ module SB_DFFNSR (
endmodule
module SB_DFFNR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, R, D
);
@@ -372,9 +380,9 @@ module SB_DFFNR (
endmodule
module SB_DFFNSS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, S, D
);
@@ -386,9 +394,9 @@ module SB_DFFNSS (
endmodule
module SB_DFFNS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, S, D
);
@@ -400,9 +408,9 @@ module SB_DFFNS (
endmodule
module SB_DFFNESR (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, R, D
);
@@ -416,9 +424,9 @@ module SB_DFFNESR (
endmodule
module SB_DFFNER (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, R, D
);
@@ -430,9 +438,9 @@ module SB_DFFNER (
endmodule
module SB_DFFNESS (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, S, D
);
@@ -446,9 +454,9 @@ module SB_DFFNESS (
endmodule
module SB_DFFNES (
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output `SB_DFF_REG,
input C, E, S, D
);
@@ -462,9 +470,9 @@ endmodule
// SiliconBlue RAM Cells
module SB_RAM40_4K (
- `ABC_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
- `ABC_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
- `ABC_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
+ `ABC9_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
+ `ABC9_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
+ `ABC9_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
output [15:0] RDATA,
input RCLK, RCLKE, RE,
input [10:0] RADDR,
@@ -633,9 +641,9 @@ module SB_RAM40_4K (
endmodule
module SB_RAM40_4KNR (
- `ABC_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
- `ABC_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
- `ABC_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
+ `ABC9_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
+ `ABC9_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
+ `ABC9_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
output [15:0] RDATA,
input RCLKN, RCLKE, RE,
input [10:0] RADDR,
@@ -701,9 +709,9 @@ module SB_RAM40_4KNR (
endmodule
module SB_RAM40_4KNW (
- `ABC_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
- `ABC_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
- `ABC_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
+ `ABC9_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
+ `ABC9_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
+ `ABC9_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
output [15:0] RDATA,
input RCLK, RCLKE, RE,
input [10:0] RADDR,
@@ -769,9 +777,9 @@ module SB_RAM40_4KNW (
endmodule
module SB_RAM40_4KNRNW (
- `ABC_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
- `ABC_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
- `ABC_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
+ `ABC9_ARRIVAL_HX(2146) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_hx1k.txt#L401
+ `ABC9_ARRIVAL_LP(3163) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_lp1k.txt#L401
+ `ABC9_ARRIVAL_U(1179) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
output [15:0] RDATA,
input RCLKN, RCLKE, RE,
input [10:0] RADDR,
@@ -841,9 +849,9 @@ endmodule
module ICESTORM_LC (
input I0, I1, I2, I3, CIN, CLK, CEN, SR,
output LO,
- `ABC_ARRIVAL_HX(540)
- `ABC_ARRIVAL_LP(796)
- `ABC_ARRIVAL_U(1391)
+ `ABC9_ARRIVAL_HX(540)
+ `ABC9_ARRIVAL_LP(796)
+ `ABC9_ARRIVAL_U(1391)
output O,
output COUT
);
@@ -858,33 +866,81 @@ module ICESTORM_LC (
parameter [0:0] CIN_CONST = 0;
parameter [0:0] CIN_SET = 0;
+ wire I0_pd = (I0 === 1'bz) ? 1'b0 : I0;
+ wire I1_pd = (I1 === 1'bz) ? 1'b0 : I1;
+ wire I2_pd = (I2 === 1'bz) ? 1'b0 : I2;
+ wire I3_pd = (I3 === 1'bz) ? 1'b0 : I3;
+ wire SR_pd = (SR === 1'bz) ? 1'b0 : SR;
+ wire CEN_pu = (CEN === 1'bz) ? 1'b1 : CEN;
+
wire mux_cin = CIN_CONST ? CIN_SET : CIN;
- assign COUT = CARRY_ENABLE ? (I1 && I2) || ((I1 || I2) && mux_cin) : 1'bx;
+ assign COUT = CARRY_ENABLE ? (I1_pd && I2_pd) || ((I1_pd || I2_pd) && mux_cin) : 1'bx;
- wire [7:0] lut_s3 = I3 ? LUT_INIT[15:8] : LUT_INIT[7:0];
- wire [3:0] lut_s2 = I2 ? lut_s3[ 7:4] : lut_s3[3:0];
- wire [1:0] lut_s1 = I1 ? lut_s2[ 3:2] : lut_s2[1:0];
- wire lut_o = I0 ? lut_s1[ 1] : lut_s1[ 0];
+ wire [7:0] lut_s3 = I3_pd ? LUT_INIT[15:8] : LUT_INIT[7:0];
+ wire [3:0] lut_s2 = I2_pd ? lut_s3[ 7:4] : lut_s3[3:0];
+ wire [1:0] lut_s1 = I1_pd ? lut_s2[ 3:2] : lut_s2[1:0];
+ wire lut_o = I0_pd ? lut_s1[ 1] : lut_s1[ 0];
assign LO = lut_o;
wire polarized_clk;
assign polarized_clk = CLK ^ NEG_CLK;
- reg o_reg;
+ reg o_reg = 1'b0;
always @(posedge polarized_clk)
- if (CEN)
- o_reg <= SR ? SET_NORESET : lut_o;
+ if (CEN_pu)
+ o_reg <= SR_pd ? SET_NORESET : lut_o;
- reg o_reg_async;
+ reg o_reg_async = 1'b0;
always @(posedge polarized_clk, posedge SR)
- if (SR)
- o_reg <= SET_NORESET;
- else if (CEN)
- o_reg <= lut_o;
+ if (SR_pd)
+ o_reg_async <= SET_NORESET;
+ else if (CEN_pu)
+ o_reg_async <= lut_o;
assign O = DFF_ENABLE ? ASYNC_SR ? o_reg_async : o_reg : lut_o;
+`ifdef TIMING
+specify
+ (I0 => O) = (0:0:0, 0:0:0);
+ (I1 => O) = (0:0:0, 0:0:0);
+ (I2 => O) = (0:0:0, 0:0:0);
+ (I3 => O) = (0:0:0, 0:0:0);
+ (I0 => LO) = (0:0:0, 0:0:0);
+ (I1 => LO) = (0:0:0, 0:0:0);
+ (I2 => LO) = (0:0:0, 0:0:0);
+ (I3 => LO) = (0:0:0, 0:0:0);
+ (I1 => COUT) = (0:0:0, 0:0:0);
+ (I2 => COUT) = (0:0:0, 0:0:0);
+ (CIN => COUT) = (0:0:0, 0:0:0);
+ (CLK => O) = (0:0:0, 0:0:0);
+ (SR => O) = (0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge I0, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge I0, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge I0, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge I0, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge I1, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge I1, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge I1, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge I1, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge I2, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge I2, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge I2, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge I2, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge I3, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge I3, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge I3, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge I3, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge CEN, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge CEN, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge CEN, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge CEN, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, posedge SR, 0:0:0, 0:0:0);
+ $setuphold(posedge CLK, negedge SR, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, posedge SR, 0:0:0, 0:0:0);
+ $setuphold(negedge CLK, negedge SR, 0:0:0, 0:0:0);
+endspecify
+`endif
endmodule
// SiliconBlue PLL Cells
@@ -1445,7 +1501,6 @@ module SB_MAC16 (
input ADDSUBTOP, ADDSUBBOT,
input OHOLDTOP, OHOLDBOT,
input CI, ACCUMCI, SIGNEXTIN,
- //`ABC_ARRIVAL_U(1984) // https://github.com/cliffordwolf/icestorm/blob/95949315364f8d9b0c693386aefadf44b28e2cf6/icefuzz/timings_up5k.txt#L13026
output [31:0] O,
output CO, ACCUMCO, SIGNEXTOUT
);
@@ -1605,3 +1660,341 @@ module SB_MAC16 (
assign LCI = (BOTADDSUB_CARRYSELECT == 0) ? 1'b0 : (BOTADDSUB_CARRYSELECT == 1) ? 1'b1 : (BOTADDSUB_CARRYSELECT == 2) ? ACCUMCI : CI;
assign O = {Oh, Ol};
endmodule
+
+// Post-place-and-route RAM model
+module ICESTORM_RAM(
+ output RDATA_15, RDATA_14, RDATA_13, RDATA_12, RDATA_11, RDATA_10, RDATA_9, RDATA_8, RDATA_7, RDATA_6, RDATA_5, RDATA_4, RDATA_3, RDATA_2, RDATA_1, RDATA_0,
+ input RCLK, RCLKE, RE,
+ input RADDR_10, RADDR_9, RADDR_8, RADDR_7, RADDR_6, RADDR_5, RADDR_4, RADDR_3, RADDR_2, RADDR_1, RADDR_0,
+ input WCLK, WCLKE, WE,
+ input WADDR_10, WADDR_9, WADDR_8, WADDR_7, WADDR_6, WADDR_5, WADDR_4, WADDR_3, WADDR_2, WADDR_1, WADDR_0,
+ input MASK_15, MASK_14, MASK_13, MASK_12, MASK_11, MASK_10, MASK_9, MASK_8, MASK_7, MASK_6, MASK_5, MASK_4, MASK_3, MASK_2, MASK_1, MASK_0,
+ input WDATA_15, WDATA_14, WDATA_13, WDATA_12, WDATA_11, WDATA_10, WDATA_9, WDATA_8, WDATA_7, WDATA_6, WDATA_5, WDATA_4, WDATA_3, WDATA_2, WDATA_1, WDATA_0
+);
+ parameter WRITE_MODE = 0;
+ parameter READ_MODE = 0;
+
+ parameter NEG_CLK_R = 1'b0;
+ parameter NEG_CLK_W = 1'b0;
+
+ parameter INIT_0 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_1 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_2 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_3 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_4 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_5 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_6 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_7 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_8 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_9 = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_A = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_B = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_C = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_D = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_E = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+ parameter INIT_F = 256'h0000000000000000000000000000000000000000000000000000000000000000;
+
+ // Pull-down and pull-up functions
+ function pd;
+ input x;
+ begin
+ pd = (x === 1'bz) ? 1'b0 : x;
+ end
+ endfunction
+
+ function pu;
+ input x;
+ begin
+ pu = (x === 1'bz) ? 1'b1 : x;
+ end
+ endfunction
+
+ SB_RAM40_4K #(
+ .WRITE_MODE(WRITE_MODE),
+ .READ_MODE (READ_MODE ),
+ .INIT_0 (INIT_0 ),
+ .INIT_1 (INIT_1 ),
+ .INIT_2 (INIT_2 ),
+ .INIT_3 (INIT_3 ),
+ .INIT_4 (INIT_4 ),
+ .INIT_5 (INIT_5 ),
+ .INIT_6 (INIT_6 ),
+ .INIT_7 (INIT_7 ),
+ .INIT_8 (INIT_8 ),
+ .INIT_9 (INIT_9 ),
+ .INIT_A (INIT_A ),
+ .INIT_B (INIT_B ),
+ .INIT_C (INIT_C ),
+ .INIT_D (INIT_D ),
+ .INIT_E (INIT_E ),
+ .INIT_F (INIT_F )
+ ) RAM (
+ .RDATA({RDATA_15, RDATA_14, RDATA_13, RDATA_12, RDATA_11, RDATA_10, RDATA_9, RDATA_8, RDATA_7, RDATA_6, RDATA_5, RDATA_4, RDATA_3, RDATA_2, RDATA_1, RDATA_0}),
+ .RCLK (pd(RCLK) ^ NEG_CLK_R),
+ .RCLKE(pu(RCLKE)),
+ .RE (pd(RE)),
+ .RADDR({pd(RADDR_10), pd(RADDR_9), pd(RADDR_8), pd(RADDR_7), pd(RADDR_6), pd(RADDR_5), pd(RADDR_4), pd(RADDR_3), pd(RADDR_2), pd(RADDR_1), pd(RADDR_0)}),
+ .WCLK (pd(WCLK) ^ NEG_CLK_W),
+ .WCLKE(pu(WCLKE)),
+ .WE (pd(WE)),
+ .WADDR({pd(WADDR_10), pd(WADDR_9), pd(WADDR_8), pd(WADDR_7), pd(WADDR_6), pd(WADDR_5), pd(WADDR_4), pd(WADDR_3), pd(WADDR_2), pd(WADDR_1), pd(WADDR_0)}),
+ .MASK ({pd(MASK_15), pd(MASK_14), pd(MASK_13), pd(MASK_12), pd(MASK_11), pd(MASK_10), pd(MASK_9), pd(MASK_8),
+ pd(MASK_7), pd(MASK_6), pd(MASK_5), pd(MASK_4), pd(MASK_3), pd(MASK_2), pd(MASK_1), pd(MASK_0)}),
+ .WDATA({pd(WDATA_15), pd(WDATA_14), pd(WDATA_13), pd(WDATA_12), pd(WDATA_11), pd(WDATA_10), pd(WDATA_9), pd(WDATA_8),
+ pd(WDATA_7), pd(WDATA_6), pd(WDATA_5), pd(WDATA_4), pd(WDATA_3), pd(WDATA_2), pd(WDATA_1), pd(WDATA_0)})
+ );
+
+`ifdef TIMING
+specify
+ (RCLK => RDATA_15) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_14) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_13) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_12) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_11) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_10) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_9) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_8) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_7) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_6) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_5) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_4) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_3) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_2) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_1) = (0:0:0, 0:0:0);
+ (RCLK => RDATA_0) = (0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RCLKE, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RCLKE, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RCLKE, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RCLKE, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RE, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RE, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RE, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RE, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_10, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_10, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_10, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_10, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_9, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_9, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_9, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_9, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_8, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_8, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_8, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_8, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_7, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_7, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_7, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_7, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_6, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_6, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_6, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_6, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_5, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_5, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_5, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_5, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_4, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_4, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_4, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_4, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_3, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_3, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_3, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_3, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_2, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_2, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_2, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_2, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_1, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_1, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_1, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_1, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, posedge RADDR_0, 0:0:0, 0:0:0);
+ $setuphold(posedge RCLK, negedge RADDR_0, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, posedge RADDR_0, 0:0:0, 0:0:0);
+ $setuphold(negedge RCLK, negedge RADDR_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WCLKE, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WCLKE, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WCLKE, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WCLKE, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WE, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WE, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WE, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WE, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WADDR_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WADDR_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WADDR_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WADDR_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_15, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_15, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_15, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_15, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_14, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_14, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_14, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_14, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_13, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_13, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_13, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_13, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_12, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_12, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_12, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_12, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_11, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_11, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_11, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_11, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge MASK_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge MASK_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge MASK_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge MASK_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_15, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_15, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_15, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_15, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_14, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_14, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_14, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_14, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_13, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_13, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_13, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_13, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_12, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_12, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_12, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_12, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_11, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_11, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_11, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_11, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_10, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_10, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_9, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_9, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_8, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_8, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_7, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_7, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_6, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_6, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_5, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_5, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_4, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_4, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_3, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_3, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_2, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_2, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_1, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_1, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, posedge WDATA_0, 0:0:0, 0:0:0);
+ $setuphold(posedge WCLK, negedge WDATA_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, posedge WDATA_0, 0:0:0, 0:0:0);
+ $setuphold(negedge WCLK, negedge WDATA_0, 0:0:0, 0:0:0);
+
+endspecify
+`endif
+endmodule
diff --git a/techlibs/ice40/dsp_map.v b/techlibs/ice40/dsp_map.v
new file mode 100644
index 000000000..06fa73956
--- /dev/null
+++ b/techlibs/ice40/dsp_map.v
@@ -0,0 +1,34 @@
+module \$__MUL16X16 (input [15:0] A, input [15:0] B, output [31:0] Y);
+ parameter A_SIGNED = 0;
+ parameter B_SIGNED = 0;
+ parameter A_WIDTH = 0;
+ parameter B_WIDTH = 0;
+ parameter Y_WIDTH = 0;
+
+ SB_MAC16 #(
+ .NEG_TRIGGER(1'b0),
+ .C_REG(1'b0),
+ .A_REG(1'b0),
+ .B_REG(1'b0),
+ .D_REG(1'b0),
+ .TOP_8x8_MULT_REG(1'b0),
+ .BOT_8x8_MULT_REG(1'b0),
+ .PIPELINE_16x16_MULT_REG1(1'b0),
+ .PIPELINE_16x16_MULT_REG2(1'b0),
+ .TOPOUTPUT_SELECT(2'b11),
+ .TOPADDSUB_LOWERINPUT(2'b0),
+ .TOPADDSUB_UPPERINPUT(1'b0),
+ .TOPADDSUB_CARRYSELECT(2'b0),
+ .BOTOUTPUT_SELECT(2'b11),
+ .BOTADDSUB_LOWERINPUT(2'b0),
+ .BOTADDSUB_UPPERINPUT(1'b0),
+ .BOTADDSUB_CARRYSELECT(2'b0),
+ .MODE_8x8(1'b0),
+ .A_SIGNED(A_SIGNED),
+ .B_SIGNED(B_SIGNED)
+ ) _TECHMAP_REPLACE_ (
+ .A(A),
+ .B(B),
+ .O(Y),
+ );
+endmodule
diff --git a/techlibs/ice40/synth_ice40.cc b/techlibs/ice40/synth_ice40.cc
index a3890268a..901194b06 100644
--- a/techlibs/ice40/synth_ice40.cc
+++ b/techlibs/ice40/synth_ice40.cc
@@ -245,7 +245,7 @@ struct SynthIce40Pass : public ScriptPass
define = "-D ICE40_U";
else
define = "-D ICE40_HX";
- run("read_verilog -icells " + define + " -lib +/ice40/cells_sim.v");
+ run("read_verilog " + define + " -lib +/ice40/cells_sim.v");
run(stringf("hierarchy -check %s", help_mode ? "-top <top>" : top_opt.c_str()));
run("proc");
}
@@ -272,8 +272,19 @@ struct SynthIce40Pass : public ScriptPass
run("techmap -map +/cmp2lut.v -D LUT_WIDTH=4");
run("opt_expr");
run("opt_clean");
- if (help_mode || dsp)
- run("ice40_dsp", "(if -dsp)");
+ if (help_mode || dsp) {
+ run("memory_dff");
+ run("techmap -map +/mul2dsp.v -map +/ice40/dsp_map.v -D DSP_A_MAXWIDTH=16 -D DSP_B_MAXWIDTH=16 "
+ "-D DSP_A_MINWIDTH=2 -D DSP_B_MINWIDTH=2 -D DSP_Y_MINWIDTH=11 "
+ "-D DSP_NAME=$__MUL16X16", "(if -dsp)");
+ run("select a:mul2dsp", " (if -dsp)");
+ run("setattr -unset mul2dsp", " (if -dsp)");
+ run("opt_expr -fine", " (if -dsp)");
+ run("wreduce", " (if -dsp)");
+ run("select -clear", " (if -dsp)");
+ run("ice40_dsp", " (if -dsp)");
+ run("chtype -set $mul t:$__soft_mul", "(if -dsp)");
+ }
run("alumacc");
run("opt");
run("fsm");
@@ -339,6 +350,7 @@ struct SynthIce40Pass : public ScriptPass
}
if (!noabc) {
if (abc == "abc9") {
+ run("read_verilog -icells -lib +/ice40/abc9_model.v");
int wire_delay;
if (device_opt == "lp")
wire_delay = 400;
@@ -346,7 +358,7 @@ struct SynthIce40Pass : public ScriptPass
wire_delay = 750;
else
wire_delay = 250;
- run(abc + stringf(" -W %d -lut +/ice40/abc_%s.lut -box +/ice40/abc_%s.box", wire_delay, device_opt.c_str(), device_opt.c_str()), "(skip if -noabc)");
+ run(abc + stringf(" -W %d -lut +/ice40/abc9_%s.lut -box +/ice40/abc9_%s.box", wire_delay, device_opt.c_str(), device_opt.c_str()), "(skip if -noabc)");
}
else
run(abc + " -dress -lut 4", "(skip if -noabc)");
@@ -368,6 +380,7 @@ struct SynthIce40Pass : public ScriptPass
if (check_label("check"))
{
+ run("autoname");
run("hierarchy -check");
run("stat");
run("check -noinit");