From 76a7dc396cf596626729bd6bd7036e2caeb4eb07 Mon Sep 17 00:00:00 2001 From: Wanda Date: Thu, 29 Feb 2024 20:57:23 +0100 Subject: [PATCH] hdl._ir: Handle duplicate fragment names. --- amaranth/hdl/_ir.py | 7 ++++--- tests/test_hdl_ir.py | 12 ++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/amaranth/hdl/_ir.py b/amaranth/hdl/_ir.py index 5f63f56..2eed406 100644 --- a/amaranth/hdl/_ir.py +++ b/amaranth/hdl/_ir.py @@ -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)) diff --git a/tests/test_hdl_ir.py b/tests/test_hdl_ir.py index bfd63f5..299344a 100644 --- a/tests/test_hdl_ir.py +++ b/tests/test_hdl_ir.py @@ -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):