47 std::map<AIE::TileOp, BdIdGenerator> &gens) {
48 AIE::TileOp tile = op.getTileOp();
52 WalkResult result = op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
53 if (bd_op.getBdId().has_value()) {
55 op.emitOpError(
"Specified buffer descriptor ID ")
56 << bd_op.getBdId().value()
57 <<
" is already in use. Emit an aiex.dma_free_task operation to "
59 return WalkResult::interrupt();
63 return WalkResult::advance();
65 if (result.wasInterrupted()) {
71 op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
72 if (bd_op.getBdId().has_value()) {
73 return WalkResult::advance();
76 std::optional<int32_t> next_id = gen.
nextBdId(0);
79 <<
"Allocator exhausted available buffer descriptor IDs.";
80 return WalkResult::interrupt();
82 bd_op.setBdId(*next_id);
83 return WalkResult::advance();
85 if (result.wasInterrupted()) {
93 std::map<AIE::TileOp, BdIdGenerator> &gens) {
94 DMAConfigureTaskOp task_op = op.getTaskOp();
96 auto err = op.emitOpError(
97 "does not reference a valid configure_task operation.");
98 Operation *task_op = op.getTask().getDefiningOp();
99 if (llvm::isa<DMAStartBdChainOp>(task_op)) {
100 err.attachNote(task_op->getLoc())
101 <<
"Lower this operation first using the "
102 "--aie-materialize-bd-chains pass.";
104 if (llvm::isa<DMAConfigureTaskForOp>(task_op)) {
105 err.attachNote(task_op->getLoc())
106 <<
"Lower this operation first using the "
107 "--aie-substitute-shim-dma-allocations pass.";
112 AIE::TileOp tile = task_op.getTileOp();
117 task_op.walk<WalkOrder::PreOrder>([&](AIE::DMABDOp bd_op) {
118 if (!bd_op.getBdId().has_value()) {
119 bd_op.emitOpError(
"Free called on BD chain with unassigned IDs.");
120 return WalkResult::interrupt();
124 return WalkResult::advance();
126 gen.
freeBdId(bd_op.getBdId().value());
127 return WalkResult::advance();
129 if (result.wasInterrupted()) {
146 AIE::DeviceOp device = getOperation();
147 std::map<AIE::TileOp, BdIdGenerator> gens;
151 device.walk([&](DMAAwaitTaskOp op) {
152 OpBuilder builder(op);
153 builder.setInsertionPointAfter(op);
154 DMAFreeTaskOp::create(builder, op.getLoc(), op.getTask());
158 device.walk([&](Operation *op) {
159 LogicalResult result =
160 llvm::TypeSwitch<Operation *, LogicalResult>(op)
161 .Case<DMAConfigureTaskOp>([&](DMAConfigureTaskOp op) {
164 .Case<DMAFreeTaskOp>(
165 [&](DMAFreeTaskOp op) {
return runOnFreeBDs(op, gens); })
166 .Default([](Operation *op) {
return success(); });
167 if (failed(result)) {
168 return signalPassFailure();