From 56f28d9dc6b5e55862f54e66a3e739efc83bca38 Mon Sep 17 00:00:00 2001 From: Julien Gacon Date: Thu, 25 Aug 2022 14:00:46 +0200 Subject: [PATCH] Fix decomposition for a single qubit and clbit --- qiskit/transpiler/passes/basis/decompose.py | 6 +++++- .../notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml | 13 +++++++++++++ test/python/transpiler/test_decompose.py | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml diff --git a/qiskit/transpiler/passes/basis/decompose.py b/qiskit/transpiler/passes/basis/decompose.py index fb5a929e0f37..86e744740068 100644 --- a/qiskit/transpiler/passes/basis/decompose.py +++ b/qiskit/transpiler/passes/basis/decompose.py @@ -91,7 +91,11 @@ def run(self, dag: DAGCircuit) -> DAGCircuit: continue # TODO: allow choosing among multiple decomposition rules rule = node.op.definition.data - if len(rule) == 1 and len(node.qargs) == len(rule[0].qubits) == 1: + if ( + len(rule) == 1 + and len(node.qargs) == len(rule[0].qubits) == 1 # to preserve gate order + and len(node.cargs) == len(rule[0].clbits) == 0 + ): if node.op.definition.global_phase: dag.global_phase += node.op.definition.global_phase dag.substitute_node(node, rule[0].operation, inplace=True) diff --git a/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml b/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml new file mode 100644 index 000000000000..74d8d1faa83b --- /dev/null +++ b/releasenotes/notes/fix-decomp-1q-1c-84f369f9a897a5b7.yaml @@ -0,0 +1,13 @@ +--- +fixes: + - | + Fixed a bug where decomposing an instruction with one qubit and one classical bit + containing a single quantum gate failed. Now the following decomposes as expected:: + + block = QuantumCircuit(1, 1) + block.h(0) + + circuit = QuantumCircuit(1, 1) + circuit.append(block, [0], [0]) + + decomposed = circuit.decompose() diff --git a/test/python/transpiler/test_decompose.py b/test/python/transpiler/test_decompose.py index 1a0aaf4a4b68..2664a00c7fbb 100644 --- a/test/python/transpiler/test_decompose.py +++ b/test/python/transpiler/test_decompose.py @@ -300,3 +300,18 @@ def test_decompose_reps(self): decom_circ = self.complex_circuit.decompose(reps=2) decomposed = self.complex_circuit.decompose().decompose() self.assertEqual(decom_circ, decomposed) + + def test_decompose_single_qubit_clbit(self): + """Test the decomposition of a block with a single qubit and clbit works. + + Regression test of Qiskit/qiskit-terra#8591. + """ + block = QuantumCircuit(1, 1) + block.h(0) + + circuit = QuantumCircuit(1, 1) + circuit.append(block, [0], [0]) + + decomposed = circuit.decompose() + + self.assertEqual(decomposed, block)