Hello,
the first patch fixes a bug that prevented signed Array()s while the
second demonstrates what I think is a bug in the signed Signals and
comparison code. But I could not identify the culprit. Maybe someone
else is quicker than me.

Regards,

-- 
Robert Jordens.
From 84292c0440325d9a2aa239e2d0191cae6a735e07 Mon Sep 17 00:00:00 2001
From: Robert Jordens <jord...@gmail.com>
Date: Sun, 8 Dec 2013 01:24:56 -0700
Subject: [PATCH 2/7] migen/fhdl/bitcontainer: fix signed arrays (map is an
 iterator)

---
 migen/fhdl/bitcontainer.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/migen/fhdl/bitcontainer.py b/migen/fhdl/bitcontainer.py
index 345c9c5..5b10536 100644
--- a/migen/fhdl/bitcontainer.py
+++ b/migen/fhdl/bitcontainer.py
@@ -93,7 +93,7 @@ def value_bits_sign(v):
 	elif isinstance(v, f.Replicate):
 		return (value_bits_sign(v.v)[0])*v.n, False
 	elif isinstance(v, f._ArrayProxy):
-		bsc = map(value_bits_sign, v.choices)
+		bsc = list(map(value_bits_sign, v.choices))
 		return max(bs[0] for bs in bsc), any(bs[1] for bs in bsc)
 	else:
 		raise TypeError("Can not calculate bit length of {} {}".format(
-- 
1.8.3.2

From 73836487721b076e30d022fc557f86a4afed04ca Mon Sep 17 00:00:00 2001
From: Robert Jordens <jord...@gmail.com>
Date: Sun, 8 Dec 2013 20:23:21 -0700
Subject: [PATCH 3/7] migen/test/test_signed: add a (currently failing) signed
 comparison testcase

---
 migen/test/test_signed.py | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 migen/test/test_signed.py

diff --git a/migen/test/test_signed.py b/migen/test/test_signed.py
new file mode 100644
index 0000000..d84691e
--- /dev/null
+++ b/migen/test/test_signed.py
@@ -0,0 +1,45 @@
+import unittest
+
+from migen.fhdl.std import *
+from migen.test.support import SimCase, SimBench
+
+class SignedCase(SimCase, unittest.TestCase):
+	class TestBench(SimBench):
+		def __init__(self):
+			self.a = Signal((3, True))
+			self.b = Signal((4, True))
+			comps = [
+					lambda p, q: p > q,
+					lambda p, q: p >= q,
+					lambda p, q: p < q,
+					lambda p, q: p <= q,
+					lambda p, q: p == q,
+					lambda p, q: p != q,
+					]
+			self.vals = []
+			for asign in 1, -1:
+				for bsign in 1, -1:
+					for f in comps:
+						r = Signal()
+						r0 = f(asign*self.a, bsign*self.b)
+						self.comb += r.eq(r0)
+						self.vals.append((asign, bsign, f, r, r0.op))
+
+	def test_comparisons(self):
+		values = range(-4, 4)
+		agen = iter(values)
+		bgen = iter(values)
+		def cb(tb, s):
+			try:
+				s.wr(self.tb.a, next(agen))
+				s.wr(self.tb.b, next(bgen))
+			except StopIteration:
+				s.interrupt = True
+			a = s.rd(self.tb.a)
+			b = s.rd(self.tb.b)
+			for asign, bsign, f, r, op in self.tb.vals:
+				r, r0 = s.rd(r), f(asign*a, bsign*b)
+				self.assertEqual(r, int(r0),
+						"got {}, want {}*{} {} {}*{} = {}".format(
+							r, asign, a, op, bsign, b, r0))
+		self.run_with(cb)
-- 
1.8.3.2

_______________________________________________
Devel mailing list
Devel@lists.milkymist.org
https://ssl.serverraum.org/lists/listinfo/devel

Reply via email to