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
|
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):
|
for subfragment_index, (subfragment, subfragment_name, subfragment_src_loc) in enumerate(fragment.subfragments):
|
||||||
if subfragment_name is None:
|
if subfragment_name is None:
|
||||||
subfragment_name = f"U${subfragment_index}"
|
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}"
|
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))
|
self._assign_names_to_fragments(subfragment, hierarchy=(*hierarchy, subfragment_name))
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1030,6 +1030,18 @@ class NamesTestCase(FHDLTestCase):
|
||||||
a_f: ("top", "a$U$0")
|
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):
|
class ElaboratesTo(Elaboratable):
|
||||||
def __init__(self, lower):
|
def __init__(self, lower):
|
||||||
|
|
Loading…
Reference in a new issue