def _declr(self):
     addClkRstn(self)
     self.a = HObjList(
         StructIntf(struct0, instantiateFieldFn=self._mkFieldInterface)
         for _ in range(3))
     self.b = HObjList(
         StructIntf(struct0, instantiateFieldFn=self._mkFieldInterface)
         for _ in range(3))._m()
Exemple #2
0
    def _mkFieldInterface(self, structIntf, field):
        """
        Instantiate field interface for fields in structure template of this endpoint

        :return: interface for specified field
        """
        t = field.dtype
        DW = int(self.DATA_WIDTH)

        shouldEnter, shouldUse = self.shouldEnterFn(field)
        if shouldUse:
            if isinstance(t, Bits):
                p = RegCntrl()
                dw = t.bit_length()
            elif isinstance(t, HArray):
                p = BramPort_withoutClk()
                assert isinstance(t.elmType, Bits), t.elmType
                dw = t.elmType.bit_length()
                p.ADDR_WIDTH.set(log2ceil(t.size - 1))
            else:
                raise NotImplementedError(t)

        elif shouldEnter:
            if isinstance(t, HArray):
                if isinstance(t.elmType, Bits):
                    p = HObjList(RegCntrl() for _ in range(int(t.size)))
                    dw = t.elmType.bit_length()
                else:
                    return HObjList(
                        StructIntf(t.elmType,
                                   instantiateFieldFn=self._mkFieldInterface)
                        for _ in range(int(t.size)))
            elif isinstance(t, HStruct):
                return StructIntf(t, instantiateFieldFn=self._mkFieldInterface)
            else:
                raise TypeError(t)

        if isinstance(p, HObjList):
            _p = p
        else:
            _p = [p]

        if dw == DW:
            # use param instead of value to improve readability
            DW = self.DATA_WIDTH
            if isinstance(DW, Param):
                for i in _p:
                    i._replaceParam(i.DATA_WIDTH, DW)
        else:
            for i in _p:
                i.DATA_WIDTH.set(dw)

        return p
Exemple #3
0
    def _mkFieldInterface(self, structIntf: StructIntf, field: HStructField):
        """
        Instantiate field interface for fields in structure template of this endpoint

        :return: interface for specified field
        """
        t = field.dtype
        path = structIntf._field_path / field.name
        shouldEnter, shouldUse = self.shouldEnterFn(self.STRUCT_TEMPLATE, path)

        if shouldUse:
            if isinstance(t, Bits):
                p = BusEndpoint.intf_for_Bits(t)
            elif isinstance(t, HArray):
                p = BramPort_withoutClk()
                assert isinstance(t.element_t, Bits), t.element_t
                p.DATA_WIDTH = t.element_t.bit_length()
                p.ADDR_WIDTH = log2ceil(t.size - 1)
            else:
                raise NotImplementedError(t)

        elif shouldEnter:
            if isinstance(t, HArray):
                e_t = t.element_t
                if isinstance(e_t, Bits):
                    p = HObjList()
                    for i_i in range(int(t.size)):
                        i = BusEndpoint.intf_for_Bits(e_t)
                        structIntf._fieldsToInterfaces[path / i_i] = i
                        p.append(i)
                elif isinstance(e_t, HStruct):
                    p = HObjList(
                        StructIntf(t.element_t,
                                   path / i,
                                   instantiateFieldFn=self._mkFieldInterface)
                        for i in range(int(t.size)))
                    for i in p:
                        i._fieldsToInterfaces = structIntf._fieldsToInterfaces
                else:
                    raise NotImplementedError()
            elif isinstance(t, HStruct):
                p = StructIntf(t,
                               path,
                               instantiateFieldFn=self._mkFieldInterface)
                p._fieldsToInterfaces = structIntf._fieldsToInterfaces
            else:
                raise TypeError(t)

        return p
Exemple #4
0
 def _mkFieldIntf(self, parent: Union[StructIntf, UnionSource],
                  structField: HStructField):
     t = structField.dtype
     path = parent._field_path / structField.name
     if isinstance(t, HUnion):
         i = UnionSource(t, path, parent._instantiateFieldFn)
         i._fieldsToInterfaces = parent._fieldsToInterfaces
         return i
     elif isinstance(t, HStruct):
         i = StructIntf(t, path, parent._instantiateFieldFn)
         i._fieldsToInterfaces = parent._fieldsToInterfaces
         return i
     elif isinstance(t, HStream):
         if self.SHARED_READY:
             raise NotImplementedError(t)
         else:
             i = AxiStream()
             i._updateParamsFrom(self)
             return i
     else:
         if self.SHARED_READY:
             i = VldSynced()
         else:
             i = Handshaked()
         i.DATA_WIDTH = structField.dtype.bit_length()
         return i
    def _mkFieldInterface(self, structIntf, field):
        t = field.dtype

        if isinstance(t, Bits):
            p = RegCntrl()
            dw = t.bit_length()
        elif isinstance(t, HArray):
            if self.shouldEnterFn(field):
                if isinstance(t.elmType, Bits):
                    p = HObjList(RegCntrl() for _ in range(int(t.size)))
                    dw = t.elmType.bit_length()
                else:
                    p = HObjList([
                        StructIntf(t.elmType,
                                   instantiateFieldFn=self._mkFieldInterface)
                        for _ in range(int(t.size))
                    ])
                    return p
            else:
                p = BramPort_withoutClk()
                dw = t.elmType.bit_length()
                p.ADDR_WIDTH.set(log2ceil(int(t.size) - 1))
        else:
            raise NotImplementedError(t)

        p.DATA_WIDTH.set(dw)

        return p
Exemple #6
0
    def _mkFieldInterface(self, structIntf: HStruct, field: HStructField):
        t = field.dtype

        if isinstance(t, Bits):
            p = RegCntrl()
            dw = t.bit_length()
        elif isinstance(t, HArray):
            field_path = structIntf._field_path / field.name
            if self.shouldEnterFn(field_path)[0]:
                if isinstance(t.element_t, Bits):
                    p = HObjList(RegCntrl() for _ in range(int(t.size)))
                    dw = t.element_t.bit_length()
                else:
                    p = HObjList([StructIntf(
                        t.element_t,
                        field_path,
                        instantiateFieldFn=self._mkFieldInterface)
                        for _ in range(int(t.size))])
                    return p
            else:
                p = BramPort_withoutClk()
                dw = t.element_t.bit_length()
                p.ADDR_WIDTH = log2ceil(int(t.size) - 1)
        else:
            raise NotImplementedError(t)

        p.DATA_WIDTH = dw

        return p
Exemple #7
0
    def mkFieldIntf(self, structIntf: Union[StructIntf, UnionSink,
                                            UnionSource], field):
        t = field.dtype
        path = structIntf._field_path / field.name
        if isinstance(t, HUnion):
            p = self.intfCls(t, path, structIntf._instantiateFieldFn)
            p._fieldsToInterfaces = structIntf._fieldsToInterfaces
            return p
        elif isinstance(t, HStruct):
            p = StructIntf(t, path, structIntf._instantiateFieldFn)
            p._fieldsToInterfaces = structIntf._fieldsToInterfaces
            return p
        else:
            p = Handshaked()

        p.DATA_WIDTH = field.dtype.bit_length()
        return p
Exemple #8
0
 def _declr(self):
     addClkRstn(self)
     with self._paramsShared():
         self.bus = Ipif()
         self.reg = IpifReg()
         self.ep = IpifEndpoint(self.STRUCT_TEMPLATE)
         self.decoded = StructIntf(self.STRUCT_TEMPLATE,
                                   self.ep._mkFieldInterface)._m()
Exemple #9
0
 def load_addr_tmp(self, addr_tmp: StructIntf, axi_addr: Optional[Axi4_addr]):
     if axi_addr is None:
         return [
             addr_tmp.addr(None),
             addr_tmp.id(None),
             addr_tmp.len(None),
             addr_tmp.is_w(None),
             addr_tmp.vld(0)
         ]
     else:
         return [
             addr_tmp.addr(axi_addr.addr),
             addr_tmp.id(axi_addr.id),
             addr_tmp.len(axi_addr.len),
             addr_tmp.is_w(axi_addr is self.s.aw),
             addr_tmp.vld(1),
         ]
Exemple #10
0
    def _declr(self):
        addClkRstn(self)

        with self._paramsShared():
            self.bus = self._intfCls()

        self.decoded = StructIntf(
            self.STRUCT_TEMPLATE,
            instantiateFieldFn=self._mkFieldInterface)._m()
Exemple #11
0
    def mkFieldIntf(self, structIntf, frameTmplItem):
        t = frameTmplItem.dtype
        if isinstance(t, HUnion):
            return self.intfCls(t, structIntf._instantiateFieldFn)
        elif isinstance(t, HStruct):
            return StructIntf(t, structIntf._instantiateFieldFn)
        else:
            p = Handshaked()

        p.DATA_WIDTH.set(frameTmplItem.dtype.bit_length())
        return p
Exemple #12
0
 def _mkFieldIntf(self, parent: Union[StructIntf, UnionSource],
                  structField: HStructField):
     t = structField.dtype
     if isinstance(t, HUnion):
         return UnionSource(t, parent._instantiateFieldFn)
     elif isinstance(t, HStruct):
         return StructIntf(t, parent._instantiateFieldFn)
     else:
         if self.SHARED_READY:
             i = VldSynced()
         else:
             i = Handshaked()
         i.DATA_WIDTH.set(structField.dtype.bit_length())
         return i
Exemple #13
0
 def _mkFieldIntf(parent: StructIntf, structField: HStructField):
     """
     Instantiate interface for all members of input type
     """
     t = structField.dtype
     if isinstance(t, HUnion):
         return UnionSink(t, parent._instantiateFieldFn)
     elif isinstance(t, HStruct):
         return StructIntf(t, parent._instantiateFieldFn)
     elif isinstance(t, HStream):
         p = AxiStream()
         p.DATA_WIDTH.set(structField.dtype.elmType.bit_length())
         p.USE_STRB.set(True)
         return p
     else:
         p = Handshaked()
         p.DATA_WIDTH.set(structField.dtype.bit_length())
         return p
Exemple #14
0
 def _mkFieldIntf(self, parent: StructIntf, structField: HStructField):
     """
     Instantiate interface for all members of input type
     """
     t = structField.dtype
     path = parent._field_path / structField.name
     if isinstance(t, HUnion):
         p = UnionSink(t, path, parent._instantiateFieldFn)
         p._fieldsToInterfaces = parent._fieldsToInterfaces
     elif isinstance(t, HStruct):
         p = StructIntf(t, path, parent._instantiateFieldFn)
         p._fieldsToInterfaces = parent._fieldsToInterfaces
     elif isinstance(t, HStream):
         p = AxiStream()
         p._updateParamsFrom(self)
     else:
         p = Handshaked()
         p.DATA_WIDTH = structField.dtype.bit_length()
     return p
Exemple #15
0
    def _declr(self):
        addClkRstn(self)
        self.parseTemplate()
        self.dataIn = StructIntf(self._structT,
                                 self._createInterfaceForField)

        s = self.set = Handshaked()  # data signal is addr of structure to write
        s._replaceParam(s.DATA_WIDTH, self.ADDR_WIDTH)
        # write ack from slave
        self.writeAck = HandshakeSync()._m()

        with self._paramsShared():
            # interface for communication with datapump
            self.wDatapump = AxiWDatapumpIntf()._m()
            self.wDatapump.MAX_LEN.set(self.maxWordIndex() + 1)

        self.frameAssember = AxiS_frameForge(self._structT,
                                             tmpl=self._tmpl,
                                             frames=self._frames)
Exemple #16
0
    def _declr(self):
        addClkRstn(self)
        self.parseTemplate()
        self.dataIn = StructIntf(self._structT, tuple(),
                                 self._createInterfaceForField)

        s = self.set = Handshaked(
        )  # data signal is addr of structure to write
        s.DATA_WIDTH = self.ADDR_WIDTH
        # write ack from slave
        self.writeAck = HandshakeSync()._m()

        with self._paramsShared():
            # interface for communication with datapump
            self.wDatapump = AxiWDatapumpIntf()._m()
            self.wDatapump.MAX_BYTES = self.maxBytesInTransaction()

            self.frameAssember = AxiS_frameDeparser(self._structT,
                                                    tmpl=self._tmpl,
                                                    frames=self._frames)
Exemple #17
0
    def _declr(self):
        addClkRstn(self)
        self.dataOut = StructIntf(self._structT, self._mkFieldIntf)._m()

        g = self.get = Handshaked(
        )  # data signal is addr of structure to download
        g._replaceParam(g.DATA_WIDTH, self.ADDR_WIDTH)
        self.parseTemplate()

        with self._paramsShared():
            # interface for communication with datapump
            self.rDatapump = AxiRDatapumpIntf()._m()
            self.rDatapump.MAX_LEN.set(self.maxWordIndex() + 1)

        with self._paramsShared(exclude={self.ID_WIDTH}):
            self.parser = AxiS_frameParser(self._structT,
                                           tmpl=self._tmpl,
                                           frames=self._frames)
            self.parser.SYNCHRONIZE_BY_LAST.set(False)

        if self.SHARED_READY:
            self.ready = Signal()
Exemple #18
0
    def _declr(self):
        addClkRstn(self)
        self.dataOut = StructIntf(self._structT,
                                  tuple(),
                                  self._mkFieldIntf)._m()

        g = self.get = Handshaked()  # data signal is addr of structure to download
        g.DATA_WIDTH = self.ADDR_WIDTH
        self.parseTemplate()

        with self._paramsShared():
            # interface for communication with datapump
            self.rDatapump = AxiRDatapumpIntf()._m()
            self.rDatapump.MAX_BYTES = self.maxBytesInTransaction()

        with self._paramsShared(exclude=({"ID_WIDTH"}, set())):
            self.parser = AxiS_frameParser(self._structT,
                                           tmpl=self._tmpl,
                                           frames=self._frames)
            self.parser.SYNCHRONIZE_BY_LAST = False

        if self.SHARED_READY:
            self.ready = Signal()
Exemple #19
0
 def _declr(self):
     StructIntf._declr(self)
     self._select = Handshaked(masterDir=DIRECTION.IN)
     self._select.DATA_WIDTH = log2ceil(len(self._dtype.fields))
Exemple #20
0
 def _declr(self):
     StructIntf._declr(self)
     self._select = Handshaked()
     self._select.DATA_WIDTH = log2ceil(len(self._dtype.fields))
Exemple #21
0
 def _declr(self):
     StructIntf._declr(self)
     self._select = Handshaked()
     self._select.DATA_WIDTH.set(log2ceil(len(self._structT.fields)))