41 std::map<AIE::TileOp, BdIdGenerator> &gens) {
42 AIE::TileOp tile = op.getTileOp();
46 WalkResult result = op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
47 if (bd_op.getBdId().has_value()) {
49 op.emitOpError(
"Specified buffer descriptor ID ")
50 << bd_op.getBdId().value()
51 <<
" is already in use. Emit an aiex.dma_free_task operation to "
53 return WalkResult::interrupt();
57 return WalkResult::advance();
59 if (result.wasInterrupted()) {
65 op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
66 if (bd_op.getBdId().has_value()) {
67 return WalkResult::advance();
70 std::optional<int32_t> next_id = gen.
nextBdId(0);
73 <<
"Allocator exhausted available buffer descriptor IDs.";
74 return WalkResult::interrupt();
76 bd_op.setBdId(*next_id);
77 return WalkResult::advance();
79 if (result.wasInterrupted()) {
87 std::map<AIE::TileOp, BdIdGenerator> &gens) {
88 DMAConfigureTaskOp task_op = op.getTaskOp();
90 auto err = op.emitOpError(
91 "does not reference a valid configure_task operation.");
92 Operation *task_op = op.getTask().getDefiningOp();
93 if (llvm::isa<DMAStartBdChainOp>(task_op)) {
94 err.attachNote(task_op->getLoc())
95 <<
"Lower this operation first using the "
96 "--aie-materialize-bd-chains pass.";
98 if (llvm::isa<DMAConfigureTaskForOp>(task_op)) {
99 err.attachNote(task_op->getLoc())
100 <<
"Lower this operation first using the "
101 "--aie-substitute-shim-dma-allocations pass.";
106 AIE::TileOp tile = task_op.getTileOp();
111 task_op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
112 if (!bd_op.getBdId().has_value()) {
113 bd_op.emitOpError(
"Free called on BD chain with unassigned IDs.");
114 return WalkResult::interrupt();
118 return WalkResult::advance();
120 gen.
freeBdId(bd_op.getBdId().value());
121 return WalkResult::advance();
123 if (result.wasInterrupted()) {
140 AIE::DeviceOp device = getOperation();
141 std::map<AIE::TileOp, BdIdGenerator> gens;
145 device.walk([&](DMAAwaitTaskOp op) {
146 OpBuilder builder(op);
147 builder.setInsertionPointAfter(op);
148 builder.create<DMAFreeTaskOp>(op.getLoc(), op.getTask());
152 device.walk([&](Operation *op) {
153 LogicalResult result =
154 llvm::TypeSwitch<Operation *, LogicalResult>(op)
155 .Case<DMAConfigureTaskOp>([&](DMAConfigureTaskOp op) {
158 .Case<DMAFreeTaskOp>(
159 [&](DMAFreeTaskOp op) {
return runOnFreeBDs(op, gens); })
160 .Default([](Operation *op) {
return success(); });
161 if (failed(result)) {
162 return signalPassFailure();