Skip to content

Commit 501d3d0

Browse files
authored
Test for overlap with all quantum operations in MergeCircuitsPass (#244)
Handle quir operations in addition to barriers between quir.circuit_ops and test for qubit overlap in the same way currently being applied to quir.barriers.
1 parent 8e8ef73 commit 501d3d0

File tree

3 files changed

+30
-11
lines changed

3 files changed

+30
-11
lines changed

lib/Dialect/QUIR/Transforms/MergeCircuits.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,17 +96,16 @@ struct CircuitAndCircuitPattern : public OpRewritePattern<CallCircuitOp> {
9696
if (nextCallCircuitOp)
9797
break;
9898

99-
// check for overlapping BarrierOp and fail if found
100-
auto barrierOp = dyn_cast<BarrierOp>(*secondOp);
101-
if (barrierOp) {
102-
std::set<uint> firstQubits =
103-
QubitOpInterface::getOperatedQubits(callCircuitOp);
104-
std::set<uint> secondQubits =
105-
QubitOpInterface::getOperatedQubits(barrierOp);
106-
107-
if (QubitOpInterface::qubitSetsOverlap(firstQubits, secondQubits))
108-
return failure();
109-
}
99+
// check for overlap in qubits between the circuit and the
100+
// next quantum circuit which is not a CallCircuit
101+
// fail if there is overlap
102+
std::set<uint> firstQubits =
103+
QubitOpInterface::getOperatedQubits(callCircuitOp);
104+
std::set<uint> secondQubits =
105+
QubitOpInterface::getOperatedQubits(*secondOp);
106+
107+
if (QubitOpInterface::qubitSetsOverlap(firstQubits, secondQubits))
108+
return failure();
110109

111110
searchOp = *secondOp;
112111
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
fixes:
3+
- |
4+
Fixes bug related to assumption in MergeCircuitsPass that all quantum instructions
5+
are located in a quir.circuit when attempting to merge circuits. Applies the qubit overlap
6+
test to all quantum operations in between quir.call_circuit calls.

test/Dialect/QUIR/Transforms/merge-circuits.mlir

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ module {
5757
%1 = quir.measure(%arg0) : (!quir.qubit<1>) -> i1
5858
quir.return %0, %1: i1, i1
5959
}
60+
quir.circuit @circuit_9(%arg0: !quir.qubit<1>) -> (i1, i1) {
61+
%0 = quir.measure(%arg0) : (!quir.qubit<1>) -> i1
62+
%1 = quir.measure(%arg0) : (!quir.qubit<1>) -> i1
63+
quir.return %0, %1: i1, i1
64+
}
6065
// CHECK: @circuit_0_q0_circuit_1_q1(%arg0: !quir.qubit<1>
6166
// CHECK: %0 = quir.measure(%arg0) : (!quir.qubit<1>) -> i1
6267
// CHECK: %1 = quir.measure(%arg1) : (!quir.qubit<1>) -> i1
@@ -126,6 +131,15 @@ module {
126131
%17:2 = quir.call_circuit @circuit_8(%0) : (!quir.qubit<1>) -> (i1, i1)
127132
// CHECK-NOT: %{{.*}}:4 = quir.call_circuit @circuit_8_q0_circuit_8_q0(%0) : (!quir.qubit<1>) -> (i1, i1, i1, i1)
128133

134+
quir.barrier %0, %1, %200, %201, %202 : (!quir.qubit<1>, !quir.qubit<1>, !quir.qubit<1>, !quir.qubit<1>, !quir.qubit<1>) -> ()
135+
%18:2 = quir.call_circuit @circuit_9(%0) : (!quir.qubit<1>) -> (i1, i1)
136+
// CHECK: %{{.*}}:2 = quir.call_circuit @circuit_9_q0(%0) : (!quir.qubit<1>) -> (i1, i1)
137+
%19 = quir.measure(%0) {quir.noReportRuntime} : (!quir.qubit<1>) -> i1
138+
// CHECK: %{{.*}} = quir.measure(%0) {quir.noReportRuntime} : (!quir.qubit<1>) -> i1
139+
%20:2 = quir.call_circuit @circuit_9(%0) : (!quir.qubit<1>) -> (i1, i1)
140+
// CHECK: %{{.*}}:2 = quir.call_circuit @circuit_9_q0(%0) : (!quir.qubit<1>) -> (i1, i1)
141+
// CHECK-NOT: %{{.*}}:4 = quir.call_circuit @circuit_9_q0_circuit_9_q0(%0) : (!quir.qubit<1>) -> (i1, i1, i1, i1)
142+
129143
%c0_i32 = arith.constant 0 : i32
130144
return %c0_i32 : i32
131145
}

0 commit comments

Comments
 (0)