Hi,
I am creating some test case to find out what the "maximum parameterization speed" for an Urukul channel is. I do this by repeatedly calling the parameterization functions while having a variable delay beetween the calls. I save the last delay value as soon as an RTIOUnderflow occurs.
- Amplitude, phase, frequency and attenuation in separate functions: around 90000mu minimum delay
- Amplitude, phase, frequency in one function, attenuation in one function: around 74000mu minimum delay
- Amplitude, phase, frequency in one function, around 87000mu minimum delay
- Attenuation in one function, around 500mu minimum delay
There will be more, but I already seen something strange.
- Why does the minimum delay increase / parameterization speed decrease when I remove the attenuation set function? (in the code: variant 1 vs 2)
- How to improve parameterization speed further? I am thinking of DRAM+parallel. Are there good examples by any chance?
Thanks!
Jonas
from artiq.language.environment import EnvExperiment
from artiq.coredevice.exceptions import InternalError, RTIOUnderflow
from artiq.experiment import *
from artiq.frontend import artiq_run
from artiq.language.core import (delay, delay_mu, kernel, )
from artiq.language.units import ms, ns, dB, MHz
from helpers.BaseRack import BaseRack
import logging
logger = logging.getLogger(__name__)
class urukul_minimum_delay(EnvExperiment):
_default_frequency = 100*MHz
_default_phase = 0.
_default_gain = 0.*dB
_default_amplitude = 1.
_number_of_runs = 10
def build(self):
self._base_rack = BaseRack(self)
pass
def run(self):
with open("variant_delays", 'a') as variant_delays_file:
for variant in range(0,4):
logger.info(f"Testing variant {variant}")
minimum_delay_mu = self.k_run(variant)
logger.info(f"Minimum delay is {minimum_delay_mu}")
variant_delays_file.write(f"{variant},{minimum_delay_mu}\n")
@kernel
def k_run(self, variant):
delays_mu = range(200000, 0, -100)
self.core.reset()
self.urukul0_ch0.cpld.init()
self.urukul0_ch0.init()
self.urukul0_ch0.sw.on()
minimum_delay_mu = 0
try:
if variant == 0:
for delay in delays_mu:
self.urukul0_ch0.set_amplitude(self._default_amplitude)
self.urukul0_ch0.set_phase(self._default_phase)
self.urukul0_ch0.set(self._default_frequency)
self.urukul0_ch0.set_att(self._default_gain)
minimum_delay_mu = delay
delay_mu(delay)
elif variant == 1:
for delay in delays_mu:
self.urukul0_ch0.set(frequency = self._default_frequency,
amplitude = self._default_amplitude,
phase = self._default_phase)
self.urukul0_ch0.set_att(self._default_gain)
minimum_delay_mu = delay
delay_mu(delay)
elif variant == 2:
for delay in delays_mu:
self.urukul0_ch0.set(frequency = self._default_frequency,
amplitude = self._default_amplitude,
phase = self._default_phase)
minimum_delay_mu = delay
delay_mu(delay)
elif variant == 3:
for delay in delays_mu:
self.urukul0_ch0.set_att(self._default_gain)
minimum_delay_mu = delay
delay_mu(delay)
except RTIOUnderflow:
return minimum_delay_mu
return 0
if __name__ == "__main__":
artiq_run.run()