64 DeviceOp device = getOperation();
65 const auto &targetModel = device.getTargetModel();
66 auto *ctx = device->getContext();
67 auto loc = device->getLoc();
69 if (targetModel.getTargetArch() == AIEArch::AIE1)
72 SmallVector<Operation *> erased;
73 auto sequenceOps = device.getOps<AIE::RuntimeSequenceOp>();
74 for (
auto f : sequenceOps) {
76 auto controlPacketOps = f.getOps<AIEX::NpuControlPacketOp>();
77 if (controlPacketOps.empty())
84 auto newSeq = AIE::RuntimeSequenceOp::create(
85 builder, loc, f.getSymNameAttr(), BoolAttr{}, f.getTraceBufferAttr(),
86 f.getTraceSlicesAttr(), f.getScratchpadParametersAttr());
87 newSeq.getBody().push_back(
new Block);
90 for (
auto arg : f.getBody().getArguments()) {
92 auto newArg = newSeq.getBody().addArgument(arg.getType(), arg.getLoc());
94 arg.replaceAllUsesWith(newArg);
96 mapping.map(arg, newArg);
100 auto ctrlPktMemrefType = MemRefType::get(
101 ShapedType::kDynamic, IntegerType::get(ctx, 32),
nullptr,
nullptr);
102 auto newBlockArg = newSeq.getBody().addArgument(ctrlPktMemrefType, loc);
104 builder.setInsertionPointToStart(&newSeq.getBody().front());
111 std::string shimDmaAllocName;
115 std::vector<BatchInfo> batches;
117 int64_t ddrOffset = 0;
118 Block &entry = f.getBody().front();
121 bool new_batch =
true;
122 for (Operation &o : entry) {
123 auto ctrlPktOp = dyn_cast<NpuControlPacketOp>(&o);
130 int col = ctrlPktOp.getColumnFromAddr();
131 int row = ctrlPktOp.getRowFromAddr();
134 int64_t ctrlPktSize = 0;
135 auto data = ctrlPktOp.getData();
136 auto length = ctrlPktOp.getLength();
138 ctrlPktSize = data->size();
140 ctrlPktSize = *length;
145 if (targetModel.getTargetArch() == AIEArch::AIE2p && !new_batch &&
146 batches.back().tileId ==
TileID{col, row}) {
148 batches.back().totalSize += ctrlPktSize;
151 auto rowToShimChanMap =
153 int shimChan = rowToShimChanMap[row];
155 std::string shimDmaAllocName =
"ctrlpkt";
156 shimDmaAllocName +=
"_col" + std::to_string(col);
157 shimDmaAllocName +=
"_mm2s";
158 shimDmaAllocName +=
"_chan" + std::to_string(shimChan);
160 batches.push_back({
TileID{col, row}, ddrOffset, ctrlPktSize,
161 shimDmaAllocName, shimChan, &o});
164 ddrOffset += ctrlPktSize;
168 auto batchIt = batches.begin();
170 for (Operation &o : entry) {
171 auto ctrlPktOp = dyn_cast<NpuControlPacketOp>(&o);
173 builder.clone(o, mapping);
178 if (batchIt == batches.end())
182 if (batchIt->first != &o)
185 int col = ctrlPktOp.getColumnFromAddr();
188 const std::vector<int64_t> staticOffsets = {0, 0, 0,
189 batchIt->startOffset};
190 const std::vector<int64_t> staticSizes = {1, 1, 1, batchIt->totalSize};
191 const std::vector<int64_t> staticStrides = {0, 0, 0, 1};
193 SymbolRefAttr metadata =
194 SymbolRefAttr::get(builder.getContext(), batchIt->shimDmaAllocName);
195 NpuDmaMemcpyNdOp::create(builder, loc, newBlockArg, staticOffsets,
196 staticSizes, staticStrides, metadata,
205 AIEX::NpuSyncOp::create(builder, loc, shimCol, shimRow, dir, chan,
213 for (
auto *e : erased)