Skip to content

Commit 0bb92da

Browse files
authored
Mino revision of pulse passes/functions (#226)
This PR does a minor revision of pulse passes/functions. A new function is added to obtain the getMixFrameOp with nested call sequence ops
1 parent e4ac0a4 commit 0bb92da

File tree

4 files changed

+41
-20
lines changed

4 files changed

+41
-20
lines changed

include/Dialect/Pulse/Transforms/Scheduling.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,20 @@
2929

3030
namespace mlir::pulse {
3131

32-
struct quantumCircuitPulseSchedulingPass
33-
: public PassWrapper<quantumCircuitPulseSchedulingPass,
32+
struct QuantumCircuitPulseSchedulingPass
33+
: public PassWrapper<QuantumCircuitPulseSchedulingPass,
3434
OperationPass<ModuleOp>> {
3535
public:
3636
enum SchedulingMethod { ALAP, ASAP };
3737
SchedulingMethod SCHEDULING_METHOD = ALAP;
3838

3939
// this pass can optionally receive an string specifying the scheduling
4040
// method; default method is alap scheduling
41-
quantumCircuitPulseSchedulingPass() = default;
42-
quantumCircuitPulseSchedulingPass(
43-
const quantumCircuitPulseSchedulingPass &pass)
41+
QuantumCircuitPulseSchedulingPass() = default;
42+
QuantumCircuitPulseSchedulingPass(
43+
const QuantumCircuitPulseSchedulingPass &pass)
4444
: PassWrapper(pass) {}
45-
quantumCircuitPulseSchedulingPass(SchedulingMethod inSchedulingMethod) {
45+
QuantumCircuitPulseSchedulingPass(SchedulingMethod inSchedulingMethod) {
4646
SCHEDULING_METHOD = inSchedulingMethod;
4747
}
4848

include/Dialect/Pulse/Utils/Utils.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include "llvm/ADT/StringRef.h"
2727

28+
#include <deque>
2829
#include <vector>
2930

3031
namespace mlir {
@@ -50,4 +51,24 @@ MixFrameOp getMixFrameOp(PulseOpTy pulseOp, CallSequenceOp callSequenceOp) {
5051
return mixFrameOp;
5152
}
5253

54+
template <typename PulseOpTy>
55+
MixFrameOp
56+
getMixFrameOp(PulseOpTy pulseOp,
57+
std::deque<mlir::pulse::CallSequenceOp> &callSequenceOpStack) {
58+
59+
auto targetIndex = 0;
60+
auto target = pulseOp.getTarget();
61+
62+
for (auto it = callSequenceOpStack.rbegin(); it != callSequenceOpStack.rend();
63+
++it) {
64+
targetIndex = target.template cast<BlockArgument>().getArgNumber();
65+
target = it->getOperand(targetIndex);
66+
}
67+
68+
auto mixFrameOp = dyn_cast<mlir::pulse::MixFrameOp>(target.getDefiningOp());
69+
if (!mixFrameOp)
70+
pulseOp->emitError() << "The target argument is not a MixFrameOp.";
71+
return mixFrameOp;
72+
}
73+
5374
} // end namespace mlir::pulse

lib/Dialect/Pulse/Transforms/Passes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ void registerPulsePasses() {
4242
PassRegistration<MergeDelayPass>();
4343
PassRegistration<RemoveUnusedArgumentsPass>();
4444
PassRegistration<SchedulePortPass>();
45-
PassRegistration<quantumCircuitPulseSchedulingPass>();
45+
PassRegistration<QuantumCircuitPulseSchedulingPass>();
4646
PassRegistration<ClassicalOnlyDetectionPass>();
4747
}
4848

lib/Dialect/Pulse/Transforms/Scheduling.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
using namespace mlir;
4545
using namespace mlir::pulse;
4646

47-
void quantumCircuitPulseSchedulingPass::runOnOperation() {
47+
void QuantumCircuitPulseSchedulingPass::runOnOperation() {
4848
// check for command line override of the scheduling method
4949
if (schedulingMethod.hasValue()) {
5050
if (schedulingMethod.getValue() == "alap")
@@ -72,7 +72,7 @@ void quantumCircuitPulseSchedulingPass::runOnOperation() {
7272
});
7373
}
7474

75-
void quantumCircuitPulseSchedulingPass::scheduleAlap(
75+
void QuantumCircuitPulseSchedulingPass::scheduleAlap(
7676
mlir::pulse::CallSequenceOp quantumCircuitCallSequenceOp) {
7777

7878
auto quantumCircuitSequenceOp = getSequenceOp(quantumCircuitCallSequenceOp);
@@ -155,20 +155,20 @@ void quantumCircuitPulseSchedulingPass::scheduleAlap(
155155
LLVM_DEBUG(llvm::dbgs() << "\ttotal duration of quantum circuit "
156156
<< totalDurationOfQuantumCircuit << "\n");
157157

158-
// setting duration of the quantum circuit
159-
PulseOpSchedulingInterface::setDuration(quantumCircuitSequenceOp,
158+
// setting duration of the quantum call circuit
159+
PulseOpSchedulingInterface::setDuration(quantumCircuitCallSequenceOp,
160160
totalDurationOfQuantumCircuit);
161-
// setting timepoint of the quantum circuit; at this point, we can add
161+
// setting timepoint of the quantum call circuit; at this point, we can add
162162
// totalDurationOfQuantumCircuit to above <=0 timepoints, so that they become
163163
// >=0, however, that would require walking the IR again. Instead, we add a
164-
// postive timepoint to the parent op, i.e., quantum circuit sequence op, and
165-
// later passes would need to add this value as an offset to determine the
164+
// postive timepoint to the parent op, i.e., quantum circuit call sequence op,
165+
// and later passes would need to add this value as an offset to determine the
166166
// effective timepoints
167-
PulseOpSchedulingInterface::setTimepoint(quantumCircuitSequenceOp,
167+
PulseOpSchedulingInterface::setTimepoint(quantumCircuitCallSequenceOp,
168168
totalDurationOfQuantumCircuit);
169169
}
170170

171-
int quantumCircuitPulseSchedulingPass::getNextAvailableTimeOfPorts(
171+
int QuantumCircuitPulseSchedulingPass::getNextAvailableTimeOfPorts(
172172
mlir::ArrayAttr ports) {
173173
int nextAvailableTimeOfAllPorts = 0;
174174
for (auto attr : ports) {
@@ -184,7 +184,7 @@ int quantumCircuitPulseSchedulingPass::getNextAvailableTimeOfPorts(
184184
return nextAvailableTimeOfAllPorts;
185185
}
186186

187-
void quantumCircuitPulseSchedulingPass::updatePortAvailabilityMap(
187+
void QuantumCircuitPulseSchedulingPass::updatePortAvailabilityMap(
188188
mlir::ArrayAttr ports, int updatedAvailableTime) {
189189
for (auto attr : ports) {
190190
const std::string portName = attr.dyn_cast<StringAttr>().getValue().str();
@@ -194,7 +194,7 @@ void quantumCircuitPulseSchedulingPass::updatePortAvailabilityMap(
194194
}
195195
}
196196

197-
mlir::pulse::SequenceOp quantumCircuitPulseSchedulingPass::getSequenceOp(
197+
mlir::pulse::SequenceOp QuantumCircuitPulseSchedulingPass::getSequenceOp(
198198
mlir::pulse::CallSequenceOp callSequenceOp) {
199199
auto seqAttr = callSequenceOp->getAttrOfType<FlatSymbolRefAttr>("callee");
200200
assert(seqAttr && "Requires a 'callee' symbol reference attribute");
@@ -206,10 +206,10 @@ mlir::pulse::SequenceOp quantumCircuitPulseSchedulingPass::getSequenceOp(
206206
return sequenceOp;
207207
}
208208

209-
llvm::StringRef quantumCircuitPulseSchedulingPass::getArgument() const {
209+
llvm::StringRef QuantumCircuitPulseSchedulingPass::getArgument() const {
210210
return "quantum-circuit-pulse-scheduling";
211211
}
212212

213-
llvm::StringRef quantumCircuitPulseSchedulingPass::getDescription() const {
213+
llvm::StringRef QuantumCircuitPulseSchedulingPass::getDescription() const {
214214
return "Scheduling a quantum circuit at pulse level.";
215215
}

0 commit comments

Comments
 (0)