1 from ..hdl
.ast
import *
4 from ..hdl
.xfrm
import *
8 class DomainRenamerTestCase(FHDLTestCase
):
17 def test_rename_signals(self
):
20 self
.s1
.eq(ClockSignal()),
21 ResetSignal().eq(self
.s2
),
23 self
.s4
.eq(ClockSignal("other")),
24 self
.s5
.eq(ResetSignal("other")),
26 f
.add_driver(self
.s1
, None)
27 f
.add_driver(self
.s2
, None)
28 f
.add_driver(self
.s3
, "sync")
30 f
= DomainRenamer("pix")(f
)
31 self
.assertRepr(f
.statements
, """
33 (eq (sig s1) (clk pix))
34 (eq (rst pix) (sig s2))
35 (eq (sig s3) (const 1'd0))
36 (eq (sig s4) (clk other))
37 (eq (sig s5) (rst other))
40 self
.assertEqual(f
.drivers
, {
41 None: SignalSet((self
.s1
, self
.s2
)),
42 "pix": SignalSet((self
.s3
,)),
45 def test_rename_multi(self
):
48 self
.s1
.eq(ClockSignal()),
49 self
.s2
.eq(ResetSignal("other")),
52 f
= DomainRenamer({"sync": "pix", "other": "pix2"})(f
)
53 self
.assertRepr(f
.statements
, """
55 (eq (sig s1) (clk pix))
56 (eq (sig s2) (rst pix2))
60 def test_rename_cd(self
):
61 cd_sync
= ClockDomain()
62 cd_pix
= ClockDomain()
65 f
.add_domains(cd_sync
, cd_pix
)
67 f
= DomainRenamer("ext")(f
)
68 self
.assertEqual(cd_sync
.name
, "ext")
69 self
.assertEqual(f
.domains
, {
74 def test_rename_cd_subfragment(self
):
75 cd_sync
= ClockDomain()
76 cd_pix
= ClockDomain()
79 f1
.add_domains(cd_sync
, cd_pix
)
81 f2
.add_domains(cd_sync
)
82 f1
.add_subfragment(f2
)
84 f1
= DomainRenamer("ext")(f1
)
85 self
.assertEqual(cd_sync
.name
, "ext")
86 self
.assertEqual(f1
.domains
, {
92 class DomainLowererTestCase(FHDLTestCase
):
96 def test_lower_clk(self
):
100 self
.s
.eq(ClockSignal("sync"))
103 f
= DomainLowerer({"sync": sync
})(f
)
104 self
.assertRepr(f
.statements
, """
106 (eq (sig s) (sig clk))
110 def test_lower_rst(self
):
114 self
.s
.eq(ResetSignal("sync"))
117 f
= DomainLowerer({"sync": sync
})(f
)
118 self
.assertRepr(f
.statements
, """
120 (eq (sig s) (sig rst))
124 def test_lower_rst_reset_less(self
):
125 sync
= ClockDomain(reset_less
=True)
128 self
.s
.eq(ResetSignal("sync", allow_reset_less
=True))
131 f
= DomainLowerer({"sync": sync
})(f
)
132 self
.assertRepr(f
.statements
, """
134 (eq (sig s) (const 1'd0))
138 def test_lower_wrong_domain(self
):
142 self
.s
.eq(ClockSignal("xxx"))
145 with self
.assertRaises(DomainError
,
146 msg
="Signal (clk xxx) refers to nonexistent domain 'xxx'"):
147 DomainLowerer({"sync": sync
})(f
)
149 def test_lower_wrong_reset_less_domain(self
):
150 sync
= ClockDomain(reset_less
=True)
153 self
.s
.eq(ResetSignal("sync"))
156 with self
.assertRaises(DomainError
,
157 msg
="Signal (rst sync) refers to reset of reset-less domain 'sync'"):
158 DomainLowerer({"sync": sync
})(f
)
161 class SwitchCleanerTestCase(FHDLTestCase
):
162 def test_clean(self
):
178 self
.assertRepr(SwitchCleaner()(stmts
), """
182 (eq (sig a) (const 1'd0)))
184 (eq (sig b) (const 1'd1)))
190 class LHSGroupAnalyzerTestCase(FHDLTestCase
):
191 def test_no_group_unrelated(self
):
199 groups
= LHSGroupAnalyzer()(stmts
)
200 self
.assertEqual(list(groups
.values()), [
205 def test_group_related(self
):
213 groups
= LHSGroupAnalyzer()(stmts
)
214 self
.assertEqual(list(groups
.values()), [
218 def test_no_loops(self
):
227 groups
= LHSGroupAnalyzer()(stmts
)
228 self
.assertEqual(list(groups
.values()), [
232 def test_switch(self
):
242 groups
= LHSGroupAnalyzer()(stmts
)
243 self
.assertEqual(list(groups
.values()), [
249 class LHSGroupFilterTestCase(FHDLTestCase
):
250 def test_filter(self
):
264 self
.assertRepr(LHSGroupFilter(SignalSet((a
,)))(stmts
), """
268 (eq (sig a) (const 1'd0)))
275 class ResetInserterTestCase(FHDLTestCase
):
278 self
.s2
= Signal(reset
=1)
279 self
.s3
= Signal(reset
=1, reset_less
=True)
282 def test_reset_default(self
):
287 f
.add_driver(self
.s1
, "sync")
289 f
= ResetInserter(self
.c1
)(f
)
290 self
.assertRepr(f
.statements
, """
292 (eq (sig s1) (const 1'd1))
294 (case 1 (eq (sig s1) (const 1'd0)))
299 def test_reset_cd(self
):
305 f
.add_domains(ClockDomain("sync"))
306 f
.add_driver(self
.s1
, "sync")
307 f
.add_driver(self
.s2
, "pix")
309 f
= ResetInserter({"pix": self
.c1
})(f
)
310 self
.assertRepr(f
.statements
, """
312 (eq (sig s1) (const 1'd1))
313 (eq (sig s2) (const 1'd0))
315 (case 1 (eq (sig s2) (const 1'd1)))
320 def test_reset_value(self
):
325 f
.add_driver(self
.s2
, "sync")
327 f
= ResetInserter(self
.c1
)(f
)
328 self
.assertRepr(f
.statements
, """
330 (eq (sig s2) (const 1'd0))
332 (case 1 (eq (sig s2) (const 1'd1)))
337 def test_reset_less(self
):
342 f
.add_driver(self
.s3
, "sync")
344 f
= ResetInserter(self
.c1
)(f
)
345 self
.assertRepr(f
.statements
, """
347 (eq (sig s3) (const 1'd0))
355 class CEInserterTestCase(FHDLTestCase
):
362 def test_ce_default(self
):
367 f
.add_driver(self
.s1
, "sync")
369 f
= CEInserter(self
.c1
)(f
)
370 self
.assertRepr(f
.statements
, """
372 (eq (sig s1) (const 1'd1))
374 (case 0 (eq (sig s1) (sig s1)))
379 def test_ce_cd(self
):
385 f
.add_driver(self
.s1
, "sync")
386 f
.add_driver(self
.s2
, "pix")
388 f
= CEInserter({"pix": self
.c1
})(f
)
389 self
.assertRepr(f
.statements
, """
391 (eq (sig s1) (const 1'd1))
392 (eq (sig s2) (const 1'd0))
394 (case 0 (eq (sig s2) (sig s2)))
399 def test_ce_subfragment(self
):
404 f1
.add_driver(self
.s1
, "sync")
410 f2
.add_driver(self
.s2
, "sync")
411 f1
.add_subfragment(f2
)
413 f1
= CEInserter(self
.c1
)(f1
)
414 (f2
, _
), = f1
.subfragments
415 self
.assertRepr(f1
.statements
, """
417 (eq (sig s1) (const 1'd1))
419 (case 0 (eq (sig s1) (sig s1)))
423 self
.assertRepr(f2
.statements
, """
425 (eq (sig s2) (const 1'd1))
427 (case 0 (eq (sig s2) (sig s2)))