1#[cfg(feature = "schemars")]
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7use crate::pass::{Architecture, Placement};
8use crate::{register::ElementId, SerialCircuit};
9
10#[cfg_attr(feature = "schemars", derive(JsonSchema))]
16#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
17#[serde(tag = "name")]
18#[non_exhaustive]
19pub enum StandardPass {
20 RebaseCustomViaTK2,
22 AutoRebase(AutoRebase),
24 AutoSquash(AutoSquash),
26 CommuteThroughMultis,
28 DecomposeArbitrarilyControlledGates,
30 DecomposeBoxes(DecomposeBoxes),
32 DecomposeMultiQubitsCX,
34 DecomposeSingleQubitsTK1,
36 PeepholeOptimise2Q(PeepholeOptimise2Q),
38 RebaseTket,
40 RebaseUFR,
42 RemoveRedundancies,
44 SynthesiseTK,
46 SynthesiseTket,
48 SynthesiseOQC,
50 SquashTK1,
52 SquashRzPhasedX,
54 FlattenRegisters,
56 DelayMeasures(DelayMeasures),
58 ZZPhaseToRz,
60 RemoveDiscarded,
62 SimplifyMeasured,
64 RemoveBarriers,
66 RemovePhaseOps,
68 DecomposeBridges,
70 KAKDecomposition(KAKDecomposition),
72 ThreeQubitSquash(ThreeQubitSquash),
74 FullPeepholeOptimise(FullPeepholeOptimise),
76 ComposePhasePolyBoxes(ComposePhasePolyBoxes),
78 EulerAngleReduction(EulerAngleReduction),
80 RoutingPass(RoutingPass),
82 CustomRoutingPass(CustomRoutingPass),
84 PlacementPass(PlacementPass),
86 NaivePlacementPass(NaivePlacementPass),
88 RenameQubitsPass(RenameQubitsPass),
90 CliffordSimp(CliffordSimp),
92 DecomposeSwapsToCXs(DecomposeSwapsToCXs),
94 DecomposeSwapsToCircuit(DecomposeSwapsToCircuit),
96 OptimisePhaseGadgets(OptimisePhaseGadgets),
98 OptimisePairwiseGadgets,
100 PauliSimp(PauliSynthesisConfig),
102 PauliExponentials(PauliSynthesisConfig),
104 GuidedPauliSimp(PauliSynthesisConfig),
106 SimplifyInitial(SimplifyInitial),
108 FullMappingPass(FullMappingPass),
110 DefaultMappingPass(DefaultMappingPass),
112 CXMappingPass(CXMappingPass),
114 PauliSquash(PauliSynthesisConfig),
116 ContextSimp(ContextSimp),
118 DecomposeTK2(DecomposeTK2),
120 CnXPairwiseDecomposition,
122 RemoveImplicitQubitPermutation,
124 NormaliseTK2,
126 RoundAngles(RoundAngles),
128 GreedyPauliSimp(GreedyPauliSimp),
130 RxFromSX,
132 FlattenRelabelRegistersPass(FlattenRelabelRegistersPass),
134}
135
136#[cfg_attr(feature = "schemars", derive(JsonSchema))]
138#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
139pub struct AutoRebase {
140 pub basis_allowed: Vec<String>,
142 pub allow_swaps: bool,
144}
145
146#[cfg_attr(feature = "schemars", derive(JsonSchema))]
148#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
149pub struct AutoSquash {
150 pub basis_singleqs: Vec<String>,
152}
153
154#[cfg_attr(feature = "schemars", derive(JsonSchema))]
156#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
157pub struct DecomposeBoxes {
158 pub excluded_types: Vec<String>,
160 pub excluded_opgroups: Vec<String>,
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub included_types: Option<Vec<String>>,
165 #[serde(skip_serializing_if = "Option::is_none")]
167 pub included_opgroups: Option<Vec<String>>,
168}
169
170#[cfg_attr(feature = "schemars", derive(JsonSchema))]
172#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
173pub struct PeepholeOptimise2Q {
174 pub allow_swaps: bool,
176}
177
178#[cfg_attr(feature = "schemars", derive(JsonSchema))]
180#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
181pub struct KAKDecomposition {
182 pub fidelity: f64,
184 pub allow_swaps: bool,
186 pub target_2qb_gate: TargetTwoQubitGate,
188}
189
190#[cfg_attr(feature = "schemars", derive(JsonSchema))]
192#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
193pub struct ThreeQubitSquash {
194 pub allow_swaps: bool,
196}
197
198#[cfg_attr(feature = "schemars", derive(JsonSchema))]
200#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
201pub struct FullPeepholeOptimise {
202 pub allow_swaps: bool,
204 pub target_2qb_gate: TargetTwoQubitGate,
206}
207
208#[cfg_attr(feature = "schemars", derive(JsonSchema))]
210#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
211pub struct ComposePhasePolyBoxes {
212 pub min_size: u32,
214}
215
216#[cfg_attr(feature = "schemars", derive(JsonSchema))]
218#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
219pub struct EulerAngleReduction {
220 pub euler_p: RotationAxis,
222 pub euler_q: RotationAxis,
224 pub euler_strict: bool,
226}
227
228#[cfg_attr(feature = "schemars", derive(JsonSchema))]
230#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
231pub struct RoutingPass {
232 pub architecture: Architecture,
234 pub routing_config: RoutingConfig,
236}
237
238#[cfg_attr(feature = "schemars", derive(JsonSchema))]
240#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
241pub struct CustomRoutingPass {
242 pub architecture: Architecture,
244 pub routing_config: RoutingConfig,
246}
247
248#[cfg_attr(feature = "schemars", derive(JsonSchema))]
250#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
251pub struct PlacementPass {
252 pub placement: Placement,
254}
255
256#[cfg_attr(feature = "schemars", derive(JsonSchema))]
258#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
259pub struct NaivePlacementPass {
260 pub architecture: Architecture,
262}
263
264#[cfg_attr(feature = "schemars", derive(JsonSchema))]
266#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
267pub struct RenameQubitsPass {
268 pub qubit_map: Vec<QubitMapping>,
270}
271
272#[cfg_attr(feature = "schemars", derive(JsonSchema))]
274#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
275pub struct CliffordSimp {
276 pub allow_swaps: bool,
278 pub target_2qb_gate: TargetTwoQubitGate,
280}
281
282#[cfg_attr(feature = "schemars", derive(JsonSchema))]
284#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
285pub struct DecomposeSwapsToCXs {
286 pub architecture: Architecture,
288 pub directed: bool,
290}
291
292#[cfg_attr(feature = "schemars", derive(JsonSchema))]
294#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
295pub struct DecomposeSwapsToCircuit {
296 pub swap_replacement: Box<SerialCircuit>,
298}
299
300#[cfg_attr(feature = "schemars", derive(JsonSchema))]
302#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
303pub struct OptimisePhaseGadgets {
304 pub cx_config: CxConfig,
306}
307
308#[cfg_attr(feature = "schemars", derive(JsonSchema))]
310#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
311pub struct PauliSynthesisConfig {
312 pub pauli_synth_strat: PauliSynthStrategy,
314 pub cx_config: CxConfig,
316}
317
318#[cfg_attr(feature = "schemars", derive(JsonSchema))]
320#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
321pub struct SimplifyInitial {
322 pub allow_classical: bool,
324 pub create_all_qubits: bool,
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub x_circuit: Option<Box<SerialCircuit>>,
329}
330
331#[cfg_attr(feature = "schemars", derive(JsonSchema))]
333#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
334pub struct FullMappingPass {
335 pub architecture: Architecture,
337 pub placement: Placement,
339 pub routing_config: RoutingConfig,
341}
342
343#[cfg_attr(feature = "schemars", derive(JsonSchema))]
345#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
346pub struct DefaultMappingPass {
347 pub architecture: Architecture,
349 pub delay_measures: bool,
351}
352
353#[cfg_attr(feature = "schemars", derive(JsonSchema))]
355#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
356pub struct CXMappingPass {
357 pub architecture: Architecture,
359 pub placement: Placement,
361 pub routing_config: RoutingConfig,
363 pub directed: bool,
365 pub delay_measures: bool,
367}
368
369#[cfg_attr(feature = "schemars", derive(JsonSchema))]
371#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
372pub struct ContextSimp {
373 pub allow_classical: bool,
375 pub x_circuit: Box<SerialCircuit>,
377}
378
379#[cfg_attr(feature = "schemars", derive(JsonSchema))]
381#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
382pub struct DecomposeTK2 {
383 #[serde(skip_serializing_if = "Option::is_none")]
385 pub fidelities: Option<DecomposeTK2Fidelities>,
386 pub allow_swaps: bool,
390}
391
392#[cfg_attr(feature = "schemars", derive(JsonSchema))]
394#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
395pub struct RoundAngles {
396 pub n: i64,
398 pub only_zeros: bool,
400}
401
402#[cfg_attr(feature = "schemars", derive(JsonSchema))]
404#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
405pub struct GreedyPauliSimp {
406 pub discount_rate: f64,
408 pub depth_weight: f64,
410 pub max_lookahead: f64,
412 pub max_tqe_candidates: f64,
414 pub seed: f64,
416 pub allow_zzphase: bool,
418 pub thread_timeout: f64,
420 pub only_reduce: bool,
422 pub trials: f64,
424}
425
426#[cfg_attr(feature = "schemars", derive(JsonSchema))]
428#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
429pub struct DelayMeasures {
430 pub allow_partial: bool,
432}
433
434#[cfg_attr(feature = "schemars", derive(JsonSchema))]
439#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
440pub struct FlattenRelabelRegistersPass {
441 pub label: String,
443}
444
445#[cfg_attr(feature = "schemars", derive(JsonSchema))]
453#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
454pub struct QubitMapping(pub ElementId, pub ElementId);
455
456pub type RoutingConfig = Vec<RoutingMethod>;
458
459#[cfg_attr(feature = "schemars", derive(JsonSchema))]
461#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
462pub struct RoutingMethod {
463 pub name: String,
465}
466
467#[cfg_attr(feature = "schemars", derive(JsonSchema))]
469#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
470pub struct DecomposeTK2Fidelities {
471 #[serde(rename = "CX", skip_serializing_if = "Option::is_none")]
473 pub cx: Option<f64>,
474 #[serde(rename = "ZZMax", skip_serializing_if = "Option::is_none")]
476 pub zz_max: Option<f64>,
477 #[serde(rename = "ZZPhase", skip_serializing_if = "Option::is_none")]
479 pub zz_phase: Option<f64>,
480}
481
482#[cfg_attr(feature = "schemars", derive(JsonSchema))]
484#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
485pub enum RotationAxis {
486 Rx,
488 Ry,
490 Rz,
492}
493
494#[cfg_attr(feature = "schemars", derive(JsonSchema))]
496#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
497pub enum TargetTwoQubitGate {
498 CX,
500 TK2,
502}
503
504#[cfg_attr(feature = "schemars", derive(JsonSchema))]
506#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
507pub enum CxConfig {
508 Snake,
510 Tree,
512 Star,
514 MultiQGate,
518}
519
520#[cfg_attr(feature = "schemars", derive(JsonSchema))]
522#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq)]
523pub enum PauliSynthStrategy {
524 Individual,
526 Pairwise,
530 Sets,
532 Greedy,
540}