diff --git a/amaranth/hdl/_ir.py b/amaranth/hdl/_ir.py index 90ddb8a48..57f9d4a60 100644 --- a/amaranth/hdl/_ir.py +++ b/amaranth/hdl/_ir.py @@ -54,7 +54,7 @@ def get(obj, platform): while True: if isinstance(obj, Fragment): if hasattr(obj, "origins"): - obj.origins = tuple(origins) + obj.origins = tuple(origins) + (obj.origins or ()) return obj elif isinstance(obj, Elaboratable): code = obj.elaborate.__code__ diff --git a/tests/test_hdl_ir.py b/tests/test_hdl_ir.py index 4899d188b..a4829b2a7 100644 --- a/tests/test_hdl_ir.py +++ b/tests/test_hdl_ir.py @@ -1079,12 +1079,31 @@ def test_origins(self): self.assertIs(frag.origins[1], elab2) self.assertIs(frag.origins[2], m) + def test_origins_transformed_elaboratable(self): + renamed = DomainRenamer("sync")(elab1 := ElaboratesTo(elab2 := ElaboratesTo(m := Module()))) + frag = Fragment.get(renamed, platform=None) + self.assertEqual(len(frag.origins), 4) + self.assertIsInstance(frag.origins, tuple) + self.assertIs(frag.origins[0], renamed) + self.assertIs(frag.origins[1], elab1) + self.assertIs(frag.origins[2], elab2) + self.assertIs(frag.origins[3], m) + + renamed_nested = ElaboratesTo(elab2 := ElaboratesTo(renamed := DomainRenamer("sync")(m := Module()))) + frag = Fragment.get(renamed_nested, platform=None) + self.assertEqual(len(frag.origins), 4) + self.assertIsInstance(frag.origins, tuple) + self.assertIs(frag.origins[0], renamed_nested) + self.assertIs(frag.origins[1], elab2) + self.assertIs(frag.origins[2], renamed) + self.assertIs(frag.origins[3], m) + def test_origins_disable(self): inst = Instance("test") del inst.origins elab = ElaboratesTo(inst) frag = Fragment.get(elab, platform=None) - self.assertFalse(hasattr(frag, "_origins")) + self.assertFalse(hasattr(frag, "origins")) class IOBufferTestCase(FHDLTestCase):