sim.pysim: move name extractor functionality to Fragment.

At the moment there are two issues with assignment of names in pysim:
1. Names are not deduplicated. It is possible (and frequent) for names
   to be included twice in VCD output.
2. Names are different compared to what is emitted in RTLIL, Verilog,
   or CXXRTL output.

This commit fixes issue (1), and issue (2) will be fixed by the new IR.
This commit is contained in:
Catherine 2023-11-25 04:21:00 +00:00
parent e7b15e1321
commit 79adbed313
3 changed files with 154 additions and 34 deletions

View file

@ -834,3 +834,71 @@ class InstanceTestCase(FHDLTestCase):
self.assertEqual(f.attrs, OrderedDict([
("ATTR", 1),
]))
def test_assign_names_to_signals(self):
i = Signal()
rst = Signal()
o1 = Signal()
o2 = Signal()
o3 = Signal()
i1 = Signal(name="i")
f = Fragment()
f.add_domains(cd_sync := ClockDomain())
f.add_domains(cd_sync_norst := ClockDomain(reset_less=True))
f.add_ports((i, rst), dir="i")
f.add_ports((o1, o2, o3), dir="o")
f.add_statements([o1.eq(0)])
f.add_driver(o1, domain=None)
f.add_statements([o2.eq(i1)])
f.add_driver(o2, domain="sync")
f.add_statements([o3.eq(i1)])
f.add_driver(o3, domain="sync_norst")
names = f._assign_names_to_signals()
self.assertEqual(names, SignalDict([
(i, "i"),
(rst, "rst"),
(o1, "o1"),
(o2, "o2"),
(o3, "o3"),
(cd_sync.clk, "clk"),
(cd_sync.rst, "rst$6"),
(cd_sync_norst.clk, "sync_norst_clk"),
(i1, "i$8"),
]))
def test_assign_names_to_fragments(self):
f = Fragment()
f.add_subfragment(a := Fragment())
f.add_subfragment(b := Fragment(), name="b")
names = f._assign_names_to_fragments()
self.assertEqual(names, {
f: ("top",),
a: ("top", "U$0"),
b: ("top", "b")
})
def test_assign_names_to_fragments_rename_top(self):
f = Fragment()
f.add_subfragment(a := Fragment())
f.add_subfragment(b := Fragment(), name="b")
names = f._assign_names_to_fragments(hierarchy=("bench", "cpu"))
self.assertEqual(names, {
f: ("bench", "cpu",),
a: ("bench", "cpu", "U$0"),
b: ("bench", "cpu", "b")
})
def test_assign_names_to_fragments_collide_with_signal(self):
f = Fragment()
f.add_subfragment(a_f := Fragment(), name="a")
f.add_ports((a_s := Signal(name="a"),), dir="o")
names = f._assign_names_to_fragments()
self.assertEqual(names, {
f: ("top",),
a_f: ("top", "a$U$0")
})