forked from M-Labs/artiq
1
0
Fork 0

ad9910: port imports and type annotations to NAC3

This commit is contained in:
Sebastien Bourdeauducq 2022-02-26 18:47:07 +08:00
parent 2720bfa398
commit 70531ae1e2
1 changed files with 90 additions and 92 deletions

View File

@ -1,9 +1,7 @@
from numpy import int32, int64
from artiq.language.core import (
kernel, delay, portable, delay_mu, now_mu, at_mu)
from artiq.language.core import kernel, portable
from artiq.language.units import us, ms
from artiq.language.types import TBool, TInt32, TInt64, TFloat, TList, TTuple
from artiq.coredevice import spi2 as spi
from artiq.coredevice import urukul
@ -187,7 +185,7 @@ class AD9910:
self.phase_mode = PHASE_MODE_CONTINUOUS
@kernel
def set_phase_mode(self, phase_mode: TInt32):
def set_phase_mode(self, phase_mode: int32):
r"""Set the default phase mode.
for future calls to :meth:`set` and
@ -232,7 +230,7 @@ class AD9910:
self.phase_mode = phase_mode
@kernel
def write16(self, addr: TInt32, data: TInt32):
def write16(self, addr: int32, data: int32):
"""Write to 16 bit register.
:param addr: Register address
@ -243,7 +241,7 @@ class AD9910:
self.bus.write((addr << 24) | ((data & 0xffff) << 8))
@kernel
def write32(self, addr: TInt32, data: TInt32):
def write32(self, addr: int32, data: int32):
"""Write to 32 bit register.
:param addr: Register address
@ -257,7 +255,7 @@ class AD9910:
self.bus.write(data)
@kernel
def read16(self, addr: TInt32) -> TInt32:
def read16(self, addr: int32) -> int32:
"""Read from 16 bit register.
:param addr: Register address
@ -272,7 +270,7 @@ class AD9910:
return self.bus.read()
@kernel
def read32(self, addr: TInt32) -> TInt32:
def read32(self, addr: int32) -> int32:
"""Read from 32 bit register.
:param addr: Register address
@ -287,7 +285,7 @@ class AD9910:
return self.bus.read()
@kernel
def read64(self, addr: TInt32) -> TInt64:
def read64(self, addr: int32) -> int64:
"""Read from 64 bit register.
:param addr: Register address
@ -310,7 +308,7 @@ class AD9910:
return (int64(hi) << 32) | lo
@kernel
def write64(self, addr: TInt32, data_high: TInt32, data_low: TInt32):
def write64(self, addr: int32, data_high: int32, data_low: int32):
"""Write to 64 bit register.
:param addr: Register address
@ -328,7 +326,7 @@ class AD9910:
self.bus.write(data_low)
@kernel
def write_ram(self, data: TList(TInt32)):
def write_ram(self, data: list[int32]):
"""Write data to RAM.
The profile to write to and the step, start, and end address
@ -349,7 +347,7 @@ class AD9910:
self.bus.write(data[len(data) - 1])
@kernel
def read_ram(self, data: TList(TInt32)):
def read_ram(self, data: list[int32]):
"""Read data from RAM.
The profile to read from and the step, start, and end address
@ -379,17 +377,17 @@ class AD9910:
@kernel
def set_cfr1(self,
power_down: TInt32 = 0b0000,
phase_autoclear: TInt32 = 0,
drg_load_lrr: TInt32 = 0,
drg_autoclear: TInt32 = 0,
phase_clear: TInt32 = 0,
internal_profile: TInt32 = 0,
ram_destination: TInt32 = 0,
ram_enable: TInt32 = 0,
manual_osk_external: TInt32 = 0,
osk_enable: TInt32 = 0,
select_auto_osk: TInt32 = 0):
power_down: int32 = 0b0000,
phase_autoclear: int32 = 0,
drg_load_lrr: int32 = 0,
drg_autoclear: int32 = 0,
phase_clear: int32 = 0,
internal_profile: int32 = 0,
ram_destination: int32 = 0,
ram_enable: int32 = 0,
manual_osk_external: int32 = 0,
osk_enable: int32 = 0,
select_auto_osk: int32 = 0):
"""Set CFR1. See the AD9910 datasheet for parameter meanings.
This method does not pulse IO_UPDATE.
@ -424,11 +422,11 @@ class AD9910:
@kernel
def set_cfr2(self,
asf_profile_enable: TInt32 = 1,
drg_enable: TInt32 = 0,
effective_ftw: TInt32 = 1,
sync_validation_disable: TInt32 = 0,
matched_latency_enable: TInt32 = 0):
asf_profile_enable: int32 = 1,
drg_enable: int32 = 0,
effective_ftw: int32 = 1,
sync_validation_disable: int32 = 0,
matched_latency_enable: int32 = 0):
"""Set CFR2. See the AD9910 datasheet for parameter meanings.
This method does not pulse IO_UPDATE.
@ -452,7 +450,7 @@ class AD9910:
(sync_validation_disable << 5))
@kernel
def init(self, blind: TBool = False):
def init(self, blind: bool = False):
"""Initialize and configure the DDS.
Sets up SPI mode, confirms chip presence, powers down unused blocks,
@ -511,7 +509,7 @@ class AD9910:
delay(1 * ms)
@kernel
def power_down(self, bits: TInt32 = 0b1111):
def power_down(self, bits: int32 = 0b1111):
"""Power down DDS.
:param bits: Power down bits, see datasheet
@ -520,11 +518,11 @@ class AD9910:
self.cpld.io_update.pulse(1 * us)
@kernel
def set_mu(self, ftw: TInt32 = 0, pow_: TInt32 = 0, asf: TInt32 = 0x3fff,
phase_mode: TInt32 = _PHASE_MODE_DEFAULT,
ref_time_mu: TInt64 = int64(-1),
profile: TInt32 = DEFAULT_PROFILE,
ram_destination: TInt32 = -1) -> TInt32:
def set_mu(self, ftw: int32 = 0, pow_: int32 = 0, asf: int32 = 0x3fff,
phase_mode: int32 = _PHASE_MODE_DEFAULT,
ref_time_mu: int64 = int64(-1),
profile: int32 = DEFAULT_PROFILE,
ram_destination: int32 = -1) -> int32:
"""Set DDS data in machine units.
This uses machine units (FTW, POW, ASF). The frequency tuning word
@ -593,8 +591,8 @@ class AD9910:
return pow_
@kernel
def get_mu(self, profile: TInt32 = DEFAULT_PROFILE
) -> TTuple([TInt32, TInt32, TInt32]):
def get_mu(self, profile: int32 = DEFAULT_PROFILE
) -> tuple[int32, int32, int32]:
"""Get the frequency tuning word, phase offset word,
and amplitude scale factor.
@ -613,10 +611,10 @@ class AD9910:
return ftw, pow_, asf
@kernel
def set_profile_ram(self, start: TInt32, end: TInt32, step: TInt32 = 1,
profile: TInt32 = _DEFAULT_PROFILE_RAM,
nodwell_high: TInt32 = 0, zero_crossing: TInt32 = 0,
mode: TInt32 = 1):
def set_profile_ram(self, start: int32, end: int32, step: int32 = 1,
profile: int32 = _DEFAULT_PROFILE_RAM,
nodwell_high: int32 = 0, zero_crossing: int32 = 0,
mode: int32 = 1):
"""Set the RAM profile settings.
:param start: Profile start address in RAM.
@ -640,7 +638,7 @@ class AD9910:
self.write64(_AD9910_REG_PROFILE0 + profile, hi, lo)
@kernel
def set_ftw(self, ftw: TInt32):
def set_ftw(self, ftw: int32):
"""Set the value stored to the AD9910's frequency tuning word (FTW)
register.
@ -649,7 +647,7 @@ class AD9910:
self.write32(_AD9910_REG_FTW, ftw)
@kernel
def set_asf(self, asf: TInt32):
def set_asf(self, asf: int32):
"""Set the value stored to the AD9910's amplitude scale factor (ASF)
register.
@ -658,7 +656,7 @@ class AD9910:
self.write32(_AD9910_REG_ASF, asf << 2)
@kernel
def set_pow(self, pow_: TInt32):
def set_pow(self, pow_: int32):
"""Set the value stored to the AD9910's phase offset word (POW)
register.
@ -667,7 +665,7 @@ class AD9910:
self.write16(_AD9910_REG_POW, pow_)
@kernel
def get_ftw(self) -> TInt32:
def get_ftw(self) -> int32:
"""Get the value stored to the AD9910's frequency tuning word (FTW)
register.
@ -676,7 +674,7 @@ class AD9910:
return self.read32(_AD9910_REG_FTW)
@kernel
def get_asf(self) -> TInt32:
def get_asf(self) -> int32:
"""Get the value stored to the AD9910's amplitude scale factor (ASF)
register.
@ -685,7 +683,7 @@ class AD9910:
return self.read32(_AD9910_REG_ASF) >> 2
@kernel
def get_pow(self) -> TInt32:
def get_pow(self) -> int32:
"""Get the value stored to the AD9910's phase offset word (POW)
register.
@ -693,34 +691,34 @@ class AD9910:
"""
return self.read16(_AD9910_REG_POW)
@portable(flags={"fast-math"})
def frequency_to_ftw(self, frequency: TFloat) -> TInt32:
@portable
def frequency_to_ftw(self, frequency: float) -> int32:
"""Return the 32-bit frequency tuning word corresponding to the given
frequency.
"""
return int32(round(self.ftw_per_hz * frequency))
@portable(flags={"fast-math"})
def ftw_to_frequency(self, ftw: TInt32) -> TFloat:
@portable
def ftw_to_frequency(self, ftw: int32) -> float:
"""Return the frequency corresponding to the given frequency tuning
word.
"""
return ftw / self.ftw_per_hz
@portable(flags={"fast-math"})
def turns_to_pow(self, turns: TFloat) -> TInt32:
@portable
def turns_to_pow(self, turns: float) -> int32:
"""Return the 16-bit phase offset word corresponding to the given phase
in turns."""
return int32(round(turns * 0x10000)) & int32(0xffff)
@portable(flags={"fast-math"})
def pow_to_turns(self, pow_: TInt32) -> TFloat:
@portable
def pow_to_turns(self, pow_: int32) -> float:
"""Return the phase in turns corresponding to a given phase offset
word."""
return pow_ / 0x10000
@portable(flags={"fast-math"})
def amplitude_to_asf(self, amplitude: TFloat) -> TInt32:
@portable
def amplitude_to_asf(self, amplitude: float) -> int32:
"""Return 14-bit amplitude scale factor corresponding to given
fractional amplitude."""
code = int32(round(amplitude * 0x3fff))
@ -728,14 +726,14 @@ class AD9910:
raise ValueError("Invalid AD9910 fractional amplitude!")
return code
@portable(flags={"fast-math"})
def asf_to_amplitude(self, asf: TInt32) -> TFloat:
@portable
def asf_to_amplitude(self, asf: int32) -> float:
"""Return amplitude as a fraction of full scale corresponding to given
amplitude scale factor."""
return asf / float(0x3fff)
@portable(flags={"fast-math"})
def frequency_to_ram(self, frequency: TList(TFloat), ram: TList(TInt32)):
@portable
def frequency_to_ram(self, frequency: list[float], ram: list[int32]):
"""Convert frequency values to RAM profile data.
To be used with :const:`RAM_DEST_FTW`.
@ -747,8 +745,8 @@ class AD9910:
for i in range(len(ram)):
ram[i] = self.frequency_to_ftw(frequency[i])
@portable(flags={"fast-math"})
def turns_to_ram(self, turns: TList(TFloat), ram: TList(TInt32)):
@portable
def turns_to_ram(self, turns: list[float], ram: list[int32]):
"""Convert phase values to RAM profile data.
To be used with :const:`RAM_DEST_POW`.
@ -760,8 +758,8 @@ class AD9910:
for i in range(len(ram)):
ram[i] = self.turns_to_pow(turns[i]) << 16
@portable(flags={"fast-math"})
def amplitude_to_ram(self, amplitude: TList(TFloat), ram: TList(TInt32)):
@portable
def amplitude_to_ram(self, amplitude: list[float], ram: list[int32]):
"""Convert amplitude values to RAM profile data.
To be used with :const:`RAM_DEST_ASF`.
@ -773,9 +771,9 @@ class AD9910:
for i in range(len(ram)):
ram[i] = self.amplitude_to_asf(amplitude[i]) << 18
@portable(flags={"fast-math"})
def turns_amplitude_to_ram(self, turns: TList(TFloat),
amplitude: TList(TFloat), ram: TList(TInt32)):
@portable
def turns_amplitude_to_ram(self, turns: list[float],
amplitude: list[float], ram: list[int32]):
"""Convert phase and amplitude values to RAM profile data.
To be used with :const:`RAM_DEST_POWASF`.
@ -790,7 +788,7 @@ class AD9910:
self.amplitude_to_asf(amplitude[i]) << 2)
@kernel
def set_frequency(self, frequency: TFloat):
def set_frequency(self, frequency: float):
"""Set the value stored to the AD9910's frequency tuning word (FTW)
register.
@ -799,7 +797,7 @@ class AD9910:
self.set_ftw(self.frequency_to_ftw(frequency))
@kernel
def set_amplitude(self, amplitude: TFloat):
def set_amplitude(self, amplitude: float):
"""Set the value stored to the AD9910's amplitude scale factor (ASF)
register.
@ -808,7 +806,7 @@ class AD9910:
self.set_asf(self.amplitude_to_asf(amplitude))
@kernel
def set_phase(self, turns: TFloat):
def set_phase(self, turns: float):
"""Set the value stored to the AD9910's phase offset word (POW)
register.
@ -817,7 +815,7 @@ class AD9910:
self.set_pow(self.turns_to_pow(turns))
@kernel
def get_frequency(self) -> TFloat:
def get_frequency(self) -> float:
"""Get the value stored to the AD9910's frequency tuning word (FTW)
register.
@ -826,7 +824,7 @@ class AD9910:
return self.ftw_to_frequency(self.get_ftw())
@kernel
def get_amplitude(self) -> TFloat:
def get_amplitude(self) -> float:
"""Get the value stored to the AD9910's amplitude scale factor (ASF)
register.
@ -835,7 +833,7 @@ class AD9910:
return self.asf_to_amplitude(self.get_asf())
@kernel
def get_phase(self) -> TFloat:
def get_phase(self) -> float:
"""Get the value stored to the AD9910's phase offset word (POW)
register.
@ -844,10 +842,10 @@ class AD9910:
return self.pow_to_turns(self.get_pow())
@kernel
def set(self, frequency: TFloat = 0.0, phase: TFloat = 0.0,
amplitude: TFloat = 1.0, phase_mode: TInt32 = _PHASE_MODE_DEFAULT,
ref_time_mu: TInt64 = int64(-1), profile: TInt32 = DEFAULT_PROFILE,
ram_destination: TInt32 = -1) -> TFloat:
def set(self, frequency: float = 0.0, phase: float = 0.0,
amplitude: float = 1.0, phase_mode: int32 = _PHASE_MODE_DEFAULT,
ref_time_mu: int64 = int64(-1), profile: int32 = DEFAULT_PROFILE,
ram_destination: int32 = -1) -> float:
"""Set DDS data in SI units.
.. seealso:: :meth:`set_mu`
@ -867,8 +865,8 @@ class AD9910:
profile, ram_destination))
@kernel
def get(self, profile: TInt32 = DEFAULT_PROFILE
) -> TTuple([TFloat, TFloat, TFloat]):
def get(self, profile: int32 = DEFAULT_PROFILE
) -> tuple[float, float, float]:
"""Get the frequency, phase, and amplitude.
.. seealso:: :meth:`get_mu`
@ -884,7 +882,7 @@ class AD9910:
self.asf_to_amplitude(asf))
@kernel
def set_att_mu(self, att: TInt32):
def set_att_mu(self, att: int32):
"""Set digital step attenuator in machine units.
This method will write the attenuator settings of all four channels.
@ -896,7 +894,7 @@ class AD9910:
self.cpld.set_att_mu(self.chip_select - 4, att)
@kernel
def set_att(self, att: TFloat):
def set_att(self, att: float):
"""Set digital step attenuator in SI units.
This method will write the attenuator settings of all four channels.
@ -908,7 +906,7 @@ class AD9910:
self.cpld.set_att(self.chip_select - 4, att)
@kernel
def get_att_mu(self) -> TInt32:
def get_att_mu(self) -> int32:
"""Get digital step attenuator value in machine units.
.. seealso:: :meth:`artiq.coredevice.urukul.CPLD.get_channel_att_mu`
@ -918,7 +916,7 @@ class AD9910:
return self.cpld.get_channel_att_mu(self.chip_select - 4)
@kernel
def get_att(self) -> TFloat:
def get_att(self) -> float:
"""Get digital step attenuator value in SI units.
.. seealso:: :meth:`artiq.coredevice.urukul.CPLD.get_channel_att`
@ -928,7 +926,7 @@ class AD9910:
return self.cpld.get_channel_att(self.chip_select - 4)
@kernel
def cfg_sw(self, state: TBool):
def cfg_sw(self, state: bool):
"""Set CPLD CFG RF switch state. The RF switch is controlled by the
logical or of the CPLD configuration shift register
RF switch bit and the SW TTL line (if used).
@ -939,9 +937,9 @@ class AD9910:
@kernel
def set_sync(self,
in_delay: TInt32,
window: TInt32,
en_sync_gen: TInt32 = 0):
in_delay: int32,
window: int32,
en_sync_gen: int32 = 0):
"""Set the relevant parameters in the multi device synchronization
register. See the AD9910 datasheet for details. The SYNC clock
generator preset value is set to zero, and the SYNC_OUT generator is
@ -981,7 +979,7 @@ class AD9910:
@kernel
def tune_sync_delay(self,
search_seed: TInt32 = 15) -> TTuple([TInt32, TInt32]):
search_seed: int32 = 15) -> tuple[int32, int32]:
"""Find a stable SYNC_IN delay.
This method first locates a valid SYNC_IN delay at zero validation
@ -1037,8 +1035,8 @@ class AD9910:
raise ValueError("no valid window/delay")
@kernel
def measure_io_update_alignment(self, delay_start: TInt64,
delay_stop: TInt64) -> TInt32:
def measure_io_update_alignment(self, delay_start: int64,
delay_stop: int64) -> int32:
"""Use the digital ramp generator to locate the alignment between
IO_UPDATE and SYNC_CLK.
@ -1080,7 +1078,7 @@ class AD9910:
return ftw & 1
@kernel
def tune_io_update_delay(self) -> TInt32:
def tune_io_update_delay(self) -> int32:
"""Find a stable IO_UPDATE delay alignment.
Scan through increasing IO_UPDATE delays until a delay is found that