-
-
Notifications
You must be signed in to change notification settings - Fork 59
✨ Add power modifier to MLIR #1603
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
95f900b
27dae23
c553825
b315b8b
5920184
e1e1b71
5451cff
b264388
15441ba
2921f3e
a34df67
36c1ea9
f6083bc
5bb0823
c333360
40a42f7
2bbeeb4
16fc46b
ca05454
c2e42f6
6ef5eed
32868a2
3c355d4
bb16c83
3b54b8d
13df503
bb1ec8a
46cfe0c
a74a7d1
eadac62
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -700,6 +700,64 @@ struct ConvertQCOInvOp final : OpConversionPattern<qco::InvOp> { | |
| } | ||
| }; | ||
|
|
||
| /** | ||
| * @brief Converts qco.pow to qc.pow | ||
| * | ||
| * @par Example: | ||
| * ```mlir | ||
| * %q0_out = qco.pow (2.000000e+00) (%a_in = %q0_in) { | ||
| * %a_res = qco.s %a_in : !qco.qubit -> !qco.qubit | ||
| * qco.yield %a_res | ||
| * } : {!qco.qubit} -> {!qco.qubit} | ||
| * ``` | ||
| * is converted to | ||
| * ```mlir | ||
| * qc.pow(2.000000e+00) { | ||
| * qc.s %q0 : !qc.qubit | ||
| * } | ||
| * ``` | ||
| */ | ||
| struct ConvertQCOPowOp final : OpConversionPattern<qco::PowOp> { | ||
| using OpConversionPattern::OpConversionPattern; | ||
|
|
||
| LogicalResult | ||
| matchAndRewrite(qco::PowOp op, OpAdaptor adaptor, | ||
| ConversionPatternRewriter& rewriter) const override { | ||
| // Create qc.pow operation with exponent | ||
| auto qcOp = qc::PowOp::create(rewriter, op.getLoc(), adaptor.getExponent()); | ||
|
|
||
| // Clone body region from QCO to QC | ||
| auto& dstRegion = qcOp.getRegion(); | ||
| rewriter.cloneRegionBefore(op.getRegion(), dstRegion, dstRegion.end()); | ||
|
|
||
| auto& entryBlock = dstRegion.front(); | ||
| const auto numArgs = entryBlock.getNumArguments(); | ||
| if (adaptor.getQubitsIn().size() != numArgs) { | ||
| return op.emitOpError() << "qco.pow: entry block args (" << numArgs | ||
| << ") must match number of target operands (" | ||
| << adaptor.getQubitsIn().size() << ")"; | ||
| } | ||
|
|
||
| // Remove all block arguments in the cloned region | ||
| rewriter.modifyOpInPlace(qcOp, [&] { | ||
| // 1. Replace uses (Must be done BEFORE erasing) | ||
| for (auto i = 0UL; i < numArgs; ++i) { | ||
| entryBlock.getArgument(i).replaceAllUsesWith(adaptor.getQubitsIn()[i]); | ||
| } | ||
|
|
||
| // 2. Erase all block arguments | ||
| if (numArgs > 0) { | ||
| entryBlock.eraseArguments(0, numArgs); | ||
| } | ||
| }); | ||
|
|
||
| // Replace the output qubits with the same QC references | ||
| rewriter.replaceOp(op, adaptor.getQubitsIn()); | ||
|
|
||
|
Comment on lines
+729
to
+756
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick | 🔵 Trivial Extract shared helper for cloned-region arg remapping. The block-argument remap/erase sequence here duplicates logic already present in 🤖 Prompt for AI Agents |
||
| return success(); | ||
| } | ||
| }; | ||
|
|
||
| /** | ||
| * @brief Converts qco.yield to qc.yield or to scf.yield if the parent is a | ||
| * scf::IfOp | ||
|
|
@@ -1002,9 +1060,10 @@ struct QCOToQC final : impl::QCOToQCBase<QCOToQC> { | |
| #undef MQT_ADD_QCO_TO_QC_GATE | ||
|
|
||
| patterns.add<ConvertQCOBarrierOp, ConvertQCOCtrlOp, ConvertQCOInvOp, | ||
| ConvertQCOYieldOp, ConvertQCOIfOp, ConvertQCOSCFWhileOp, | ||
| ConvertQCOSCFConditionOp, ConvertQCOSCFYieldOp, | ||
| ConvertQCOSCFForOp>(typeConverter, context); | ||
| ConvertQCOPowOp, ConvertQCOYieldOp, ConvertQCOIfOp, | ||
| ConvertQCOSCFWhileOp, ConvertQCOSCFConditionOp, | ||
| ConvertQCOSCFYieldOp, ConvertQCOSCFForOp>(typeConverter, | ||
| context); | ||
|
|
||
| // Register operation conversion patterns that need state tracking | ||
| patterns.add<ConvertQTensorExtractOp, ConvertQTensorAllocOp, | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.