@@ -53,10 +53,10 @@ struct TransactionBinaryOperation {
5353// A ControlPacketOperation encapsulates a parsed control packet including
5454// stream header, control packet header, and optional data payload.
5555struct ControlPacketOperation {
56- uint32_t streamHeader; // word 0: parity + pkt_type + pkt_id
57- uint32_t packetHeader; // word 1: parity + stream_id + opcode + beats + addr
58- std::vector<uint32_t > data; // payload words (if opcode is write/blockwrite)
59-
56+ uint32_t streamHeader; // word 0: parity + pkt_type + pkt_id
57+ uint32_t packetHeader; // word 1: parity + stream_id + opcode + beats + addr
58+ std::vector<uint32_t > data; // payload words (if opcode is write/blockwrite)
59+
6060 // Decoded fields
6161 uint8_t pktType;
6262 uint8_t pktId;
@@ -88,90 +88,92 @@ static bool checkParity(uint32_t word) {
8888static std::optional<std::vector<ControlPacketOperation>>
8989parseControlPacket (const std::vector<uint8_t > &data) {
9090 std::vector<ControlPacketOperation> ops;
91-
91+
9292 size_t i = 0 ;
93-
93+
9494 auto requireBytes = [&](size_t offset, size_t length) -> bool {
9595 if (offset + length > data.size ()) {
9696 llvm::errs () << " Control packet binary truncated\n " ;
9797 return false ;
9898 }
9999 return true ;
100100 };
101-
101+
102102 auto read32 = [&](size_t offset) -> uint32_t {
103103 uint32_t value;
104104 std::memcpy (&value, data.data () + offset, sizeof (uint32_t ));
105105 return value;
106106 };
107-
108- while (i + 8 <= data.size ()) { // Need at least 2 words (stream hdr + pkt hdr)
107+
108+ while (i + 8 <= data.size ()) { // Need at least 2 words (stream hdr + pkt hdr)
109109 ControlPacketOperation op;
110-
110+
111111 // Read stream header (word 0)
112112 op.streamHeader = read32 (i);
113-
113+
114114 // Read control packet header (word 1)
115115 op.packetHeader = read32 (i + 4 );
116-
116+
117117 // Verify parity
118118 if (!checkParity (op.streamHeader )) {
119- llvm::errs () << " Stream header parity check failed at offset " << i << " \n " ;
119+ llvm::errs () << " Stream header parity check failed at offset " << i
120+ << " \n " ;
120121 return std::nullopt ;
121122 }
122123 if (!checkParity (op.packetHeader )) {
123- llvm::errs () << " Packet header parity check failed at offset " << i + 4 << " \n " ;
124+ llvm::errs () << " Packet header parity check failed at offset " << i + 4
125+ << " \n " ;
124126 return std::nullopt ;
125127 }
126-
128+
127129 // Decode stream header fields
128130 op.pktType = (op.streamHeader >> 12 ) & 0x7 ;
129131 op.pktId = op.streamHeader & 0xFF ;
130-
132+
131133 // Decode control packet header fields
132134 op.streamId = (op.packetHeader >> 24 ) & 0x7F ;
133135 op.opcode = (op.packetHeader >> 22 ) & 0x3 ;
134136 op.beats = (op.packetHeader >> 20 ) & 0x3 ;
135137 op.address = op.packetHeader & 0xFFFFF ;
136-
137- i += 8 ; // consumed 2 words
138-
138+
139+ i += 8 ; // consumed 2 words
140+
139141 LLVM_DEBUG (llvm::dbgs () << " Control packet at offset " << (i - 8 )
140142 << " : opcode=" << static_cast <int >(op.opcode )
141143 << " stream_id=" << static_cast <int >(op.streamId )
142144 << " addr=0x" << llvm::format (" %05X" , op.address )
143145 << " beats=" << static_cast <int >(op.beats ) << " \n " );
144-
146+
145147 // Read data payload if present (opcode 0x0=write or 0x2=blockwrite)
146148 if (op.opcode == 0x0 || op.opcode == 0x2 ) {
147149 uint32_t numDataWords = op.beats + 1 ;
148150 if (!requireBytes (i, numDataWords * 4 )) {
149151 llvm::errs () << " Truncated data payload\n " ;
150152 return std::nullopt ;
151153 }
152-
154+
153155 op.data .resize (numDataWords);
154156 for (uint32_t j = 0 ; j < numDataWords; j++) {
155157 op.data [j] = read32 (i + j * 4 );
156158 }
157159 i += numDataWords * 4 ;
158-
159- LLVM_DEBUG (llvm::dbgs () << " Data: [" ;
160- for ( size_t j = 0 ; j < op.data .size (); j++) {
161- if (j > 0 ) llvm::dbgs () << " , " ;
162- llvm::dbgs () << op. data [j] ;
163- }
164- llvm::dbgs () << " ]\n " );
160+
161+ LLVM_DEBUG (llvm::dbgs () << " Data: [" ; for ( size_t j = 0 ;
162+ j < op.data .size (); j++) {
163+ if (j > 0 )
164+ llvm::dbgs () << " , " ;
165+ llvm::dbgs () << op. data [j];
166+ } llvm::dbgs () << " ]\n " );
165167 }
166-
168+
167169 ops.push_back (std::move (op));
168170 }
169-
171+
170172 if (i != data.size ()) {
171- llvm::errs () << " Warning: " << (data.size () - i)
173+ llvm::errs () << " Warning: " << (data.size () - i)
172174 << " bytes remaining after parsing control packets\n " ;
173175 }
174-
176+
175177 return ops;
176178}
177179
@@ -619,11 +621,11 @@ xilinx::AIE::convertControlPacketBinaryToMLIR(mlir::MLIRContext *ctx,
619621 uint32_t colInt = (op.address >> targetModel.getColumnShift ()) & 0x1f ;
620622 uint32_t rowInt = (op.address >> targetModel.getRowShift ()) & 0x1f ;
621623 tileMap[key] = std::make_pair (colInt, rowInt);
622-
624+
623625 // Create tile and set controller_id attribute
624626 auto tile = TileOp::getOrCreate (builder, device, colInt, rowInt);
625- auto packetInfoAttr = AIE::PacketInfoAttr::get (
626- builder.getContext (), op.pktType , op.pktId );
627+ auto packetInfoAttr =
628+ AIE::PacketInfoAttr::get ( builder.getContext (), op.pktType , op.pktId );
627629 tile->setAttr (" controller_id" , packetInfoAttr);
628630 }
629631 }
@@ -639,7 +641,7 @@ xilinx::AIE::convertControlPacketBinaryToMLIR(mlir::MLIRContext *ctx,
639641 for (const auto &op : operations) {
640642 IntegerAttr lengthAttr;
641643 DenseI32ArrayAttr dataAttr;
642-
644+
643645 if (op.opcode == 0x0 || op.opcode == 0x2 ) {
644646 // Write or blockwrite - has data payload
645647 SmallVector<int32_t > dataVec;
@@ -651,14 +653,11 @@ xilinx::AIE::convertControlPacketBinaryToMLIR(mlir::MLIRContext *ctx,
651653 // Read - has length but no data
652654 lengthAttr = builder.getI32IntegerAttr (op.beats + 1 );
653655 }
654-
656+
655657 builder.create <AIEX::NpuControlPacketOp>(
656- loc,
657- builder.getUI32IntegerAttr (op.address ),
658- lengthAttr,
658+ loc, builder.getUI32IntegerAttr (op.address ), lengthAttr,
659659 builder.getI32IntegerAttr (op.opcode ),
660- builder.getI32IntegerAttr (op.streamId ),
661- dataAttr);
660+ builder.getI32IntegerAttr (op.streamId ), dataAttr);
662661 }
663662
664663 return module ;
0 commit comments