diff --git a/src/iqm/qiskit_iqm/iqm_transpilation.py b/src/iqm/qiskit_iqm/iqm_transpilation.py index b30d4df5..6917eb2d 100644 --- a/src/iqm/qiskit_iqm/iqm_transpilation.py +++ b/src/iqm/qiskit_iqm/iqm_transpilation.py @@ -19,6 +19,7 @@ from qiskit.circuit.library import RGate from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler.basepasses import TransformationPass +from qiskit.transpiler.layout import Layout from qiskit.transpiler.passes import BasisTranslator, Optimize1qGatesDecomposition, RemoveBarriers from qiskit.transpiler.passmanager import PassManager @@ -53,6 +54,8 @@ def __init__(self, drop_final_rz: bool = False, ignore_barriers: bool = False): def run(self, dag: DAGCircuit) -> DAGCircuit: self._validate_ops(dag) + layout = Layout.generate_trivial_layout(*dag.qregs.values()) + self.property_set['layout'] = layout # accumulated RZ angles for each qubit, from the beginning of the circuit to the current gate rz_angles: list[float] = [0] * dag.num_qubits() if self._ignore_barriers: diff --git a/tests/test_iqm_transpilation.py b/tests/test_iqm_transpilation.py index 95d5e00a..1353aedd 100644 --- a/tests/test_iqm_transpilation.py +++ b/tests/test_iqm_transpilation.py @@ -127,3 +127,22 @@ def test_submitted_circuit(adonis_architecture): 'measure:2', 'measure:4', ] + + +def test_optimize_single_qubit_gates_preserves_layout(): + circuit = QuantumCircuit(3) + circuit.h(0) + circuit.cx(0, 1) + circuit.x(2) + + transpiled_circuit = transpile(circuit, basis_gates=['r', 'cz'], initial_layout=[0, 1, 2]) + optimized_circuit = optimize_single_qubit_gates(transpiled_circuit) + + # Check if the layout is preserved + assert optimized_circuit.layout is not None + assert optimized_circuit.layout.initial_layout is not None + + expected_layout = {0: 0, 1: 1, 2: 2} + actual_layout = {qubit._index: optimized_circuit.layout.initial_layout[qubit] for qubit in optimized_circuit.qubits} + + assert actual_layout == expected_layout