forked from NVIDIA/cuda-quantum
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPipelines.cpp
More file actions
79 lines (73 loc) · 3.8 KB
/
Pipelines.cpp
File metadata and controls
79 lines (73 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*******************************************************************************
* Copyright (c) 2022 - 2025 NVIDIA Corporation & Affiliates. *
* All rights reserved. *
* *
* This source code and the accompanying materials are made available under *
* the terms of the Apache License 2.0 which accompanies this distribution. *
******************************************************************************/
#include "cudaq/Optimizer/CodeGen/Pipelines.h"
using namespace mlir;
void cudaq::opt::commonPipelineConvertToQIR(PassManager &pm,
StringRef codeGenFor,
StringRef passConfigAs) {
pm.addNestedPass<func::FuncOp>(createApplyControlNegations());
addAggressiveEarlyInlining(pm);
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createUnwindLoweringPass());
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addPass(createApplyOpSpecializationPass());
pm.addNestedPass<func::FuncOp>(createExpandMeasurementsPass());
pm.addNestedPass<func::FuncOp>(createClassicalMemToReg());
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createCSEPass());
pm.addNestedPass<func::FuncOp>(createQuakeAddDeallocs());
pm.addNestedPass<func::FuncOp>(createQuakeAddMetadata());
pm.addNestedPass<func::FuncOp>(createLoopNormalize());
LoopUnrollOptions luo;
luo.allowBreak = passConfigAs == "qir-adaptive";
pm.addNestedPass<func::FuncOp>(createLoopUnroll(luo));
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createCSEPass());
pm.addNestedPass<func::FuncOp>(createLowerToCFGPass());
pm.addNestedPass<func::FuncOp>(createCombineQuantumAllocations());
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createCSEPass());
if (passConfigAs == "qir-base")
pm.addNestedPass<func::FuncOp>(createDelayMeasurementsPass());
if (codeGenFor == "qir")
cudaq::opt::addConvertToQIRAPIPipeline(pm, "full");
else if (codeGenFor == "qir-base")
cudaq::opt::addConvertToQIRAPIPipeline(pm, "base-profile");
else if (codeGenFor == "qir-adaptive")
cudaq::opt::addConvertToQIRAPIPipeline(pm, "adaptive-profile");
else
emitError(UnknownLoc::get(pm.getContext()),
"convert to QIR must be given a valid specification to use.");
pm.addPass(createConvertMathToFuncs());
pm.addPass(createSymbolDCEPass());
pm.addPass(createCCToLLVM());
}
void cudaq::opt::addPipelineTranslateToOpenQASM(PassManager &pm) {
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createCSEPass());
pm.addNestedPass<func::FuncOp>(createClassicalMemToReg());
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addPass(createSymbolDCEPass());
}
void cudaq::opt::addPipelineTranslateToIQMJson(PassManager &pm) {
pm.addNestedPass<func::FuncOp>(createUnwindLoweringPass());
pm.addNestedPass<func::FuncOp>(createExpandMeasurementsPass());
LoopUnrollOptions luo;
pm.addNestedPass<func::FuncOp>(createLoopUnroll(luo));
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createLowerToCFGPass());
pm.addNestedPass<func::FuncOp>(createQuakeAddDeallocs());
pm.addNestedPass<func::FuncOp>(createCombineQuantumAllocations());
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
pm.addNestedPass<func::FuncOp>(createCSEPass());
}
void cudaq::opt::addPipelineConvertToQIR(PassManager &pm, StringRef convertTo) {
commonPipelineConvertToQIR(pm, convertTo, convertTo);
if (convertTo != "qir")
addQIRProfileVerify(pm, convertTo);
}