feat[qblox]: Add interactivity to a schedule's compiled instructions
Explanation of changes
reopening an old merge request.
The compiled instructions of a compiled schedule contains useful debugging info but it is stored in a nasty nested dictionary of dictionaries and dataclasses, making it difficult for developers and users to quickly inspect what is going on. e.g.
{'cluster0': {'settings': {'reference_source': 'internal'},
'cluster0_module1': {'sequencers': {'seq0': AnalogSequencerSettings(sync_en=True, channel_name='complex_output_0', channel_name_measure=None, connected_output_indices=(0, 1), connected_input_indices=(), sequence={'program': ' set_mrk 0 # set markers to 0\n wait_sync 4 \n upd_param 4 \n wait 4 # latency correction of 4 + 0 ns\n move 1,R0 # iterator for loop with label start\nstart: \n reset_ph \n upd_param 4 \n set_awg_gain 3765,221 # setting gain for X q0\n play 0,1,4 # play X q0 (20 ns)\n wait 1316 # auto generated wait (1316 ns)\n loop R0,@start \n stop \n', 'waveforms': {'-7437354151935122036': {'data': [-0.000599734559612828, 0.0005997345596128306, 0.005046102513759707, 0.018924145290583706, 0.055251766506674294, 0.13452637986850227, 0.27736189639426645, 0.4862721070412287, 0.7258928464809945, 0.9230444208816916, 1.0, 0.923044420881692, 0.7258928464809945, 0.4862721070412287, 0.27736189639426667, 0.13452637986850247, 0.05525176650667422, 0.018924145290583706, 0.005046102513759723, 0.000599734559612828], 'index': 0}, '-5454370547237494468': {'data': [0.005854362948054663, 0.012984899295251628, 0.036188115890546685, 0.09833797834988353, 0.23339318028241682, 0.46530863969829034, 0.7624620019776035, 1.0, 0.9945692298577195, 0.6334717403016413, 0.003565268173598476, -0.6263412039544435, -0.9874386935105224, -0.9928694636528029, -0.7553314656304067, -0.4581781033510939, -0.2262626439352196, -0.09120744200268659, -0.029057579543349813, -0.005854362948054663], 'index': 1}}}, seq_fn=None, thresholded_acq_trigger_write_en=None, thresholded_acq_trigger_write_address=None, thresholded_acq_trigger_write_invert=False, thresholded_acq_trigger_read_settings={}, nco_en=True, init_offset_awg_path_I=0.0, init_offset_awg_path_Q=0.0, init_gain_awg_path_I=1.0, init_gain_awg_path_Q=1.0, modulation_freq=50000000.0, mixer_corr_phase_offset_degree=-4.1, mixer_corr_gain_ratio=0.9998, auto_sideband_cal=<SidebandCalEnum.OFF: 'off'>, integration_length_acq=None, thresholded_acq_threshold=None, thresholded_acq_rotation=None, ttl_acq_input_select=None, ttl_acq_threshold=None, ttl_acq_auto_bin_incr_en=None, allow_off_grid_nco_ops=None)},
'settings': AnalogModuleSettings(offset_ch0_path_I=0.1234, offset_ch0_path_Q=-1.337, offset_ch1_path_I=None, offset_ch1_path_Q=None, in0_gain=None, in1_gain=None, distortion_corrections=[DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>))], out0_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, out1_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>),
'repetitions': 1},
'cluster0_module3': {'acq_metadata': {'seq0': AcquisitionMetadata(acq_protocol='SSBIntegrationComplex', bin_mode=<BinMode.AVERAGE: 'average'>, acq_return_type=<class 'complex'>, acq_channels_metadata={0: AcquisitionChannelMetadata(acq_channel=0, acq_indices=[0], thresholded_trigger_count=None)}, repetitions=1)},
'sequencers': {'seq0': AnalogSequencerSettings(sync_en=True, channel_name='complex_output_0', channel_name_measure=['complex_input_0'], connected_output_indices=(0, 1), connected_input_indices=(0, 1), sequence={'program': ' set_mrk 0 # set markers to 0\n wait_sync 4 \n upd_param 4 \n wait 4 # latency correction of 4 + 0 ns\n move 1,R0 # iterator for loop with label start\nstart: \n reset_ph \n upd_param 4 \n wait 20 # auto generated wait (20 ns)\n reset_ph \n set_awg_gain 8192,0 # setting gain for SquarePulse\n play 0,0,4 # play SquarePulse (300 ns)\n wait 96 # auto generated wait (96 ns)\n acquire 0,0,4 \n wait 1196 # auto generated wait (1196 ns)\n loop R0,@start \n stop \n', 'waveforms': {'-5151372148417050101': {'data': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'index': 0}}, 'weights': {}, 'acquisitions': {'0': {'num_bins': 1, 'index': 0}}}, seq_fn=None, thresholded_acq_trigger_write_en=None, thresholded_acq_trigger_write_address=None, thresholded_acq_trigger_write_invert=False, thresholded_acq_trigger_read_settings={}, nco_en=True, init_offset_awg_path_I=0.0, init_offset_awg_path_Q=0.0, init_gain_awg_path_I=1.0, init_gain_awg_path_Q=1.0, modulation_freq=800000000.0, mixer_corr_phase_offset_degree=-4.0, mixer_corr_gain_ratio=0.9997, auto_sideband_cal=<SidebandCalEnum.OFF: 'off'>, integration_length_acq=500, thresholded_acq_threshold=None, thresholded_acq_rotation=None, ttl_acq_input_select=None, ttl_acq_threshold=None, ttl_acq_auto_bin_incr_en=None, allow_off_grid_nco_ops=None)},
'settings': RFModuleSettings(offset_ch0_path_I=-0.054, offset_ch0_path_Q=-0.034, offset_ch1_path_I=None, offset_ch1_path_Q=None, in0_gain=2, in1_gain=3, distortion_corrections=[DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>))], out0_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, out1_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, lo0_freq=7200000000.0, lo1_freq=None, out0_att=None, out1_att=None, in0_att=None),
'repetitions': 1},
'cluster0_module4': {'acq_metadata': {'seq0': AcquisitionMetadata(acq_protocol='SSBIntegrationComplex', bin_mode=<BinMode.AVERAGE: 'average'>, acq_return_type=<class 'complex'>, acq_channels_metadata={0: AcquisitionChannelMetadata(acq_channel=1, acq_indices=[0], thresholded_trigger_count=None)}, repetitions=1)},
'sequencers': {'seq0': AnalogSequencerSettings(sync_en=True, channel_name='complex_output_0', channel_name_measure=['complex_input_0'], connected_output_indices=(0, 1), connected_input_indices=(0, 1), sequence={'program': ' set_mrk 0 # set markers to 0\n wait_sync 4 \n upd_param 4 \n wait 4 # latency correction of 4 + 0 ns\n move 1,R0 # iterator for loop with label start\nstart: \n reset_ph \n upd_param 4 \n wait 620 # auto generated wait (620 ns)\n reset_ph \n set_awg_gain 8192,0 # setting gain for SquarePulse\n play 0,0,4 # play SquarePulse (300 ns)\n wait 96 # auto generated wait (96 ns)\n acquire 0,0,4 \n wait 596 # auto generated wait (596 ns)\n loop R0,@start \n stop \n', 'waveforms': {'-5151372148417050101': {'data': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'index': 0}}, 'weights': {}, 'acquisitions': {'0': {'num_bins': 1, 'index': 0}}}, seq_fn=None, thresholded_acq_trigger_write_en=None, thresholded_acq_trigger_write_address=None, thresholded_acq_trigger_write_invert=False, thresholded_acq_trigger_read_settings={}, nco_en=True, init_offset_awg_path_I=0.0, init_offset_awg_path_Q=0.0, init_gain_awg_path_I=1.0, init_gain_awg_path_Q=1.0, modulation_freq=8000000000.0, mixer_corr_phase_offset_degree=None, mixer_corr_gain_ratio=None, auto_sideband_cal=<SidebandCalEnum.OFF: 'off'>, integration_length_acq=500, thresholded_acq_threshold=None, thresholded_acq_rotation=None, ttl_acq_input_select=None, ttl_acq_threshold=None, ttl_acq_auto_bin_incr_en=None, allow_off_grid_nco_ops=None)},
'settings': RFModuleSettings(offset_ch0_path_I=None, offset_ch0_path_Q=None, offset_ch1_path_I=None, offset_ch1_path_Q=None, in0_gain=None, in1_gain=None, distortion_corrections=[DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>))], out0_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, out1_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, lo0_freq=None, lo1_freq=None, out0_att=None, out1_att=None, in0_att=None),
'repetitions': 1},
'cluster0_module5': {'acq_metadata': {},
'sequencers': {'seq0': AnalogSequencerSettings(sync_en=True, channel_name='real_output_0', channel_name_measure=['real_input_0', 'real_input_1'], connected_output_indices=(0,), connected_input_indices=(0, 1), sequence={'program': ' set_mrk 0 # set markers to 0\n wait_sync 4 \n upd_param 4 \n wait 4 # latency correction of 4 + 0 ns\n move 1,R0 # iterator for loop with label start\nstart: \n reset_ph \n upd_param 4 \n wait 1220 # auto generated wait (1220 ns)\n set_awg_gain 3277,0 # setting gain for SquarePulse\n play 0,0,4 # play SquarePulse (100 ns)\n wait 96 # auto generated wait (96 ns)\n loop R0,@start \n stop \n', 'waveforms': {'5949084428242581461': {'data': [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0], 'index': 0}}, 'weights': {}, 'acquisitions': {}}, seq_fn=None, thresholded_acq_trigger_write_en=None, thresholded_acq_trigger_write_address=None, thresholded_acq_trigger_write_invert=False, thresholded_acq_trigger_read_settings={}, nco_en=True, init_offset_awg_path_I=0.0, init_offset_awg_path_Q=0.0, init_gain_awg_path_I=1.0, init_gain_awg_path_Q=1.0, modulation_freq=0, mixer_corr_phase_offset_degree=None, mixer_corr_gain_ratio=None, auto_sideband_cal=<SidebandCalEnum.OFF: 'off'>, integration_length_acq=None, thresholded_acq_threshold=None, thresholded_acq_rotation=None, ttl_acq_input_select=None, ttl_acq_threshold=None, ttl_acq_auto_bin_incr_en=None, allow_off_grid_nco_ops=None)},
'settings': RFModuleSettings(offset_ch0_path_I=None, offset_ch0_path_Q=None, offset_ch1_path_I=None, offset_ch1_path_Q=None, in0_gain=1, in1_gain=None, distortion_corrections=[DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>)), DistortionSettings(bt=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp0=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp1=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp2=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), exp3=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>), fir=QbloxRealTimeFilter(coeffs=None, config=<QbloxFilterConfig.BYPASSED: 'bypassed'>, marker_delay=<QbloxFilterMarkerDelay.BYPASSED: 'bypassed'>))], out0_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, out1_lo_freq_cal_type_default=<LoCalEnum.OFF: 'off'>, lo0_freq=None, lo1_freq=None, out0_att=None, out1_att=None, in0_att=None),
'repetitions': 1}},
'generic': {'lo0.frequency': 7250000000.0,
'lo0.power': 1,
'lo2.frequency': 7200000000.0,
'lo2.power': 1}}
in this merge request I'm modifying the compiled_instructions attribute of a CompiledSchedule to display a ipywidget table that is easy to traverse. e.g.
schedule = qs.Schedule("x")
schedule.add(qs.X("q0"))
schedule.add(qs.Measure("q0", acq_channel=0))
schedule.add(qs.Measure("q1", acq_channel=1))
schedule.add(
qs.SquarePulse(duration=100e-9, port="q0:fl", clock="cl0.baseband", amp=0.1)
)
compiler = qs.SerialCompiler("compiler")
compiled_schedule = compiler.compile(schedule, config=compilation_config)
compiled_schedule.compiled_instructions # compiled_schedule["compiled_instructions"] also works
will show something like the following when using an interactive session (like a jupyter notebook)
technical summary
- Because I couldn't make it work for a generic backend, this is Qblox specific
- the heavy lifting of building ipywidgets is only done when the `repr_html`` is called, typically when displaying an object at the end of a cell in a jupyter notebook.
Merge checklist
See also merge request guidelines
-
Merge request has been reviewed (in-depth by a knowledgeable contributor), and is approved by a project maintainer. -
New code is covered by unit tests (or N/A). -
New code is documented and docstrings use numpydoc format (or N/A). -
New functionality: considered making private instead of extending public API (or N/A). -
Public API changed: added @deprecatedand entry in deprecated code suggestions (or N/A). -
Newly added/adjusted documentation and docstrings render properly (or N/A). -
Pipeline fix or dependency update: post in #software-for-developerschannel to mergemainback in or update local packages (or N/A). -
Tested on hardware (or N/A). -
CHANGELOG.mdfor breaking changes andAUTHORS.mdhave been updated (or N/A). -
Update Hardware backends documentation if backend interface change or N/A -
Check whether performance is significantly affected by looking at the Performance metrics results. -
Windows tests in CI pipeline pass (manually triggered by maintainers before merging). - Maintainers do not hit Auto-merge, we need to actively check as manual tests do not block pipeline
For reference, the issues workflow is described in the contribution guidelines.
Edited by Robert Sokolewicz




