hdl.dsl: don't allow inheriting from Module.

`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.
This commit is contained in:
whitequark 2020-02-01 02:15:45 +00:00
parent afece15001
commit 6fd7cbad0d
2 changed files with 12 additions and 0 deletions

View file

@ -148,6 +148,11 @@ class FSM:
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)

View file

@ -19,6 +19,13 @@ class DSLTestCase(FHDLTestCase):
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)