Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions mlir/include/mlir/Dialect/MQTOpt/Transforms/Passes.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ namespace mqt::ir::opt {
#include "mlir/Dialect/MQTOpt/Transforms/Passes.h.inc" // IWYU pragma: export

void populateGateEliminationPatterns(mlir::RewritePatternSet& patterns);
void populateGateDecompositionPatterns(mlir::RewritePatternSet& patterns);
void populateMergeRotationGatesPatterns(mlir::RewritePatternSet& patterns);
void populateElidePermutationsPatterns(mlir::RewritePatternSet& patterns);
void populateQuantumSinkShiftPatterns(mlir::RewritePatternSet& patterns);
Expand Down
45 changes: 45 additions & 0 deletions mlir/lib/Dialect/MQTOpt/Transforms/GateDecomposition.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2023 - 2025 Chair for Design Automation, TUM
* Copyright (c) 2025 Munich Quantum Software Company GmbH
* All rights reserved.
*
* SPDX-License-Identifier: MIT
*
* Licensed under the MIT License
*/

#include "mlir/Dialect/MQTOpt/Transforms/Passes.h"

#include <mlir/IR/PatternMatch.h>
#include <mlir/Support/LLVM.h>
#include <mlir/Transforms/GreedyPatternRewriteDriver.h>
#include <utility>

namespace mqt::ir::opt {

#define GEN_PASS_DEF_GATEDECOMPOSITION
#include "mlir/Dialect/MQTOpt/Transforms/Passes.h.inc"

/**
* @brief This pass attempts to cancel consecutive self-inverse operations.
*/
struct GateDecomposition final
: impl::GateDecompositionBase<GateDecomposition> {

void runOnOperation() override {
// Get the current operation being operated on.
auto op = getOperation();
auto* ctx = &getContext();

// Define the set of patterns to use.
mlir::RewritePatternSet patterns(ctx);
populateGateDecompositionPatterns(patterns);

// Apply patterns in an iterative and greedy manner.
if (mlir::failed(mlir::applyPatternsGreedily(op, std::move(patterns)))) {
signalPassFailure();
}
}
};

} // namespace mqt::ir::opt
Loading
Loading