GCC Code Coverage Report


Directory: ./
File: Transformations/Replacement.cpp
Date: 2022-10-15 05:10:18
Exec Total Coverage
Lines: 186 208 89.4%
Functions: 4 4 100.0%
Branches: 264 544 48.5%
Decisions: 38 45 84.4%

Line Branch Decision Exec Source
1 // Copyright 2019-2022 Cambridge Quantum Computing
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "Replacement.hpp"
16
17 #include "Circuit/CircPool.hpp"
18 #include "Circuit/CircUtils.hpp"
19 #include "Circuit/Circuit.hpp"
20 #include "Decomposition.hpp"
21 #include "Gate/GatePtr.hpp"
22 #include "Gate/GateUnitaryMatrix.hpp"
23 #include "OpType/OpType.hpp"
24 #include "OpType/OpTypeInfo.hpp"
25 #include "Transform.hpp"
26
27 namespace tket {
28
29 using namespace Transforms;
30
31 36 static Circuit multi_controlled_to_2q(
32 const Op_ptr op, const OpType& two_q_type) {
33 36 unsigned n_qubits = op->n_qubits();
34 36 OpType optype = op->get_type();
35
1/2
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
36 Circuit c(n_qubits);
36
2/3
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
36 switch (optype) {
37
1/1
✓ Decision 'true' taken 11 times.
11 case OpType::CnRy:
38
2/4
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 11 times.
✗ Branch 6 not taken.
11 c = CircPool::CnRy_normal_decomp(op, n_qubits);
39 11 break;
40 25 case OpType::CnX:
41 case OpType::CnZ:
42 case OpType::CnY:
43
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
2/2
✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 19 times.
25 if (n_qubits >= 6 && n_qubits <= 50) {
44 // CnU_linear_depth_decomp performs better in this case
45 6 OpType target_type =
46 (optype == OpType::CnX)
47
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
10 ? OpType::X
48
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
4 : ((optype == OpType::CnZ) ? OpType::Z : OpType::Y);
49 Eigen::Matrix2cd target_u =
50
2/4
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
6 GateUnitaryMatrix::get_unitary(target_type, 1, {});
51
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 c = CircPool::CnU_linear_depth_decomp(n_qubits - 1, target_u);
52 6 } else {
53
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 14 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 14 times.
19 if (optype == OpType::CnZ) {
54
2/4
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 c.add_op<unsigned>(OpType::H, {n_qubits - 1});
55
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 9 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 9 times.
14 } else if (optype == OpType::CnY) {
56
2/4
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 c.add_op<unsigned>(OpType::Sdg, {n_qubits - 1});
57 }
58
2/4
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
19 c.append(CircPool::CnX_normal_decomp(n_qubits - 1));
59
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 14 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 14 times.
19 if (optype == OpType::CnZ) {
60
2/4
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 c.add_op<unsigned>(OpType::H, {n_qubits - 1});
61
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 9 times.
2/2
✓ Decision 'true' taken 5 times.
✓ Decision 'false' taken 9 times.
14 } else if (optype == OpType::CnY) {
62
2/4
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
5 c.add_op<unsigned>(OpType::S, {n_qubits - 1});
63 }
64 }
65 25 break;
66
0/1
✗ Decision 'true' not taken.
default:
67 throw BadOpType("The operation is not multi-controlled", optype);
68 }
69
70
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 14 times.
2/2
✓ Decision 'true' taken 22 times.
✓ Decision 'false' taken 14 times.
36 if (two_q_type == OpType::CX) {
71
2/4
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 22 times.
✗ Branch 5 not taken.
22 decompose_multi_qubits_CX().apply(c);
72
1/2
✓ Branch 0 taken 14 times.
✗ Branch 1 not taken.
1/2
✓ Decision 'true' taken 14 times.
✗ Decision 'false' not taken.
14 } else if (two_q_type == OpType::TK2) {
73
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
14 decompose_multi_qubits_TK2().apply(c);
74 } else {
75 throw BadOpType("The target 2-q gate can only be CX or TK2", optype);
76 }
77 36 return c;
78 }
79
80 1126 Circuit TK2_circ_from_multiq(const Op_ptr op) {
81
1/2
✓ Branch 2 taken 1126 times.
✗ Branch 3 not taken.
1126 OpDesc desc = op->get_desc();
82
2/4
✓ Branch 1 taken 1126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1126 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 1126 times.
1126 if (!desc.is_gate())
83 throw BadOpType(
84 "Can only build replacement circuits for basic gates", desc.type());
85
3/4
✓ Branch 1 taken 1126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 1112 times.
1126 switch (desc.type()) {
86 14 case OpType::CnRy:
87 case OpType::CnX:
88 case OpType::CnZ:
89 case OpType::CnY:
90 // TODO We should be able to do better than this.
91
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 return multi_controlled_to_2q(op, OpType::TK2);
92
1/1
✓ Decision 'true' taken 2224 times.
1112 default:
93
2/4
✓ Branch 2 taken 1112 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1112 times.
✗ Branch 6 not taken.
2224 return with_TK2(as_gate_ptr(op));
94 }
95 1126 }
96
97 904 Circuit CX_circ_from_multiq(const Op_ptr op) {
98
1/2
✓ Branch 2 taken 904 times.
✗ Branch 3 not taken.
904 OpDesc desc = op->get_desc();
99
3/4
✓ Branch 1 taken 904 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 903 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 903 times.
904 if (!desc.is_gate())
100
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 throw BadOpType(
101 2 "Can only build replacement circuits for basic gates", desc.type());
102
3/4
✓ Branch 1 taken 903 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✓ Branch 4 taken 881 times.
903 switch (desc.type()) {
103 22 case OpType::CnRy:
104 case OpType::CnX:
105 case OpType::CnZ:
106 case OpType::CnY:
107
1/2
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
22 return multi_controlled_to_2q(op, OpType::CX);
108
1/1
✓ Decision 'true' taken 1762 times.
881 default:
109
2/4
✓ Branch 2 taken 881 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 881 times.
✗ Branch 6 not taken.
1762 return with_CX(as_gate_ptr(op));
110 }
111 904 }
112
113 39 Circuit CX_ZX_circ_from_op(const Op_ptr op) {
114
1/2
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
39 OpDesc desc = op->get_desc();
115
3/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 38 times.
2/2
✓ Decision 'true' taken 1 times.
✓ Decision 'false' taken 38 times.
39 if (!desc.is_gate())
116
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 throw BadOpType(
117 2 "Can only build replacement circuits for basic gates", desc.type());
118
20/25
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 1 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 1 times.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 19 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
38 switch (desc.type()) {
119
0/1
✗ Decision 'true' not taken.
case OpType::Phase: {
120 Circuit replacement(0);
121 replacement.add_phase(op->get_params()[0]);
122 return replacement;
123 }
124
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Z: {
125
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
126
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 1., {0});
127
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.5);
128
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
129 1 }
130
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::X: {
131
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
132
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 1., {0});
133
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.5);
134
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
135 1 }
136
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Y: {
137
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
138
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 1., {0});
139
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 1., {0});
140
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(-0.5);
141
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
142 1 }
143
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::S: {
144
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
145
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 0.5, {0});
146
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.25);
147
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
148 1 }
149
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Sdg: {
150
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
151
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, -0.5, {0});
152
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(-0.25);
153
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
154 1 }
155
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::T: {
156
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
157
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 0.25, {0});
158
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.125);
159
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
160 1 }
161
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Tdg: {
162
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
163
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, -0.25, {0});
164
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(-0.125);
165
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
166 1 }
167
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::V: {
168
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
169
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 0.5, {0});
170
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
171 1 }
172
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Vdg: {
173
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
174
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, -0.5, {0});
175
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
176 1 }
177
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::SX: {
178
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
179
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 0.5, {0});
180
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.25);
181
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
182 1 }
183
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::SXdg: {
184
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
185
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, -0.5, {0});
186
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(-0.25);
187
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
188 1 }
189
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::H: {
190
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
191
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 0.5, {0});
192
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 0.5, {0});
193
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 0.5, {0});
194
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 replacement.add_phase(0.5);
195
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
196 1 }
197
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::Ry: {
198
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle = op->get_params()[0];
199
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
200
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, -0.5, {0});
201
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, angle, {0});
202
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, 0.5, {0});
203
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
204 1 }
205 2 case OpType::Rx:
206 case OpType::Rz:
207 case OpType::Measure:
208 case OpType::Collapse: {
209
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 Circuit replacement(1);
210
2/4
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2 replacement.add_op<unsigned>(op, {0});
211
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 return replacement;
212 2 }
213
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::U3: {
214
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
215
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle_z1 = op->get_params()[2];
216
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle_y = op->get_params()[0];
217
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle_z2 = op->get_params()[1];
218
4/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, angle_z1 - 0.5, {0});
219
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, angle_y, {0});
220
4/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, angle_z2 + 0.5, {0});
221
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 replacement.add_phase((angle_z1 + angle_z2) / 2);
222
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
223 1 }
224
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::U2: {
225
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
226
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle_z1 = op->get_params()[1];
227
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle_z2 = op->get_params()[0];
228
4/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, angle_z1 - 0.5, {0});
229
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, 0.5, {0});
230
4/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, angle_z2 + 0.5, {0});
231
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 replacement.add_phase((angle_z1 + angle_z2) / 2);
232
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
233 1 }
234
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::U1: {
235
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
236
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr angle = op->get_params()[0];
237
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, angle, {0});
238
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 replacement.add_phase(angle / 2);
239
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
240 1 }
241
1/1
✓ Decision 'true' taken 1 times.
1 case OpType::PhasedX: {
242
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 Circuit replacement(1);
243
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr theta = op->get_params()[0];
244
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 Expr phi = op->get_params()[1];
245
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, -phi, {0});
246
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 replacement.add_op<unsigned>(OpType::Rx, theta, {0});
247
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 replacement.add_op<unsigned>(OpType::Rz, phi, {0});
248
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 return replacement;
249 1 }
250
0/1
✗ Decision 'true' not taken.
case OpType::CX: {
251 Circuit replacement(2);
252 replacement.add_op<unsigned>(op, {0, 1});
253 return replacement;
254 }
255 19 case OpType::TK2:
256 case OpType::CY:
257 case OpType::CZ:
258 case OpType::CH:
259 case OpType::CV:
260 case OpType::CVdg:
261 case OpType::CSX:
262 case OpType::CSXdg:
263 case OpType::CRz:
264 case OpType::CRx:
265 case OpType::CRy:
266 case OpType::CU1:
267 case OpType::CU3:
268 case OpType::PhaseGadget:
269 case OpType::CCX:
270 case OpType::SWAP:
271 case OpType::CSWAP:
272 case OpType::ECR:
273 case OpType::ISWAP:
274 case OpType::XXPhase:
275 case OpType::XXPhase3:
276 case OpType::ZZMax:
277 case OpType::ZZPhase:
278 case OpType::YYPhase:
279 case OpType::CnRy:
280 case OpType::CnX:
281 case OpType::ESWAP:
282 case OpType::FSim:
283 case OpType::Sycamore:
284 case OpType::ISWAPMax:
285 case OpType::BRIDGE: {
286
1/2
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
19 Circuit replacement = CX_circ_from_multiq(op);
287
2/4
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
19 decompose_ZX().apply(replacement);
288
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
19 return replacement;
289 19 }
290
0/1
✗ Decision 'true' not taken.
case OpType::TK1: {
291 Circuit replacement(1);
292 std::vector<Expr> params = op->get_params();
293 replacement.add_op<unsigned>(OpType::Rz, params[2], {0});
294 replacement.add_op<unsigned>(OpType::Rx, params[1], {0});
295 replacement.add_op<unsigned>(OpType::Rz, params[0], {0});
296 return replacement;
297 }
298
0/1
✗ Decision 'true' not taken.
default:
299 throw BadOpType("Cannot find replacement circuit", desc.type());
300 }
301 39 }
302
303 } // namespace tket
304