Skip to content
Snippets Groups Projects
Commit 779faed6 authored by Sander Snoo's avatar Sander Snoo
Browse files

Added set_default_hw_schedule() to set SingleShot schedule for Keysight on pulse-lib.

Added schedule_params to sequencer to set HVI parameters on sequence directly.
parent 0eb6ea08
No related branches found
No related tags found
No related merge requests found
......@@ -43,6 +43,7 @@ class pulselib:
self._configure_digitizer = True
self._backend = backend
self._default_hw_schedule_creator = None
if np.__version__ < '1.20':
raise Exception(f'Pulselib requires numpy 1.20+. Found version {np.__version__}')
......@@ -444,6 +445,9 @@ class pulselib:
awg_channels=list(self.awg_channels.keys())
)
def set_default_hw_schedule_creator(self, hw_schedule_creator):
self._default_hw_schedule_creator = hw_schedule_creator
def _create_M3202A_uploader(self):
try:
from pulse_lib.keysight.M3202A_uploader import M3202A_Uploader
......@@ -536,7 +540,11 @@ class pulselib:
'''
segments: list of segment_container.
'''
seq_obj = sequencer(self.uploader, self.digitizer_channels, self.awg_channels)
default_hw_schedule = None
if self._default_hw_schedule_creator is not None:
default_hw_schedule = self._default_hw_schedule_creator(self)
seq_obj = sequencer(self.uploader, self.digitizer_channels, self.awg_channels,
default_hw_schedule=default_hw_schedule)
seq_obj.add_sequence(segments)
seq_obj.configure_digitizer = self.configure_digitizer
return seq_obj
......
......@@ -27,7 +27,9 @@ def read_channels(pulselib, t_measure, channels=None, sample_rate=None, iq_mode=
raise Exception(f't_measure ({t_measure} ns) < 1/sample_rate ({int(1e9/sample_rate)} ns)')
# set sample rate for Keysight upload.
if t_measure > 200_000:
if t_measure > 2_000_000:
awg_sample_rate = 1e6
elif t_measure > 200_000:
awg_sample_rate = 1e7
elif t_measure > 20_000:
awg_sample_rate = 1e8
......@@ -42,7 +44,6 @@ def read_channels(pulselib, t_measure, channels=None, sample_rate=None, iq_mode=
seg[ch].acquire(0, t_measure, wait=True)
sequence = pulselib.mk_sequence([seg])
# sequence.set_hw_schedule() @@@ configure single shot and video mode schedules at pulselib init!!
sequence.n_rep = None
if sample_rate is not None:
sequence.set_acquisition(sample_rate=sample_rate)
......
......@@ -32,7 +32,8 @@ class sequencer():
Class to make sequences for segments.
"""
def __init__(self, upload_module, digitizer_channels, awg_channels):
def __init__(self, upload_module, digitizer_channels, awg_channels,
default_hw_schedule=None):
'''
make a new sequence object.
Args:
......@@ -59,8 +60,9 @@ class sequencer():
# arguments of post processing the might be needed during rendering.
self.neutralize = True
# hardware schedule (HVI)
self.hw_schedule = None
# hardware schedule (Keysight, Tektronix)
self.hw_schedule = default_hw_schedule
self.schedule_params = dict()
self._n_rep = 1000
self._sample_rate = 1e9
......@@ -552,7 +554,8 @@ class sequencer():
upload_job.qubit_resonance_frequencies = self._qubit_resonance_frequencies
if self.hw_schedule is not None:
hvi_markers = self._HVI_variables.item(tuple(index)).HVI_markers
upload_job.add_hw_schedule(self.hw_schedule, hvi_markers)
schedule_params = {**self.schedule_params, **hvi_markers}
upload_job.add_hw_schedule(self.hw_schedule, schedule_params)
if self._condition_measurements.feedback_events:
upload_job.set_feedback(self._condition_measurements)
......
......@@ -4,34 +4,42 @@ from pulse_lib.scan.read_input import read_channels
#%%
def test1():
pulse = context.init_pulselib(n_gates=0, n_sensors=2, rf_sources=False)
pulse = context.init_pulselib(n_gates=1, n_sensors=2, rf_sources=False)
dc_param = read_channels(pulse, 1000)
return context.run('read', dc_param)
def test2():
pulse = context.init_pulselib(n_gates=0, n_sensors=2, rf_sources=False)
pulse = context.init_pulselib(n_gates=1, n_sensors=2, rf_sources=False)
dc_param = read_channels(pulse, 100000, sample_rate=500e3)
return context.run('read', dc_param)
def test3(iq_mode='I+Q'):
pulse = context.init_pulselib(n_gates=0, n_sensors=2, rf_sources=True)
pulse = context.init_pulselib(n_gates=1, n_sensors=2, rf_sources=True)
dc_param = read_channels(pulse, 10000, iq_mode=iq_mode)
return context.run('read_iq_'+iq_mode, dc_param)
def test4():
# takes 200 seconds to run !!!
pulse = context.init_pulselib(n_gates=0, n_sensors=2, rf_sources=False)
# takes 100 seconds to run !!!
pulse = context.init_pulselib(n_gates=1, n_sensors=2, rf_sources=False)
if pulse._backend in ['Keysight', 'Keysight_QS']:
for awg in pulse.awg_devices.values():
# 1e8 samples at 1e6 Sa/s => 100 sec.
awg.set_waveform_limit(1e8)
dc_param = read_channels(pulse, 200e9, sample_rate=100) # 100 Hz, 200 seconds
dc_param = read_channels(pulse, 100e9, sample_rate=100) # 100 Hz, 100 seconds
return context.run('read', dc_param)
#%%
if __name__ == '__main__':
ds1 = test1()
......
......@@ -2,6 +2,7 @@ import logging
import os
import math
from collections.abc import Sequence
from functools import partial
from numbers import Number
from typing import Dict, List, Union
import matplotlib.pyplot as pt
......@@ -264,6 +265,8 @@ class Context:
if 'Dig1' not in pulse.digitizers:
pulse.add_digitizer(station.components['Dig1'])
self.set_default_hw_schedule(cfg.get('schedule', None))
if finish:
pulse.finish_init()
......@@ -279,19 +282,17 @@ class Context:
pulse.add_awg(self.station.components[awg])
pulse.define_marker(name, awg, channel, setup_ns=setup_ns, hold_ns=hold_ns)
def add_hw_schedule(self, sequence):
cfg = self._configuration
schedule = cfg.get('schedule', None)
def set_default_hw_schedule(self, schedule):
if schedule == 'Mock':
sequence.set_hw_schedule(HardwareScheduleMock())
hw_schedule_creator = HardwareScheduleMock
elif schedule == 'HVI2':
hvi2_schedule = getattr(self, 'hvi2_schedule', None)
if hvi2_schedule is None:
from core_tools.HVI2.hvi2_schedule_loader import Hvi2ScheduleLoader
self.hvi2_schedule = Hvi2ScheduleLoader(self.pulse, "SingleShot")
sequence.set_hw_schedule(self.hvi2_schedule)
from core_tools.HVI2.hvi2_schedule_loader import Hvi2ScheduleLoader
hw_schedule_creator = partial(Hvi2ScheduleLoader, script_name='SingleShot')
elif schedule == 'TektronixM4i':
sequence.set_hw_schedule(TektronixSchedule(self.pulse))
hw_schedule_creator = TektronixSchedule
else:
hw_schedule_creator = None
self.pulse.set_default_hw_schedule_creator(hw_schedule_creator)
def launch_databrowser(self):
global _ct_configured
......
......@@ -3,7 +3,7 @@ import logging
logger = logging.getLogger(__name__)
class HardwareScheduleMock:
def __init__(self):
def __init__(self, pulse=None):
self.loaded = False
self.sequence_params = None
......
......@@ -72,6 +72,9 @@ class MockM3202A(Instrument):
def configure_marker_output(self, invert: bool = False):
pass
def set_waveform_limit(self, size):
pass
def upload_waveform(self, wave) -> WaveformReference:
size = len(wave)
# discretize samples
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment