diff --git a/include/Dialect/Pulse/Utils/Utils.h b/include/Dialect/Pulse/Utils/Utils.h index 2cdea100c..ec2cf8e9e 100644 --- a/include/Dialect/Pulse/Utils/Utils.h +++ b/include/Dialect/Pulse/Utils/Utils.h @@ -82,4 +82,21 @@ MixFrameOp getMixFrameOp(PulseOpTy pulseOp, return mixFrameOp; } +template +llvm::StringRef getMixFrameName(PulseOpTy pulseOp, SequenceOp sequenceOp) { + + auto frameArgIndex = + pulseOp.getTarget().template cast().getArgNumber(); + + assert(sequenceOp->hasAttrOfType("pulse.args") and + "no pulse.args found for the pulse cal sequence."); + + auto argAttr = sequenceOp->getAttrOfType("pulse.args"); + + llvm::StringRef frameName = + argAttr[frameArgIndex].template dyn_cast().getValue(); + + return frameName; +} + } // end namespace mlir::pulse diff --git a/lib/Conversion/QUIRToPulse/LoadPulseCals.cpp b/lib/Conversion/QUIRToPulse/LoadPulseCals.cpp index 0ae5b2fee..e6d7d33b4 100644 --- a/lib/Conversion/QUIRToPulse/LoadPulseCals.cpp +++ b/lib/Conversion/QUIRToPulse/LoadPulseCals.cpp @@ -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" @@ -145,7 +146,9 @@ void LoadPulseCalsPass::loadPulseCals(CallCircuitOp callCircuitOp, loadPulseCals(castOp, callCircuitOp, funcOp); else if (auto castOp = dyn_cast(op)) loadPulseCals(castOp, callCircuitOp, funcOp); - else { + else if (isa(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() and !op->hasTrait()) && diff --git a/lib/Conversion/QUIRToPulse/QUIRToPulse.cpp b/lib/Conversion/QUIRToPulse/QUIRToPulse.cpp index 6bfd4e7b3..b01fd5d9a 100644 --- a/lib/Conversion/QUIRToPulse/QUIRToPulse.cpp +++ b/lib/Conversion/QUIRToPulse/QUIRToPulse.cpp @@ -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(op)) @@ -216,6 +221,11 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp, PulseOpSchedulingInterface::setDuration(pulseCalCallSequenceOp, durValue); } + } else if (isa(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(quirOp) or isa(quirOp) or isa(quirOp))) && @@ -229,7 +239,7 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp, convertedPulseSequenceOpReturnTypes.size())); convertedPulseSequenceOp.setType(newFuncType); entryBuilder.create( - convertedPulseSequenceOp.back().back().getLoc(), + convertedPulseSequenceOp.getLoc(), mlir::ValueRange{convertedPulseSequenceOpReturnValues}); convertedPulseSequenceOp->moveBefore(mainFunc); @@ -239,7 +249,6 @@ QUIRToPulsePass::convertCircuitToSequence(CallCircuitOp &callCircuitOp, convertedPulseSequenceOp, convertedPulseSequenceOpArgs); convertedPulseCallSequenceOp->moveAfter(callCircuitOp); - return convertedPulseCallSequenceOp; }