16#include "mlir/Target/LLVMIR/Import.h"
18#include "llvm/ADT/StringExtras.h"
29 llvm::raw_string_ostream rss(str);
30 rss <<
"XAie_TileLoc(" <<
col <<
"," <<
row <<
")";
40 llvm::raw_string_ostream rss(str);
41 rss <<
"dma_tile" <<
col <<
row <<
"_bd" << bdNum;
47 std::to_string(bdNum));
52 llvm::raw_string_ostream rss(str);
59 std::to_string(bdNum));
62std::string
packetStr(StringRef
id, StringRef type) {
64 llvm::raw_string_ostream rss(str);
65 rss <<
"XAie_PacketInit(" <<
id <<
"," << type <<
")";
70 return packetStr(std::to_string(
id), std::to_string(type));
73static std::string tileDMATensorStr(StringRef
col, StringRef
row,
76 llvm::raw_string_ostream rss(str);
77 rss <<
"dma_tile_" <<
col <<
"_" <<
row <<
"_bd_" << bdNum <<
"_tensor";
81static std::string tileDMATensorStr(
int col,
int row,
int bdNum) {
82 return tileDMATensorStr(std::to_string(
col), std::to_string(
row),
83 std::to_string(bdNum));
87 ArrayRef<BDDimLayoutAttr> dims,
int col,
88 int row,
int bdNum,
int baseAddrA,
89 int offsetA,
int lenA,
90 int elementWidthInBytes,
91 const char *errorRetval) {
93 double elementWidthIn32bWords =
94 static_cast<double>(elementWidthInBytes) / 4.0;
95 std::string tensor = tileDMATensorStr(
col,
row, bdNum);
96 output <<
"XAie_DmaTensor " << tensor <<
" = {};\n";
97 output << tensor <<
".NumDim = " << std::to_string(ndims) <<
";\n";
100 "__mlir_aie_alloc_dim_desc("
101 << std::to_string(ndims) <<
");\n";
102 output <<
"if(NULL == " << tensor <<
".Dim){\n"
103 <<
" return " << errorRetval <<
";\n"
105 for (
size_t i = 0; i < dims.size(); i++) {
111 int j = dims.size() - i - 1;
114 static_cast<uint32_t
>(dims[i].getStride() * elementWidthIn32bWords);
115 size = dims[i].getSize();
117 stride = dims[i].getStride();
118 size =
static_cast<uint16_t
>(dims[i].getSize() * elementWidthIn32bWords);
120 stride = stride > 0 ? stride : 1;
122 output << tensor <<
".Dim[" << std::to_string(j) <<
"].AieMlDimDesc"
123 <<
" = { /* Stride */ " << std::to_string(stride) <<
", /* Size */ "
124 << std::to_string(size) <<
"};\n";
126 if ((baseAddrA + offsetA) % 4)
127 llvm::report_fatal_error(
"bd address must be 4B (32b) aligned");
128 output <<
"__mlir_aie_try(XAie_DmaSetMultiDimAddr("
130 <<
"&" << tensor <<
", "
131 <<
"0x" << llvm::utohexstr(baseAddrA + offsetA) <<
", "
132 <<
" /* len */ " << lenA <<
"));\n";
139 llvm::SetVector<Block *> blockVector;
140 SmallVector<Block *, 16> worklist;
141 Block *firstBD = ®ion->front();
142 blockVector.insert(firstBD);
143 worklist.push_back(firstBD);
144 while (!worklist.empty()) {
145 Block *block = worklist.pop_back_val();
148 auto successors = block->getTerminator()->getSuccessors();
149 for (
auto *i : successors) {
150 if (!blockVector.contains(i)) {
151 blockVector.insert(i);
152 worklist.push_back(i);
Include the generated interface declarations.
std::string tileDMAInstStr(llvm::StringRef col, llvm::StringRef row, llvm::StringRef bdNum)
void generateXAieDmaSetMultiDimAddr(llvm::raw_ostream &output, int ndims, llvm::ArrayRef< BDDimLayoutAttr > dims, int col, int row, int bdNum, int baseAddrA, int offsetA, int lenA, int elementWidthInBytes, const char *errorRet)
std::string tileDMAInstRefStr(llvm::StringRef col, llvm::StringRef row, llvm::StringRef bdNum)
llvm::SetVector< mlir::Block * > getOrderedChainOfBlocks(mlir::Region *region)
std::string tileLocStr(llvm::StringRef col, llvm::StringRef row)
std::string packetStr(llvm::StringRef id, llvm::StringRef type)