From 7c161957bfe35e27c98ac82777b3fc53564a28fc Mon Sep 17 00:00:00 2001 From: whitequark Date: Sat, 11 Dec 2021 13:37:15 +0000 Subject: [PATCH] build.dsl: check type of resource number. Fixes #599. --- amaranth/build/dsl.py | 5 ++++- tests/test_build_dsl.py | 6 ++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/amaranth/build/dsl.py b/amaranth/build/dsl.py index 3b445f6..9763fa2 100644 --- a/amaranth/build/dsl.py +++ b/amaranth/build/dsl.py @@ -197,8 +197,11 @@ class Resource(Subsignal): return cls(name_or_number + name_suffix, number, *ios) def __init__(self, name, number, *args): - super().__init__(name, *args) + if not isinstance(number, int): + raise TypeError("Resource number must be an integer, not {!r}" + .format(number)) + super().__init__(name, *args) self.number = number def __repr__(self): diff --git a/tests/test_build_dsl.py b/tests/test_build_dsl.py index 9e6e29d..7f11795 100644 --- a/tests/test_build_dsl.py +++ b/tests/test_build_dsl.py @@ -242,6 +242,12 @@ class ResourceTestCase(FHDLTestCase): " (subsignal rx (pins i A1))" " (attrs IOSTANDARD='LVCMOS33'))") + def test_number_wrong(self): + with self.assertRaisesRegex(TypeError, + r"^Resource number must be an integer, not \(pins o 1\)$"): + # number omitted by accident + Resource("led", Pins("1", dir="o")) + def test_family(self): ios = [Subsignal("clk", Pins("A0", dir="o"))] r1 = Resource.family(0, default_name="spi", ios=ios)