-
Notifications
You must be signed in to change notification settings - Fork 19
Description
Feature Description
-
Introduce a .segment() method to
pyqasm.QasmModulethat partitions quantum circuits into independent segments where no entanglement exists between segments. -
Each segment is returned as a standalone
QasmModuleobject containing:- Remapped qubit registers (e.g., PYQASM_SEGMENT_0[i])
- Gates acting exclusively on the segment's qubits
-
Key constraints:
- We use entangling gates to define an "independently executable segment". Raises an error if the circuit contains measurements or classical controls (unsupported in v1).
- Qubit order in new registers follows first occurrence in the original circuit.
Motivation
- Parallel Execution: Enables independent segment execution across multiple QPUs.
- Resource Optimization: Splits large circuits for execution on smaller devices.
- Error Containment: Isolates quantum errors to individual segments.
Implementation (Optional)
Preprocessing:
-
Validate absence of measurements/classical controls.
-
Construct a qubit connectivity graph using multi-qubit gates (edges connect interacting qubits).
Segmentation Algorithm:
-
Identify connected components in the graph → segments. Should essentially be a disjoint set union amongst all the qubits present in our program. Inspired by the
BlockSplitterin qiskit'sdag_circuit.collect_blocks -
For each segment:
-
Create a new register
qubit[N] __PYQASM_SEGMENT_<idx>__(N = segment qubit count). -
Remap original qubits to new register indices ordered by first gate occurrence.
-
Module Generation:
- Clone original module headers (OPENQASM 3.0, includes).
- Replace original gates with remapped operations.
- Preserve gate order within segments.
Edge Cases:
- All Single-qubit gates → Divide into a default segment count (say 10) as all qubits are disjoint
- Empty circuits → No OP
Example flow
from pyqasm import loads
qasm_code = """
OPENQASM 3.0;
qubit[4] q;
h q[0];
cx q[0], q[1];
h q[2];
cx q[2], q[3];
"""
module = loads(qasm_code)
segments = module.segment() # Returns 2 QasmModules
print(segments[0])
# Output:
# OPENQASM 3.0;
# qubit[2] __PYQASM_SEGMENT_0__;
# h __PYQASM_SEGMENT_0__[0];
# cx __PYQASM_SEGMENT_0__[0], __PYQASM_SEGMENT_0__[1];
print(segments[1])
# Output:
# OPENQASM 3.0;
# qubit[2] __PYQASM_SEGMENT_1__;
# h __PYQASM_SEGMENT_1__[0];
# cx __PYQASM_SEGMENT_1__[0], __PYQASM_SEGMENT_1__[1];This is a first draft where we return a list of modules but can potentially be changed in-place addition of these segments to existing module