57 DeviceOp device = getOperation();
58 const auto &targetModel = device.getTargetModel();
59 auto ctx = device->getContext();
60 auto loc = device->getLoc();
62 if (targetModel.getTargetArch() == AIEArch::AIE1)
65 SmallVector<Operation *> erased;
66 auto sequenceOps = device.getOps<AIEX::RuntimeSequenceOp>();
67 for (
auto f : sequenceOps) {
69 auto controlPacketOps = f.getOps<AIEX::NpuControlPacketOp>();
70 if (controlPacketOps.empty())
76 builder.create<AIEX::RuntimeSequenceOp>(loc, f.getSymNameAttr());
77 newSeq.getBody().push_back(
new Block);
80 auto ctrlPktMemrefType = MemRefType::get(
81 ShapedType::kDynamic, IntegerType::get(ctx, 32),
nullptr, 0);
82 auto newBlockArg = newSeq.getBody().addArgument(ctrlPktMemrefType, loc);
83 builder.setInsertionPointToStart(&newSeq.getBody().front());
85 int64_t ddrOffset = 0;
86 Block &entry = f.getBody().front();
87 for (
auto &o : entry) {
88 llvm::TypeSwitch<Operation *>(&o).Case<NpuControlPacketOp>(
91 int col = op.getColumnFromAddr();
92 int row = op.getRowFromAddr();
95 int64_t ctrlPktSize = 0;
96 auto data = op.getData();
98 ctrlPktSize = data->size();
99 else if (op.getLength())
100 ctrlPktSize = *op.getLength();
104 const std::vector<int64_t> staticOffsets = {0, 0, 0, ddrOffset};
105 ddrOffset += ctrlPktSize;
106 const std::vector<int64_t> staticSizes = {1, 1, 1, ctrlPktSize};
107 const std::vector<int64_t> staticStrides = {0, 0, 0, 1};
110 std::string shimDmaAllocName =
"ctrlpkt";
111 shimDmaAllocName +=
"_col" + std::to_string(
col);
112 shimDmaAllocName +=
"_mm2s";
113 auto rowToShimChanMap =
115 int shimChan = rowToShimChanMap[
row];
116 shimDmaAllocName +=
"_chan" + std::to_string(shimChan);
118 StringRef metadata = builder.getStringAttr(shimDmaAllocName);
119 builder.create<NpuDmaMemcpyNdOp>(
120 builder.getUnknownLoc(), newBlockArg, SmallVector<Value>{},
121 SmallVector<Value>{}, SmallVector<Value>{},
122 ArrayRef(staticOffsets), ArrayRef(staticSizes),
123 ArrayRef(staticStrides),
nullptr, metadata, 0,
true, 0, 0, 0,
126 auto shimRow = builder.getI32IntegerAttr(0);
127 auto shimCol = builder.getI32IntegerAttr(
col);
128 auto dir = builder.getI32IntegerAttr(1);
129 auto chan = builder.getI32IntegerAttr(shimChan);
130 auto col_num = builder.getI32IntegerAttr(1);
131 auto row_num = builder.getI32IntegerAttr(1);
132 builder.create<AIEX::NpuSyncOp>(loc, shimCol, shimRow, dir, chan,
140 for (
auto e : erased)