57 DeviceOp device = getOperation();
58 const auto &targetModel = device.getTargetModel();
59 auto ctx = device->getContext();
60 auto loc = device->getLoc();
61 OpBuilder devBuilder = OpBuilder::atBlockBegin(device.getBody());
63 if (targetModel.getTargetArch() == AIEArch::AIE1)
66 SmallVector<Operation *> erased;
67 auto sequenceOps = device.getOps<AIEX::RuntimeSequenceOp>();
68 for (
auto f : sequenceOps) {
70 auto controlPacketOps = f.getOps<AIEX::NpuControlPacketOp>();
71 if (controlPacketOps.empty())
77 builder.create<AIEX::RuntimeSequenceOp>(loc, f.getSymNameAttr());
78 newSeq.getBody().push_back(
new Block);
81 auto ctrlPktMemrefType = MemRefType::get(
82 ShapedType::kDynamic, IntegerType::get(ctx, 32),
nullptr, 0);
83 auto newBlockArg = newSeq.getBody().addArgument(ctrlPktMemrefType, loc);
84 builder.setInsertionPointToStart(&newSeq.getBody().front());
87 Block &entry = f.getBody().front();
88 for (
auto &o : entry) {
89 llvm::TypeSwitch<Operation *>(&o).Case<NpuControlPacketOp>(
92 int col = op.getColumnFromAddr();
93 int row = op.getRowFromAddr();
94 AIE::TileOp destTileOp =
95 TileOp::getOrCreate(devBuilder, device,
col,
row);
96 assert(destTileOp->hasAttr(
"controller_id"));
97 auto controllerIdPkt =
98 destTileOp->getAttrOfType<AIE::PacketInfoAttr>(
102 uint32_t ctrlPktSize = 0;
103 auto data = op.getData();
104 auto length = op.getLength();
106 ctrlPktSize = data->size();
108 ctrlPktSize = *length;
111 const std::vector<int64_t> staticOffsets = {0, 0, 0, ddrOffset};
112 ddrOffset += ctrlPktSize;
113 const std::vector<int64_t> staticSizes = {1, 1, 1,
114 (int64_t)ctrlPktSize};
115 const std::vector<int64_t> staticStrides = {0, 0, 0, 1};
118 std::string shimDmaAllocName =
"ctrlpkt";
119 shimDmaAllocName +=
"_col" + std::to_string(
col);
120 shimDmaAllocName +=
"_mm2s";
121 auto rowToShimChanMap =
123 int shimChan = rowToShimChanMap[destTileOp.rowIndex()];
124 shimDmaAllocName +=
"_chan" + std::to_string(shimChan);
126 StringRef metadata = builder.getStringAttr(shimDmaAllocName);
127 builder.create<NpuDmaMemcpyNdOp>(
128 builder.getUnknownLoc(), newBlockArg, SmallVector<Value>{},
129 SmallVector<Value>{}, SmallVector<Value>{},
130 ArrayRef(staticOffsets), ArrayRef(staticSizes),
131 ArrayRef(staticStrides), controllerIdPkt, metadata, 0,
true,
134 auto shimRow = builder.getI32IntegerAttr(0);
135 auto shimCol = builder.getI32IntegerAttr(
col);
136 auto dir = builder.getI32IntegerAttr(1);
137 auto chan = builder.getI32IntegerAttr(shimChan);
138 auto col_num = builder.getI32IntegerAttr(1);
139 auto row_num = builder.getI32IntegerAttr(1);
140 builder.create<AIEX::NpuSyncOp>(loc, shimCol, shimRow, dir, chan,
148 for (
auto e : erased)