# SPDX-License-Identifier: CERN-OHL-S-2.0 """ Copyright (c) 2025 FPGA Ninja, LLC Authors: - Alex Forencich """ import array import logging import struct from collections import deque from cocotb.queue import Queue # Command opcodes CNDM_CMD_OP_NOP = 0x0000 CNDM_CMD_OP_CREATE_EQ = 0x0200 CNDM_CMD_OP_MODIFY_EQ = 0x0201 CNDM_CMD_OP_QUERY_EQ = 0x0202 CNDM_CMD_OP_DESTROY_EQ = 0x0203 CNDM_CMD_OP_CREATE_CQ = 0x0210 CNDM_CMD_OP_MODIFY_CQ = 0x0211 CNDM_CMD_OP_QUERY_CQ = 0x0212 CNDM_CMD_OP_DESTROY_CQ = 0x0213 CNDM_CMD_OP_CREATE_SQ = 0x0220 CNDM_CMD_OP_MODIFY_SQ = 0x0221 CNDM_CMD_OP_QUERY_SQ = 0x0222 CNDM_CMD_OP_DESTROY_SQ = 0x0223 CNDM_CMD_OP_CREATE_RQ = 0x0230 CNDM_CMD_OP_MODIFY_RQ = 0x0231 CNDM_CMD_OP_QUERY_RQ = 0x0232 CNDM_CMD_OP_DESTROY_RQ = 0x0233 CNDM_CMD_OP_CREATE_QP = 0x0240 CNDM_CMD_OP_MODIFY_QP = 0x0241 CNDM_CMD_OP_QUERY_QP = 0x0242 CNDM_CMD_OP_DESTROY_QP = 0x0243 class Port: def __init__(self, driver, index): self.driver = driver self.log = driver.log self.index = index self.hw_regs = driver.hw_regs self.rxq_log_size = (256).bit_length()-1 self.rxq_size = 2**self.rxq_log_size self.rxq_mask = self.rxq_size-1 self.rxq = None self.rxq_prod = 0 self.rxq_cons = 0 self.rx_rqn = 0 self.rxq_db_offs = 0 self.rx_info = [None] * self.rxq_size self.rxcq_log_size = (256).bit_length()-1 self.rxcq_size = 2**self.rxcq_log_size self.rxcq_mask = self.rxcq_size-1 self.rxcq = None self.rxcq_prod = 0 self.rxcq_cons = 0 self.rx_cqn = 0 self.txq_log_size = (256).bit_length()-1 self.txq_size = 2**self.txq_log_size self.txq_mask = self.txq_size-1 self.txq = None self.txq_prod = 0 self.txq_cons = 0 self.tx_sqn = 0 self.txq_db_offs = 0 self.tx_info = [None] * self.txq_size self.txcq_log_size = (256).bit_length()-1 self.txcq_size = 2**self.txcq_log_size self.txcq_mask = self.txcq_size-1 self.txcq = None self.txcq_prod = 0 self.txcq_cons = 0 self.tx_cqn = 0 self.rx_queue = Queue() async def init(self): self.rxcq = self.driver.pool.alloc_region(self.rxcq_size*16) addr = self.rxcq.get_absolute_address(0) rsp = await self.driver.exec_cmd(struct.pack("