forked from M-Labs/artiq
dsp/tools: unittest sat_add
This commit is contained in:
parent
bd1438d28e
commit
694f8d784c
|
@ -0,0 +1,69 @@
|
||||||
|
import unittest
|
||||||
|
import migen as mg
|
||||||
|
|
||||||
|
from artiq.gateware.dsp.tools import SatAddMixin
|
||||||
|
|
||||||
|
|
||||||
|
class DUT(mg.Module, SatAddMixin):
|
||||||
|
def __init__(self, width):
|
||||||
|
self.o = mg.Signal((width, True))
|
||||||
|
self.i0 = mg.Signal.like(self.o)
|
||||||
|
self.i1 = mg.Signal.like(self.o)
|
||||||
|
self.l0 = mg.Signal.like(self.o)
|
||||||
|
self.l1 = mg.Signal.like(self.o)
|
||||||
|
self.c = mg.Signal(2)
|
||||||
|
self.comb += self.o.eq(self.sat_add(self.i0, self.i1,
|
||||||
|
limits=(self.l0, self.l1), clipped=self.c))
|
||||||
|
|
||||||
|
|
||||||
|
class SatAddTest(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.dut = DUT(width=4)
|
||||||
|
|
||||||
|
def _sweep(self):
|
||||||
|
def gen():
|
||||||
|
for i0 in range(-8, 8):
|
||||||
|
yield self.dut.i0.eq(i0)
|
||||||
|
for i1 in range(-8, 8):
|
||||||
|
yield self.dut.i1.eq(i1)
|
||||||
|
yield
|
||||||
|
|
||||||
|
def rec():
|
||||||
|
l0 = yield self.dut.l0
|
||||||
|
l1 = yield self.dut.l1
|
||||||
|
for i in range(1 << 8):
|
||||||
|
i0 = yield self.dut.i0
|
||||||
|
i1 = yield self.dut.i1
|
||||||
|
o = yield self.dut.o
|
||||||
|
c = yield self.dut.c
|
||||||
|
|
||||||
|
full = i0 + i1
|
||||||
|
lim = full
|
||||||
|
if full < l0:
|
||||||
|
lim = l0
|
||||||
|
if full > l1:
|
||||||
|
lim = l1
|
||||||
|
if l1 < full < l0:
|
||||||
|
lim = 0
|
||||||
|
clip = int(full < l0) | (int(full > l1) << 1)
|
||||||
|
with self.subTest(i0=i0, i1=i1):
|
||||||
|
self.assertEqual(lim, o)
|
||||||
|
self.assertEqual(clip, c)
|
||||||
|
yield
|
||||||
|
|
||||||
|
mg.run_simulation(self.dut, (gen(), rec()))
|
||||||
|
|
||||||
|
def test_inst(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_run(self):
|
||||||
|
self._sweep()
|
||||||
|
|
||||||
|
def test_limits(self):
|
||||||
|
for l0 in -8, 0, 1, 7:
|
||||||
|
for l1 in -8, 0, 1, 7:
|
||||||
|
self.setUp()
|
||||||
|
self.dut.l0.reset = l0
|
||||||
|
self.dut.l1.reset = l1
|
||||||
|
with self.subTest(l0=l0, l1=l1):
|
||||||
|
self._sweep()
|
Loading…
Reference in New Issue