Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved code for selection of measurement start #656

Merged
merged 8 commits into from
Nov 16, 2023
42 changes: 12 additions & 30 deletions src/qibolab/instruments/zhinst.py
Original file line number Diff line number Diff line change
Expand Up @@ -892,39 +892,18 @@ def measure_relax(self, exp, qubits, relaxation_time, acquisition_type):
"""qubit readout pulse, data acquisition and qubit relaxation"""
play_after = None

# TODO: This need to be simplified !!!
if len(self.sequence_qibo.qf_pulses) != 0 and len(self.sequence_qibo.qd_pulses) != 0:
play_after = (
self.play_after_set(self.sequence_qibo.qf_pulses, "bias")
if self.sequence_qibo.qf_pulses.finish > self.sequence_qibo.qd_pulses.finish
else self.play_after_set(self.sequence_qibo.qd_pulses, "drive")
)
if len(self.sequence_qibo.cf_pulses) != 0 and len(self.sequence_qibo.qd_pulses) != 0:
play_after = (
self.play_after_set(self.sequence_qibo.cf_pulses, "bias_coupler")
if self.sequence_qibo.cf_pulses.finish > self.sequence_qibo.qd_pulses.finish
else self.play_after_set(self.sequence_qibo.qd_pulses, "drive")
)
# TODO: if we use sweepers, the code might not behave as expected
# i.e.: self.sequence_qibo may not contain ZhSweeper for flux
GabrielePalazzo marked this conversation as resolved.
Show resolved Hide resolved
qf_finish = self.sequence_qibo.qf_pulses.finish
qd_finish = self.sequence_qibo.qd_pulses.finish
cf_finish = self.sequence_qibo.cf_pulses.finish

elif len(self.sequence_qibo.qf_pulses) != 0:
if qf_finish > qd_finish and qf_finish > cf_finish:
play_after = self.play_after_set(self.sequence_qibo.qf_pulses, "bias")
elif len(self.sequence_qibo.qd_pulses) != 0:
elif qd_finish > qf_finish and qd_finish > cf_finish:
play_after = self.play_after_set(self.sequence_qibo.qd_pulses, "drive")
elif (
len(self.sequence_qibo.qf_pulses) != 0
and len(self.sequence_qibo.qd_pulses) != 0
and len(self.sequence_qibo.cf_pulses) != 0
):
seq_qf = self.sequence_qibo.qf_pulses.finish
seq_qd = self.sequence_qibo.qd_pulses.finish
seq_cf = self.sequence_qibo.cf_pulses.finish
# add here for flux coupler pulses
if seq_qf > seq_qd and seq_qf > seq_cf:
play_after = self.play_after_set(self.sequence_qibo.qf_pulses, "bias")
elif seq_qd > seq_qf and seq_qd > seq_cf:
play_after = self.play_after_set(self.sequence_qibo.qd_pulses, "drive")
elif seq_cf > seq_qf and seq_cf > seq_qd:
play_after = self.play_after_set(self.sequence_qibo.cf_pulse, "bias_coupler")
elif cf_finish > qf_finish and cf_finish > qd_finish:
play_after = self.play_after_set(self.sequence_qibo.cf_pulses, "bias_coupler")

readout_schedule = defaultdict(list)
qubit_readout_schedule = defaultdict(list)
Expand All @@ -948,6 +927,9 @@ def measure_relax(self, exp, qubits, relaxation_time, acquisition_type):
for pulse, q, iq_angle in zip(pulses, qubits, iq_angles):
pulse.zhpulse.uid += str(i)

# TODO: if the measure sequence starts after the last pulse, add a delay
# if the delay is too large (i.e. 5us),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you check the maximun before it crashes ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure.

# throw an exception / no delay / maximum delay possible
if play_after is None:
exp.delay(
signal=f"measure{q}",
Expand Down