CIRCT
23.0.0git
Loading...
Searching...
No Matches
lib
Conversion
ConvertToLLVM
ConvertToLLVM.cpp
Go to the documentation of this file.
1
//===- ConvertToLLVM.cpp - ConvertToLLVM Pass ----------------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file implements the ConvertToLLVM pass.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "
circt/Conversion/ConvertToLLVM.h
"
14
#include "
circt/Conversion/CombToArith.h
"
15
#include "
circt/Conversion/CombToLLVM.h
"
16
#include "
circt/Conversion/HWToLLVM.h
"
17
#include "
circt/Dialect/Comb/CombOps.h
"
18
#include "
circt/Dialect/SV/SVOps.h
"
19
#include "mlir/Conversion/ArithToLLVM/ArithToLLVM.h"
20
#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
21
#include "mlir/Conversion/FuncToLLVM/ConvertFuncToLLVM.h"
22
#include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h"
23
#include "mlir/Conversion/LLVMCommon/ConversionTarget.h"
24
#include "mlir/Conversion/LLVMCommon/Pattern.h"
25
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
26
#include "mlir/Dialect/Arith/IR/Arith.h"
27
#include "mlir/Dialect/Func/IR/FuncOps.h"
28
#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
29
#include "mlir/Pass/Pass.h"
30
#include "mlir/Transforms/DialectConversion.h"
31
32
using namespace
mlir
;
33
using namespace
circt
;
34
35
namespace
circt
{
36
#define GEN_PASS_DEF_CONVERTTOLLVM
37
#include "circt/Conversion/Passes.h.inc"
38
39
namespace
impl {
40
41
//===----------------------------------------------------------------------===//
42
// Pass Implementation
43
//===----------------------------------------------------------------------===//
44
45
struct
ConvertToLLVMPass
:
public
ConvertToLLVMBase
<ConvertToLLVMPass> {
46
void
runOnOperation
()
override
;
47
48
private
:
49
void
convertFuncOp
(func::FuncOp funcOp);
50
};
51
52
void
ConvertToLLVMPass::runOnOperation
() {
53
// Iterate over all func.func operations in the module and convert them
54
for
(
auto
funcOp :
55
llvm::make_early_inc_range(getOperation().getOps<func::FuncOp>())) {
56
convertFuncOp
(funcOp);
57
}
58
}
59
60
void
ConvertToLLVMPass::convertFuncOp
(func::FuncOp funcOp) {
61
MLIRContext *
context
= &getContext();
62
RewritePatternSet
patterns
(
context
);
63
auto
converter = mlir::LLVMTypeConverter(
context
);
64
65
// Add HW to LLVM type conversions
66
populateHWToLLVMTypeConversions
(converter);
67
68
LLVMConversionTarget target(*
context
);
69
target.addIllegalDialect<comb::CombDialect>();
70
target.addIllegalDialect<arith::ArithDialect>();
71
72
// Mark HW and SV dialects as legal - we only convert operations inside
73
// func.func
74
target.addLegalDialect<hw::HWDialect>();
75
target.addLegalDialect<sv::SVDialect>();
76
77
// Mark hw.constant as illegal so it gets converted to arith.constant
78
// (via CombToArith) and then to llvm.mlir.constant
79
target.addIllegalOp<
hw::ConstantOp
>();
80
81
// Setup the conversion patterns in the correct order:
82
// 1. SCF to ControlFlow (for structured control flow)
83
populateSCFToControlFlowConversionPatterns(
patterns
);
84
85
// 2. Func to LLVM (for function operations)
86
populateFuncToLLVMConversionPatterns(converter,
patterns
);
87
88
// 3. ControlFlow to LLVM (for control flow operations)
89
cf::populateControlFlowToLLVMConversionPatterns(converter,
patterns
);
90
91
// 4. Comb to Arith (for most combinational operations)
92
populateCombToArithConversionPatterns
(converter,
patterns
);
93
94
// 5. Arith to LLVM (for arithmetic operations)
95
arith::populateArithToLLVMConversionPatterns(converter,
patterns
);
96
97
// 6. Index to LLVM (for index operations)
98
index::populateIndexToLLVMConversionPatterns(converter,
patterns
);
99
100
// 7. Any function op interface type conversion
101
populateAnyFunctionOpInterfaceTypeConversionPattern(
patterns
, converter);
102
103
// 8. Comb to LLVM (for operations without Comb-to-Arith patterns, like
104
// parity)
105
populateCombToLLVMConversionPatterns
(converter,
patterns
);
106
107
// Apply the partial conversion only to this func.func operation
108
if
(failed(applyPartialConversion(funcOp, target, std::move(
patterns
))))
109
signalPassFailure();
110
}
111
112
}
// namespace impl
113
}
// namespace circt
CombOps.h
CombToArith.h
CombToLLVM.h
ConvertToLLVM.h
context
static std::unique_ptr< Context > context
Definition
DpiEntryPoints.cpp:37
HWToLLVM.h
SVOps.h
ConvertToLLVMBase
hw.ConstantOp
Definition
hw.py:430
circt
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
Definition
DebugAnalysis.h:21
circt::populateCombToArithConversionPatterns
void populateCombToArithConversionPatterns(TypeConverter &converter, RewritePatternSet &patterns)
circt::populateCombToLLVMConversionPatterns
void populateCombToLLVMConversionPatterns(mlir::LLVMTypeConverter &converter, RewritePatternSet &patterns)
Get the Comb to LLVM conversion patterns.
circt::populateHWToLLVMTypeConversions
void populateHWToLLVMTypeConversions(mlir::LLVMTypeConverter &converter)
Get the HW to LLVM type conversions.
mlir
Definition
DebugAnalysis.h:16
patterns
Definition
LTLFolds.cpp:45
circt::impl::ConvertToLLVMPass
Definition
ConvertToLLVM.cpp:45
circt::impl::ConvertToLLVMPass::convertFuncOp
void convertFuncOp(func::FuncOp funcOp)
Definition
ConvertToLLVM.cpp:60
circt::impl::ConvertToLLVMPass::runOnOperation
void runOnOperation() override
Definition
ConvertToLLVM.cpp:52
Generated on Thu Mar 12 2026 00:10:17 for CIRCT by
1.9.8