boulder-opal-scale-up-sdk 1.0.3__py3-none-any.whl → 1.0.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. {boulder_opal_scale_up_sdk-1.0.3.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/METADATA +1 -1
  2. {boulder_opal_scale_up_sdk-1.0.3.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/RECORD +38 -33
  3. boulderopalscaleupsdk/common/dtypes.py +12 -1
  4. boulderopalscaleupsdk/device/__init__.py +0 -7
  5. boulderopalscaleupsdk/device/config_loader.py +1 -0
  6. boulderopalscaleupsdk/device/controller/qblox.py +129 -0
  7. boulderopalscaleupsdk/device/defcal.py +5 -44
  8. boulderopalscaleupsdk/device/device.py +41 -3
  9. boulderopalscaleupsdk/device/processor/__init__.py +0 -2
  10. boulderopalscaleupsdk/device/processor/common.py +1 -6
  11. boulderopalscaleupsdk/device/processor/superconducting_processor.py +11 -4
  12. boulderopalscaleupsdk/experiments/__init__.py +16 -2
  13. boulderopalscaleupsdk/experiments/chi01_scan.py +10 -9
  14. boulderopalscaleupsdk/experiments/common.py +0 -16
  15. boulderopalscaleupsdk/experiments/power_rabi.py +13 -10
  16. boulderopalscaleupsdk/experiments/power_rabi_ef.py +66 -0
  17. boulderopalscaleupsdk/experiments/ramsey.py +13 -12
  18. boulderopalscaleupsdk/experiments/readout_classifier_calibration.py +22 -6
  19. boulderopalscaleupsdk/experiments/resonator_spectroscopy.py +11 -11
  20. boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_bias.py +13 -13
  21. boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_power.py +12 -12
  22. boulderopalscaleupsdk/experiments/t1.py +8 -16
  23. boulderopalscaleupsdk/experiments/t2.py +9 -8
  24. boulderopalscaleupsdk/experiments/t2_echo.py +49 -0
  25. boulderopalscaleupsdk/experiments/transmon_anharmonicity.py +16 -17
  26. boulderopalscaleupsdk/experiments/transmon_spectroscopy.py +10 -10
  27. boulderopalscaleupsdk/experiments/waveforms.py +63 -0
  28. boulderopalscaleupsdk/plotting/dtypes.py +1 -0
  29. boulderopalscaleupsdk/protobuf/v1/device_pb2.py +20 -20
  30. boulderopalscaleupsdk/protobuf/v1/device_pb2.pyi +4 -2
  31. boulderopalscaleupsdk/routines/__init__.py +16 -1
  32. boulderopalscaleupsdk/routines/common.py +13 -0
  33. boulderopalscaleupsdk/routines/resonator_mapping.py +16 -0
  34. boulderopalscaleupsdk/routines/transmon_discovery.py +45 -0
  35. boulderopalscaleupsdk/routines/transmon_retuning.py +31 -0
  36. boulderopalscaleupsdk/stubs/maps.py +11 -2
  37. {boulder_opal_scale_up_sdk-1.0.3.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/LICENSE +0 -0
  38. {boulder_opal_scale_up_sdk-1.0.3.dist-info → boulder_opal_scale_up_sdk-1.0.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,63 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from dataclasses import replace
15
+ from typing import Annotated, Literal, Protocol, TypeVar
16
+
17
+ from pydantic import Discriminator
18
+ from pydantic.dataclasses import dataclass
19
+
20
+
21
+ class _Waveform(Protocol): # pragma: no cover
22
+ duration_ns: int
23
+ amplitude: float
24
+
25
+
26
+ @dataclass
27
+ class ConstantWaveform(_Waveform): # pragma: no cover
28
+ duration_ns: int
29
+ amplitude: float
30
+ waveform_type: Literal["Constant"] = "Constant"
31
+
32
+
33
+ @dataclass
34
+ class GaussianWaveform(_Waveform): # pragma: no cover
35
+ duration_ns: int
36
+ amplitude: float
37
+ sigma: float
38
+ waveform_type: Literal["Gaussian"] = "Gaussian"
39
+
40
+
41
+ @dataclass
42
+ class DragCosineWaveform(_Waveform): # pragma: no cover
43
+ duration_ns: int
44
+ amplitude: float
45
+ drag: float
46
+ buffer_ns: int
47
+ center: float
48
+ waveform_type: Literal["DragCosineWaveform"] = "DragCosineWaveform"
49
+
50
+
51
+ Waveform = Annotated[
52
+ ConstantWaveform | GaussianWaveform | DragCosineWaveform,
53
+ Discriminator("waveform_type"),
54
+ ]
55
+
56
+ T = TypeVar("T", bound=Waveform)
57
+
58
+
59
+ def update_amplitude(waveform: T, amplitude: float) -> T:
60
+ """
61
+ Update the amplitude of a waveform.
62
+ """
63
+ return replace(waveform, amplitude=amplitude)
@@ -71,6 +71,7 @@ class PlotConfig(BaseModel):
71
71
  model_config = ConfigDict(extra="forbid")
72
72
 
73
73
  title: str
74
+ subtitle: str | None = None
74
75
 
75
76
  x_label: str
76
77
  y_label: str
@@ -16,7 +16,7 @@ from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2
16
16
  from google.protobuf import struct_pb2 as google_dot_protobuf_dot_struct__pb2
17
17
 
18
18
 
19
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.boulderopalscaleupsdk/protobuf/v1/device.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n\x14GetJobSummaryRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"Z\n\x15GetJobSummaryResponse\x12\x41\n\x10job_summary_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0ejobSummaryData\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"D\n\x0eGetJobResponse\x12\x32\n\x08job_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x07jobData\"\x96\x01\n\x0fListJobsRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x19\n\x08job_name\x18\x02 \x01(\tR\x07jobName\x12\x12\n\x04page\x18\x03 \x01(\x05R\x04page\x12\x14\n\x05limit\x18\x04 \x01(\x05R\x05limit\x12\x1d\n\nsort_order\x18\x05 \x01(\x05R\tsortOrder\"?\n\x10ListJobsResponse\x12+\n\x04jobs\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x04jobs\"\x85\x01\n\rCreateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x38\n\x0b\x64\x65vice_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\ndeviceData\"$\n\x0e\x43reateResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"]\n\x0b\x43opyRequest\x12(\n\x10\x66rom_device_name\x18\x01 \x01(\tR\x0e\x66romDeviceName\x12$\n\x0eto_device_name\x18\x02 \x01(\tR\x0ctoDeviceName\"\"\n\x0c\x43opyResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\x0eGetDataRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"\x93\x01\n\x0fGetDataResponse\x12>\n\x0eprocessor_data\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"\x8b\x01\n\rUpdateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\"\x92\x01\n\x0eUpdateResponse\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"K\n\rDeleteRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"$\n\x0e\x44\x65leteResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"5\n\x12GetMetadataRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\"J\n\x13GetMetadataResponse\x12\x33\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\"\x1e\n\x1cGetAllDevicesMetadataRequest\"V\n\x1dGetAllDevicesMetadataResponse\x12\x35\n\tmetadatas\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\tmetadatas2\xb0\x0c\n\x14\x44\x65viceManagerService\x12\x8b\x01\n\x06\x43reate\x12\x30.boulderopalscaleupsdk.protobuf.v1.CreateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.CreateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/create:\x01*\x12\x83\x01\n\x04\x43opy\x12..boulderopalscaleupsdk.protobuf.v1.CopyRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.CopyResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/copy:\x01*\x12\x97\x01\n\x07GetData\x12\x31.boulderopalscaleupsdk.protobuf.v1.GetDataRequest\x1a\x32.boulderopalscaleupsdk.protobuf.v1.GetDataResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_device_data:\x01*\x12\x8b\x01\n\x06Update\x12\x30.boulderopalscaleupsdk.protobuf.v1.UpdateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UpdateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/update:\x01*\x12\x8b\x01\n\x06\x44\x65lete\x12\x30.boulderopalscaleupsdk.protobuf.v1.DeleteRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.DeleteResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/delete:\x01*\x12\x94\x01\n\x08ListJobs\x12\x32.boulderopalscaleupsdk.protobuf.v1.ListJobsRequest\x1a\x33.boulderopalscaleupsdk.protobuf.v1.ListJobsResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x14/v1/device/list_jobs:\x01*\x12\x8c\x01\n\x06GetJob\x12\x30.boulderopalscaleupsdk.protobuf.v1.GetJobRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.GetJobResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\"\x12/v1/device/get_job:\x01*\x12\xa9\x01\n\rGetJobSummary\x12\x37.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryRequest\x1a\x38.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_job_summary:\x01*\x12\xa7\x01\n\x0bGetMetadata\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetMetadataRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetMetadataResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/device/get_device_metadata:\x01*\x12\xd1\x01\n\x15GetAllDevicesMetadata\x12?.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataRequest\x1a@.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataResponse\"5\x82\xd3\xe4\x93\x02/\"*/v1/device/get_all_devices_metadata_by_org:\x01*B\xaa\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\x0b\x44\x65viceProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
19
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n.boulderopalscaleupsdk/protobuf/v1/device.proto\x12!boulderopalscaleupsdk.protobuf.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n\x14GetJobSummaryRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"Z\n\x15GetJobSummaryResponse\x12\x41\n\x10job_summary_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x0ejobSummaryData\"&\n\rGetJobRequest\x12\x15\n\x06job_id\x18\x01 \x01(\tR\x05jobId\"D\n\x0eGetJobResponse\x12\x32\n\x08job_data\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x07jobData\"\x96\x01\n\x0fListJobsRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x19\n\x08job_name\x18\x02 \x01(\tR\x07jobName\x12\x12\n\x04page\x18\x03 \x01(\x05R\x04page\x12\x14\n\x05limit\x18\x04 \x01(\x05R\x05limit\x12\x1d\n\nsort_order\x18\x05 \x01(\x05R\tsortOrder\"?\n\x10ListJobsResponse\x12+\n\x04jobs\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\x04jobs\"\x85\x01\n\rCreateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x38\n\x0b\x64\x65vice_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\ndeviceData\"$\n\x0e\x43reateResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"]\n\x0b\x43opyRequest\x12(\n\x10\x66rom_device_name\x18\x01 \x01(\tR\x0e\x66romDeviceName\x12$\n\x0eto_device_name\x18\x02 \x01(\tR\x0ctoDeviceName\"\"\n\x0c\x43opyResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\x0eGetDataRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"\xc6\x01\n\x0fGetDataResponse\x12>\n\x0eprocessor_data\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\x12\x31\n\x07\x64\x65\x66\x63\x61ls\x18\x04 \x03(\x0b\x32\x17.google.protobuf.StructR\x07\x64\x65\x66\x63\x61ls\"\x8b\x01\n\rUpdateRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\"\x92\x01\n\x0eUpdateResponse\x12>\n\x0eprocessor_data\x18\x03 \x01(\x0b\x32\x17.google.protobuf.StructR\rprocessorData\x12@\n\x0f\x63ontroller_data\x18\x04 \x01(\x0b\x32\x17.google.protobuf.StructR\x0e\x63ontrollerData\"K\n\rDeleteRequest\x12\x19\n\x08\x61pp_name\x18\x01 \x01(\tR\x07\x61ppName\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\"$\n\x0e\x44\x65leteResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"5\n\x12GetMetadataRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\"J\n\x13GetMetadataResponse\x12\x33\n\x08metadata\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x08metadata\"\x1e\n\x1cGetAllDevicesMetadataRequest\"V\n\x1dGetAllDevicesMetadataResponse\x12\x35\n\tmetadatas\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\tmetadatas2\xb0\x0c\n\x14\x44\x65viceManagerService\x12\x8b\x01\n\x06\x43reate\x12\x30.boulderopalscaleupsdk.protobuf.v1.CreateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.CreateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/create:\x01*\x12\x83\x01\n\x04\x43opy\x12..boulderopalscaleupsdk.protobuf.v1.CopyRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.CopyResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/copy:\x01*\x12\x97\x01\n\x07GetData\x12\x31.boulderopalscaleupsdk.protobuf.v1.GetDataRequest\x1a\x32.boulderopalscaleupsdk.protobuf.v1.GetDataResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_device_data:\x01*\x12\x8b\x01\n\x06Update\x12\x30.boulderopalscaleupsdk.protobuf.v1.UpdateRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UpdateResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/update:\x01*\x12\x8b\x01\n\x06\x44\x65lete\x12\x30.boulderopalscaleupsdk.protobuf.v1.DeleteRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.DeleteResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/delete:\x01*\x12\x94\x01\n\x08ListJobs\x12\x32.boulderopalscaleupsdk.protobuf.v1.ListJobsRequest\x1a\x33.boulderopalscaleupsdk.protobuf.v1.ListJobsResponse\"\x1f\x82\xd3\xe4\x93\x02\x19\"\x14/v1/device/list_jobs:\x01*\x12\x8c\x01\n\x06GetJob\x12\x30.boulderopalscaleupsdk.protobuf.v1.GetJobRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.GetJobResponse\"\x1d\x82\xd3\xe4\x93\x02\x17\"\x12/v1/device/get_job:\x01*\x12\xa9\x01\n\rGetJobSummary\x12\x37.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryRequest\x1a\x38.boulderopalscaleupsdk.protobuf.v1.GetJobSummaryResponse\"%\x82\xd3\xe4\x93\x02\x1f\"\x1a/v1/device/get_job_summary:\x01*\x12\xa7\x01\n\x0bGetMetadata\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetMetadataRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetMetadataResponse\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/device/get_device_metadata:\x01*\x12\xd1\x01\n\x15GetAllDevicesMetadata\x12?.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataRequest\x1a@.boulderopalscaleupsdk.protobuf.v1.GetAllDevicesMetadataResponse\"5\x82\xd3\xe4\x93\x02/\"*/v1/device/get_all_devices_metadata_by_org:\x01*B\xaa\x02\n%com.boulderopalscaleupsdk.protobuf.v1B\x0b\x44\x65viceProtoP\x01ZNgithub.com/qctrl/boulder-opal-scale-up/proto/boulderopalscaleupsdk/protobuf/v1\xa2\x02\x03\x42PX\xaa\x02!Boulderopalscaleupsdk.Protobuf.V1\xca\x02!Boulderopalscaleupsdk\\Protobuf\\V1\xe2\x02-Boulderopalscaleupsdk\\Protobuf\\V1\\GPBMetadata\xea\x02#Boulderopalscaleupsdk::Protobuf::V1b\x06proto3')
20
20
 
21
21
  _globals = globals()
22
22
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -67,23 +67,23 @@ if not _descriptor._USE_C_DESCRIPTORS:
67
67
  _globals['_GETDATAREQUEST']._serialized_start=917
68
68
  _globals['_GETDATAREQUEST']._serialized_end=993
69
69
  _globals['_GETDATARESPONSE']._serialized_start=996
70
- _globals['_GETDATARESPONSE']._serialized_end=1143
71
- _globals['_UPDATEREQUEST']._serialized_start=1146
72
- _globals['_UPDATEREQUEST']._serialized_end=1285
73
- _globals['_UPDATERESPONSE']._serialized_start=1288
74
- _globals['_UPDATERESPONSE']._serialized_end=1434
75
- _globals['_DELETEREQUEST']._serialized_start=1436
76
- _globals['_DELETEREQUEST']._serialized_end=1511
77
- _globals['_DELETERESPONSE']._serialized_start=1513
78
- _globals['_DELETERESPONSE']._serialized_end=1549
79
- _globals['_GETMETADATAREQUEST']._serialized_start=1551
80
- _globals['_GETMETADATAREQUEST']._serialized_end=1604
81
- _globals['_GETMETADATARESPONSE']._serialized_start=1606
82
- _globals['_GETMETADATARESPONSE']._serialized_end=1680
83
- _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_start=1682
84
- _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1712
85
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1714
86
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1800
87
- _globals['_DEVICEMANAGERSERVICE']._serialized_start=1803
88
- _globals['_DEVICEMANAGERSERVICE']._serialized_end=3387
70
+ _globals['_GETDATARESPONSE']._serialized_end=1194
71
+ _globals['_UPDATEREQUEST']._serialized_start=1197
72
+ _globals['_UPDATEREQUEST']._serialized_end=1336
73
+ _globals['_UPDATERESPONSE']._serialized_start=1339
74
+ _globals['_UPDATERESPONSE']._serialized_end=1485
75
+ _globals['_DELETEREQUEST']._serialized_start=1487
76
+ _globals['_DELETEREQUEST']._serialized_end=1562
77
+ _globals['_DELETERESPONSE']._serialized_start=1564
78
+ _globals['_DELETERESPONSE']._serialized_end=1600
79
+ _globals['_GETMETADATAREQUEST']._serialized_start=1602
80
+ _globals['_GETMETADATAREQUEST']._serialized_end=1655
81
+ _globals['_GETMETADATARESPONSE']._serialized_start=1657
82
+ _globals['_GETMETADATARESPONSE']._serialized_end=1731
83
+ _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_start=1733
84
+ _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1763
85
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1765
86
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1851
87
+ _globals['_DEVICEMANAGERSERVICE']._serialized_start=1854
88
+ _globals['_DEVICEMANAGERSERVICE']._serialized_end=3438
89
89
  # @@protoc_insertion_point(module_scope)
@@ -90,12 +90,14 @@ class GetDataRequest(_message.Message):
90
90
  def __init__(self, app_name: _Optional[str] = ..., device_name: _Optional[str] = ...) -> None: ...
91
91
 
92
92
  class GetDataResponse(_message.Message):
93
- __slots__ = ("processor_data", "controller_data")
93
+ __slots__ = ("processor_data", "controller_data", "defcals")
94
94
  PROCESSOR_DATA_FIELD_NUMBER: _ClassVar[int]
95
95
  CONTROLLER_DATA_FIELD_NUMBER: _ClassVar[int]
96
+ DEFCALS_FIELD_NUMBER: _ClassVar[int]
96
97
  processor_data: _struct_pb2.Struct
97
98
  controller_data: _struct_pb2.Struct
98
- def __init__(self, processor_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., controller_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
99
+ defcals: _containers.RepeatedCompositeFieldContainer[_struct_pb2.Struct]
100
+ def __init__(self, processor_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., controller_data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., defcals: _Optional[_Iterable[_Union[_struct_pb2.Struct, _Mapping]]] = ...) -> None: ...
99
101
 
100
102
  class UpdateRequest(_message.Message):
101
103
  __slots__ = ("app_name", "device_name", "processor_data")
@@ -1,6 +1,21 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
1
14
  """Routine library."""
2
15
 
3
- __all__ = ["ResonatorMapping", "Routine"]
16
+ __all__ = ["ResonatorMapping", "Routine", "TransmonDiscovery", "TransmonRetuning"]
4
17
 
5
18
  from .common import Routine
6
19
  from .resonator_mapping import ResonatorMapping
20
+ from .transmon_discovery import TransmonDiscovery
21
+ from .transmon_retuning import TransmonRetuning
@@ -1,3 +1,16 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
1
14
  from pydantic import BaseModel, ConfigDict
2
15
 
3
16
 
@@ -1,3 +1,16 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
1
14
  from pydantic import PrivateAttr
2
15
 
3
16
  from boulderopalscaleupsdk.routines import Routine
@@ -12,8 +25,11 @@ class ResonatorMapping(Routine):
12
25
  feedlines : list[str] or None
13
26
  The feedlines to target in the routine.
14
27
  If not provided, all feedlines in the device will be targeted.
28
+ run_mixer_calibration: bool
29
+ Whether to run mixer calibrations before running each program. Defaults to True.
15
30
  """
16
31
 
17
32
  _routine_name: str = PrivateAttr("resonator_mapping")
18
33
 
19
34
  feedlines: list[str] | None = None
35
+ run_mixer_calibration: bool = True
@@ -0,0 +1,45 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+ from pydantic import PrivateAttr
15
+
16
+ from boulderopalscaleupsdk.experiments import ConstantWaveform
17
+
18
+ from .common import Routine
19
+
20
+
21
+ class TransmonDiscovery(Routine):
22
+ """
23
+ Parameters for running a transmon discovery routine.
24
+
25
+ Parameters
26
+ ----------
27
+ transmon : str
28
+ The reference for the transmon to target.
29
+ recycle_delay_ns : int, optional
30
+ The delay between consecutive shots, in nanoseconds. Defaults to 100,000.
31
+ readout_waveform : ConstantWaveform or None, optional
32
+ The readout pulse used in transmon spectroscopy.
33
+ Defaults to a constant waveform with a duration of 10,000 ns
34
+ and an amplitude of 0.01.
35
+ spectroscopy_waveform : ConstantWaveform or None, optional
36
+ The drive pulse used during transmon spectroscopy and transmon anharmonicity.
37
+ Defaults to a 10,000 ns pulse whose amplitude is defined by the logic of the experiment.
38
+ """
39
+
40
+ _routine_name: str = PrivateAttr("transmon_discovery")
41
+
42
+ transmon: str
43
+ recycle_delay_ns: int = 100_000
44
+ readout_waveform: ConstantWaveform | None = None
45
+ spectroscopy_waveform: ConstantWaveform | None = None
@@ -0,0 +1,31 @@
1
+ # Copyright 2025 Q-CTRL. All rights reserved.
2
+ #
3
+ # Licensed under the Q-CTRL Terms of service (the "License"). Unauthorized
4
+ # copying or use of this file, via any medium, is strictly prohibited.
5
+ # Proprietary and confidential. You may not use this file except in compliance
6
+ # with the License. You may obtain a copy of the License at
7
+ #
8
+ # https://q-ctrl.com/terms
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS. See the
12
+ # License for the specific language.
13
+
14
+
15
+ from pydantic import PrivateAttr
16
+
17
+ from boulderopalscaleupsdk.routines import Routine
18
+
19
+
20
+ class TransmonRetuning(Routine):
21
+ """
22
+ Parameters for running a transmon retuning routine.
23
+
24
+ Parameters
25
+ ----------
26
+ transmon : str
27
+ The reference for the transmon to target.
28
+ """
29
+
30
+ _routine_name: str = PrivateAttr("transmon_retuning")
31
+ transmon: str
@@ -1,9 +1,18 @@
1
1
  STUB_DATA_FILE_MAPPING: dict[str, list[str]] = {
2
- "feedline_discovery": [f"QM/Tuna-5/feedline_discovery/{n}.json" for n in range(1, 7)],
3
- "resonator_mapping": [f"QM/Tuna-5/resonator_mapping/{n}.json" for n in range(1, 17)],
2
+ # Experiments
3
+ "chi01_scan": ["QM/Tuna-5/chi01_scan.json"],
4
+ "coherence_t1": ["QM/Tuna-5/coherence_t1.json"],
5
+ "coherence_t2": ["QM/Tuna-5/coherence_t2.json"],
6
+ "readout_classifier_calibration": ["QM/Tuna-5/readout_classifier_calibration.json"],
4
7
  "resonator_spectroscopy": ["QM/Tuna-5/resonator_spectroscopy.json"],
5
8
  "resonator_spectroscopy_by_power": ["QM/Tuna-5/resonator_spectroscopy_by_power.json"],
6
9
  "resonator_spectroscopy_by_bias": ["QM/Tuna-5/resonator_spectroscopy_by_bias.json"],
7
10
  "ramsey": ["QM/Tuna-5/ramsey.json"],
8
11
  "power_rabi": ["QM/Tuna-5/power_rabi.json"],
12
+ "transmon_anharmonicity": ["QM/Tuna-5/transmon_anharmonicity.json"],
13
+ "transmon_spectroscopy": ["QM/Tuna-5/transmon_spectroscopy.json"],
14
+ # Routines
15
+ "feedline_discovery": [f"QM/Tuna-5/feedline_discovery/{n}.json" for n in range(1, 7)],
16
+ "resonator_mapping": [f"QM/Tuna-5/resonator_mapping/{n}.json" for n in range(1, 17)],
17
+ "transmon_discovery": [f"QM/Tuna-5/transmon_discovery/{n}.json" for n in range(1, 8)],
9
18
  }