diff --git a/src/qibolab/_core/instruments/qm/controller.py b/src/qibolab/_core/instruments/qm/controller.py index 32673058a..f8efb7a21 100644 --- a/src/qibolab/_core/instruments/qm/controller.py +++ b/src/qibolab/_core/instruments/qm/controller.py @@ -30,7 +30,7 @@ from qibolab._core.unrolling import Bounds, unroll_sequences from .components import OpxOutputConfig, QmAcquisitionConfig -from .config import SAMPLING_RATE, Configuration, operation +from .config import SAMPLING_RATE, Configuration from .program import ExecutionArguments, create_acquisition, program from .program.sweepers import find_lo_frequencies, sweeper_amplitude @@ -338,12 +338,12 @@ def register_duration_sweeper_pulses( if isinstance(pulse, (Align, Delay)): continue - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] ids = args.sequence.pulse_channels(pulse.id) original_pulse = ( pulse if params.amplitude_pulse is None else params.amplitude_pulse ) - for value in sweeper.values: + for value in sweeper.values.astype(int): sweep_pulse = original_pulse.model_copy(update={"duration": value}) sweep_op = self.register_pulse(ids[0], sweep_pulse) params.duration_ops.append((value, sweep_op)) @@ -360,7 +360,7 @@ def register_amplitude_sweeper_pulses( for pulse in sweeper.pulses: sweep_pulse = pulse.model_copy(update={"amplitude": amplitude}) ids = args.sequence.pulse_channels(pulse.id) - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] params.amplitude_pulse = sweep_pulse params.amplitude_op = self.register_pulse(ids[0], sweep_pulse) @@ -418,6 +418,9 @@ def preprocess_sweeps( find_lo_frequencies(args, channels, configs, sweeper.values) for id in sweeper.channels: args.parameters[id].element = probe_map.get(id, id) + for sweeper in find_sweepers(sweepers, Parameter.offset): + for id in sweeper.channels: + args.parameters[id].element = id for sweeper in find_sweepers(sweepers, Parameter.amplitude): self.register_amplitude_sweeper_pulses(args, sweeper) for sweeper in find_sweepers(sweepers, Parameter.duration): diff --git a/src/qibolab/_core/instruments/qm/program/instructions.py b/src/qibolab/_core/instruments/qm/program/instructions.py index b19333b0f..f1dc1de50 100644 --- a/src/qibolab/_core/instruments/qm/program/instructions.py +++ b/src/qibolab/_core/instruments/qm/program/instructions.py @@ -87,7 +87,7 @@ def play(args: ExecutionArguments): for channel_id, pulse in args.sequence: element = str(channel_id) op = operation(pulse) - params = args.parameters[op] + params = args.parameters[pulse.id] if isinstance(pulse, Delay): _delay(pulse, element, params) elif isinstance(pulse, Pulse): @@ -111,8 +111,13 @@ def _process_sweeper(sweeper: Sweeper, args: ExecutionArguments): if parameter not in SWEEPER_METHODS: raise NotImplementedError(f"Sweeper for {parameter} is not implemented.") - variable = declare(int) if parameter in INT_TYPE else declare(fixed) - values = sweeper.values + if parameter in INT_TYPE: + variable = declare(int) + values = sweeper.values.astype(int) + else: + variable = declare(fixed) + values = sweeper.values + if parameter is Parameter.frequency: lo_frequency = args.parameters[sweeper.channels[0]].lo_frequency values = NORMALIZERS[parameter](values, lo_frequency) @@ -148,7 +153,7 @@ def sweep( method = SWEEPER_METHODS[sweeper.parameter] if sweeper.pulses is not None: for pulse in sweeper.pulses: - params = args.parameters[operation(pulse)] + params = args.parameters[pulse.id] method(variable, params) else: for channel in sweeper.channels: