File size: 1,577 Bytes
9f8cf99 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | """Walking dynamic surface code circuit builder."""
from __future__ import annotations
from typing import Dict, Optional
from surface_code_in_stem.noise_models import NoiseModel
from .base import DynamicLayout, StimStringBuilder, stabilizer_cycle
def walking_surface_code(distance: int, rounds: int, p: float, noise_model: Optional[NoiseModel] = None) -> str:
"""Return a Stim circuit string for the walking surface code.
Each cycle swaps which sublattice receives a reset so that every physical
qubit is refreshed every other round. Detectors stitch consecutive
measurements of the same plaquette to expose leakage-induced correlations.
"""
layout = DynamicLayout.build(distance)
index_to_coord = {idx: coord for coord, idx in layout.coord_to_index.items()}
builder = StimStringBuilder(coord_lookup=index_to_coord)
builder.qubit_coords()
prev_meas: Dict[tuple[float, float], int] = {}
orientations = (0, 1, 2, 3)
for cycle in range(rounds):
reset_data = cycle % 2 == 1
measure_data = cycle % 2 == 1
prev_meas = stabilizer_cycle(
builder,
layout,
p=p,
orientations=orientations,
gate="CX",
noise_model=noise_model,
reset_data=reset_data,
measure_data=measure_data,
prev_meas=prev_meas,
)
data_indices = [layout.coord_to_index[c] for c in layout.datas[:distance]]
logical_meas = builder.measure(data_indices)
builder.observable(logical_meas)
return builder.build()
|