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/Support/Casting.h"
29#include "llvm/Support/raw_ostream.h"
30
31#include <cstdlib>
32#include <iostream>
33#include <string>
34#include <vector>
35
36using namespace llvm;
37using namespace mlir;
38using namespace xilinx::AIE;
39
40MlirStringRef aieTranslateAIEVecToCpp(MlirOperation moduleOp, bool aie2) {
41 std::string cpp;
42 llvm::raw_string_ostream os(cpp);
43 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
44 if (failed(xilinx::aievec::translateAIEVecToCpp(mod, aie2, os)))
45 return mlirStringRefCreate(nullptr, 0);
46 char *cStr = static_cast<char *>(malloc(cpp.size()));
47 cpp.copy(cStr, cpp.size());
48 return mlirStringRefCreate(cStr, cpp.size());
49};
50
51MlirStringRef aieTranslateModuleToLLVMIR(MlirOperation moduleOp) {
52 std::string llvmir;
53 llvm::raw_string_ostream os(llvmir);
54 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
55 llvm::LLVMContext llvmContext;
56 auto llvmModule = translateModuleToLLVMIR(mod, llvmContext);
57 if (!llvmModule)
58 return mlirStringRefCreate(nullptr, 0);
59 llvmModule->print(os, nullptr);
60 char *cStr = static_cast<char *>(malloc(llvmir.size()));
61 llvmir.copy(cStr, llvmir.size());
62 return mlirStringRefCreate(cStr, llvmir.size());
63}
64
65MlirLogicalResult aieTranslateToCDODirect(MlirOperation moduleOp,
66 MlirStringRef workDirPath,
67 bool bigEndian, bool emitUnified,
68 bool cdoDebug, bool aieSim,
69 bool xaieDebug, bool enableCores) {
70 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
71 auto status = AIETranslateToCDODirect(
72 mod, llvm::StringRef(workDirPath.data, workDirPath.length), bigEndian,
73 emitUnified, cdoDebug, aieSim, xaieDebug, enableCores);
74 std::vector<std::string> diagnostics;
75 ScopedDiagnosticHandler handler(mod.getContext(), [&](Diagnostic &d) {
76 llvm::raw_string_ostream(diagnostics.emplace_back())
77 << d.getLocation() << ": " << d;
78 });
79 if (failed(status))
80 for (const auto &diagnostic : diagnostics)
81 std::cerr << diagnostic << "\n";
82
83 return wrap(status);
84}
85
86MlirOperation aieTranslateBinaryToTxn(MlirContext ctx, MlirStringRef binary) {
87 std::vector<uint8_t> binaryData(binary.data, binary.data + binary.length);
88 auto mod = convertTransactionBinaryToMLIR(unwrap(ctx), binaryData);
89 if (!mod)
90 return wrap(ModuleOp().getOperation());
91 return wrap(mod->getOperation());
92}
93
94MlirStringRef aieTranslateNpuToBinary(MlirOperation moduleOp,
95 MlirStringRef sequenceName) {
96 std::vector<uint32_t> insts;
97 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
98 llvm::StringRef name(sequenceName.data, sequenceName.length);
99 if (failed(AIETranslateNpuToBinary(mod, insts, name)))
100 return mlirStringRefCreate(nullptr, 0);
101 size_t insts_size = insts.size() * sizeof(uint32_t);
102 char *cStr = static_cast<char *>(malloc(insts_size));
103 memcpy(cStr, insts.data(), insts_size);
104 return mlirStringRefCreate(cStr, insts_size);
105}
106
107MlirStringRef aieTranslateControlPacketsToUI32Vec(MlirOperation moduleOp) {
108 std::vector<uint32_t> insts;
109 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
110 if (failed(AIETranslateControlPacketsToUI32Vec(mod, insts)))
111 return mlirStringRefCreate(nullptr, 0);
112 size_t insts_size = insts.size() * sizeof(uint32_t);
113 char *cStr = static_cast<char *>(malloc(insts_size));
114 memcpy(cStr, insts.data(), insts_size);
115 return mlirStringRefCreate(cStr, insts_size);
116}
117
118MlirStringRef aieTranslateToXAIEV2(MlirOperation moduleOp) {
119 std::string xaie;
120 llvm::raw_string_ostream os(xaie);
121 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
122 if (failed(AIETranslateToXAIEV2(mod, os)))
123 return mlirStringRefCreate(nullptr, 0);
124 char *cStr = static_cast<char *>(malloc(xaie.size()));
125 xaie.copy(cStr, xaie.size());
126 return mlirStringRefCreate(cStr, xaie.size());
127}
128
129MlirStringRef aieTranslateToHSA(MlirOperation moduleOp) {
130 std::string xaie;
131 llvm::raw_string_ostream os(xaie);
132 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
133 if (failed(AIETranslateToHSA(mod, os)))
134 return mlirStringRefCreate(nullptr, 0);
135 char *cStr = static_cast<char *>(malloc(xaie.size()));
136 xaie.copy(cStr, xaie.size());
137 return mlirStringRefCreate(cStr, xaie.size());
138}
139
140MlirStringRef aieTranslateToBCF(MlirOperation moduleOp, int col, int row) {
141 std::string bcf;
142 llvm::raw_string_ostream os(bcf);
143 ModuleOp mod = llvm::cast<ModuleOp>(unwrap(moduleOp));
144 if (failed(AIETranslateToBCF(mod, os, col, row)))
145 return mlirStringRefCreate(nullptr, 0);
146 char *cStr = static_cast<char *>(malloc(bcf.size()));
147 bcf.copy(cStr, bcf.size());
148 return mlirStringRefCreate(cStr, bcf.size());
149}
150
151MlirStringRef aieLLVMLink(MlirStringRef *modules, int nModules) {
152 std::string ll;
153 llvm::raw_string_ostream os(ll);
154 std::vector<std::string> files;
155 files.reserve(nModules);
156 for (int i = 0; i < nModules; ++i)
157 files.emplace_back(modules[i].data, modules[i].length);
158 if (failed(AIELLVMLink(os, files)))
159 return mlirStringRefCreate(nullptr, 0);
160 char *cStr = static_cast<char *>(malloc(ll.size()));
161 ll.copy(cStr, ll.size());
162 return mlirStringRefCreate(cStr, ll.size());
163}
164
165DEFINE_C_API_PTR_METHODS(AieRtControl, xilinx::AIE::AIERTControl)
166
167AieRtControl getAieRtControl(AieTargetModel tm) {
168 // unwrap the target model
169 const BaseNPUTargetModel &targetModel =
170 *reinterpret_cast<const BaseNPUTargetModel *>(tm.d);
171 AIERTControl *ctl = new AIERTControl(targetModel);
172 return wrap(ctl);
173}
174
176 AIERTControl *ctl = unwrap(aieCtl);
177 delete ctl;
178}
179
180void aieRtDmaUpdateBdAddr(AieRtControl aieCtl, int col, int row, size_t addr,
181 size_t bdId) {
182 AIERTControl *ctl = unwrap(aieCtl);
183 ctl->dmaUpdateBdAddr(col, row, addr, bdId);
184}
185
187 AIERTControl *ctl = unwrap(aieCtl);
188 ctl->startTransaction();
189}
190
192 AIERTControl *ctl = unwrap(aieCtl);
194}
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:712
void exportSerializedTransaction()
Definition AIERT.cpp:722