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:
parent
afece15001
commit
6fd7cbad0d
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue