mirror of
https://github.com/m-labs/artiq.git
synced 2025-02-03 06:10:18 +08:00
Clean up (doc-strings etc.) in artiq.coredevice.urukul
This commit is contained in:
parent
ef7f730ea9
commit
1204c15351
@ -142,6 +142,13 @@ class _DummySync:
|
|||||||
|
|
||||||
|
|
||||||
class CPLDVersionManager(ABC):
|
class CPLDVersionManager(ABC):
|
||||||
|
"""
|
||||||
|
Base class for managing CPLD version-specific configurations.
|
||||||
|
|
||||||
|
Subclasses should implement the required methods based on the specific
|
||||||
|
version of the CPLD being used.
|
||||||
|
"""
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_write(self, cpld, cfg):
|
def cfg_write(self, cpld, cfg):
|
||||||
@ -167,19 +174,27 @@ class CPLDVersionManager(ABC):
|
|||||||
def set_profile(self, cpld, channel, profile):
|
def set_profile(self, cpld, channel, profile):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def _configure_bit(self, cpld, bit_offset: TInt32, channel: TInt32, on: TBool):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def _configure_all_bits(self, cpld, bit_offset: TInt32, state: TInt32):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
pass
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu_all(self, cpld, state: TInt32):
|
||||||
|
pass
|
||||||
|
|
||||||
def _not_implemented(self, *args, **kwargs):
|
def _not_implemented(self, *args, **kwargs):
|
||||||
raise NotImplementedError(
|
raise NotImplementedError(
|
||||||
"This function is not implemented for this Urukul version."
|
"This function is not implemented for this Urukul version."
|
||||||
)
|
)
|
||||||
|
|
||||||
@kernel
|
|
||||||
def _configure_bit(self, cpld, bit_offset: TInt32, channel: TInt32, on: TBool):
|
|
||||||
self._not_implemented()
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def _configure_all_bits(self, cpld, bit_offset: TInt32, state: TInt32):
|
|
||||||
self._not_implemented()
|
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_att_en(self, cpld, channel: TInt32, on: TBool):
|
def cfg_att_en(self, cpld, channel: TInt32, on: TBool):
|
||||||
self._not_implemented()
|
self._not_implemented()
|
||||||
@ -212,16 +227,14 @@ class CPLDVersionManager(ABC):
|
|||||||
def cfg_drhold_all(self, cpld, state: TInt32):
|
def cfg_drhold_all(self, cpld, state: TInt32):
|
||||||
self._not_implemented()
|
self._not_implemented()
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_mask_nu(self, cpld, channel: TInt32, on: TBool):
|
|
||||||
self._not_implemented()
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_mask_nu_all(self, cpld, state: TInt32):
|
|
||||||
self._not_implemented()
|
|
||||||
|
|
||||||
|
|
||||||
class ProtoRev8(CPLDVersionManager):
|
class ProtoRev8(CPLDVersionManager):
|
||||||
|
"""
|
||||||
|
Implementation of the CPLD for Urkul ProtoRev8.
|
||||||
|
|
||||||
|
This class extends `CPLDVersionManager` and provides methods to configure
|
||||||
|
and interact with the ProtoRev8 version of the CPLD.
|
||||||
|
"""
|
||||||
|
|
||||||
# ProtoRev8 CFG configuration register bit offsets
|
# ProtoRev8 CFG configuration register bit offsets
|
||||||
CFG_IO_UPDATE = 12
|
CFG_IO_UPDATE = 12
|
||||||
@ -297,10 +310,9 @@ class ProtoRev8(CPLDVersionManager):
|
|||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def init(self, cpld):
|
def init(self, cpld):
|
||||||
"""Initialize and detect Urukul.
|
"""Initialize Urukul with ProtoRev8.
|
||||||
|
|
||||||
Resets the DDS I/O interface and verifies correct CPLD gateware
|
Resets the DDS I/O interface.
|
||||||
version.
|
|
||||||
Does not pulse the DDS ``MASTER_RESET`` as that confuses the AD9910.
|
Does not pulse the DDS ``MASTER_RESET`` as that confuses the AD9910.
|
||||||
"""
|
"""
|
||||||
cfg = cpld.cfg_reg
|
cfg = cpld.cfg_reg
|
||||||
@ -325,14 +337,64 @@ class ProtoRev8(CPLDVersionManager):
|
|||||||
|
|
||||||
The PROFILE pins are common to all four DDS channels.
|
The PROFILE pins are common to all four DDS channels.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3). Unused (here for backwards compatability).
|
||||||
:param profile: PROFILE pins in numeric representation (0-7).
|
:param profile: PROFILE pins in numeric representation (0-7).
|
||||||
"""
|
"""
|
||||||
cfg = cpld.cfg_reg & ~(7 << CFG_PROFILE)
|
cfg = cpld.cfg_reg & ~(7 << CFG_PROFILE)
|
||||||
cfg |= (profile & 7) << CFG_PROFILE
|
cfg |= (profile & 7) << CFG_PROFILE
|
||||||
cpld.cfg_write(cfg)
|
cpld.cfg_write(cfg)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def _configure_bit(self, cpld, bit_offset: TInt32, channel: TInt32, on: TBool):
|
||||||
|
"""Configure a single bit in the configuration register.
|
||||||
|
|
||||||
|
:param bit_offset: Base bit offset for the configuration type
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
c = cpld.cfg_reg
|
||||||
|
if on:
|
||||||
|
c |= 1 << (bit_offset + channel)
|
||||||
|
else:
|
||||||
|
c &= ~(1 << (bit_offset + channel))
|
||||||
|
cpld.cfg_write(c)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def _configure_all_bits(self, cpld, bit_offset: TInt32, state: TInt32):
|
||||||
|
"""Configure all four bits at a specific bit offset in the configuration register.
|
||||||
|
|
||||||
|
:param bit_offset: bit offset for the configuration bits
|
||||||
|
:param state: State as a 4-bit integer
|
||||||
|
"""
|
||||||
|
cpld.cfg_write(
|
||||||
|
(cpld.cfg_reg & ~(0xF << bit_offset)) | (int64(state) << bit_offset)
|
||||||
|
)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
"""Configure the MASK_NU bit for the given channel in the configuration register.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
cpld._configure_bit(ProtoRev8.CFG_MASK_NU, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu_all(self, cpld, state: TInt32):
|
||||||
|
"""Configure all four MASK_NU bits in the configuration register.
|
||||||
|
|
||||||
|
:param state: MASK_NU state as a 4-bit integer.
|
||||||
|
"""
|
||||||
|
cpld._configure_all_bits(ProtoRev8.CFG_MASK_NU, state)
|
||||||
|
|
||||||
|
|
||||||
class ProtoRev9(CPLDVersionManager):
|
class ProtoRev9(CPLDVersionManager):
|
||||||
|
"""
|
||||||
|
Implementation of the CPLD for Urkul ProtoRev9.
|
||||||
|
|
||||||
|
This class extends `CPLDVersionManager` and provides methods to configure
|
||||||
|
and interact with the ProtoRev9 version of the CPLD.
|
||||||
|
"""
|
||||||
|
|
||||||
# ProtoRev9 CFG configuration register bit offsets
|
# ProtoRev9 CFG configuration register bit offsets
|
||||||
CFG_OSK = 20
|
CFG_OSK = 20
|
||||||
@ -427,10 +489,9 @@ class ProtoRev9(CPLDVersionManager):
|
|||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def init(self, cpld):
|
def init(self, cpld):
|
||||||
"""Initialize and detect Urukul.
|
"""Initialize Urukul with ProtoRev9.
|
||||||
|
|
||||||
Resets the DDS I/O interface and verifies correct CPLD gateware
|
Resets the DDS I/O interface.
|
||||||
version.
|
|
||||||
Does not pulse the DDS ``MASTER_RESET`` as that confuses the AD9910.
|
Does not pulse the DDS ``MASTER_RESET`` as that confuses the AD9910.
|
||||||
"""
|
"""
|
||||||
cfg = cpld.cfg_reg
|
cfg = cpld.cfg_reg
|
||||||
@ -451,7 +512,7 @@ class ProtoRev9(CPLDVersionManager):
|
|||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def set_profile(self, cpld, channel: TInt32, profile: TInt32):
|
def set_profile(self, cpld, channel: TInt32, profile: TInt32):
|
||||||
"""Set the CFG.PROFILE[0:2] pins for a channel.
|
"""Set the CFG.PROFILE[0:2] pins for the given channel.
|
||||||
|
|
||||||
:param profile: PROFILE pins in numeric representation (0-7).
|
:param profile: PROFILE pins in numeric representation (0-7).
|
||||||
:param channel: Channel (0-3).
|
:param channel: Channel (0-3).
|
||||||
@ -477,86 +538,18 @@ class ProtoRev9(CPLDVersionManager):
|
|||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def _configure_all_bits(self, cpld, bit_offset: TInt32, state: TInt32):
|
def _configure_all_bits(self, cpld, bit_offset: TInt32, state: TInt32):
|
||||||
"""Configure all four bits of a specific type in the configuration register.
|
"""Configure all four bits at a specific bit offset in the configuration register.
|
||||||
|
|
||||||
:param bit_offset: Base bit offset for the configuration type
|
:param bit_offset: bit offset for the configuration bits
|
||||||
:param state: State as a 4-bit integer
|
:param state: State as a 4-bit integer
|
||||||
"""
|
"""
|
||||||
cpld.cfg_write(
|
cpld.cfg_write(
|
||||||
(cpld.cfg_reg & ~(int64(0xF) << bit_offset)) | (int64(state) << bit_offset)
|
(cpld.cfg_reg & ~(int64(0xF) << bit_offset)) | (int64(state) << bit_offset)
|
||||||
)
|
)
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_att_en(self, cpld, channel: TInt32, on: TBool):
|
|
||||||
"""Configure the ATT_EN bit through the configuration register.
|
|
||||||
|
|
||||||
:param channel: Channel index (0-3)
|
|
||||||
:param on: Switch value
|
|
||||||
"""
|
|
||||||
cpld._configure_bit(ProtoRev9.CFG_ATT_EN, channel, on)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_att_en_all(self, cpld, state: TInt32):
|
|
||||||
"""Configure all four ATT_EN bits through the configuration register.
|
|
||||||
|
|
||||||
:param state: OSK state as a 4-bit integer.
|
|
||||||
"""
|
|
||||||
cpld._configure_all_bits(ProtoRev9.CFG_ATT_EN, state)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_osk(self, cpld, channel: TInt32, on: TBool):
|
|
||||||
"""Configure the OSK bit through the configuration register.
|
|
||||||
|
|
||||||
:param channel: Channel index (0-3)
|
|
||||||
:param on: Switch value
|
|
||||||
"""
|
|
||||||
cpld._configure_bit(ProtoRev9.CFG_OSK, channel, on)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_osk_all(self, cpld, state: TInt32):
|
|
||||||
"""Configure all four OSK bits through the configuration register.
|
|
||||||
|
|
||||||
:param state: OSK state as a 4-bit integer.
|
|
||||||
"""
|
|
||||||
cpld._configure_all_bits(ProtoRev9.CFG_OSK, state)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_drctl(self, cpld, channel: TInt32, on: TBool):
|
|
||||||
"""Configure the DRCTL bit through the configuration register.
|
|
||||||
|
|
||||||
:param channel: Channel index (0-3)
|
|
||||||
:param on: Switch value
|
|
||||||
"""
|
|
||||||
cpld._configure_bit(ProtoRev9.CFG_DRCTL, channel, on)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_drctl_all(self, cpld, state: TInt32):
|
|
||||||
"""Configure all four DRCTL bits through the configuration register.
|
|
||||||
|
|
||||||
:param state: DRCTL state as a 4-bit integer.
|
|
||||||
"""
|
|
||||||
cpld._configure_all_bits(ProtoRev9.CFG_DRCTL, state)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_drhold(self, cpld, channel: TInt32, on: TBool):
|
|
||||||
"""Configure the DRHOLD bit through the configuration register.
|
|
||||||
|
|
||||||
:param channel: Channel index (0-3)
|
|
||||||
:param on: Switch value
|
|
||||||
"""
|
|
||||||
cpld._configure_bit(ProtoRev9.CFG_DRHOLD, channel, on)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_drhold_all(self, cpld, state: TInt32):
|
|
||||||
"""Configure all four DRHOLD bits through the configuration register.
|
|
||||||
|
|
||||||
:param state: DRHOLD state as a 4-bit integer.
|
|
||||||
"""
|
|
||||||
cpld._configure_all_bits(ProtoRev9.CFG_DRHOLD, state)
|
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_mask_nu(self, cpld, channel: TInt32, on: TBool):
|
def cfg_mask_nu(self, cpld, channel: TInt32, on: TBool):
|
||||||
"""Configure the MASK_NU bits through the configuration register.
|
"""Configure the MASK_NU bit for the given channel in the configuration register.
|
||||||
|
|
||||||
:param channel: Channel index (0-3)
|
:param channel: Channel index (0-3)
|
||||||
:param on: Switch value
|
:param on: Switch value
|
||||||
@ -565,14 +558,89 @@ class ProtoRev9(CPLDVersionManager):
|
|||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_mask_nu_all(self, cpld, state: TInt32):
|
def cfg_mask_nu_all(self, cpld, state: TInt32):
|
||||||
"""Configure all four MASK_NU bits through the configuration register.
|
"""Configure all four MASK_NU bits in the configuration register.
|
||||||
|
|
||||||
:param state: MASK_NU state as a 4-bit integer.
|
:param state: MASK_NU state as a 4-bit integer.
|
||||||
"""
|
"""
|
||||||
cpld._configure_all_bits(ProtoRev9.CFG_MASK_NU, state)
|
cpld._configure_all_bits(ProtoRev9.CFG_MASK_NU, state)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_att_en(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
"""Configure the ATT_EN bit for the given channel in the configuration register.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
cpld._configure_bit(ProtoRev9.CFG_ATT_EN, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_att_en_all(self, cpld, state: TInt32):
|
||||||
|
"""Configure all four ATT_EN bits in the configuration register.
|
||||||
|
|
||||||
|
:param state: OSK state as a 4-bit integer.
|
||||||
|
"""
|
||||||
|
cpld._configure_all_bits(ProtoRev9.CFG_ATT_EN, state)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_osk(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
"""Configure the OSK bit for the given channel in the configuration register.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
cpld._configure_bit(ProtoRev9.CFG_OSK, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_osk_all(self, cpld, state: TInt32):
|
||||||
|
"""Configure all four OSK bits in the configuration register.
|
||||||
|
|
||||||
|
:param state: OSK state as a 4-bit integer.
|
||||||
|
"""
|
||||||
|
cpld._configure_all_bits(ProtoRev9.CFG_OSK, state)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_drctl(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
"""Configure the DRCTL bit for the given channel in the configuration register.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
cpld._configure_bit(ProtoRev9.CFG_DRCTL, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_drctl_all(self, cpld, state: TInt32):
|
||||||
|
"""Configure all four DRCTL bits in the configuration register.
|
||||||
|
|
||||||
|
:param state: DRCTL state as a 4-bit integer.
|
||||||
|
"""
|
||||||
|
cpld._configure_all_bits(ProtoRev9.CFG_DRCTL, state)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_drhold(self, cpld, channel: TInt32, on: TBool):
|
||||||
|
"""Configure the DRHOLD bit for the given channel in the configuration register.
|
||||||
|
|
||||||
|
:param channel: Channel index (0-3)
|
||||||
|
:param on: Switch value
|
||||||
|
"""
|
||||||
|
cpld._configure_bit(ProtoRev9.CFG_DRHOLD, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_drhold_all(self, cpld, state: TInt32):
|
||||||
|
"""Configure all four DRHOLD bits in the configuration register.
|
||||||
|
|
||||||
|
:param state: DRHOLD state as a 4-bit integer.
|
||||||
|
"""
|
||||||
|
cpld._configure_all_bits(ProtoRev9.CFG_DRHOLD, state)
|
||||||
|
|
||||||
|
|
||||||
class CPLDVersionManagerFactory:
|
class CPLDVersionManagerFactory:
|
||||||
|
"""
|
||||||
|
Factory class for creating CPLD version managers.
|
||||||
|
|
||||||
|
This class provides a method to instantiate the appropriate `CPLDVersionManager` subclass
|
||||||
|
based on the CPLD protocol revision.
|
||||||
|
"""
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_version(proto_rev: int) -> CPLDVersionManager:
|
def get_version(proto_rev: int) -> CPLDVersionManager:
|
||||||
if proto_rev == STA_PROTO_REV_8:
|
if proto_rev == STA_PROTO_REV_8:
|
||||||
@ -615,6 +683,7 @@ class CPLD:
|
|||||||
:param sync_div: ``SYNC_IN`` generator divider. The ratio between the coarse
|
:param sync_div: ``SYNC_IN`` generator divider. The ratio between the coarse
|
||||||
RTIO frequency and the ``SYNC_IN`` generator frequency (default: 2 if
|
RTIO frequency and the ``SYNC_IN`` generator frequency (default: 2 if
|
||||||
`sync_device` was specified).
|
`sync_device` was specified).
|
||||||
|
:param proto_rev: CPLD protocol revision
|
||||||
:param core_device: Core device name
|
:param core_device: Core device name
|
||||||
|
|
||||||
If the clocking is incorrect (for example, setting ``clk_sel`` to the
|
If the clocking is incorrect (for example, setting ``clk_sel`` to the
|
||||||
@ -730,6 +799,14 @@ class CPLD:
|
|||||||
def _configure_all_bits(self, bit_offset: TInt32, state: TInt32):
|
def _configure_all_bits(self, bit_offset: TInt32, state: TInt32):
|
||||||
self.version_manager._configure_all_bits(self, bit_offset, state)
|
self.version_manager._configure_all_bits(self, bit_offset, state)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu(self, channel: TInt32, on: TBool):
|
||||||
|
self.version_manager.cfg_mask_nu(self, channel, on)
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def cfg_mask_nu_all(self, state: TInt32):
|
||||||
|
self.version_manager.cfg_mask_nu_all(self, state)
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_att_en(self, channel: TInt32, on: TBool):
|
def cfg_att_en(self, channel: TInt32, on: TBool):
|
||||||
self.version_manager.cfg_att_en(self, channel, on)
|
self.version_manager.cfg_att_en(self, channel, on)
|
||||||
@ -762,14 +839,6 @@ class CPLD:
|
|||||||
def cfg_drhold_all(self, state: TInt32):
|
def cfg_drhold_all(self, state: TInt32):
|
||||||
self.version_manager.cfg_drhold_all(self, state)
|
self.version_manager.cfg_drhold_all(self, state)
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_mask_nu(self, channel: TInt32, on: TBool):
|
|
||||||
self.version_manager.cfg_mask_nu(self, channel, on)
|
|
||||||
|
|
||||||
@kernel
|
|
||||||
def cfg_mask_nu_all(self, state: TInt32):
|
|
||||||
self.version_manager.cfg_mask_nu_all(self, state)
|
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def cfg_sw(self, channel: TInt32, on: TBool):
|
def cfg_sw(self, channel: TInt32, on: TBool):
|
||||||
"""Configure the RF switches through the configuration register.
|
"""Configure the RF switches through the configuration register.
|
||||||
|
Loading…
Reference in New Issue
Block a user