boulder-opal-scale-up-sdk 1.0.6__tar.gz → 1.0.7__tar.gz

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 (83) hide show
  1. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/PKG-INFO +2 -2
  2. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/common/dtypes.py +29 -5
  3. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/controller/qblox.py +10 -2
  4. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/power_rabi.py +1 -1
  5. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/power_rabi_ef.py +1 -1
  6. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_bias.py +1 -1
  7. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/t2.py +1 -1
  8. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/waveforms.py +15 -0
  9. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/device_pb2.py +16 -16
  10. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/device_pb2.pyi +10 -4
  11. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/__init__.py +2 -0
  12. boulder_opal_scale_up_sdk-1.0.7/boulderopalscaleupsdk/routines/coupler_discovery.py +37 -0
  13. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/transmon_retuning.py +0 -4
  14. boulder_opal_scale_up_sdk-1.0.7/boulderopalscaleupsdk/solutions/__init__.py +22 -0
  15. boulder_opal_scale_up_sdk-1.0.7/boulderopalscaleupsdk/solutions/common.py +23 -0
  16. boulder_opal_scale_up_sdk-1.0.7/boulderopalscaleupsdk/solutions/placeholder_solution.py +28 -0
  17. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/third_party/quantum_machines/__init__.py +15 -0
  18. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/third_party/quantum_machines/config.py +0 -3
  19. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/pyproject.toml +2 -2
  20. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/LICENSE +0 -0
  21. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/README.md +0 -0
  22. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/__init__.py +0 -0
  23. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/agent/__init__.py +0 -0
  24. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/agent/worker.py +0 -0
  25. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/common/__init__.py +0 -0
  26. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/common/typeclasses.py +0 -0
  27. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/constants.py +0 -0
  28. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/__init__.py +0 -0
  29. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/common.py +0 -0
  30. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/config_loader.py +0 -0
  31. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/controller/__init__.py +0 -0
  32. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/controller/base.py +0 -0
  33. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/controller/quantum_machines.py +0 -0
  34. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/controller/resolver.py +0 -0
  35. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/defcal.py +0 -0
  36. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/device.py +0 -0
  37. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/processor/__init__.py +0 -0
  38. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/processor/common.py +0 -0
  39. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/device/processor/superconducting_processor.py +0 -0
  40. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/errors.py +0 -0
  41. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/__init__.py +0 -0
  42. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/chi01_scan.py +0 -0
  43. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/common.py +0 -0
  44. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/cz_spectroscopy_by_bias.py +0 -0
  45. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/drag_leakage_calibration.py +0 -0
  46. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/fine_amplitude_calibration.py +0 -0
  47. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/ramsey.py +0 -0
  48. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/ramsey_ef.py +0 -0
  49. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/readout_classifier.py +0 -0
  50. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/readout_optimization.py +0 -0
  51. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/resonator_spectroscopy.py +0 -0
  52. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/resonator_spectroscopy_by_power.py +0 -0
  53. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/t1.py +0 -0
  54. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/t2_echo.py +0 -0
  55. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/transmon_anharmonicity.py +0 -0
  56. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/transmon_spectroscopy.py +0 -0
  57. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/voltage_bias_fine_tune.py +0 -0
  58. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/experiments/zz_ramsey.py +0 -0
  59. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/grpc_interceptors/__init__.py +0 -0
  60. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/grpc_interceptors/auth.py +0 -0
  61. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/grpc_interceptors/error.py +0 -0
  62. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/plotting/__init__.py +0 -0
  63. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/plotting/dtypes.py +0 -0
  64. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/agent_pb2.py +0 -0
  65. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/agent_pb2.pyi +0 -0
  66. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/agent_pb2_grpc.py +0 -0
  67. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/device_pb2_grpc.py +0 -0
  68. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/job_pb2.py +0 -0
  69. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/job_pb2.pyi +0 -0
  70. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/job_pb2_grpc.py +0 -0
  71. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/task_pb2.py +0 -0
  72. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/task_pb2.pyi +0 -0
  73. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/protobuf/v1/task_pb2_grpc.py +0 -0
  74. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/py.typed +0 -0
  75. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/common.py +0 -0
  76. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/one_qubit_calibration.py +0 -0
  77. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/resonator_mapping.py +0 -0
  78. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/transmon_coherence.py +0 -0
  79. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/routines/transmon_discovery.py +0 -0
  80. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/third_party/__init__.py +0 -0
  81. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/third_party/quantum_machines/constants.py +0 -0
  82. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/utils/__init__.py +0 -0
  83. {boulder_opal_scale_up_sdk-1.0.6 → boulder_opal_scale_up_sdk-1.0.7}/boulderopalscaleupsdk/utils/serial_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: boulder-opal-scale-up-sdk
3
- Version: 1.0.6
3
+ Version: 1.0.7
4
4
  Summary: Q-CTRL Boulder Opal Scale Up Python SDK
5
5
  License: https://q-ctrl.com/terms
6
6
  Keywords: black opal,boulder opal,fire opal,nisq,open controls,q control,q ctrl,q-control,q-ctrl,qcontrol,qctrl,quantum,quantum algorithms,quantum circuits,quantum coding,quantum coding software,quantum computing,quantum control,quantum control software,quantum control theory,quantum engineering,quantum error correction,quantum firmware,quantum fundamentals,quantum sensing,qubit,qudit
@@ -33,7 +33,7 @@ Requires-Dist: pydantic (>=2.10.4,<3.0.0)
33
33
  Requires-Dist: pydantic-settings (>=2.7.0,<3.0.0)
34
34
  Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
35
35
  Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
36
- Requires-Dist: qm-qua (==1.2.1) ; extra == "quantum-machines"
36
+ Requires-Dist: qm-qua (==1.2.3) ; extra == "quantum-machines"
37
37
  Project-URL: Facebook, https://www.facebook.com/qctrl
38
38
  Project-URL: GitHub, https://github.com/qctrl
39
39
  Project-URL: Homepage, https://q-ctrl.com
@@ -33,7 +33,7 @@ from dateutil.parser import isoparse
33
33
  from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, PlainSerializer, TypeAdapter
34
34
  from pydantic.dataclasses import dataclass
35
35
 
36
- from boulderopalscaleupsdk.plotting.dtypes import Plot # noqa: TC001
36
+ from boulderopalscaleupsdk.plotting import Plot
37
37
 
38
38
  GrpcMetadata = list[tuple[str, str | bytes]]
39
39
 
@@ -179,6 +179,9 @@ class Duration:
179
179
  return bool(self._np_rep == other._np_rep)
180
180
  return False
181
181
 
182
+ def __str__(self):
183
+ return f"{self.value} {self.unit.value}"
184
+
182
185
  def convert(self, unit: TimeUnit) -> Duration | InvalidDurationConversion:
183
186
  val: np.float64 = self._np_rep / np.timedelta64(1, unit)
184
187
  if val.is_integer():
@@ -342,14 +345,17 @@ class JobSummary(BaseModel):
342
345
 
343
346
  class JobDataEntry(BaseModel):
344
347
  message: str
345
- created_at: ISO8601DatetimeUTCLike
346
- dt: str
347
- elapsed_time: str
348
- plots: list[Plot] = []
349
348
 
350
349
  class Config:
351
350
  extra = "allow"
352
351
 
352
+ def get_display_items(self) -> list[str | Plot]:
353
+ items: list[str | Plot] = [self.message]
354
+
355
+ if plots := getattr(self, "plots", []):
356
+ items.extend(TypeAdapter(Plot).validate_python(plot) for plot in plots)
357
+ return items
358
+
353
359
 
354
360
  class JobData(BaseModel):
355
361
  id: str
@@ -359,6 +365,24 @@ class JobData(BaseModel):
359
365
  device_name: str
360
366
  data: list[JobDataEntry]
361
367
 
368
+ def get_display_items(self) -> list[str | Plot]:
369
+ items: list[str | Plot] = []
370
+ message = "\n".join(
371
+ [
372
+ "JobData summary:",
373
+ f" - id: {self.id}",
374
+ f" - name: {self.name}",
375
+ f" - session_id: {self.session_id}",
376
+ f" - created_at: {self.created_at.isoformat()}",
377
+ f" - device_name: {self.device_name}",
378
+ ],
379
+ )
380
+ items.append(message)
381
+
382
+ for job_data_entry in self.data:
383
+ items.extend(job_data_entry.get_display_items())
384
+ return items
385
+
362
386
 
363
387
  DEFAULT_JOB_HISTORY_PAGE = 1
364
388
  DEFAULT_JOB_HISTORY_PAGE_SIZE = 10
@@ -54,7 +54,7 @@ from dataclasses import dataclass
54
54
  from typing import Annotated, Any, ClassVar, Literal, Self, TypeVar
55
55
 
56
56
  import numpy as np
57
- from pydantic import BaseModel, BeforeValidator, Field, PlainSerializer, model_validator
57
+ from pydantic import BaseModel, BeforeValidator, ConfigDict, Field, PlainSerializer, model_validator
58
58
 
59
59
  from boulderopalscaleupsdk.device.controller.base import Backend, ControllerType
60
60
 
@@ -323,7 +323,9 @@ class QBLOXControllerInfo(BaseModel): # pragma: no cover
323
323
  # Instrument management
324
324
  # ==================================================================================================
325
325
  class SequencerParams(BaseModel):
326
- nco_freq: float | None = Field(default=None)
326
+ model_config = ConfigDict(validate_assignment=True)
327
+
328
+ nco_freq: float | None = Field(default=None, ge=-500e6, le=500e6)
327
329
  gain_awg_path0: float | None = Field(default=None, ge=-1.0, le=1.0)
328
330
  offset_awg_path0: float | None = Field(default=None, ge=-1.0, le=1.0)
329
331
  gain_awg_path1: float | None = Field(default=None, ge=-1.0, le=1.0)
@@ -338,6 +340,8 @@ class SequencerParams(BaseModel):
338
340
 
339
341
 
340
342
  class QcmParams(BaseModel):
343
+ model_config = ConfigDict(validate_assignment=True)
344
+
341
345
  out0_offset: float | None = Field(default=None, ge=-2.5, le=2.5)
342
346
  out1_offset: float | None = Field(default=None, ge=-2.5, le=2.5)
343
347
  out2_offset: float | None = Field(default=None, ge=-2.5, le=2.5)
@@ -354,6 +358,8 @@ class QcmParams(BaseModel):
354
358
 
355
359
 
356
360
  class QcmRfParams(BaseModel):
361
+ model_config = ConfigDict(validate_assignment=True)
362
+
357
363
  out0_att: int | None = Field(default=None, ge=0, le=60, multiple_of=2)
358
364
  out1_att: int | None = Field(default=None, ge=0, le=60, multiple_of=2)
359
365
 
@@ -375,6 +381,8 @@ class QcmRfParams(BaseModel):
375
381
 
376
382
 
377
383
  class QrmRfParams(BaseModel):
384
+ model_config = ConfigDict(validate_assignment=True)
385
+
378
386
  out0_att: int | None = Field(default=None, ge=0, le=60, multiple_of=2)
379
387
 
380
388
  out0_in0_lo_freq: float | None = Field(default=None, gt=0)
@@ -44,7 +44,7 @@ class PowerRabi(Experiment):
44
44
  shot_count : int, optional
45
45
  The number of shots to take. Defaults to 400.
46
46
  pulse_vp : float, optional
47
- The voltage per pulse, in Volts. Defaults to the amplitude of the X gate.
47
+ The voltage per pulse, in volts. Defaults to the amplitude of the X gate.
48
48
  measure_waveform : ConstantWaveform or None, optional
49
49
  The waveform to use for the measurement pulse.
50
50
  Defaults to the measurement defcal.
@@ -44,7 +44,7 @@ class PowerRabiEF(Experiment):
44
44
  shot_count : int, optional
45
45
  The number of shots to take. Defaults to 400.
46
46
  pulse_vp : float, optional
47
- The voltage per pulse, in Volts. Defaults to the amplitude of the X gate.
47
+ The voltage per pulse, in volts. Defaults to the amplitude of the X gate.
48
48
  measure_waveform : ConstantWaveform or None, optional
49
49
  The waveform to use for the measurement pulse.
50
50
  Defaults to the measurement defcal.
@@ -42,7 +42,7 @@ class ResonatorSpectroscopyByBias(Experiment):
42
42
  Defaults to a scan around the readout frequency.
43
43
  biases : list[int] or LinspaceIterable or RangeIterable or CWSIterable \
44
44
  or HypIterable, optional
45
- The biases at which to scan, in Volts.
45
+ The biases at which to scan, in volts.
46
46
  Defaults to 21 points between -0.49 and 0.49.
47
47
  recycle_delay_ns : int, optional
48
48
  The delay between consecutive shots, in nanoseconds. Defaults to 1,000 ns.
@@ -22,7 +22,7 @@ class T2(Experiment):
22
22
  """
23
23
  Parameters for running a T2 experiment.
24
24
 
25
- Parameters
25
+ Attributes
26
26
  ----------
27
27
  transmon : str
28
28
  The reference for the transmon to target.
@@ -29,6 +29,9 @@ class ConstantWaveform(_Waveform): # pragma: no cover
29
29
  amplitude: float
30
30
  waveform_type: Literal["Constant"] = "Constant"
31
31
 
32
+ def __str__(self):
33
+ return f"ConstantWaveform(duration_ns={self.duration_ns}, amplitude={self.amplitude})"
34
+
32
35
 
33
36
  @dataclass
34
37
  class GaussianWaveform(_Waveform): # pragma: no cover
@@ -37,6 +40,12 @@ class GaussianWaveform(_Waveform): # pragma: no cover
37
40
  sigma: float
38
41
  waveform_type: Literal["Gaussian"] = "Gaussian"
39
42
 
43
+ def __str__(self):
44
+ return (
45
+ f"GaussianWaveform(duration_ns={self.duration_ns}, "
46
+ f"amplitude={self.amplitude}, sigma={self.sigma})"
47
+ )
48
+
40
49
 
41
50
  @dataclass
42
51
  class DragCosineWaveform(_Waveform): # pragma: no cover
@@ -47,6 +56,12 @@ class DragCosineWaveform(_Waveform): # pragma: no cover
47
56
  center: float
48
57
  waveform_type: Literal["DragCosineWaveform"] = "DragCosineWaveform"
49
58
 
59
+ def __str__(self):
60
+ return (
61
+ f"DragCosineWaveform(duration_ns={self.duration_ns}, amplitude={self.amplitude}, "
62
+ f"drag={self.drag}, buffer_ns={self.buffer_ns}, center={self.center})"
63
+ )
64
+
50
65
 
51
66
  Waveform = Annotated[
52
67
  ConstantWaveform | GaussianWaveform | DragCosineWaveform,
@@ -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\"b\n\x12SetSnapshotRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\x04\x64\x61ta\"P\n\x13SetSnapshotResponse\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"O\n\x12GetSnapshotRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"B\n\x13GetSnapshotResponse\x12+\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x04\x64\x61ta\"\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\tmetadatas\"\x90\x01\n\x0bMaskRequest\x12\x44\n\x04mode\x18\x01 \x01(\x0e\x32\x30.boulderopalscaleupsdk.protobuf.v1.SelectionModeR\x04mode\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x1a\n\x08\x65lements\x18\x03 \x03(\tR\x08\x65lements\"\"\n\x0cMaskResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\rUnmaskRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x1a\n\x08\x65lements\x18\x02 \x03(\tR\x08\x65lements\"$\n\x0eUnmaskResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one*a\n\rSelectionMode\x12\x1e\n\x1aSELECTION_MODE_UNSPECIFIED\x10\x00\x12\x18\n\x14SELECTION_MODE_ITEMS\x10\x01\x12\x16\n\x12SELECTION_MODE_ALL\x10\x02\x32\xb8\r\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\x83\x01\n\x04Mask\x12..boulderopalscaleupsdk.protobuf.v1.MaskRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.MaskResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/mask:\x01*\x12\x8b\x01\n\x06Unmask\x12\x30.boulderopalscaleupsdk.protobuf.v1.UnmaskRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UnmaskResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/unmask:\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\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*\x12\xa0\x01\n\x0bGetSnapshot\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetSnapshotRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetSnapshotResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/device/get_snapshot:\x01*\x12\xa0\x01\n\x0bSetSnapshot\x12\x35.boulderopalscaleupsdk.protobuf.v1.SetSnapshotRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.SetSnapshotResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/device/set_snapshot:\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\"b\n\x12SetSnapshotRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12+\n\x04\x64\x61ta\x18\x02 \x01(\x0b\x32\x17.google.protobuf.StructR\x04\x64\x61ta\"P\n\x13SetSnapshotResponse\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"O\n\x12GetSnapshotRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x18\n\x07version\x18\x02 \x01(\x05R\x07version\"B\n\x13GetSnapshotResponse\x12+\n\x04\x64\x61ta\x18\x01 \x01(\x0b\x32\x17.google.protobuf.StructR\x04\x64\x61ta\"\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\"U\n\x1cGetAllDevicesMetadataRequest\x12\x14\n\x05limit\x18\x01 \x01(\x05R\x05limit\x12\x1f\n\x0bnext_cursor\x18\x02 \x01(\tR\nnextCursor\"w\n\x1dGetAllDevicesMetadataResponse\x12\x35\n\tmetadatas\x18\x01 \x03(\x0b\x32\x17.google.protobuf.StructR\tmetadatas\x12\x1f\n\x0bnext_cursor\x18\x02 \x01(\tR\nnextCursor\"\x90\x01\n\x0bMaskRequest\x12\x44\n\x04mode\x18\x01 \x01(\x0e\x32\x30.boulderopalscaleupsdk.protobuf.v1.SelectionModeR\x04mode\x12\x1f\n\x0b\x64\x65vice_name\x18\x02 \x01(\tR\ndeviceName\x12\x1a\n\x08\x65lements\x18\x03 \x03(\tR\x08\x65lements\"\"\n\x0cMaskResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one\"L\n\rUnmaskRequest\x12\x1f\n\x0b\x64\x65vice_name\x18\x01 \x01(\tR\ndeviceName\x12\x1a\n\x08\x65lements\x18\x02 \x03(\tR\x08\x65lements\"$\n\x0eUnmaskResponse\x12\x12\n\x04\x64one\x18\x01 \x01(\x08R\x04\x64one*a\n\rSelectionMode\x12\x1e\n\x1aSELECTION_MODE_UNSPECIFIED\x10\x00\x12\x18\n\x14SELECTION_MODE_ITEMS\x10\x01\x12\x16\n\x12SELECTION_MODE_ALL\x10\x02\x32\xb8\r\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\x83\x01\n\x04Mask\x12..boulderopalscaleupsdk.protobuf.v1.MaskRequest\x1a/.boulderopalscaleupsdk.protobuf.v1.MaskResponse\"\x1a\x82\xd3\xe4\x93\x02\x14\"\x0f/v1/device/mask:\x01*\x12\x8b\x01\n\x06Unmask\x12\x30.boulderopalscaleupsdk.protobuf.v1.UnmaskRequest\x1a\x31.boulderopalscaleupsdk.protobuf.v1.UnmaskResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/v1/device/unmask:\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\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*\x12\xa0\x01\n\x0bGetSnapshot\x12\x35.boulderopalscaleupsdk.protobuf.v1.GetSnapshotRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.GetSnapshotResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/device/get_snapshot:\x01*\x12\xa0\x01\n\x0bSetSnapshot\x12\x35.boulderopalscaleupsdk.protobuf.v1.SetSnapshotRequest\x1a\x36.boulderopalscaleupsdk.protobuf.v1.SetSnapshotResponse\"\"\x82\xd3\xe4\x93\x02\x1c\"\x17/v1/device/set_snapshot:\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)
@@ -46,8 +46,8 @@ if not _descriptor._USE_C_DESCRIPTORS:
46
46
  _globals['_DEVICEMANAGERSERVICE'].methods_by_name['GetSnapshot']._serialized_options = b'\202\323\344\223\002\034\"\027/v1/device/get_snapshot:\001*'
47
47
  _globals['_DEVICEMANAGERSERVICE'].methods_by_name['SetSnapshot']._loaded_options = None
48
48
  _globals['_DEVICEMANAGERSERVICE'].methods_by_name['SetSnapshot']._serialized_options = b'\202\323\344\223\002\034\"\027/v1/device/set_snapshot:\001*'
49
- _globals['_SELECTIONMODE']._serialized_start=2016
50
- _globals['_SELECTIONMODE']._serialized_end=2113
49
+ _globals['_SELECTIONMODE']._serialized_start=2104
50
+ _globals['_SELECTIONMODE']._serialized_end=2201
51
51
  _globals['_SETSNAPSHOTREQUEST']._serialized_start=145
52
52
  _globals['_SETSNAPSHOTREQUEST']._serialized_end=243
53
53
  _globals['_SETSNAPSHOTRESPONSE']._serialized_start=245
@@ -81,17 +81,17 @@ if not _descriptor._USE_C_DESCRIPTORS:
81
81
  _globals['_GETMETADATARESPONSE']._serialized_start=1521
82
82
  _globals['_GETMETADATARESPONSE']._serialized_end=1595
83
83
  _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_start=1597
84
- _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1627
85
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1629
86
- _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1715
87
- _globals['_MASKREQUEST']._serialized_start=1718
88
- _globals['_MASKREQUEST']._serialized_end=1862
89
- _globals['_MASKRESPONSE']._serialized_start=1864
90
- _globals['_MASKRESPONSE']._serialized_end=1898
91
- _globals['_UNMASKREQUEST']._serialized_start=1900
92
- _globals['_UNMASKREQUEST']._serialized_end=1976
93
- _globals['_UNMASKRESPONSE']._serialized_start=1978
94
- _globals['_UNMASKRESPONSE']._serialized_end=2014
95
- _globals['_DEVICEMANAGERSERVICE']._serialized_start=2116
96
- _globals['_DEVICEMANAGERSERVICE']._serialized_end=3836
84
+ _globals['_GETALLDEVICESMETADATAREQUEST']._serialized_end=1682
85
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_start=1684
86
+ _globals['_GETALLDEVICESMETADATARESPONSE']._serialized_end=1803
87
+ _globals['_MASKREQUEST']._serialized_start=1806
88
+ _globals['_MASKREQUEST']._serialized_end=1950
89
+ _globals['_MASKRESPONSE']._serialized_start=1952
90
+ _globals['_MASKRESPONSE']._serialized_end=1986
91
+ _globals['_UNMASKREQUEST']._serialized_start=1988
92
+ _globals['_UNMASKREQUEST']._serialized_end=2064
93
+ _globals['_UNMASKRESPONSE']._serialized_start=2066
94
+ _globals['_UNMASKRESPONSE']._serialized_end=2102
95
+ _globals['_DEVICEMANAGERSERVICE']._serialized_start=2204
96
+ _globals['_DEVICEMANAGERSERVICE']._serialized_end=3924
97
97
  # @@protoc_insertion_point(module_scope)
@@ -140,14 +140,20 @@ class GetMetadataResponse(_message.Message):
140
140
  def __init__(self, metadata: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
141
141
 
142
142
  class GetAllDevicesMetadataRequest(_message.Message):
143
- __slots__ = ()
144
- def __init__(self) -> None: ...
143
+ __slots__ = ("limit", "next_cursor")
144
+ LIMIT_FIELD_NUMBER: _ClassVar[int]
145
+ NEXT_CURSOR_FIELD_NUMBER: _ClassVar[int]
146
+ limit: int
147
+ next_cursor: str
148
+ def __init__(self, limit: _Optional[int] = ..., next_cursor: _Optional[str] = ...) -> None: ...
145
149
 
146
150
  class GetAllDevicesMetadataResponse(_message.Message):
147
- __slots__ = ("metadatas",)
151
+ __slots__ = ("metadatas", "next_cursor")
148
152
  METADATAS_FIELD_NUMBER: _ClassVar[int]
153
+ NEXT_CURSOR_FIELD_NUMBER: _ClassVar[int]
149
154
  metadatas: _containers.RepeatedCompositeFieldContainer[_struct_pb2.Struct]
150
- def __init__(self, metadatas: _Optional[_Iterable[_Union[_struct_pb2.Struct, _Mapping]]] = ...) -> None: ...
155
+ next_cursor: str
156
+ def __init__(self, metadatas: _Optional[_Iterable[_Union[_struct_pb2.Struct, _Mapping]]] = ..., next_cursor: _Optional[str] = ...) -> None: ...
151
157
 
152
158
  class MaskRequest(_message.Message):
153
159
  __slots__ = ("mode", "device_name", "elements")
@@ -14,6 +14,7 @@
14
14
  """Routine library."""
15
15
 
16
16
  __all__ = [
17
+ "CouplerDiscovery",
17
18
  "OneQubitCalibration",
18
19
  "ResonatorMapping",
19
20
  "Routine",
@@ -23,6 +24,7 @@ __all__ = [
23
24
  ]
24
25
 
25
26
  from .common import Routine
27
+ from .coupler_discovery import CouplerDiscovery
26
28
  from .one_qubit_calibration import OneQubitCalibration
27
29
  from .resonator_mapping import ResonatorMapping
28
30
  from .transmon_coherence import TransmonCoherence
@@ -0,0 +1,37 @@
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 .common import Routine
17
+
18
+
19
+ class CouplerDiscovery(Routine):
20
+ """
21
+ Parameters for running a coupler discovery routine.
22
+
23
+ Attributes
24
+ ----------
25
+ control_transmon : str
26
+ The reference for the transmon to use as control.
27
+ target_transmon : str
28
+ The reference for the transmon to target.
29
+ bias_values : list[float]
30
+ The list of bias values to sweep the coupler through.
31
+ """
32
+
33
+ _routine_name: str = PrivateAttr("coupler_discovery")
34
+
35
+ control_transmon: str
36
+ target_transmon: str
37
+ bias_values: list[float]
@@ -29,13 +29,9 @@ class TransmonRetuning(Routine):
29
29
  spectroscopy_waveform : ConstantWaveform or None, optional
30
30
  The drive pulse used during transmon spectroscopy.
31
31
  Defaults to a 10,000 ns pulse whose amplitude is defined by the logic of the experiment.
32
- force_rerun : bool, optional
33
- Whether to rerun the entire routine regardless transmon's current calibration status.
34
- Defaults to False.
35
32
  """
36
33
 
37
34
  _routine_name: str = PrivateAttr("transmon_retuning")
38
35
 
39
36
  transmon: str
40
37
  spectroscopy_waveform: ConstantWaveform | None = None
41
- force_rerun: bool = False
@@ -0,0 +1,22 @@
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
+ """Solution library."""
15
+
16
+ __all__ = [
17
+ "PlaceholderSolution",
18
+ "Solution",
19
+ ]
20
+
21
+ from .common import Solution
22
+ from .placeholder_solution import PlaceholderSolution
@@ -0,0 +1,23 @@
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 BaseModel, ConfigDict
15
+
16
+
17
+ class Solution(BaseModel):
18
+ model_config = ConfigDict(extra="forbid")
19
+ _solution_name: str
20
+
21
+ @property
22
+ def solution_name(self) -> str:
23
+ return self._solution_name
@@ -0,0 +1,28 @@
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
+ from typing_extensions import deprecated
16
+
17
+ from .common import Solution
18
+
19
+
20
+ @deprecated(
21
+ "This is a placeholder for a specific solution in the future.",
22
+ )
23
+ class PlaceholderSolution(Solution):
24
+ """
25
+ Parameters for running a placeholder solution.
26
+ """
27
+
28
+ _solution_name: str = PrivateAttr("placeholder_solution")
@@ -51,6 +51,21 @@ _qm_patch_targets = [
51
51
  "qm.qua.AnalogMeasureProcess._get_loc",
52
52
  "qm.qua.DigitalMeasureProcess._get_loc",
53
53
  "qm.datadog_api.DatadogHandler",
54
+ "qm.qua.lib._get_loc",
55
+ "qm.qua._dsl.arbitrary._get_loc",
56
+ "qm.qua._dsl.calibration_params_update._get_loc",
57
+ "qm.qua._dsl.external_stream._get_loc",
58
+ "qm.qua._dsl.frame_rotation._get_loc",
59
+ "qm.qua._dsl.function_expressions._get_loc",
60
+ "qm.qua._dsl.phase_reset._get_loc",
61
+ "qm.qua._dsl.play._get_loc",
62
+ "qm.qua._dsl.pulses_utils._get_loc",
63
+ "qm.qua._dsl.scope_functions._get_loc",
64
+ "qm.qua._dsl.variable_handling._get_loc",
65
+ "qm.qua._dsl.wait._get_loc",
66
+ "qm.qua._dsl.measure.analog_measure_process._get_loc",
67
+ "qm.qua._dsl.measure.measure._get_loc",
68
+ "qm.qua._dsl.stream_processing.stream_processing._get_loc",
54
69
  ]
55
70
  for target in _qm_patch_targets:
56
71
  try:
@@ -532,9 +532,6 @@ class _BaseQuaConfig(BaseModel):
532
532
  qm_version: str
533
533
  """The qm-qua package version used."""
534
534
 
535
- version: int = 1
536
- """The configuration version. This is a field used in Qua's configuration API."""
537
-
538
535
  oscillators: Mapping[str, OscillatorConfigType] = {}
539
536
  """The oscillators used to drive the elements."""
540
537
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "boulder-opal-scale-up-sdk"
3
- version = "1.0.6"
3
+ version = "1.0.7"
4
4
  description = "Q-CTRL Boulder Opal Scale Up Python SDK"
5
5
  license = "https://q-ctrl.com/terms"
6
6
  authors = ["Q-CTRL <support@q-ctrl.com>"]
@@ -76,7 +76,7 @@ pydantic = "^2.10.4"
76
76
  pydantic-settings = "^2.7.0"
77
77
  python-dateutil = "^2.9.0.post0"
78
78
  pyyaml = "^6.0.2"
79
- qm-qua = { version = "1.2.1", optional = true }
79
+ qm-qua = { version = "1.2.3", optional = true }
80
80
 
81
81
  [tool.poetry.extras]
82
82
  quantum-machines = ["qm-qua"]