hdl.ast: implement values with custom lowering.

This commit is contained in:
whitequark 2019-06-11 07:01:44 +00:00
parent 066dd799e8
commit ad1a40c934
4 changed files with 104 additions and 0 deletions

View file

@ -523,6 +523,26 @@ class ResetSignalTestCase(FHDLTestCase):
self.assertEqual(repr(s1), "(rst sync)")
class MockUserValue(UserValue):
def __init__(self, lowered):
super().__init__()
self.lower_count = 0
self.lowered = lowered
def lower(self):
self.lower_count += 1
return self.lowered
class UserValueTestCase(FHDLTestCase):
def test_shape(self):
uv = MockUserValue(1)
self.assertEqual(uv.shape(), (1, False))
uv.lowered = 2
self.assertEqual(uv.shape(), (1, False))
self.assertEqual(uv.lower_count, 1)
class SampleTestCase(FHDLTestCase):
def test_const(self):
s = Sample(1, 1, "sync")

View file

@ -548,3 +548,39 @@ class TransformedElaboratableTestCase(FHDLTestCase):
)
)
""")
class MockUserValue(UserValue):
def __init__(self, lowered):
super().__init__()
self.lowered = lowered
def lower(self):
return self.lowered
class UserValueTestCase(FHDLTestCase):
def setUp(self):
self.s = Signal()
self.c = Signal()
self.uv = MockUserValue(self.s)
def test_lower(self):
sync = ClockDomain()
f = Fragment()
f.add_statements(
self.uv.eq(1)
)
for signal in self.uv._lhs_signals():
f.add_driver(signal, "sync")
f = ResetInserter(self.c)(f)
f = DomainLowerer({"sync": sync})(f)
self.assertRepr(f.statements, """
(
(eq (sig s) (const 1'd1))
(switch (sig c)
(case 1 (eq (sig s) (const 1'd0)))
)
)
""")