Exemple #1
0
 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)
Exemple #2
0
 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)
Exemple #3
0
	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
Exemple #4
0
 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
Exemple #5
0
 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)
Exemple #6
0
	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)
Exemple #7
0
 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)
Exemple #8
0
    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
Exemple #9
0
    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
Exemple #10
0
	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
Exemple #11
0
 def visit_Assign(self, node):
     return _Assign(self.visit(node.l), self.visit(node.r))
Exemple #12
0
	def visit_Assign(self, node):
		return _Assign(self.visit(node.l), self.visit(node.r))
Exemple #13
0
	def visit_Assign(self, node):
		# visit left handside only
		return _Assign(self.visit(node.l), node.r)