JADE QPU¶
JADE is the 100+ qubit analog quantum simulator from Pasqal, hosted in the JUNIQ facility.
Getting Access¶
Access to the JADE QPU is available via the Qaptiva device which accepts jobs written using myqlm framework. The pulses used in the job are built using the pulser library. If you haven't set up the access to Qaptiva yet, please follow the instructions in the Qaptiva access documentation to get started. Use the project name relevant to Pasqal when signing up on the JuDoor portal.
Submitting first job¶
A sample job to submit to JADE is shown below. It executes the AFM sequence on a 6 qubit register. It is implemented based on the pulser-myqlm AFM reference script.
import numpy as np
from pulser import InterpolatedWaveform, Pulse, Sequence
from pulser.devices import Device
from pulser_myqlm import IsingAQPU
# Connect to QLMaaS and instantiate the QPU
from qlmaas.qpus import JadeQPU as QPU
# from qlmaas.qpus import PasqalQPU1 as QPU # Use this line instead to connect to the Emulator instead of the real QPU
qpu = QPU()
# Build device and register from QPU specs
specs = qpu.get_specs()
device = Device.from_abstract_repr(specs.description)
register_layout = device.calibrated_register_layouts["TriangularLatticeLayout(61, 5.0µm)"]
register = register_layout.define_register(21, 26, 35, 39, 34, 25)
# Pulse parameters replicated from the reference script
omega_max = 0.8 * 2 * device.rabi_from_blockade(5.0)
u_amp = omega_max / 2.0
duration_us = 2
rabi_waveform = InterpolatedWaveform(
duration_us * 1000,
u_amp * np.array([1e-9, 0.16768532, 0.2, 0.2, 1e-9]),
times=np.linspace(0, 1, 5),
)
detuning_waveform = InterpolatedWaveform(
duration_us * 1000,
u_amp * np.array([-1.0, -0.54656236, 0.05762063, 0.3673201, 1.0]),
times=np.linspace(0, 1, 5),
)
interpolated_pulse = Pulse(rabi_waveform, detuning_waveform, 0)
# Build and submit the sequence
sequence = Sequence(register, device)
sequence.declare_channel("ising", "rydberg_global")
sequence.add(interpolated_pulse, "ising")
# Visualize the sequence
sequence.draw(draw_phase_area=True, draw_phase_shifts=True, draw_detuning_maps=True, draw_register=True, draw_qubit_amp=True, draw_qubit_det=True,)
# Submit the job to the QPU
job = IsingAQPU.convert_sequence_to_job(sequence, nbshots=10,)
async_results = qpu.submit(job)
Submitted a new batch: SJob94294
# Wait for the job to complete and print results
results = async_results.join()
results.plot()
print(results.meta_data)
{'n_samples': '10', 'n_qubits': '6', 'single_job': 'True'}
!!! note "Execution Time & Shots" The number of shots in the job here is set to 10 for demonstration purposes. You can increase this number to obtain better statistics in the results; however, be aware that this will linearly increase the execution time of the job on the QPU.
**Estimate:** As of 06.02.26, you can assume approximately **1 minute of execution time** on the QPU per 10 shots for this particular sequence.
!!! warning "Calibration Overhead" The example job uses a pre-calibrated layout. When an arbitrary layout is defined, the job requires calibration before execution.
This calibration process:
* Takes extra time.
* Is added to your compute hours usage.
* Remains valid and cached until the next major maintenance operation (usually occurring every few months).
*Note: After maintenance operations, calibrations are automatically performed again upon the reception of a new job.*
Further reading¶
More details on writing and submitting jobs can be seen via mainly these resources:
Here are some useful topics: