def visit_Slice(self, node):
     val = self.visit(node.var)
     if val is None:
         return None
     if isinstance(val.right, vtypes._Variable):
         right = vtypes.Slice(val.right, node.msb, node.lsb)
     else:
         right = vtypes.And(vtypes.Srl(val.right, node.lsb),
                            vtypes.Repeat(vtypes.Int(1, width=1), node.msb - node.lsb + 1))
     return vtypes.Subst(vtypes.Slice(val.left, node.msb, node.lsb), right)
Exemple #2
0
    def __init__(self,
                 m,
                 name,
                 clk,
                 rst,
                 datawidth=32,
                 addrwidth=32,
                 lite=False,
                 noio=False,
                 length=4):
        AXIS.__init__(self,
                      m,
                      name,
                      clk,
                      rst,
                      datawidth=datawidth,
                      addrwidth=addrwidth,
                      lite=lite,
                      noio=noio)

        if not isinstance(length, int):
            raise TypeError("length must be 'int', not '%s'" %
                            str(type(length)))

        self.register = [
            self.m.Reg('_'.join(['', self.name, 'register',
                                 '%d' % i]),
                       width=self.datawidth,
                       initval=0) for i in range(length)
        ]
        self.flag = [
            self.m.Reg('_'.join(['', self.name, 'flag',
                                 '%d' % i]), initval=0) for i in range(length)
        ]
        self.resetval = [
            self.m.Reg('_'.join(['', self.name, 'resetval',
                                 '%d' % i]),
                       width=self.datawidth,
                       initval=0) for i in range(length)
        ]
        self.length = length
        self.maskwidth = self.m.Localparam(
            '_'.join(['', self.name, 'maskwidth']),
            int(math.ceil(math.log(length, 2))))
        self.mask = self.m.Localparam(
            '_'.join(['', self.name, 'mask']),
            vtypes.Repeat(vtypes.Int(1, 1), self.maskwidth))
        self.shift = self.m.Localparam('_'.join(['', self.name, 'shift']),
                                       util.log2(self.datawidth // 8))

        if self.lite:
            self._setup_register_lite_fsm()
        else:
            self._setup_register_full_fsm()
Exemple #3
0
def fixed_to_int_low(value, point):
    if point < 0:
        return 0

    if point == 0:
        return 0

    if isinstance(value, (int, bool, float)) and isinstance(point, int):
        mag = 2 ** point
        return int(value % mag)

    return vtypes.And(value, vtypes.Repeat(vtypes.Int(1, 1), point))
Exemple #4
0
    def write_data(self, data, counter=None, cond=None):
        """ 
        @return ack, last
        """

        if self._write_disabled:
            raise TypeError('Write disabled.')

        if counter is not None and not isinstance(counter, vtypes.Reg):
            raise TypeError("counter must be Reg or None.")

        if counter is None:
            counter = self.write_counters[-1]

        if cond is not None:
            self.seq.If(cond)

        ack = vtypes.Ands(counter > 0,
                          vtypes.Ors(self.wdata.wready, vtypes.Not(self.wdata.wvalid)))
        last = self.m.TmpReg(initval=0)

        self.seq.If(vtypes.Ands(ack, counter > 0))(
            self.wdata.wdata(data),
            self.wdata.wvalid(1),
            self.wdata.wlast(0),
            self.wdata.wstrb(vtypes.Repeat(
                vtypes.Int(1, 1), (self.wdata.datawidth // 8))),
            counter.dec()
        )
        self.seq.Then().If(counter == 1)(
            self.wdata.wlast(1),
            last(1)
        )

        # de-assert
        self.seq.Delay(1)(
            self.wdata.wvalid(0),
            self.wdata.wlast(0),
            last(0)
        )

        # retry
        self.seq.If(vtypes.Ands(self.wdata.wvalid, vtypes.Not(self.wdata.wready)))(
            self.wdata.wvalid(self.wdata.wvalid),
            self.wdata.wlast(self.wdata.wlast),
            last(last)
        )

        return ack, last
Exemple #5
0
    def __init__(self,
                 m,
                 name,
                 clk,
                 rst,
                 datawidth=32,
                 addrwidth=32,
                 noio=False,
                 length=4,
                 fsm_as_module=False):

        AXISLite.__init__(self, m, name, clk, rst, datawidth, addrwidth, noio)

        self.fsm_as_module = fsm_as_module

        if not isinstance(length, int):
            raise TypeError("length must be 'int', not '%s'" %
                            str(type(length)))

        self.register = [
            self.m.Reg('_'.join(['', self.name, 'register',
                                 '%d' % i]),
                       width=self.datawidth,
                       initval=0,
                       signed=True) for i in range(length)
        ]
        self.flag = [
            self.m.Reg('_'.join(['', self.name, 'flag',
                                 '%d' % i]), initval=0) for i in range(length)
        ]
        self.resetval = [
            self.m.Reg('_'.join(['', self.name, 'resetval',
                                 '%d' % i]),
                       width=self.datawidth,
                       initval=0,
                       signed=True) for i in range(length)
        ]
        self.length = length
        self.maskwidth = self.m.Localparam(
            '_'.join(['', self.name, 'maskwidth']), util.log2(length))
        self.mask = self.m.Localparam(
            '_'.join(['', self.name, 'mask']),
            vtypes.Repeat(vtypes.Int(1, 1), self.maskwidth))
        self.shift = self.m.Localparam('_'.join(['', self.name, 'shift']),
                                       util.log2(self.datawidth // 8))

        self._set_register_lite_fsm()
Exemple #6
0
 def visit_Repeat(self, node):
     var = self.visit(node.value)
     times = self.visit(node.times)
     return vtypes.Repeat(var, times)
Exemple #7
0
 def dec_part(self):
     mask = vtypes.Mux(self.point == 0, 0, vtypes.Repeat(
         vtypes.Int(1, width=1), self.point))
     return self & mask
Exemple #8
0
    def write_dataflow(self, data, counter=None, cond=None, when=None):
        """ 
        @return done
        """

        if self._write_disabled:
            raise TypeError('Write disabled.')

        if counter is not None and not isinstance(counter, vtypes.Reg):
            raise TypeError("counter must be Reg or None.")

        if counter is None:
            counter = self.write_counters[-1]

        ack = vtypes.Ands(counter > 0,
                          vtypes.Ors(self.wdata.wready, vtypes.Not(self.wdata.wvalid)))
        last = self.m.TmpReg(initval=0)

        if cond is None:
            cond = ack
        else:
            cond = (cond, ack)

        raw_data, raw_valid = data.read(cond=cond)

        when_cond = make_condition(when, ready=cond)
        if when_cond is not None:
            raw_valid = vtypes.Ands(when_cond, raw_valid)

        # write condition
        self.seq.If(raw_valid)

        self.seq.If(vtypes.Ands(ack, counter > 0))(
            self.wdata.wdata(raw_data),
            self.wdata.wvalid(1),
            self.wdata.wlast(0),
            self.wdata.wstrb(vtypes.Repeat(
                vtypes.Int(1, 1), (self.wdata.datawidth // 8))),
            counter.dec()
        )
        self.seq.Then().If(counter == 1)(
            self.wdata.wlast(1),
            last(1)
        )

        # de-assert
        self.seq.Delay(1)(
            self.wdata.wvalid(0),
            self.wdata.wlast(0),
            last(0)
        )

        # retry
        self.seq.If(vtypes.Ands(self.wdata.wvalid, vtypes.Not(self.wdata.wready)))(
            self.wdata.wvalid(self.wdata.wvalid),
            self.wdata.wlast(self.wdata.wlast),
            last(last)
        )

        done = last

        return done