diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py index 4053fb0a5758..527d7ec5442e 100644 --- a/qiskit/qpy/binary_io/circuits.py +++ b/qiskit/qpy/binary_io/circuits.py @@ -252,7 +252,14 @@ def _read_instruction(file_obj, circuit, registers, custom_operations, version, if gate_name in {"IfElseOp", "WhileLoopOp"}: gate = gate_class(condition_tuple, *params) elif version >= 5 and issubclass(gate_class, ControlledGate): - if gate_name in {"MCPhaseGate", "MCU1Gate"}: + if gate_name in { + "MCPhaseGate", + "MCU1Gate", + "MCXGrayCode", + "MCXGate", + "MCXRecursive", + "MCXVChain", + }: gate = gate_class(*params, instruction.num_ctrl_qubits) else: gate = gate_class(*params) diff --git a/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml new file mode 100644 index 000000000000..5f594a561522 --- /dev/null +++ b/releasenotes/notes/fix-qpy-mcxgray-421cf8f673f24238.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed a bug in QPY (:mod:`qiskit.qpy`) where circuits containing gates of class + :class:`.MCXGate`, :class:`.MCXGrayCode`, and :class:`MCXRecursive`, and + :class:`.MCXVChain` would fail to serialize. + See `#9390 `__. diff --git a/test/python/circuit/test_circuit_load_from_qpy.py b/test/python/circuit/test_circuit_load_from_qpy.py index db4e62c5999a..349bca64f3f1 100644 --- a/test/python/circuit/test_circuit_load_from_qpy.py +++ b/test/python/circuit/test_circuit_load_from_qpy.py @@ -24,7 +24,18 @@ from qiskit.circuit.quantumregister import Qubit from qiskit.circuit.random import random_circuit from qiskit.circuit.gate import Gate -from qiskit.circuit.library import XGate, QFT, QAOAAnsatz, PauliEvolutionGate, DCXGate, MCU1Gate +from qiskit.circuit.library import ( + XGate, + QFT, + QAOAAnsatz, + PauliEvolutionGate, + DCXGate, + MCU1Gate, + MCXGate, + MCXGrayCode, + MCXRecursive, + MCXVChain, +) from qiskit.circuit.instruction import Instruction from qiskit.circuit.parameter import Parameter from qiskit.circuit.parametervector import ParameterVector @@ -1043,9 +1054,17 @@ def test_open_controlled_gate(self): def test_standard_control_gates(self): """Test standard library controlled gates.""" - qc = QuantumCircuit(3) + qc = QuantumCircuit(6) mcu1_gate = MCU1Gate(np.pi, 2) + mcx_gate = MCXGate(5) + mcx_gray_gate = MCXGrayCode(5) + mcx_recursive_gate = MCXRecursive(4) + mcx_vchain_gate = MCXVChain(3) qc.append(mcu1_gate, [0, 2, 1]) + qc.append(mcx_gate, list(range(0, 6))) + qc.append(mcx_gray_gate, list(range(0, 6))) + qc.append(mcx_recursive_gate, list(range(0, 5))) + qc.append(mcx_vchain_gate, list(range(0, 5))) qc.mcp(np.pi, [0, 2], 1) qc.mct([0, 2], 1) qc.mcx([0, 2], 1)