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 MlirStringRef deviceName,
69 bool bigEndian, bool emitUnified,
70 bool cdoDebug, bool aieSim,
71 bool xaieDebug, bool enableCores) {
72 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
73 auto status = AIETranslateToCDODirect(
74 mod, llvm::StringRef(workDirPath.data, workDirPath.length),
75 llvm::StringRef(deviceName.data, deviceName.length), bigEndian,
76 emitUnified, cdoDebug, aieSim, xaieDebug, enableCores);
77 std::vector<std::string> diagnostics;
78 ScopedDiagnosticHandler handler(mod.getContext(), [&](Diagnostic &d) {
79 llvm::raw_string_ostream(diagnostics.emplace_back())
80 << d.getLocation() << ": " << d;
81 });
82 if (failed(status))
83 for (const auto &diagnostic : diagnostics)
84 std::cerr << diagnostic << "\n";
85
86 return wrap(status);
87}
88
89MlirOperation aieTranslateBinaryToTxn(MlirContext ctx, MlirStringRef binary) {
90 std::vector<uint8_t> binaryData(binary.data, binary.data + binary.length);
91 auto mod = convertTransactionBinaryToMLIR(unwrap(ctx), binaryData);
92 if (!mod)
93 return wrap(ModuleOp().getOperation());
94 return wrap(mod->getOperation());
95}
96
97MlirStringRef aieTranslateNpuToBinary(MlirOperation moduleOp,
98 MlirStringRef deviceNameMlir,
99 MlirStringRef sequenceNameMlir) {
100 std::vector<uint32_t> insts;
101 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
102 llvm::StringRef deviceName(deviceNameMlir.data, deviceNameMlir.length);
103 llvm::StringRef sequenceName(sequenceNameMlir.data, sequenceNameMlir.length);
104 if (failed(AIETranslateNpuToBinary(mod, insts, deviceName, sequenceName)))
105 return mlirStringRefCreate(nullptr, 0);
106 size_t insts_size = insts.size() * sizeof(uint32_t);
107 char *cStr = static_cast<char *>(malloc(insts_size));
108 memcpy(cStr, insts.data(), insts_size);
109 return mlirStringRefCreate(cStr, insts_size);
110}
111
112MlirStringRef aieTranslateControlPacketsToUI32Vec(MlirOperation moduleOp,
113 MlirStringRef deviceName) {
114 std::vector<uint32_t> insts;
115 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
117 mod, insts, llvm::StringRef(deviceName.data, deviceName.length))))
118 return mlirStringRefCreate(nullptr, 0);
119 size_t insts_size = insts.size() * sizeof(uint32_t);
120 char *cStr = static_cast<char *>(malloc(insts_size));
121 memcpy(cStr, insts.data(), insts_size);
122 return mlirStringRefCreate(cStr, insts_size);
123}
124
125MlirStringRef aieTranslateToXAIEV2(MlirOperation moduleOp,
126 MlirStringRef deviceName) {
127 std::string xaie;
128 llvm::raw_string_ostream os(xaie);
129 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
130 if (failed(AIETranslateToXAIEV2(
131 mod, os, llvm::StringRef(deviceName.data, deviceName.length))))
132 return mlirStringRefCreate(nullptr, 0);
133 char *cStr = static_cast<char *>(malloc(xaie.size()));
134 xaie.copy(cStr, xaie.size());
135 return mlirStringRefCreate(cStr, xaie.size());
136}
137
138MlirStringRef aieTranslateToHSA(MlirOperation moduleOp,
139 MlirStringRef deviceName) {
140 std::string xaie;
141 llvm::raw_string_ostream os(xaie);
142 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
143 if (failed(AIETranslateToHSA(
144 mod, os, llvm::StringRef(deviceName.data, deviceName.length))))
145 return mlirStringRefCreate(nullptr, 0);
146 char *cStr = static_cast<char *>(malloc(xaie.size()));
147 xaie.copy(cStr, xaie.size());
148 return mlirStringRefCreate(cStr, xaie.size());
149}
150
151MlirStringRef aieTranslateToBCF(MlirOperation moduleOp, int col, int row,
152 MlirStringRef deviceName) {
153 std::string bcf;
154 llvm::raw_string_ostream os(bcf);
155 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
156 if (failed(AIETranslateToBCF(
157 mod, os, col, row,
158 llvm::StringRef(deviceName.data, deviceName.length))))
159 return mlirStringRefCreate(nullptr, 0);
160 char *cStr = static_cast<char *>(malloc(bcf.size()));
161 bcf.copy(cStr, bcf.size());
162 return mlirStringRefCreate(cStr, bcf.size());
163}
164
165MlirStringRef aieLLVMLink(MlirStringRef *modules, int nModules) {
166 std::string ll;
167 llvm::raw_string_ostream os(ll);
168 std::vector<std::string> files;
169 files.reserve(nModules);
170 for (int i = 0; i < nModules; ++i)
171 files.emplace_back(modules[i].data, modules[i].length);
172 if (failed(AIELLVMLink(os, files)))
173 return mlirStringRefCreate(nullptr, 0);
174 char *cStr = static_cast<char *>(malloc(ll.size()));
175 ll.copy(cStr, ll.size());
176 return mlirStringRefCreate(cStr, ll.size());
177}
178
179DEFINE_C_API_PTR_METHODS(AieRtControl, xilinx::AIE::AIERTControl)
180
181AieRtControl getAieRtControl(AieTargetModel tm) {
182 // unwrap the target model
183 const AIETargetModel &targetModel =
184 *reinterpret_cast<const AIETargetModel *>(tm.d);
185 AIERTControl *ctl = new AIERTControl(targetModel);
186 return wrap(ctl);
187}
188
190 AIERTControl *ctl = unwrap(aieCtl);
191 delete ctl;
192}
193
194void aieRtDmaUpdateBdAddr(AieRtControl aieCtl, int col, int row, size_t addr,
195 size_t bdId) {
196 AIERTControl *ctl = unwrap(aieCtl);
197 ctl->dmaUpdateBdAddr(col, row, addr, bdId);
198}
199
201 AIERTControl *ctl = unwrap(aieCtl);
202 ctl->startTransaction();
203}
204
206 AIERTControl *ctl = unwrap(aieCtl);
208}
MlirStringRef aieTranslateControlPacketsToUI32Vec(MlirOperation moduleOp, MlirStringRef deviceName)
MlirStringRef aieTranslateToBCF(MlirOperation moduleOp, int col, int row, MlirStringRef deviceName)
MlirStringRef aieTranslateModuleToLLVMIR(MlirOperation moduleOp)
AieRtControl getAieRtControl(AieTargetModel tm)
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)
MlirStringRef aieTranslateToHSA(MlirOperation moduleOp, MlirStringRef deviceName)
MlirOperation aieTranslateBinaryToTxn(MlirContext ctx, MlirStringRef binary)
void aieRtExportSerializedTransaction(AieRtControl aieCtl)
MlirStringRef aieTranslateToXAIEV2(MlirOperation moduleOp, MlirStringRef deviceName)
MlirStringRef aieTranslateNpuToBinary(MlirOperation moduleOp, MlirStringRef deviceNameMlir, MlirStringRef sequenceNameMlir)
void aieRtStartTransaction(AieRtControl aieCtl)
MlirLogicalResult aieTranslateToCDODirect(MlirOperation moduleOp, MlirStringRef workDirPath, MlirStringRef deviceName, bool bigEndian, bool emitUnified, bool cdoDebug, bool aieSim, bool xaieDebug, bool enableCores)
Include the generated interface declarations.
mlir::LogicalResult AIETranslateControlPacketsToUI32Vec(mlir::ModuleOp, std::vector< uint32_t > &, llvm::StringRef deviceName="", llvm::StringRef sequenceName="")
mlir::LogicalResult AIETranslateToCDODirect(mlir::ModuleOp m, llvm::StringRef workDirPath, llvm::StringRef deviceName, 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 AIETranslateToBCF(mlir::ModuleOp module, llvm::raw_ostream &output, int tileCol, int tileRow, llvm::StringRef deviceName="")
mlir::LogicalResult AIETranslateNpuToBinary(mlir::ModuleOp, std::vector< uint32_t > &, llvm::StringRef deviceName="", llvm::StringRef sequenceName="")
std::optional< mlir::ModuleOp > convertTransactionBinaryToMLIR(mlir::MLIRContext *ctx, std::vector< uint8_t > &binary)
mlir::LogicalResult AIETranslateToHSA(mlir::ModuleOp module, llvm::raw_ostream &output, llvm::StringRef deviceName="")
mlir::LogicalResult AIETranslateToXAIEV2(mlir::ModuleOp module, llvm::raw_ostream &output, llvm::StringRef deviceName="")
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:1014
std::vector< uint8_t > exportSerializedTransaction()
Definition AIERT.cpp:1026