feat(profiles): add IQMEmerald() — Crystal 54 full device profile#26
Conversation
0086cb2 to
3e10b32
Compare
|
I imagine it may be best to split this file up so we have: 1 file per device profile, all living in a "profiles" folder |
f50c274 to
2b7c185
Compare
jack-champagne
left a comment
There was a problem hiding this comment.
Looks good! The other data besides the TransmonQubit constructor I think we could have as a tabular file - maybe something like: iqm_emerald_2026-06-09.toml with a loader here that extracts the T1, T2, per-qubit PRX err, topology + per-edge CZ err`. That way we're updating that file instead of this one when recalibration data updates our numbers here (and we can backtest on old cal data easily).
Just a few nits otherwise!
| 11.20, | ||
| 32.53, | ||
| 11.56, | ||
| 0.00, |
There was a problem hiding this comment.
might be a bit dangerous to be setting t2 as 0.0 - let's set as NaN so that this blows up noisily!
| qubits = [ | ||
| TransmonQubit(4.20, 0.180, 3), # QB1 T1=46.4 T2=17.9 PRX_err=3.01e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB2 T1=24.9 T2=18.0 PRX_err=3.75e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB3 T1=42.4 T2=48.0 PRX_err=3.00e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB4 T1=39.8 T2=12.3 PRX_err=5.53e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB5 T1=37.5 T2=21.9 PRX_err=7.13e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB6 T1=56.5 T2=13.0 PRX_err=2.90e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB7 T1=66.0 T2=19.9 PRX_err=5.84e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB8 T1=36.9 T2=33.4 PRX_err=9.16e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB9 T1=47.2 T2=4.3 PRX_err=4.49e-03 | ||
| TransmonQubit(4.40, 0.180, 3), # QB10 T1=50.4 T2=52.1 PRX_err=3.56e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB11 T1=20.9 T2=12.2 PRX_err=5.51e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB12 T1=61.2 T2=18.1 PRX_err=2.06e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB13 T1=32.3 T2=11.7 PRX_err=1.09e-03 | ||
| TransmonQubit(4.40, 0.180, 3), # QB14 T1=45.3 T2=14.4 PRX_err=9.24e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB15 T1=32.3 T2=21.0 PRX_err=6.02e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB16 T1=55.7 T2=9.0 PRX_err=4.29e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB17 T1=46.8 T2=13.7 PRX_err=6.57e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB18 T1=57.1 T2=17.7 PRX_err=4.29e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB19 T1=54.1 T2=30.3 PRX_err=5.40e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB20 T1=66.1 T2=14.3 PRX_err=2.20e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB21 T1=50.5 T2=8.2 PRX_err=3.84e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB22 T1=56.0 T2=13.2 PRX_err=3.32e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB23 T1=60.4 T2=26.4 PRX_err=2.48e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB24 T1=62.1 T2=18.0 PRX_err=9.57e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB25 T1=46.3 T2=19.3 PRX_err=2.88e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB26 T1=49.4 T2=9.2 PRX_err=6.76e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB27 T1=49.0 T2=11.6 PRX_err=3.10e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB28 T1=50.0 T2=8.4 PRX_err=2.70e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB29 T1=48.0 T2=12.4 PRX_err=3.65e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB30 T1=58.1 T2=49.4 PRX_err=8.89e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB31 T1=48.9 T2=14.4 PRX_err=3.56e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB32 T1=33.6 T2=14.9 PRX_err=5.30e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB33 T1=50.0 T2=7.3 PRX_err=4.65e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB34 T1=64.5 T2=9.2 PRX_err=3.49e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB35 T1=39.0 T2=13.0 PRX_err=5.73e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB36 T1=55.7 T2=8.4 PRX_err=2.92e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB37 T1=54.8 T2=16.7 PRX_err=3.05e-03 | ||
| TransmonQubit(4.40, 0.180, 3), # QB38 T1=64.7 T2=10.2 PRX_err=3.51e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB39 T1=64.1 T2=33.3 PRX_err=3.05e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB40 T1=51.2 T2=15.0 PRX_err=3.59e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB41 T1=45.6 T2=2.5 PRX_err=3.86e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB42 T1=37.9 T2=15.3 PRX_err=9.51e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB43 T1=40.5 T2=11.2 PRX_err=3.44e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB44 T1=65.3 T2=32.5 PRX_err=1.13e-03 | ||
| TransmonQubit(4.20, 0.180, 3), # QB45 T1=43.5 T2=11.6 PRX_err=3.32e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB46 T1=51.9 T2=0.0 PRX_err=1.14e-01 ← broken | ||
| TransmonQubit(4.20, 0.180, 3), # QB47 T1=19.5 T2=12.7 PRX_err=5.12e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB48 T1=65.3 T2=6.1 PRX_err=2.72e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB49 T1=75.4 T2=16.5 PRX_err=1.91e-03 | ||
| TransmonQubit(4.40, 0.180, 3), # QB50 T1=54.6 T2=50.5 PRX_err=2.58e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB51 T1=50.9 T2=27.6 PRX_err=6.58e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB52 T1=58.2 T2=21.7 PRX_err=3.57e-04 | ||
| TransmonQubit(4.20, 0.180, 3), # QB53 T1=55.7 T2=18.2 PRX_err=2.10e-04 | ||
| TransmonQubit(4.40, 0.180, 3), # QB54 T1=47.7 T2=14.5 PRX_err=3.40e-04 | ||
| ] |
There was a problem hiding this comment.
We can replace most of this with a list comprehension (minus the comments, but those are duplicated down below).
| qubits = [ | |
| TransmonQubit(4.20, 0.180, 3), # QB1 T1=46.4 T2=17.9 PRX_err=3.01e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB2 T1=24.9 T2=18.0 PRX_err=3.75e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB3 T1=42.4 T2=48.0 PRX_err=3.00e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB4 T1=39.8 T2=12.3 PRX_err=5.53e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB5 T1=37.5 T2=21.9 PRX_err=7.13e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB6 T1=56.5 T2=13.0 PRX_err=2.90e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB7 T1=66.0 T2=19.9 PRX_err=5.84e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB8 T1=36.9 T2=33.4 PRX_err=9.16e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB9 T1=47.2 T2=4.3 PRX_err=4.49e-03 | |
| TransmonQubit(4.40, 0.180, 3), # QB10 T1=50.4 T2=52.1 PRX_err=3.56e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB11 T1=20.9 T2=12.2 PRX_err=5.51e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB12 T1=61.2 T2=18.1 PRX_err=2.06e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB13 T1=32.3 T2=11.7 PRX_err=1.09e-03 | |
| TransmonQubit(4.40, 0.180, 3), # QB14 T1=45.3 T2=14.4 PRX_err=9.24e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB15 T1=32.3 T2=21.0 PRX_err=6.02e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB16 T1=55.7 T2=9.0 PRX_err=4.29e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB17 T1=46.8 T2=13.7 PRX_err=6.57e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB18 T1=57.1 T2=17.7 PRX_err=4.29e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB19 T1=54.1 T2=30.3 PRX_err=5.40e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB20 T1=66.1 T2=14.3 PRX_err=2.20e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB21 T1=50.5 T2=8.2 PRX_err=3.84e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB22 T1=56.0 T2=13.2 PRX_err=3.32e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB23 T1=60.4 T2=26.4 PRX_err=2.48e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB24 T1=62.1 T2=18.0 PRX_err=9.57e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB25 T1=46.3 T2=19.3 PRX_err=2.88e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB26 T1=49.4 T2=9.2 PRX_err=6.76e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB27 T1=49.0 T2=11.6 PRX_err=3.10e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB28 T1=50.0 T2=8.4 PRX_err=2.70e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB29 T1=48.0 T2=12.4 PRX_err=3.65e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB30 T1=58.1 T2=49.4 PRX_err=8.89e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB31 T1=48.9 T2=14.4 PRX_err=3.56e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB32 T1=33.6 T2=14.9 PRX_err=5.30e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB33 T1=50.0 T2=7.3 PRX_err=4.65e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB34 T1=64.5 T2=9.2 PRX_err=3.49e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB35 T1=39.0 T2=13.0 PRX_err=5.73e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB36 T1=55.7 T2=8.4 PRX_err=2.92e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB37 T1=54.8 T2=16.7 PRX_err=3.05e-03 | |
| TransmonQubit(4.40, 0.180, 3), # QB38 T1=64.7 T2=10.2 PRX_err=3.51e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB39 T1=64.1 T2=33.3 PRX_err=3.05e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB40 T1=51.2 T2=15.0 PRX_err=3.59e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB41 T1=45.6 T2=2.5 PRX_err=3.86e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB42 T1=37.9 T2=15.3 PRX_err=9.51e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB43 T1=40.5 T2=11.2 PRX_err=3.44e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB44 T1=65.3 T2=32.5 PRX_err=1.13e-03 | |
| TransmonQubit(4.20, 0.180, 3), # QB45 T1=43.5 T2=11.6 PRX_err=3.32e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB46 T1=51.9 T2=0.0 PRX_err=1.14e-01 ← broken | |
| TransmonQubit(4.20, 0.180, 3), # QB47 T1=19.5 T2=12.7 PRX_err=5.12e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB48 T1=65.3 T2=6.1 PRX_err=2.72e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB49 T1=75.4 T2=16.5 PRX_err=1.91e-03 | |
| TransmonQubit(4.40, 0.180, 3), # QB50 T1=54.6 T2=50.5 PRX_err=2.58e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB51 T1=50.9 T2=27.6 PRX_err=6.58e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB52 T1=58.2 T2=21.7 PRX_err=3.57e-04 | |
| TransmonQubit(4.20, 0.180, 3), # QB53 T1=55.7 T2=18.2 PRX_err=2.10e-04 | |
| TransmonQubit(4.40, 0.180, 3), # QB54 T1=47.7 T2=14.5 PRX_err=3.40e-04 | |
| ] | |
| qubits = [TransmonQubit(isodd(i) ? 4.20 : 4.40, 0.180, 3) for i in 1:54] |
The other data I think we could have as a tabular file - maybe something like: iqm_emerald_2026-06-09.toml with a loader here that extracts the T1, T2, per-qubit PRX err, topology + per-edge CZ err`
Adds IQMEmerald(), a TransmonDevice profile for the full 54-qubit IQM Emerald Crystal 54 QPU. All calibration data lives in src/data/iqm_emerald_2026-06-09.toml — IQMEmerald() is pure construction logic; recalibration = update the data file only. - All 83 connected pairs from Crystal 54 topology with CZ fidelities from IRB calibration - T1, T2 Ramsey, and PRX fidelities from 2026-06-09 calibration snapshot - Qubit frequencies and coupling strengths estimated from arXiv:2603.11018 - QB46 non-functional: T2 = NaN so arithmetic on this qubit fails loudly - Native gate specs (PRX 20 ns, CZ 40 ns) loaded from TOML Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2125c9d to
d838e5f
Compare
|
Awesome! Thanks @kateebonner 🎉 |
Summary
IQMEmerald(), aTransmonDeviceprofile for the full 54-qubit IQM Emerald Crystal 54 QPU🤖 Generated with Claude Code