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);
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)