diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index de698f830e..4032c26a44 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -2,7 +2,7 @@
Thanks for your interest in the project! We welcome pull requests from developers of all skill levels.
If you find a bug or want to propose a new feature open an issue. If you have written some code that should be merged open a pull request describing your changes and why it should be merged.
-If you have a question or want to discuss something, feel free to send an email to Adriaan Rol (m.a.rol@tudelft.nl).
+If you have a question or want to discuss something, feel free to send an email to Miguel Serrao Moreira (miguel.moreira@tudelft.nl).
## Git branching model
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index a4558a00c3..0be54960b9 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -10,7 +10,7 @@ Changes proposed in this pull request:
@mention the name of someone you want to review this pull request.
In order for the pull request to be merged, the following conditions must be met:
-- travis test suite passes
+- test suite (Github actions) passes
- all reasonable issues raised by codacy must be resolved
- a positive review is required
diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml
index a1a1d8ea11..1c8067d27a 100644
--- a/.github/workflows/python_test.yml
+++ b/.github/workflows/python_test.yml
@@ -9,7 +9,9 @@ jobs:
strategy:
max-parallel: 4
matrix:
- python-version: [3.6, 3.7]
+ #python-version: [3.6, 3.7]
+ # disabled 3.7 because of 'AttributeError: 'str' object has no attribute 'decode''
+ python-version: [3.6]
steps:
- uses: actions/checkout@v1
diff --git a/.gitignore b/.gitignore
index 5f6541af1b..fceed5a656 100644
--- a/.gitignore
+++ b/.gitignore
@@ -131,6 +131,9 @@ $RECYCLE.BIN/
*.png
pycqed/measurement/openql_experiments/output/*
*.qmap
+# a file containing hashes is used to check if RB recompilation is needed
+*.qisa.hashes
+
# data files
# test data files should be explicitly added by hand (overriding .gitignore)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000000..e878fc8b6f
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,27 @@
+exclude: 'doc/conf.py'
+
+repos:
+- repo: https://github.com/asottile/pyupgrade
+ rev: v2.12.0
+ hooks:
+ - id: pyupgrade
+ # for now don't force to change from %-operator to {}
+ args: [--keep-percent-format, --py36-plus]
+
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v3.4.0
+ hooks:
+ - id: check-ast
+ - id: check-builtin-literals
+ - id: check-merge-conflict
+ - id: debug-statements
+ - id: end-of-file-fixer
+ - id: mixed-line-ending
+ - id: trailing-whitespace
+
+- repo: https://github.com/pre-commit/mirrors-autopep8
+ rev: 'v1.5.6' # Use the sha / tag you want to point at
+ hooks:
+ - id: autopep8
+ args: [--max-line-length=120]
+
diff --git a/Changelog b/Changelog
new file mode 100644
index 0000000000..29d608b776
--- /dev/null
+++ b/Changelog
@@ -0,0 +1,30 @@
+PycQED Changelog
+
+Legend:
++ Added feature
+* Improved/changed feature, compatible
+# Change that breaks existing interface
+- Bug fixed
+! Known issue / missing feature
+. Generic bullet
+
+
+v0.3 - 20211119
+# redesigned DIO timing calibration interface (PR #621):
+ . DIO modes now defined in instrument_drivers/library/DIO.py instead of individual instrument drivers
+ . usage: see examples/CC_examples/CC_demo_mux.py "DIO.calibrate"
+# support for Central Controller software v0.2.2 (older versions not supported)
+ . requires OpenQL > 0.8.1.dev4
+# removed support for deprecated hardware (PRs #620 and #646)
++ added support for real-time modulation of waveforms for microwave control
++ added support for mixer skewness calibration with real-time modulation
++ added support for virtual-Z gates
++ added multiple methods for parity check calibration and assessment
++ added multiple methods for parallel qubit calibration
+. many more undocumented changes
+
+v0.2 - 20191213
+. second public release
+
+v0.1 - 20161012
+. initial public release
diff --git a/README.md b/README.md
index d6e042b816..cbe9f63d03 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,14 @@
-# PycQED
+# PycQED
[![Build Status](https://github.com/DiCarloLab-Delft/pycqed_py3/workflows/Build%20Status/badge.svg)](https://github.com/DiCarloLab-Delft/pycqed_py3/actions)
-[![DOI](https://zenodo.org/badge/49057179.svg)](https://zenodo.org/badge/latestdoi/49057179)
+[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3574563.svg)](https://zenodo.org/record/3574563)
[![Codacy](https://api.codacy.com/project/badge/Grade/1266308dd9b84d7b933c2b46804aeb12)](https://www.codacy.com/app/AdriaanOrganization/PycQED_py3?utm_source=github.com&utm_medium=referral&utm_content=DiCarloLab-Delft/PycQED_py3&utm_campaign=badger)
[![codecov](https://codecov.io/gh/DiCarloLab-Delft/PycQED_py3/branch/master/graph/badge.svg)](https://codecov.io/gh/DiCarloLab-Delft/PycQED_py3)
-A Python-based measurement environment for circuit-QED experiments by the
-[DiCarlo group](http://dicarlolab.tudelft.nl/) at [QuTech](http://qutech.nl/),
+A Python-based measurement environment for circuit-QED experiments by the
+[DiCarlo group](https://qutech.nl/lab/dicarlo-lab-welcome/) at [QuTech](http://qutech.nl/),
Delft University of Technology.
-This module is build on top of [QCoDeS](http://qcodes.github.io/Qcodes/) and
-is not intended as a stand-alone
+This module is build on top of [QCoDeS](http://qcodes.github.io/Qcodes/) and
+is not intended as a stand-alone
package.
## License
@@ -54,8 +54,8 @@ If you use this software in any of your publications we would appreciate it if y
## Overview of the main modules
Below follows an overview of the main structure of the code. It makes sense to take a look around here if your are new to get a feeling where to find things.
-Also take a look at [this presentation](docs/160714_qcodes_meetup.pdf), where the relation to qcodes and the core concepts in the package are explained.
-Mind however that the code is continuously under development so if you think something should be in a different location feel free to tap me (Adriaan) on the shoulder or create an issue to discuss it.
+Also take a look at [this recent (March 2020) presentation](docs/200330_Introduction_to_PycQED_v2.pdf) and [this previous presentation](docs/160714_qcodes_meetup.pdf), where the relation to QCoDeS and the core concepts in the package are explained.
+Mind however that the code is continuously under development so if you think something should be in a different location feel free to tap me (Miguel) on the shoulder or create an issue to discuss it.
### Folder Structure
+ [docs](docs/)
@@ -142,5 +142,5 @@ It is split into personal folders for messing around with your personal files an
A little document containing some handy git commands:
[Git tips & tricks](docs/git_tips_and_tricks.md).
-Lecture series on scientific Python:
+Lecture series on scientific Python:
[Scientific Computing with Python](https://github.com/jrjohansson/scientific-python-lectures)
diff --git a/depr.py b/depr.py
new file mode 100755
index 0000000000..6649731ebd
--- /dev/null
+++ b/depr.py
@@ -0,0 +1,26 @@
+import sys
+import os
+from pathlib import Path
+
+# parameter handling
+path = 0
+if len(sys.argv)>1:
+ path = sys.argv[1]
+else:
+ raise RuntimeError("missing argument")
+
+src = Path(path)
+if not src.exists():
+ raise RuntimeError("path does not exist")
+
+if src.parts[0] != "pycqed":
+ raise RuntimeError("path should start with 'pycqed'")
+
+
+dst = Path('deprecated') / src.parent
+print(f"mkdir {str(dst)}")
+dst.mkdir(parents=True, exist_ok=True)
+
+cmd = f"git mv {str(src)} {str(dst)}"
+print(cmd)
+os.system(cmd)
diff --git a/pycqed/analysis/GST/__init__.py b/deprecated/pycqed/analysis/GST/__init__.py
similarity index 100%
rename from pycqed/analysis/GST/__init__.py
rename to deprecated/pycqed/analysis/GST/__init__.py
diff --git a/pycqed/analysis/GST/pyGSTi_analysis.py b/deprecated/pycqed/analysis/GST/pyGSTi_analysis.py
similarity index 100%
rename from pycqed/analysis/GST/pyGSTi_analysis.py
rename to deprecated/pycqed/analysis/GST/pyGSTi_analysis.py
diff --git a/pycqed/analysis/GST/superops_GST.py b/deprecated/pycqed/analysis/GST/superops_GST.py
similarity index 100%
rename from pycqed/analysis/GST/superops_GST.py
rename to deprecated/pycqed/analysis/GST/superops_GST.py
diff --git a/pycqed/analysis/fit_toolbox/old/__init__.py b/deprecated/pycqed/analysis/fit_toolbox/old/__init__.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/__init__.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/__init__.py
diff --git a/pycqed/analysis/fit_toolbox/old/fit.py b/deprecated/pycqed/analysis/fit_toolbox/old/fit.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/fit.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/fit.py
diff --git a/pycqed/analysis/fit_toolbox/old/functions.py b/deprecated/pycqed/analysis/fit_toolbox/old/functions.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/functions.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/functions.py
diff --git a/pycqed/analysis/fit_toolbox/old/guess_initial_values.py b/deprecated/pycqed/analysis/fit_toolbox/old/guess_initial_values.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/guess_initial_values.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/guess_initial_values.py
diff --git a/pycqed/analysis/fit_toolbox/old/hamil2.py b/deprecated/pycqed/analysis/fit_toolbox/old/hamil2.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/hamil2.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/hamil2.py
diff --git a/pycqed/analysis/fit_toolbox/old/init_guess.py b/deprecated/pycqed/analysis/fit_toolbox/old/init_guess.py
similarity index 100%
rename from pycqed/analysis/fit_toolbox/old/init_guess.py
rename to deprecated/pycqed/analysis/fit_toolbox/old/init_guess.py
diff --git a/pycqed/analysis/old_tomo_code.py b/deprecated/pycqed/analysis/old_tomo_code.py
similarity index 100%
rename from pycqed/analysis/old_tomo_code.py
rename to deprecated/pycqed/analysis/old_tomo_code.py
diff --git a/pycqed/analysis/ramiro_analysis.py b/deprecated/pycqed/analysis/ramiro_analysis.py
similarity index 100%
rename from pycqed/analysis/ramiro_analysis.py
rename to deprecated/pycqed/analysis/ramiro_analysis.py
diff --git a/pycqed/instrument_drivers/meta_instrument/CBox_LookuptableManager.py b/deprecated/pycqed/instrument_drivers/meta_instrument/CBox_LookuptableManager.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/CBox_LookuptableManager.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/CBox_LookuptableManager.py
diff --git a/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManager.py b/deprecated/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManager.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManager.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManager.py
diff --git a/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManagerManager.py b/deprecated/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManagerManager.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManagerManager.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/UHFQC_LookuptableManagerManager.py
diff --git a/pycqed/instrument_drivers/meta_instrument/distortions_corrector.py b/deprecated/pycqed/instrument_drivers/meta_instrument/distortions_corrector.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/distortions_corrector.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/distortions_corrector.py
diff --git a/pycqed/instrument_drivers/meta_instrument/heterodyne.py b/deprecated/pycqed/instrument_drivers/meta_instrument/heterodyne.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/heterodyne.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/heterodyne.py
diff --git a/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/CBox_driven_transmon.py b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/CBox_driven_transmon.py
new file mode 100644
index 0000000000..24a1ff9e24
--- /dev/null
+++ b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/CBox_driven_transmon.py
@@ -0,0 +1,760 @@
+# FIXME: file is only used by Tektronix_driven_transmon.py: we disabled methods overriden there to limit dependencies
+
+import logging
+import numpy as np
+from scipy.optimize import brent
+
+from .qubit_object import Transmon
+from qcodes.utils import validators as vals
+from qcodes.instrument.parameter import ManualParameter
+
+from pycqed.measurement import detector_functions as det
+from pycqed.measurement import composite_detector_functions as cdet
+from pycqed.measurement import mc_parameter_wrapper as pw
+
+from pycqed.measurement import sweep_functions as swf
+#from pycqed.measurement import CBox_sweep_functions as cb_swf
+from pycqed.measurement import awg_sweep_functions as awg_swf
+from pycqed.analysis import measurement_analysis as ma
+#from pycqed.measurement.pulse_sequences import standard_sequences as st_seqs
+import pycqed.measurement.randomized_benchmarking.randomized_benchmarking as rb
+#from pycqed.measurement.calibration_toolbox import mixer_carrier_cancellation_CBox
+#from pycqed.measurement.calibration_toolbox import mixer_skewness_cal_CBox_adaptive
+
+from pycqed.measurement.optimization import nelder_mead
+
+
+class CBox_driven_transmon(Transmon):
+ '''
+ Setup configuration:
+ Drive: CBox AWGs
+ Acquisition: CBox
+ Readout pulse configuration: LO modulated using AWG
+ '''
+ shared_kwargs = ['LO', 'cw_source', 'td_source', 'IVVI', 'AWG', 'LutMan',
+ 'CBox',
+ 'heterodyne_instr', 'MC']
+
+ def __init__(self, name,
+ LO, cw_source, td_source,
+ IVVI, AWG, LutMan,
+ CBox, heterodyne_instr,
+ MC, **kw):
+ super().__init__(name, **kw)
+ '''
+ Adds the parameters to the qubit insrument, it provides initial values
+ for some parameters but not for all. Powers have to be set by hand as
+ a safety measure.
+ '''
+ # MW-sources
+ self.LO = LO
+ self.cw_source = cw_source
+ self.td_source = td_source
+ self.IVVI = IVVI
+ self.LutMan = LutMan
+ self.heterodyne_instr = heterodyne_instr
+ self.AWG = AWG
+ self.CBox = CBox
+ self.MC = MC
+ self.add_parameter('mod_amp_cw', label='RO modulation ampl cw',
+ unit='V', initial_value=0.5,
+ parameter_class=ManualParameter)
+ self.add_parameter('RO_power_cw', label='RO power cw',
+ unit='dBm',
+ parameter_class=ManualParameter)
+
+ self.add_parameter('mod_amp_td', label='RO modulation ampl td',
+ unit='V', initial_value=0.5,
+ parameter_class=ManualParameter)
+
+ self.add_parameter('spec_pow', label='spectroscopy power',
+ unit='dBm',
+ parameter_class=ManualParameter)
+ self.add_parameter('spec_pow_pulsed',
+ label='pulsed spectroscopy power',
+ unit='dBm',
+ parameter_class=ManualParameter)
+ self.add_parameter('td_source_pow',
+ label='Time-domain power',
+ unit='dBm',
+ parameter_class=ManualParameter)
+ self.add_parameter('f_RO_mod',
+ label='Readout-modulation frequency', unit='Hz',
+ initial_value=-2e7,
+ parameter_class=ManualParameter)
+ # Time-domain parameters
+ self.add_parameter('f_pulse_mod',
+ initial_value=-50e6,
+ label='pulse-modulation frequency', unit='Hz',
+ parameter_class=ManualParameter)
+ self.add_parameter('awg_nr', label='CBox awg nr', unit='#',
+ parameter_class=ManualParameter)
+
+ self.add_parameter('amp180',
+ label='Pi-pulse amplitude', unit='mV',
+ initial_value=300,
+ parameter_class=ManualParameter)
+ # Amp 90 is hardcoded to be half amp180
+ self.add_parameter('amp90',
+ label='Pi/2-pulse amplitude', unit='mV',
+ get_cmd=self._get_amp90)
+ self.add_parameter('gauss_width', unit='s',
+ initial_value=40e-9,
+ parameter_class=ManualParameter)
+ self.add_parameter('motzoi', label='Motzoi parameter', unit='',
+ initial_value=0,
+ parameter_class=ManualParameter)
+
+ # Single shot readout specific parameters
+ self.add_parameter('RO_threshold', unit='dac-value',
+ initial_value=0,
+ parameter_class=ManualParameter)
+ self.add_parameter('signal_line', parameter_class=ManualParameter,
+ vals=vals.Enum(0, 1), initial_value=0)
+
+ # Mixer skewness correction
+ self.add_parameter('phi', unit='deg',
+ parameter_class=ManualParameter, initial_value=0)
+ self.add_parameter('alpha', unit='',
+ parameter_class=ManualParameter, initial_value=1)
+ # Mixer offsets correction, qubit drive
+ self.add_parameter('mixer_offs_drive_I',
+ parameter_class=ManualParameter, initial_value=0)
+ self.add_parameter('mixer_offs_drive_Q',
+ parameter_class=ManualParameter, initial_value=0)
+
+ # FIXME: overriden by Tektronix_driven_transmon.py, so we can disable here
+ # def prepare_for_continuous_wave(self):
+ #
+ # self.heterodyne_instr._disable_auto_seq_loading = False
+ # self.LO.on()
+ # self.td_source.off()
+ # if hasattr(self.heterodyne_instr, 'mod_amp'):
+ # self.heterodyne_instr.set('mod_amp', self.mod_amp_cw.get())
+ # else:
+ # self.heterodyne_instr.RF_power(self.RO_power_cw())
+ # # TODO: Update IF to f_RO_mod in heterodyne instr
+ # self.heterodyne_instr.set('f_RO_mod', self.f_RO_mod.get())
+ # self.heterodyne_instr.frequency.set(self.f_res.get())
+ #
+ # if hasattr(self.cw_source, 'pulsemod_state'):
+ # self.cw_source.pulsemod_state('off')
+ # self.cw_source.power.set(self.spec_pow.get())
+ #
+ # def prepare_for_timedomain(self):
+ # self.LO.on()
+ # self.cw_source.off()
+ # self.td_source.on()
+ # # Set source to fs =f-f_mod such that pulses appear at f = fs+f_mod
+ # self.td_source.frequency.set(self.f_qubit.get()
+ # - self.f_pulse_mod.get())
+ #
+ # # Use resonator freq unless explicitly specified
+ # if self.f_RO.get() is None:
+ # f_RO = self.f_res.get()
+ # else:
+ # f_RO = self.f_RO.get()
+ # self.LO.frequency.set(f_RO - self.f_RO_mod.get())
+ #
+ # self.td_source.power.set(self.td_source_pow.get())
+ # self.AWG.set('ch3_amp', self.mod_amp_td.get())
+ # self.AWG.set('ch4_amp', self.mod_amp_td.get())
+ # self.CBox.set('AWG{:.0g}_mode'.format(self.awg_nr.get()),
+ # 'segmented tape')
+ # # Mixer offsets correction
+ # self.CBox.set('AWG{:.0g}_dac0_offset'.format(self.awg_nr.get()),
+ # self.mixer_offs_drive_I.get())
+ # self.CBox.set('AWG{:.0g}_dac1_offset'.format(self.awg_nr.get()),
+ # self.mixer_offs_drive_Q.get())
+ #
+ # self.LutMan.amp180.set(self.amp180.get())
+ # self.LutMan.amp90.set(self.amp90.get())
+ # self.LutMan.gauss_width.set(self.gauss_width.get()*1e9) # s to ns
+ # self.LutMan.motzoi_parameter.set(self.motzoi.get())
+ # self.LutMan.f_modulation.set(self.f_pulse_mod.get()*1e-9)
+ #
+ # # Mixer skewness correction
+ # self.LutMan.IQ_phase_skewness.set(0)
+ # print('self.LutMan type: ', type(self.LutMan))
+ # self.LutMan.QI_amp_ratio.set(1)
+ # self.LutMan.apply_predistortion_matrix.set(True)
+ # self.LutMan.alpha.set(self.alpha.get())
+ # self.LutMan.phi.set(self.phi.get())
+ #
+ # self.LutMan.load_pulses_onto_AWG_lookuptable(self.awg_nr.get())
+ #
+ # self.CBox.set('sig{}_threshold_line'.format(
+ # int(self.signal_line.get())),
+ # int(self.RO_threshold.get()))
+
+
+ def get_resetless_rb_detector(self, nr_cliff, starting_seed=1,
+ nr_seeds='max', pulse_p_elt='min',
+ MC=None,
+ upload=True):
+ if MC is None:
+ MC = self.MC
+
+ if pulse_p_elt == 'min':
+ safety_factor = 5 if nr_cliff < 8 else 3
+ pulse_p_elt = int(safety_factor*nr_cliff)
+ if nr_seeds == 'max':
+ nr_seeds = 29184//pulse_p_elt
+
+ if nr_seeds*pulse_p_elt > 29184:
+ raise ValueError(
+ 'Too many pulses ({}), {} seeds, {} pulse_p_elt'.format(
+ nr_seeds*pulse_p_elt, nr_seeds, pulse_p_elt))
+
+ resetless_interval = (
+ np.round(pulse_p_elt*self.pulse_delay.get()*1e6)+2.5)*1e-6
+
+ combined_tape = []
+ for i in range(nr_seeds):
+ if starting_seed is not None:
+ seed = starting_seed*1000*i
+ else:
+ seed = None
+ rb_seq = rb.randomized_benchmarking_sequence(nr_cliff,
+ desired_net_cl=3,
+ seed=seed)
+ tape = rb.convert_clifford_sequence_to_tape(
+ rb_seq, self.LutMan.lut_mapping.get())
+ if len(tape) > pulse_p_elt:
+ raise ValueError(
+ 'Too many pulses ({}), {} pulse_p_elt'.format(
+ len(tape), pulse_p_elt))
+ combined_tape += [0]*(pulse_p_elt-len(tape))+tape
+
+ # Rename IF in awg_swf_resetless tape
+ s = awg_swf.Resetless_tape(
+ n_pulses=pulse_p_elt, tape=combined_tape,
+ IF=self.f_RO_mod.get(),
+ pulse_delay=self.pulse_delay.get(),
+ resetless_interval=resetless_interval,
+ RO_pulse_delay=self.RO_pulse_delay.get(),
+ RO_pulse_length=self.RO_pulse_length.get(),
+ RO_trigger_delay=self.RO_acq_marker_delay.get(),
+ AWG=self.AWG, CBox=self.CBox, upload=upload)
+
+ d = cdet.CBox_trace_error_fraction_detector(
+ 'Resetless rb det',
+ MC=MC, AWG=self.AWG, CBox=self.CBox,
+ sequence_swf=s,
+ threshold=self.RO_threshold.get(),
+ save_raw_trace=False)
+ return d
+
+ # FIXME: unused by Tektronix_driven_transmon.py, so we can disable here
+ # def calibrate_pulse_parameters(self, method='resetless_rb', nr_cliff=10,
+ # parameters=['amp', 'motzoi', 'frequency'],
+ # amp_guess=None, motzoi_guess=None,
+ # frequency_guess=None,
+ # a_step=30, m_step=.1, f_step=20e3,
+ # MC=None, nested_MC=None,
+ # update=False, close_fig=True,
+ # verbose=True):
+ # '''
+ # Calibrates single qubit pulse parameters currently only using
+ # the resetless rb method (requires reasonable (80%+?) discrimination
+ # fidelity)
+ #
+ # If it there is only one parameter to sweep it will use brent's method
+ # instead.
+ #
+ # The function returns the values it found for the optimization.
+ # '''
+ # if method is not 'resetless_rb':
+ # raise NotImplementedError()
+ #
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ # if nested_MC is None:
+ # nested_MC = self.nested_MC
+ #
+ # d = self.get_resetless_rb_detector(nr_cliff=nr_cliff, MC=nested_MC)
+ #
+ # name = 'RB_{}cl_numerical'.format(nr_cliff)
+ # MC.set_detector_function(d)
+ #
+ # if amp_guess is None:
+ # amp_guess = self.amp180.get()
+ # if motzoi_guess is None:
+ # motzoi_guess = self.motzoi.get()
+ # if frequency_guess is None:
+ # frequency_guess = self.f_qubit.get()
+ # # Because we are sweeping the source and not the qubit frequency
+ # start_freq = frequency_guess - self.f_pulse_mod.get()
+ #
+ # sweep_functions = []
+ # x0 = []
+ # init_steps = []
+ # if 'amp' in parameters:
+ # sweep_functions.append(cb_swf.LutMan_amp180_90(self.LutMan))
+ # x0.append(amp_guess)
+ # init_steps.append(a_step)
+ # if 'motzoi' in parameters:
+ # sweep_functions.append(
+ # pw.wrap_par_to_swf(self.LutMan.motzoi_parameter))
+ # x0.append(motzoi_guess)
+ # init_steps.append(m_step)
+ # if 'frequency' in parameters:
+ # sweep_functions.append(
+ # pw.wrap_par_to_swf(self.td_source.frequency))
+ # x0.append(start_freq)
+ # init_steps.append(f_step)
+ # if len(sweep_functions) == 0:
+ # raise ValueError(
+ # 'parameters "{}" not recognized'.format(parameters))
+ #
+ # MC.set_sweep_functions(sweep_functions)
+ #
+ # if len(sweep_functions) != 1:
+ # # noise ensures no_improv_break sets the termination condition
+ # ad_func_pars = {'adaptive_function': nelder_mead,
+ # 'x0': x0,
+ # 'initial_step': init_steps,
+ # 'no_improv_break': 10,
+ # 'minimize': False,
+ # 'maxiter': 500}
+ # elif len(sweep_functions) == 1:
+ # # Powell does not work for 1D, use brent instead
+ # brack = (x0[0]-5*init_steps[0], x0[0])
+ # # Ensures relative change in parameter is relevant
+ # if parameters == ['frequency']:
+ # tol = 1e-9
+ # else:
+ # tol = 1e-3
+ # print('Tolerance:', tol, init_steps[0])
+ # print(brack)
+ # ad_func_pars = {'adaptive_function': brent,
+ # 'brack': brack,
+ # 'tol': tol, # Relative tolerance in brent
+ # 'minimize': False}
+ # MC.set_adaptive_function_parameters(ad_func_pars)
+ # MC.run(name=name, mode='adaptive')
+ # if len(sweep_functions) != 1:
+ # a = ma.OptimizationAnalysis(auto=True, label=name,
+ # close_fig=close_fig)
+ # if verbose:
+ # # Note printing can be made prettier
+ # print('Optimization converged to:')
+ # print('parameters: {}'.format(parameters))
+ # print(a.optimization_result[0])
+ # if update:
+ # for i, par in enumerate(parameters):
+ # if par == 'amp':
+ # self.amp180.set(a.optimization_result[0][i])
+ # elif par == 'motzoi':
+ # self.motzoi.set(a.optimization_result[0][i])
+ # elif par == 'frequency':
+ # self.f_qubit.set(a.optimization_result[0][i] +
+ # self.f_pulse_mod.get())
+ # return a
+ # else:
+ # a = ma.MeasurementAnalysis(label=name, close_fig=close_fig)
+ # print('Optimization for {} converged to: {}'.format(
+ # parameters[0], a.sweep_points[-1]))
+ # if update:
+ # if parameters == ['amp']:
+ # self.amp180.set(a.sweep_points[-1])
+ # elif parameters == ['motzoi']:
+ # self.motzoi.set(a.sweep_points[-1])
+ # elif parameters == ['frequency']:
+ # self.f_qubit.set(a.sweep_points[-1]+self.f_pulse_mod.get())
+ # return a.sweep_points[-1]
+
+ # FIXME: overriden by Tektronix_driven_transmon.py, so we can disable here
+ # def calibrate_mixer_offsets(self, signal_hound, update=True):
+ # '''
+ # Calibrates the mixer skewness and updates the I and Q offsets in
+ # the qubit object.
+ # signal hound needs to be given as it this is not part of the qubit
+ # object in order to reduce dependencies.
+ # '''
+ # # ensures freq is set correctly
+ # self.prepare_for_timedomain()
+ # self.AWG.stop() # Make sure no waveforms are played
+ # offset_I, offset_Q = mixer_carrier_cancellation_CBox(
+ # CBox=self.CBox, SH=signal_hound, source=self.td_source,
+ # MC=self.MC, awg_nr=self.awg_nr.get())
+ # if update:
+ # self.mixer_offs_drive_I.set(offset_I)
+ # self.mixer_offs_drive_Q.set(offset_Q)
+ #
+ # def calibrate_mixer_skewness(self, signal_hound, update=True):
+ # '''
+ # Calibrates the mixer skewness using mixer_skewness_cal_CBox_adaptive
+ # see calibration toolbox for details
+ # '''
+ # self.prepare_for_timedomain()
+ # phi, alpha = mixer_skewness_cal_CBox_adaptive(
+ # CBox=self.CBox, SH=signal_hound, source=self.td_source,
+ # LutMan=self.LutMan, AWG=self.AWG, MC=self.MC,
+ # awg_nrs=[self.awg_nr.get()], calibrate_both_sidebands=True)
+ # if update:
+ # self.phi.set(phi)
+ # self.alpha.set(alpha)
+ #
+ # def calibrate_RO_threshold(self, method='conventional',
+ # MC=None, close_fig=True,
+ # verbose=False, make_fig=True):
+ # '''
+ # Calibrates the RO threshold and applies the correct rotation to the
+ # data either using a conventional SSRO experiment or by using the
+ # self-consistent method.
+ #
+ # For details see measure_ssro() and measure_discrimination_fid()
+ #
+ # method: 'conventional' or 'self-consistent
+ #
+ # '''
+ # self.prepare_for_timedomain()
+ #
+ # if method.lower() == 'conventional':
+ # self.CBox.lin_trans_coeffs.set([1, 0, 0, 1])
+ # self.measure_ssro(MC=MC, analyze=False, close_fig=close_fig,
+ # verbose=verbose)
+ # a = ma.SSRO_Analysis(auto=True, close_fig=True,
+ # label='SSRO', no_fits=True,
+ # close_file=True)
+ # # SSRO analysis returns the angle to rotate by
+ # theta = a.theta # analysis returns theta in rad
+ #
+ # rot_mat = [np.cos(theta), -np.sin(theta),
+ # np.sin(theta), np.cos(theta)]
+ # self.CBox.lin_trans_coeffs.set(rot_mat)
+ # self.threshold = a.V_opt_raw # allows
+ # self.RO_threshold.set(int(a.V_opt_raw))
+ #
+ # elif method.lower() == 'self-consistent':
+ # self.CBox.lin_trans_coeffs.set([1, 0, 0, 1])
+ # discr_vals = self.measure_discrimination_fid(
+ # MC=MC, close_fig=close_fig, make_fig=make_fig, verbose=verbose)
+ #
+ # # hardcoded indices correspond to values in CBox SSRO discr det
+ # theta = discr_vals[2] * 2 * np.pi/360
+ #
+ # # Discr returns the current angle, rotation is - that angle
+ # rot_mat = [np.cos(-1*theta), -np.sin(-1*theta),
+ # np.sin(-1*theta), np.cos(-1*theta)]
+ # self.CBox.lin_trans_coeffs.set(rot_mat)
+ #
+ # # Measure it again to determine the threshold after rotating
+ # discr_vals = self.measure_discrimination_fid(
+ # MC=MC, close_fig=close_fig, make_fig=make_fig, verbose=verbose)
+ #
+ # # hardcoded indices correspond to values in CBox SSRO discr det
+ # theta = discr_vals[2]
+ # self.threshold = int(discr_vals[3])
+ #
+ # self.RO_threshold.set(int(self.threshold))
+ # else:
+ # raise ValueError('method %s not recognized, can be' % method +
+ # ' either "conventional" or "self-consistent"')
+ #
+ # def measure_heterodyne_spectroscopy(self, freqs, MC=None,
+ # analyze=True, close_fig=True, RO_length=2000e-9):
+ # self.prepare_for_continuous_wave()
+ # if MC is None:
+ # MC = self.MC
+ # MC.set_sweep_function(pw.wrap_par_to_swf(
+ # self.heterodyne_instr.frequency))
+ # MC.set_sweep_points(freqs)
+ # MC.set_detector_function(det.Heterodyne_probe(self.heterodyne_instr, trigger_separation=2.8e-6, RO_length=2274e-9))
+ # MC.run(name='Resonator_scan'+self.msmt_suffix)
+ # if analyze:
+ # ma.MeasurementAnalysis(auto=True, close_fig=close_fig)
+ #
+ # def measure_spectroscopy(self, freqs, pulsed=False, MC=None,
+ # analyze=True, close_fig=True, mode='ROGated_SpecGate',
+ # force_load=False):
+ # self.prepare_for_continuous_wave()
+ # self.cw_source.on()
+ # if MC is None:
+ # MC = self.MC
+ # if pulsed:
+ # # Redirect to the pulsed spec function
+ # return self.measure_pulsed_spectroscopy(freqs=freqs,
+ # MC=MC,
+ # analyze=analyze,
+ # close_fig=close_fig,
+ # mode=mode, force_load=force_load)
+ #
+ # MC.set_sweep_function(pw.wrap_par_to_swf(
+ # self.cw_source.frequency))
+ # MC.set_sweep_points(freqs)
+ # MC.set_detector_function(
+ # det.Heterodyne_probe(self.heterodyne_instr, trigger_separation=2.8e-6))
+ # MC.run(name='spectroscopy'+self.msmt_suffix)
+ #
+ # if analyze:
+ # ma.MeasurementAnalysis(auto=True, close_fig=close_fig)
+ # self.cw_source.off()
+ #
+ # def measure_pulsed_spectroscopy(self, freqs, mode='ROGated_SpecGate', MC=None,
+ # analyze=True, close_fig=True, force_load=False):
+ # # This is a trick so I can reuse the heterodyne instr
+ # # to do pulsed-spectroscopy
+ # self.heterodyne_instr._disable_auto_seq_loading = True
+ #
+ # if mode=='ROMod_SpecGated':
+ # if ('Pulsed_spec_with_RF_mod' not in self.AWG.setup_filename.get()) or force_load:
+ # st_seqs.Pulsed_spec_seq_RF_mod(
+ # IF=self.f_RO_mod.get(),
+ # spec_pulse_length=spec_pulse_length, marker_interval=30e-6,
+ # RO_pulse_delay=self.RO_pulse_delay.get())
+ # elif mode=='ROGated_SpecGate':
+ # if ('Pulsed_spec_with_RF_gated' not in self.AWG.setup_filename.get()) or force_load:
+ # st_seqs.Pulsed_spec_seq_RF_gated(self.RO_pars,
+ # self.pulse_pars)
+ # else:
+ # NotImplementedError('Pulsed Spec mode not supported. Only ROMod_SpecGated and ROGated_SpecGate are avaible right now.\n')
+ #
+ # self.cw_source.pulsemod_state.set('on')
+ # self.cw_source.power.set(self.spec_pow_pulsed.get())
+ #
+ # self.AWG.start()
+ # if hasattr(self.heterodyne_instr, 'mod_amp'):
+ # self.heterodyne_instr.set('mod_amp', self.mod_amp_cw.get())
+ # else:
+ # self.heterodyne_instr.RF.power(self.RO_power_cw())
+ # MC.set_sweep_function(pw.wrap_par_to_swf(
+ # self.cw_source.frequency))
+ # MC.set_sweep_points(freqs)
+ # MC.set_detector_function(det.Heterodyne_probe(self.heterodyne_instr))
+ # MC.run(name='pulsed-spec'+self.msmt_suffix)
+ # if analyze:
+ # ma.MeasurementAnalysis(auto=True, close_fig=close_fig)
+
+ def measure_resonator_power(self, freqs, powers,
+ MC=None, analyze=True, close_fig=True):
+ '''
+ N.B. This one does not use powers but varies the mod-amp.
+ Need to find a way to keep this function agnostic to that
+ '''
+ self.prepare_for_continuous_wave()
+ if MC is None:
+ MC = self.MC
+ MC.set_sweep_functions(
+ [pw.wrap_par_to_swf(self.heterodyne_instr.frequency),
+ pw.wrap_par_to_swf(self.heterodyne_instr.RF_power)])
+ MC.set_sweep_points(freqs)
+ MC.set_sweep_points_2D(powers)
+ MC.set_detector_function(det.Heterodyne_probe(self.heterodyne_instr))
+ MC.run(name='Resonator_power_scan'+self.msmt_suffix, mode='2D')
+ if analyze:
+ ma.MeasurementAnalysis(auto=True, TwoD=True, close_fig=close_fig)
+
+ def measure_resonator_dac(self, freqs, dac_voltages,
+ MC=None, analyze=True, close_fig=True):
+ self.prepare_for_continuous_wave()
+ if MC is None:
+ MC = self.MC
+ MC.set_sweep_functions(
+ [self.heterodyne_instr.frequency,
+ self.IVVI.parameters['dac{}'.format(self.dac_channel())]])
+ MC.set_sweep_points(freqs)
+ MC.set_sweep_points_2D(dac_voltages)
+ MC.set_detector_function(det.Heterodyne_probe(self.heterodyne_instr))
+ MC.run(name='Resonator_dac_scan'+self.msmt_suffix, mode='2D')
+ if analyze:
+ ma.MeasurementAnalysis(auto=True, TwoD=True, close_fig=close_fig)
+
+ # FIXME: overriden by Tektronix_driven_transmon.py, so we can disable here
+ # def measure_rabi(self, amps, n=1,
+ # MC=None, analyze=True, close_fig=True,
+ # verbose=False):
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ # cal_points = [0, 0]
+ # amps = cal_points + list(amps)
+ # self.CBox.AWG0_mode('Codeword-trigger mode')
+ # self.CBox.AWG1_mode('Codeword-trigger mode')
+ # self.CBox.AWG2_mode('Codeword-trigger mode')
+ # self.CBox.set_master_controller_working_state(0, 0, 0)
+ # self.CBox.load_instructions('CBox_v3_test_program\Rabi.asm')
+ # self.CBox.set_master_controller_working_state(1, 0, 0)
+ # MC.set_sweep_function(pw.wrap_par_to_swf(self.LutMan.amp180))
+ # MC.set_sweep_points(amps)
+ # MC.set_detector_function(det.CBox_v3_single_int_avg_with_LutReload(
+ # self.CBox, self.LutMan,
+ # awg_nrs=[self.awg_nr.get()]))
+ # MC.run('Rabi-n{}'.format(n)+self.msmt_suffix)
+ # if analyze:
+ # ma.MeasurementAnalysis(auto=True, close_fig=close_fig)
+ #
+ # def measure_T1(self, times, MC=None,
+ # analyze=True, close_fig=True):
+ # '''
+ # if update is True will update self.T1 with the measured value
+ # '''
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ # # append the calibration points, times are for location in plot
+ # times = np.concatenate([times,
+ # (times[-1]+times[0],
+ # times[-1]+times[1],
+ # times[-1]+times[2],
+ # times[-1]+times[3])])
+ # MC.set_sweep_function(
+ # awg_swf.CBox_v3_T1(CBox=self.CBox, upload=True))
+ # MC.set_sweep_points(times)
+ # MC.set_detector_function(det.CBox_v3_integrated_average_detector(
+ # self.CBox))
+ # MC.run('T1'+self.msmt_suffix)
+ # if analyze:
+ # a = ma.T1_Analysis(auto=True, close_fig=True)
+ # return a.T1
+ #
+ # def measure_ramsey(self, times, artificial_detuning=0, f_qubit=None,
+ # label='',
+ # MC=None, analyze=True, close_fig=True, verbose=True):
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ #
+ # # This is required because I cannot change the phase in the pulses
+ # if not all([np.round(t*1e9) % (1/self.f_pulse_mod.get()*1e9)
+ # == 0 for t in times]):
+ # raise ValueError('timesteps must be multiples of modulation freq')
+ #
+ # if f_qubit is None:
+ # f_qubit = self.f_qubit.get()
+ # # this should have no effect if artificial detuning = 0
+ # self.td_source.set('frequency', f_qubit - self.f_pulse_mod.get() +
+ # artificial_detuning)
+ # Rams_swf = awg_swf.CBox_Ramsey(
+ # AWG=self.AWG, CBox=self.CBox, IF=self.f_RO_mod.get(), pulse_delay=0,
+ # RO_pulse_delay=self.RO_pulse_delay.get(),
+ # RO_trigger_delay=self.RO_acq_marker_delay.get(),
+ # RO_pulse_length=self.RO_pulse_length.get())
+ # MC.set_sweep_function(Rams_swf)
+ # MC.set_sweep_points(times)
+ # MC.set_detector_function(det.CBox_integrated_average_detector(
+ # self.CBox, self.AWG))
+ # MC.run('Ramsey'+label+self.msmt_suffix)
+ #
+ # if analyze:
+ # a = ma.Ramsey_Analysis(auto=True, close_fig=True)
+ #
+ # if verbose:
+ # fitted_freq = a.fit_res.params['frequency'].value
+ # print('Artificial detuning: {:.2e}'.format(
+ # artificial_detuning))
+ # print('Fitted detuning: {:.2e}'.format(fitted_freq))
+ # print('Actual detuning:{:.2e}'.format(
+ # fitted_freq-artificial_detuning))
+ #
+ # def measure_allxy(self, MC=None,
+ # analyze=True, close_fig=True, verbose=True):
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ # d = cdet.AllXY_devition_detector_CBox(
+ # 'AllXY'+self.msmt_suffix, MC=MC,
+ # AWG=self.AWG, CBox=self.CBox, IF=self.f_RO_mod.get(),
+ # pulse_delay=self.pulse_delay.get(),
+ # RO_pulse_delay=self.RO_pulse_delay.get(),
+ # RO_trigger_delay=self.RO_acq_marker_delay.get(),
+ # RO_pulse_length=self.RO_pulse_length.get())
+ # d.prepare()
+ # d.acquire_data_point()
+ # if analyze:
+ # a = ma.AllXY_Analysis(close_main_fig=close_fig)
+ # return a
+ #
+ # def measure_ssro(self, no_fits=False,
+ # return_detector=False,
+ # MC=None,
+ # analyze=True, close_fig=True, verbose=True):
+ # self.prepare_for_timedomain()
+ #
+ # if MC is None:
+ # MC = self.MC
+ # d = cdet.SSRO_Fidelity_Detector_CBox(
+ # 'SSRO'+self.msmt_suffix,
+ # analyze=return_detector,
+ # raw=no_fits,
+ # MC=MC,
+ # AWG=self.AWG, CBox=self.CBox, IF=self.f_RO_mod.get(),
+ # pulse_delay=self.pulse_delay.get(),
+ # RO_pulse_delay=self.RO_pulse_delay.get(),
+ # RO_trigger_delay=self.RO_acq_marker_delay.get(),
+ # RO_pulse_length=self.RO_pulse_length.get())
+ #
+ # if return_detector:
+ # return d
+ # d.prepare()
+ # d.acquire_data_point()
+ # if analyze:
+ # ma.SSRO_Analysis(label='SSRO'+self.msmt_suffix,
+ # no_fits=no_fits, close_fig=close_fig)
+
+ def measure_discrimination_fid(self, no_fits=False,
+ return_detector=False,
+ MC=None,
+ analyze=True,
+ close_fig=True, make_fig=True,
+ verbose=True):
+ '''
+ Measures the single shot discrimination fidelity.
+ Uses whatever sequence is currently loaded and takes 8000 single shots
+ Constructs histograms based on those and uses it to extract the
+ single-shot discrimination fidelity.
+ '''
+ self.prepare_for_timedomain()
+
+ if MC is None:
+ MC = self.MC
+
+ # If I return the detector to use it must do analysis internally
+ # Otherwise I do it here in the qubit object so that I can pass args
+ analysis_in_det = return_detector
+ d = cdet.CBox_SSRO_discrimination_detector(
+ 'SSRO-disc'+self.msmt_suffix,
+ analyze=analysis_in_det,
+ MC=MC, AWG=self.AWG, CBox=self.CBox,
+ sequence_swf=swf.None_Sweep(sweep_control='hard',
+ sweep_points=np.arange(10)))
+ if return_detector:
+ return d
+ d.prepare()
+ discr_vals = d.acquire_data_point()
+ if analyze:
+ current_threshold = self.CBox.sig0_threshold_line.get()
+ a = ma.SSRO_discrimination_analysis(
+ label='SSRO-disc'+self.msmt_suffix,
+ current_threshold=current_threshold,
+ close_fig=close_fig,
+ plot_2D_histograms=make_fig)
+
+ return (a.F_discr_curr_t*100, a.F_discr*100,
+ a.theta, a.opt_I_threshold,
+ a.relative_separation, a.relative_separation_I)
+ return discr_vals
+
+ # FIXME: overriden by Tektronix_driven_transmon.py, so we can disable here
+ # def measure_rb_vs_amp(self, amps, nr_cliff=1,
+ # resetless=True,
+ # MC=None, analyze=True, close_fig=True,
+ # verbose=False):
+ # self.prepare_for_timedomain()
+ # if MC is None:
+ # MC = self.MC
+ # if resetless:
+ # d = self.get_resetless_rb_detector(nr_cliff=nr_cliff)
+ # else:
+ # raise NotImplementedError()
+ # MC.set_detector_function(d)
+ # MC.set_sweep_functions([cb_swf.LutMan_amp180_90(self.LutMan)])
+ # MC.set_sweep_points(amps)
+ # MC.run('RB-vs-amp_{}cliff'.format(nr_cliff) + self.msmt_suffix)
+ # if analyze:
+ # ma.MeasurementAnalysis(close_fig=close_fig)
+
+ def _get_amp90(self):
+ return self.amp180.get()/2
diff --git a/pycqed/instrument_drivers/meta_instrument/qubit_objects/CC_transmon.py b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/CC_transmon.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/qubit_objects/CC_transmon.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/CC_transmon.py
diff --git a/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py
similarity index 99%
rename from pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py
index 1bea99dee9..0cd9e9588b 100644
--- a/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py
+++ b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon.py
@@ -28,7 +28,7 @@
from .qubit_object import Transmon
from .CBox_driven_transmon import CBox_driven_transmon
-# It would be better to inherit from Transmon directly and put all the common
+# FIXME: It would be better to inherit from Transmon directly and put all the common
# stuff in there but for now I am inheriting from what I already have
# MAR april 2016
diff --git a/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon_v2.py b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon_v2.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon_v2.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/Tektronix_driven_transmon_v2.py
diff --git a/pycqed/instrument_drivers/meta_instrument/qubit_objects/duplexer_tek_transmon.py b/deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/duplexer_tek_transmon.py
similarity index 100%
rename from pycqed/instrument_drivers/meta_instrument/qubit_objects/duplexer_tek_transmon.py
rename to deprecated/pycqed/instrument_drivers/meta_instrument/qubit_objects/duplexer_tek_transmon.py
diff --git a/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBox_v3.py b/deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBox_v3.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/QuTech_ControlBox_v3.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBox_v3.py
diff --git a/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBoxdriver.py b/deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBoxdriver.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/QuTech_ControlBoxdriver.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_ControlBoxdriver.py
diff --git a/pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py b/deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py
similarity index 99%
rename from pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py
index 639fb1852a..82bac1b1e1 100644
--- a/pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py
+++ b/deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_DDM_module.py
@@ -487,7 +487,7 @@ def _getInputAverage(self, ch):
time.sleep(1.0/FINISH_BIT_CHECK_FERQUENTION_HZ)
self._displayInAvgErrors("Input Average", ch)
self.write('qutech:inputavg{:d}:data? '.format(ch))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
inputavg = np.frombuffer(binBlock, dtype=np.float32)
return inputavg
@@ -507,7 +507,7 @@ def _getTVdata(self, ch_pair, wNr):
sys.stdout.flush()
self._displayQBitErrors("TV Mode", ch_pair, wNr)
self.write('qutech:tvmode{:d}:data{:d}? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
tvmodedata = np.frombuffer(binBlock, dtype=np.float32)
return tvmodedata
@@ -527,7 +527,7 @@ def _getCorrelationData(self):
sys.stdout.flush()
self._displayQBitErrors("Correlation", 1, 1)
self.write('qutech:correlation:data? ')
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
tvmodedata = np.frombuffer(binBlock, dtype=np.float32)
return tvmodedata
@@ -543,11 +543,11 @@ def _sendWeightData(self, ch, wNr, weight):
# write binblock
hdr = 'qutech:wint:data {:d}, {:d},'.format(ch, wNr)
- self.bin_block_write(binBlock, hdr)
+ self.binBlockWrite(binBlock, hdr)
def _getWeightData(self, ch, wNr):
self.write('qutech:wint{:d}:data{:d}? '.format(ch, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
weightdata = np.frombuffer(binBlock, dtype=np.int8)
return weightdata
@@ -568,7 +568,7 @@ def _getQstateCNT(self, ch_pair, wNr):
self._displayQBitErrors("TV Mode - Qbit state", ch_pair, wNr)
self.write('qutech:qstate{:d}:data{:d}:counter? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
qstatecnt = np.frombuffer(binBlock, dtype=np.float32)
return qstatecnt
@@ -588,7 +588,7 @@ def _getQstateAVG(self, ch_pair, wNr):
sys.stdout.flush()
self._displayQBitErrors("TV Mode - Qbit state", ch_pair, wNr)
self.write('qutech:qstate{:d}:data{:d}:average? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
qstateavg = np.frombuffer(binBlock, dtype=np.float32)
return qstateavg
@@ -609,7 +609,7 @@ def _getLoggingInt(self, ch_pair, wNr):
sys.stdout.flush()
self._displayQBitErrors("Logging", ch_pair, wNr)
self.write('qutech:logging{:d}:data{:d}:int? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
intlogging = np.frombuffer(binBlock, dtype=np.float32)
return intlogging
@@ -630,7 +630,7 @@ def _getLoggingQstate(self, ch_pair, wNr):
sys.stdout.flush()
self._displayQBitErrors("Logging - Qbit state", ch_pair, wNr)
self.write('qutech:logging{:d}:data{:d}:qstate? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
qstatelogging = np.frombuffer(binBlock, dtype=np.float32)
return qstatelogging
@@ -749,7 +749,7 @@ def _getErrFractCnt(self, ch_pair, wNr):
self._displayQBitErrors("Error Fract", ch_pair, wNr)
self.write('qutech:errorfraction{:d}:data{:d}? '.format(ch_pair, wNr))
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
errfractioncnt = np.frombuffer(binBlock, dtype=np.int32)
print('NoErrorCounterReg = {:d}'.format(errfractioncnt[0]))
print('SingleErrorCounterReg= {:d}'.format(errfractioncnt[1]))
@@ -808,7 +808,7 @@ def _get2BitPatternCnt(self):
self._displayQBitErrors("Two Bit Pattern Counter", 1, 1)
self.write('qutech:twoBitPattern:data? ')
- binBlock = self.bin_block_read()
+ binBlock = self.binBlockRead()
errfractioncnt = np.frombuffer(binBlock, dtype=np.int32)
print('NoErrorCounterReg = {:d}'.format(errfractioncnt[0]))
print('SingleErrorCounterReg= {:d}'.format(errfractioncnt[1]))
diff --git a/pycqed/instrument_drivers/physical_instruments/QuTech_Duplexer.py b/deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_Duplexer.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/QuTech_Duplexer.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/QuTech_Duplexer.py
diff --git a/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py b/deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py
similarity index 99%
rename from pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py
index 9607ea01dc..006c29a6cd 100644
--- a/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py
+++ b/deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell.py
@@ -1,6 +1,6 @@
# N.B. !!!!!!!
-# This file should match the zishell_nh.py but was provided by Yves for
-# debugging in may 2019. Note that this file is not used in the rest of PycQED.
+# This file should match the zishell_nh.py but was provided by Yves for
+# debugging in may 2019. Note that this file is not used in the rest of PycQED.
#!/usr/bin/ipython
@@ -406,7 +406,7 @@ def connect_server(self, host, port=8004, api_level=5):
if not self.daq:
raise(ziShellDAQError())
- self.daq.setDebugLevel(0)
+ self.daq.setDebugLevel(3)
self.connected = False
if self.device and self.interface:
diff --git a/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell_NH.py b/deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell_NH.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell_NH.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/attic/zishell_NH.py
diff --git a/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/d_node_pars.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/d_node_pars.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/d_node_pars.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/d_node_pars.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/s_node_pars.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/s_node_pars.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/s_node_pars.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/ZurichInstruments/zi_parameter_files/attic/s_node_pars.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/AsmLabelNewLineTest.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/AsmLabelNewLineTest.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/AsmLabelNewLineTest.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/AsmLabelNewLineTest.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/Assembler.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/Assembler.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/Assembler.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/Assembler.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/DebugAssembler.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/DebugAssembler.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/DebugAssembler.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/DebugAssembler.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/Mock_QuTech_ControlBoxdriver.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/Mock_QuTech_ControlBoxdriver.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/Mock_QuTech_ControlBoxdriver.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/Mock_QuTech_ControlBoxdriver.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/TestAsm.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/TestAsm.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/TestAsm.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/TestAsm.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/__init__.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/__init__.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/__init__.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/__init__.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/codec.pyx b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/codec.pyx
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/codec.pyx
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/codec.pyx
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.c b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.c
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.c
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.c
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.pyx b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.pyx
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.pyx
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/decoder.pyx
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders_CBox_v3.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders_CBox_v3.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders_CBox_v3.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/defHeaders_CBox_v3.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/old_assembler.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/old_assembler.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/old_assembler.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/old_assembler.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/setup.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/setup.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/setup.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/setup.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite_v3.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite_v3.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite_v3.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/test_suite_v3.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest2.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest2.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest2.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/LogicUnitTest2.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest2.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest2.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest2.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/Markertest2.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch2.txt b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch2.txt
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch2.txt
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/testasmprog/TwoBranch2.txt
diff --git a/pycqed/instrument_drivers/physical_instruments/_controlbox/xiangs_timing_tape_code.py b/deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/xiangs_timing_tape_code.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_controlbox/xiangs_timing_tape_code.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_controlbox/xiangs_timing_tape_code.py
diff --git a/pycqed/instrument_drivers/physical_instruments/_duplexer/Cal_Data_Duplexer_SN2_CH11.hdf5 b/deprecated/pycqed/instrument_drivers/physical_instruments/_duplexer/Cal_Data_Duplexer_SN2_CH11.hdf5
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_duplexer/Cal_Data_Duplexer_SN2_CH11.hdf5
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_duplexer/Cal_Data_Duplexer_SN2_CH11.hdf5
diff --git a/pycqed/instrument_drivers/physical_instruments/_duplexer/duplexer_normalized_gain.hdf5 b/deprecated/pycqed/instrument_drivers/physical_instruments/_duplexer/duplexer_normalized_gain.hdf5
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/_duplexer/duplexer_normalized_gain.hdf5
rename to deprecated/pycqed/instrument_drivers/physical_instruments/_duplexer/duplexer_normalized_gain.hdf5
diff --git a/pycqed/instrument_drivers/physical_instruments/attic/QuTech_VSM_Module_jeroen.py b/deprecated/pycqed/instrument_drivers/physical_instruments/attic/QuTech_VSM_Module_jeroen.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/attic/QuTech_VSM_Module_jeroen.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/attic/QuTech_VSM_Module_jeroen.py
diff --git a/pycqed/instrument_drivers/physical_instruments/wouter/QuTech_CCL.py b/deprecated/pycqed/instrument_drivers/physical_instruments/wouter/QuTech_CCL.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/wouter/QuTech_CCL.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/wouter/QuTech_CCL.py
diff --git a/pycqed/instrument_drivers/physical_instruments/wouter/SCPI.py b/deprecated/pycqed/instrument_drivers/physical_instruments/wouter/SCPI.py
similarity index 100%
rename from pycqed/instrument_drivers/physical_instruments/wouter/SCPI.py
rename to deprecated/pycqed/instrument_drivers/physical_instruments/wouter/SCPI.py
diff --git a/pycqed/instrument_drivers/virtual_instruments/pyqx/__init__.py b/deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/__init__.py
similarity index 100%
rename from pycqed/instrument_drivers/virtual_instruments/pyqx/__init__.py
rename to deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/__init__.py
diff --git a/pycqed/instrument_drivers/virtual_instruments/pyqx/qasm_loader.py b/deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/qasm_loader.py
similarity index 100%
rename from pycqed/instrument_drivers/virtual_instruments/pyqx/qasm_loader.py
rename to deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/qasm_loader.py
diff --git a/pycqed/instrument_drivers/virtual_instruments/pyqx/qx_client.py b/deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/qx_client.py
similarity index 100%
rename from pycqed/instrument_drivers/virtual_instruments/pyqx/qx_client.py
rename to deprecated/pycqed/instrument_drivers/virtual_instruments/pyqx/qx_client.py
diff --git a/pycqed/measurement/CBox_sweep_functions.py b/deprecated/pycqed/measurement/CBox_sweep_functions.py
similarity index 99%
rename from pycqed/measurement/CBox_sweep_functions.py
rename to deprecated/pycqed/measurement/CBox_sweep_functions.py
index 1188b8e716..f75b22291a 100644
--- a/pycqed/measurement/CBox_sweep_functions.py
+++ b/deprecated/pycqed/measurement/CBox_sweep_functions.py
@@ -4,7 +4,7 @@
from pycqed.measurement.sweep_functions import Soft_Sweep
from pycqed.measurement.waveform_control_CC import waveform as wf
-# Commented out as there is no module named Experiments.CLEAR.prepare_for_CLEAR.prepare_for_CLEAR
+# FIXME: Commented out as there is no module named Experiments.CLEAR.prepare_for_CLEAR.prepare_for_CLEAR
# from Experiments.CLEAR.prepare_for_CLEAR import prepare_for_CLEAR
import time
@@ -1213,7 +1213,7 @@ class prepare_for_conditional_depletion(Soft_Sweep):
def __init__(self, AllXY_trigger=200, sweep_control='soft', double_pulse_Ramsey_idling=100, RTF_qubit_pulses=False, **kw):
super(prepare_for_conditional_depletion, self).__init__()
- import Experiments.CLEAR.prepare_for_CLEAR as pfC
+ import Experiments.CLEAR.prepare_for_CLEAR as pfC # FIXME: import error
self.pfC = pfC
self.sweep_control = sweep_control
self.name = 'prepare_for_conditional_depletion'
@@ -1252,7 +1252,7 @@ class prepare_for_unconditional_depletion(Soft_Sweep):
def __init__(self, AllXY_trigger=200, sweep_control='soft', RTF_qubit_pulses=False, double_pulse_Ramsey_idling=100, **kw):
super(prepare_for_unconditional_depletion, self).__init__()
- import Experiments.CLEAR.prepare_for_CLEAR as pfC
+ import Experiments.CLEAR.prepare_for_CLEAR as pfC # FIXME: import error
self.pfC = pfC
self.sweep_control = sweep_control
self.name = 'prepare_for_unconditional_depletion'
diff --git a/pycqed/measurement/Pulse_Generator.py b/deprecated/pycqed/measurement/Pulse_Generator.py
similarity index 100%
rename from pycqed/measurement/Pulse_Generator.py
rename to deprecated/pycqed/measurement/Pulse_Generator.py
diff --git a/pycqed/measurement/archived/calibration_toolbox.py b/deprecated/pycqed/measurement/archived/calibration_toolbox.py
similarity index 100%
rename from pycqed/measurement/archived/calibration_toolbox.py
rename to deprecated/pycqed/measurement/archived/calibration_toolbox.py
diff --git a/pycqed/measurement/awg_sweep_functions.py b/deprecated/pycqed/measurement/awg_sweep_functions.py
similarity index 100%
rename from pycqed/measurement/awg_sweep_functions.py
rename to deprecated/pycqed/measurement/awg_sweep_functions.py
diff --git a/pycqed/measurement/awg_sweep_functions_multi_qubit.py b/deprecated/pycqed/measurement/awg_sweep_functions_multi_qubit.py
similarity index 95%
rename from pycqed/measurement/awg_sweep_functions_multi_qubit.py
rename to deprecated/pycqed/measurement/awg_sweep_functions_multi_qubit.py
index 31bc7de206..16d3ca4f6b 100644
--- a/pycqed/measurement/awg_sweep_functions_multi_qubit.py
+++ b/deprecated/pycqed/measurement/awg_sweep_functions_multi_qubit.py
@@ -1,11 +1,11 @@
import numpy as np
-import logging
+#import logging
from pycqed.measurement import sweep_functions as swf
-from pycqed.measurement.randomized_benchmarking import randomized_benchmarking as rb
-from pycqed.measurement.pulse_sequences import standard_sequences as st_seqs
-from pycqed.measurement.pulse_sequences import single_qubit_tek_seq_elts as sqs
+#from pycqed.measurement.randomized_benchmarking import randomized_benchmarking as rb
+#from pycqed.measurement.pulse_sequences import standard_sequences as st_seqs
+#from pycqed.measurement.pulse_sequences import single_qubit_tek_seq_elts as sqs
from pycqed.measurement.pulse_sequences import multi_qubit_tek_seq_elts as sqs2
-from pycqed.measurement.pulse_sequences import fluxing_sequences as fsqs
+#from pycqed.measurement.pulse_sequences import fluxing_sequences as fsqs
default_gauss_width = 10 # magic number should be removed,
# note magic number only used in old mathematica seqs
diff --git a/pycqed/measurement/demonstrator_helper/__init__.py b/deprecated/pycqed/measurement/demonstrator_helper/__init__.py
similarity index 100%
rename from pycqed/measurement/demonstrator_helper/__init__.py
rename to deprecated/pycqed/measurement/demonstrator_helper/__init__.py
diff --git a/pycqed/measurement/demonstrator_helper/execute_helpers_worker.py b/deprecated/pycqed/measurement/demonstrator_helper/execute_helpers_worker.py
similarity index 100%
rename from pycqed/measurement/demonstrator_helper/execute_helpers_worker.py
rename to deprecated/pycqed/measurement/demonstrator_helper/execute_helpers_worker.py
diff --git a/pycqed/measurement/demonstrator_helper/simulation_helpers.py b/deprecated/pycqed/measurement/demonstrator_helper/simulation_helpers.py
similarity index 100%
rename from pycqed/measurement/demonstrator_helper/simulation_helpers.py
rename to deprecated/pycqed/measurement/demonstrator_helper/simulation_helpers.py
diff --git a/pycqed/measurement/gate_set_tomography/gate_set_tomography_CC.py b/deprecated/pycqed/measurement/gate_set_tomography/gate_set_tomography_CC.py
similarity index 100%
rename from pycqed/measurement/gate_set_tomography/gate_set_tomography_CC.py
rename to deprecated/pycqed/measurement/gate_set_tomography/gate_set_tomography_CC.py
diff --git a/pycqed/measurement/gate_set_tomography/gate_set_tomography_old.py b/deprecated/pycqed/measurement/gate_set_tomography/gate_set_tomography_old.py
similarity index 100%
rename from pycqed/measurement/gate_set_tomography/gate_set_tomography_old.py
rename to deprecated/pycqed/measurement/gate_set_tomography/gate_set_tomography_old.py
diff --git a/pycqed/measurement/multi_qubit_module.py b/deprecated/pycqed/measurement/multi_qubit_module.py
similarity index 100%
rename from pycqed/measurement/multi_qubit_module.py
rename to deprecated/pycqed/measurement/multi_qubit_module.py
diff --git a/pycqed/measurement/openql_experiments/generate_CBox_cfg.py b/deprecated/pycqed/measurement/openql_experiments/generate_CBox_cfg.py
similarity index 100%
rename from pycqed/measurement/openql_experiments/generate_CBox_cfg.py
rename to deprecated/pycqed/measurement/openql_experiments/generate_CBox_cfg.py
diff --git a/pycqed/measurement/openql_experiments/generate_qi_cfg.py b/deprecated/pycqed/measurement/openql_experiments/generate_qi_cfg.py
similarity index 100%
rename from pycqed/measurement/openql_experiments/generate_qi_cfg.py
rename to deprecated/pycqed/measurement/openql_experiments/generate_qi_cfg.py
diff --git a/pycqed/measurement/pulse_sequences/fluxing_sequences.py b/deprecated/pycqed/measurement/pulse_sequences/fluxing_sequences.py
similarity index 100%
rename from pycqed/measurement/pulse_sequences/fluxing_sequences.py
rename to deprecated/pycqed/measurement/pulse_sequences/fluxing_sequences.py
diff --git a/pycqed/measurement/pulse_sequences/standard_elements_cbox.py b/deprecated/pycqed/measurement/pulse_sequences/standard_elements_cbox.py
similarity index 100%
rename from pycqed/measurement/pulse_sequences/standard_elements_cbox.py
rename to deprecated/pycqed/measurement/pulse_sequences/standard_elements_cbox.py
diff --git a/pycqed/measurement/pulse_sequences/standard_sequences.py b/deprecated/pycqed/measurement/pulse_sequences/standard_sequences.py
similarity index 100%
rename from pycqed/measurement/pulse_sequences/standard_sequences.py
rename to deprecated/pycqed/measurement/pulse_sequences/standard_sequences.py
diff --git a/pycqed/measurement/single_qubit_fluxing_module.py b/deprecated/pycqed/measurement/single_qubit_fluxing_module.py
similarity index 97%
rename from pycqed/measurement/single_qubit_fluxing_module.py
rename to deprecated/pycqed/measurement/single_qubit_fluxing_module.py
index f443c69a79..85026658d1 100644
--- a/pycqed/measurement/single_qubit_fluxing_module.py
+++ b/deprecated/pycqed/measurement/single_qubit_fluxing_module.py
@@ -1,10 +1,10 @@
import numpy as np
from pycqed.measurement import awg_sweep_functions as awg_swf
-from pycqed.measurement import detector_functions as det
+#from pycqed.measurement import detector_functions as det
from pycqed.measurement import composite_detector_functions as cdet
from pycqed.analysis import measurement_analysis as ma
import qcodes as qc
-from pycqed.measurement.pulse_sequences import multi_qubit_tek_seq_elts as mqs
+#from pycqed.measurement.pulse_sequences import multi_qubit_tek_seq_elts as mqs
import pycqed.measurement.pulse_sequences.fluxing_sequences as fsqs
station = qc.station
diff --git a/pycqed/measurement/waveform_control_CC/QWG_fluxing_seqs.py b/deprecated/pycqed/measurement/waveform_control_CC/QWG_fluxing_seqs.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/QWG_fluxing_seqs.py
rename to deprecated/pycqed/measurement/waveform_control_CC/QWG_fluxing_seqs.py
diff --git a/pycqed/measurement/waveform_control_CC/instruction_lib.py b/deprecated/pycqed/measurement/waveform_control_CC/instruction_lib.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/instruction_lib.py
rename to deprecated/pycqed/measurement/waveform_control_CC/instruction_lib.py
diff --git a/pycqed/measurement/waveform_control_CC/multi_qubit_module_CC.py b/deprecated/pycqed/measurement/waveform_control_CC/multi_qubit_module_CC.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/multi_qubit_module_CC.py
rename to deprecated/pycqed/measurement/waveform_control_CC/multi_qubit_module_CC.py
diff --git a/pycqed/measurement/waveform_control_CC/multi_qubit_qasm_seqs.py b/deprecated/pycqed/measurement/waveform_control_CC/multi_qubit_qasm_seqs.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/multi_qubit_qasm_seqs.py
rename to deprecated/pycqed/measurement/waveform_control_CC/multi_qubit_qasm_seqs.py
diff --git a/pycqed/measurement/waveform_control_CC/operation_prep.py b/deprecated/pycqed/measurement/waveform_control_CC/operation_prep.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/operation_prep.py
rename to deprecated/pycqed/measurement/waveform_control_CC/operation_prep.py
diff --git a/pycqed/measurement/waveform_control_CC/qasm_compiler.py b/deprecated/pycqed/measurement/waveform_control_CC/qasm_compiler.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/qasm_compiler.py
rename to deprecated/pycqed/measurement/waveform_control_CC/qasm_compiler.py
diff --git a/pycqed/measurement/waveform_control_CC/qasm_compiler_helpers.py b/deprecated/pycqed/measurement/waveform_control_CC/qasm_compiler_helpers.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/qasm_compiler_helpers.py
rename to deprecated/pycqed/measurement/waveform_control_CC/qasm_compiler_helpers.py
diff --git a/pycqed/measurement/waveform_control_CC/qasm_config_gen.py b/deprecated/pycqed/measurement/waveform_control_CC/qasm_config_gen.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/qasm_config_gen.py
rename to deprecated/pycqed/measurement/waveform_control_CC/qasm_config_gen.py
diff --git a/pycqed/measurement/waveform_control_CC/qasm_helpers.py b/deprecated/pycqed/measurement/waveform_control_CC/qasm_helpers.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/qasm_helpers.py
rename to deprecated/pycqed/measurement/waveform_control_CC/qasm_helpers.py
diff --git a/pycqed/measurement/waveform_control_CC/qasm_to_asm.py b/deprecated/pycqed/measurement/waveform_control_CC/qasm_to_asm.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/qasm_to_asm.py
rename to deprecated/pycqed/measurement/waveform_control_CC/qasm_to_asm.py
diff --git a/pycqed/measurement/waveform_control_CC/single_qubit_qasm_seqs.py b/deprecated/pycqed/measurement/waveform_control_CC/single_qubit_qasm_seqs.py
similarity index 100%
rename from pycqed/measurement/waveform_control_CC/single_qubit_qasm_seqs.py
rename to deprecated/pycqed/measurement/waveform_control_CC/single_qubit_qasm_seqs.py
diff --git a/pycqed/tests/gst_files/GST_template_short.txt b/deprecated/pycqed/tests/gst_files/GST_template_short.txt
similarity index 100%
rename from pycqed/tests/gst_files/GST_template_short.txt
rename to deprecated/pycqed/tests/gst_files/GST_template_short.txt
diff --git a/pycqed/tests/qasm_files/config.json b/deprecated/pycqed/tests/qasm_files/config.json
similarity index 100%
rename from pycqed/tests/qasm_files/config.json
rename to deprecated/pycqed/tests/qasm_files/config.json
diff --git a/pycqed/tests/qasm_files/config_simple.json b/deprecated/pycqed/tests/qasm_files/config_simple.json
similarity index 100%
rename from pycqed/tests/qasm_files/config_simple.json
rename to deprecated/pycqed/tests/qasm_files/config_simple.json
diff --git a/pycqed/tests/qasm_files/dev_test.qasm b/deprecated/pycqed/tests/qasm_files/dev_test.qasm
similarity index 100%
rename from pycqed/tests/qasm_files/dev_test.qasm
rename to deprecated/pycqed/tests/qasm_files/dev_test.qasm
diff --git a/pycqed/tests/qasm_files/empty.qasm b/deprecated/pycqed/tests/qasm_files/empty.qasm
similarity index 100%
rename from pycqed/tests/qasm_files/empty.qasm
rename to deprecated/pycqed/tests/qasm_files/empty.qasm
diff --git a/pycqed/tests/qasm_files/qasm_loader_test.qasm b/deprecated/pycqed/tests/qasm_files/qasm_loader_test.qasm
similarity index 100%
rename from pycqed/tests/qasm_files/qasm_loader_test.qasm
rename to deprecated/pycqed/tests/qasm_files/qasm_loader_test.qasm
diff --git a/pycqed/tests/qasm_files/single_op.qasm b/deprecated/pycqed/tests/qasm_files/single_op.qasm
similarity index 100%
rename from pycqed/tests/qasm_files/single_op.qasm
rename to deprecated/pycqed/tests/qasm_files/single_op.qasm
diff --git a/pycqed/tests/test_gst.py b/deprecated/pycqed/tests/test_gst.py
similarity index 100%
rename from pycqed/tests/test_gst.py
rename to deprecated/pycqed/tests/test_gst.py
diff --git a/pycqed/tests/test_qasm_compiler_XFU.py b/deprecated/pycqed/tests/test_qasm_compiler_XFU.py
similarity index 98%
rename from pycqed/tests/test_qasm_compiler_XFU.py
rename to deprecated/pycqed/tests/test_qasm_compiler_XFU.py
index 92bfc0527d..18620c9091 100644
--- a/pycqed/tests/test_qasm_compiler_XFU.py
+++ b/deprecated/pycqed/tests/test_qasm_compiler_XFU.py
@@ -23,6 +23,7 @@
get_timepoints_from_label
+@unittest.skip(reason="As decided in #635 this tests are considered non-important")
class Test_compiler(unittest.TestCase):
@classmethod
@@ -277,6 +278,7 @@ def test_equivalent_maps_custom_qubit_name(self):
self.assertEqual(qumis_instrs[0], qumis_instrs[1])
+@unittest.skip(reason="As decided in #635 this tests are considered non-important")
class Test_single_qubit_seqs(unittest.TestCase):
@classmethod
@@ -430,6 +432,7 @@ def test_restless_RB_seq(self):
compiler.qumis_instructions.count('trigger 0000001, 3'), 15)
+@unittest.skip(reason="As decided in #635 this tests are considered non-important")
class Test_multi_qubit_seqs(unittest.TestCase):
@classmethod
@@ -483,6 +486,7 @@ def test_chevron_block_seq(self):
compiler.timing_event_list
+@unittest.skip(reason="As decided in #635 this tests are considered non-important")
class Capturing(list):
def __enter__(self):
diff --git a/pycqed/tests/test_qasm_instruction_lib.py b/deprecated/pycqed/tests/test_qasm_instruction_lib.py
similarity index 100%
rename from pycqed/tests/test_qasm_instruction_lib.py
rename to deprecated/pycqed/tests/test_qasm_instruction_lib.py
diff --git a/pycqed/tests/test_qasm_loader.py b/deprecated/pycqed/tests/test_qasm_loader.py
similarity index 100%
rename from pycqed/tests/test_qasm_loader.py
rename to deprecated/pycqed/tests/test_qasm_loader.py
diff --git a/pycqed/tests/test_qasm_to_asm.py b/deprecated/pycqed/tests/test_qasm_to_asm.py
similarity index 100%
rename from pycqed/tests/test_qasm_to_asm.py
rename to deprecated/pycqed/tests/test_qasm_to_asm.py
diff --git a/pycqed/tests/test_qumis_assembler.py b/deprecated/pycqed/tests/test_qumis_assembler.py
similarity index 100%
rename from pycqed/tests/test_qumis_assembler.py
rename to deprecated/pycqed/tests/test_qumis_assembler.py
diff --git a/docs/200330_Introduction_to_PycQED_v2.pdf b/docs/200330_Introduction_to_PycQED_v2.pdf
new file mode 100644
index 0000000000..b39a8220bd
Binary files /dev/null and b/docs/200330_Introduction_to_PycQED_v2.pdf differ
diff --git a/examples/2. Controlling a Transmock setup.ipynb b/examples/2. Controlling a Transmock setup.ipynb
deleted file mode 100644
index 0003e69520..0000000000
--- a/examples/2. Controlling a Transmock setup.ipynb
+++ /dev/null
@@ -1,704 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Tutorial 2. Controlling a Transmock setup\n",
- "\n",
- "This tutorial covers a \"real\" usage example using the Transmock. We will go over all the aspects relevant in controlling an experiment using the mock transmon. \n",
- "\n",
- "The steps we will cover are \n",
- "1. Initializing the setup\n",
- "2. The device and qubit objects \n",
- "3. Running basic measurements \n",
- "4. Calibrating your setup \n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "
\n",
- "
\n",
- "NOTE: We recommend using PycQED from a console for actual use. \n",
- "
"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "toc-hr-collapsed": false
- },
- "source": [
- "# 1. Initializing the setup \n",
- "\n",
- "Experiments in `PycQED` are run by starting an iPython kernel (console or notebook) in which we instantiate different instruments that we then interact with. \n",
- "A session in one of these kernels typically lasts multiple days/weeks in the case of extended experiments. Before we can start runnning an experiment we start by running an initialization script. Such a script consists several steps. \n",
- "\n",
- "1. Importing the required modules. \n",
- "2. Setting the datadirectory\n",
- "3. Instantiating the instruments and (optionally) loading settings onto these instruments\n",
- "\n",
- "Normally the environment would be instantiated by importing from an external init script e.g.: `from my_init import *`. Here we explicitly put all the parts of the initialization script required to setup a 2 qubit mock experiment. Note that all the instruments being used are mock instruments. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## importing the required modules"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# Import Statements\n",
- "###############################################################################\n",
- "\n",
- "# Generic python imports \n",
- "import os\n",
- "import warnings\n",
- "import openql\n",
- "import datetime\n",
- "import time\n",
- "import pycqed as pq\n",
- "import networkx as nx\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import numpy as np\n",
- "from importlib import reload\n",
- "\n",
- "\n",
- "\n",
- "# generic PycQED/QCoDeS imports \n",
- "from qcodes import station\n",
- "from pycqed.measurement import measurement_control\n",
- "\n",
- "from pycqed.analysis_v2 import measurement_analysis as ma2\n",
- "from pycqed.analysis import measurement_analysis as ma\n",
- "\n",
- "from pycqed.utilities import general as gen\n",
- "import pycqed.analysis.analysis_toolbox as a_tools\n",
- "\n",
- "# Package for dependency graph based calibrations\n",
- "from autodepgraph import AutoDepGraph_DAG\n",
- "\n",
- "\n",
- "# Annoying warning:\n",
- "os.environ['PYGSTI_BACKCOMPAT_WARNING'] = '0' # suppresses a warning in PyGSTi \n",
- "\n",
- "# Import instruments \n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects import mock_CCL_Transmon as mct\n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects.qubit_object import Qubit\n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects.CCL_Transmon import CCLight_Transmon\n",
- "from pycqed.instrument_drivers.meta_instrument.LutMans.ro_lutman import UHFQC_RO_LutMan\n",
- "from pycqed.instrument_drivers.physical_instruments.QuTech_VSM_Module import Dummy_QuTechVSMModule\n",
- "from pycqed.instrument_drivers.physical_instruments.QuTech_CCL import dummy_CCL\n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects.CC_transmon import CBox_v3_driven_transmon, QWG_driven_transmon\n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects.Tektronix_driven_transmon import Tektronix_driven_transmon\n",
- "from pycqed.instrument_drivers.meta_instrument.qubit_objects.QuDev_transmon import QuDev_transmon\n",
- "\n",
- "\n",
- "from pycqed.instrument_drivers.physical_instruments.QuTech_Duplexer import Dummy_Duplexer\n",
- "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.UHFQuantumController as uhf\n",
- "# from pycqed.instrument_drivers.physical_instruments.QuTech_SPI_S4g_FluxCurrent \\\n",
- "# import QuTech_SPI_S4g_FluxCurrent\n",
- "from pycqed.instrument_drivers.meta_instrument.LutMans import mw_lutman as mwl\n",
- "import pycqed.instrument_drivers.virtual_instruments.virtual_MW_source as vmw\n",
- "import pycqed.instrument_drivers.virtual_instruments.virtual_SignalHound as sh\n",
- "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.ZI_HDAWG8 as HDAWG\n",
- "import pycqed.instrument_drivers.virtual_instruments.virtual_SPI_S4g_FluxCurrent as flx\n",
- "import pycqed.instrument_drivers.virtual_instruments.virtual_VNA as VNA\n",
- "import pycqed.instrument_drivers.meta_instrument.device_dependency_graphs as DDG\n",
- "import pycqed.instrument_drivers.meta_instrument.device_object_CCL as do\n",
- "from pycqed.instrument_drivers.meta_instrument.Resonator import resonator\n",
- "\n",
- "\n",
- "\n",
- "\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Setting the datadirectory"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "\n",
- "test_datadir = os.path.join(pq.__path__[0], 'tests', 'test_output') # we use a test datadirectory for our examples\n",
- "a_tools.datadir = test_datadir\n",
- "\n",
- "\n",
- "timestamp = None # '20190719_164604' \n",
- "# the timestamp variable is used below to load settings from previous experiments onto instruments"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Instantiating the instruments"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# MC and monitor\n",
- "###############################################################################\n",
- "station = station.Station()\n",
- "# The measurement control is used to control experiments (see tutorial 1.)\n",
- "MC = measurement_control.MeasurementControl(\n",
- " 'MC', live_plot_enabled=True, verbose=True)\n",
- "MC.station = station\n",
- "station.add_component(MC)\n",
- "MC.create_plot_monitor()\n",
- "MC.live_plot_enabled(True)\n",
- "\n",
- "# Required to set it to the testing datadir\n",
- "MC.datadir(a_tools.datadir)\n",
- "\n",
- "\n",
- "###############################################################################\n",
- "# nested MC\n",
- "###############################################################################\n",
- "nested_MC = measurement_control.MeasurementControl(\n",
- " 'nested_MC', live_plot_enabled=True, verbose=True)\n",
- "nested_MC.station = station\n",
- "station.add_component(nested_MC)\n",
- "nested_MC.datadir(a_tools.datadir)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "###############################################################################\n",
- "# Instruments\n",
- "###############################################################################\n",
- "# Fluxcurrent\n",
- "fluxcurrent = flx.virtual_SPI_S4g_FluxCurrent(\n",
- " 'fluxcurrent',\n",
- " channel_map={\n",
- " 'FBL_QL': (0, 0),\n",
- " 'FBL_QR': (0, 1),\n",
- " })\n",
- "fluxcurrent.FBL_QL(0)\n",
- "fluxcurrent.FBL_QR(0)\n",
- "station.add_component(fluxcurrent)\n",
- "\n",
- "###############################################################################\n",
- "# VNA\n",
- "VNA = VNA.virtual_ZNB20('VNA')\n",
- "station.add_component(VNA)\n",
- "\n",
- "###############################################################################\n",
- "# MW sources\n",
- "MW1 = vmw.VirtualMWsource('MW1')\n",
- "MW2 = vmw.VirtualMWsource('MW2')\n",
- "MW3 = vmw.VirtualMWsource('MW3')\n",
- "\n",
- "###############################################################################\n",
- "# SignalHound\n",
- "SH = sh.virtual_SignalHound_USB_SA124B('SH')\n",
- "\n",
- "###############################################################################\n",
- "# UHFQC\n",
- "UHFQC = uhf.UHFQC(name='UHFQC', server='emulator',\n",
- " device='dev2109', interface='1GbE')\n",
- "\n",
- "###############################################################################\n",
- "# CCL\n",
- "CCL = dummy_CCL('CCL')\n",
- "\n",
- "###############################################################################\n",
- "# VSM\n",
- "VSM = Dummy_QuTechVSMModule('VSM')\n",
- "\n",
- "###############################################################################\n",
- "# AWG\n",
- "AWG = HDAWG.ZI_HDAWG8(name='DummyAWG8', server='emulator', num_codewords=32, device='dev8026', interface='1GbE')\n",
- "\n",
- "\n",
- "AWG8_VSM_MW_LutMan = mwl.AWG8_VSM_MW_LutMan('MW_LutMan_VSM')\n",
- "AWG8_VSM_MW_LutMan.AWG(AWG.name)\n",
- "AWG8_VSM_MW_LutMan.channel_GI(1)\n",
- "AWG8_VSM_MW_LutMan.channel_GQ(2)\n",
- "AWG8_VSM_MW_LutMan.channel_DI(3)\n",
- "AWG8_VSM_MW_LutMan.channel_DQ(4)\n",
- "AWG8_VSM_MW_LutMan.mw_modulation(100e6)\n",
- "AWG8_VSM_MW_LutMan.sampling_rate(2.4e9)\n",
- "\n",
- "###############################################################################\n",
- "# RO Lutman\n",
- "ro_lutman = UHFQC_RO_LutMan(\n",
- " 'RO_lutman', num_res=5, feedline_number=0)\n",
- "ro_lutman.AWG(UHFQC.name)\n",
- "\n",
- "###############################################################################\n",
- "# Qubit\n",
- "QL = mct.Mock_CCLight_Transmon('QL')\n",
- "\n",
- "# Assign instruments\n",
- "QL.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
- "QL.instr_LO_ro(MW1.name)\n",
- "QL.instr_LO_mw(MW2.name)\n",
- "QL.instr_spec_source(MW3.name)\n",
- "\n",
- "QL.instr_acquisition(UHFQC.name)\n",
- "QL.instr_VSM(VSM.name)\n",
- "QL.instr_CC(CCL.name)\n",
- "QL.instr_LutMan_RO(ro_lutman.name)\n",
- "QL.instr_MC(MC.name)\n",
- "QL.instr_nested_MC(nested_MC.name)\n",
- "QL.instr_FluxCtrl(fluxcurrent.name)\n",
- "QL.instr_SH(SH.name)\n",
- "QL.cfg_with_vsm(False)\n",
- "QL.done_spectroscopy = False\n",
- "\n",
- "config_fn = os.path.join(\n",
- " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
- "QL.cfg_openql_platform_fn(config_fn)\n",
- "# QL.dep_graph()\n",
- "station.add_component(QL)\n",
- "# Does not set any initial parameters, it should work from scratch\n",
- "# Qubit\n",
- "QR = mct.Mock_CCLight_Transmon('QR')\n",
- "QR_parameters = {'mock_Ec': 243e6,\n",
- " 'mock_Ej1': 8.348e9,\n",
- " 'mock_Ej2': 8.246e9,\n",
- " 'mock_fl_dc_I_per_phi0': {'FBL_QL': 2, 'FBL_QR': 20.3153e-3},\n",
- " # 'mock_fl_dc_V0'\n",
- " 'mock_fl_dc_ch': 'FBL_QR',\n",
- " 'mock_freq_res_bare': 7.35e9,\n",
- " 'mock_freq_test_res': 7.73e9,\n",
- " 'mock_sweetspot_phi_over_phi0': 0,\n",
- " 'mock_Qe': 19000,\n",
- " 'mock_Q': 15000,\n",
- " 'mock_slope': 0}\n",
- "\n",
- "\n",
- "for parameter, value in QR_parameters.items():\n",
- " QR.parameters[parameter](value)\n",
- "# Assign instruments\n",
- "QR.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
- "QR.instr_LO_ro(MW1.name)\n",
- "QR.instr_LO_mw(MW2.name)\n",
- "QR.instr_spec_source(MW3.name)\n",
- "\n",
- "QR.instr_acquisition(UHFQC.name)\n",
- "QR.instr_VSM(VSM.name)\n",
- "QR.instr_CC(CCL.name)\n",
- "QR.instr_LutMan_RO(ro_lutman.name)\n",
- "QR.instr_MC(MC.name)\n",
- "QR.instr_nested_MC(nested_MC.name)\n",
- "QR.instr_FluxCtrl(fluxcurrent.name)\n",
- "QR.instr_SH(SH.name)\n",
- "\n",
- "\n",
- "config_fn = os.path.join(\n",
- " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
- "QR.cfg_openql_platform_fn(config_fn)\n",
- "# QR.dep_graph()\n",
- "station.add_component(QR)\n",
- "\n",
- "fakequbit = mct.Mock_CCLight_Transmon('fakequbit')\n",
- "\n",
- "# Assign instruments\n",
- "fakequbit.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
- "fakequbit.instr_LO_ro(MW1.name)\n",
- "fakequbit.instr_LO_mw(MW2.name)\n",
- "fakequbit.instr_spec_source(MW3.name)\n",
- "\n",
- "fakequbit.instr_acquisition(UHFQC.name)\n",
- "fakequbit.instr_VSM(VSM.name)\n",
- "fakequbit.instr_CC(CCL.name)\n",
- "fakequbit.instr_LutMan_RO(ro_lutman.name)\n",
- "fakequbit.instr_MC(MC.name)\n",
- "fakequbit.instr_nested_MC(nested_MC.name)\n",
- "fakequbit.instr_FluxCtrl(fluxcurrent.name)\n",
- "fakequbit.instr_SH(SH.name)\n",
- "fakequbit.cfg_with_vsm(False)\n",
- "\n",
- "config_fn = os.path.join(\n",
- " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
- "fakequbit.cfg_openql_platform_fn(config_fn)\n",
- "# fakequbit.dep_graph()\n",
- "station.add_component(fakequbit)\n",
- "##############################################################################\n",
- "# Device\n",
- "Mock_Octobox = do.DeviceCCL(name='Mock_Octobox')\n",
- "Mock_Octobox.qubits(['QL', 'QR', 'fakequbit'])\n",
- "\n",
- "QL.instr_device(Mock_Octobox.name)\n",
- "QR.instr_device(Mock_Octobox.name)\n",
- "fakequbit.instr_device(Mock_Octobox.name)\n",
- "resQL = resonator('2', freq=7.5e9)\n",
- "resQR = resonator('1', freq=7.35e9)\n",
- "rest1 = resonator('t1', freq=7.73e9, type='test_resonator')\n",
- "rest2 = resonator('t2', freq=7.8e9, type='test_resonator')\n",
- "\n",
- "# Mock_Octobox.expected_resonators = [resQR, resQL, rest1, rest2]\n",
- "###############################################################################\n",
- "# DepGraph\n",
- "Qubits = [QL, QR, fakequbit]\n",
- "# some_file.py\n",
- "dag = DDG.octobox_dep_graph(name='Octobox', device=Mock_Octobox)\n",
- "# dag.create_dep_graph(Qubits)\n",
- "# dag.set_all_node_states('needs calibration')\n",
- "# dag.set_node_state('QL Drive Mixer Calibrations', 'good')\n",
- "# dag.set_node_state('QR Drive Mixer Calibrations', 'good')\n",
- "# dag.set_node_state('QL Readout Mixer Calibrations', 'good')\n",
- "# dag.set_node_state('QR Readout Mixer Calibrations', 'good')\n",
- "# ###############################################################################\n",
- "# # Hacky stuff to make life easier\n",
- "\n",
- "# # Room temp:\n",
- "QL.freq_qubit(5.85e9)\n",
- "QR.freq_qubit(5.48e9)\n",
- "\n",
- "for Q in Qubits:\n",
- " # Q.ro_acq_averages(32768*4)\n",
- " Q.ro_freq(7.5e9)\n",
- "\n",
- "# # QL.freq_res(QL.mock_freq_res())\n",
- "# # QL.ro_pulse_amp_CW(QL.mock_ro_pulse_amp_CW())\n",
- "\n",
- "# # gen.load_settings_onto_instrument_v2(QL, timestamp=timestamp)\n",
- "# # gen.load_settings_onto_instrument_v2(fakequbit, timestamp=timestamp)\n",
- "# dag.maintain_QL_Frequency_at_Sweetspot()\n",
- "# dag.maintain_QR_Frequency_Fine()\n",
- "# freqs = np.arange(7.348e9, 7.352e9, 0.025e6)\n",
- "# powers = np.arange(-40, 1, 1)\n",
- "# fakequbit.measure_resonator_power(freqs=freqs, powers=powers)\n",
- "\n",
- "\n",
- "# for power in np.arange(-35, -14, 1):\n",
- "# QL.spec_pow(power)\n",
- "# QL.find_frequency(freqs=np.arange(5.85e9 - 20e6, 5.85e9+20e6, 0.1e6))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "dag.set_all_node_states('needs calibration')\n",
- "dag.open_html_viewer()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "dag.maintain_node('QL ALLXY')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# 2. Running an experiment on a mock transmon"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "QR.measure_allxy()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "QR.instr_acquisition()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "ro_lutman.load_waveforms_onto_AWG_lookuptable()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC.awg_sequence_acquisition_and_DIO_triggered_pulse??"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "ro_lutman.load_DIO_triggered_sequence_onto_UHFQC()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC_RO_LutMan.load_waveforms_onto_AWG_lookuptable()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC_RO_LutMan.load_DIO_triggered_sequence_onto_UHFQC()\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print(\"hello\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC.close()\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "station.components"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.UHFQuantumController as uhf"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC = uhf.UHFQC(name='UHFQC', server='emulator',\n",
- " device='dev2109', interface='1GbE')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC.print_overview()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "AWG.close()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.ZI_HDAWG8 as HDAWG"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "QL.cfg_with_vsm(True)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "QL.measure_allxy()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC.print_overview()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "UHFQC.print_user_regs_overview()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def print_user_regs_overview(self):\n",
- " msg = '\\t User registers overview \\n'\n",
- " user_reg_funcs = ['']*16\n",
- " user_reg_funcs[0] = 'Loop count'\n",
- " user_reg_funcs[1] = 'Readout mode'\n",
- " user_reg_funcs[2] = 'Wait delay'\n",
- " user_reg_funcs[3] = 'Average count'\n",
- " user_reg_funcs[4] = 'Error count'\n",
- " \n",
- " for i in range(16):\n",
- " msg += 'User reg {}: \\t{}\\t({})\\n'.format(\n",
- " i, self.get('awgs_0_userregs_{}'.format(i)), user_reg_funcs[i])\n",
- " print(msg)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "print_user_regs_overview(UHFQC)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "1024*42"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "np.random.random((10,10))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "language_info": {
- "name": "python",
- "pygments_lexer": "ipython3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 4
-}
diff --git a/examples/CC_examples/CC_demo_1.py b/examples/CC_examples/CC_demo_1.py
index e57d39c40f..7a8d2ca5a6 100755
--- a/examples/CC_examples/CC_demo_1.py
+++ b/examples/CC_examples/CC_demo_1.py
@@ -5,11 +5,10 @@
import sys
import numpy as np
-from pycqed.instrument_drivers.physical_instruments.Transport import IPTransport
-from pycqed.instrument_drivers.physical_instruments.QuTechCC import QuTechCC
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
from pycqed.measurement.openql_experiments import single_qubit_oql as sqo
-import pycqed.measurement.openql_experiments.multi_qubit_oql as mqo
# parameter handling
sel = 0
@@ -57,7 +56,7 @@
if 1:
log.debug('connecting to CC')
- cc = QuTechCC('cc', IPTransport(ip))
+ cc = CC('cc', IPTransport(ip))
cc.reset()
cc.clear_status()
cc.status_preset()
diff --git a/examples/CC_examples/CC_demo_2.py b/examples/CC_examples/CC_demo_2.py
index be4fe8f822..1fb806b18b 100644
--- a/examples/CC_examples/CC_demo_2.py
+++ b/examples/CC_examples/CC_demo_2.py
@@ -1,8 +1,5 @@
#!/usr/bin/python
-### setup logging before all imports (before any logging is done as to prevent a default root logger)
-import CC_logging
-
### imports
import sys
import os
@@ -10,8 +7,8 @@
import numpy as np
from pathlib import Path
-from pycqed.instrument_drivers.physical_instruments.Transport import IPTransport
-from pycqed.instrument_drivers.physical_instruments.QuTechCC import QuTechCC
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
from pycqed.instrument_drivers.physical_instruments.ZurichInstruments import ZI_HDAWG8
from pycqed.instrument_drivers.physical_instruments.ZurichInstruments import UHFQuantumController as ZI_UHFQC
@@ -19,9 +16,6 @@
import pycqed.measurement.openql_experiments.openql_helpers as oqh
from pycqed.measurement.openql_experiments import single_qubit_oql as sqo
-import pycqed.measurement.openql_experiments.multi_qubit_oql as mqo
-
-from qcodes import station
# configure our logger
log = logging.getLogger('demo_2')
@@ -149,7 +143,7 @@ def set_waveforms(instr_awg, waveform_type, sequence_length):
#station.add_component(instr.ro[i])
log.debug('connecting to CC')
-instr.cc = QuTechCC('cc', IPTransport(conf.cc_ip))
+instr.cc = CC('cc', IPTransport(conf.cc_ip))
instr.cc.reset()
instr.cc.clear_status()
instr.cc.status_preset()
diff --git a/examples/CC_examples/CC_demo_3.py b/examples/CC_examples/CC_demo_3.py
index 18eaca92c7..0b01ac81ae 100644
--- a/examples/CC_examples/CC_demo_3.py
+++ b/examples/CC_examples/CC_demo_3.py
@@ -1,15 +1,12 @@
#!/usr/bin/python
-### setup logging before all imports (before any logging is done as to prevent a default root logger)
-import CC_logging
-
import logging
import sys
import math
import numpy as np
-from pycqed.instrument_drivers.physical_instruments.Transport import IPTransport
-from pycqed.instrument_drivers.physical_instruments.QuTechCC import QuTechCC
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
# configure our logger
log = logging.getLogger('demo_3')
@@ -214,14 +211,14 @@
log.debug('connecting to CC')
-cc = QuTechCC('cc', IPTransport(ip))
+cc = CC('cc', IPTransport(ip))
cc.reset()
cc.clear_status()
cc.status_preset()
log.debug('uploading program to CC')
cc.sequence_program_assemble(prog)
-if cc.get_assembler_error() != 0:
+if cc.get_assembler_success() != 1:
sys.stderr.write('error log = {}\n'.format(cc.get_assembler_log())) # FIXME: result is messy
log.warning('assembly failed')
else:
diff --git a/examples/CC_examples/CC_demo_mux.py b/examples/CC_examples/CC_demo_mux.py
new file mode 100755
index 0000000000..6f9a0fcb29
--- /dev/null
+++ b/examples/CC_examples/CC_demo_mux.py
@@ -0,0 +1,308 @@
+#!/usr/bin/python
+# Based on: http://localhost:8888/notebooks/personal_folders/Miguel/qec_lut_demo.ipynb
+
+### setup logging before all imports (before any logging is done as to prevent a default root logger)
+import CC_logging
+
+import logging
+import sys
+import inspect
+import time
+import numpy as np
+
+from pycqed.instrument_drivers.library.Transport import IPTransport
+import pycqed.instrument_drivers.library.DIO as DIO
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
+from pycqed.instrument_drivers.physical_instruments.ZurichInstruments import UHFQuantumController as ZI_UHFQC
+
+# parameter handling
+sel = 0
+if len(sys.argv)>1:
+ sel = int(sys.argv[1])
+
+# constants
+ip_cc = '192.168.0.241'
+dev_uhfqa = 'dev2271'
+cc_slot_uhfqa0 = 2
+cc_slot_awg = 3
+
+# FIXME: CCIO register offsets, subject to change
+SYS_ST_QUES_DIOCAL_COND = 18
+SYS_ST_OPER_DIO_RD_INDEX = 19
+SYS_ST_OPER_DIO_MARGIN = 20
+
+
+
+
+log = logging.getLogger(__name__)
+log.setLevel(logging.DEBUG)
+
+log.debug('connecting to UHFQA')
+uhfqa0 = ZI_UHFQC.UHFQC('uhfqa0', device=dev_uhfqa, nr_integration_channels=9)
+if 0: # restart, based on zishell_NH.py
+ uhfqa0. seti('/' + dev_uhfqa + '/raw/system/restart', 1)
+ raise RuntimeError("restarting UHF, observe LabOne")
+uhfqa0.load_default_settings(upload_sequence=False)
+
+log.debug('connecting to CC')
+cc = CC('cc', IPTransport(ip_cc))
+cc.init()
+log.info(cc.get_identity())
+
+
+if 1: # DIO calibration
+ if 1:
+ log.debug('calibration DIO: CC to UHFQA')
+ DIO.calibrate(
+ sender=cc,
+ receiver=uhfqa0,
+ receiver_port=cc_slot_uhfqa0,
+ sender_dio_mode='uhfqa'
+ )
+ else:
+ log.warning('setting hardcoded DIO delay on OHFQA')
+ uhfqa0._set_dio_calibration_delay(5) # FIXME: improves attainable latency?
+ """
+ scope CC latency measurements:
+
+ delay CC DIO read index latency
+ 0 5 188 ns
+ 4 5 169 ns
+ 5 5 162/169 ns
+ 6 5 169 ns
+ 10 5 ---
+
+ toggled CLK source to INT, and back:
+ 0 -
+
+ again:
+ 0 12 197 ns
+ 4 12 178 ns
+ 5 12 178 ns
+ 6 12 178 ns
+
+ again:
+ 0 11 199 ns
+ 5 11 179 ns
+
+ again:
+ 5 10 179 ns
+
+ again:
+ 5 9 160 ns
+ """
+
+ if 1:
+ log.debug('calibration DIO: UHFQA to CC')
+ if 0:
+ DIO.calibrate(
+ sender=uhfqa0,
+ receiver=cc,
+ receiver_port=cc_slot_uhfqa0
+ )
+ else: # inspired by calibrate, but with CC program to trigger UHFQA
+ log.debug('sending triggered upstream DIO calibration program to UHFQA')
+ uhfqa_prog = inspect.cleandoc("""
+ // program: triggered upstream DIO calibration program
+ const period = 18; // 18*4.44 ns = 80 ns, NB: 40 ns is not attainable
+ const n1 = 3; // ~20 ns high time
+ const n2 = period-n1-2-1; // penalties: 2*setDIO, 1*loop
+ waitDIOTrigger();
+ while (1) {
+ setDIO(0x000003FF); // DV=0x0001, RSLT[8:0]=0x03FE.
+ wait(n1);
+ setDIO(0x00000000);
+ wait(n2);
+ }
+ """)
+ dio_mask = 0x000003FF
+ expected_sequence = []
+
+ uhfqa0.dios_0_mode(uhfqa0.DIOS_0_MODE_AWG_SEQ) # FIXME: changes value set by load_default_settings()
+ uhfqa0.configure_awg_from_string(0, uhfqa_prog)
+ uhfqa0.seti('awgs/0/enable', 1)
+ uhfqa0.start() # FIXME?
+
+
+ log.debug('sending UHFQA trigger program to CC')
+ # FIXME: does not match with uhfqa_prog, which requires single trigger
+ cc_prog = inspect.cleandoc("""
+ # program: UHFQA trigger program
+ .DEF wait 9
+
+ loop: seq_out 0x03FF0000,1 # NB: TRIG=0x00010000, CW[8:0]=0x03FE0000
+ seq_out 0x0,$wait
+ jmp @loop
+ """)
+ cc.assemble_and_start(cc_prog)
+
+
+ log.debug('calibrating DIO protocol on CC')
+ if 0: # marker outputs
+ if 1:
+ cc.debug_marker_in(cc_slot_uhfqa0, cc.UHFQA_DV) # watch DV to check upstream period/frequency
+ else:
+ cc.debug_marker_out(cc_slot_uhfqa0, cc.UHFQA_TRIG) # watch TRIG to check downstream period/frequency
+ cc.calibrate_dio_protocol(dio_mask=dio_mask, expected_sequence=expected_sequence, port=cc_slot_uhfqa0)
+
+ dio_rd_index = cc.debug_get_ccio_reg(cc_slot_uhfqa0, SYS_ST_OPER_DIO_RD_INDEX)
+ log.info(f'DIO calibration condition = 0x{cc.debug_get_ccio_reg(cc_slot_uhfqa0, SYS_ST_QUES_DIOCAL_COND):x} (0=OK)')
+ log.info(f'DIO read index = {dio_rd_index}')
+ log.info(f'DIO margin = {cc.debug_get_ccio_reg(cc_slot_uhfqa0, SYS_ST_OPER_DIO_MARGIN)}')
+ if dio_rd_index<0:
+ cc.debug_marker_in(cc_slot_uhfqa0, cc.UHFQA_DV) # watch DV to check upstream period/frequency
+ raise RuntimeError("DIO calibration failed. FIXME: try setting UHF clock to internal")
+
+ if 1: # disable to allow scope measurements
+ cc.stop()
+ uhfqa0.stop()
+ cc.get_operation_complete() # ensure all commands have finished
+
+
+
+
+if 1: # test of Distributed Shared Memory
+ if 1:
+ log.debug('run UHFQA codeword generator')
+
+ # build a programs that outputs the sequence once, each entry triggered by CC
+ #cw_list = [3, 2, 1, 0]
+ cw_list = [7, 6, 5, 4]
+ cw_array = np.array(cw_list, dtype=int).flatten()
+ uhfqa0.awg_sequence_test_pattern(dio_out_vect=cw_array * 2 + 1) # shift codeword, add Data Valid
+
+ if 1: # FIXME: remove duplicates of load_default_settings
+ # Prepare AWG_Seq as driver of DIO and set DIO output direction
+ uhfqa0.dios_0_mode(uhfqa0.DIOS_0_MODE_AWG_SEQ) # FIXME: change from default
+
+ # Initialize UHF for consecutive triggering and enable it
+ uhfqa0.awgs_0_single(0)
+ uhfqa0.awgs_0_enable(1) # ?
+ uhfqa0.start()
+
+
+ if 1:
+ log.debug('upload CC feedback test program')
+
+ # shorthand slot definitions for code generation
+ uhf = cc_slot_uhfqa0
+ awg = cc_slot_awg
+ prog = inspect.cleandoc(f"""
+ # program: CC feedback test program
+
+ .CODE
+ # constants:
+ .DEF numIter 4
+ .DEF smAddr S16
+ .DEF mux 0 # SM[3:0] := I[3:0]
+ .DEF pl 0 # 4 times CW=1 conditional on SM[3:0]
+ #.DEF mux 1 # SM[7:0] := I[7:0]
+ #.DEF pl 1 # O[7:0] := SM[7:0]
+
+ # timing constants:
+ .DEF uhfLatency 10 # 10: best latency, but SEQ_IN_EMPTY and STV, 11: stable
+ .DEF smWait 2 # plus another 2 makes 4 total: 80 ns
+ #.DEF smWait 3 # FIXME: extra margin
+ .DEF iterWait 11 # wait between iterations
+
+ # instruction set constants:
+ .DEF byte 0 # size parameter for seq_in_sm
+
+ seq_bar # synchronize processors so markers make sense
+ move $numIter,R0
+ loop:
+ [{uhf}] seq_out 0x00010000,$uhfLatency # trigger UHFQA
+ [{awg}] seq_wait $uhfLatency # balance UHF duration
+
+ [{uhf}] seq_in_sm $smAddr,$mux,$byte
+ [{uhf}] seq_sw_sm $smAddr # output to ARM SW for debugging
+ [{awg}] seq_inv_sm $smAddr,1 # invalidate 1 byte at target
+ [{awg}] seq_wait 1 # balance UHF duration
+
+ seq_wait $smWait # wait for data distribution
+
+ [{awg}] seq_out_sm $smAddr,$pl,1
+ [{uhf}] seq_wait 1
+
+ seq_wait $iterWait
+ loop R0,@loop
+ stop
+ .END ; .CODE
+
+
+ .DATAPATH
+ .MUX 0 # 4 qubits from 1 UHF-QA: SM[3:0] := I[3:0]
+ SM[0] := I[0]
+ SM[1] := I[1]
+ SM[2] := I[2]
+ SM[3] := I[3]
+
+ .MUX 1 # debug support: SM[7:0] := I[7:0]
+ SM[0] := I[0]
+ SM[1] := I[1]
+ SM[2] := I[2]
+ SM[3] := I[3]
+ SM[4] := I[4]
+ SM[5] := I[5]
+ SM[6] := I[6]
+ SM[7] := I[7]
+
+ .PL 0 # 4 times CW=1 conditional on SM[3:0]
+ O[31] := 1 ; HDAWG trigger
+
+ O[0] := SM[0] ; ch 1&2
+ O[7] := SM[1] ; ch 3&4
+ O[16] := SM[2] ; ch 5&6
+ O[23] := SM[3] ; ch 7&8
+ # NB: state is cleared
+
+ .PL 1 # debug support O[7:0] := SM[7:0]
+ O[31] := 1 ; HDAWG trigger
+
+ O[0] := SM[0]
+ O[1] := SM[1]
+ O[2] := SM[2]
+ O[3] := SM[3]
+ O[4] := SM[4]
+ O[5] := SM[5]
+ O[6] := SM[6]
+ O[7] := SM[7]
+ # NB: state is cleared
+
+ .END ; .DATAPATH
+ """)
+
+
+ # watch UHF
+ cc.debug_marker_in(cc_slot_uhfqa0, cc.UHFQA_DV)
+ # cc.debug_marker_out(cc_slot_uhfqa0, cc.UHFQA_TRIG)
+
+ # watch AWG
+ # FIXME: we currently use a CC-CONN-DIO (non differential), and no connected AWG. As a result, we can only
+ # watch bits [31:16], and HDAWG_TRIG is overriden by TOGGLE_DS
+ #cc.debug_marker_out(cc_slot_awg, cc.UHFQA_TRIG) #
+ #cc.debug_marker_out(cc_slot_awg, cc.HDAWG_TRIG) #
+ cc.debug_marker_out(cc_slot_awg, 23) # NB: always pulses to one with our test data using MUX 0
+
+ cc.stop() # prevent tracing previous program
+ for slot in [cc_slot_uhfqa0, cc_slot_awg]:
+ cc.debug_set_ccio_trace_on(slot, cc.TRACE_CCIO_DEV_IN)
+ cc.debug_set_ccio_trace_on(slot, cc.TRACE_CCIO_DEV_OUT)
+ cc.debug_set_ccio_trace_on(slot, cc.TRACE_CCIO_BP_IN)
+ cc.debug_set_ccio_trace_on(slot, cc.TRACE_CCIO_BP_OUT)
+ cc.assemble_and_start(prog)
+
+ time.sleep(1)
+ #print(cc.debug_get_ccio_trace(cc_slot_awg))
+ print(cc.debug_get_traces((1<1:
+ filename = sys.argv[1]
+if len(sys.argv)>2:
+ ip = sys.argv[2]
+
+log = logging.getLogger(__name__)
+log.setLevel(logging.DEBUG)
+
+log.info('connecting to CC')
+cc = CC('cc', IPTransport(ip))
+cc.init()
+
+if 1:
+ cc.debug_marker_out(0, cc.UHFQA_TRIG)
+ cc.debug_marker_out(1, cc.UHFQA_TRIG)
+ #cc.debug_marker_out(8, cc.HDAWG_TRIG)
+
+log.info(f'uploading {filename} and starting CC')
+with open(filename, 'r') as f:
+ prog = f.read()
+cc.assemble_and_start(prog)
diff --git a/examples/CC_examples/CC_setDioDelay.py b/examples/CC_examples/CC_setDioDelay.py
index 5740d92055..d81618abc6 100755
--- a/examples/CC_examples/CC_setDioDelay.py
+++ b/examples/CC_examples/CC_setDioDelay.py
@@ -2,8 +2,8 @@
import sys
-from pycqed.instrument_drivers.physical_instruments.Transport import IPTransport
-from pycqed.instrument_drivers.physical_instruments.QuTechCC_core import QuTechCC_core
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CCCore import CCCore
# parameter handling
ccio = 0
@@ -16,9 +16,8 @@
# fixed constants
ip = '192.168.0.241'
-reg = 63 # register used for delay control in OpenQL CC backend
-cc = QuTechCC_core('cc', IPTransport(ip)) # NB: QuTechCC_core loads much quicker then QuTechCC
-cc.stop()
-cc.set_q1_reg(ccio, reg, val)
-cc.start()
+cc = CCCore('cc', IPTransport(ip)) # NB: CCCore loads much quicker then CC
+#cc.stop()
+cc.set_seqbar_cnt(ccio, val)
+#cc.start()
diff --git a/examples/CC_examples/CC_stresstest.py b/examples/CC_examples/CC_stresstest.py
index 70fb700f7e..d852747978 100755
--- a/examples/CC_examples/CC_stresstest.py
+++ b/examples/CC_examples/CC_stresstest.py
@@ -3,8 +3,8 @@
import logging
import sys
-from pycqed.instrument_drivers.physical_instruments.Transport import IPTransport
-from pycqed.instrument_drivers.physical_instruments.QuTechCC import QuTechCC
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
# parameter handling
@@ -22,19 +22,30 @@
log.setLevel(logging.DEBUG)
-log.debug('generating program')
-prog = ''
-for i in range(10000):
- prog += ' seq_out 0x00000000,301\n'
-log.debug('connecting to CC')
-cc = QuTechCC('cc', IPTransport(ip))
+print('connecting to CC')
+cc = CC('cc', IPTransport(ip))
cc.reset()
cc.clear_status()
cc.status_preset()
for i in range(num_iter):
+ if 1:
+# prog = 'loop: seq_out 0x00000000,10\n'
+ prog = 'loop: seq_out 0x00000000,2\n'
+ # 1: no ILLEGAL_INSTR_RT
+ # 2: ~50%
+ # 10: mostly
+ prog += ' jmp @loop\n'
+ else:
+ length = randint(100,10000)
+ print(f'generating program of length {length}')
+ prog = ''
+ for line in range(length):
+ prog += ' seq_out 0x00000000,301\n'
+ prog += 'stop\n'
+
cc.sequence_program_assemble(prog)
for run in range(num_run_per_iter):
diff --git a/examples/CC_examples/CC_test.py b/examples/CC_examples/CC_test.py
new file mode 100644
index 0000000000..665c5c5afa
--- /dev/null
+++ b/examples/CC_examples/CC_test.py
@@ -0,0 +1,6 @@
+from pycqed.instrument_drivers.library.Transport import IPTransport
+from pycqed.instrument_drivers.physical_instruments.QuTech.CC import CC
+ip_cc = '192.168.0.241'
+cc = CC('cc', IPTransport(ip_cc))
+cc.init()
+cc.set_seqbar_cnt(2,5)
diff --git a/examples/CC_examples/DIODebug.py b/examples/CC_examples/DIODebug.py
index 3603d1572d..c14c1a1696 100644
--- a/examples/CC_examples/DIODebug.py
+++ b/examples/CC_examples/DIODebug.py
@@ -36,9 +36,9 @@ def print_var(name: str, val_format: str='{}'):
arg = 1
while arg < len(sys.argv):
val = sys.argv[arg]
- if val == "-l":
+ if val == "-L":
opt_set_lvds = True
- elif val == "-c":
+ elif val == "-C":
opt_set_cmos = True
elif val == '-s':
opt_dio_snapshot = True
@@ -97,7 +97,7 @@ def print_var(name: str, val_format: str='{}'):
for i,d in enumerate(data):
if d & 0x80000000 and d != prev_d:
- print('0x{:08X}: {} {} {} {}'.format(d,
+ print('{}\t0x{:08X}: {} {} {} {}'.format(i, d,
d >> shift3 & mask3,
d >> shift2 & mask2,
d >> shift1 & mask1,
@@ -110,12 +110,18 @@ def print_var(name: str, val_format: str='{}'):
if 0:
# FIXME: looking at single awg
- ts, cws = get_awg_dio_data(instr._dev, 0)
- ZI_tools.print_timing_diagram_simple(cws, dio_lines, 64)
+ dio_lines = range(7, -1, -1)
+ awg = 1 # 0..3
+ ts, cws = instr._get_awg_dio_data(awg)
+ if 0:
+ ZI_tools.print_timing_diagram_simple(cws, dio_lines, 64)
+ else:
+ for i,t in enumerate(ts):
+ print('[{}] {}:\t0x{:08X}'.format(i, t, cws[i]))
- if 1: # get list of nodes
+ if 0: # get list of nodes
#nodes = instr.daq.listNodes('/' + dev + '/', 7)
nodes = instr.daq.listNodes('/', 7)
with open("nodes.txt", "w") as file:
@@ -125,7 +131,7 @@ def print_var(name: str, val_format: str='{}'):
log.info(f"AWG{awg} DIO delay is set to {instr.getd(f'awgs/{awg}/dio/delay/value')}")
# show some relevant DIO variables
- if 1:
+ if 0:
for awg in [0, 1, 2, 3]:
print_var('awgs_{}_dio_error_timing'.format(awg))
print_var('awgs_{}_dio_state'.format(awg))
diff --git a/examples/CC_examples/flux_calibration.vq1asm b/examples/CC_examples/flux_calibration.vq1asm
index 048de498a2..2bd59c1d58 100644
--- a/examples/CC_examples/flux_calibration.vq1asm
+++ b/examples/CC_examples/flux_calibration.vq1asm
@@ -15,11 +15,19 @@ mainLoop: #
# slot=1, instrument='ro_1', group=0': signal='[dummy]'
# last bundle of kernel, will pad outputs to match durations
# slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
-[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
-[2] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_0'
-[3] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
-[4] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_1'
+[0] seq_out 0x00000000,34 # cycle 0-301: padding on 'ro_2'
+[1] seq_out 0x00000000,34 # cycle 0-301: padding on 'mw_0'
+[2] seq_out 0x00000000,34 # cycle 0-301: padding on 'flux_0'
+[3] seq_out 0x00000000,34 # cycle 0-301: padding on 'mw_1'
# sequence
+[5] seq_out 0x00000000,20 # 00000000000000000000000000000000
+[5] seq_out 0x82498249,2 # 10000010010010011000001001001001
+[5] seq_out 0x84928492,2 # 10000100100100101000010010010010
+[5] seq_out 0x86DB86DB,2 # 10000110110110111000011011011011
+[5] seq_out 0x89248924,2 # 10001001001001001000100100100100
+[5] seq_out 0x8B6D8B6D,2 # 10001011011011011000101101101101
+[5] seq_out 0x8DB68DB6,2 # 10001101101101101000110110110110
+[5] seq_out 0x8FFF8FFF,2 # 10001111111111111000111111111111
[6] seq_out 0x00000000,20 # 00000000000000000000000000000000
[6] seq_out 0x82498249,2 # 10000010010010011000001001001001
[6] seq_out 0x84928492,2 # 10000100100100101000010010010010
@@ -28,5 +36,14 @@ mainLoop: #
[6] seq_out 0x8B6D8B6D,2 # 10001011011011011000101101101101
[6] seq_out 0x8DB68DB6,2 # 10001101101101101000110110110110
[6] seq_out 0x8FFF8FFF,2 # 10001111111111111000111111111111
+[7] seq_out 0x00000000,20 # 00000000000000000000000000000000
+[7] seq_out 0x82498249,2 # 10000010010010011000001001001001
+[7] seq_out 0x84928492,2 # 10000100100100101000010010010010
+[7] seq_out 0x86DB86DB,2 # 10000110110110111000011011011011
+[7] seq_out 0x89248924,2 # 10001001001001001000100100100100
+[7] seq_out 0x8B6D8B6D,2 # 10001011011011011000101101101101
+[7] seq_out 0x8DB68DB6,2 # 10001101101101101000110110110110
+[7] seq_out 0x8FFF8FFF,2 # 10001111111111111000111111111111
+
jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/hdawg_calibration.vq1asm b/examples/CC_examples/hdawg_calibration.vq1asm
new file mode 100644
index 0000000000..e82d116484
--- /dev/null
+++ b/examples/CC_examples/hdawg_calibration.vq1asm
@@ -0,0 +1,196 @@
+# CC_BACKEND_VERSION 0.2.4
+# OPENQL_VERSION 0.8.0
+# Program: 'CW_RO_sequence'
+# Note: generated by OpenQL Central Controller backend
+#
+# synchronous start and latency compensation
+ add R63,1,R0 # R63 externally set by user, prevent 0 value which would wrap counter
+ seq_bar 20 # synchronization
+syncLoop: seq_out 0x00000000,1 # 20 ns delay
+ loop R0,@syncLoop #
+mainLoop: #
+### Kernel: 'k_main'
+## Bundle 0: start_cycle=1, duration_in_cycles=300:
+ # READOUT: measure(q0)
+ # slot=1, instrument='ro_1', group=0': signal='[dummy]'
+ # last bundle of kernel, will pad outputs to match durations
+ # slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
+[0] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_0'
+[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_1'
+[2] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
+[3] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[3] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[3] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[3] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[3] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[3] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[3] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[3] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[3] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[3] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[3] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[3] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[3] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[3] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[3] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[3] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[3] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[3] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[3] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[3] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[3] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[3] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[3] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[3] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[3] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[3] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[3] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[3] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[3] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[3] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[3] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[3] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[3] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+<<<<<<< HEAD
+# digIn=2
+[4] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_1'
+[5] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
+=======
+[4] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[4] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[4] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[4] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[4] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[4] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[4] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[4] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[4] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[4] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[4] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[4] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[4] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[4] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[4] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[4] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[4] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[4] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[4] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[4] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[4] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[4] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[4] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[4] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[4] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[4] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[4] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[4] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[4] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[4] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[4] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[4] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[4] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[5] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
+[6] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_1'
+[7] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_2'
+[8] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[8] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[8] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[8] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[8] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[8] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[8] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[8] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[8] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[8] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[8] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[8] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[8] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[8] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[8] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[8] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[8] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[8] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[8] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[8] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[8] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[8] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[8] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[8] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[8] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[8] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[8] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[8] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[8] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[8] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[8] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[8] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[8] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[9] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[9] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[9] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[9] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[9] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[9] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[9] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[9] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[9] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[9] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[9] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[9] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[9] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[9] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[9] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[9] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[9] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[9] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[9] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[9] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[9] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[9] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[9] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[9] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[9] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[9] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[9] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[9] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[9] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[9] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[9] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[9] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[9] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[10] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[10] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[10] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[10] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[10] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[10] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[10] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[10] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[10] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[10] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[10] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[10] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[10] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[10] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[10] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[10] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[10] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[10] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[10] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[10] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[10] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[10] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[10] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[10] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[10] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[10] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[10] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[10] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[10] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[10] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[10] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[10] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[10] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+>>>>>>> feature/hdawg_amp_interface
+
+ jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/hdawg_calibration_6bit.vq1asm b/examples/CC_examples/hdawg_calibration_6bit.vq1asm
new file mode 100644
index 0000000000..a913b6e7c5
--- /dev/null
+++ b/examples/CC_examples/hdawg_calibration_6bit.vq1asm
@@ -0,0 +1,157 @@
+# CC_BACKEND_VERSION 0.2.4
+# OPENQL_VERSION 0.8.0
+# Program: 'CW_RO_sequence'
+# Note: generated by OpenQL Central Controller backend
+#
+# synchronous start and latency compensation
+ add R63,1,R0 # R63 externally set by user, prevent 0 value which would wrap counter
+ seq_bar 20 # synchronization
+syncLoop: seq_out 0x00000000,1 # 20 ns delay
+ loop R0,@syncLoop #
+mainLoop: #
+### Kernel: 'k_main'
+## Bundle 0: start_cycle=1, duration_in_cycles=300:
+ # READOUT: measure(q0)
+ # slot=1, instrument='ro_1', group=0': signal='[dummy]'
+ # last bundle of kernel, will pad outputs to match durations
+ # slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
+[0] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
+[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_0'
+# comment
+[2] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[2] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[2] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[2] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[2] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[2] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[2] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[2] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[2] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[2] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[2] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[2] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[2] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[2] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[2] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[2] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[2] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[2] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[2] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[2] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[2] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[2] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[2] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[2] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[2] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[2] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[2] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[2] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[2] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[2] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[2] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[2] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[2] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[2] seq_out 0x90209020,2 # 10010000001000001001000000100000
+[2] seq_out 0x90A190A1,2 # 10010000101000011001000010100001
+[2] seq_out 0x91229122,2 # 10010001001000101001000100100010
+[2] seq_out 0x91A391A3,2 # 10010001101000111001000110100011
+[2] seq_out 0x92249224,2 # 10010010001001001001001000100100
+[2] seq_out 0x92A592A5,2 # 10010010101001011001001010100101
+[2] seq_out 0x93269326,2 # 10010011001001101001001100100110
+[2] seq_out 0x93A793A7,2 # 10010011101001111001001110100111
+[2] seq_out 0x94289428,2 # 10010100001010001001010000101000
+[2] seq_out 0x94A994A9,2 # 10010100101010011001010010101001
+[2] seq_out 0x952A952A,2 # 10010101001010101001010100101010
+[2] seq_out 0x95AB95AB,2 # 10010101101010111001010110101011
+[2] seq_out 0x962C962C,2 # 10010110001011001001011000101100
+[2] seq_out 0x96AD96AD,2 # 10010110101011011001011010101101
+[2] seq_out 0x972E972E,2 # 10010111001011101001011100101110
+[2] seq_out 0x97AF97AF,2 # 10010111101011111001011110101111
+[2] seq_out 0x98309830,2 # 10011000001100001001100000110000
+[2] seq_out 0x98B198B1,2 # 10011000101100011001100010110001
+[2] seq_out 0x99329932,2 # 10011001001100101001100100110010
+[2] seq_out 0x99B399B3,2 # 10011001101100111001100110110011
+[2] seq_out 0x9A349A34,2 # 10011010001101001001101000110100
+[2] seq_out 0x9AB59AB5,2 # 10011010101101011001101010110101
+[2] seq_out 0x9B369B36,2 # 10011011001101101001101100110110
+[2] seq_out 0x9BB79BB7,2 # 10011011101101111001101110110111
+[2] seq_out 0x9C389C38,2 # 10011100001110001001110000111000
+[2] seq_out 0x9CB99CB9,2 # 10011100101110011001110010111001
+[2] seq_out 0x9D3A9D3A,2 # 10011101001110101001110100111010
+[2] seq_out 0x9DBB9DBB,2 # 10011101101110111001110110111011
+[2] seq_out 0x9E3C9E3C,2 # 10011110001111001001111000111100
+[2] seq_out 0x9EBD9EBD,2 # 10011110101111011001111010111101
+[2] seq_out 0x9F3E9F3E,2 # 10011111001111101001111100111110
+[2] seq_out 0x9FBF9FBF,2 # 10011111101111111001111110111111
+
+[3] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[3] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[3] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[3] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[3] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[3] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[3] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[3] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[3] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[3] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[3] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[3] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[3] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[3] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[3] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[3] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[3] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[3] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[3] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[3] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[3] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[3] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[3] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[3] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[3] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[3] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[3] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[3] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[3] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[3] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[3] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[3] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[3] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[3] seq_out 0x90209020,2 # 10010000001000001001000000100000
+[3] seq_out 0x90A190A1,2 # 10010000101000011001000010100001
+[3] seq_out 0x91229122,2 # 10010001001000101001000100100010
+[3] seq_out 0x91A391A3,2 # 10010001101000111001000110100011
+[3] seq_out 0x92249224,2 # 10010010001001001001001000100100
+[3] seq_out 0x92A592A5,2 # 10010010101001011001001010100101
+[3] seq_out 0x93269326,2 # 10010011001001101001001100100110
+[3] seq_out 0x93A793A7,2 # 10010011101001111001001110100111
+[3] seq_out 0x94289428,2 # 10010100001010001001010000101000
+[3] seq_out 0x94A994A9,2 # 10010100101010011001010010101001
+[3] seq_out 0x952A952A,2 # 10010101001010101001010100101010
+[3] seq_out 0x95AB95AB,2 # 10010101101010111001010110101011
+[3] seq_out 0x962C962C,2 # 10010110001011001001011000101100
+[3] seq_out 0x96AD96AD,2 # 10010110101011011001011010101101
+[3] seq_out 0x972E972E,2 # 10010111001011101001011100101110
+[3] seq_out 0x97AF97AF,2 # 10010111101011111001011110101111
+[3] seq_out 0x98309830,2 # 10011000001100001001100000110000
+[3] seq_out 0x98B198B1,2 # 10011000101100011001100010110001
+[3] seq_out 0x99329932,2 # 10011001001100101001100100110010
+[3] seq_out 0x99B399B3,2 # 10011001101100111001100110110011
+[3] seq_out 0x9A349A34,2 # 10011010001101001001101000110100
+[3] seq_out 0x9AB59AB5,2 # 10011010101101011001101010110101
+[3] seq_out 0x9B369B36,2 # 10011011001101101001101100110110
+[3] seq_out 0x9BB79BB7,2 # 10011011101101111001101110110111
+[3] seq_out 0x9C389C38,2 # 10011100001110001001110000111000
+[3] seq_out 0x9CB99CB9,2 # 10011100101110011001110010111001
+[3] seq_out 0x9D3A9D3A,2 # 10011101001110101001110100111010
+[3] seq_out 0x9DBB9DBB,2 # 10011101101110111001110110111011
+[3] seq_out 0x9E3C9E3C,2 # 10011110001111001001111000111100
+[3] seq_out 0x9EBD9EBD,2 # 10011110101111011001111010111101
+[3] seq_out 0x9F3E9F3E,2 # 10011111001111101001111100111110
+[3] seq_out 0x9FBF9FBF,2 # 10011111101111111001111110111111
+
+# digIn=2
+[4] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_1'
+[5] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
+
+ jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/hdawg_calibration_7bit.vq1asm b/examples/CC_examples/hdawg_calibration_7bit.vq1asm
new file mode 100644
index 0000000000..596f278639
--- /dev/null
+++ b/examples/CC_examples/hdawg_calibration_7bit.vq1asm
@@ -0,0 +1,284 @@
+# CC_BACKEND_VERSION 0.2.4
+# OPENQL_VERSION 0.8.0
+# Program: 'CW_RO_sequence'
+# Note: generated by OpenQL Central Controller backend
+#
+# synchronous start and latency compensation
+ add R63,1,R0 # R63 externally set by user, prevent 0 value which would wrap counter
+ seq_bar 20 # synchronization
+syncLoop: seq_out 0x00000000,1 # 20 ns delay
+ loop R0,@syncLoop #
+mainLoop: #
+### Kernel: 'k_main'
+## Bundle 0: start_cycle=1, duration_in_cycles=300:
+ # READOUT: measure(q0)
+ # slot=1, instrument='ro_1', group=0': signal='[dummy]'
+ # last bundle of kernel, will pad outputs to match durations
+ # slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
+[0] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
+[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_0'
+# comment
+[2] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[2] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[2] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[2] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[2] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[2] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[2] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[2] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[2] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[2] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[2] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[2] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[2] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[2] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[2] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[2] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[2] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[2] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[2] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[2] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[2] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[2] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[2] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[2] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[2] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[2] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[2] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[2] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[2] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[2] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[2] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[2] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[2] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[2] seq_out 0x90209020,2 # 10010000001000001001000000100000
+[2] seq_out 0x90A190A1,2 # 10010000101000011001000010100001
+[2] seq_out 0x91229122,2 # 10010001001000101001000100100010
+[2] seq_out 0x91A391A3,2 # 10010001101000111001000110100011
+[2] seq_out 0x92249224,2 # 10010010001001001001001000100100
+[2] seq_out 0x92A592A5,2 # 10010010101001011001001010100101
+[2] seq_out 0x93269326,2 # 10010011001001101001001100100110
+[2] seq_out 0x93A793A7,2 # 10010011101001111001001110100111
+[2] seq_out 0x94289428,2 # 10010100001010001001010000101000
+[2] seq_out 0x94A994A9,2 # 10010100101010011001010010101001
+[2] seq_out 0x952A952A,2 # 10010101001010101001010100101010
+[2] seq_out 0x95AB95AB,2 # 10010101101010111001010110101011
+[2] seq_out 0x962C962C,2 # 10010110001011001001011000101100
+[2] seq_out 0x96AD96AD,2 # 10010110101011011001011010101101
+[2] seq_out 0x972E972E,2 # 10010111001011101001011100101110
+[2] seq_out 0x97AF97AF,2 # 10010111101011111001011110101111
+[2] seq_out 0x98309830,2 # 10011000001100001001100000110000
+[2] seq_out 0x98B198B1,2 # 10011000101100011001100010110001
+[2] seq_out 0x99329932,2 # 10011001001100101001100100110010
+[2] seq_out 0x99B399B3,2 # 10011001101100111001100110110011
+[2] seq_out 0x9A349A34,2 # 10011010001101001001101000110100
+[2] seq_out 0x9AB59AB5,2 # 10011010101101011001101010110101
+[2] seq_out 0x9B369B36,2 # 10011011001101101001101100110110
+[2] seq_out 0x9BB79BB7,2 # 10011011101101111001101110110111
+[2] seq_out 0x9C389C38,2 # 10011100001110001001110000111000
+[2] seq_out 0x9CB99CB9,2 # 10011100101110011001110010111001
+[2] seq_out 0x9D3A9D3A,2 # 10011101001110101001110100111010
+[2] seq_out 0x9DBB9DBB,2 # 10011101101110111001110110111011
+[2] seq_out 0x9E3C9E3C,2 # 10011110001111001001111000111100
+[2] seq_out 0x9EBD9EBD,2 # 10011110101111011001111010111101
+[2] seq_out 0x9F3E9F3E,2 # 10011111001111101001111100111110
+[2] seq_out 0x9FBF9FBF,2 # 10011111101111111001111110111111
+[2] seq_out 0xA040A040,2 # 10100000010000001010000001000000
+[2] seq_out 0xA0C1A0C1,2 # 10100000110000011010000011000001
+[2] seq_out 0xA142A142,2 # 10100001010000101010000101000010
+[2] seq_out 0xA1C3A1C3,2 # 10100001110000111010000111000011
+[2] seq_out 0xA244A244,2 # 10100010010001001010001001000100
+[2] seq_out 0xA2C5A2C5,2 # 10100010110001011010001011000101
+[2] seq_out 0xA346A346,2 # 10100011010001101010001101000110
+[2] seq_out 0xA3C7A3C7,2 # 10100011110001111010001111000111
+[2] seq_out 0xA448A448,2 # 10100100010010001010010001001000
+[2] seq_out 0xA4C9A4C9,2 # 10100100110010011010010011001001
+[2] seq_out 0xA54AA54A,2 # 10100101010010101010010101001010
+[2] seq_out 0xA5CBA5CB,2 # 10100101110010111010010111001011
+[2] seq_out 0xA64CA64C,2 # 10100110010011001010011001001100
+[2] seq_out 0xA6CDA6CD,2 # 10100110110011011010011011001101
+[2] seq_out 0xA74EA74E,2 # 10100111010011101010011101001110
+[2] seq_out 0xA7CFA7CF,2 # 10100111110011111010011111001111
+[2] seq_out 0xA850A850,2 # 10101000010100001010100001010000
+[2] seq_out 0xA8D1A8D1,2 # 10101000110100011010100011010001
+[2] seq_out 0xA952A952,2 # 10101001010100101010100101010010
+[2] seq_out 0xA9D3A9D3,2 # 10101001110100111010100111010011
+[2] seq_out 0xAA54AA54,2 # 10101010010101001010101001010100
+[2] seq_out 0xAAD5AAD5,2 # 10101010110101011010101011010101
+[2] seq_out 0xAB56AB56,2 # 10101011010101101010101101010110
+[2] seq_out 0xABD7ABD7,2 # 10101011110101111010101111010111
+[2] seq_out 0xAC58AC58,2 # 10101100010110001010110001011000
+[2] seq_out 0xACD9ACD9,2 # 10101100110110011010110011011001
+[2] seq_out 0xAD5AAD5A,2 # 10101101010110101010110101011010
+[2] seq_out 0xADDBADDB,2 # 10101101110110111010110111011011
+[2] seq_out 0xAE5CAE5C,2 # 10101110010111001010111001011100
+[2] seq_out 0xAEDDAEDD,2 # 10101110110111011010111011011101
+[2] seq_out 0xAF5EAF5E,2 # 10101111010111101010111101011110
+[2] seq_out 0xAFDFAFDF,2 # 10101111110111111010111111011111
+[2] seq_out 0xB060B060,2 # 10110000011000001011000001100000
+[2] seq_out 0xB0E1B0E1,2 # 10110000111000011011000011100001
+[2] seq_out 0xB162B162,2 # 10110001011000101011000101100010
+[2] seq_out 0xB1E3B1E3,2 # 10110001111000111011000111100011
+[2] seq_out 0xB264B264,2 # 10110010011001001011001001100100
+[2] seq_out 0xB2E5B2E5,2 # 10110010111001011011001011100101
+[2] seq_out 0xB366B366,2 # 10110011011001101011001101100110
+[2] seq_out 0xB3E7B3E7,2 # 10110011111001111011001111100111
+[2] seq_out 0xB468B468,2 # 10110100011010001011010001101000
+[2] seq_out 0xB4E9B4E9,2 # 10110100111010011011010011101001
+[2] seq_out 0xB56AB56A,2 # 10110101011010101011010101101010
+[2] seq_out 0xB5EBB5EB,2 # 10110101111010111011010111101011
+[2] seq_out 0xB66CB66C,2 # 10110110011011001011011001101100
+[2] seq_out 0xB6EDB6ED,2 # 10110110111011011011011011101101
+[2] seq_out 0xB76EB76E,2 # 10110111011011101011011101101110
+[2] seq_out 0xB7EFB7EF,2 # 10110111111011111011011111101111
+[2] seq_out 0xB870B870,2 # 10111000011100001011100001110000
+[2] seq_out 0xB8F1B8F1,2 # 10111000111100011011100011110001
+[2] seq_out 0xB972B972,2 # 10111001011100101011100101110010
+[2] seq_out 0xB9F3B9F3,2 # 10111001111100111011100111110011
+[2] seq_out 0xBA74BA74,2 # 10111010011101001011101001110100
+[2] seq_out 0xBAF5BAF5,2 # 10111010111101011011101011110101
+[2] seq_out 0xBB76BB76,2 # 10111011011101101011101101110110
+[2] seq_out 0xBBF7BBF7,2 # 10111011111101111011101111110111
+[2] seq_out 0xBC78BC78,2 # 10111100011110001011110001111000
+[2] seq_out 0xBCF9BCF9,2 # 10111100111110011011110011111001
+[2] seq_out 0xBD7ABD7A,2 # 10111101011110101011110101111010
+[2] seq_out 0xBDFBBDFB,2 # 10111101111110111011110111111011
+[2] seq_out 0xBE7CBE7C,2 # 10111110011111001011111001111100
+[2] seq_out 0xBEFDBEFD,2 # 10111110111111011011111011111101
+[2] seq_out 0xBF7EBF7E,2 # 10111111011111101011111101111110
+[2] seq_out 0xBFFFBFFF,2 # 10111111111111111011111111111111
+
+[3] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[3] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[3] seq_out 0x80818081,2 # 10000000100000011000000010000001
+[3] seq_out 0x81028102,2 # 10000001000000101000000100000010
+[3] seq_out 0x81838183,2 # 10000001100000111000000110000011
+[3] seq_out 0x82048204,2 # 10000010000001001000001000000100
+[3] seq_out 0x82858285,2 # 10000010100001011000001010000101
+[3] seq_out 0x83068306,2 # 10000011000001101000001100000110
+[3] seq_out 0x83878387,2 # 10000011100001111000001110000111
+[3] seq_out 0x84088408,2 # 10000100000010001000010000001000
+[3] seq_out 0x84898489,2 # 10000100100010011000010010001001
+[3] seq_out 0x850A850A,2 # 10000101000010101000010100001010
+[3] seq_out 0x858B858B,2 # 10000101100010111000010110001011
+[3] seq_out 0x860C860C,2 # 10000110000011001000011000001100
+[3] seq_out 0x868D868D,2 # 10000110100011011000011010001101
+[3] seq_out 0x870E870E,2 # 10000111000011101000011100001110
+[3] seq_out 0x878F878F,2 # 10000111100011111000011110001111
+[3] seq_out 0x88108810,2 # 10001000000100001000100000010000
+[3] seq_out 0x88918891,2 # 10001000100100011000100010010001
+[3] seq_out 0x89128912,2 # 10001001000100101000100100010010
+[3] seq_out 0x89938993,2 # 10001001100100111000100110010011
+[3] seq_out 0x8A148A14,2 # 10001010000101001000101000010100
+[3] seq_out 0x8A958A95,2 # 10001010100101011000101010010101
+[3] seq_out 0x8B168B16,2 # 10001011000101101000101100010110
+[3] seq_out 0x8B978B97,2 # 10001011100101111000101110010111
+[3] seq_out 0x8C188C18,2 # 10001100000110001000110000011000
+[3] seq_out 0x8C998C99,2 # 10001100100110011000110010011001
+[3] seq_out 0x8D1A8D1A,2 # 10001101000110101000110100011010
+[3] seq_out 0x8D9B8D9B,2 # 10001101100110111000110110011011
+[3] seq_out 0x8E1C8E1C,2 # 10001110000111001000111000011100
+[3] seq_out 0x8E9D8E9D,2 # 10001110100111011000111010011101
+[3] seq_out 0x8F1E8F1E,2 # 10001111000111101000111100011110
+[3] seq_out 0x8F9F8F9F,2 # 10001111100111111000111110011111
+[3] seq_out 0x90209020,2 # 10010000001000001001000000100000
+[3] seq_out 0x90A190A1,2 # 10010000101000011001000010100001
+[3] seq_out 0x91229122,2 # 10010001001000101001000100100010
+[3] seq_out 0x91A391A3,2 # 10010001101000111001000110100011
+[3] seq_out 0x92249224,2 # 10010010001001001001001000100100
+[3] seq_out 0x92A592A5,2 # 10010010101001011001001010100101
+[3] seq_out 0x93269326,2 # 10010011001001101001001100100110
+[3] seq_out 0x93A793A7,2 # 10010011101001111001001110100111
+[3] seq_out 0x94289428,2 # 10010100001010001001010000101000
+[3] seq_out 0x94A994A9,2 # 10010100101010011001010010101001
+[3] seq_out 0x952A952A,2 # 10010101001010101001010100101010
+[3] seq_out 0x95AB95AB,2 # 10010101101010111001010110101011
+[3] seq_out 0x962C962C,2 # 10010110001011001001011000101100
+[3] seq_out 0x96AD96AD,2 # 10010110101011011001011010101101
+[3] seq_out 0x972E972E,2 # 10010111001011101001011100101110
+[3] seq_out 0x97AF97AF,2 # 10010111101011111001011110101111
+[3] seq_out 0x98309830,2 # 10011000001100001001100000110000
+[3] seq_out 0x98B198B1,2 # 10011000101100011001100010110001
+[3] seq_out 0x99329932,2 # 10011001001100101001100100110010
+[3] seq_out 0x99B399B3,2 # 10011001101100111001100110110011
+[3] seq_out 0x9A349A34,2 # 10011010001101001001101000110100
+[3] seq_out 0x9AB59AB5,2 # 10011010101101011001101010110101
+[3] seq_out 0x9B369B36,2 # 10011011001101101001101100110110
+[3] seq_out 0x9BB79BB7,2 # 10011011101101111001101110110111
+[3] seq_out 0x9C389C38,2 # 10011100001110001001110000111000
+[3] seq_out 0x9CB99CB9,2 # 10011100101110011001110010111001
+[3] seq_out 0x9D3A9D3A,2 # 10011101001110101001110100111010
+[3] seq_out 0x9DBB9DBB,2 # 10011101101110111001110110111011
+[3] seq_out 0x9E3C9E3C,2 # 10011110001111001001111000111100
+[3] seq_out 0x9EBD9EBD,2 # 10011110101111011001111010111101
+[3] seq_out 0x9F3E9F3E,2 # 10011111001111101001111100111110
+[3] seq_out 0x9FBF9FBF,2 # 10011111101111111001111110111111
+[3] seq_out 0xA040A040,2 # 10100000010000001010000001000000
+[3] seq_out 0xA0C1A0C1,2 # 10100000110000011010000011000001
+[3] seq_out 0xA142A142,2 # 10100001010000101010000101000010
+[3] seq_out 0xA1C3A1C3,2 # 10100001110000111010000111000011
+[3] seq_out 0xA244A244,2 # 10100010010001001010001001000100
+[3] seq_out 0xA2C5A2C5,2 # 10100010110001011010001011000101
+[3] seq_out 0xA346A346,2 # 10100011010001101010001101000110
+[3] seq_out 0xA3C7A3C7,2 # 10100011110001111010001111000111
+[3] seq_out 0xA448A448,2 # 10100100010010001010010001001000
+[3] seq_out 0xA4C9A4C9,2 # 10100100110010011010010011001001
+[3] seq_out 0xA54AA54A,2 # 10100101010010101010010101001010
+[3] seq_out 0xA5CBA5CB,2 # 10100101110010111010010111001011
+[3] seq_out 0xA64CA64C,2 # 10100110010011001010011001001100
+[3] seq_out 0xA6CDA6CD,2 # 10100110110011011010011011001101
+[3] seq_out 0xA74EA74E,2 # 10100111010011101010011101001110
+[3] seq_out 0xA7CFA7CF,2 # 10100111110011111010011111001111
+[3] seq_out 0xA850A850,2 # 10101000010100001010100001010000
+[3] seq_out 0xA8D1A8D1,2 # 10101000110100011010100011010001
+[3] seq_out 0xA952A952,2 # 10101001010100101010100101010010
+[3] seq_out 0xA9D3A9D3,2 # 10101001110100111010100111010011
+[3] seq_out 0xAA54AA54,2 # 10101010010101001010101001010100
+[3] seq_out 0xAAD5AAD5,2 # 10101010110101011010101011010101
+[3] seq_out 0xAB56AB56,2 # 10101011010101101010101101010110
+[3] seq_out 0xABD7ABD7,2 # 10101011110101111010101111010111
+[3] seq_out 0xAC58AC58,2 # 10101100010110001010110001011000
+[3] seq_out 0xACD9ACD9,2 # 10101100110110011010110011011001
+[3] seq_out 0xAD5AAD5A,2 # 10101101010110101010110101011010
+[3] seq_out 0xADDBADDB,2 # 10101101110110111010110111011011
+[3] seq_out 0xAE5CAE5C,2 # 10101110010111001010111001011100
+[3] seq_out 0xAEDDAEDD,2 # 10101110110111011010111011011101
+[3] seq_out 0xAF5EAF5E,2 # 10101111010111101010111101011110
+[3] seq_out 0xAFDFAFDF,2 # 10101111110111111010111111011111
+[3] seq_out 0xB060B060,2 # 10110000011000001011000001100000
+[3] seq_out 0xB0E1B0E1,2 # 10110000111000011011000011100001
+[3] seq_out 0xB162B162,2 # 10110001011000101011000101100010
+[3] seq_out 0xB1E3B1E3,2 # 10110001111000111011000111100011
+[3] seq_out 0xB264B264,2 # 10110010011001001011001001100100
+[3] seq_out 0xB2E5B2E5,2 # 10110010111001011011001011100101
+[3] seq_out 0xB366B366,2 # 10110011011001101011001101100110
+[3] seq_out 0xB3E7B3E7,2 # 10110011111001111011001111100111
+[3] seq_out 0xB468B468,2 # 10110100011010001011010001101000
+[3] seq_out 0xB4E9B4E9,2 # 10110100111010011011010011101001
+[3] seq_out 0xB56AB56A,2 # 10110101011010101011010101101010
+[3] seq_out 0xB5EBB5EB,2 # 10110101111010111011010111101011
+[3] seq_out 0xB66CB66C,2 # 10110110011011001011011001101100
+[3] seq_out 0xB6EDB6ED,2 # 10110110111011011011011011101101
+[3] seq_out 0xB76EB76E,2 # 10110111011011101011011101101110
+[3] seq_out 0xB7EFB7EF,2 # 10110111111011111011011111101111
+[3] seq_out 0xB870B870,2 # 10111000011100001011100001110000
+[3] seq_out 0xB8F1B8F1,2 # 10111000111100011011100011110001
+[3] seq_out 0xB972B972,2 # 10111001011100101011100101110010
+[3] seq_out 0xB9F3B9F3,2 # 10111001111100111011100111110011
+[3] seq_out 0xBA74BA74,2 # 10111010011101001011101001110100
+[3] seq_out 0xBAF5BAF5,2 # 10111010111101011011101011110101
+[3] seq_out 0xBB76BB76,2 # 10111011011101101011101101110110
+[3] seq_out 0xBBF7BBF7,2 # 10111011111101111011101111110111
+[3] seq_out 0xBC78BC78,2 # 10111100011110001011110001111000
+[3] seq_out 0xBCF9BCF9,2 # 10111100111110011011110011111001
+[3] seq_out 0xBD7ABD7A,2 # 10111101011110101011110101111010
+[3] seq_out 0xBDFBBDFB,2 # 10111101111110111011110111111011
+[3] seq_out 0xBE7CBE7C,2 # 10111110011111001011111001111100
+[3] seq_out 0xBEFDBEFD,2 # 10111110111111011011111011111101
+[3] seq_out 0xBF7EBF7E,2 # 10111111011111101011111101111110
+[3] seq_out 0xBFFFBFFF,2 # 10111111111111111011111111111111
+# digIn=2
+[4] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_1'
+[5] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
+
+ jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/old_hdawg_calibration.vq1asm b/examples/CC_examples/old_hdawg_calibration.vq1asm
index c3ad9674ad..3ba39ae6bc 100644
--- a/examples/CC_examples/old_hdawg_calibration.vq1asm
+++ b/examples/CC_examples/old_hdawg_calibration.vq1asm
@@ -15,45 +15,45 @@ mainLoop: #
# slot=1, instrument='ro_1', group=0': signal='[dummy]'
# last bundle of kernel, will pad outputs to match durations
# slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
-[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
-[2] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_0'
+[0] seq_out 0x00000000,301 # cycle 0-301: padding on 'ro_2'
+[1] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_0'
# comment
-[3] seq_out 0x00000000,2 # 00000000000000000000000000000000
-[3] seq_out 0x80003E00,2 # 10000000000000000000000000000000
-[3] seq_out 0x80003C01,2 # 10000000000000000000001000000001
-[3] seq_out 0x80003A02,2 # 10000000000000000000010000000010
-[3] seq_out 0x80003803,2 # 10000000000000000000011000000011
-[3] seq_out 0x80003604,2 # 10000000000000000000100000000100
-[3] seq_out 0x80003405,2 # 10000000000000000000101000000101
-[3] seq_out 0x80003206,2 # 10000000000000000000110000000110
-[3] seq_out 0x80003007,2 # 10000000000000000000111000000111
-[3] seq_out 0x80002E08,2 # 10000000000000000001000000001000
-[3] seq_out 0x80002C09,2 # 10000000000000000001001000001001
-[3] seq_out 0x80002A0A,2 # 10000000000000000001010000001010
-[3] seq_out 0x8000280B,2 # 10000000000000000001011000001011
-[3] seq_out 0x8000260C,2 # 10000000000000000001100000001100
-[3] seq_out 0x8000240D,2 # 10000000000000000001101000001101
-[3] seq_out 0x8000220E,2 # 10000000000000000001110000001110
-[3] seq_out 0x8000200F,2 # 10000000000000000001111000001111
-[3] seq_out 0x80001E10,2 # 10000000000000000010000000010000
-[3] seq_out 0x80001C11,2 # 10000000000000000010001000010001
-[3] seq_out 0x80001A12,2 # 10000000000000000010010000010010
-[3] seq_out 0x80001813,2 # 10000000000000000010011000010011
-[3] seq_out 0x80001614,2 # 10000000000000000010100000010100
-[3] seq_out 0x80001415,2 # 10000000000000000010101000010101
-[3] seq_out 0x80001216,2 # 10000000000000000010110000010110
-[3] seq_out 0x80001017,2 # 10000000000000000010111000010111
-[3] seq_out 0x80000E18,2 # 10000000000000000011000000011000
-[3] seq_out 0x80000C19,2 # 10000000000000000011001000011001
-[3] seq_out 0x80000A1A,2 # 10000000000000000011010000011010
-[3] seq_out 0x8000081B,2 # 10000000000000000011011000011011
-[3] seq_out 0x8000061C,2 # 10000000000000000011100000011100
-[3] seq_out 0x8000041D,2 # 10000000000000000011101000011101
-[3] seq_out 0x8000021E,2 # 10000000000000000011110000011110
-[3] seq_out 0x8000001F,2 # 10000000000000000011111000011111
-[3] seq_out 0x00000000,18 # 00000000000000000000000000000000
+[2] seq_out 0x00000000,2 # 00000000000000000000000000000000
+[2] seq_out 0x80008000,2 # 10000000000000001000000000000000
+[2] seq_out 0x80018001,2 # 10000000000000011000000000000001
+[2] seq_out 0x80028002,2 # 10000000000000101000000000000010
+[2] seq_out 0x80038003,2 # 10000000000000111000000000000011
+[2] seq_out 0x80048004,2 # 10000000000001001000000000000100
+[2] seq_out 0x80058005,2 # 10000000000001011000000000000101
+[2] seq_out 0x80068006,2 # 10000000000001101000000000000110
+[2] seq_out 0x80078007,2 # 10000000000001111000000000000111
+[2] seq_out 0x80088008,2 # 10000000000010001000000000001000
+[2] seq_out 0x80098009,2 # 10000000000010011000000000001001
+[2] seq_out 0x800A800A,2 # 10000000000010101000000000001010
+[2] seq_out 0x800B800B,2 # 10000000000010111000000000001011
+[2] seq_out 0x800C800C,2 # 10000000000011001000000000001100
+[2] seq_out 0x800D800D,2 # 10000000000011011000000000001101
+[2] seq_out 0x800E800E,2 # 10000000000011101000000000001110
+[2] seq_out 0x800F800F,2 # 10000000000011111000000000001111
+[2] seq_out 0x80108010,2 # 10000000000100001000000000010000
+[2] seq_out 0x80118011,2 # 10000000000100011000000000010001
+[2] seq_out 0x80128012,2 # 10000000000100101000000000010010
+[2] seq_out 0x80138013,2 # 10000000000100111000000000010011
+[2] seq_out 0x80148014,2 # 10000000000101001000000000010100
+[2] seq_out 0x80158015,2 # 10000000000101011000000000010101
+[2] seq_out 0x80168016,2 # 10000000000101101000000000010110
+[2] seq_out 0x80178017,2 # 10000000000101111000000000010111
+[2] seq_out 0x80188018,2 # 10000000000110001000000000011000
+[2] seq_out 0x80198019,2 # 10000000000110011000000000011001
+[2] seq_out 0x801A801A,2 # 10000000000110101000000000011010
+[2] seq_out 0x801B801B,2 # 10000000000110111000000000011011
+[2] seq_out 0x801C801C,2 # 10000000000111001000000000011100
+[2] seq_out 0x801D801D,2 # 10000000000111011000000000011101
+[2] seq_out 0x801E801E,2 # 10000000000111101000000000011110
+[2] seq_out 0x801F801F,2 # 10000000000111111000000000011111
+[2] seq_out 0x00000000,18 # 00000000000000000000000000000000
# digIn=2
[4] seq_out 0x00000000,301 # cycle 0-301: padding on 'mw_1'
-[6] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
+[5] seq_out 0x00000000,301 # cycle 0-301: padding on 'flux_0'
jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/printOpenqlVersion.py b/examples/CC_examples/printOpenqlVersion.py
new file mode 100644
index 0000000000..1c9ef6487f
--- /dev/null
+++ b/examples/CC_examples/printOpenqlVersion.py
@@ -0,0 +1,12 @@
+import openql.openql as ql
+from os.path import join, dirname, isfile
+
+print(ql.get_version())
+
+if 1:
+ output_dir = join(dirname(__file__), 'output')
+ ql.set_option('output_dir', output_dir)
+
+if 1:
+ print(ql.get_option('output_dir'))
+
diff --git a/examples/CC_examples/syncStart.vq1asm b/examples/CC_examples/syncStart.vq1asm
new file mode 100644
index 0000000000..5c5e8d4c4e
--- /dev/null
+++ b/examples/CC_examples/syncStart.vq1asm
@@ -0,0 +1,3 @@
+mainLoop: seq_bar
+ seq_out 0x80010000,10 # trigger HDAWG & UHFQA
+ jmp @mainLoop # loop indefinitely
diff --git a/examples/CC_examples/uhfqc_calibration.vq1asm b/examples/CC_examples/uhfqc_calibration.vq1asm
new file mode 100644
index 0000000000..1dbe484a66
--- /dev/null
+++ b/examples/CC_examples/uhfqc_calibration.vq1asm
@@ -0,0 +1,30 @@
+# CC_BACKEND_VERSION 0.2.4
+# OPENQL_VERSION 0.8.0
+# Program: 'CW_RO_sequence'
+# Note: generated by OpenQL Central Controller backend
+#
+# synchronous start and latency compensation
+ add R63,1,R0 # R63 externally set by user, prevent 0 value which would wrap counter
+ seq_bar 20 # synchronization
+syncLoop: seq_out 0x00000000,1 # 20 ns delay
+ loop R0,@syncLoop #
+mainLoop: #
+### Kernel: 'k_main'
+## Bundle 0: start_cycle=1, duration_in_cycles=300:
+ # READOUT: measure(q0)
+ # slot=1, instrument='ro_1', group=0': signal='[dummy]'
+ # last bundle of kernel, will pad outputs to match durations
+ # slot=1, instrument='ro_1': lastStartCycle=0, start_cycle=1, slotDurationInCycles=300
+[0] seq_out 0x00000000,10
+[0] seq_out 0x03FF0000,1
+[1] seq_out 0x00000000,10
+[1] seq_out 0x03FF0000,1
+[2] seq_out 0x00000000,10
+[2] seq_out 0x03FF0000,1
+[4] seq_out 0x00000000,11
+[5] seq_out 0x00000000,11
+[6] seq_out 0x00000000,11
+[7] seq_out 0x00000000,11
+[8] seq_out 0x00000000,11
+
+ jmp @mainLoop
diff --git a/examples/Controlling a Transmock setup.ipynb b/examples/Controlling a Transmock setup.ipynb
new file mode 100644
index 0000000000..0d543459b2
--- /dev/null
+++ b/examples/Controlling a Transmock setup.ipynb
@@ -0,0 +1,1121 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Tutorial 2. Controlling a Transmock setup\n",
+ "\n",
+ "This tutorial covers a \"real\" usage example using the Transmock. We will go over all the aspects relevant in controlling an experiment using the mock transmon. \n",
+ "\n",
+ "The steps we will cover are \n",
+ "1. Initializing the setup\n",
+ "2. The device and qubit objects \n",
+ "3. Running basic measurements \n",
+ "4. Calibrating your setup \n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "NOTE: We recommend using PycQED from a console for actual use. \n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "toc-hr-collapsed": false
+ },
+ "source": [
+ "# 1. Initializing the setup \n",
+ "\n",
+ "Experiments in `PycQED` are run by starting an iPython kernel (console or notebook) in which we instantiate different instruments that we then interact with. \n",
+ "A session in one of these kernels typically lasts multiple days/weeks in the case of extended experiments. Before we can start runnning an experiment we start by running an initialization script. Such a script consists several steps. \n",
+ "\n",
+ "1. Importing the required modules. \n",
+ "2. Setting the datadirectory\n",
+ "3. Instantiating the instruments and (optionally) loading settings onto these instruments\n",
+ "\n",
+ "Normally the environment would be instantiated by importing from an external init script e.g.: `from my_init import *`. Here we explicitly put all the parts of the initialization script required to setup a 2 qubit mock experiment. Note that all the instruments being used are mock instruments. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## importing the required modules"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "Data directory set to: /Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/usr/local/lib/python3.7/site-packages/sklearn/externals/joblib/__init__.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.\n",
+ " warnings.warn(msg, category=DeprecationWarning)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Could not import msvcrt (used for detecting keystrokes)\n",
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "Data directory set to: /Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "Data directory set to: /Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "Data directory set to: /Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n",
+ "Data directory set to: /Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/data\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:No module named 'qisa_as'\n"
+ ]
+ }
+ ],
+ "source": [
+ "###############################################################################\n",
+ "# Import Statements\n",
+ "###############################################################################\n",
+ "\n",
+ "# Generic python imports \n",
+ "import os\n",
+ "import warnings\n",
+ "import openql\n",
+ "import datetime\n",
+ "import time\n",
+ "import pycqed as pq\n",
+ "import networkx as nx\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "from importlib import reload\n",
+ "\n",
+ "\n",
+ "\n",
+ "# generic PycQED/QCoDeS imports \n",
+ "from qcodes import station\n",
+ "from pycqed.measurement import measurement_control\n",
+ "\n",
+ "from pycqed.analysis_v2 import measurement_analysis as ma2\n",
+ "from pycqed.analysis import measurement_analysis as ma\n",
+ "\n",
+ "from pycqed.utilities import general as gen\n",
+ "import pycqed.analysis.analysis_toolbox as a_tools\n",
+ "\n",
+ "# Package for dependency graph based calibrations\n",
+ "from autodepgraph import AutoDepGraph_DAG\n",
+ "\n",
+ "\n",
+ "# Annoying warning:\n",
+ "os.environ['PYGSTI_BACKCOMPAT_WARNING'] = '0' # suppresses a warning in PyGSTi \n",
+ "\n",
+ "# Import instruments \n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects import mock_CCL_Transmon as mct\n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects.qubit_object import Qubit\n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects.CCL_Transmon import CCLight_Transmon\n",
+ "from pycqed.instrument_drivers.meta_instrument.LutMans.ro_lutman import UHFQC_RO_LutMan\n",
+ "from pycqed.instrument_drivers.physical_instruments.QuTech_VSM_Module import Dummy_QuTechVSMModule\n",
+ "from pycqed.instrument_drivers.physical_instruments.QuTech_CCL import dummy_CCL\n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects.CC_transmon import CBox_v3_driven_transmon, QWG_driven_transmon\n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects.Tektronix_driven_transmon import Tektronix_driven_transmon\n",
+ "from pycqed.instrument_drivers.meta_instrument.qubit_objects.QuDev_transmon import QuDev_transmon\n",
+ "\n",
+ "\n",
+ "from pycqed.instrument_drivers.physical_instruments.QuTech_Duplexer import Dummy_Duplexer\n",
+ "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.UHFQuantumController as uhf\n",
+ "# from pycqed.instrument_drivers.physical_instruments.QuTech_SPI_S4g_FluxCurrent \\\n",
+ "# import QuTech_SPI_S4g_FluxCurrent\n",
+ "from pycqed.instrument_drivers.meta_instrument.LutMans import mw_lutman as mwl\n",
+ "import pycqed.instrument_drivers.virtual_instruments.virtual_MW_source as vmw\n",
+ "import pycqed.instrument_drivers.virtual_instruments.virtual_SignalHound as sh\n",
+ "import pycqed.instrument_drivers.physical_instruments.ZurichInstruments.ZI_HDAWG8 as HDAWG\n",
+ "import pycqed.instrument_drivers.virtual_instruments.virtual_SPI_S4g_FluxCurrent as flx\n",
+ "import pycqed.instrument_drivers.virtual_instruments.virtual_VNA as VNA\n",
+ "import pycqed.instrument_drivers.meta_instrument.device_dependency_graphs as DDG\n",
+ "import pycqed.instrument_drivers.meta_instrument.device_object_CCL as do\n",
+ "from pycqed.instrument_drivers.meta_instrument.Resonator import resonator\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Setting the datadirectory"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# test_datadir = os.path.join(pq.__path__[0], 'data') \n",
+ "test_datadir = os.path.join(pq.__path__[0], 'tests', 'test_output') # we use a test datadirectory for our examples\n",
+ "a_tools.datadir = test_datadir\n",
+ "\n",
+ "\n",
+ "timestamp = None # '20190719_164604' \n",
+ "# the timestamp variable is used below to load settings from previous experiments onto instruments"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Instantiating the instruments"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "###############################################################################\n",
+ "# MC and monitor\n",
+ "###############################################################################\n",
+ "station = station.Station()\n",
+ "# The measurement control is used to control experiments (see tutorial 1.)\n",
+ "MC = measurement_control.MeasurementControl(\n",
+ " 'MC', live_plot_enabled=True, verbose=True)\n",
+ "MC.station = station\n",
+ "station.add_component(MC)\n",
+ "MC.live_plot_enabled(True)\n",
+ "\n",
+ "# Required to set it to the testing datadir\n",
+ "MC.datadir(a_tools.datadir)\n",
+ "\n",
+ "\n",
+ "###############################################################################\n",
+ "# nested MC\n",
+ "###############################################################################\n",
+ "nested_MC = measurement_control.MeasurementControl(\n",
+ " 'nested_MC', live_plot_enabled=True, verbose=True)\n",
+ "nested_MC.station = station\n",
+ "station.add_component(nested_MC)\n",
+ "nested_MC.datadir(a_tools.datadir)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Connected to: None MW1 (serial:None, firmware:None) in 0.00s\n",
+ "Connected to: None MW2 (serial:None, firmware:None) in 0.00s\n",
+ "Connected to: None MW3 (serial:None, firmware:None) in 0.00s\n",
+ "Initialized SignalHound in 0.00s\n",
+ "Setting debug level to 0\n",
+ "Connected to: ZurichInstruments UHFQA (serial:dev2109, firmware:99999) in 0.68s\n",
+ "Connected to: None None (serial:None, firmware:None) in 0.00s\n",
+ "Connected to: VSM (serial:Dummy, firmware:) in 0.02s\n",
+ "Setting debug level to 0\n",
+ "Connected to: ZurichInstruments HDAWG8 (serial:dev8026, firmware:99999) in 0.44s\n",
+ "Connected to: in 0.01 s\n",
+ "Connected to: in 0.01 s\n",
+ "Connected to: in 0.01 s\n"
+ ]
+ }
+ ],
+ "source": [
+ "###############################################################################\n",
+ "# Instruments\n",
+ "###############################################################################\n",
+ "# Fluxcurrent\n",
+ "fluxcurrent = flx.virtual_SPI_S4g_FluxCurrent(\n",
+ " 'fluxcurrent',\n",
+ " channel_map={\n",
+ " 'FBL_Q1': (0, 0),\n",
+ " 'FBL_Q2': (0, 1),\n",
+ " })\n",
+ "fluxcurrent.FBL_Q1(0)\n",
+ "fluxcurrent.FBL_Q2(0)\n",
+ "station.add_component(fluxcurrent)\n",
+ "\n",
+ "###############################################################################\n",
+ "# VNA\n",
+ "VNA = VNA.virtual_ZNB20('VNA')\n",
+ "station.add_component(VNA)\n",
+ "\n",
+ "###############################################################################\n",
+ "# MW sources\n",
+ "MW1 = vmw.VirtualMWsource('MW1')\n",
+ "MW2 = vmw.VirtualMWsource('MW2')\n",
+ "MW3 = vmw.VirtualMWsource('MW3')\n",
+ "\n",
+ "###############################################################################\n",
+ "# SignalHound\n",
+ "SH = sh.virtual_SignalHound_USB_SA124B('SH')\n",
+ "\n",
+ "###############################################################################\n",
+ "# UHFQC\n",
+ "UHFQC = uhf.UHFQC(name='UHFQC', server='emulator',\n",
+ " device='dev2109', interface='1GbE')\n",
+ "\n",
+ "###############################################################################\n",
+ "# CCL\n",
+ "CCL = dummy_CCL('CCL')\n",
+ "\n",
+ "###############################################################################\n",
+ "# VSM\n",
+ "VSM = Dummy_QuTechVSMModule('VSM')\n",
+ "\n",
+ "###############################################################################\n",
+ "# AWG\n",
+ "AWG = HDAWG.ZI_HDAWG8(name='DummyAWG8', server='emulator', num_codewords=32, device='dev8026', interface='1GbE')\n",
+ "\n",
+ "\n",
+ "AWG8_VSM_MW_LutMan = mwl.AWG8_VSM_MW_LutMan('MW_LutMan_VSM')\n",
+ "AWG8_VSM_MW_LutMan.AWG(AWG.name)\n",
+ "AWG8_VSM_MW_LutMan.channel_GI(1)\n",
+ "AWG8_VSM_MW_LutMan.channel_GQ(2)\n",
+ "AWG8_VSM_MW_LutMan.channel_DI(3)\n",
+ "AWG8_VSM_MW_LutMan.channel_DQ(4)\n",
+ "AWG8_VSM_MW_LutMan.mw_modulation(100e6)\n",
+ "AWG8_VSM_MW_LutMan.sampling_rate(2.4e9)\n",
+ "\n",
+ "###############################################################################\n",
+ "# RO Lutman\n",
+ "ro_lutman = UHFQC_RO_LutMan(\n",
+ " 'RO_lutman', num_res=5, feedline_number=0)\n",
+ "ro_lutman.AWG(UHFQC.name)\n",
+ "\n",
+ "###############################################################################\n",
+ "# Qubit\n",
+ "Q1 = mct.Mock_CCLight_Transmon('Q1')\n",
+ "\n",
+ "# Assign instruments\n",
+ "Q1.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
+ "Q1.instr_LO_ro(MW1.name)\n",
+ "Q1.instr_LO_mw(MW2.name)\n",
+ "Q1.instr_spec_source(MW3.name)\n",
+ "\n",
+ "Q1.instr_acquisition(UHFQC.name)\n",
+ "Q1.instr_VSM(VSM.name)\n",
+ "Q1.instr_CC(CCL.name)\n",
+ "Q1.instr_LutMan_RO(ro_lutman.name)\n",
+ "Q1.instr_MC(MC.name)\n",
+ "Q1.instr_nested_MC(nested_MC.name)\n",
+ "Q1.instr_FluxCtrl(fluxcurrent.name)\n",
+ "Q1.instr_SH(SH.name)\n",
+ "Q1.cfg_with_vsm(False)\n",
+ "Q1.done_spectroscopy = False\n",
+ "\n",
+ "config_fn = os.path.join(\n",
+ " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
+ "Q1.cfg_openql_platform_fn(config_fn)\n",
+ "# QL.dep_graph()\n",
+ "station.add_component(Q1)\n",
+ "# Does not set any initial parameters, it should work from scratch\n",
+ "# Qubit\n",
+ "Q2 = mct.Mock_CCLight_Transmon('Q2')\n",
+ "Q2_parameters = {'mock_Ec': 243e6,\n",
+ " 'mock_Ej1': 8.348e9,\n",
+ " 'mock_Ej2': 8.246e9,\n",
+ " 'mock_fl_dc_I_per_phi0': {'FBL_Q1': 2, 'FBL_Q2': 20.3153e-3},\n",
+ " # 'mock_fl_dc_V0'\n",
+ " 'mock_fl_dc_ch': 'FBL_Q2',\n",
+ " 'mock_freq_res_bare': 7.35e9,\n",
+ " 'mock_freq_test_res': 7.73e9,\n",
+ " 'mock_sweetspot_phi_over_phi0': 0,\n",
+ " 'mock_Qe': 19000,\n",
+ " 'mock_Q': 15000,\n",
+ " 'mock_slope': 0}\n",
+ "\n",
+ "\n",
+ "for parameter, value in Q2_parameters.items():\n",
+ " Q2.parameters[parameter](value)\n",
+ "# Assign instruments\n",
+ "Q2.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
+ "Q2.instr_LO_ro(MW1.name)\n",
+ "Q2.instr_LO_mw(MW2.name)\n",
+ "Q2.instr_spec_source(MW3.name)\n",
+ "\n",
+ "Q2.instr_acquisition(UHFQC.name)\n",
+ "Q2.instr_VSM(VSM.name)\n",
+ "Q2.instr_CC(CCL.name)\n",
+ "Q2.instr_LutMan_RO(ro_lutman.name)\n",
+ "Q2.instr_MC(MC.name)\n",
+ "Q2.instr_nested_MC(nested_MC.name)\n",
+ "Q2.instr_FluxCtrl(fluxcurrent.name)\n",
+ "Q2.instr_SH(SH.name)\n",
+ "\n",
+ "\n",
+ "config_fn = os.path.join(\n",
+ " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
+ "Q2.cfg_openql_platform_fn(config_fn)\n",
+ "# QR.dep_graph()\n",
+ "station.add_component(Q2)\n",
+ "\n",
+ "fakequbit = mct.Mock_CCLight_Transmon('fakequbit')\n",
+ "\n",
+ "# Assign instruments\n",
+ "fakequbit.instr_LutMan_MW(AWG8_VSM_MW_LutMan.name)\n",
+ "fakequbit.instr_LO_ro(MW1.name)\n",
+ "fakequbit.instr_LO_mw(MW2.name)\n",
+ "fakequbit.instr_spec_source(MW3.name)\n",
+ "\n",
+ "fakequbit.instr_acquisition(UHFQC.name)\n",
+ "fakequbit.instr_VSM(VSM.name)\n",
+ "fakequbit.instr_CC(CCL.name)\n",
+ "fakequbit.instr_LutMan_RO(ro_lutman.name)\n",
+ "fakequbit.instr_MC(MC.name)\n",
+ "fakequbit.instr_nested_MC(nested_MC.name)\n",
+ "fakequbit.instr_FluxCtrl(fluxcurrent.name)\n",
+ "fakequbit.instr_SH(SH.name)\n",
+ "fakequbit.cfg_with_vsm(False)\n",
+ "\n",
+ "config_fn = os.path.join(\n",
+ " pq.__path__[0], 'tests', 'openql', 'test_cfg_CCL.json')\n",
+ "fakequbit.cfg_openql_platform_fn(config_fn)\n",
+ "# fakequbit.dep_graph()\n",
+ "station.add_component(fakequbit)\n",
+ "##############################################################################\n",
+ "# Device\n",
+ "Mock_Octobox = do.DeviceCCL(name='Mock_Octobox')\n",
+ "Mock_Octobox.qubits(['Q1', 'Q2', 'fakequbit'])\n",
+ "\n",
+ "Q1.instr_device(Mock_Octobox.name)\n",
+ "Q2.instr_device(Mock_Octobox.name)\n",
+ "fakequbit.instr_device(Mock_Octobox.name)\n",
+ "resQ1 = resonator('2', freq=7.5e9)\n",
+ "resQ2 = resonator('1', freq=7.35e9)\n",
+ "rest1 = resonator('t1', freq=7.73e9, type='test_resonator')\n",
+ "rest2 = resonator('t2', freq=7.8e9, type='test_resonator')\n",
+ "\n",
+ "# Mock_Octobox.expected_resonators = [resQR, resQL, rest1, rest2]\n",
+ "###############################################################################\n",
+ "# DepGraph\n",
+ "Qubits = [Q1, Q2, fakequbit]\n",
+ "# some_file.py\n",
+ "#dag = DDG.octobox_dep_graph(name='Octobox', device=Mock_Octobox)\n",
+ "# dag.create_dep_graph(Qubits)\n",
+ "# dag.set_all_node_states('needs calibration')\n",
+ "# dag.set_node_state('QL Drive Mixer Calibrations', 'good')\n",
+ "# dag.set_node_state('QR Drive Mixer Calibrations', 'good')\n",
+ "# dag.set_node_state('QL Readout Mixer Calibrations', 'good')\n",
+ "# dag.set_node_state('QR Readout Mixer Calibrations', 'good')\n",
+ "# ###############################################################################\n",
+ "# # Hacky stuff to make life easier\n",
+ "\n",
+ "# # Room temp:\n",
+ "Q1.freq_qubit(5.85e9)\n",
+ "Q2.freq_qubit(5.48e9)\n",
+ "\n",
+ "for Q in Qubits:\n",
+ " # Q.ro_acq_averages(32768*4)\n",
+ " Q.ro_freq(7.5e9)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pycqed.instrument_drivers.virtual_instruments import instrument_monitor as im \n",
+ "IM = im.InstrumentMonitor('IM', station)\n",
+ "station.add_component(IM)\n",
+ "# Link the instrument monitor to the MC so that it gets updated in the loop\n",
+ "MC.instrument_monitor('IM')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "IM.update()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 2. Running an experiment on a mock transmon"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.ro_freq(6e9)\n",
+ "Q1.mw_freq_mod(100e6)\n",
+ "Q1.freq_res(6e9)\n",
+ "Q1.freq_res()\n",
+ "Q1.mock_freq_res_bare(7.58726e9)\n",
+ "Q1.mock_sweetspot_phi_over_phi0(0.0)\n",
+ "freq_res = Q1.calculate_mock_resonator_frequency()\n",
+ "Q1.freq_res(7.587e9)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2.1. Step 1, find the resonator"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.ro_acq_averages(1024)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "7587000000.0"
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.freq_res() # This is an unknown value right now "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: Resonator_scan_Q1\n",
+ "Sweep function: Heterodyne Frequency\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 7.9s \ttime left: 0.0s\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:qb_name is None. Old parameter values will not be retrieved.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "7588100000.0"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.find_resonator_frequency()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "7588100000.0"
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.freq_res() # <-- This variable got updated after our calibration "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## freq_restep 2, determine appropriate readout power"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: Resonator_power_scan_Q1\n",
+ "Sweep function 0: Heterodyne Frequency\n",
+ "Sweep function 1: None_Sweep\n",
+ "Detector function: Mock_Detector\n",
+ "Request timed out: ('callObj', 101, 0, b'\\x80\\x03}q\\x00(X\\x03\\x00\\x00\\x00objq\\x01cpyqtgraph.multiprocess.remoteproxy\\nunpickleObjectProxy\\nq\\x02(MCOKHXt\\x00\\x00\\x00>q\\x03)tq\\x04Rq\\x05X\\x04\\x00\\x00\\x00argsq\\x06]q\\x07X\\x04\\x00\\x00\\x00kwdsq\\x08}q\\tX\\n\\x00\\x00\\x00returnTypeq\\nX\\x04\\x00\\x00\\x00autoq\\x0bu.')\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ " File \"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py\", line 193, in _run_module_as_main\n",
+ " \"__main__\", mod_spec)\n",
+ " File \"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py\", line 85, in _run_code\n",
+ " exec(code, run_globals)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel_launcher.py\", line 16, in \n",
+ " app.launch_new_instance()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n",
+ " app.start()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/kernelapp.py\", line 563, in start\n",
+ " self.io_loop.start()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/platform/asyncio.py\", line 148, in start\n",
+ " self.asyncio_loop.run_forever()\n",
+ " File \"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py\", line 534, in run_forever\n",
+ " self._run_once()\n",
+ " File \"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py\", line 1771, in _run_once\n",
+ " handle._run()\n",
+ " File \"/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py\", line 88, in _run\n",
+ " self._context.run(self._callback, *self._args)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/ioloop.py\", line 690, in \n",
+ " lambda f: self._run_callback(functools.partial(callback, future))\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
+ " ret = callback()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/gen.py\", line 787, in inner\n",
+ " self.run()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/gen.py\", line 748, in run\n",
+ " yielded = self.gen.send(value)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 361, in process_one\n",
+ " yield gen.maybe_future(dispatch(*args))\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
+ " yielded = next(result)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n",
+ " yield gen.maybe_future(handler(stream, idents, msg))\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
+ " yielded = next(result)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/kernelbase.py\", line 541, in execute_request\n",
+ " user_expressions, allow_stdin,\n",
+ " File \"/usr/local/lib/python3.7/site-packages/tornado/gen.py\", line 209, in wrapper\n",
+ " yielded = next(result)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/ipkernel.py\", line 300, in do_execute\n",
+ " res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
+ " return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2855, in run_cell\n",
+ " raw_cell, store_history, silent, shell_futures)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 2881, in _run_cell\n",
+ " return runner(coro)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n",
+ " coro.send(None)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3058, in run_cell_async\n",
+ " interactivity=interactivity, compiler=compiler, result=result)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3249, in run_ast_nodes\n",
+ " if (await self.run_code(code, result, async_=asy)):\n",
+ " File \"/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py\", line 3326, in run_code\n",
+ " exec(code_obj, self.user_global_ns, self.user_ns)\n",
+ " File \"\", line 2, in \n",
+ " powers=np.linspace(-40, 0, 11))\n",
+ " File \"/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/pycqed/instrument_drivers/meta_instrument/qubit_objects/mock_CCL_Transmon.py\", line 415, in measure_resonator_power\n",
+ " MC.run('Resonator_power_scan'+self.msmt_suffix + label, mode='2D')\n",
+ " File \"/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/pycqed/measurement/measurement_control.py\", line 301, in run\n",
+ " self.measure_2D()\n",
+ " File \"/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/pycqed/measurement/measurement_control.py\", line 865, in measure_2D\n",
+ " self.tile_sweep_pts_for_2D()\n",
+ " File \"/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/pycqed/measurement/measurement_control.py\", line 852, in tile_sweep_pts_for_2D\n",
+ " self.initialize_plot_monitor_2D()\n",
+ " File \"/Users/adriaanrol/GitHubRepos/DiCarloLab_Repositories/PycQED_py3/pycqed/measurement/measurement_control.py\", line 1072, in initialize_plot_monitor_2D\n",
+ " self.secondary_QtPlot.clear()\n",
+ " File \"\", line 122, in clear\n",
+ " File \"/usr/local/lib/python3.7/site-packages/pyqtgraph/multiprocess/remoteproxy.py\", line 918, in __call__\n",
+ " return self._handler.callObj(obj=self, args=args, kwds=kwds, **opts)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/pyqtgraph/multiprocess/remoteproxy.py\", line 567, in callObj\n",
+ " return self.send(request='callObj', opts=dict(obj=obj, args=args, kwds=kwds), byteData=byteMsgs, **opts)\n",
+ " File \"/usr/local/lib/python3.7/site-packages/pyqtgraph/multiprocess/remoteproxy.py\", line 470, in send\n",
+ " return req.result()\n",
+ " File \"/usr/local/lib/python3.7/site-packages/pyqtgraph/multiprocess/remoteproxy.py\", line 643, in result\n",
+ " traceback.print_stack()\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " 100% completed \telapsed time: 14.8s \ttime left: 0.0sss\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.measure_resonator_power(freqs=np.arange(7.582e9, 7.592e9, .1e6), \n",
+ " powers=np.linspace(-40, 0, 11))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2.3. Step 3, Find the qubit "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.ro_pulse_amp_CW()\n",
+ "Q1.ro_pulse_amp_CW(.05) # If you change this to a value that is too large, the signal will disappear. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.ro_pulse_amp_CW(.05)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: mock_spectroscopy__Q1\n",
+ "Sweep function: Homodyne Frequency\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 32.3s \ttime left: 0.0ss\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:qb_name is None. Old parameter values will not be retrieved.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.find_frequency()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2.4. Measure a Rabi and determine pi-pulse amplitude"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.5"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.mw_channel_amp() # default value"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: mock_rabi_Q1\n",
+ "Sweep function: Channel Amplitude\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 2.5s \ttime left: 0.0s\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:Fit did not converge, varying phase.\n",
+ "WARNING:root:qb_name is None. Default value qb_name=\"qb\" is used. Old parameter values will not be retrieved.\n",
+ "WARNING:root:Fit did not converge, varying phase.\n",
+ "WARNING:root:qb_name is None. Default value qb_name=\"qb\" is used. Old parameter values will not be retrieved.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 23,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.calibrate_mw_pulse_amplitude_coarse()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The microwave channel amplitude automatically gets updated after calling a calibrate function:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.mock_mw_amp180(.63)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0.6216540473547181"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.mw_channel_amp()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 2.5. Determine qubit coherence"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### $T_1$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.T1(40e-6) # This is a guess, from here we can make use of the auto range in measure_T1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Q1.ro_soft_avg(10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: mock_T1_Q1\n",
+ "Sweep function: None_Sweep\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 17.4s \ttime left: 0.0ss\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:qb_name is None. Old parameter values will not be retrieved.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "2.506775693303182e-05"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.measure_T1()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.506775693303182e-05"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.T1()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### $T_2-Ramsey$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: mock_Ramsey_Q1\n",
+ "Sweep function: T2_star\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 15.9s \ttime left: 0.0ss\n",
+ "Measured detuning:-7.92e+04\n",
+ "Setting freq to: 5.853075728e+09, \n",
+ "\n",
+ "Starting measurement: mock_Ramsey_Q1\n",
+ "Sweep function: T2_star\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 2.5s \ttime left: 0.0s\n",
+ "Measured detuning:4.60e+03\n",
+ "Setting freq to: 5.853071126e+09, \n",
+ "\n",
+ "Starting measurement: mock_Ramsey_Q1\n",
+ "Sweep function: T2_star\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 2.6s \ttime left: 0.0s\n",
+ "Measured detuning:-2.54e+03\n",
+ "Setting freq to: 5.853073665e+09, \n",
+ "\n",
+ "Starting measurement: mock_Ramsey_Q1\n",
+ "Sweep function: T2_star\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 2.7s \ttime left: 0.0s\n",
+ "Measured detuning:-1.40e+03\n",
+ "Setting freq to: 5.853075068e+09, \n",
+ "\n",
+ "Starting measurement: mock_Ramsey_Q1\n",
+ "Sweep function: T2_star\n",
+ "Detector function: Mock_Detector\n",
+ " 100% completed \telapsed time: 2.6s \ttime left: 0.0s\n",
+ "Measured detuning:1.46e+03\n",
+ "Setting freq to: 5.853073610e+09, \n",
+ "\n",
+ "Breaking of measurement because of T2*\n",
+ "Converged to: 5.853073610e+09\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "5853073610.43251"
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.find_frequency(method='ramsey')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### $T_2-echo$"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: mock_echo_Q1\n",
+ "Sweep function: None_Sweep\n",
+ "Detector function: Mock_Detector\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:Artificial detuning is unknown. Defaults to 0 MHz. New qubit frequency might be incorrect.\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " 100% completed \telapsed time: 2.7s \ttime left: 0.0s\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "WARNING:root:qb_name is unknown. Setting previously measured value of the qubit frequency to 0. New qubit frequency might be incorrect.\n",
+ "WARNING:root:Fit did not converge, varying phase\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "4.5655793612408045e-05"
+ ]
+ },
+ "execution_count": 35,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Q1.T2_echo(30e-6) # This guess is used in the auto range function \n",
+ "Q1.measure_echo()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.7.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/examples/MeasurementControl - adaptive sampling use cases.ipynb b/examples/MeasurementControl - adaptive sampling use cases.ipynb
new file mode 100644
index 0000000000..dd73dbc313
--- /dev/null
+++ b/examples/MeasurementControl - adaptive sampling use cases.ipynb
@@ -0,0 +1,1722 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Tutorial: Measurement Control - adaptive sampling\n",
+ "\n",
+ "Author(s): Victor Negîrneac\n",
+ "\n",
+ "Last update: 2020-03-25\n",
+ "\n",
+ "This is an advanced tutorial that focuses on adaptive sampling. If you are new to `PycQED` measurements and mesurements flow control, take a look first at `PycQED_py3/examples/MeasurementControl.ipynb`. It covers the basics of measurement control, soft(ware) and hard(ware) measurements, etc.."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Contents covered in this notebook\n",
+ "We can mix `soft`(ware) and `hard`(ware) measurements but for simplicity this notebook focuses on the `soft` measurements. In the \"normal\" `soft` (vs \"adaptive\" `soft`) measurements `MC` is in charge of the measurement loop and consecutively sets and gets datapoints according to a **pre-determined** list of points, usually a rectangular-like regular grid (i.e. uniform sampling in each dimension).\n",
+ "\n",
+ "On the other hand, for an `adaptive` measurment the datapoints are determined dynamically during the measurement loop itself. Any optimization falls into this case. Furthermore, here we focus on `soft adaptive` measurements. (I would call `hard adaptive` a sampling algorithm running on an FPGA.)\n",
+ "\n",
+ "This tutorial is structured in the following way, a sampling problem is stated and a possible solution based on adaptive sampling is shown to highlight the available features. We will start with a few uniform sampling examples to showcase the advatages provided by the adaptive sampling approach."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Future reproducibility of this notebook\n",
+ "`PycQED` and its dependencies are a rapidly evolving repositories therefore this notebook might stop working properly with the latest packages at any moment in the future. In order to always be able to reproduce this notebook, below you can find the software versions used in this tutorial as well as the commit hash of `PycQED` at the moment of writing.\n",
+ "\n",
+ "#### NB: if you run the two cells below you will have to git reset the file to get the original output back"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "===============\n",
+ "GIT LAST COMMIT\n",
+ "===============\n",
+ "STDOUT:\n",
+ "commit edf41c022ac00dce2f68f396e3e468eee7023df6\n",
+ "Merge: e49bd23a 81629411\n",
+ "Author: caenrigen <31376402+caenrigen@users.noreply.github.com>\n",
+ "Date: Wed Mar 25 15:12:01 2020 +0100\n",
+ "\n",
+ " Merge remote-tracking branch 'origin/develop' into develop\n",
+ "\n",
+ "STDERROR:\n",
+ "None\n",
+ "\n",
+ "Python version: 3.7.6\n",
+ "iPython version: 7.12.0\n",
+ "Jupyter Lab version: 1.2.6\n"
+ ]
+ }
+ ],
+ "source": [
+ "from pycqed.utilities import git_utils as gu\n",
+ "import pycqed as pq\n",
+ "print_output = True\n",
+ "pycqed_path = pq.__path__[0]\n",
+ "#status_pycqed, _ = gu.git_status(repo_dir=pycqed_path, print_output=print_output)\n",
+ "last_commit_pycqed, _ = gu.git_get_last_commit(repo_dir=pycqed_path, author=None, print_output=print_output)\n",
+ "\n",
+ "from platform import python_version\n",
+ "python_v = python_version()\n",
+ "\n",
+ "ipython_v = !ipython --version\n",
+ "jupyterlab_v = !jupyter-lab --version\n",
+ "\n",
+ "print()\n",
+ "print(\"Python version: \", python_v)\n",
+ "print(\"iPython version: \", ipython_v[0])\n",
+ "print(\"Jupyter Lab version: \", jupyterlab_v[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "collapsed": true,
+ "jupyter": {
+ "outputs_hidden": true
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Package Version Location \n",
+ "------------------- -------------------- -------------------------------------------------------------------\n",
+ "adaptive 0.10.0 \n",
+ "appdirs 1.4.3 \n",
+ "applicationinsights 0.11.9 \n",
+ "appnope 0.1.0 \n",
+ "asteval 0.9.18 \n",
+ "atomicwrites 1.3.0 \n",
+ "attrs 19.3.0 \n",
+ "autodepgraph 0.3.4 \n",
+ "backcall 0.1.0 \n",
+ "black 19.10b0 \n",
+ "bleach 3.1.1 \n",
+ "certifi 2019.11.28 \n",
+ "chardet 3.0.4 \n",
+ "Click 7.0 \n",
+ "cma 2.7.0 \n",
+ "cycler 0.10.0 \n",
+ "Cython 0.29.15 \n",
+ "decorator 4.4.1 \n",
+ "defusedxml 0.6.0 \n",
+ "entrypoints 0.3 \n",
+ "flake8 3.7.9 \n",
+ "h5py 2.10.0 \n",
+ "hsluv 0.0.2 \n",
+ "idna 2.9 \n",
+ "importlib-metadata 1.5.0 \n",
+ "ipykernel 5.1.4 \n",
+ "ipython 7.12.0 \n",
+ "ipython-genutils 0.2.0 \n",
+ "ipywidgets 7.5.1 \n",
+ "jedi 0.16.0 \n",
+ "Jinja2 2.11.1 \n",
+ "joblib 0.14.1 \n",
+ "json5 0.9.0 \n",
+ "jsonschema 3.2.0 \n",
+ "jupyter-client 6.0.0 \n",
+ "jupyter-console 6.1.0 \n",
+ "jupyter-core 4.6.3 \n",
+ "jupyterlab 1.2.6 \n",
+ "jupyterlab-server 1.0.6 \n",
+ "jupyterthemes 0.20.0 \n",
+ "kiwisolver 1.1.0 \n",
+ "lesscpy 0.14.0 \n",
+ "lmfit 1.0.0 \n",
+ "MarkupSafe 1.1.1 \n",
+ "matplotlib 3.1.3 \n",
+ "mccabe 0.6.1 \n",
+ "mistune 0.8.4 \n",
+ "more-itertools 8.2.0 \n",
+ "nbconvert 5.6.1 \n",
+ "nbformat 5.0.4 \n",
+ "networkx 2.4 \n",
+ "notebook 6.0.3 \n",
+ "numpy 1.18.1 \n",
+ "packaging 20.1 \n",
+ "pandas 1.0.1 \n",
+ "pandocfilters 1.4.2 \n",
+ "parso 0.6.1 \n",
+ "pathspec 0.7.0 \n",
+ "pexpect 4.8.0 \n",
+ "pickleshare 0.7.5 \n",
+ "pip 20.0.2 \n",
+ "plotly 3.7.1 \n",
+ "pluggy 0.13.1 \n",
+ "ply 3.11 \n",
+ "prometheus-client 0.7.1 \n",
+ "prompt-toolkit 3.0.3 \n",
+ "ptyprocess 0.6.0 \n",
+ "py 1.8.1 \n",
+ "pyaml 19.12.0 \n",
+ "pycodestyle 2.5.0 \n",
+ "PycQED 0.1.0 /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3 \n",
+ "pycqed-scripts 0.1 /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_scripts\n",
+ "pyflakes 2.1.1 \n",
+ "Pygments 2.5.2 \n",
+ "pyGSTi 0.9.6 \n",
+ "pyparsing 2.4.6 \n",
+ "PyQt5 5.14.1 \n",
+ "PyQt5-sip 12.7.1 \n",
+ "pyqtgraph 0.11.0.dev0+g6c11805 /Users/Victor/Documents/ProjectsDev/pyqtgraph \n",
+ "pyrsistent 0.15.7 \n",
+ "pyserial 3.4 \n",
+ "pytest 5.3.5 \n",
+ "python-dateutil 2.8.1 \n",
+ "pytz 2019.3 \n",
+ "PyVISA 1.10.1 \n",
+ "PyYAML 5.3 \n",
+ "pyzmq 19.0.0 \n",
+ "qcodes 0.11.0 \n",
+ "qtconsole 4.6.0 \n",
+ "qutechopenql 0.8.0 \n",
+ "qutip 4.5.0 \n",
+ "regex 2020.2.20 \n",
+ "requests 2.23.0 \n",
+ "requirements-parser 0.2.0 \n",
+ "retrying 1.3.3 \n",
+ "ruamel.yaml 0.16.10 \n",
+ "ruamel.yaml.clib 0.2.0 \n",
+ "scikit-learn 0.22.1 \n",
+ "scikit-optimize 0.7.4 \n",
+ "scipy 1.4.1 \n",
+ "Send2Trash 1.5.0 \n",
+ "setuptools 45.2.0.post20200209 \n",
+ "six 1.14.0 \n",
+ "sortedcollections 1.1.2 \n",
+ "sortedcontainers 2.1.0 \n",
+ "spirack 0.2.0 \n",
+ "tabulate 0.8.6 \n",
+ "terminado 0.8.3 \n",
+ "testpath 0.4.4 \n",
+ "toml 0.10.0 \n",
+ "tornado 6.0.3 \n",
+ "tqdm 4.43.0 \n",
+ "traitlets 4.3.3 \n",
+ "typed-ast 1.4.1 \n",
+ "uncertainties 3.1.2 \n",
+ "urllib3 1.25.8 \n",
+ "wcwidth 0.1.8 \n",
+ "webencodings 0.5.1 \n",
+ "websockets 8.1 \n",
+ "wheel 0.34.2 \n",
+ "widgetsnbextension 3.5.1 \n",
+ "wrapt 1.12.0 \n",
+ "zhinst 19.5.65305 \n",
+ "zipp 3.0.0 \n"
+ ]
+ }
+ ],
+ "source": [
+ "# In case you are not able to run this notebook you can setup a virtual env with the following pacakges\n",
+ "\n",
+ "!pip list"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Import required modules"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Data directory set to: /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Could not import msvcrt (used for detecting keystrokes)\n",
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Data directory set to: /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Data directory set to: /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Data directory set to: /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "/Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n",
+ "Data directory set to: /Users/Victor/Documents/ProjectsDev/DiCarloLab-Delft/PycQED_py3/data\n"
+ ]
+ }
+ ],
+ "source": [
+ "%matplotlib inline\n",
+ "import adaptive\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pycqed as pq\n",
+ "import numpy as np\n",
+ "from pycqed.measurement import measurement_control as mc\n",
+ "#from pycqed.measurement.sweep_functions import None_Sweep\n",
+ "#import pycqed.measurement.detector_functions as det\n",
+ "\n",
+ "from qcodes import station\n",
+ "station = station.Station()\n",
+ "\n",
+ "import pycqed.analysis_v2.measurement_analysis as ma2\n",
+ "\n",
+ "from importlib import reload\n",
+ "from pycqed.utilities.general import print_exception"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Creating an instance of `MeasurementControl`"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "MC = mc.MeasurementControl('MC',live_plot_enabled=True, verbose=True)\n",
+ "MC.station = station\n",
+ "station.add_component(MC)\n",
+ "\n",
+ "MC.persist_mode(True) # Turns on and off persistent plotting from previous run\n",
+ "MC.verbose(True)\n",
+ "MC.plotting_interval(.4)\n",
+ "MC.live_plot_enabled(True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Create instruments used in the experiment \n",
+ "We will use a dummy instrument behaving like a Chevron measurement"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'dummy_chevron'"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "import pycqed.instrument_drivers.physical_instruments.dummy_instruments as di\n",
+ "reload(di)\n",
+ "\n",
+ "intr_name = \"dummy_chevron\"\n",
+ "if intr_name in station.components.keys():\n",
+ " # Reset instr if it exists from previously running this cell\n",
+ " station.close_and_remove_instrument(intr_name)\n",
+ " del dummy_chevron\n",
+ " \n",
+ "dummy_chevron = di.DummyChevronAlignmentParHolder(intr_name)\n",
+ "station.add_component(dummy_chevron)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## **Problem:** How to observe the features of a 1D function with the minimum number of sampling points?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Simple 1D uniform sweep"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Starting measurement: 1D uniform\n",
+ "Sweep function: amp\n",
+ "Detector function: frac_excited\n",
+ " 100% completed \telapsed time: 0.5s \ttime left: 0.0s\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "