Skip to content

Commit

Permalink
remove qubits from SynchronizeOp (openqasm#322)
Browse files Browse the repository at this point in the history
Remove qubit arguments from qcs.syncronize when converting to pulse.
  • Loading branch information
bcdonovan committed Apr 26, 2024
1 parent f791a97 commit 9f75e72
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 3 deletions.
17 changes: 17 additions & 0 deletions include/Dialect/Pulse/Utils/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,21 @@ MixFrameOp getMixFrameOp(PulseOpTy pulseOp,
return mixFrameOp;
}

template <typename PulseOpTy>
llvm::StringRef getMixFrameName(PulseOpTy pulseOp, SequenceOp sequenceOp) {

auto frameArgIndex =
pulseOp.getTarget().template cast<BlockArgument>().getArgNumber();

assert(sequenceOp->hasAttrOfType<ArrayAttr>("pulse.args") and
"no pulse.args found for the pulse cal sequence.");

auto argAttr = sequenceOp->getAttrOfType<ArrayAttr>("pulse.args");

llvm::StringRef frameName =
argAttr[frameArgIndex].template dyn_cast<StringAttr>().getValue();

return frameName;
}

} // end namespace mlir::pulse
5 changes: 4 additions & 1 deletion lib/Conversion/QUIRToPulse/LoadPulseCals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "Dialect/Pulse/IR/PulseDialect.h"
#include "Dialect/Pulse/IR/PulseOps.h"
#include "Dialect/QCS/IR/QCSOps.h"
#include "Dialect/QUIR/IR/QUIROps.h"
#include "Dialect/QUIR/IR/QUIRTraits.h"
#include "Dialect/QUIR/Utils/Utils.h"
Expand Down Expand Up @@ -145,7 +146,9 @@ void LoadPulseCalsPass::loadPulseCals(CallCircuitOp callCircuitOp,
loadPulseCals(castOp, callCircuitOp, funcOp);
else if (auto castOp = dyn_cast<mlir::quir::ResetQubitOp>(op))
loadPulseCals(castOp, callCircuitOp, funcOp);
else {
else if (isa<mlir::qcs::DelayCyclesOp>(op)) {
// no pulse call to load for a delay cycles op
} else {
LLVM_DEBUG(llvm::dbgs() << "no pulse cal loading needed for " << op);
assert((!op->hasTrait<mlir::quir::UnitaryOp>() and
!op->hasTrait<mlir::quir::CPTPOp>()) &&
Expand Down
13 changes: 11 additions & 2 deletions lib/Conversion/QUIRToPulse/QUIRToPulse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ void QUIRToPulsePass::runOnOperation() {
// erase circuit ops
moduleOp->walk([&](CircuitOp circOp) { circOp->erase(); });

// Remove all arguments from synchronization ops
moduleOp->walk([](qcs::SynchronizeOp synchOp) {
synchOp.getQubitsMutable().assign(ValueRange({}));
});

// erase qubit ops and constant angle ops
moduleOp->walk([&](Operation *op) {
if (isa<mlir::quir::DeclareQubitOp>(op))
Expand Down Expand Up @@ -216,6 +221,11 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp,
PulseOpSchedulingInterface::setDuration(pulseCalCallSequenceOp,
durValue);
}
} else if (isa<qcs::DelayCyclesOp>(quirOp)) {
// a qcs.delay_cycles may be inserted into a quir.circuit and should be
// placed outside of the sequence at the call point
auto *newDelayCyclesOp = builder.clone(*quirOp);
newDelayCyclesOp->moveAfter(callCircuitOp);
} else
assert(((isa<quir::ConstantOp>(quirOp) or isa<quir::ReturnOp>(quirOp) or
isa<quir::CircuitOp>(quirOp))) &&
Expand All @@ -229,7 +239,7 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp,
convertedPulseSequenceOpReturnTypes.size()));
convertedPulseSequenceOp.setType(newFuncType);
entryBuilder.create<mlir::pulse::ReturnOp>(
convertedPulseSequenceOp.back().back().getLoc(),
convertedPulseSequenceOp.getLoc(),
mlir::ValueRange{convertedPulseSequenceOpReturnValues});
convertedPulseSequenceOp->moveBefore(mainFunc);

Expand All @@ -239,7 +249,6 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp,
convertedPulseSequenceOp,
convertedPulseSequenceOpArgs);
convertedPulseCallSequenceOp->moveAfter(callCircuitOp);

return convertedPulseCallSequenceOp;
}

Expand Down

0 comments on commit 9f75e72

Please sign in to comment.