Commit 025fc48e authored by Nguyen, Thien Minh's avatar Nguyen, Thien Minh
Browse files

Boiler plate for injecting mirror circuit to MLIR rep in validation mode



Signed-off-by: default avatarThien Nguyen <nguyentm@ornl.gov>
parent 1fe64ee6
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -53,6 +53,9 @@ cl::opt<bool> mlir_quantum_opt(
    "q-optimize",
    cl::desc("Turn on MLIR-level quantum instruction optimizations."));

cl::opt<bool> mlir_quantum_validate(
    "q-validate", cl::desc("Turn on MLIR-level validation transformation."));

cl::opt<std::string> mlir_specified_func_name(
    "internal-func-name", cl::desc("qcor provided function name"));

@@ -153,10 +156,9 @@ int main(int argc, char **argv) {
  std::string RED = "\033[91m";
  std::string CLEAR = "\033[0m";

  if (qoptimizations) {
    // Add optimization passes
    qcor::configureOptimizationPasses(pm);
  }
  // Add optimization passes and/or validation passes
  qcor::configureOptimizationPasses(pm,
                                    {qoptimizations, mlir_quantum_validate});

  if (emitAction == Action::DumpMLIR) {
    if (qoptimizations) {
+1 −1
Original line number Diff line number Diff line

set(LIBRARY_NAME quantum-to-llvm-lowering)

file(GLOB SRC *.cpp lowering/*.cpp optimizations/*.cpp)
file(GLOB SRC *.cpp lowering/*.cpp optimizations/*.cpp validation/*.cpp)

add_subdirectory(optimizations/utils)

+43 −30
Original line number Diff line number Diff line
@@ -20,16 +20,23 @@
#include "optimizations/ModifierBlockInliner.hpp"
#include "quantum_to_llvm.hpp"
#include "lowering/ModifierRegionLowering.hpp"

#include "validation/MirrorCircuitPass.hpp"
// Construct QCOR MLIR pass manager:
// Make sure we use the same set of passes and configs
// across different use cases of MLIR compilation.
namespace qcor {
void configureOptimizationPasses(mlir::PassManager &passManager) {
struct PassOptions {
  bool Optimize = true;
  bool Validate = false;
};
void configureOptimizationPasses(mlir::PassManager &passManager,
                                 const PassOptions &opts = PassOptions()) {
  if (opts.Optimize) {
    // Try inline both before and after loop unroll.
    passManager.addPass(mlir::createInlinerPass());
    passManager.addPass(std::make_unique<ModifierBlockInlinerPass>());
  auto loop_unroller = mlir::createLoopUnrollPass(/*unrollFactor*/-1, /*unrollUpToFactor*/ false, /*unrollFull*/true);
    auto loop_unroller = mlir::createLoopUnrollPass(
        /*unrollFactor*/ -1, /*unrollUpToFactor*/ false, /*unrollFull*/ true);
    // Nest a pass manager that operates on functions within the one which
    // operates on ModuleOp.
    OpPassManager &nestedFunctionPM = passManager.nest<mlir::FuncOp>();
@@ -42,7 +49,8 @@ void configureOptimizationPasses(mlir::PassManager &passManager) {
    constexpr int N_REPS = 10;
    for (int i = 0; i < N_REPS; ++i) {
      // Simple Identity pair removals
    passManager.addPass(std::make_unique<SingleQubitIdentityPairRemovalPass>());
      passManager.addPass(
          std::make_unique<SingleQubitIdentityPairRemovalPass>());
      passManager.addPass(std::make_unique<CNOTIdentityPairRemovalPass>());
      passManager.addPass(std::make_unique<DuplicateResetRemovalPass>());

@@ -59,4 +67,9 @@ void configureOptimizationPasses(mlir::PassManager &passManager) {
    // Remove dead code
    passManager.addPass(std::make_unique<RemoveUnusedQIRCallsPass>());
  }

  if (opts.Validate) {
    passManager.addPass(std::make_unique<MirrorCircuitTransformPass>());
  }
}
} // namespace qcor
 No newline at end of file
+23 −0
Original line number Diff line number Diff line
#include "MirrorCircuitPass.hpp"
#include "Quantum/QuantumOps.h"
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
#include "mlir/Dialect/StandardOps/IR/Ops.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/PatternMatch.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Target/LLVMIR.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/Passes.h"
#include <iostream>

namespace qcor {
void MirrorCircuitTransformPass::getDependentDialects(
    DialectRegistry &registry) const {
  registry.insert<LLVM::LLVMDialect>();
}

void MirrorCircuitTransformPass::runOnOperation() {
    // TODO
}
} // namespace qcor
 No newline at end of file
+19 −0
Original line number Diff line number Diff line
#pragma once
#include "Quantum/QuantumOps.h"
#include "mlir/Pass/Pass.h"
#include "mlir/Pass/PassManager.h"
#include "mlir/Target/LLVMIR.h"
#include "mlir/Transforms/DialectConversion.h"
#include "mlir/Transforms/Passes.h"

using namespace mlir;

namespace qcor {
// A pass to add mirror circuits to the IR
struct MirrorCircuitTransformPass
    : public PassWrapper<MirrorCircuitTransformPass, OperationPass<ModuleOp>> {
  void getDependentDialects(DialectRegistry &registry) const override;
  void runOnOperation() final;
  MirrorCircuitTransformPass() {}
};
} // namespace qcor
 No newline at end of file