Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
ecaa5a8
fix(qpi-driver): release the cluster's sync network after every quant…
ch-ahindura Aug 10, 2026
5e1da6f
fix(qpi-driver): round ramsey's delays to the 1 ns grid
ch-ahindura Aug 10, 2026
e7e0fc6
fix(qpi-driver): decline the flux routines on a flux-tunable-coupler …
ch-ahindura Aug 10, 2026
88e0d76
fix(qpi-driver): refuse an RB fidelity taken from noise
ch-ahindura Aug 11, 2026
d8b4f0b
fix(qpi-driver): refuse a spectroscopy line that is not above the noise
ch-ahindura Aug 11, 2026
e504d78
fix(qpi-driver): make the dispersive shift auditable, and guard the s…
ch-ahindura Aug 11, 2026
ddc3f34
fix(qpi-driver): refuse a fine-amplitude slope taken through no contrast
ch-ahindura Aug 11, 2026
1a11771
fix(qpi-driver): reset the cluster when opening it
ch-ahindura Aug 12, 2026
b190676
fix(qpi-driver): refuse a Rabi oscillation no taller than its noise
ch-ahindura Aug 12, 2026
4892671
fix(qpi-driver): refuse a coherence or Ramsey fit drawn through flat …
ch-ahindura Aug 12, 2026
df7b866
fix(qpi-driver): refuse a dispersive shift no readout could resolve
ch-ahindura Aug 12, 2026
d77cbdb
feat(qpi-driver): let qubit_spectroscopy find a qubit that is not whe…
ch-ahindura Aug 12, 2026
b865a08
fix(qpi-driver): give the simulated backend the allowance the DAG reads
ch-ahindura Aug 12, 2026
7bb91d4
fix(qpi-driver): sum the allowances of a routine that runs several sc…
ch-ahindura Aug 12, 2026
7350a2a
docs(rfcs): RFC 0007 — calibration without priors
ch-ahindura Aug 12, 2026
997463d
docs(rfcs): RFC 0007 — skip nodes whose prerequisite was never produced
ch-ahindura Aug 12, 2026
1da607b
docs(rfcs): RFC 0007 — resolve the review FIXMEs
ch-ahindura Aug 12, 2026
2916343
docs(rfcs): RFC 0007 — resolve the second round of review FIXMEs
ch-ahindura Aug 12, 2026
70baf36
docs(rfcs): RFC 0007 — resolve the third round of review FIXMEs
ch-ahindura Aug 12, 2026
c4b7e7b
refactor(qpi-driver): read the device before the acquisition, not aft…
ch-ahindura Aug 12, 2026
0a52120
feat(qpi-driver): a routine declares the device parameters it reads
ch-ahindura Aug 12, 2026
7132c9e
feat(qpi-driver): skip a routine whose input this run failed to produce
ch-ahindura Aug 12, 2026
b16f329
docs(rfcs): RFC 0007 — record what phase 0 changed
ch-ahindura Aug 12, 2026
1149682
docs(rfcs): RFC 0007 — retitle §10, which stopped being a list of gaps
ch-ahindura Aug 12, 2026
bb78c71
docs(rfcs): RFC 0008 — parameter provenance, lifted out of 0007 §10
ch-ahindura Aug 12, 2026
3a570f4
docs(rfcs): RFC 0008 — settle the expiry question, and explain its ow…
ch-ahindura Aug 12, 2026
3597c58
docs(rfcs): RFC 0007 — the simulator cannot fail a wrong f01
ch-ahindura Aug 12, 2026
d35147a
fix(qpi-driver): the simulator's gate paths carry the drive detuning
ch-ahindura Aug 12, 2026
ccf2fd0
Fix typo
ch-ahindura Aug 12, 2026
5a42706
docs(rfcs): RFC 0007 — §14 was overbroad, and invented a blocker
ch-ahindura Aug 12, 2026
b6cc138
feat(qpi-driver): refuse a spectroscopy line drawn through noise, and…
ch-ahindura Aug 12, 2026
883a65e
fix(qpi-driver): only a power that shows a line may judge the others
ch-ahindura Aug 12, 2026
8d0cfbd
fix(qpi-driver): size the confirming sweep from the width the search …
ch-ahindura Aug 12, 2026
98c7a38
docs(rfcs): RFC 0007 — phases 1 and 2 are done and merged
ch-ahindura Aug 12, 2026
9be641b
fix(qpi-driver): sweep the drive amplitude to full scale, and find ou…
ch-ahindura Aug 12, 2026
ae83b49
feat(qpi-driver): keep the resonator linewidth that was measured
ch-ahindura Aug 12, 2026
087fb5c
fix(qpi-driver): size the readout operating point from the measured l…
ch-ahindura Aug 12, 2026
5af1618
fix(qpi-driver): derive the last of the physics-bounded ranges
ch-ahindura Aug 12, 2026
a6f2d01
feat(qpi-driver): widen a window the fit says was too short, instead …
ch-ahindura Aug 12, 2026
78c8676
feat(qpi-driver): calibrate a chip known only from its design document
ch-ahindura Aug 13, 2026
835f28c
docs(rfcs): RFC 0007 is implemented
ch-ahindura Aug 13, 2026
215f874
test(qpi-driver): benchmark against the injected gate error, not a th…
ch-ahindura Aug 13, 2026
833caf2
feat(qpi-driver): add the provenance sidecar, unused
ch-ahindura Aug 13, 2026
fefd532
feat(qpi-driver): record provenance for what a calibration measured
ch-ahindura Aug 13, 2026
f046085
feat(qpi-driver): report which inputs nothing has ever measured
ch-ahindura Aug 13, 2026
cf4d503
feat(qpi-driver): consume provenance, and correct what it should change
ch-ahindura Aug 13, 2026
8f592bc
docs(rfcs): RFC 0007 overclaimed that phase 3 fixed resonator_punchout
ch-ahindura Aug 13, 2026
f6aac1b
docs(rfcs): record that reads is under-declared, so RFC 0007 §11 did …
ch-ahindura Aug 13, 2026
650f2f9
fix(qpi-driver): declare the gate parameters 22 routines actually read
ch-ahindura Aug 13, 2026
93c8d2a
fix(qpi-driver): sweep resonator_punchout to full readout scale
ch-ahindura Aug 13, 2026
141f51a
fix(qpi-driver): skip a two-qubit routine whose endpoint never calibr…
ch-ahindura Aug 13, 2026
6f0af0a
feat(qpi-driver): let resonator_spectroscopy re-centre its own sweep
ch-ahindura Aug 13, 2026
baa03c6
fix(qpi-driver): refuse a readout at chance and an AllXY that is only…
ch-ahindura Aug 13, 2026
3e88939
fix(qpi-driver): cap an escalating sweep at what the sequencer really…
ch-ahindura Aug 13, 2026
e520c37
fix(qpi-driver): hold the confirming sweep's step, not its point count
ch-ahindura Aug 13, 2026
d94defd
fix(qpi-driver): read a config number as a number
ch-ahindura Aug 13, 2026
b2354f5
fix(qpi-driver): derive the search drive power from the powers config…
ch-ahindura Aug 13, 2026
f8128a0
fix(qpi-driver): stop a widened amplitude sweep at full scale
ch-ahindura Aug 13, 2026
dec4a8c
docs(rfcs): record that nothing refuses a line filling its own window
ch-ahindura Aug 13, 2026
703363b
feat(qpi-driver): let a routine set its own timeout
ch-ahindura Aug 13, 2026
8c2848f
docs(rfcs): a broad spectroscopy line is not a wrong one — §11.3 closed
ch-ahindura Aug 13, 2026
fba85de
fix(qpi-driver): hold the 1-2 pi amplitude to the transmon ladder
ch-ahindura Aug 13, 2026
0fa0046
fix(qpi-driver): stop a diagnostic score outvoting a measured gate fi…
ch-ahindura Aug 13, 2026
83d9a30
feat(qpi-driver): refine f01 until the residual detuning is unresolvable
ch-ahindura Aug 13, 2026
7ed29dd
fix(qpi-driver): make the 1-2 Rabi oscillation visible to a 0-1 readout
ch-ahindura Aug 13, 2026
6e5055e
test(qpi-driver): simulate the 1-2 transition, and measure what the m…
ch-ahindura Aug 13, 2026
60cf28e
fix(qpi-driver): centre the ef ladder bound on the pulse it actually …
ch-ahindura Aug 13, 2026
2d60222
docs(rfc-0007): record that 11.5's equator error survived the detunin…
ch-ahindura Aug 13, 2026
d5eeca5
feat(qpi-driver): give CalibratedTransmon a measured pi/2 amplitude
ch-ahindura Aug 13, 2026
0598838
refactor(qpi-driver): let the fine-amplitude fit amplify any nominal …
ch-ahindura Aug 13, 2026
35e6133
feat(qpi-driver): calibrate the pi/2 amplitude with fine_amplitude_90
ch-ahindura Aug 13, 2026
e738f3d
docs: close RFC 0007 11.5 and document fine_amplitude_90
ch-ahindura Aug 13, 2026
bae0116
fix: size the ef pulse off rxy.duration, and show the gate fidelity
ch-ahindura Aug 14, 2026
d6901d1
feat(qpi-driver): report allxy_check's response, not just its rms
ch-ahindura Aug 14, 2026
ee01e7d
feat(qpi-driver): report the ef sweep's contrast when the ladder refuses
ch-ahindura Aug 14, 2026
9b50c07
fix(qpi-driver): free the fine-amplitude intercept, and bound the lin…
ch-ahindura Aug 14, 2026
4686684
feat(qpi-driver): a refusal carries the fit it refused
ch-ahindura Aug 14, 2026
1061d64
fix(qpi-driver): the ef ladder refuses a partial rotation, not a reso…
ch-ahindura Aug 14, 2026
45539b8
fix(qpi-driver): refuse an RB fidelity fitted off a straight line
ch-ahindura Aug 14, 2026
ddaeaba
fix(qpi-driver): resize the sweeps that refused a fit they had alread…
ch-ahindura Aug 14, 2026
2391ccf
fix(qpi-driver): escalate the last two nodes that refused instead of …
ch-ahindura Aug 14, 2026
7ded3bb
fix(qpi-driver): record a benchmark that runs its own measurement loop
ch-ahindura Aug 14, 2026
0b3ca0b
fix(qpi-driver): cancel the CZ's single-qubit phase instead of doubli…
ch-ahindura Aug 14, 2026
c35fb2a
fix(qpi-driver): bound the depths escalation at an instruction budget
ch-ahindura Aug 14, 2026
13d7729
fix(qpi-driver): stop losing calibration results on the last mile
ch-ahindura Aug 14, 2026
6e6af5b
Revert everything after 4686684, to a driver that reports its results
ch-ahindura Aug 14, 2026
8bf1e67
fix(qpi-driver): cancel the CZ's single-qubit phase instead of doubli…
ch-ahindura Aug 14, 2026
cf4aa1e
fix(qpi-driver): re-land the routine and fit fixes, none of them on t…
ch-ahindura Aug 14, 2026
86ea70f
fix(qpi-driver): let t1 and t2_echo widen their delays instead of ref…
ch-ahindura Aug 14, 2026
242c41a
fix(qpi-driver): keep an embedded Q1ASM program out of the error payload
ch-ahindura Aug 14, 2026
8371973
fix(qpi-driver): rb averages harder, bounded by the assembler this time
ch-ahindura Aug 14, 2026
caac158
fix(qpi-driver): stop losing calibration results on the last mile
ch-ahindura Aug 14, 2026
7746831
fix(qpi-driver): make four escalatable axes actually escalatable
ch-ahindura Aug 14, 2026
33ed12e
feat(qpi-driver): measure the ef ladder, and split an RB sweep that o…
ch-ahindura Aug 14, 2026
438946f
fix(qpi-driver): chunk a 2-D grid by rows, and stop the timeout warni…
ch-ahindura Aug 14, 2026
e3aa871
fix(qpi-driver): give the pi/2 shortening somewhere to go, and a floo…
ch-ahindura Aug 14, 2026
7e5f834
fix(qpi-driver): a pi amplitude past the top of the sweep was never m…
ch-ahindura Aug 14, 2026
d7d48bf
fix(qpi-driver): give the echo the T1 ceiling it cannot fit without
ch-ahindura Aug 14, 2026
8cef895
feat(qpi-driver): measure the magnitude contrast nothing was choosing…
ch-ahindura Aug 14, 2026
b0f0d0a
fix(qpi-driver): measure which root of the Ramsey fringe is the chip's
ch-ahindura Aug 14, 2026
decce64
fix(qpi-driver): refuse a fine-amplitude sweep no line passes through
ch-ahindura Aug 14, 2026
9d6c611
feat(qpi-driver): report what the ef sweep and the RB decay actually …
ch-ahindura Aug 14, 2026
4f8974c
test(qpi-driver): assert the Ramsey roots by arithmetic, not against …
ch-ahindura Aug 14, 2026
c144a61
fix(qpi-driver): a flat trace is a signal budget, not a broken chain
ch-ahindura Aug 14, 2026
6d16483
fix(qpi-driver): size the three-state readout sweep from the linewidt…
ch-ahindura Aug 14, 2026
9742a44
feat(qpi-driver): let a poor measurement through, marked, instead of …
ch-ahindura Aug 15, 2026
9a542cd
fix(qpi-driver): refuse a 1-2 pi that is a factor of two off the ladder
ch-ahindura Aug 15, 2026
2269585
fix(qpi-driver): sweep the 1-2 spectroscopy drive instead of fixing i…
ch-ahindura Aug 15, 2026
83d0228
fix(qpi-driver): let the spectroscopy drive ladder climb when a chip …
ch-ahindura Aug 15, 2026
6fc1561
fix(qpi-driver): sweep the 1-2 drive downward only, never up
ch-ahindura Aug 15, 2026
98448f7
fix(qpi-driver): break the EF deadlock by amplifying on the 0-1 readout
ch-ahindura Aug 15, 2026
1d9ee82
fix(qpi-driver): judge an off-ladder 1-2 pi by population swing, not …
ch-ahindura Aug 15, 2026
02a5598
fix(qpi-driver): the ef ladder constant read nr_sigma per pulse, not …
ch-ahindura Aug 15, 2026
21a2244
fix(qpi-driver): score RB survival against references, not the sweep'…
ch-ahindura Aug 15, 2026
9470cc1
fix(qpi-driver): size the Hahn echo window from T1 instead of a fixed…
ch-ahindura Aug 15, 2026
6bd78fe
fix(qpi-driver): refuse a DRAG root read off a line through noise
ch-ahindura Aug 15, 2026
8ad43d8
refactor(qpi-driver): drop the ef ladder's factor-of-two case, pin nr…
ch-ahindura Aug 15, 2026
06eee09
fix(qpi-driver): let a config widen the anharmonicity range f12 is se…
ch-ahindura Aug 15, 2026
1770f9d
feat(qpi-driver): calibrate the readout integration window
ch-ahindura Aug 15, 2026
27a2782
fix(qpi-driver): judge fine amplitude's overrun from the data, not fr…
ch-ahindura Aug 15, 2026
3d7f581
fix(qpi-driver): grid the echo delays, and close the gap a degenerate…
ch-ahindura Aug 16, 2026
93b10ee
fix(qpi-driver): sweep the readout window to the hardware ceiling, no…
ch-ahindura Aug 16, 2026
8ab161d
fix(qpi-driver): let fine_amplitude_12 shorten its own sweep
ch-ahindura Aug 16, 2026
376e049
fix(qpi-driver): stop the readout window at the pulse, not at the ins…
ch-ahindura Aug 16, 2026
6e9f38b
fix(qpi-driver): report an imprecise measurement instead of refusing it
ch-ahindura Aug 16, 2026
17e33d3
fix(qpi-driver): keep the measured f12 when a sweep cannot resolve th…
ch-ahindura Aug 16, 2026
d87327d
fix(qpi-driver): flag the two numbers the 2026-08-16 run reported wit…
ch-ahindura Aug 16, 2026
c7f22f5
fix(qpi-driver): pin RB's asymptote and bound the echo window, so bot…
ch-ahindura Aug 16, 2026
94bf57a
chore: bump to 0.4.2
ch-ahindura Aug 16, 2026
3b66dbf
fix: make CI green — the per-extra matrix and the dashboard lint
ch-ahindura Aug 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ jobs:
cache-dependency-glob: "qpi-driver/py/pyproject.toml"

- name: Run Tests for '${{ matrix.extra }}'
# Benchmarks thoroughly rather than just correctly: more circuits per depth, so the
# two RB fidelities are precise as well as resolved. Off by default so a local run
# is quick; on here, which covers every pull request and every tag.
env:
QPI_SLOW_BENCHMARKS: '1'
run: |
make test-py-loop EXECUTOR=${{ matrix.extra }}

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ quantify.config.yml
quantify.device.yml
quantify.config.yaml
quantify.device.yaml
calibration.yml
!**/fixtures/**.json
!**/fixtures/**.yaml
!**/fixtures/**.yml
Expand Down
396 changes: 395 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
VERSION ?= 0.4.1
VERSION ?= 0.4.2
UV := $(shell command -v uv 2> /dev/null || echo "$$HOME/.local/bin/uv")
EXECUTOR ?= mock
EXECUTORS := mock aer quantify qblox
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,12 @@ The server is available as a single executable binary, as well as native OS pack
#### Standalone Binary (macOS & Linux)
Download the binary for your platform, make it executable, and run:
```bash
# macOS (replace 0.4.1 with the version you wish to install)
curl -LO https://github.com/sopherapps/qpi/releases/download/v0.4.1/qpi-0.4.1-darwin-amd64
chmod +x qpi-0.4.1-darwin-amd64 && mv qpi-0.4.1-darwin-amd64 qpi
# macOS (replace 0.4.2 with the version you wish to install)
curl -LO https://github.com/sopherapps/qpi/releases/download/v0.4.2/qpi-0.4.2-darwin-amd64
chmod +x qpi-0.4.2-darwin-amd64 && mv qpi-0.4.2-darwin-amd64 qpi

# Linux (standalone binary)
curl -L https://github.com/sopherapps/qpi/releases/download/v0.4.1/qpi-0.4.1-linux-amd64.tar.gz | tar -xz
curl -L https://github.com/sopherapps/qpi/releases/download/v0.4.2/qpi-0.4.2-linux-amd64.tar.gz | tar -xz

# Start the server
./qpi serve
Expand All @@ -91,8 +91,8 @@ curl -L https://github.com/sopherapps/qpi/releases/download/v0.4.1/qpi-0.4.1-lin
#### Native Linux Packages (Ubuntu, Debian, Fedora, Alpine)
For Debian/Ubuntu, download and install the `.deb` package:
```bash
wget https://github.com/sopherapps/qpi/releases/download/v0.4.1/qpi_0.4.1_amd64.deb
sudo apt install ./qpi_0.4.1_amd64.deb
wget https://github.com/sopherapps/qpi/releases/download/v0.4.2/qpi_0.4.2_amd64.deb
sudo apt install ./qpi_0.4.2_amd64.deb
```
*(Note: Installing the package automatically registers and starts `qpi.service` under systemd (or OpenRC on Alpine) to run the server in the background on port `8090`)*

Expand Down
904 changes: 904 additions & 0 deletions docs/rfcs/0007-calibration-without-priors.md

Large diffs are not rendered by default.

290 changes: 290 additions & 0 deletions docs/rfcs/0008-parameter-provenance.md

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions docs/rfcs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,14 @@ holds both the system design and its phased implementation plan, so a contributo
| [0004](./0004-calibration-tuners.md) | Calibration Tuners | Implemented |
| [0005](./0005-calibration-graph-completion.md) | Calibration Graph Completion | Implemented |
| [0006](./0006-calibration-graph-in-the-dashboard.md) | The Calibration Graph in the Dashboard | Draft |
| [0007](./0007-calibration-without-priors.md) | Calibration Without Priors | Implemented (§11.5 open) |
| [0008](./0008-parameter-provenance.md) | Parameter Provenance | Implemented |

Neither calibration RFC has been verified against physical hardware; both say so
where it matters.
RFCs 0004 and 0005 were written before the graph had run on a chip, and say so where it
matters. RFCs 0007 and 0008 are the opposite case: they exist because of what running it
on one found. 0008 was the piece 0007 deferred; both are now implemented, and each records
where building it corrected what it had claimed. 0007 §11.1 was added after both were
closed, because hardware found it — a gap the RFC's own mechanism was meant to cover.

## Conventions

Expand Down
4 changes: 2 additions & 2 deletions qpi-client/js/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion qpi-client/js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "qpi-client",
"version": "0.4.1",
"version": "0.4.2",
"description": "JavaScript/TypeScript client SDK for the QPI quantum computing platform",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
2 changes: 1 addition & 1 deletion qpi-client/py/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "qpi-client"
version = "0.4.1"
version = "0.4.2"
description = "Python client SDK for the QPI quantum computing platform"
readme = "README.md"
license = {text = "MIT"}
Expand Down
2 changes: 1 addition & 1 deletion qpi-client/py/qpi_client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
try:
__version__ = importlib.metadata.version("qpi-client")
except importlib.metadata.PackageNotFoundError:
__version__ = "0.4.1"
__version__ = "0.4.2"

from qpi_client.client import QPIClient
from qpi_client.provider import QPIBackend, QPIJob
Expand Down
2 changes: 1 addition & 1 deletion qpi-client/py/uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion qpi-driver/go/cli/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (

// Version is the CLI version; overridable at build time with
// -ldflags "-X github.com/sopherapps/qpi/qpi-driver/go/cli.Version=…".
var Version = "0.4.1"
var Version = "0.4.2"

// commonFlags are the universal options `start` shares across every operation,
// mirroring the Python CLI. A device's own settings go through -o instead.
Expand Down
4 changes: 2 additions & 2 deletions qpi-driver/js/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion qpi-driver/js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "qpi-driver",
"version": "0.4.1",
"version": "0.4.2",
"description": "TypeScript/JavaScript SDK for building QPI quantum platform drivers",
"main": "dist/index.js",
"types": "dist/index.d.ts",
Expand Down
87 changes: 74 additions & 13 deletions qpi-driver/py/calibration.example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,31 @@
# working default — so the shortest useful file is just `target_qubits`. A
# routine name that matches no routine is a startup error, not a silent no-op,
# so a typo here is caught before any hardware is touched.
#
# Prefer leaving a sweep out to writing its default down. Several routines widen or
# refine their own sweep when the fit says the window was wrong (RFC 0007 §5), and
# naming an axis here switches that off for it deliberately: an operator who states a
# range has made a claim about the chip, and the driver will not overrule it with a
# default. Everything below is therefore an illustration of the *shape* of each config,
# not a recommendation to paste.
#
# Write exponents as `20.0e+6` — decimal point *and* a signed exponent. PyYAML needs
# both: `20e6`, `20.0e6` and `7.183e9` all parse as *strings*, while `20.0e+6` and
# `4.0e-9` are numbers. The three forms are indistinguishable on the page. The driver
# converts numeric strings on the way in, for configs and device files alike, so every
# form works — but only one of them is a number in the file you are reading.

target_qubits: [q0, q1, q2]
target_edges: [q0_q1, q1_q2]

# Wall-clock ceiling for one routine on one target. A routine that hangs on an
# instrument would otherwise hang the worker for the life of the driver.
#
# Any routine may override it with its own `timeout_s`, and on a real chip several want to.
# The cost of a single global number is that it has to be set for the slowest node, which
# makes it no ceiling at all for the fast ones: `qubit_spectroscopy` pays for a wide search
# and then a fine confirm at several drive powers, and has been measured at 299 s, while a
# Rabi that takes more than a few seconds is hung.
routine_timeout_s: 900

routines:
Expand All @@ -20,44 +39,86 @@ routines:
# Either an explicit list of frequencies, or a span about the value
# currently in quantify.device.yml — the latter being what a
# recalibration wants, since it only has to find where the peak moved to.
span: 20e6
#
# Leave `span` out on a bring-up. Left to itself this node widens and re-runs when
# the resonator turns out to be outside the window, and samples harder when the line
# is thinner than the grid; naming a span here means a resonator a few MHz away fails
# the run instead. `points` is safe to set — it is the resolution, not the reach.
span: 20.0e+6
points: 51
shots: 1024

resonator_punchout:
amplitudes: [0.01, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5]
span: 20e6
# Reaching 1.0 matters: punch-through is by definition the high-power end, and a grid
# stopping at half scale cannot find it on a line carrying any real attenuation — with
# 20 dB of `output_att` it is some 26 dB short. Spaced log-ish, since punch-through is
# a log-power effect, so the points sit where the transition is.
#
# Watch the cost. This sweeps frequency *and* power, and a frequency sweep costs about
# 15 Q1ASM instructions per point against a QRM ceiling of 12288 — so amplitudes x
# points must stay under roughly 800.
amplitudes: [0.02, 0.08, 0.25, 0.6, 1.0]
span: 20.0e+6
points: 31

qubit_spectroscopy:
span: 40e6
# Its own ceiling, because this is the expensive node: a search across everything the
# port can reach, then a confirming sweep at each drive power. Raising the global limit
# to suit it would stop it catching a hang anywhere else.
timeout_s: 900
# Two passes. `span`/`points` is the narrow sweep about the configured f01; if no line
# is there, `search_*` looks across everything the drive port can reach and the narrow
# sweep is repeated where it found one. Both are trimmed to the port's +/-500 MHz of
# its LO, so a search wider than that simply covers the whole band.
span: 40.0e+6
points: 51
# Deliberately weak: saturating the transition broadens the line and hides
# the centre this routine exists to find.
drive_amp: 0.01
search_span: 600.0e+6
search_points: 301
# A geometric *range*, not one power. Weak is right in principle — saturating the
# transition broadens the line and pulls the centre this routine exists to find — but
# too weak is a line under the noise, which is a failed run rather than a cautious one.
# `fit_spectroscopy_power` keeps the narrowest credible line of the set, so a wide
# bracket costs acquisitions rather than accuracy, and geometric spacing is what covers
# an unknown scale. Each power multiplies the acquisition count, so watch the ceiling.
#
# `search_amp` is deliberately absent: the widening pass drives at the strongest of
# these by default, which is the pass that has to see a line at all.
drive_amps: [0.01, 0.03, 0.1, 0.3]

# --- Single-qubit gates ---
rabi:
# Half scale, because a strongly driven transmon stops being the cosine this fits.
# Left unset, `rabi` starts here and reaches further when the fit says the pi pulse is
# above the sweep — which naming the axis here turns off.
amplitudes: [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5]

ramsey:
delays: [4e-9, 1e-6, 2e-6, 3e-6, 4e-6, 5e-6, 7e-6, 10e-6]
artificial_detuning: 1e6
delays: [4.0e-9, 1.0e-6, 2.0e-6, 3.0e-6, 4.0e-6, 5.0e-6, 7.0e-6, 10.0e-6]
artificial_detuning: 1.0e+6

t1:
delays: [0, 10e-6, 20e-6, 30e-6, 40e-6, 60e-6, 80e-6, 100e-6]
delays: [0.0, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 60.0e-6, 80.0e-6, 100.0e-6]

t2_echo:
delays: [0, 10e-6, 20e-6, 30e-6, 40e-6, 60e-6, 80e-6, 100e-6]
delays: [0.0, 10.0e-6, 20.0e-6, 30.0e-6, 40.0e-6, 60.0e-6, 80.0e-6, 100.0e-6]

drag:
motzois: [-1.0, -0.75, -0.5, -0.25, 0.0, 0.25, 0.5, 0.75, 1.0]
# Seconds, not a dimensionless amplitude: the DRAG parameter scales a time derivative
# of the envelope, so a 56 ns gate wants values of order 1e-11. At a dimensionless
# scale the derivative term dwarfs the carrier and the waveform exceeds full scale.
motzois: [-2.0e-10, -1.0e-10, -5.0e-11, 0.0, 5.0e-11, 1.0e-10, 2.0e-10]

allxy: {}

fine_amplitude:
repetitions: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25]

# Every fourth count, and not by preference: only after 4k+1 quarter turns does
# the accumulated error lie along the axis being measured. The fit refuses any
# other spacing rather than fitting three quarters noise.
fine_amplitude_90:
repetitions: [1, 5, 9, 13]

# --- Benchmarks: measured, never written back ---
rb:
depths: [1, 2, 4, 8, 16, 32, 64]
Expand All @@ -77,7 +138,7 @@ routines:
cz_chevron:
enabled: false
amplitudes: [0.1, 0.2, 0.3, 0.4, 0.5]
durations: [20e-9, 60e-9, 100e-9, 140e-9, 180e-9]
durations: [20.0e-9, 60.0e-9, 100.0e-9, 140.0e-9, 180.0e-9]

conditional_phase:
enabled: false
Expand Down
2 changes: 1 addition & 1 deletion qpi-driver/py/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "qpi-driver"
version = "0.4.1"
version = "0.4.2"
description = "Quantum Processing Interface (QPI) QPU Driver"
readme = "README.md"
requires-python = ">=3.12,<3.13"
Expand Down
2 changes: 1 addition & 1 deletion qpi-driver/py/qpi_driver/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
try:
__version__ = importlib.metadata.version("qpi-driver")
except importlib.metadata.PackageNotFoundError:
__version__ = "0.4.1"
__version__ = "0.4.2"

from qpi_driver.builtins import (
DeviceBuilder,
Expand Down
Loading
Loading