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 |