GCC Code Coverage Report


Directory: ./
File: Predicates/PassGenerators.cpp
Date: 2022-10-15 05:10:18
Warnings: 4 unchecked decisions!
Exec Total Coverage
Lines: 471 516 91.3%
Functions: 36 39 92.3%
Branches: 514 1080 47.6%
Decisions: 19 35 54.3%

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 "PassGenerators.hpp"
16
17 #include <memory>
18 #include <sstream>
19 #include <string>
20
21 #include "ArchAwareSynth/SteinerForest.hpp"
22 #include "Circuit/CircPool.hpp"
23 #include "Circuit/Circuit.hpp"
24 #include "Converters/PhasePoly.hpp"
25 #include "Mapping/LexiLabelling.hpp"
26 #include "Mapping/LexiRoute.hpp"
27 #include "Mapping/MappingManager.hpp"
28 #include "Placement/Placement.hpp"
29 #include "Predicates/CompilationUnit.hpp"
30 #include "Predicates/CompilerPass.hpp"
31 #include "Predicates/PassLibrary.hpp"
32 #include "Predicates/Predicates.hpp"
33 #include "Transformations/BasicOptimisation.hpp"
34 #include "Transformations/ContextualReduction.hpp"
35 #include "Transformations/Decomposition.hpp"
36 #include "Transformations/OptimisationPass.hpp"
37 #include "Transformations/PauliOptimisation.hpp"
38 #include "Transformations/Rebase.hpp"
39 #include "Transformations/ThreeQubitSquash.hpp"
40 #include "Transformations/Transform.hpp"
41 #include "Utils/Json.hpp"
42
43 namespace tket {
44
45 9 PassPtr gen_rebase_pass(
46 const OpTypeSet& allowed_gates, const Circuit& cx_replacement,
47 const std::function<Circuit(const Expr&, const Expr&, const Expr&)>&
48 tk1_replacement) {
49 Transform t = Transforms::rebase_factory(
50
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 allowed_gates, cx_replacement, tk1_replacement);
51
52 9 PredicatePtrMap precons;
53
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 OpTypeSet all_types(allowed_gates);
54
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 all_types.insert(OpType::Measure);
55
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 all_types.insert(OpType::Collapse);
56
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 all_types.insert(OpType::Reset);
57
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 PredicatePtr postcon1 = std::make_shared<GateSetPredicate>(all_types);
58
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 PredicatePtr postcon2 = std::make_shared<MaxTwoQubitGatesPredicate>();
59 std::pair<const std::type_index, PredicatePtr> pair2 =
60
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 CompilationUnit::make_type_pair(postcon1);
61
2/4
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
36 PredicatePtrMap s_postcons{pair2, CompilationUnit::make_type_pair(postcon2)};
62
1/2
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
9 PredicateClassGuarantees g_postcons{{pair2.first, Guarantee::Clear}};
63
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 PostConditions pc = {s_postcons, g_postcons, Guarantee::Preserve};
64 // record pass config
65 9 nlohmann::json j;
66
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
9 j["name"] = "RebaseCustom";
67
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
9 j["basis_allowed"] = allowed_gates;
68
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
9 j["basis_cx_replacement"] = cx_replacement;
69
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
9 j["basis_tk1_replacement"] =
70
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
18 "SERIALIZATION OF FUNCTIONS IS NOT YET SUPPORTED";
71
1/2
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
18 return std::make_shared<StandardPass>(precons, t, pc, j);
72 9 }
73
74 1 PassPtr gen_rebase_pass_via_tk2(
75 const OpTypeSet& allowed_gates,
76 const std::function<Circuit(const Expr&, const Expr&, const Expr&)>&
77 tk2_replacement,
78 const std::function<Circuit(const Expr&, const Expr&, const Expr&)>&
79 tk1_replacement) {
80 Transform t = Transforms::rebase_factory_via_tk2(
81
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 allowed_gates, tk1_replacement, tk2_replacement);
82
83 1 PredicatePtrMap precons;
84
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 OpTypeSet all_types(allowed_gates);
85
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 all_types.insert(OpType::Measure);
86
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 all_types.insert(OpType::Collapse);
87
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 all_types.insert(OpType::Reset);
88
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 PredicatePtr postcon1 = std::make_shared<GateSetPredicate>(all_types);
89
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 PredicatePtr postcon2 = std::make_shared<MaxTwoQubitGatesPredicate>();
90 std::pair<const std::type_index, PredicatePtr> pair2 =
91
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 CompilationUnit::make_type_pair(postcon1);
92
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
4 PredicatePtrMap s_postcons{pair2, CompilationUnit::make_type_pair(postcon2)};
93
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 PredicateClassGuarantees g_postcons{{pair2.first, Guarantee::Clear}};
94
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 PostConditions pc = {s_postcons, g_postcons, Guarantee::Preserve};
95 // record pass config
96 1 nlohmann::json j;
97
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 j["name"] = "RebaseCustomViaTK2";
98
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 j["basis_allowed"] = allowed_gates;
99
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 j["basis_tk1_replacement"] =
100
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 "SERIALIZATION OF FUNCTIONS IS NOT YET SUPPORTED";
101
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 j["basis_tk2_replacement"] =
102
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 "SERIALIZATION OF FUNCTIONS IS NOT YET SUPPORTED";
103
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 return std::make_shared<StandardPass>(precons, t, pc, j);
104 1 }
105
106 PassPtr gen_squash_pass(
107 const OpTypeSet& singleqs,
108 const std::function<Circuit(const Expr&, const Expr&, const Expr&)>&
109 tk1_replacement) {
110 Transform t = Transforms::squash_factory(singleqs, tk1_replacement);
111 PostConditions postcon = {{}, {}, Guarantee::Preserve};
112 PredicatePtrMap precons;
113 // record pass config
114 nlohmann::json j;
115 j["name"] = "SquashCustom";
116 j["basis_singleqs"] = singleqs;
117 j["basis_tk1_replacement"] =
118 "SERIALIZATION OF FUNCTIONS IS NOT YET SUPPORTED";
119 return std::make_shared<StandardPass>(precons, t, postcon, j);
120 }
121
122 // converting chains of p, q rotations to minimal triplets of p,q-rotations (p,
123 // q in {Rx,Ry,Rz})
124 6 PassPtr gen_euler_pass(const OpType& q, const OpType& p, bool strict) {
125 6 PredicatePtrMap precons;
126
127
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 Transform t = Transforms::squash_1qb_to_pqp(q, p, strict);
128
1/2
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
12 PostConditions pc{{}, {}, Guarantee::Preserve};
129 // record pass config
130 6 nlohmann::json j;
131
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 j["name"] = "EulerAngleReduction";
132
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 j["euler_q"] = q;
133
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 j["euler_p"] = p;
134
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 j["euler_strict"] = strict;
135
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 return std::make_shared<StandardPass>(precons, t, pc, j);
136 6 }
137
138 4 PassPtr gen_clifford_simp_pass(bool allow_swaps) {
139 // Expects: CX and any single-qubit gates,
140 // but does not break if it encounters others
141
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 Transform t = Transforms::clifford_simp(allow_swaps);
142 4 PredicatePtrMap precons;
143 4 PredicateClassGuarantees g_postcons;
144
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 4 times.
4 if (allow_swaps) {
145 g_postcons = {
146 4 {typeid(ConnectivityPredicate), Guarantee::Clear},
147 4 {typeid(NoWireSwapsPredicate), Guarantee::Clear},
148
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 {typeid(DirectednessPredicate), Guarantee::Clear}};
149 }
150
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 PostConditions postcon{{}, g_postcons, Guarantee::Preserve};
151
152 // record pass config
153 4 nlohmann::json j;
154
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 j["name"] = "CliffordSimp";
155
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 j["allow_swaps"] = allow_swaps;
156
157
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 return std::make_shared<StandardPass>(precons, t, postcon, j);
158 4 }
159
160 3 PassPtr gen_rename_qubits_pass(const std::map<Qubit, Qubit>& qm) {
161 Transform t =
162 3 Transform([=](Circuit& circ, std::shared_ptr<unit_bimaps_t> maps) {
163 3 bool changed = circ.rename_units(qm);
164
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 changed |= update_maps(maps, qm, qm);
165 3 return changed;
166
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
6 });
167 3 PredicatePtrMap precons = {};
168 PostConditions postcons = {
169 {},
170 {{typeid(DefaultRegisterPredicate), Guarantee::Clear}},
171
2/4
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
6 Guarantee::Preserve};
172 // record pass config
173 3 nlohmann::json j;
174
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["name"] = "RenameQubitsPass";
175
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["qubit_map"] = qm;
176
177
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 return std::make_shared<StandardPass>(precons, t, postcons, j);
178 3 }
179
180 34 PassPtr gen_placement_pass(const PlacementPtr& placement_ptr) {
181 35 Transform::Transformation trans = [=](Circuit& circ,
182 std::shared_ptr<unit_bimaps_t> maps) {
183 // Fall back to line placement if graph placement fails
184 bool changed;
185 try {
186
2/2
✓ Branch 3 taken 33 times.
✓ Branch 4 taken 2 times.
37 changed = placement_ptr->place(circ, maps);
187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 } catch (const std::runtime_error& e) {
188
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 std::stringstream ss;
189 2 ss << "PlacementPass failed with message: " << e.what()
190
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
2 << " Fall back to LinePlacement.";
191
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
2 tket_log()->warn(ss.str());
192
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 PlacementPtr line_placement_ptr = std::make_shared<LinePlacement>(
193 4 placement_ptr->get_architecture_ref());
194
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 changed = line_placement_ptr->place(circ, maps);
195 2 }
196 35 return changed;
197
1/2
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
34 };
198
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
34 Transform t = Transform(trans);
199
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
34 PredicatePtr twoqbpred = std::make_shared<MaxTwoQubitGatesPredicate>();
200 68 PredicatePtr n_qubit_pred = std::make_shared<MaxNQubitsPredicate>(
201
1/2
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
34 placement_ptr->get_architecture_ref().n_nodes());
202
203 PredicatePtrMap precons{
204 CompilationUnit::make_type_pair(twoqbpred),
205
3/6
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 34 times.
✗ Branch 9 not taken.
136 CompilationUnit::make_type_pair(n_qubit_pred)};
206
1/2
✓ Branch 3 taken 34 times.
✗ Branch 4 not taken.
34 PredicatePtr placement_pred = std::make_shared<PlacementPredicate>(
207 34 placement_ptr->get_architecture_ref());
208
2/4
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 34 times.
✗ Branch 6 not taken.
102 PredicatePtrMap s_postcons{CompilationUnit::make_type_pair(placement_pred)};
209
1/2
✓ Branch 2 taken 34 times.
✗ Branch 3 not taken.
34 PostConditions pc{s_postcons, {}, Guarantee::Preserve};
210 // record pass config
211 34 nlohmann::json j;
212
2/4
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
34 j["name"] = "PlacementPass";
213
2/4
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
34 j["placement"] = placement_ptr;
214
1/2
✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
68 return std::make_shared<StandardPass>(precons, t, pc, j);
215 34 }
216
217 21 PassPtr gen_naive_placement_pass(const Architecture& arc) {
218 22 Transform::Transformation trans = [=](Circuit& circ,
219 std::shared_ptr<unit_bimaps_t> maps) {
220
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
22 NaivePlacement np(arc);
221
1/2
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
44 return np.place(circ, maps);
222
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
43 };
223
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 Transform t = Transform(trans);
224 PredicatePtr n_qubit_pred =
225
1/2
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
21 std::make_shared<MaxNQubitsPredicate>(arc.n_nodes());
226
227
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
63 PredicatePtrMap precons{CompilationUnit::make_type_pair(n_qubit_pred)};
228
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 PredicatePtr placement_pred = std::make_shared<PlacementPredicate>(arc);
229
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
63 PredicatePtrMap s_postcons{CompilationUnit::make_type_pair(placement_pred)};
230
1/2
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
21 PostConditions pc{s_postcons, {}, Guarantee::Preserve};
231 // record pass config
232 21 nlohmann::json j;
233
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
21 j["name"] = "NaivePlacementPass";
234
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
21 j["architecture"] = arc;
235
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
42 return std::make_shared<StandardPass>(precons, t, pc, j);
236 21 }
237
238 19 PassPtr gen_full_mapping_pass(
239 const Architecture& arc, const PlacementPtr& placement_ptr,
240 const std::vector<RoutingMethodPtr>& config) {
241 std::vector<PassPtr> vpp = {
242 gen_placement_pass(placement_ptr), gen_routing_pass(arc, config),
243
4/8
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 19 times.
✗ Branch 12 not taken.
95 gen_naive_placement_pass(arc)};
244
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
38 return std::make_shared<SequencePass>(vpp);
245 19 }
246
247 13 PassPtr gen_default_mapping_pass(const Architecture& arc, bool delay_measures) {
248 26 PassPtr return_pass = gen_full_mapping_pass(
249
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
26 arc, std::make_shared<GraphPlacement>(arc),
250 13 {std::make_shared<LexiLabellingMethod>(),
251
3/6
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
65 std::make_shared<LexiRouteRoutingMethod>()});
252
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9 times.
2/2
✓ Decision 'true' taken 4 times.
✓ Decision 'false' taken 9 times.
13 if (delay_measures) {
253
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 return_pass = return_pass >> DelayMeasures();
254 }
255 13 return return_pass;
256 }
257
258 2 PassPtr gen_cx_mapping_pass(
259 const Architecture& arc, const PlacementPtr& placement_ptr,
260 const std::vector<RoutingMethodPtr>& config, bool directed_cx,
261 bool delay_measures) {
262
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 OpTypeSet gate_set = all_single_qubit_types();
263
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 gate_set.insert(OpType::CX);
264 PassPtr rebase_pass =
265
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 gen_rebase_pass(gate_set, CircPool::CX(), CircPool::tk1_to_tk1);
266 PassPtr return_pass =
267
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 rebase_pass >> gen_full_mapping_pass(arc, placement_ptr, config);
268
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
0/1
? Decision couldn't be analyzed.
2 if (delay_measures) return_pass = return_pass >> DelayMeasures();
269
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
6 return_pass = return_pass >> rebase_pass >>
270
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
6 gen_decompose_routing_gates_to_cxs_pass(arc, directed_cx);
271 4 return return_pass;
272 2 }
273
274 30 PassPtr gen_routing_pass(
275 const Architecture& arc, const std::vector<RoutingMethodPtr>& config) {
276 27 Transform::Transformation trans = [=](Circuit& circ,
277 std::shared_ptr<unit_bimaps_t> maps) {
278
2/4
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
27 MappingManager mm(std::make_shared<Architecture>(arc));
279
1/2
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 return mm.route_circuit_with_maps(circ, config, maps);
280
3/6
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 8 not taken.
57 };
281
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 Transform t = Transform(trans);
282
283
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 PredicatePtr twoqbpred = std::make_shared<MaxTwoQubitGatesPredicate>();
284 PredicatePtr n_qubit_pred =
285
1/2
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
30 std::make_shared<MaxNQubitsPredicate>(arc.n_nodes());
286 PredicatePtrMap precons{
287 CompilationUnit::make_type_pair(twoqbpred),
288
3/6
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 30 times.
✗ Branch 9 not taken.
120 CompilationUnit::make_type_pair(n_qubit_pred)};
289
290
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 PredicatePtr postcon1 = std::make_shared<ConnectivityPredicate>(arc);
291 std::pair<const std::type_index, PredicatePtr> pair1 =
292
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 CompilationUnit::make_type_pair(postcon1);
293
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 PredicatePtr postcon2 = std::make_shared<NoWireSwapsPredicate>();
294
2/4
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 30 times.
✗ Branch 7 not taken.
120 PredicatePtrMap s_postcons{pair1, CompilationUnit::make_type_pair(postcon2)};
295 30 std::type_index gateset_ti = typeid(GateSetPredicate);
296 // clears all Routing predicates apart from the ones which are specified
297 // clears all GateSet predicates (inserts SWAPs and BRIDGEs)
298 PredicateClassGuarantees g_postcons{
299 {pair1.first, Guarantee::Clear},
300 {gateset_ti, Guarantee::Clear},
301
1/2
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
30 {typeid(MaxTwoQubitGatesPredicate), Guarantee::Clear}};
302
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
30 PostConditions pc{s_postcons, g_postcons, Guarantee::Preserve};
303
304 // record pass config
305 30 nlohmann::json j;
306
2/4
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 j["name"] = "RoutingPass";
307
2/4
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 j["routing_config"] = config;
308
2/4
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
30 j["architecture"] = arc;
309
310
1/2
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
60 return std::make_shared<StandardPass>(precons, t, pc, j);
311 30 }
312
313 13 PassPtr gen_placement_pass_phase_poly(const Architecture& arc) {
314 13 Transform::Transformation trans = [=](Circuit& circ,
315 std::shared_ptr<unit_bimaps_t> maps) {
316
2/4
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 13 times.
13 if (arc.n_nodes() < circ.n_qubits()) {
317 throw CircuitInvalidity(
318 "Circuit has more qubits than the architecture has nodes.");
319 }
320
321
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 qubit_vector_t q_vec = circ.all_qubits();
322 13 std::map<Qubit, Node> qubit_to_nodes;
323 13 unsigned counter = 0;
324
325
2/2
✓ Branch 7 taken 48 times.
✓ Branch 8 taken 13 times.
2/2
✓ Decision 'true' taken 48 times.
✓ Decision 'false' taken 13 times.
61 for (Node x : arc.nodes()) {
326
3/4
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 3 times.
2/2
✓ Decision 'true' taken 45 times.
✓ Decision 'false' taken 3 times.
48 if (counter < circ.n_qubits()) {
327
1/2
✓ Branch 3 taken 45 times.
✗ Branch 4 not taken.
45 qubit_to_nodes.insert({q_vec[counter], x});
328 45 ++counter;
329 }
330 48 }
331
332
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 circ.rename_units(qubit_to_nodes);
333
1/2
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
13 update_maps(maps, qubit_to_nodes, qubit_to_nodes);
334
335 13 return true;
336
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
26 };
337
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 Transform t = Transform(trans);
338
339
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr no_wire_swap = std::make_shared<NoWireSwapsPredicate>();
340
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
39 PredicatePtrMap precons{CompilationUnit::make_type_pair(no_wire_swap)};
341
342
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr placement_pred = std::make_shared<PlacementPredicate>(arc);
343 PredicatePtr n_qubit_pred =
344
1/2
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
13 std::make_shared<MaxNQubitsPredicate>(arc.n_nodes());
345
346 PredicatePtrMap s_postcons{
347 CompilationUnit::make_type_pair(placement_pred),
348 CompilationUnit::make_type_pair(n_qubit_pred),
349
4/8
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
65 CompilationUnit::make_type_pair(no_wire_swap)};
350
351
1/2
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
13 PostConditions pc{s_postcons, {}, Guarantee::Preserve};
352 // record pass config
353 13 nlohmann::json j;
354
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
13 j["name"] = "PlacementPass";
355
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PlacementPtr pp = std::make_shared<GraphPlacement>(arc);
356
3/6
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
13 j["params"]["placement"] = pp;
357
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
26 return std::make_shared<StandardPass>(precons, t, pc, j);
358 13 }
359
360 13 PassPtr aas_routing_pass(
361 const Architecture& arc, const unsigned lookahead,
362 const aas::CNotSynthType cnotsynthtype) {
363 13 Transform::SimpleTransformation trans = [=](Circuit& circ) {
364 // check input:
365
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 13 times.
13 if (lookahead == 0) {
366 throw std::logic_error("lookahead must be > 0");
367 }
368
2/4
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 13 times.
1/2
✗ Decision 'true' not taken.
✓ Decision 'false' taken 13 times.
13 if (arc.n_nodes() < circ.n_qubits()) {
369 throw CircuitInvalidity(
370 "Circuit has more qubits than the architecture has nodes.");
371 }
372
373 // this pass is not able to handle implicit wire swaps
374 // this is additionally assured by a precondition of this pass
375 TKET_ASSERT(!circ.has_implicit_wireswaps());
376
377
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 qubit_vector_t all_qu = circ.all_qubits();
378
379
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 Circuit input_circ = circ;
380
381 13 VertexList bin;
382
383
7/8
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 221 times.
✓ Branch 6 taken 13 times.
✓ Branch 8 taken 221 times.
✓ Branch 9 taken 13 times.
✓ Branch 11 taken 13 times.
✓ Branch 12 taken 13 times.
247 BGL_FORALL_VERTICES(v, circ.dag, DAG) {
384
3/4
✓ Branch 1 taken 221 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 127 times.
✓ Branch 4 taken 94 times.
2/2
✓ Decision 'true' taken 127 times.
✓ Decision 'false' taken 94 times.
221 if (!circ.detect_boundary_Op(v)) {
385
1/2
✓ Branch 1 taken 127 times.
✗ Branch 2 not taken.
127 bin.push_back(v);
386 }
387 }
388
389
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 circ.remove_vertices(
390 bin, Circuit::GraphRewiring::Yes, Circuit::VertexDeletion::Yes);
391
392
6/10
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 127 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 127 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 127 times.
✓ Branch 14 taken 13 times.
0/1
? Decision couldn't be analyzed.
140 for (const Command& com : input_circ) {
393 127 OpType ot = com.get_op_ptr()->get_type();
394
1/2
✓ Branch 1 taken 127 times.
✗ Branch 2 not taken.
127 unit_vector_t qbs = com.get_args();
395
3/6
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 104 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
127 switch (ot) {
396
1/1
✓ Decision 'true' taken 21 times.
21 case OpType::PhasePolyBox: {
397 21 Op_ptr op = com.get_op_ptr();
398 21 const PhasePolyBox& b = static_cast<const PhasePolyBox&>(*op);
399
400
2/4
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
21 Circuit b_circ(*b.to_circuit());
401
402
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 PhasePolyBox ppb(b_circ);
403
404 Circuit result =
405
1/2
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
21 aas::phase_poly_synthesis(arc, ppb, lookahead, cnotsynthtype);
406
407
6/10
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 132 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 132 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 132 times.
✓ Branch 14 taken 21 times.
0/1
? Decision couldn't be analyzed.
153 for (const Command& res_com : result) {
408 132 OpType ot = res_com.get_op_ptr()->get_type();
409
1/2
✓ Branch 1 taken 132 times.
✗ Branch 2 not taken.
132 unit_vector_t res_qbs = res_com.get_args();
410
411 switch (ot) {
412
1/1
✓ Decision 'true' taken 228 times.
76 case OpType::CX: {
413
6/12
✓ Branch 3 taken 76 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 76 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 76 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 76 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 152 times.
✓ Branch 19 taken 76 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
228 circ.add_op<Node>(ot, {Node(res_qbs[0]), Node(res_qbs[1])});
414 76 break;
415 }
416
1/1
✓ Decision 'true' taken 112 times.
56 case OpType::Rz: {
417
3/6
✓ Branch 3 taken 56 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 56 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 56 times.
✗ Branch 10 not taken.
112 auto angle = res_com.get_op_ptr()->get_params().at(0);
418
5/10
✓ Branch 3 taken 56 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 56 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 56 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 56 times.
✓ Branch 15 taken 56 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
112 circ.add_op<Node>(ot, angle, {Node(res_qbs[0])});
419 56 break;
420 56 }
421
0/1
✗ Decision 'true' not taken.
default: {
422 TKET_ASSERT(!"Invalid gate type in phase poly box");
423 }
424 }
425 153 }
426 21 break;
427 21 }
428
1/1
✓ Decision 'true' taken 208 times.
104 case OpType::H: {
429
5/10
✓ Branch 3 taken 104 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 104 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 104 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 104 times.
✓ Branch 15 taken 104 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
208 circ.add_op<Node>(ot, {Node(qbs[0])});
430 104 break;
431 }
432
0/1
✗ Decision 'true' not taken.
case OpType::Collapse: {
433 circ.add_op<Node>(ot, {Node(qbs[0])});
434 break;
435 }
436
0/1
✗ Decision 'true' not taken.
case OpType::Reset: {
437 circ.add_op<Node>(ot, {Node(qbs[0])});
438 break;
439 }
440
1/1
✓ Decision 'true' taken 2 times.
2 case OpType::Measure: {
441
3/6
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
2 circ.add_measure(Node(qbs[0]), Bit(qbs[1]));
442 2 break;
443 }
444
0/1
✗ Decision 'true' not taken.
default: {
445 throw BadOpType("Invalid gate in input of AAS routing", ot);
446 }
447 }
448 140 }
449
450 13 return true;
451
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
26 };
452
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 Transform t = Transform(trans);
453
454
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr placedpred = std::make_shared<PlacementPredicate>(arc);
455 PredicatePtr n_qubit_pred =
456
1/2
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
13 std::make_shared<MaxNQubitsPredicate>(arc.n_nodes());
457
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr no_wire_swap = std::make_shared<NoWireSwapsPredicate>();
458
459 PredicatePtrMap precons{
460 CompilationUnit::make_type_pair(placedpred),
461 CompilationUnit::make_type_pair(n_qubit_pred),
462
4/8
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
65 CompilationUnit::make_type_pair(no_wire_swap)};
463
464
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr postcon1 = std::make_shared<ConnectivityPredicate>(arc);
465 std::pair<const std::type_index, PredicatePtr> pair1 =
466
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 CompilationUnit::make_type_pair(postcon1);
467
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PredicatePtr postcon2 = std::make_shared<NoWireSwapsPredicate>();
468
2/4
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 13 times.
✗ Branch 7 not taken.
52 PredicatePtrMap s_postcons{pair1, CompilationUnit::make_type_pair(postcon2)};
469 13 std::type_index gateset_ti = typeid(GateSetPredicate);
470 PredicateClassGuarantees g_postcons{
471
1/2
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
13 {pair1.first, Guarantee::Clear}, {gateset_ti, Guarantee::Clear}};
472
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
13 PostConditions pc{s_postcons, g_postcons, Guarantee::Preserve};
473
474 13 nlohmann::json j;
475
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
13 j["name"] = "AASRoutingPass";
476
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
13 j["architecture"] = arc;
477
478
1/2
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
26 return std::make_shared<StandardPass>(precons, t, pc, j);
479 13 }
480
481 13 PassPtr gen_full_mapping_pass_phase_poly(
482 const Architecture& arc, const unsigned lookahead,
483 const aas::CNotSynthType cnotsynthtype) {
484
2/4
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 13 times.
✗ Branch 6 not taken.
26 return ComposePhasePolyBoxes() >> gen_placement_pass_phase_poly(arc) >>
485
2/4
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
39 aas_routing_pass(arc, lookahead, cnotsynthtype);
486 }
487
488 4 PassPtr gen_directed_cx_routing_pass(
489 const Architecture& arc, const std::vector<RoutingMethodPtr>& config) {
490
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
4 OpTypeSet multis = {OpType::CX, OpType::BRIDGE, OpType::SWAP};
491
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 OpTypeSet gate_set = all_single_qubit_types();
492
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
4 gate_set.insert(multis.begin(), multis.end());
493
494
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
8 return gen_routing_pass(arc, config) >>
495
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
8 gen_rebase_pass(gate_set, CircPool::CX(), CircPool::tk1_to_tk1) >>
496
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
12 gen_decompose_routing_gates_to_cxs_pass(arc, true);
497 4 }
498
499 10 PassPtr gen_decompose_routing_gates_to_cxs_pass(
500 const Architecture& arc, bool directed) {
501 PredicateClassGuarantees g_postcons{
502
1/2
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
10 {typeid(GateSetPredicate), Guarantee::Clear}};
503 10 PredicatePtrMap precons;
504 10 PredicatePtrMap s_postcons;
505
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
30 Transform t = Transforms::decompose_SWAP_to_CX(arc) >>
506
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
20 Transforms::decompose_BRIDGE_to_CX() >>
507
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
20 Transforms::remove_redundancies();
508
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4 times.
2/2
✓ Decision 'true' taken 6 times.
✓ Decision 'false' taken 4 times.
10 if (directed) {
509
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 OpTypeSet out_optypes{all_single_qubit_types()};
510
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 out_optypes.insert(OpType::CX);
511
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 OpTypeSet in_optypes = out_optypes;
512
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 in_optypes.insert(OpType::SWAP);
513
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 in_optypes.insert(OpType::BRIDGE);
514
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr twoqbpred = std::make_shared<MaxTwoQubitGatesPredicate>();
515
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr connected = std::make_shared<ConnectivityPredicate>(arc);
516
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr wireswaps = std::make_shared<NoWireSwapsPredicate>();
517
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr directedpred = std::make_shared<DirectednessPredicate>(arc);
518
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr ingates = std::make_shared<GateSetPredicate>(in_optypes);
519
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 PredicatePtr outgates = std::make_shared<GateSetPredicate>(out_optypes);
520
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 18 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
30 precons = {
521 CompilationUnit::make_type_pair(connected),
522 CompilationUnit::make_type_pair(wireswaps),
523
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 CompilationUnit::make_type_pair(ingates)};
524
5/10
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 18 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
30 s_postcons = {
525 CompilationUnit::make_type_pair(directedpred),
526 CompilationUnit::make_type_pair(outgates),
527
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 CompilationUnit::make_type_pair(twoqbpred)};
528
3/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
24 t = t >> Transforms::decompose_CX_directed(arc) >>
529
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
18 Transforms::remove_redundancies();
530 6 }
531
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
10 PostConditions pc{s_postcons, g_postcons, Guarantee::Preserve};
532 // record pass config
533 10 nlohmann::json j;
534
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
10 j["name"] = "DecomposeSwapsToCXs";
535
1/2
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
10 j["directed"] = directed;
536
2/4
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
10 j["architecture"] = arc;
537
1/2
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
20 return std::make_shared<StandardPass>(precons, t, pc, j);
538 10 }
539
540 2 PassPtr gen_user_defined_swap_decomp_pass(const Circuit& replacement_circ) {
541
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 Transform t = Transforms::decompose_SWAP(replacement_circ);
542 PredicateClassGuarantees g_postcons{
543
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 {typeid(GateSetPredicate), Guarantee::Clear}};
544
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 PostConditions pc{{}, g_postcons, Guarantee::Preserve};
545 2 PredicatePtrMap precons;
546
547 // record pass config
548 2 nlohmann::json j;
549
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["name"] = "DecomposeSwapsToCircuit";
550
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["swap_replacement"] = replacement_circ;
551
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 return std::make_shared<StandardPass>(precons, t, pc, j);
552 2 }
553
554 7 PassPtr KAKDecomposition(
555 OpType target_2qb_gate, double cx_fidelity, bool allow_swaps) {
556 Transform t =
557
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
7 Transforms::two_qubit_squash(target_2qb_gate, cx_fidelity, allow_swaps);
558 7 PredicatePtrMap precons;
559 PredicateClassGuarantees g_postcons = {
560 {typeid(DirectednessPredicate), Guarantee::Clear},
561
1/2
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 {typeid(CliffordCircuitPredicate), Guarantee::Clear}};
562
1/2
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
7 PostConditions postcon = {{}, g_postcons, Guarantee::Preserve};
563
564 // record pass config
565 7 nlohmann::json j;
566
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 j["name"] = "KAKDecomposition";
567
2/4
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
7 j["target_2qb_gate"] = target_2qb_gate;
568
1/2
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
7 j["fidelity"] = cx_fidelity;
569
1/2
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
7 j["allow_swaps"] = allow_swaps;
570
571
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
14 return std::make_shared<StandardPass>(precons, t, postcon, j);
572 7 }
573
574 PassPtr DecomposeTK2(bool allow_swaps) { return DecomposeTK2({}, allow_swaps); }
575 2 PassPtr DecomposeTK2(const Transforms::TwoQbFidelities& fid, bool allow_swaps) {
576
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 Transform t = Transforms::decompose_TK2(fid, allow_swaps);
577
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 PredicatePtr normalised_tk2 = std::make_shared<NormalisedTK2Predicate>();
578
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
6 PredicatePtrMap precons{CompilationUnit::make_type_pair(normalised_tk2)};
579 2 PredicateClassGuarantees preserve_all;
580
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 PostConditions postcons{{}, preserve_all, Guarantee::Preserve};
581 2 nlohmann::json j;
582
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["name"] = "DecomposeTK2";
583
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 j["allow_swaps"] = allow_swaps;
584 2 nlohmann::json fid_json;
585
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 fid_json["CX"] = fid.CX_fidelity;
586
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 fid_json["ZZPhase"] = "SERIALIZATION OF FUNCTIONS IS NOT SUPPORTED";
587
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 fid_json["ZZMax"] = fid.ZZMax_fidelity;
588
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["fidelities"] = fid_json;
589
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 return std::make_shared<StandardPass>(precons, t, postcons, j);
590 2 }
591
592 5 PassPtr ThreeQubitSquash(bool allow_swaps) {
593
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
15 Transform t = Transforms::two_qubit_squash(allow_swaps) >>
594
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
10 Transforms::three_qubit_squash() >>
595
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
10 Transforms::clifford_simp(allow_swaps);
596
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 OpTypeSet ots{all_single_qubit_types()};
597
3/6
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
5 ots.insert(all_classical_types().begin(), all_classical_types().end());
598
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 ots.insert(OpType::CX);
599
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 PredicatePtr gate_pred = std::make_shared<GateSetPredicate>(ots);
600
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
15 PredicatePtrMap precons{CompilationUnit::make_type_pair(gate_pred)};
601 PredicateClassGuarantees g_postcons = {
602 {typeid(DirectednessPredicate), Guarantee::Clear},
603
1/2
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 {typeid(CliffordCircuitPredicate), Guarantee::Clear}};
604
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 PostConditions postcon = {{}, g_postcons, Guarantee::Preserve};
605 5 nlohmann::json j;
606
2/4
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
5 j["name"] = "ThreeQubitSquash";
607
1/2
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5 j["allow_swaps"] = allow_swaps;
608
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
10 return std::make_shared<StandardPass>(precons, t, postcon, j);
609 5 }
610
611 14 PassPtr FullPeepholeOptimise(bool allow_swaps, OpType target_2qb_gate) {
612 OpTypeSet after_set = {
613
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 OpType::TK1, OpType::Measure, OpType::Collapse, OpType::Reset};
614
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 after_set.insert(target_2qb_gate);
615 14 PredicatePtrMap precons = {};
616
3/6
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 14 times.
✗ Branch 10 not taken.
14 after_set.insert(all_classical_types().begin(), all_classical_types().end());
617
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 PredicatePtr out_gateset = std::make_shared<GateSetPredicate>(after_set);
618
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 PredicatePtr max2qb = std::make_shared<MaxTwoQubitGatesPredicate>();
619 PredicatePtrMap postcon_spec = {
620 CompilationUnit::make_type_pair(out_gateset),
621
3/6
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 14 times.
✗ Branch 9 not taken.
56 CompilationUnit::make_type_pair(max2qb)};
622 PredicateClassGuarantees g_postcons = {
623
1/2
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
14 {typeid(ConnectivityPredicate), Guarantee::Clear}};
624
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
14 PostConditions postcon = {postcon_spec, g_postcons, Guarantee::Preserve};
625 14 nlohmann::json j;
626
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
14 j["name"] = "FullPeepholeOptimise";
627
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 j["allow_swaps"] = allow_swaps;
628
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
14 j["target_2qb_gate"] = target_2qb_gate;
629
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
28 return std::make_shared<StandardPass>(
630
1/2
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
28 precons, Transforms::full_peephole_optimise(allow_swaps, target_2qb_gate),
631 28 postcon, j);
632 14 }
633
634 2 PassPtr gen_optimise_phase_gadgets(CXConfigType cx_config) {
635
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 Transform t = Transforms::optimise_via_PhaseGadget(cx_config);
636
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 PredicatePtr ccontrol_pred = std::make_shared<NoClassicalControlPredicate>();
637
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
6 PredicatePtrMap precons{CompilationUnit::make_type_pair(ccontrol_pred)};
638 OpTypeSet after_set{
639 OpType::Measure, OpType::Collapse, OpType::Reset, OpType::TK1,
640
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 OpType::CX};
641 2 std::type_index ti = typeid(ConnectivityPredicate);
642
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 PredicatePtr out_gateset = std::make_shared<GateSetPredicate>(after_set);
643
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 PredicatePtr max2qb = std::make_shared<MaxTwoQubitGatesPredicate>();
644 PredicatePtrMap postcon_spec = {
645 CompilationUnit::make_type_pair(out_gateset),
646
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
8 CompilationUnit::make_type_pair(max2qb)};
647
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 PredicateClassGuarantees g_postcons{{ti, Guarantee::Clear}};
648
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 PostConditions postcon{postcon_spec, g_postcons, Guarantee::Preserve};
649
650 // record pass config
651 2 nlohmann::json j;
652
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["name"] = "OptimisePhaseGadgets";
653
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 j["cx_config"] = cx_config;
654
655
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 return std::make_shared<StandardPass>(precons, t, postcon, j);
656 2 }
657
658 3 PassPtr gen_pairwise_pauli_gadgets(CXConfigType cx_config) {
659
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Transform t = Transforms::pairwise_pauli_gadgets(cx_config);
660
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 PredicatePtr ccontrol_pred = std::make_shared<NoClassicalControlPredicate>();
661
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 PredicatePtr simple = std::make_shared<DefaultRegisterPredicate>();
662 PredicatePtrMap precons = {
663 CompilationUnit::make_type_pair(simple),
664
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
12 CompilationUnit::make_type_pair(ccontrol_pred)};
665 PredicateClassGuarantees g_postcons = {
666 {typeid(ConnectivityPredicate), Guarantee::Clear},
667
1/2
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 {typeid(NoWireSwapsPredicate), Guarantee::Clear}};
668 OpTypeSet ots2 = {OpType::CX, OpType::Z, OpType::X, OpType::S,
669
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 OpType::V, OpType::U1, OpType::U2, OpType::U3};
670
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
3 ots2.insert(all_projective_types().begin(), all_projective_types().end());
671
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 PredicatePtr outp_gates = std::make_shared<GateSetPredicate>(ots2);
672
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
9 PredicatePtrMap spec_postcons = {CompilationUnit::make_type_pair(outp_gates)};
673
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 PostConditions postcon{spec_postcons, g_postcons, Guarantee::Preserve};
674 3 nlohmann::json j;
675
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["name"] = "OptimisePairwiseGadgets";
676
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["cx_config"] = cx_config;
677
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 return std::make_shared<StandardPass>(precons, t, postcon, j);
678 3 }
679
680 8 PassPtr gen_synthesise_pauli_graph(
681 Transforms::PauliSynthStrat strat, CXConfigType cx_config) {
682
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 Transform t = Transforms::synthesise_pauli_graph(strat, cx_config);
683
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 PredicatePtr ccontrol_pred = std::make_shared<NoClassicalControlPredicate>();
684
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 PredicatePtr mid_pred = std::make_shared<NoMidMeasurePredicate>();
685
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 PredicatePtr wire_pred = std::make_shared<NoWireSwapsPredicate>();
686 OpTypeSet ins = {OpType::Z, OpType::X, OpType::Y,
687 OpType::S, OpType::Sdg, OpType::V,
688 OpType::Vdg, OpType::H, OpType::CX,
689 OpType::CY, OpType::CZ, OpType::SWAP,
690 OpType::Rz, OpType::Rx, OpType::Ry,
691 OpType::T, OpType::Tdg, OpType::ZZMax,
692 OpType::ZZPhase, OpType::PhaseGadget, OpType::XXPhase,
693
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 OpType::YYPhase, OpType::PauliExpBox, OpType::Measure};
694
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
8 PredicatePtr in_gates = std::make_shared<GateSetPredicate>(ins);
695 PredicatePtrMap precons{
696 CompilationUnit::make_type_pair(ccontrol_pred),
697 CompilationUnit::make_type_pair(mid_pred),
698 CompilationUnit::make_type_pair(wire_pred),
699
5/10
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 8 times.
✗ Branch 11 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
48 CompilationUnit::make_type_pair(in_gates)};
700 PredicateClassGuarantees g_postcons = {
701 {typeid(ConnectivityPredicate), Guarantee::Clear},
702
1/2
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 {typeid(NoWireSwapsPredicate), Guarantee::Clear}};
703
1/2
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 PostConditions postcon{{}, g_postcons, Guarantee::Preserve};
704
705 // record pass config
706 8 nlohmann::json j;
707
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 j["name"] = "PauliSimp";
708
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 j["cx_config"] = cx_config;
709
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
8 j["pauli_synth_strat"] = strat;
710
711
1/2
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
16 return std::make_shared<StandardPass>(precons, t, postcon, j);
712 8 }
713
714 3 PassPtr gen_special_UCC_synthesis(
715 Transforms::PauliSynthStrat strat, CXConfigType cx_config) {
716
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Transform t = Transforms::special_UCC_synthesis(strat, cx_config);
717
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 PredicatePtr ccontrol_pred = std::make_shared<NoClassicalControlPredicate>();
718
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
9 PredicatePtrMap precons{CompilationUnit::make_type_pair(ccontrol_pred)};
719 PredicateClassGuarantees g_postcons = {
720 {typeid(ConnectivityPredicate), Guarantee::Clear},
721
1/2
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 {typeid(NoWireSwapsPredicate), Guarantee::Clear}};
722
1/2
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 PostConditions postcon{{}, g_postcons, Guarantee::Preserve};
723
724 // record pass config
725 3 nlohmann::json j;
726
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["name"] = "GuidedPauliSimp";
727
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["cx_config"] = cx_config;
728
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["pauli_synth_strat"] = strat;
729
730
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 return std::make_shared<StandardPass>(precons, t, postcon, j);
731 3 }
732
733 6 PassPtr gen_simplify_initial(
734 Transforms::AllowClassical allow_classical,
735 Transforms::CreateAllQubits create_all_qubits,
736 std::shared_ptr<const Circuit> xcirc) {
737 Transform t =
738
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 Transforms::simplify_initial(allow_classical, create_all_qubits, xcirc);
739 6 PredicatePtrMap no_precons;
740 6 PredicateClassGuarantees g_postcons;
741
742 // GateSetPredicate not preserved because X gates (or their specified
743 // equivalents) may be introduced, and if allow_classical then classical
744 // gates may also be introduced.
745
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 g_postcons[typeid(GateSetPredicate)] = Guarantee::Clear;
746
747
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 PostConditions postcon = {{}, g_postcons, Guarantee::Preserve};
748 6 nlohmann::json j;
749
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 j["name"] = "SimplifyInitial";
750
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 j["allow_classical"] = (allow_classical == Transforms::AllowClassical::Yes);
751
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 j["create_all_qubits"] =
752 12 (create_all_qubits == Transforms::CreateAllQubits::Yes);
753
4/6
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
0/1
? Decision couldn't be analyzed.
6 if (xcirc) j["x_circuit"] = *xcirc;
754
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 return std::make_shared<StandardPass>(no_precons, t, postcon, j);
755 6 }
756
757 4 PassPtr gen_contextual_pass(
758 Transforms::AllowClassical allow_classical,
759 std::shared_ptr<const Circuit> xcirc) {
760 std::vector<PassPtr> seq = {
761
2/4
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
8 RemoveDiscarded(), SimplifyMeasured(),
762 gen_simplify_initial(
763 allow_classical, Transforms::CreateAllQubits::No, xcirc),
764
3/6
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 13 not taken.
32 RemoveRedundancies()};
765
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 return std::make_shared<SequencePass>(seq);
766 4 }
767
768 2 PassPtr PauliSquash(Transforms::PauliSynthStrat strat, CXConfigType cx_config) {
769 std::vector<PassPtr> seq = {
770
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
8 gen_synthesise_pauli_graph(strat, cx_config), FullPeepholeOptimise()};
771
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 return std::make_shared<SequencePass>(seq);
772 2 }
773
774 PassPtr GlobalisePhasedX(bool squash) {
775 Transform t = Transforms::globalise_PhasedX(squash);
776 PredicatePtrMap precons;
777 PredicatePtr globalphasedx = std::make_shared<GlobalPhasedXPredicate>();
778 PredicatePtrMap spec_postcons = {
779 CompilationUnit::make_type_pair(globalphasedx)};
780 PredicateClassGuarantees g_postcons;
781 PostConditions postcon{spec_postcons, {}, Guarantee::Preserve};
782 // record pass config
783 nlohmann::json j;
784 j["name"] = "GlobalisePhasedX";
785 j["squash"] = squash;
786 return std::make_shared<StandardPass>(precons, t, postcon, j);
787 }
788
789 3 PassPtr CustomPass(
790 std::function<Circuit(const Circuit&)> transform,
791 const std::string& label) {
792 3 Transform t{[transform](Circuit& circ) {
793
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 Circuit circ_out = transform(circ);
794
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 bool success = circ_out != circ;
795
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 circ = circ_out;
796 3 return success;
797
3/6
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
9 }};
798 3 PredicatePtrMap precons;
799
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
6 PostConditions postcons;
800 3 nlohmann::json j;
801
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["name"] = "CustomPass";
802
2/4
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
3 j["label"] = label;
803
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 return std::make_shared<StandardPass>(precons, t, postcons, j);
804 3 }
805
806 } // namespace tket
807