From f4f4e42de8724f015a28e6cbb8e5abc939993995 Mon Sep 17 00:00:00 2001 From: Robin Ole Heinemann Date: Sun, 11 May 2025 20:21:18 +0200 Subject: [PATCH] hdl._ir: chain Fragment.origins with preexisting [0.5 backport] By chaining, `Fragment.origins` gets tracked through `FragmentTransformer`s --- amaranth/hdl/_ir.py | 2 +- tests/test_hdl_ir.py | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) 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):