Skip to content
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

Add merge rotation pass #1162

Merged
merged 60 commits into from
Oct 11, 2024
Merged
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
0d85eaf
Add pattern
rmoyard Sep 30, 2024
248ab5e
Update structure
rmoyard Sep 30, 2024
9ccb01a
Update
rmoyard Oct 3, 2024
3e5d1d1
Working draft
rmoyard Oct 3, 2024
c4f46ba
Update
rmoyard Oct 3, 2024
c9d56b6
Merge branch 'main' into merge_rotations
rmoyard Oct 7, 2024
7286abc
renamed to `ChainedNamedHermitianOpRewritePattern`
paul0403 Oct 7, 2024
e1f54e5
Add test
rmoyard Oct 7, 2024
4f3f9e2
Merge branch 'merge_rotations' of https://github.com/PennyLaneAI/cata…
rmoyard Oct 7, 2024
043a5f0
MLIR test: CRY switch qubits
rmoyard Oct 7, 2024
1f87943
add pattern
paul0403 Oct 7, 2024
1458937
preprocess with cse pass so we can check param SSA values;
paul0403 Oct 7, 2024
b8b9913
tests
paul0403 Oct 7, 2024
43fcce7
format
paul0403 Oct 7, 2024
799d96e
test with explicit rotation angles
paul0403 Oct 7, 2024
b60519e
test with different explicit params
paul0403 Oct 7, 2024
84c758c
cano test
rmoyard Oct 7, 2024
e3447ef
Update
rmoyard Oct 7, 2024
a43d9ac
changelog
paul0403 Oct 7, 2024
05f5a5b
Initial draft multiRZ
rmoyard Oct 7, 2024
bc5faaf
Typo
rmoyard Oct 7, 2024
485c6d6
ctrl gates
paul0403 Oct 8, 2024
9dcfdc6
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 8, 2024
90ddcf1
remove template type in parent getter (a value will have just one def…
paul0403 Oct 8, 2024
b9acfe6
factor out a parent gate verifier analysis, so it can be reused with …
paul0403 Oct 8, 2024
13eb094
add all test cases for ctrl
paul0403 Oct 9, 2024
91beb68
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 9, 2024
ebb5169
make the named hermitian pattern use the common analysis as well
paul0403 Oct 9, 2024
5c77fb3
one more test
paul0403 Oct 9, 2024
0823116
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 9, 2024
9ae9ba7
follow include order guideline
paul0403 Oct 9, 2024
738c96a
`verified` --> `succeeded`
paul0403 Oct 9, 2024
e78cca1
move namecheck before wire verification
paul0403 Oct 10, 2024
93b1ed1
Merge remote-tracking branch 'origin/cancel_inverse_adjoint' into mer…
rmoyard Oct 10, 2024
6324fd0
Add analysis integration
rmoyard Oct 10, 2024
a6b8424
MultiRz case
rmoyard Oct 10, 2024
b24703a
Split verifier into a "normal" one and an aggressive one.
paul0403 Oct 10, 2024
2f95838
use aggressive for named gates
paul0403 Oct 10, 2024
d092540
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 10, 2024
9bc658b
add multirz
paul0403 Oct 10, 2024
1fe2622
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 10, 2024
552fae2
Merge remote-tracking branch 'origin/main' into cancel_inverse_adjoint
paul0403 Oct 11, 2024
9a7800a
Merge branch 'cancel_inverse_adjoint' into merge_rotations
rmoyard Oct 11, 2024
0660b68
changelog
paul0403 Oct 11, 2024
a7cb5af
change aggressive name to VerifyParentGateAndNameAnalysis
paul0403 Oct 11, 2024
b54fcb7
Merge branch 'cancel_inverse_adjoint' into merge_rotations
rmoyard Oct 11, 2024
02dc927
changelog grammar
paul0403 Oct 11, 2024
7ba892f
Add multirz test
rmoyard Oct 11, 2024
4fb926f
Merge branch 'cancel_inverse_adjoint' into merge_rotations
rmoyard Oct 11, 2024
4ae4281
Update doc
rmoyard Oct 11, 2024
9cee8c9
Merge branch 'merge_rotations' of https://github.com/PennyLaneAI/cata…
rmoyard Oct 11, 2024
1b970da
Update mlir/lib/Quantum/Transforms/MergeRotationsPatterns.cpp
rmoyard Oct 11, 2024
ca6df1b
Update
rmoyard Oct 11, 2024
f394838
Merge branch 'merge_rotations' of https://github.com/PennyLaneAI/cata…
rmoyard Oct 11, 2024
090d285
Merge branch 'main' into merge_rotations
rmoyard Oct 11, 2024
d0789f0
Merge branch 'merge_rotations' of https://github.com/PennyLaneAI/cata…
rmoyard Oct 11, 2024
bd0ddb6
Update
rmoyard Oct 11, 2024
01cd3f5
Remove erase
rmoyard Oct 11, 2024
def5b3a
Update
rmoyard Oct 11, 2024
0213ae7
Pylint
rmoyard Oct 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add analysis integration
  • Loading branch information
rmoyard committed Oct 10, 2024
commit 6324fd087893ccd5b786c3c8c3100639e5688a6d
52 changes: 10 additions & 42 deletions mlir/lib/Quantum/Transforms/MergeRotationsPatterns.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

#include "Quantum/IR/QuantumOps.h"
#include "Quantum/Transforms/Patterns.h"
#include "VerifyParentGateAnalysis.hpp"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/Support/Debug.h"
Expand Down Expand Up @@ -47,11 +48,9 @@ struct MergeRotationsRewritePattern : public mlir::OpRewritePattern<CustomOp> {
if (!parentOp || parentOp.getGateName() != opGateName)
rmoyard marked this conversation as resolved.
Show resolved Hide resolved
return failure();

ValueRange parentOutQubits = parentOp.getOutQubits();
// Check if the input qubits to the current operation match the output qubits of the parent.
for (const auto &[Idx, Qubit] : llvm::enumerate(inQubits)) {
if (Qubit.getDefiningOp<CustomOp>() != parentOp || Qubit != parentOutQubits[Idx])
return failure();
VerifyParentGateAnalysis<CustomOp> vpga(op);
if (!vpga.getVerifierResult()) {
return failure();
}

TypeRange outQubitsTypes = op.getOutQubits().getTypes();
Expand All @@ -62,9 +61,9 @@ struct MergeRotationsRewritePattern : public mlir::OpRewritePattern<CustomOp> {

auto parentParams = parentOp.getParams();
auto params = op.getParams();
std::vector<Value> sumParams;
SmallVector<mlir::Value> sumParams;
for (auto [param, parentParam] : llvm::zip(params, parentParams)) {
Value sumParam = rewriter.create<arith::AddFOp>(loc, parentParam, param).getResult();
mlir::Value sumParam = rewriter.create<arith::AddFOp>(loc, parentParam, param).getResult();
sumParams.push_back(sumParam);
};
auto mergeOp = rewriter.create<CustomOp>(loc, outQubitsTypes, outQubitsCtrlTypes, sumParams,
Expand All @@ -86,45 +85,14 @@ struct MergeMultiRZRewritePattern : public mlir::OpRewritePattern<MultiRZOp> {
mlir::PatternRewriter &rewriter) const override
{
LLVM_DEBUG(dbgs() << "Simplifying the following operation:\n" << op << "\n");
auto loc = op.getLoc();
ValueRange InQubits = op.getInQubits();
// auto loc = op.getLoc();
// ValueRange InQubits = op.getInQubits();

// Check parent op
auto parentOp = dyn_cast_or_null<MultiRZOp>(InQubits[0].getDefiningOp());

if (!parentOp)
VerifyParentGateAnalysis<MultiRZOp> vpga(op);
if (!vpga.getVerifierResult()) {
return failure();

// Check the target qubit
ValueRange parentOutQubits = parentOp.getOutQubits();
for (const auto &[Idx, Qubit] : llvm::enumerate(InQubits)) {
if (Qubit.getDefiningOp<CustomOp>() != parentOp || Qubit != parentOutQubits[Idx])
return failure();
}

// Check the control qubits
ValueRange inCtrlQubits = op.getInCtrlQubits();
ValueRange parentOutCtrlQubits = parentOp.getOutCtrlQubits();
for (const auto &[Idx, Qubit] : llvm::enumerate(InQubits)) {
if (Qubit.getDefiningOp<CustomOp>() != parentOp || Qubit != parentOutCtrlQubits[Idx])
return failure();
}
// Check the control values

// ...

// Sum the angles control values

// Replace operation
TypeRange outQubitsTypes = op.getOutQubits().getTypes();
TypeRange outQubitsCtrlTypes = op.getOutCtrlQubits().getTypes();
ValueRange parentInQubits = parentOp.getInQubits();
ValueRange parentInCtrlQubits = parentOp.getInCtrlQubits();
ValueRange parentInCtrlValues = parentOp.getInCtrlValues();
// op.replaceAllUsesWith(mergeOp);
// op.erase();
// parentOp.erase();

return success();
}
};
Expand Down