lib.wiring: fix Component.signature on subclasses without annotations.

On Python <3.10, classes without annotations do not get an
`__annotations__` member at all, so the `getattr` on a subclass falls
back to the parent class `__annotations__`, attempting to create
signature members twice.  Fix that by looking at the `__dict__` instead.
This commit is contained in:
Wanda 2023-10-08 16:20:18 +02:00 committed by Catherine
parent c7da6c1292
commit 470477a88f
2 changed files with 14 additions and 1 deletions

View file

@ -786,7 +786,7 @@ class Component(Elaboratable):
cls = type(self)
signature = Signature({})
for base in cls.mro()[:cls.mro().index(Component)]:
for name, annot in getattr(base, "__annotations__", {}).items():
for name, annot in base.__dict__.get("__annotations__", {}).items():
if name.startswith("_"):
continue
if (annot is Value or annot is Signal or annot is Const or

View file

@ -887,3 +887,16 @@ class ComponentTestCase(unittest.TestCase):
r"'rand: In\(Signature\({}\)\.flip\(\)\)' or "
r"'rand: Out\(Signature\({}\)\.flip\(\)\)'\?$"):
PageBuffer()
def test_inherit(self):
class A(Component):
clk: In(1)
class B(A):
rst: In(1)
class C(B):
pass
c = C()
self.assertEqual(c.signature, Signature({"clk": In(1), "rst": In(1)}))