@@ -55,6 +55,7 @@ use qiskit_circuit::circuit_data::CircuitData;
5555use qiskit_circuit:: circuit_instruction:: OperationFromPython ;
5656use qiskit_circuit:: gate_matrix:: { CX_GATE , H_GATE , ONE_QUBIT_IDENTITY , SX_GATE , X_GATE } ;
5757use qiskit_circuit:: operations:: { Param , StandardGate } ;
58+ use qiskit_circuit:: packed_instruction:: PackedOperation ;
5859use qiskit_circuit:: slice:: { PySequenceIndex , SequenceIndex } ;
5960use qiskit_circuit:: util:: { c64, GateArray1Q , GateArray2Q , C_M_ONE , C_ONE , C_ZERO , IM , M_IM } ;
6061use qiskit_circuit:: Qubit ;
@@ -2063,26 +2064,51 @@ impl TwoQubitBasisDecomposer {
20632064 ) -> PyResult < CircuitData > {
20642065 let kak_gate = kak_gate. extract :: < OperationFromPython > ( py) ?;
20652066 let sequence = self . __call__ ( unitary, basis_fidelity, approximate, _num_basis_uses) ?;
2066- CircuitData :: from_standard_gates (
2067- py,
2068- 2 ,
2069- sequence
2070- . gates
2071- . into_iter ( )
2072- . map ( |( gate, params, qubits) | match gate {
2073- Some ( gate) => (
2074- gate,
2075- params. into_iter ( ) . map ( Param :: Float ) . collect ( ) ,
2076- qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2077- ) ,
2078- None => (
2079- kak_gate. operation . standard_gate ( ) ,
2080- kak_gate. params . clone ( ) ,
2081- qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2082- ) ,
2083- } ) ,
2084- Param :: Float ( sequence. global_phase ) ,
2085- )
2067+ match kak_gate. operation . try_standard_gate ( ) {
2068+ Some ( std_kak_gate) => CircuitData :: from_standard_gates (
2069+ py,
2070+ 2 ,
2071+ sequence
2072+ . gates
2073+ . into_iter ( )
2074+ . map ( |( gate, params, qubits) | match gate {
2075+ Some ( gate) => (
2076+ gate,
2077+ params. into_iter ( ) . map ( Param :: Float ) . collect ( ) ,
2078+ qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2079+ ) ,
2080+ None => (
2081+ std_kak_gate,
2082+ kak_gate. params . clone ( ) ,
2083+ qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2084+ ) ,
2085+ } ) ,
2086+ Param :: Float ( sequence. global_phase ) ,
2087+ ) ,
2088+ None => CircuitData :: from_packed_operations (
2089+ py,
2090+ 2 ,
2091+ 0 ,
2092+ sequence
2093+ . gates
2094+ . into_iter ( )
2095+ . map ( |( gate, params, qubits) | match gate {
2096+ Some ( gate) => (
2097+ PackedOperation :: from_standard ( gate) ,
2098+ params. into_iter ( ) . map ( Param :: Float ) . collect ( ) ,
2099+ qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2100+ Vec :: new ( ) ,
2101+ ) ,
2102+ None => (
2103+ kak_gate. operation . clone ( ) ,
2104+ kak_gate. params . clone ( ) ,
2105+ qubits. into_iter ( ) . map ( |x| Qubit ( x. into ( ) ) ) . collect ( ) ,
2106+ Vec :: new ( ) ,
2107+ ) ,
2108+ } ) ,
2109+ Param :: Float ( sequence. global_phase ) ,
2110+ ) ,
2111+ }
20862112 }
20872113
20882114 fn num_basis_gates ( & self , unitary : PyReadonlyArray2 < Complex64 > ) -> usize {
0 commit comments