raise SyntaxError("Instead of inheriting from `Module`, inherit from `Elaboratable` "
"and return a `Module` from the `elaborate(self, platform)` method")
- def __init__(self):
+ def __init__(self, _astType=None):
_ModuleBuilderRoot.__init__(self, self, depth=0)
self.submodules = _ModuleBuilderSubmodules(self)
self.domains = _ModuleBuilderDomainSet(self)
self._domains = {}
self._generated = {}
+ # to complete the Type 1 (ast.*) nmigen language construct abstraction
+ # from Type 2 (Module - this class) Module must be told what AST type
+ # it may cast m.If/Elif conditions and m.Switch
+
def _check_context(self, construct, context):
if self._ctrl_context != context:
if self._ctrl_context is None:
return data
def _check_signed_cond(self, cond):
- cond = Value.cast(cond)
+ cond = self._astType.cast(cond)
width, signed = cond.shape()
if signed:
warnings.warn("Signed values in If/Elif conditions usually result from inverting "
def Switch(self, test):
self._check_context("Switch", context=None)
switch_data = self._set_ctrl("Switch", {
- "test": Value.cast(test),
+ "test": self._astType.cast(test),
"cases": OrderedDict(),
"src_loc": tracer.get_src_loc(src_loc_at=1),
"case_src_locs": {},
tests, cases = [], OrderedDict()
for if_test, if_case in zip(if_tests + [None], if_bodies):
if if_test is not None:
- # check if the if_test is not considered boolean, and only
- # append a converted version if it is not. this defers the
- # Value.cast (which would lose type if done mandatorially).
- # ast._InternalSwitch does a (second) Value.cast anyway
- _if_test = Value.cast(if_test)
- if not _if_test.considered_bool():
- if_test = _if_test.bool()
tests.append(if_test)
if if_test is not None: