Run of fresh-releases for fpga-icestorm

Merge these changes:

git pull https://janitor.debian.net/git/fpga-icestorm fresh-releases/main
git pull https://janitor.debian.net/git/fpga-icestorm fresh-releases/pristine-tar
git pull https://janitor.debian.net/git/fpga-icestorm fresh-releases/upstream

Summary

Merged new upstream version: 0.0~git20220329.9f66f9c (was: 0~20220325git1d8e1a8).

Diff

Branch: main

diff --git a/debian/changelog b/debian/changelog
index 7bb8f65..bee9216 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,11 +1,15 @@
-fpga-icestorm (0~20220325git1d8e1a8-1) UNRELEASED; urgency=medium
+fpga-icestorm (0.0~git20220329.9f66f9c-1) UNRELEASED; urgency=medium
 
+  [ Daniel Gröber ]
   * Mark can-show-help test as superficial (Closes: #974487)
   * New upstream version 0~20220325git1d8e1a8
   * Add autopkgtest to compile examples
   * Fix Appstream metainfo-license-invalid error
 
- -- Daniel Gröber <dxld@darkboxed.org>  Sun, 27 Mar 2022 17:07:28 +0200
+  [ Debian Janitor ]
+  * New upstream snapshot.
+
+ -- Daniel Gröber <dxld@darkboxed.org>  Sun, 15 May 2022 02:24:13 -0000
 
 fpga-icestorm (0~20220102git3b7b199-3) unstable; urgency=medium
 
diff --git a/debian/patches/0003-Fix-examples-icemulti-all-target.patch b/debian/patches/0003-Fix-examples-icemulti-all-target.patch
index 3c78753..b798a99 100644
--- a/debian/patches/0003-Fix-examples-icemulti-all-target.patch
+++ b/debian/patches/0003-Fix-examples-icemulti-all-target.patch
@@ -6,10 +6,10 @@ Subject: Fix examples/icemulti all target
  examples/icemulti/Makefile | 2 ++
  1 file changed, 2 insertions(+)
 
-diff --git a/examples/icemulti/Makefile b/examples/icemulti/Makefile
-index d8a8320..1e38f9c 100644
---- a/examples/icemulti/Makefile
-+++ b/examples/icemulti/Makefile
+Index: fpga-icestorm/examples/icemulti/Makefile
+===================================================================
+--- fpga-icestorm.orig/examples/icemulti/Makefile
++++ fpga-icestorm/examples/icemulti/Makefile
 @@ -1,3 +1,5 @@
 +all: config.bin
 +
diff --git a/debian/patches/0004-Remove-hard-coded-path-in-icebox_vlog.py.patch b/debian/patches/0004-Remove-hard-coded-path-in-icebox_vlog.py.patch
index 3e53c76..a2d6268 100644
--- a/debian/patches/0004-Remove-hard-coded-path-in-icebox_vlog.py.patch
+++ b/debian/patches/0004-Remove-hard-coded-path-in-icebox_vlog.py.patch
@@ -6,8 +6,10 @@ Subject: Remove hard-coded path in icebox_vlog.py
  icebox/icebox_vlog.py | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
---- a/icebox/icebox_vlog.py
-+++ b/icebox/icebox_vlog.py
+Index: fpga-icestorm/icebox/icebox_vlog.py
+===================================================================
+--- fpga-icestorm.orig/icebox/icebox_vlog.py
++++ fpga-icestorm/icebox/icebox_vlog.py
 @@ -384,7 +384,7 @@ def seg_to_net(seg, default=None):
  
  if lookup_symbols:
diff --git a/debian/patches/0005-Fix-GCC-10-build-with-missing-include.patch b/debian/patches/0005-Fix-GCC-10-build-with-missing-include.patch
index 6b4e630..0097b9d 100644
--- a/debian/patches/0005-Fix-GCC-10-build-with-missing-include.patch
+++ b/debian/patches/0005-Fix-GCC-10-build-with-missing-include.patch
@@ -6,8 +6,10 @@ Subject: Fix GCC-10 build with missing include
  icetime/icetime.cc | 1 +
  2 files changed, 3 insertions(+), 1 deletion(-)
 
---- a/icetime/icetime.cc
-+++ b/icetime/icetime.cc
+Index: fpga-icestorm/icetime/icetime.cc
+===================================================================
+--- fpga-icestorm.orig/icetime/icetime.cc
++++ fpga-icestorm/icetime/icetime.cc
 @@ -34,6 +34,7 @@
  #include <string>
  #include <tuple>
diff --git a/icetime/icetime.cc b/icetime/icetime.cc
index d730fc6..049c635 100644
--- a/icetime/icetime.cc
+++ b/icetime/icetime.cc
@@ -59,6 +59,7 @@ std::set<std::tuple<int, int, int>> extra_bits;
 std::set<std::string> io_names;
 
 std::map<int, std::string> net_symbols;
+std::map<std::string, unsigned> lc_lut_in_mask;
 
 bool get_config_bit(int tile_x, int tile_y, int bit_row, int bit_col)
 {
@@ -836,6 +837,15 @@ struct TimingAnalysis
 			}
 
 			if (driver_type == "LogicCell40" && (driver_port == "ltout" || driver_port == "lcout")) {
+				unsigned mask = lc_lut_in_mask.at(driver_cell);
+				if (inport == "in0" && ((mask & 0x1) == 0))
+					continue;
+				if (inport == "in1" && ((mask & 0x2) == 0))
+					continue;
+				if (inport == "in2" && ((mask & 0x4) == 0))
+					continue;
+				if (inport == "in3" && ((mask & 0x8) == 0))
+					continue;
 				if (inport == "carryin")
 					continue;
 			}
@@ -1221,14 +1231,37 @@ std::string make_lc40(int x, int y, int z)
 	for (int i = 0; i < 20; i++)
 		lcbits[i] = get_config_bit(x, y, lcbits_pos[i].first, lcbits_pos[i].second) ? '1' : '0';
 
+	static const std::vector<int> lut_perm = {
+		4, 14, 15, 5, 6, 16, 17, 7, 3, 13, 12, 2, 1, 11, 10, 0,
+	};
+
+	unsigned lut_init = 0;
+		for (unsigned i = 0; i < lut_perm.size(); i++)
+			if (lcbits[lut_perm[i]] == '1')
+			lut_init |= (1U << i);
+
 	// FIXME: fill in the '0'
 	netlist_cell_params[cell]["C_ON"] = stringf("1'b%c", lcbits[8]);
 	netlist_cell_params[cell]["SEQ_MODE"] = stringf("4'b%c%c%c%c", lcbits[9], '0', '0', '0');
-	netlist_cell_params[cell]["LUT_INIT"] = stringf("16'b%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
-			lcbits[0], lcbits[10], lcbits[11], lcbits[1],
-			lcbits[2], lcbits[12], lcbits[13], lcbits[3],
-			lcbits[7], lcbits[17], lcbits[16], lcbits[6],
-			lcbits[5], lcbits[15], lcbits[14], lcbits[4]);
+
+	std::string init = "16'b";
+	for (int i = 15; i >= 0; i--)
+		init += ((lut_init >> i) & 0x1) ? '1' : '0';
+
+	netlist_cell_params[cell]["LUT_INIT"] = init;
+
+	// Find which LUT inputs are "don't care" in the function, to avoid false paths for bits
+	// only affecting the carry.
+	lc_lut_in_mask[cell] = 0;
+	for (unsigned k = 0; k < 4; k++) {
+		for (unsigned i = 0; i < 16; i++) {
+			// If toggling the LUT input makes a difference it's not a don't care
+			if (((lut_init >> i) & 0x1U) != ((lut_init >> (i ^ (1U << k))) & 0x1U)) {
+				lc_lut_in_mask[cell] |= (1 << k);
+				break;
+			}
+		}
+	}
 
 	if (lcbits[8] == '1')
 	{

Branch: pristine-tar

diff --git a/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.delta b/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.delta
new file mode 100644
index 0000000..18338fc
Binary files /dev/null and b/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.delta differ
diff --git a/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.id b/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.id
new file mode 100644
index 0000000..910dd63
--- /dev/null
+++ b/fpga-icestorm_0.0~git20220329.9f66f9c.orig.tar.xz.id
@@ -0,0 +1 @@
+eb169486eb12ef53795fee427ab371003c83beeb

Branch: upstream

Tag: upstream/0.0_git20220329.9f66f9c
diff --git a/icetime/icetime.cc b/icetime/icetime.cc
index d730fc6..049c635 100644
--- a/icetime/icetime.cc
+++ b/icetime/icetime.cc
@@ -59,6 +59,7 @@ std::set<std::tuple<int, int, int>> extra_bits;
 std::set<std::string> io_names;
 
 std::map<int, std::string> net_symbols;
+std::map<std::string, unsigned> lc_lut_in_mask;
 
 bool get_config_bit(int tile_x, int tile_y, int bit_row, int bit_col)
 {
@@ -836,6 +837,15 @@ struct TimingAnalysis
 			}
 
 			if (driver_type == "LogicCell40" && (driver_port == "ltout" || driver_port == "lcout")) {
+				unsigned mask = lc_lut_in_mask.at(driver_cell);
+				if (inport == "in0" && ((mask & 0x1) == 0))
+					continue;
+				if (inport == "in1" && ((mask & 0x2) == 0))
+					continue;
+				if (inport == "in2" && ((mask & 0x4) == 0))
+					continue;
+				if (inport == "in3" && ((mask & 0x8) == 0))
+					continue;
 				if (inport == "carryin")
 					continue;
 			}
@@ -1221,14 +1231,37 @@ std::string make_lc40(int x, int y, int z)
 	for (int i = 0; i < 20; i++)
 		lcbits[i] = get_config_bit(x, y, lcbits_pos[i].first, lcbits_pos[i].second) ? '1' : '0';
 
+	static const std::vector<int> lut_perm = {
+		4, 14, 15, 5, 6, 16, 17, 7, 3, 13, 12, 2, 1, 11, 10, 0,
+	};
+
+	unsigned lut_init = 0;
+		for (unsigned i = 0; i < lut_perm.size(); i++)
+			if (lcbits[lut_perm[i]] == '1')
+			lut_init |= (1U << i);
+
 	// FIXME: fill in the '0'
 	netlist_cell_params[cell]["C_ON"] = stringf("1'b%c", lcbits[8]);
 	netlist_cell_params[cell]["SEQ_MODE"] = stringf("4'b%c%c%c%c", lcbits[9], '0', '0', '0');
-	netlist_cell_params[cell]["LUT_INIT"] = stringf("16'b%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",
-			lcbits[0], lcbits[10], lcbits[11], lcbits[1],
-			lcbits[2], lcbits[12], lcbits[13], lcbits[3],
-			lcbits[7], lcbits[17], lcbits[16], lcbits[6],
-			lcbits[5], lcbits[15], lcbits[14], lcbits[4]);
+
+	std::string init = "16'b";
+	for (int i = 15; i >= 0; i--)
+		init += ((lut_init >> i) & 0x1) ? '1' : '0';
+
+	netlist_cell_params[cell]["LUT_INIT"] = init;
+
+	// Find which LUT inputs are "don't care" in the function, to avoid false paths for bits
+	// only affecting the carry.
+	lc_lut_in_mask[cell] = 0;
+	for (unsigned k = 0; k < 4; k++) {
+		for (unsigned i = 0; i < 16; i++) {
+			// If toggling the LUT input makes a difference it's not a don't care
+			if (((lut_init >> i) & 0x1U) != ((lut_init >> (i ^ (1U << k))) & 0x1U)) {
+				lc_lut_in_mask[cell] |= (1 << k);
+				break;
+			}
+		}
+	}
 
 	if (lcbits[8] == '1')
 	{

Publish Blockers

  • ☑ run was successful
  • ☑ package has not been removed from the archive
  • ☑ command has not changed
  • ☒ not yet reviewed, but review needed
  • ☑ 0 publish attempts so far.not currently attempting to back off
  • ☒ merge proposals for the package maintainer are currently being rate-limited (open: 1253, max open: 300)
  • ☑ change set 8edca4e2-69cc-4c37-a9c4-5e419181ff5f is ready

Resulting package

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases fpga-icestorm-chipdbapt install -t fresh-releases fpga-icestorm-dbgsymapt install -t fresh-releases fpga-icestorm

Lintian Result

Full worker log Full build log