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