From f2dab705ee245e82f71a0b1d283a1652d6d026c7 Mon Sep 17 00:00:00 2001 From: Wanda Date: Wed, 28 Feb 2024 12:43:12 +0100 Subject: [PATCH] lib.io: Expose `Pin` path and name as attributes. --- amaranth/lib/io.py | 8 +++++++- tests/test_lib_io.py | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/amaranth/lib/io.py b/amaranth/lib/io.py index 09058d2..880e5d7 100644 --- a/amaranth/lib/io.py +++ b/amaranth/lib/io.py @@ -1,6 +1,7 @@ from .. import * from ..lib import wiring from ..lib.wiring import In, Out +from .. import tracer __all__ = ["Pin"] @@ -123,9 +124,14 @@ class Pin(wiring.PureInterface): def __init__(self, width, dir, *, xdr=0, name=None, path=None, src_loc_at=0): if name is not None: - if path is None: + if path is not None: raise ValueError("Cannot pass both name and path") path = (name,) + if path is None: + name = tracer.get_var_name(depth=2 + src_loc_at, default="$pin") + path = (name,) + self.path = tuple(path) + self.name = path[-1] signature = Pin.Signature(width, dir, xdr=xdr) super().__init__(signature, path=path, src_loc_at=src_loc_at + 1) diff --git a/tests/test_lib_io.py b/tests/test_lib_io.py index 1c82b1f..0f35322 100644 --- a/tests/test_lib_io.py +++ b/tests/test_lib_io.py @@ -218,3 +218,14 @@ class PinTestCase(FHDLTestCase): self.assertEqual(pin.signature.width, 2) self.assertEqual(pin.signature.dir, "io") self.assertEqual(pin.signature.xdr, 2) + self.assertEqual(pin.name, "pin") + self.assertEqual(pin.path, ("pin",)) + self.assertEqual(pin.i0.name, "pin__i0") + pin = Pin(2, dir="io", xdr=2, name="testpin") + self.assertEqual(pin.name, "testpin") + self.assertEqual(pin.path, ("testpin",)) + self.assertEqual(pin.i0.name, "testpin__i0") + pin = Pin(2, dir="io", xdr=2, path=["a", "b"]) + self.assertEqual(pin.name, "b") + self.assertEqual(pin.path, ("a", "b")) + self.assertEqual(pin.i0.name, "a__b__i0")