def _createWriteTransactionElement(self, addrTableItem, dataList, addrOffset=0, isFifo=False): """Returns a Write Request transaction element (i.e. unmasked/block write) addrTableItem: The relevant address table item you want to perform the write transaction on. dataList: The list of 32-bit numbers you want to write (the list size defines the write depth) addrOffset: The offset on the address specified within the address table item, default is 0. isFifo: False gives a normal write transaction; True gives a non-incrementing write transaction (i.e. same addr many times). """ for value in dataList: if not uInt32Compatible(value): raise ChipsException("Write transaction creation error: cannot create a write transaction with data " \ "values (" + hex(value) +") that are not valid 32-bit unsigned integers!") typeId = IPbusHeader.TYPE_ID_WRITE if isFifo: typeId = IPbusHeader.TYPE_ID_NON_INCR_WRITE writeHeader = IPbusHeader.makeHeader(ChipsBusBase.IPBUS_PROTOCOL_VER, self._getTransactionId(), len(dataList), typeId, IPbusHeader.INFO_CODE_REQUEST) writeBody = [addrTableItem.getAddress() + addrOffset] + dataList return TransactionElement.makeFromHeaderAndBody(writeHeader, writeBody)
def _createByteOrderTransactionElement(self): """Returns a Byte-Order Request transaction element. Note: Byte-order transactions will always and exclusively have transactionId = 0. """ byteOrderHeader = IPbusHeader.makeHeader(ChipsBusBase.IPBUS_PROTOCOL_VER, 0, 0, IPbusHeader.TYPE_ID_BYTE_ORDER, 0, 0) return TransactionElement.makeFromHeaderAndBody(byteOrderHeader)
def _createReadTransactionElement(self, addrTableItem, readDepth = 1, addrOffset = 0, isFifo = False): """Returns a Read Request transaction element addrTableItem: The relevant address table item you want to perform the write transaction on. readDepth: The depth of the read; default is 1, which would be a single 32-bit register read. addrOffset: The offset on the address specified within the address table item, default is 0. isFifo: False gives a normal read transaction; True gives a non-incrementing read transaction (i.e. same addr many times). """ typeId = IPbusHeader.TYPE_ID_READ if isFifo: typeId = IPbusHeader.TYPE_ID_NON_INCR_READ readHeader = IPbusHeader.makeHeader(ChipsBusBase.IPBUS_PROTOCOL_VER, self._getTransactionId(), readDepth, typeId, IPbusHeader.INFO_CODE_REQUEST) readBody = [addrTableItem.getAddress() + addrOffset] return TransactionElement.makeFromHeaderAndBody(readHeader, readBody)
def _createRMWBitsTransactionElement(self, addrTableItem, dataU32, addrOffset = 0): """Returns a Read/Modify/Write Bits Request transaction element (i.e. masked write) addrTableItem: The relevant address table item you want to perform the RMWBits transaction on. dataU32: The data (32 bits max, or equal in width to the bit-mask). addrOffset: The offset on the address specified within the address table item, default is 0. """ if not uInt32Compatible(dataU32): raise ChipsException("Read-Modify-Write Bits transaction creation error: cannot create a RMW-bits " \ "transaction with data values (" + hex(dataU32) +") that are not valid 32-bit " \ "unsigned integers!") rmwHeader = IPbusHeader.makeHeader(ChipsBus.IPBUS_PROTOCOL_VER, self._getTransactionId(), 1, IPbusHeader.TYPE_ID_RMW_BITS, IPbusHeader.INFO_CODE_REQUEST) rmwBody = [addrTableItem.getAddress() + addrOffset, \ uInt32BitFlip(addrTableItem.getMask()), \ addrTableItem.shiftDataToMask(dataU32)] return TransactionElement.makeFromHeaderAndBody(rmwHeader, rmwBody)
def _createWriteTransactionElement(self, addrTableItem, dataList, addrOffset = 0, isFifo = False): """Returns a Write Request transaction element (i.e. unmasked/block write) addrTableItem: The relevant address table item you want to perform the write transaction on. dataList: The list of 32-bit numbers you want to write (the list size defines the write depth) addrOffset: The offset on the address specified within the address table item, default is 0. isFifo: False gives a normal write transaction; True gives a non-incrementing write transaction (i.e. same addr many times). """ for value in dataList: if not uInt32Compatible(value): raise ChipsException("Write transaction creation error: cannot create a write transaction with data " \ "values (" + hex(value) +") that are not valid 32-bit unsigned integers!") typeId = IPbusHeader.TYPE_ID_WRITE if isFifo: typeId = IPbusHeader.TYPE_ID_NON_INCR_WRITE writeHeader = IPbusHeader.makeHeader(ChipsBusBase.IPBUS_PROTOCOL_VER, self._getTransactionId(), len(dataList), typeId, IPbusHeader.INFO_CODE_REQUEST) writeBody = [addrTableItem.getAddress() + addrOffset] + dataList return TransactionElement.makeFromHeaderAndBody(writeHeader, writeBody)