diff --git a/crates/accelerate/src/synthesis/multi_controlled/mcmt.rs b/crates/accelerate/src/synthesis/multi_controlled/mcmt.rs index 7569740768a1..80128b077e7d 100644 --- a/crates/accelerate/src/synthesis/multi_controlled/mcmt.rs +++ b/crates/accelerate/src/synthesis/multi_controlled/mcmt.rs @@ -104,6 +104,7 @@ pub fn mcmt_v_chain( } let packed_controlled_gate = controlled_gate.operation; + let gate_params = controlled_gate.params; let num_qubits = if num_ctrl_qubits > 1 { 2 * num_ctrl_qubits - 1 + num_target_qubits } else { @@ -135,7 +136,7 @@ pub fn mcmt_v_chain( let targets = (0..num_target_qubits).map(|i| { Ok(( packed_controlled_gate.clone(), - smallvec![] as SmallVec<[Param; 3]>, + gate_params.clone(), vec![Qubit::new(master_control), Qubit::new(num_ctrl_qubits + i)], vec![] as Vec, )) diff --git a/qiskit/synthesis/multi_controlled/mcmt_vchain.py b/qiskit/synthesis/multi_controlled/mcmt_vchain.py index ef565345dd08..a733f7b7fcca 100644 --- a/qiskit/synthesis/multi_controlled/mcmt_vchain.py +++ b/qiskit/synthesis/multi_controlled/mcmt_vchain.py @@ -43,6 +43,9 @@ def synth_mcmt_vchain( └───┘ └───┘ """ + if gate.num_qubits != 1: + raise ValueError("Only single qubit gates are supported as input.") + circ = QuantumCircuit._from_circuit_data( mcmt_v_chain(gate.control(), num_ctrl_qubits, num_target_qubits, ctrl_state) ) diff --git a/test/python/circuit/library/test_mcmt.py b/test/python/circuit/library/test_mcmt.py index c7903602b6e2..ead6a07d8b4d 100644 --- a/test/python/circuit/library/test_mcmt.py +++ b/test/python/circuit/library/test_mcmt.py @@ -18,13 +18,14 @@ from qiskit.exceptions import QiskitError from qiskit.compiler import transpile -from qiskit.circuit import QuantumCircuit, QuantumRegister +from qiskit.circuit import QuantumCircuit, QuantumRegister, Parameter from qiskit.circuit.library import ( MCMT, MCMTVChain, CHGate, XGate, ZGate, + RYGate, CXGate, CZGate, MCMTGate, @@ -264,6 +265,24 @@ def test_invalid_base_gate_width(self): with self.assertRaises(ValueError): _ = MCMTGate(gate, 10, 2) + def test_invalid_base_gate_width_synthfun(self): + """Test only 1-qubit base gates are accepted.""" + for gate in [GlobalPhaseGate(0.2), SwapGate()]: + with self.subTest(gate=gate): + with self.assertRaises(ValueError): + _ = synth_mcmt_vchain(gate, 10, 2) + + def test_gate_with_parameters_vchain(self): + """Test a gate with parameters as base gate.""" + theta = Parameter("th") + gate = RYGate(theta) + num_target = 3 + circuit = synth_mcmt_vchain(gate, num_ctrl_qubits=10, num_target_qubits=num_target) + + self.assertEqual(circuit.count_ops().get("cry", 0), num_target) + self.assertEqual(circuit.num_parameters, 1) + self.assertIs(circuit.parameters[0], theta) + if __name__ == "__main__": unittest.main()