hdl._ir: Handle duplicate fragment names.
This commit is contained in:
parent
047b64d02c
commit
76a7dc396c
|
@ -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))
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in a new issue