`Module` is an object with a lot of complex and sometimes fragile
behavior that overrides Python attribute accessors and so on.
To prevent user designs from breaking when it is changed, it is not
supposed to be inherited from (unlike in Migen), but rather returned
from the elaborate() method. This commit makes sure it will not be
inherited from by accident (most likely by users familiar with
Migen).
Fixes #286.
class Module(_ModuleBuilderRoot, Elaboratable):
+ @classmethod
+ def __init_subclass__(cls):
+ raise SyntaxError("Instead of inheriting from `Module`, inherit from `Elaboratable` "
+ "and return a `Module` from the `elaborate(self, platform)` method")
+
def __init__(self):
_ModuleBuilderRoot.__init__(self, self, depth=0)
self.submodules = _ModuleBuilderSubmodules(self)
self.c3 = Signal()
self.w1 = Signal(4)
+ def test_cant_inherit(self):
+ with self.assertRaises(SyntaxError,
+ msg="Instead of inheriting from `Module`, inherit from `Elaboratable` and "
+ "return a `Module` from the `elaborate(self, platform)` method"):
+ class ORGate(Module):
+ pass
+
def test_d_comb(self):
m = Module()
m.d.comb += self.c1.eq(1)