diff --git a/pulse_lib/qblox/pulsar_sequencers.py b/pulse_lib/qblox/pulsar_sequencers.py index fca2837334256a349042f7cc008ac04380d8d4aa..7cbfcc57942186015e4d51abfbcc4ee2121cdd1a 100644 --- a/pulse_lib/qblox/pulsar_sequencers.py +++ b/pulse_lib/qblox/pulsar_sequencers.py @@ -176,6 +176,7 @@ class IQSequenceBuilder(SequenceBuilderBase): mixer_gain=None, mixer_phase_offset=None): super().__init__(name, sequencer) self.seq.nco_frequency = nco_frequency + self._pulsing = False self.add_comment(f'IQ: NCO={nco_frequency/1e6:7.2f} MHz') if mixer_gain is not None: @@ -184,6 +185,7 @@ class IQSequenceBuilder(SequenceBuilderBase): self.seq.mixer_phase_offset_degree = mixer_phase_offset/np.pi*180 def pulse(self, t, duration, amplitude, waveform): + self._pulsing = True t += self.offset_ns self._update_time_and_markers(t, duration) self.add_comment(f'MW pulse {waveform.frequency/1e6:6.2f} MHz {waveform.duration} ns') @@ -239,6 +241,7 @@ class IQSequenceBuilder(SequenceBuilderBase): self.seq.shift_phase(norm_phase, t_offset=t) def chirp(self, t, duration, amplitude, start_frequency, stop_frequency): + self._pulsing = True if hasattr(self.seq, 'chirp'): t += self.offset_ns self._update_time_and_markers(t, 0.0) @@ -254,6 +257,10 @@ class IQSequenceBuilder(SequenceBuilderBase): 0.0, 1.0, phmod) self.pulse(t, duration, amplitude, waveform) + def finalize(self): + super().finalize() + if self._pulsing and abs(self.seq.nco_frequency) > 450e6: + raise Exception(f'{self.name}: NCO frequency {self.nco_frequency/1e6:5.1f} MHz out of range') @dataclass class _SeqCommand: diff --git a/pulse_lib/qblox/pulsar_uploader.py b/pulse_lib/qblox/pulsar_uploader.py index 821caa3e797ee9f3a20e86ee49cbe81981170ef7..a31965bbc8aa9416a55e63f9ece8dfc66716024a 100644 --- a/pulse_lib/qblox/pulsar_uploader.py +++ b/pulse_lib/qblox/pulsar_uploader.py @@ -3,6 +3,7 @@ from uuid import UUID from datetime import datetime import numpy as np import logging +import math from dataclasses import dataclass, field from typing import Dict, Optional, List, Union from numbers import Number @@ -23,7 +24,7 @@ from pulse_lib.segments.data_classes.data_pulse import ( def iround(value): - return int(value+0.5) + return math.floor(value+0.5) class PulsarUploader: @@ -678,13 +679,10 @@ class UploadAggregator: raise Exception(f'I/Q Channel delays must be equal ({channel_name})') t_offset = PulsarConfig.align(self.max_pre_start_ns + delays[0]) - # TODO @@@ Check: LO frequency can change during sweep lo_freq = qubit_channel.iq_channel.LO if qubit_channel.reference_frequency is None: raise Exception(f'Qubit idle frequency not set for {channel_name}') nco_freq = qubit_channel.reference_frequency-lo_freq - if abs(nco_freq) > 300e6: - raise Exception(f'NCO frequency {nco_freq/1e6:5.1f} MHz out of range') seq = IQSequenceBuilder(channel_name, self.program[channel_name], nco_freq, @@ -797,7 +795,10 @@ class UploadAggregator: seq.acquire(t, t_measure) t_end = PulsarConfig.align(seg_render.t_end) - seq.wait_till(t_end) + try: + seq.wait_till(t_end) + except: + raise Exception(f"Acquisition doesn't fit in sequence. Add a wait to extend the sequence.") seq.finalize() job.acq_data_scaling[channel_name] = seq.get_data_scaling()