63 DeviceOp targetOp = getOperation();
66 auto memOps = llvm::to_vector_of<TileElement>(targetOp.getOps<MemOp>());
67 llvm::append_range(memOps, targetOp.getOps<MemTileDMAOp>());
68 llvm::append_range(memOps, targetOp.getOps<ShimDMAOp>());
69 for (TileElement memOp : memOps) {
70 int col = memOp.getTileID().col;
71 int row = memOp.getTileID().row;
74 memOp->walk<WalkOrder::PreOrder>([&](DMABDOp bd) {
75 if (bd.getBdId().has_value())
79 auto dmaOps = memOp.getOperation()->getRegion(0).getOps<DMAOp>();
80 if (!dmaOps.empty()) {
81 for (
auto dmaOp : dmaOps) {
82 auto bdRegions = dmaOp.getBds();
83 for (
auto &bdRegion : bdRegions) {
84 auto &block = bdRegion.getBlocks().front();
85 DMABDOp bd = *block.getOps<DMABDOp>().begin();
86 if (bd.getBdId().has_value()) {
89 "bdId assigned by user but not found during previous walk");
91 std::optional<int32_t> next_id =
92 gen.
nextBdId(dmaOp.getChannelIndex());
94 int channelIndex = dmaOp.getChannelIndex();
96 <<
"Allocator exhausted available BD IDs (maximum "
98 <<
" available for channel " << channelIndex <<
").";
99 return signalPassFailure();
101 bd.setBdId(*next_id);
106 DenseMap<Block *, int> blockChannelMap;
109 for (Block &block : memOp.getOperation()->getRegion(0))
110 for (
auto op : block.getOps<DMAStartOp>()) {
111 int chNum = op.getChannelIndex();
112 blockChannelMap[&block] = chNum;
113 Block *dest = op.getDest();
115 blockChannelMap[dest] = chNum;
116 if (dest->hasNoSuccessors())
118 dest = dest->getSuccessors()[0];
119 if (blockChannelMap.contains(dest))
124 for (Block &block : memOp.getOperation()->getRegion(0)) {
125 if (block.getOps<DMABDOp>().empty())
127 assert(blockChannelMap.count(&block));
128 DMABDOp bd = (*block.getOps<DMABDOp>().begin());
129 if (bd.getBdId().has_value()) {
131 "bdId assigned by user but not found during previous walk");
133 std::optional<int32_t> next_id =
134 gen.
nextBdId(blockChannelMap[&block]);
136 int channelIndex = blockChannelMap[&block];
138 <<
"Allocator exhausted available BD IDs (maximum "
140 <<
" available for channel " << channelIndex <<
").";
141 return signalPassFailure();
143 bd.setBdId(*next_id);
148 for (TileElement memOp : memOps) {
149 auto dmaOps = memOp.getOperation()->getRegion(0).getOps<DMAOp>();
150 if (!dmaOps.empty()) {
151 for (
auto dmaOp : dmaOps) {
152 auto bdRegions = dmaOp.getBds();
153 for (
auto *bdRegionIt = bdRegions.begin();
154 bdRegionIt != bdRegions.end();) {
155 auto &block = bdRegionIt->getBlocks().front();
156 DMABDOp bd = *block.getOps<DMABDOp>().begin();
157 std::optional<int> nextBdId;
158 if (++bdRegionIt != bdRegions.end())
160 (*bdRegionIt->getBlocks().front().getOps<DMABDOp>().begin())
162 else if (dmaOp.getLoop())
163 nextBdId = (*bdRegions.front()
169 bd.setNextBdId(nextBdId);
173 DenseMap<Block *, int> blockBdIdMap;
174 for (Block &block : memOp.getOperation()->getRegion(0)) {
175 if (block.getOps<DMABDOp>().empty())
177 DMABDOp bd = *block.getOps<DMABDOp>().begin();
178 assert(bd.getBdId().has_value() &&
179 "DMABDOp should have bd_id assigned by now");
180 blockBdIdMap[&block] = bd.getBdId().value();
183 for (Block &block : memOp.getOperation()->getRegion(0)) {
184 if (block.getOps<DMABDOp>().empty())
186 DMABDOp bd = *block.getOps<DMABDOp>().begin();
187 std::optional<int> nextBdId;
188 if (block.getNumSuccessors()) {
189 assert(llvm::range_size(block.getSuccessors()) == 1 &&
190 "should have only one successor block");
191 Block *nextBlock = block.getSuccessor(0);
192 if (!blockBdIdMap.contains(nextBlock))
193 assert(nextBlock->getOperations().size() == 1 &&
194 isa<EndOp>(nextBlock->getOperations().front()) &&
195 "bb that's not in blockMap can only have aie.end");
197 nextBdId = blockBdIdMap[nextBlock];
198 bd.setNextBdId(nextBdId);