77
88from bqskit .compiler .basepass import BasePass
99from bqskit .ir .circuit import Circuit
10- from bqskit .ir .gates .constant .cx import CNOTGate
10+ from bqskit .ir .gates import CircuitGate
11+ from bqskit .ir .gates import CNOTGate
12+ from bqskit .ir .operation import Operation
1113from bqskit .passes .control import ForEachBlockPass
1214from bqskit .passes .control .predicates .count import GateCountPredicate
1315from bqskit .passes .control .whileloop import WhileLoopPass
1416from bqskit .passes .partitioning .cluster import ClusteringPartitioner
1517from bqskit .passes .partitioning .quick import QuickPartitioner
1618from bqskit .passes .processing import ScanningGateRemovalPass
17- from bqskit .passes .processing import WindowOptimizationPass
1819from bqskit .passes .synthesis import QFASTDecompositionPass
19- from bqskit .passes .synthesis .leap import OptimizedLEAPPass
20+ from bqskit .passes .synthesis .leap import LEAPSynthesisPass
2021from bqskit .passes .util import UnfoldPass
2122from bqskit .qis .unitary .unitarymatrix import UnitaryLike
2223
@@ -57,15 +58,19 @@ def synthesize(utry: UnitaryLike) -> CompilationTask:
5758 _logger .warning ('Synthesis input size is very large.' )
5859
5960 inner_seq = [
60- OptimizedLEAPPass (),
61- WindowOptimizationPass (),
61+ LEAPSynthesisPass (),
6262 ScanningGateRemovalPass (),
6363 ]
6464
6565 passes : list [BasePass ] = []
6666 if num_qudits >= 5 :
6767 passes .append (QFASTDecompositionPass ())
68- passes .append (ForEachBlockPass (inner_seq ))
68+ passes .append (
69+ ForEachBlockPass (
70+ inner_seq ,
71+ replace_filter = less_2q_gates ,
72+ ),
73+ )
6974 passes .append (UnfoldPass ())
7075 else :
7176 passes .extend (inner_seq )
@@ -81,23 +86,32 @@ def optimize(circuit: Circuit) -> CompilationTask:
8186 return CompilationTask .synthesize (circuit .get_unitary ())
8287
8388 inner_seq = [
84- OptimizedLEAPPass (),
89+ LEAPSynthesisPass (),
8590 ScanningGateRemovalPass (),
8691 ]
8792
8893 passes : list [BasePass ] = []
8994 passes .append (QuickPartitioner (3 ))
90- passes .append (ForEachBlockPass (inner_seq ))
95+ passes .append (ForEachBlockPass (inner_seq , replace_filter = less_2q_gates ))
9196 passes .append (UnfoldPass ())
9297
9398 iterative_reopt = WhileLoopPass (
9499 GateCountPredicate (CNOTGate ()),
95100 [
96101 ClusteringPartitioner (3 , 4 ),
97- ForEachBlockPass (inner_seq ),
102+ ForEachBlockPass (inner_seq , replace_filter = less_2q_gates ),
98103 UnfoldPass (),
99104 ],
100105 )
101106
102107 passes .append (iterative_reopt )
103108 return CompilationTask (circuit , passes )
109+
110+
111+ def less_2q_gates (circuit : Circuit , op : Operation ) -> bool :
112+ """Replace `circuit' with `op` if has less 2 qubit gates."""
113+ if not isinstance (op , CircuitGate ):
114+ return True
115+ og_num_2q_gate = len ([op for op in op ._circuit if op .num_qudits >= 2 ])
116+ new_num_2q_gate = len ([op for op in circuit if op .num_qudits >= 2 ])
117+ return new_num_2q_gate > og_num_2q_gate
0 commit comments