@@ -55,6 +55,7 @@ use qiskit_circuit::circuit_data::CircuitData;
55
55
use qiskit_circuit:: circuit_instruction:: OperationFromPython ;
56
56
use qiskit_circuit:: gate_matrix:: { CX_GATE , H_GATE , ONE_QUBIT_IDENTITY , SX_GATE , X_GATE } ;
57
57
use qiskit_circuit:: operations:: { Param , StandardGate } ;
58
+ use qiskit_circuit:: packed_instruction:: PackedOperation ;
58
59
use qiskit_circuit:: slice:: { PySequenceIndex , SequenceIndex } ;
59
60
use qiskit_circuit:: util:: { c64, GateArray1Q , GateArray2Q , C_M_ONE , C_ONE , C_ZERO , IM , M_IM } ;
60
61
use qiskit_circuit:: Qubit ;
@@ -2063,26 +2064,51 @@ impl TwoQubitBasisDecomposer {
2063
2064
) -> PyResult < CircuitData > {
2064
2065
let kak_gate = kak_gate. extract :: < OperationFromPython > ( py) ?;
2065
2066
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
+ }
2086
2112
}
2087
2113
2088
2114
fn num_basis_gates ( & self , unitary : PyReadonlyArray2 < Complex64 > ) -> usize {
0 commit comments