Skip to content

Simple layout

PhysicalLayoutHeuristicFixed dataclass

PhysicalLayoutHeuristicFixed(
    arch_spec: ArchSpec = get_physical_layout_arch_spec(),
)

Bases: LayoutHeuristicABC


              flowchart TD
              bloqade.lanes.heuristics.simple_layout.PhysicalLayoutHeuristicFixed[PhysicalLayoutHeuristicFixed]
              bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC[LayoutHeuristicABC]

                              bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC --> bloqade.lanes.heuristics.simple_layout.PhysicalLayoutHeuristicFixed
                


              click bloqade.lanes.heuristics.simple_layout.PhysicalLayoutHeuristicFixed href "" "bloqade.lanes.heuristics.simple_layout.PhysicalLayoutHeuristicFixed"
              click bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC href "" "bloqade.lanes.analysis.layout.analysis.LayoutHeuristicABC"
            

compute_layout

compute_layout(
    all_qubits: tuple[int, ...],
    stages: list[tuple[tuple[int, int], ...]],
    pinned: dict[int, LocationAddress] | None = None,
) -> tuple[LocationAddress, ...]

Compute the initial qubit layout from circuit stages.

Parameters:

Name Type Description Default
all_qubits tuple[int, ...]

Tuple of logical qubit indices to be mapped.

required
stages list[tuple[tuple[int, int], ...]]

List of circuit stages, where each stage is a tuple of (control, target) qubit pairs representing two-qubit gates.

required
pinned dict[int, LocationAddress] | None

Map from logical qubit ID to pre-pinned LocationAddress. Implementations MUST place each pinned qubit at its requested address and MUST NOT use any address in pinned.values() for un-pinned qubits. None or empty preserves previous behavior. All values in pinned MUST be valid home positions for the architecture (i.e. present in arch_spec.home_sites); passing an out-of-arch address raises ValueError.

None

Returns:

Type Description
LocationAddress

A tuple of LocationAddress objects mapping logical qubit indices

...

to physical locations. Pinned IDs return their pinned address;

tuple[LocationAddress, ...]

un-pinned IDs return the heuristic's choice. Raises if no legal

tuple[LocationAddress, ...]

layout exists.

Source code in .venv/lib/python3.12/site-packages/bloqade/lanes/heuristics/simple_layout.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def compute_layout(
    self,
    all_qubits: tuple[int, ...],
    stages: list[tuple[tuple[int, int], ...]],
    pinned: dict[int, LocationAddress] | None = None,
) -> tuple[LocationAddress, ...]:
    _ = stages
    pinned = {} if pinned is None else pinned
    if len(set(pinned.values())) < len(pinned):
        raise ValueError(
            "pinned addresses must be unique; two qubit IDs share the same address"
        )
    extra_keys = set(pinned) - set(all_qubits)
    if extra_keys:
        raise ValueError(
            f"pinned contains qubit IDs not in all_qubits: {sorted(extra_keys)}"
        )
    self._validate_pinned_in_arch(pinned, self.arch_spec)
    qubits = tuple(sorted(all_qubits))

    pinned_addresses: set[LocationAddress] = set(pinned.values())

    candidates: list[LocationAddress] = []
    for word_id in self.home_word_ids:
        for site_id in range(self.sites_per_home_word):
            addr = LocationAddress(word_id, site_id)
            if addr not in pinned_addresses:
                candidates.append(addr)

    unpinned_qubits = [q for q in qubits if q not in pinned]
    if len(unpinned_qubits) > len(candidates):
        raise ValueError(
            f"layout heuristic cannot place {len(unpinned_qubits)} un-pinned qubits: "
            f"arch provides {len(candidates) + len(pinned_addresses)} total sites, "
            f"{len(pinned_addresses)} are pinned, leaving {len(candidates)} available; "
            "no legal positions remain"
        )

    result = dict(zip(unpinned_qubits, candidates)) | pinned
    return tuple(result[q] for q in qubits)