Surface-code QCCD
Scott Jones, Prakash Murali. Architecting Scalable Trapped Ion Quantum Computers using Surface Codes. ASPLOS 2026. arXiv:2510.23519 · their code: scottjones03/PartIIProject (MIT)
A compiler for surface-code rounds on grid, linear and switch QCCD devices, and a design-space study of trap capacity, wiring and logical error.
- Rules R2, R3, R7c, R14, R16, R22, R23 cite it as a source.
- The objective: runtime stands for idling noise and the number of routing operations for heating, which this project's plan makes one objective.
- That transport does not cause gate error directly but heats, and heating degrades the next gate; and the heating bound of each transport primitive in its Table 1 (shuttle below 0.1 quanta, split and merge below 6, junction entry or exit below 3), which the default timing table, qccdsim_jones, carries with QCCDSim's times.
- The default device's reset (50 µs, error 5×10⁻³), and reordering a chain with a gate swap of three two-qubit gates.
- The question this project started from: what broadcast (WISE) control costs in logical clock speed, which it puts at up to 25× under odd–even sort. Its first author's WISER (arXiv:2609.13546) treats multiplexed control in more depth; this website's accounting of the compensation demultiplexer draws on its model of the multiplexing order.
- Odd–even transposition sort as a reconfiguration scheme, and that cooling is mandatory under broadcast wiring.
- The leaderboards' time column, T_jones, is priced with the qccdsim_jones table.
The paper's runs are from d235a22, the code behind its Table 2. The authors fixed the gate order of its grid schedules in afbd1b4 (2026-10-22), which also adds the MIT licence file the README already named; those runs are in their own table below.
| configuration | start of the last step: their code | our replay | the paper | the paper's rules |
|---|---|---|---|---|
| rotated surface code d=2, one round, grid, capacity 2 ▶ watch it in the Studio | 4,055 µs = ours | 4,055 µs | 4,055 µs equalTable 2 | R26 fails 11 others hold |
| rotated surface code d=3, one round, grid, capacity 2 ▶ watch it in the Studio | 4,085 µs = ours | 4,085 µs | 4,085 µs equalTable 2 | R26 fails 11 others hold |
| rotated surface code d=6, one round, grid, capacity 2 ▶ watch it in the Studio | 4,080 µs = ours | 4,080 µs | 4,085 µs differsTable 2 | R26 fails 11 others hold |
| rotated surface code d=12, one round, grid, capacity 2 ▶ watch it in the Studio | 4,085 µs = ours | 4,085 µs | 4,085 µs equalTable 2 | R26 fails 11 others hold |
| repetition code d=3, linear, capacity 2 ▶ watch it in the Studio | 1,535 µs = ours | 1,535 µs | 1,535 µs equalTable 2 | all 12 rules hold |
| repetition code d=3, linear, capacity 3 ▶ watch it in the Studio | 1,390 µs = ours | 1,390 µs | 1,390 µs equalTable 2 | all 12 rules hold |
| repetition code d=3, linear, capacity 4 ▶ watch it in the Studio | 1,505 µs = ours | 1,505 µs | 1,505 µs equalTable 2 | all 12 rules hold |
| rotated surface code d=3, switch, capacity 2 (current code) the switch joins every pair of junctions by two parallel segments, an all-to-all junction network; our language describes surface traps, which cannot hold it, so it is replayed but not drawn | 3,690 µs = ours | 3,690 µs | 5,325 µs differsTable 2 | all 12 rules hold |
| the same, with the code as of 2024 (junction entry and exit 100 µs each) the switch joins every pair of junctions by two parallel segments, an all-to-all junction network; our language describes surface traps, which cannot hold it, so it is replayed but not drawn | 5,325 µs = ours | 5,325 µs | 5,325 µs equalTable 2 | all 12 rules hold |
The same grids with the authors' fix (afbd1b4, 2026-10-22)
afbd1b4 hands the circuit's layer barriers to the router, so every qubit keeps the circuit's gate order; it also adds pass_barriers=False, which orders the same operations by the components' happens-before relation alone, without barriers. Both are run here at every distance, with the same driver as above. The operations, and each ion's route, are the same as at d235a22.
| configuration | start of the last step: their code | our replay | the paper's rules |
|---|---|---|---|
| rotated surface code d=2, one round, grid, capacity 2, layer barriers (the default) ▶ watch it in the Studio | 4,010 µs = ours | 4,010 µs | all 12 rules hold |
| rotated surface code d=3, one round, grid, capacity 2, layer barriers (the default) ▶ watch it in the Studio | 4,010 µs = ours | 4,010 µs | all 12 rules hold |
| rotated surface code d=6, one round, grid, capacity 2, layer barriers (the default) ▶ watch it in the Studio | 4,010 µs = ours | 4,010 µs | all 12 rules hold |
| rotated surface code d=12, one round, grid, capacity 2, layer barriers (the default) ▶ watch it in the Studio | 4,010 µs = ours | 4,010 µs | all 12 rules hold |
| rotated surface code d=2, one round, grid, capacity 2, pass_barriers=False ▶ watch it in the Studio | 3,405 µs = ours | 3,405 µs | all 12 rules hold |
| rotated surface code d=3, one round, grid, capacity 2, pass_barriers=False ▶ watch it in the Studio | 3,415 µs = ours | 3,415 µs | all 12 rules hold |
| rotated surface code d=6, one round, grid, capacity 2, pass_barriers=False ▶ watch it in the Studio | 3,405 µs = ours | 3,405 µs | all 12 rules hold |
| rotated surface code d=12, one round, grid, capacity 2, pass_barriers=False ▶ watch it in the Studio | 3,415 µs = ours | 3,415 µs | all 12 rules hold |
Made by sched_jones, a scheduler we wrote for this comparison; it is not the compiler that compiles this website's leaderboard entries. It keeps the paper's device, its placement of qubits in traps, its native decomposition of H and CNOT and its timing law, and changes each ancilla's tour and the scheduling.
The same grid, the same placement of qubits in traps, the paper's operation times and its rule that an operation holds every component it names (a split or merge also holds the junction at the far end of its segment, an entry or exit holds the junction and the segment). Every qubit meets its CNOT partners in the order of the paper's circuit file, even where two CNOTs commute: the order is the circuit's, not ours to change. Each ancilla visits its data in that order instead of going home after every gate: straight from one data qubit to the next when both lie around the same end of its trap, and through its own empty trap when the next lies around the other end; it comes home to be measured. It always leaves a data trap by the end it came in, so no gate swap is needed. There are no barriers: a junction lets ions through in the order of the circuit's CNOT layers, and every ion ends in the trap it started in. Each schedule below is replayed by the same checker as the paper's, with the same timing law and circuit; an operation the paper's law does not price is refused.
| configuration | start of the last step: their code, fixed, without barriers | ours | their code, fixed, with layer barriers | as published (d235a22) | the paper's rules | |||
|---|---|---|---|---|---|---|---|---|
| rotated surface code d=2, one round, grid, capacity 2 against: rotated surface code d=2, one round, grid, capacity 2, pass_barriers=False ▶ watch ours in the Studio | 3,405 µs | 2,850 µs | 1.19× faster | 4,010 µs | 1.41× faster | 4,055 µs * | 1.42× faster | all 12 rules hold under the paper's rules, its declared locks included, each qubit's order kept |
| rotated surface code d=3, one round, grid, capacity 2 against: rotated surface code d=3, one round, grid, capacity 2, pass_barriers=False ▶ watch ours in the Studio | 3,415 µs | 3,010 µs | 1.13× faster | 4,010 µs | 1.33× faster | 4,085 µs * | 1.36× faster | all 12 rules hold under the paper's rules, its declared locks included, each qubit's order kept |
| rotated surface code d=6, one round, grid, capacity 2 against: rotated surface code d=6, one round, grid, capacity 2, pass_barriers=False ▶ watch ours in the Studio | 3,405 µs | 3,085 µs | 1.10× faster | 4,010 µs | 1.30× faster | 4,080 µs * | 1.32× faster | all 12 rules hold under the paper's rules, its declared locks included, each qubit's order kept |
| rotated surface code d=12, one round, grid, capacity 2 against: rotated surface code d=12, one round, grid, capacity 2, pass_barriers=False ▶ watch ours in the Studio | 3,415 µs | 3,070 µs | 1.11× faster | 4,010 µs | 1.31× faster | 4,085 µs * | 1.33× faster | all 12 rules hold under the paper's rules, its declared locks included, each qubit's order kept |
* that schedule fails the paper's own rules (see the note above), so it is shown for reference only.
Like for like, ours is compared with the authors' fixed code run without barriers (pass_barriers=False), which orders operations by the same happens-before discipline as ours: both keep every qubit's gates in the circuit's order, and each ion's own operations (gates, rotations, measurement, reset) are the same, with the same partners in the same order. The difference is the ancilla tours. Theirs sends each ancilla to one data qubit and back for every CNOT; ours visits its data in turn, with fewer splits, merges and junction crossings (42 of each against 48 at d = 3, 924 against 1,056 at d = 12). In the circuit's order one kind of check ancilla meets both data qubits around one end of its trap and then both around the other (6 trips), while the other kind alternates ends (8 trips); those tours set the round's length, about the same at every distance. The table gives the start of the last operation, the time the paper reports; for every schedule here it is a final reset, 50 µs before the end.
The rules each run is judged by
This paper's model is written as the rule set Surface-code QCCD's rules. Every run above was replayed and each rule of the set evaluated on it. Our schedules are held to the same rules, and also keep each qubit's gates in the circuit's exact order (R25): we may not reorder a circuit, even where its gates commute.
| run | R0 | R1 | R2 | R3 | R6b | R8 | R14 | R24 | R25 | R26 | R27 | R29 | R30 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| rotated surface code d=2, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✗ 1 | ✓ | ✓ | ✓ |
| rotated surface code d=3, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✗ 1 | ✓ | ✓ | ✓ |
| rotated surface code d=6, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✗ 1 | ✓ | ✓ | ✓ |
| rotated surface code d=12, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✗ 1 | ✓ | ✓ | ✓ |
| rotated surface code d=2, one round, grid, capacity 2, layer barriers (the default) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=3, one round, grid, capacity 2, layer barriers (the default) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=6, one round, grid, capacity 2, layer barriers (the default) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=12, one round, grid, capacity 2, layer barriers (the default) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=2, one round, grid, capacity 2, pass_barriers=False | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=3, one round, grid, capacity 2, pass_barriers=False | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=6, one round, grid, capacity 2, pass_barriers=False | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=12, one round, grid, capacity 2, pass_barriers=False | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| repetition code d=3, linear, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| repetition code d=3, linear, capacity 3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| repetition code d=3, linear, capacity 4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| rotated surface code d=3, switch, capacity 2 (current code) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| the same, with the code as of 2024 (junction entry and exit 100 µs each) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ |
| ours: rotated surface code d=2, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ |
| ours: rotated surface code d=3, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ |
| ours: rotated surface code d=6, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ |
| ours: rotated surface code d=12, one round, grid, capacity 2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ |
✓ the rule holds on that run; ✗ it fails, with the number of counterexamples (hover for the first); – it does not apply to that run (hover for why); · the rule is not in that run's rule set.
what each rule says
setup_ok() and (for all o in operations: well_formed(o) and found(o)) and (for all i in ions: position(i, final()) != none)Each operation names its ions and where they are; replaying the execution from the start must find them there, and every ion must end it standing in a site.
for all s in sites, t in instants: occupancy(s, t) <= capacity(s)An ion standing in a site, or passing through it, takes one of its places.
for all j in junctions, t in instants: occupancy(j, t) <= 1Where three or more rails meet, only one ion may be at any moment, resting or passing through.
for all r in rails, t in instants: occupancy(r, t) <= capacity(r)No more ions travel along one rail at once than the rail is built for (one, on most devices).
(for all g in two_qubit_gates, i in ions(g): position(i, start(g)) = site(g)) and (for all g in two_qubit_gates where size(declared_sites(g)) > 0: site(g) in declared_sites(g))Both ions of a two-qubit gate are in the same trap when it starts, and in the trap the programme names for it, if it names one.
for all a, b in operations where a != b and simultaneous(a, b): disjoint(ions(a), ions(b))No ion takes part in two operations at once: it cannot be gated in one place while it is carried to another.
for all m in splits: at_chain_end(m) or swap_paid(m)An ion leaves its chain from the end that faces the rail; an ion further in must first be swapped to that end, which costs gates.
(for all c in circuit_ops where needs_gate(c): gate_count(c) >= 1) and (for all g in two_qubit_gates: serves_circuit(g))Each two-qubit gate of the input circuit is carried out, and the execution performs no two-qubit gate the circuit does not ask for.
for all c1, c2 in circuit_ops where next_on_qubit(c1, c2) and performed(c1) and performed(c2): end(last(c1)) <= start(first(c2))On every qubit, each operation is over before the next one on that qubit begins, in the order the circuit is written -- even where two of them would commute.
for all c1, c2 in circuit_ops where next_run(c1, c2) and performed(c1) and performed(c2): end(last(c1)) <= start(first(c2))As R25, except that consecutive CNOTs in which a qubit plays the same role (always the control, or always the target) commute, and may run in any order among themselves.
for all a, b in operations where a != b and kind(a) in serial_kinds and kind(b) in serial_kinds and site(a) = site(b) and site(a) != none: not simultaneous(a, b)The operations of the kinds listed in serial_kinds hold their trap: two of them in one trap never overlap in time.
for all o in operations where clocked(o): approx(duration(o), clock(o))Each operation's duration is the one the model's duration law gives it.
for all a, b in operations where a != b and simultaneous(a, b): disjoint(locks(a), locks(b))The schedule states, for every operation, the components it holds while it runs; two operations naming one component never overlap in time.
The Studio's runtime is not the schedule's time. A Studio page plays a schedule as a programme in our language: operations of one kind that start at the same moment are one instruction, and each instruction starts when the one before it has ended, so the runtime in the Studio's price bar is its instructions added up. For rotated surface code d=6, one round, grid, capacity 2, pass_barriers=False that sum is 14,820 µs for Surface-code QCCD's schedule and 24,485 µs for ours; on Surface-code QCCD's clock, where operations overlap whenever the paper's rules allow, the same schedules take 3,405 µs and 3,085 µs (each to the start of its last step, as the paper counts). The tables above, and each Studio page's headline, give the time on the paper's clock; the sums are not times either schedule takes, and do not rank them.