예제 #1
0
파일: core.py 프로젝트: povauboin/litex
 def execute(self, statements):
     for s in statements:
         if isinstance(s, _Assign):
             self.assign(s.l, self.eval(s.r))
         elif isinstance(s, If):
             if self.eval(s.cond) & (2**len(s.cond) - 1):
                 self.execute(s.t)
             else:
                 self.execute(s.f)
         elif isinstance(s, Case):
             nbits, signed = value_bits_sign(s.test)
             test = _truncate(self.eval(s.test), nbits, signed)
             found = False
             for k, v in s.cases.items():
                 if isinstance(k, Constant) and k.value == test:
                     self.execute(v)
                     found = True
                     break
             if not found and "default" in s.cases:
                 self.execute(s.cases["default"])
         elif isinstance(s, collections.Iterable):
             self.execute(s)
         elif isinstance(s, Display):
             print(s.s)
         else:
             raise NotImplementedError
예제 #2
0
파일: core.py 프로젝트: enjoy-digital/litex
 def execute(self, statements):
     for s in statements:
         if isinstance(s, _Assign):
             self.assign(s.l, self.eval(s.r))
         elif isinstance(s, If):
             if self.eval(s.cond) & (2**len(s.cond) - 1):
                 self.execute(s.t)
             else:
                 self.execute(s.f)
         elif isinstance(s, Case):
             nbits, signed = value_bits_sign(s.test)
             test = _truncate(self.eval(s.test), nbits, signed)
             found = False
             for k, v in s.cases.items():
                 if isinstance(k, Constant) and k.value == test:
                     self.execute(v)
                     found = True
                     break
             if not found and "default" in s.cases:
                 self.execute(s.cases["default"])
         elif isinstance(s, collections.Iterable):
             self.execute(s)
         elif isinstance(s, Display):
             print(s.s)
         else:
             raise NotImplementedError
예제 #3
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)
예제 #4
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)
예제 #5
0
 def emit_verilog(tristate, ns, add_data_file):
     def pe(e):
         return verilog_printexpr(ns, e)[0]
     w, s = value_bits_sign(tristate.target)
     r = "assign " + pe(tristate.target) + " = " \
         + pe(tristate.oe) + " ? " + pe(tristate.o) \
         + " : " + str(w) + "'bz;\n"
     if tristate.i is not None:
         r += "assign " + pe(tristate.i) + " = " + pe(tristate.target) + ";\n"
     r += "\n"
     return r
예제 #6
0
    def like(cls, other, **kwargs):
        """Create Signal based on another.

        Parameters
        ----------
        other : _Value
            Object to base this Signal on.

        See `migen.fhdl.bitcontainer.value_bits_sign` for details.
        """
        from litex.gen.fhdl.bitcontainer import value_bits_sign
        return cls(bits_sign=value_bits_sign(other), **kwargs)
예제 #7
0
    def like(cls, other, **kwargs):
        """Create Signal based on another.

        Parameters
        ----------
        other : _Value
            Object to base this Signal on.

        See `migen.fhdl.bitcontainer.value_bits_sign` for details.
        """
        from litex.gen.fhdl.bitcontainer import value_bits_sign
        return cls(bits_sign=value_bits_sign(other), **kwargs)
예제 #8
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
예제 #9
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
예제 #10
0
파일: cdc.py 프로젝트: enjoy-digital/litex
    def __init__(self, i, o, odomain, n):
        self.i = i
        self.o = o
        self.odomain = odomain

        w, signed = value_bits_sign(self.i)
        self.regs = [Signal((w, signed)) for i in range(n)]

        ###

        src = self.i
        for reg in self.regs:
            sd = getattr(self.sync, self.odomain)
            sd += reg.eq(src)
            src = reg
        self.comb += self.o.eq(src)
        self.specials += [NoRetiming(reg) for reg in self.regs]
예제 #11
0
파일: cdc.py 프로젝트: Cloudxtreme/litex
    def __init__(self, i, o, odomain, n):
        self.i = i
        self.o = o
        self.odomain = odomain

        w, signed = value_bits_sign(self.i)
        self.regs = [Signal((w, signed)) for i in range(n)]

        ###

        src = self.i
        for reg in self.regs:
            sd = getattr(self.sync, self.odomain)
            sd += reg.eq(src)
            src = reg
        self.comb += self.o.eq(src)
        self.specials += [NoRetiming(reg) for reg in self.regs]
예제 #12
0
파일: cdc.py 프로젝트: rowhit/litex
    def __init__(self, i, o, odomain, n):
        self.i = i
        self.o = o
        self.odomain = odomain

        w, signed = value_bits_sign(self.i)
        self.regs = [Signal((w, signed), reset_less=True) for i in range(n)]

        ###

        src = self.i
        for reg in self.regs:
            sd = getattr(self.sync, self.odomain)
            sd += reg.eq(src)
            src = reg
        self.comb += self.o.eq(src)
        for reg in self.regs:
            reg.attr.add("no_retiming")
예제 #13
0
파일: structure.py 프로젝트: rowhit/litex
    def like(cls, other, **kwargs):
        """Create Signal based on another.

        Parameters
        ----------
        other : _Value
            Object to base this Signal on.

        See `migen.fhdl.bitcontainer.value_bits_sign` for details.
        """
        from litex.gen.fhdl.bitcontainer import value_bits_sign
        kw = dict(bits_sign=value_bits_sign(other))
        if isinstance(other, cls):
            kw.update(variable=other.variable,
                    reset=other.reset.value, reset_less=other.reset_less,
                    related=other.related, attr=set(other.attr))
        kw.update(kwargs)
        return cls(**kw)
예제 #14
0
파일: fsm.py 프로젝트: enjoy-digital/litex
 def visit_unknown(self, node):
     if isinstance(node, NextState):
         try:
             actual_state = self.aliases[node.state]
         except KeyError:
             actual_state = node.state
         return self.next_state_signal.eq(self.encoding[actual_state])
     elif isinstance(node, NextValue):
         try:
             next_value_ce, next_value = self._get_register_control(node.target)
         except KeyError:
             related = node.target if isinstance(node.target, Signal) else None
             next_value = Signal(bits_sign=value_bits_sign(node.target), related=related)
             next_value_ce = Signal(related=related)
             self.registers.append((node.target, next_value_ce, next_value))
         return next_value.eq(node.value), next_value_ce.eq(1)
     else:
         return node
예제 #15
0
파일: fsm.py 프로젝트: Cloudxtreme/litex
 def visit_unknown(self, node):
     if isinstance(node, NextState):
         try:
             actual_state = self.aliases[node.state]
         except KeyError:
             actual_state = node.state
         return self.next_state_signal.eq(self.encoding[actual_state])
     elif isinstance(node, NextValue):
         try:
             next_value_ce, next_value = self._get_register_control(
                 node.target)
         except KeyError:
             related = node.target if isinstance(node.target,
                                                 Signal) else None
             next_value = Signal(bits_sign=value_bits_sign(node.target),
                                 related=related)
             next_value_ce = Signal(related=related)
             self.registers.append((node.target, next_value_ce, next_value))
         return next_value.eq(node.value), next_value_ce.eq(1)
     else:
         return node
예제 #16
0
 def __len__(self):
     from litex.gen.fhdl.bitcontainer import value_bits_sign
     return value_bits_sign(self)[0]
예제 #17
0
 def __len__(self):
     from litex.gen.fhdl.bitcontainer import value_bits_sign
     return value_bits_sign(self)[0]