MLIR-AIE
Translation.cpp
Go to the documentation of this file.
1//===- Translation.cpp ------------------------------------------*- C++ -*-===//
2//
3// This file is licensed 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// (c) Copyright 2023-2024 Advanced Micro Devices, Inc. or its affiliates
8//
9//===----------------------------------------------------------------------===//
10
11#include "aie-c/Translation.h"
12
15#include "aie/Targets/AIERT.h"
17
18#include "mlir-c/IR.h"
19#include "mlir-c/Support.h"
20#include "mlir/CAPI/IR.h"
21#include "mlir/CAPI/Support.h"
22#include "mlir/Dialect/LLVMIR/LLVMDialect.h"
23#include "mlir/IR/BuiltinOps.h"
24#include "mlir/Support/FileUtilities.h"
25#include "mlir/Target/LLVMIR/Export.h"
26
27#include "llvm/IR/LLVMContext.h"
28#include "llvm/IR/Module.h"
29#include "llvm/Support/Casting.h"
30#include "llvm/Support/raw_ostream.h"
31
32#include <cstdlib>
33#include <iostream>
34#include <string>
35#include <vector>
36
37using namespace llvm;
38using namespace mlir;
39using namespace xilinx::AIE;
40
41MlirStringRef aieTranslateAIEVecToCpp(MlirOperation moduleOp, bool aie2) {
42 std::string cpp;
43 llvm::raw_string_ostream os(cpp);
44 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
45 if (failed(xilinx::aievec::translateAIEVecToCpp(mod, aie2, os)))
46 return mlirStringRefCreate(nullptr, 0);
47 char *cStr = static_cast<char *>(malloc(cpp.size()));
48 cpp.copy(cStr, cpp.size());
49 return mlirStringRefCreate(cStr, cpp.size());
50};
51
52MlirStringRef aieTranslateModuleToLLVMIR(MlirOperation moduleOp) {
53 std::string llvmir;
54 llvm::raw_string_ostream os(llvmir);
55 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
56 llvm::LLVMContext llvmContext;
57 auto llvmModule = translateModuleToLLVMIR(mod, llvmContext);
58 if (!llvmModule)
59 return mlirStringRefCreate(nullptr, 0);
60 llvmModule->print(os, nullptr);
61 char *cStr = static_cast<char *>(malloc(llvmir.size()));
62 llvmir.copy(cStr, llvmir.size());
63 return mlirStringRefCreate(cStr, llvmir.size());
64}
65
66MlirLogicalResult aieTranslateToCDODirect(MlirOperation moduleOp,
67 MlirStringRef workDirPath,
68 bool bigEndian, bool emitUnified,
69 bool cdoDebug, bool aieSim,
70 bool xaieDebug, bool enableCores) {
71 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
72 auto status = AIETranslateToCDODirect(
73 mod, llvm::StringRef(workDirPath.data, workDirPath.length), bigEndian,
74 emitUnified, cdoDebug, aieSim, xaieDebug, enableCores);
75 std::vector<std::string> diagnostics;
76 ScopedDiagnosticHandler handler(mod.getContext(), [&](Diagnostic &d) {
77 llvm::raw_string_ostream(diagnostics.emplace_back())
78 << d.getLocation() << ": " << d;
79 });
80 if (failed(status))
81 for (const auto &diagnostic : diagnostics)
82 std::cerr << diagnostic << "\n";
83
84 return wrap(status);
85}
86
87MlirOperation aieTranslateBinaryToTxn(MlirContext ctx, MlirStringRef binary) {
88 std::vector<uint8_t> binaryData(binary.data, binary.data + binary.length);
89 auto mod = convertTransactionBinaryToMLIR(unwrap(ctx), binaryData);
90 if (!mod)
91 return wrap(ModuleOp().getOperation());
92 return wrap(mod->getOperation());
93}
94
95MlirStringRef aieTranslateNpuToBinary(MlirOperation moduleOp,
96 MlirStringRef sequenceName) {
97 std::vector<uint32_t> insts;
98 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
99 llvm::StringRef name(sequenceName.data, sequenceName.length);
100 if (failed(AIETranslateNpuToBinary(mod, insts, name)))
101 return mlirStringRefCreate(nullptr, 0);
102 size_t insts_size = insts.size() * sizeof(uint32_t);
103 char *cStr = static_cast<char *>(malloc(insts_size));
104 memcpy(cStr, insts.data(), insts_size);
105 return mlirStringRefCreate(cStr, insts_size);
106}
107
108MlirStringRef aieTranslateControlPacketsToUI32Vec(MlirOperation moduleOp) {
109 std::vector<uint32_t> insts;
110 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
111 if (failed(AIETranslateControlPacketsToUI32Vec(mod, insts)))
112 return mlirStringRefCreate(nullptr, 0);
113 size_t insts_size = insts.size() * sizeof(uint32_t);
114 char *cStr = static_cast<char *>(malloc(insts_size));
115 memcpy(cStr, insts.data(), insts_size);
116 return mlirStringRefCreate(cStr, insts_size);
117}
118
119MlirStringRef aieTranslateToXAIEV2(MlirOperation moduleOp) {
120 std::string xaie;
121 llvm::raw_string_ostream os(xaie);
122 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
123 if (failed(AIETranslateToXAIEV2(mod, os)))
124 return mlirStringRefCreate(nullptr, 0);
125 char *cStr = static_cast<char *>(malloc(xaie.size()));
126 xaie.copy(cStr, xaie.size());
127 return mlirStringRefCreate(cStr, xaie.size());
128}
129
130MlirStringRef aieTranslateToHSA(MlirOperation moduleOp) {
131 std::string xaie;
132 llvm::raw_string_ostream os(xaie);
133 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
134 if (failed(AIETranslateToHSA(mod, os)))
135 return mlirStringRefCreate(nullptr, 0);
136 char *cStr = static_cast<char *>(malloc(xaie.size()));
137 xaie.copy(cStr, xaie.size());
138 return mlirStringRefCreate(cStr, xaie.size());
139}
140
141MlirStringRef aieTranslateToBCF(MlirOperation moduleOp, int col, int row) {
142 std::string bcf;
143 llvm::raw_string_ostream os(bcf);
144 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
145 if (failed(AIETranslateToBCF(mod, os, col, row)))
146 return mlirStringRefCreate(nullptr, 0);
147 char *cStr = static_cast<char *>(malloc(bcf.size()));
148 bcf.copy(cStr, bcf.size());
149 return mlirStringRefCreate(cStr, bcf.size());
150}
151
152MlirStringRef aieLLVMLink(MlirStringRef *modules, int nModules) {
153 std::string ll;
154 llvm::raw_string_ostream os(ll);
155 std::vector<std::string> files;
156 files.reserve(nModules);
157 for (int i = 0; i < nModules; ++i)
158 files.emplace_back(modules[i].data, modules[i].length);
159 if (failed(AIELLVMLink(os, files)))
160 return mlirStringRefCreate(nullptr, 0);
161 char *cStr = static_cast<char *>(malloc(ll.size()));
162 ll.copy(cStr, ll.size());
163 return mlirStringRefCreate(cStr, ll.size());
164}
165
166DEFINE_C_API_PTR_METHODS(AieRtControl, xilinx::AIE::AIERTControl)
167
168AieRtControl getAieRtControl(AieTargetModel tm) {
169 // unwrap the target model
170 const AIETargetModel &targetModel =
171 *reinterpret_cast<const AIETargetModel *>(tm.d);
172 AIERTControl *ctl = new AIERTControl(targetModel);
173 return wrap(ctl);
174}
175
177 AIERTControl *ctl = unwrap(aieCtl);
178 delete ctl;
179}
180
181void aieRtDmaUpdateBdAddr(AieRtControl aieCtl, int col, int row, size_t addr,
182 size_t bdId) {
183 AIERTControl *ctl = unwrap(aieCtl);
184 ctl->dmaUpdateBdAddr(col, row, addr, bdId);
185}
186
188 AIERTControl *ctl = unwrap(aieCtl);
189 ctl->startTransaction();
190}
191
193 AIERTControl *ctl = unwrap(aieCtl);
195}
MlirLogicalResult aieTranslateToCDODirect(MlirOperation moduleOp, MlirStringRef workDirPath, bool bigEndian, bool emitUnified, bool cdoDebug, bool aieSim, bool xaieDebug, bool enableCores)
MlirStringRef aieTranslateNpuToBinary(MlirOperation moduleOp, MlirStringRef sequenceName)
MlirStringRef aieTranslateToXAIEV2(MlirOperation moduleOp)
MlirStringRef aieTranslateModuleToLLVMIR(MlirOperation moduleOp)
AieRtControl getAieRtControl(AieTargetModel tm)
MlirStringRef aieTranslateToBCF(MlirOperation moduleOp, int col, int row)
void aieRtDmaUpdateBdAddr(AieRtControl aieCtl, int col, int row, size_t addr, size_t bdId)
MlirStringRef aieTranslateAIEVecToCpp(MlirOperation moduleOp, bool aie2)
void freeAieRtControl(AieRtControl aieCtl)
MlirStringRef aieLLVMLink(MlirStringRef *modules, int nModules)
MlirOperation aieTranslateBinaryToTxn(MlirContext ctx, MlirStringRef binary)
MlirStringRef aieTranslateControlPacketsToUI32Vec(MlirOperation moduleOp)
MlirStringRef aieTranslateToHSA(MlirOperation moduleOp)
void aieRtExportSerializedTransaction(AieRtControl aieCtl)
void aieRtStartTransaction(AieRtControl aieCtl)
Include the generated interface declarations.
mlir::LogicalResult AIETranslateToXAIEV2(mlir::ModuleOp module, llvm::raw_ostream &output)
mlir::LogicalResult AIETranslateToCDODirect(mlir::ModuleOp m, llvm::StringRef workDirPath, bool bigEndian=false, bool emitUnified=false, bool cdoDebug=false, bool aieSim=false, bool xaieDebug=false, bool enableCores=true)
mlir::LogicalResult AIELLVMLink(llvm::raw_ostream &output, std::vector< std::string > Files, bool DisableDITypeMap=false, bool NoVerify=false, bool Internalize=false, bool OnlyNeeded=false, bool PreserveAssemblyUseListOrder=false, bool Verbose=false)
mlir::LogicalResult AIETranslateToHSA(mlir::ModuleOp module, llvm::raw_ostream &output)
mlir::LogicalResult AIETranslateToBCF(mlir::ModuleOp module, llvm::raw_ostream &output, int tileCol, int tileRow)
mlir::LogicalResult AIETranslateNpuToBinary(mlir::ModuleOp, std::vector< uint32_t > &, llvm::StringRef sequenceName="")
std::optional< mlir::ModuleOp > convertTransactionBinaryToMLIR(mlir::MLIRContext *ctx, std::vector< uint8_t > &binary)
mlir::LogicalResult AIETranslateControlPacketsToUI32Vec(mlir::ModuleOp, std::vector< uint32_t > &, llvm::StringRef sequenceName="")
mlir::LogicalResult translateAIEVecToCpp(mlir::Operation *op, bool aie2, mlir::raw_ostream &os)
Translates the AIE vector dialect MLIR to C++ code.
void dmaUpdateBdAddr(int col, int row, size_t addr, size_t bdId)
Definition AIERT.cpp:874
std::vector< uint8_t > exportSerializedTransaction()
Definition AIERT.cpp:886