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()
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
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
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
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
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
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()
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), ]
def _declr(self): addClkRstn(self) with self._paramsShared(): self.bus = self._intfCls() self.decoded = StructIntf( self.STRUCT_TEMPLATE, instantiateFieldFn=self._mkFieldInterface)._m()
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
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
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
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
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)
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)
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()
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()
def _declr(self): StructIntf._declr(self) self._select = Handshaked(masterDir=DIRECTION.IN) self._select.DATA_WIDTH = log2ceil(len(self._dtype.fields))
def _declr(self): StructIntf._declr(self) self._select = Handshaked() self._select.DATA_WIDTH = log2ceil(len(self._dtype.fields))
def _declr(self): StructIntf._declr(self) self._select = Handshaked() self._select.DATA_WIDTH.set(log2ceil(len(self._structT.fields)))