hdl._ir: Handle duplicate fragment names.

This commit is contained in:
Wanda 2024-02-29 20:57:23 +01:00 committed by Catherine
parent 047b64d02c
commit 76a7dc396c
2 changed files with 16 additions and 3 deletions

View file

@ -581,13 +581,14 @@ class Design:
"""
self.fragment_names[fragment] = hierarchy
signal_names = set(self.signal_names[fragment].values())
taken_names = set(self.signal_names[fragment].values())
for subfragment_index, (subfragment, subfragment_name, subfragment_src_loc) in enumerate(fragment.subfragments):
if subfragment_name is None:
subfragment_name = f"U${subfragment_index}"
elif subfragment_name in signal_names:
elif subfragment_name in taken_names:
subfragment_name = f"{subfragment_name}$U${subfragment_index}"
assert subfragment_name not in signal_names
assert subfragment_name not in taken_names
taken_names.add(subfragment_name)
self._assign_names_to_fragments(subfragment, hierarchy=(*hierarchy, subfragment_name))

View file

@ -1030,6 +1030,18 @@ class NamesTestCase(FHDLTestCase):
a_f: ("top", "a$U$0")
})
def test_assign_names_to_fragments_duplicate(self):
f = Fragment()
f.add_subfragment(a1_f := Fragment(), name="a")
f.add_subfragment(a2_f := Fragment(), name="a")
design = Design(f, ports=[], hierarchy=("top",))
self.assertEqual(design.fragment_names, {
f: ("top",),
a1_f: ("top", "a"),
a2_f: ("top", "a$U$1"),
})
class ElaboratesTo(Elaboratable):
def __init__(self, lower):