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