From c23caecdba47a5e44d825185cbde119ab8fd0175 Mon Sep 17 00:00:00 2001 From: Kennedy Caisley Date: Wed, 27 May 2026 18:18:49 +0200 Subject: [PATCH 1/2] fix(docs): Add missing pointers to README.rst files in docs --- .../{Readme.rst => README.rst} | 0 .../tdl_tdc/{Readme.rst => README.rst} | 0 docs/modules.rst | 65 +++++++++++++++++++ 3 files changed, 65 insertions(+) rename basil/firmware/arduino/EnvironmentReadout/{Readme.rst => README.rst} (100%) rename basil/firmware/modules/tdl_tdc/{Readme.rst => README.rst} (100%) diff --git a/basil/firmware/arduino/EnvironmentReadout/Readme.rst b/basil/firmware/arduino/EnvironmentReadout/README.rst similarity index 100% rename from basil/firmware/arduino/EnvironmentReadout/Readme.rst rename to basil/firmware/arduino/EnvironmentReadout/README.rst diff --git a/basil/firmware/modules/tdl_tdc/Readme.rst b/basil/firmware/modules/tdl_tdc/README.rst similarity index 100% rename from basil/firmware/modules/tdl_tdc/Readme.rst rename to basil/firmware/modules/tdl_tdc/README.rst diff --git a/docs/modules.rst b/docs/modules.rst index 1bc6cb42..a2d60731 100644 --- a/docs/modules.rst +++ b/docs/modules.rst @@ -144,6 +144,32 @@ No Python driver — this module operates autonomously in the FPGA fabric. .. autoclass:: tdc_s3 :members: +.. !!!!!!!!!!!!! +.. !TDL_TDC! +.. !!!!!!!!!!!!! + +.. include:: ../basil/firmware/modules/tdl_tdc/README.rst + +**Driver:** + +.. automodule:: basil.HL.tdl_tdc + +.. autoclass:: tdl_tdc + :members: + +.. !!!!!!!!!!!!! +.. !TIMESTAMP! +.. !!!!!!!!!!!!! + +.. include:: ../basil/firmware/modules/timestamp/README.rst + +**Driver:** + +.. automodule:: basil.HL.timestamp + +.. autoclass:: timestamp + :members: + .. !!!!!!!!!!!!! .. !BRAM_FIFO! .. !!!!!!!!!!!!! @@ -171,6 +197,19 @@ No Python driver — this module operates autonomously in the FPGA fabric. .. autoclass:: fadc_rx :members: +.. !!!!!!!!!!!!! +.. !M26_RX! +.. !!!!!!!!!!!!! + +.. include:: ../basil/firmware/modules/m26_rx/README.rst + +**Driver:** + +.. automodule:: basil.HL.m26_rx + +.. autoclass:: m26_rx + :members: + .. !!!!!!!!!!!!! .. !I2C! .. !!!!!!!!!!!!! @@ -184,7 +223,18 @@ No Python driver — this module operates autonomously in the FPGA fabric. .. autoclass:: i2c :members: +.. !!!!!!!!!!!!! +.. !JTAG_MASTER! +.. !!!!!!!!!!!!! + +.. include:: ../basil/firmware/modules/jtag_master/README.rst + +**Driver:** +.. automodule:: basil.HL.JtagMaster + +.. autoclass:: JtagMaster + :members: .. !!!!!!!!!!!!! .. !UART! @@ -198,3 +248,18 @@ No Python driver — this module operates autonomously in the FPGA fabric. .. !!!!!!!!!!!!! .. include:: ../basil/firmware/modules/utils/README.rst + +.. !!!!!!!!!!!!! +.. !ARDUINO FIRMWARE! +.. !!!!!!!!!!!!! + +Arduino firmware +================ + +.. include:: ../basil/firmware/arduino/EnvironmentReadout/README.rst + +.. include:: ../basil/firmware/arduino/NTCReadout/README.rst + +.. include:: ../basil/firmware/arduino/RelayBoard/README.rst + +.. include:: ../basil/firmware/arduino/SerialToI2C/README.rst From 18352ccb12aa6ea767bc34d50ddd8c3d70bcf6b5 Mon Sep 17 00:00:00 2001 From: Kennedy Caisley Date: Thu, 28 May 2026 12:57:26 +0200 Subject: [PATCH 2/2] docs: document missing firmware READMEs --- basil/HL/bram_fifo.py | 31 +- basil/HL/sram_fifo.py | 280 ++++++++++-------- .../arduino/EnvironmentReadout/README.rst | 4 +- basil/firmware/modules/sram_fifo/README.rst | 79 +++++ basil/firmware/modules/tdl_tdc/README.rst | 4 +- docs/README.md | 53 ++++ docs/modules.rst | 15 +- docs/requirements.txt | 1 + pyproject.toml | 4 + 9 files changed, 341 insertions(+), 130 deletions(-) create mode 100644 basil/firmware/modules/sram_fifo/README.rst create mode 100644 docs/README.md diff --git a/basil/HL/bram_fifo.py b/basil/HL/bram_fifo.py index f3affc2c..9e1a1d26 100644 --- a/basil/HL/bram_fifo.py +++ b/basil/HL/bram_fifo.py @@ -16,7 +16,16 @@ class bram_fifo(RegisterHardwareLayer): - """BRAM FIFO controller interface for bram_fifo FPGA module.""" + """BRAM-backed FIFO controller. + + The corresponding firmware module stores incoming 32-bit FIFO words in + FPGA BRAM. The regular ``base_addr`` configuration key addresses the + control registers, while ``base_data_addr`` must point to the 32-bit data + window used by :meth:`get_data`. + + ``FIFO_SIZE`` reports the amount of buffered data in bytes. The driver + rounds this down to complete 32-bit words before reading data. + """ _registers = { "RESET": {"descr": {"addr": 0, "size": 8, "properties": ["writeonly"]}}, @@ -29,9 +38,20 @@ class bram_fifo(RegisterHardwareLayer): _require_version = "==2" def __init__(self, intf, conf): + """Create a BRAM FIFO driver. + + Parameters + ---------- + intf : basil transfer layer + Interface used for control-register and data-window access. + conf : dict + Driver configuration. Requires ``base_addr`` for the control + registers and ``base_data_addr`` for the FIFO data window. + """ super(bram_fifo, self).__init__(intf, conf) def reset(self): + """Soft-reset the FIFO and wait briefly for the firmware to settle.""" self.RESET = 0 sleep(0.01) # wait some time for initialization @@ -59,12 +79,17 @@ def get_FIFO_INT_SIZE(self): return self.FIFO_INT_SIZE def get_data(self): - """Reading data in BRAM. + """Read all currently buffered complete 32-bit words. + + The method reads ``FIFO_SIZE`` twice and uses the smaller value to + avoid requesting more data while the FIFO size is changing. Data are + read from ``base_data_addr`` and returned as little-endian unsigned + 32-bit integers. Returns ------- array : numpy.ndarray - Array of unsigned integers (32 bit). + Array of unsigned 32-bit FIFO words. """ fifo_int_size_1 = self.FIFO_INT_SIZE fifo_int_size_2 = self.FIFO_INT_SIZE diff --git a/basil/HL/sram_fifo.py b/basil/HL/sram_fifo.py index 19413ae8..33bd7f6a 100644 --- a/basil/HL/sram_fifo.py +++ b/basil/HL/sram_fifo.py @@ -1,122 +1,158 @@ -# -# ------------------------------------------------------------ -# Copyright (c) All rights reserved -# SiLab, Institute of Physics, University of Bonn -# ------------------------------------------------------------ -# - -import logging -from time import sleep - -import numpy as np - -from basil.HL.RegisterHardwareLayer import RegisterHardwareLayer - -logger = logging.getLogger(__name__) - - -class sram_fifo(RegisterHardwareLayer): - """SRAM FIFO controller interface for sram_fifo FPGA module.""" - - _registers = { - "RESET": {"descr": {"addr": 0, "size": 8, "properties": ["writeonly"]}}, - "VERSION": {"descr": {"addr": 0, "size": 8, "properties": ["ro"]}}, - "ALMOST_FULL_THRESHOLD": {"descr": {"addr": 1, "size": 8}}, - "ALMOST_EMPTY_THRESHOLD": {"descr": {"addr": 2, "size": 8}}, - "READ_ERROR_COUNTER": {"descr": {"addr": 3, "size": 8, "properties": ["ro"]}}, - "FIFO_SIZE": {"descr": {"addr": 4, "size": 32, "properties": ["ro"]}}, - } - _require_version = "==2" - - def __init__(self, intf, conf): - super(sram_fifo, self).__init__(intf, conf) - - def reset(self): - self.RESET = 0 - sleep(0.01) # wait some time for initialization - - def set_almost_full_threshold(self, value): - self.ALMOST_FULL_THRESHOLD = value # no get function possible - - def set_almost_empty_threshold(self, value): - self.ALMOST_EMPTY_THRESHOLD = value # no get function possible - - def get_fifo_size(self): - """*Deprecated* Get FIFO size in units of bytes (8 bit). - - Returns - ------- - fifo_size : int - FIFO size in units of bytes (8 bit). - """ - logger.warning("Deprecated: Use get_FIFO_SIZE()") - return self.FIFO_SIZE - - @property - def FIFO_INT_SIZE(self): - """Get FIFO size in units of integers (32 bit). - - Returns - ------- - fifo_size : int - FIFO size in units of integers (32 bit). - """ - fifo_size = self.FIFO_SIZE - # sometimes reading of FIFO size happens during writing to SRAM, but we want to have a multiplicity of 32 bits - return int((fifo_size - (fifo_size % 4)) / 4) - - def get_fifo_int_size(self): - """*Deprecated* Get FIFO size in units of integers (32 bit). - - Returns - ------- - fifo_size : int - FIFO size in units of integers (32 bit). - """ - logger.warning("Deprecated: Use get_FIFO_INT_SIZE()") - return self.FIFO_INT_SIZE - - def get_FIFO_INT_SIZE(self): - """Get FIFO size in units of integers (32 bit). - - Returns - ------- - fifo_size : int - FIFO size in units of integers (32 bit). - """ - return self.FIFO_INT_SIZE - - def get_read_error_counter(self): - """*Deprecated* Get read error counter. - - Returns - ------- - fifo_size : int - Read error counter (read attempts when SRAM is empty). - """ - logger.warning("Deprecated: Use get_READ_ERROR_COUNTER()") - return self.READ_ERROR_COUNTER - - def get_data(self): - """Reading data in SRAM. - - Returns - ------- - array : numpy.ndarray - Array of unsigned integers (32 bit). - """ - fifo_int_size_1 = self.FIFO_INT_SIZE - fifo_int_size_2 = self.FIFO_INT_SIZE - if fifo_int_size_1 > fifo_int_size_2: - fifo_int_size = fifo_int_size_2 # use smaller chunk - logger.warning("Reading wrong FIFO size. Expected: %d <= %d" % (fifo_int_size_1, fifo_int_size_2)) - else: - fifo_int_size = fifo_int_size_1 # use smaller chunk - return np.frombuffer( - self._intf.read(self._conf["base_data_addr"], size=4 * fifo_int_size), dtype=np.dtype(" fifo_int_size_2: + fifo_int_size = fifo_int_size_2 # use smaller chunk + logger.warning("Reading wrong FIFO size. Expected: %d <= %d" % (fifo_int_size_1, fifo_int_size_2)) + else: + fifo_int_size = fifo_int_size_1 # use smaller chunk + return np.frombuffer( + self._intf.read(self._conf["base_data_addr"], size=4 * fifo_int_size), dtype=np.dtype("