def visit_Slice(self, node): if not isinstance(node.value, Signal): slice_proxy = Signal(value_bits_sign(node.value)) if self.target_context: a = _Assign(node.value, slice_proxy) else: a = _Assign(slice_proxy, node.value) self.comb.append(self.visit_Assign(a)) node = _Slice(slice_proxy, node.start, node.stop) return NodeTransformer.visit_Slice(self, node)
def visit_ArrayProxy(self, node): array_muxed = Signal(value_bits_sign(node), variable=True) if self.target_context: k = self.visit(node.key) cases = {} for n, choice in enumerate(node.choices): cases[n] = [self.visit_Assign(_Assign(choice, array_muxed))] self.extra_stmts.append(Case(k, cases).makedefault()) else: cases = dict((n, _Assign(array_muxed, self.visit(choice))) for n, choice in enumerate(node.choices)) self.comb.append(Case(self.visit(node.key), cases).makedefault()) return array_muxed
def visit_ArrayProxy(self, node): # TODO: rewrite without variables array_muxed = Signal(value_bits_sign(node), variable=True) if self.target_context: k = self.visit(node.key) cases = {} for n, choice in enumerate(node.choices): cases[n] = [self.visit_Assign(_Assign(choice, array_muxed))] self.extra_stmts.append(Case(k, cases).makedefault()) else: cases = dict((n, _Assign(array_muxed, self.visit(choice))) for n, choice in enumerate(node.choices)) self.comb.append(Case(self.visit(node.key), cases).makedefault()) return array_muxed
def visit_Part(self, node): value_proxy = node.value offset_proxy = node.offset if not isinstance(node.value, Signal): value_proxy = Signal(value_bits_sign(node.value)) if self.target_context: a = _Assign(node.value, value_proxy) else: a = _Assign(value_proxy, node.value) self.comb.append(self.visit_Assign(a)) if not isinstance(node.offset, Signal): offset_proxy = Signal(value_bits_sign(node.offset)) if self.target_context: a = _Assign(node.offset, offset_proxy) else: a = _Assign(offset_proxy, node.offset) self.comb.append(self.visit_Assign(a)) node = _Part(value_proxy, offset_proxy, node.width) return NodeTransformer.visit_Part(self, node)
def visit_Assign(self, node): if isinstance(node.l, _ArrayProxy): k = self.visit(node.l.key) cases = {} for n, choice in enumerate(node.l.choices): assign = self.visit_Assign(_Assign(choice, node.r)) cases[n] = [assign] return Case(k, cases).makedefault() else: return NodeTransformer.visit_Assign(self, node)
def visit_Assign(self, node): old_target_context, old_extra_stmts = self.target_context, self.extra_stmts self.extra_stmts = [] self.target_context = True lhs = self.visit(node.l) self.target_context = False rhs = self.visit(node.r) r = _Assign(lhs, rhs) if self.extra_stmts: r = [r] + self.extra_stmts self.target_context, self.extra_stmts = old_target_context, old_extra_stmts return r
def visit_ArrayProxy(self, node): array_muxed = Signal(value_bits_sign(node)) cases = dict((n, _Assign(array_muxed, self.visit(choice))) for n, choice in enumerate(node.choices)) self.comb.append(Case(self.visit(node.key), cases).makedefault()) return array_muxed
def visit_Assign(self, node): return _Assign(self.visit(node.l), self.visit(node.r))
def visit_Assign(self, node): # visit left handside only return _Assign(self.visit(node.l), node.r)