Surface code on IQM Emerald
The d = 3 surface-code memory that turned random by round — at the hackathon now stays below random for all — rounds we ran on the same chip, with a logical error of — (memory X) to — (memory Z) per round.
A follow-up to team gate_crushers' entry in the IQM error-correction challenge at Junction Quantum Hack 2026 (June 5–7). Same task, same IQM Emerald computer, the same qubits (QB13 to QB45). The main change is the circuit sent to the chip.
Same chip, same day: the June circuit against the current one
Logical error rate after each number of syndrome rounds, with ~68% intervals. Both Oct 12 runs used the same qubits and the same calibration, two minutes apart; the June circuit was rebuilt gate for gate from the hackathon code. 0.5 means the stored bit is lost. At 1 round the June circuit has no mid-circuit resets yet and does as well or better; the gap opens once rounds repeat.
Data: ler_by_round.json, built from baselines/post_hackathon/hw_20261012 and baselines/hackathon_2026-06-07
Why the June circuit failed
In June every ancilla measurement was followed by a Qiskit reset. On IQM hardware a reset is itself a measurement followed by a conditional π pulse, and placed between the readouts it kept them from running in parallel. One round took — µs, and the data qubits waited through it without dynamical decoupling. By round 3 the logical bit was gone: even after decoding, the result is a coin flip.
The current circuit reads all ancillas out at once and does not reset them; each check compares an ancilla with its outcome two rounds earlier instead (Gehér et al.). IQM's dynamical decoupling protects the idle qubits, and a round takes — µs.
Time per syndrome round
From IQM's pulse compiler against the Emerald calibration on Oct 12: the schedule time each extra round adds. The data qubits sit idle for most of it.
Data: round_time.json, from round_time_pulla_20261012.csv
The logical bit before any correction
How often the logical bit has flipped when it is read out, before any correction (Oct 12). Uncorrected errors pile up in every memory. The June circuit reaches a coin flip by round 3; the current circuit gets there much later, and decoding still recovers most of its errors.
Data: raw_observable.json, from the round-by-round diagnosis in hw_20261012
Error per round, measured and predicted
Logical error per round from a binomial maximum-likelihood fit over all round counts, ±1σ. Filled dots are hardware; hollow dots are the simulator's predictions, pushed to GitHub before each run.
Data: error_per_round.json, from the per-round fits in baselines/post_hackathon
- It reproduces. Memory X: — on Oct 12 against — on Oct 4. Memory Z was worse on Oct 12 (— against —); that day's calibration showed higher readout error on these qubits.
- Dynamical decoupling matters. Without it the error per round rises to — (Z) and — (X). The simulator expected the damage to fall on memory X only, so its noise model is missing something that decoupling suppresses.
- A better decoder helps. Correlated matching on the same Oct 12 data gives — (Z) and — (X).
Hardware runs in October
QPU execution time per job, from IQM's job records. In these runs IQM Resonance charged about one credit per second of execution. Total: — s over — shots.
| Date | IQM job | What ran | Shots | QPU time | Outcome |
|---|
Data: hardware_jobs.json, from hardware_jobs.csv
How these numbers were made
Each run stores a logical bit in a d = 3 rotated surface code (17 qubits), repeats the stabilizer checks for a given number of rounds, reads the bit out and decodes it with minimum-weight matching built from IQM's calibration data. Memory Z and memory X test the two kinds of logical error. Before each main run the simulator's prediction was pushed to GitHub, so a wrong prediction stays visible, as with the decoupling result above.
Code, configurations and every archived result: github.com/kazulak/JunctionHackathon. The June 7 curve is the hackathon's own hardware run; the submission is frozen under the tag junction-quantum-hackathon-final-2026, and everything else on this page came after the event.