Line data Source code
1 : /*
2 : * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
3 : * Description: ccu instruction implement file
4 : * Author: sunzhepeng
5 : * Create: 2024-05-14
6 : */
7 :
8 : #include "ccu_microcode_v1.h"
9 :
10 : #include <unordered_map>
11 :
12 : #include "string_util.h"
13 :
14 : namespace {
15 : constexpr uint16_t LOAD_TYPE = 0x0;
16 : constexpr uint16_t CTRL_TYPE = 0x1;
17 : constexpr uint16_t TRANS_TYPE = 0x2;
18 : constexpr uint16_t REDUCE_TYPE = 0x3;
19 :
20 : constexpr uint16_t LOADSQEARGSTOGSA_CODE = 0x0;
21 : constexpr uint16_t LOADSQEARGSTOXN_CODE = 0x1;
22 : constexpr uint16_t LOADIMDTOGSA_CODE = 0x2;
23 : constexpr uint16_t LOADIMDTOXN_CODE = 0x3;
24 : constexpr uint16_t LOADGSAXN_CODE = 0x4;
25 : constexpr uint16_t LOADGSAGSA_CODE = 0x5;
26 : constexpr uint16_t LOADXX_CODE = 0x6;
27 :
28 : constexpr uint16_t LOOP_CODE = 0x0;
29 : constexpr uint16_t LOOPGROUP_CODE = 0x1;
30 : constexpr uint16_t SETCKE_CODE = 0x2;
31 : constexpr uint16_t CLEARCKE_CODE = 0x4;
32 : constexpr uint16_t JMP_CODE = 0x5;
33 :
34 : constexpr uint16_t TRANSLOCMEMTOLOCMS_CODE = 0x0;
35 : constexpr uint16_t TRANSRMTMEMTOLOCMS_CODE = 0x1;
36 : constexpr uint16_t TRANSLOCMSTOLOCMEM_CODE = 0x2;
37 : constexpr uint16_t TRANSLOCMSTORMTMEM_CODE = 0x3;
38 : constexpr uint16_t TRANSRMTMSTOLOCMEM_CODE = 0x4;
39 : constexpr uint16_t TRANSLOCMSTOLOCMS_CODE = 0x5;
40 : constexpr uint16_t TRANSRMTMSTOLOCMS_CODE = 0x6;
41 : constexpr uint16_t TRANSLOCMSTORMTMS_CODE = 0x7;
42 : constexpr uint16_t TRANSRMTMEMTOLOCMEM_CODE = 0x8;
43 : constexpr uint16_t TRANSLOCMEMTORMTMEM_CODE = 0x9;
44 : constexpr uint16_t TRANSLOCMEMTOLOCMEM_CODE = 0xa;
45 : constexpr uint16_t SYNCCKE_CODE = 0xb;
46 : constexpr uint16_t SYNCGSA_CODE = 0xc;
47 : constexpr uint16_t SYNCXN_CODE = 0xd;
48 :
49 : constexpr uint16_t ADD_CODE = 0x0;
50 : constexpr uint16_t MAX_CODE = 0x1;
51 : constexpr uint16_t MIN_CODE = 0x2;
52 : } // namespace
53 :
54 : namespace hcomm {
55 : namespace CcuRep {
56 :
57 : // *GSAId = *sqeArgsId
58 0 : void LoadSqeArgsToGSAInstr(CcuInstr* instr, uint16_t gsaId, uint16_t sqeArgsId)
59 : {
60 0 : instr->header = InstrHeader(LOAD_TYPE, LOADSQEARGSTOGSA_CODE);
61 0 : instr->v1.loadSqeArgsToGSA.gsaId = gsaId;
62 0 : instr->v1.loadSqeArgsToGSA.sqeArgsId = sqeArgsId;
63 0 : }
64 :
65 : // *XnId = *sqeArgsId
66 33 : void LoadSqeArgsToXnInstr(CcuInstr* instr, uint16_t xnId, uint16_t sqeArgsId)
67 : {
68 33 : instr->header = InstrHeader(LOAD_TYPE, LOADSQEARGSTOXN_CODE);
69 33 : instr->v1.loadSqeArgsToXn.xnId = xnId;
70 33 : instr->v1.loadSqeArgsToXn.sqeArgsId = sqeArgsId;
71 33 : }
72 :
73 : // *GSAId = immediate
74 56 : void LoadImdToGSAInstr(CcuInstr* instr, uint16_t gsaId, uint64_t immediate)
75 : {
76 56 : instr->header = InstrHeader(LOAD_TYPE, LOADIMDTOGSA_CODE);
77 56 : instr->v1.loadImdToGSA.gsaId = gsaId;
78 56 : instr->v1.loadImdToGSA.immediate = immediate;
79 56 : }
80 :
81 : // *XnId = immediate,secFlag用于打印时判断immediate是否是敏感信息,如果是,请设置secFlag=CCU_LOAD_TO_XN_SEC_INFO
82 620 : void LoadImdToXnInstr(CcuInstr* instr, uint16_t xnId, uint64_t immediate, uint16_t secFlag)
83 : {
84 620 : instr->header = InstrHeader(LOAD_TYPE, LOADIMDTOXN_CODE);
85 620 : instr->v1.loadImdToXn.xnId = xnId;
86 620 : instr->v1.loadImdToXn.immediate = immediate;
87 620 : instr->v1.loadImdToXn.secFlag = secFlag;
88 620 : }
89 :
90 : // *GSAdId = *GSAmId + *XnId
91 44 : void LoadGSAXnInstr(CcuInstr* instr, uint16_t gsAdId, uint16_t gsAmId, uint16_t xnId)
92 : {
93 44 : instr->header = InstrHeader(LOAD_TYPE, LOADGSAXN_CODE);
94 44 : instr->v1.loadGSAXn.gsAdId = gsAdId;
95 44 : instr->v1.loadGSAXn.gsAmId = gsAmId;
96 44 : instr->v1.loadGSAXn.xnId = xnId;
97 44 : }
98 :
99 : // *GSAdId = *GSAmId + *GSAnId
100 25 : void LoadGSAGSAInstr(CcuInstr* instr, uint16_t gsAdId, uint16_t gsAmId, uint16_t gsAnId)
101 : {
102 25 : instr->header = InstrHeader(LOAD_TYPE, LOADGSAGSA_CODE);
103 25 : instr->v1.loadGSAGSA.gsAdId = gsAdId;
104 25 : instr->v1.loadGSAGSA.gsAmId = gsAmId;
105 25 : instr->v1.loadGSAGSA.gsAnId = gsAnId;
106 25 : }
107 :
108 : // *XdId = *XmId + *XnId
109 211 : void LoadXXInstr(CcuInstr* instr, uint16_t xdId, uint16_t xmId, uint16_t xnId)
110 : {
111 211 : instr->header = InstrHeader(LOAD_TYPE, LOADXX_CODE);
112 211 : instr->v1.loadXX.xdId = xdId;
113 211 : instr->v1.loadXX.xmId = xmId;
114 211 : instr->v1.loadXX.xnId = xnId;
115 211 : }
116 :
117 : // startInstrId ~ endInstrId之间的指令构成loop
118 : // Xn寄存器中的内容:LoopNum[61:55], RepeatNum[54:48], NoRepeatNum[47:41], LoopCtxId[40:33], Offset[32:13],
119 : // IterNum[12:0] loop执行IterNum次 loop每次执行, *GSA偏移为Offset loop在第LoopCtxId个LoopEngine上执行
120 39 : void LoopInstr(CcuInstr* instr, uint16_t startInstrId, uint16_t endInstrId, uint16_t xnId)
121 : {
122 39 : instr->header = InstrHeader(CTRL_TYPE, LOOP_CODE);
123 39 : instr->v1.loop.startInstrId = startInstrId;
124 39 : instr->v1.loop.endInstrId = endInstrId;
125 39 : instr->v1.loop.xnId = xnId;
126 39 : }
127 :
128 : // startLoopInstrId为LoopGroup所包含的Loop的起始地址
129 : // Xn寄存器中的内容:LoopNum[61:55], RepeatNum[54:48], NoRepeatNum[47:41], LoopCtxId[40:33], Offset[32:13],
130 : // IterNum[12:0] 不自动展开的Loop的个数:NoRepeatNum 自动展开的Loop的个数:RepeatNum 自动展开成LoopNum个Loop
131 : void
132 20 : LoopGroupInstr(CcuInstr* instr, uint16_t startLoopInstrId, uint16_t xnId, uint16_t xmId, uint16_t highPerfModeEn)
133 : {
134 20 : instr->header = InstrHeader(CTRL_TYPE, LOOPGROUP_CODE);
135 20 : instr->v1.loopGroup.startLoopInstrId = startLoopInstrId;
136 20 : instr->v1.loopGroup.xnId = xnId;
137 20 : instr->v1.loopGroup.xmId = xmId;
138 20 : instr->v1.loopGroup.highPerfModeEn = highPerfModeEn & 0x1;
139 20 : }
140 :
141 : // 后续函数中, 均需要wait到<waitCKEId, waitCKEMask>后, 再执行相关操作, 执行完之后再set<setCKEId, setCKEMask>
142 : // clearType = 1时, wait到之后需要对<waitCKEId, waitCKEMask>清零, 否则不清零
143 :
144 : // set<setCKEId, setCKEMask>
145 93 : void SetCKEInstr(
146 : CcuInstr* instr, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
147 : uint16_t clearType)
148 : {
149 93 : instr->header = InstrHeader(CTRL_TYPE, SETCKE_CODE);
150 93 : instr->v1.setCKE.clearType = clearType & 0x1;
151 93 : instr->v1.setCKE.setCKEId = setCKEId;
152 93 : instr->v1.setCKE.setCKEMask = setCKEMask;
153 93 : instr->v1.setCKE.waitCKEId = waitCKEId;
154 93 : instr->v1.setCKE.waitCKEMask = waitCKEMask;
155 93 : }
156 :
157 : // clear<setCKEId, setCKEMask>
158 12 : void ClearCKEInstr(
159 : CcuInstr* instr, uint16_t clearCKEId, uint16_t clearMask, uint16_t waitCKEId, uint16_t waitCKEMask,
160 : uint16_t clearType)
161 : {
162 12 : instr->header = InstrHeader(CTRL_TYPE, CLEARCKE_CODE);
163 12 : instr->v1.clearCKE.clearType = clearType & 0x1;
164 12 : instr->v1.clearCKE.clearCKEId = clearCKEId;
165 12 : instr->v1.clearCKE.clearMask = clearMask;
166 12 : instr->v1.clearCKE.waitCKEId = waitCKEId;
167 12 : instr->v1.clearCKE.waitCKEMask = waitCKEMask;
168 12 : }
169 :
170 148 : void JumpInstr(CcuInstr* instr, uint16_t dstInstrXnId, uint16_t conditionXnId, uint64_t expectData)
171 : {
172 148 : instr->header = InstrHeader(CTRL_TYPE, JMP_CODE);
173 148 : instr->v1.jmp.dstInstrXnId = dstInstrXnId;
174 148 : instr->v1.jmp.conditionXnId = conditionXnId;
175 148 : instr->v1.jmp.expectData = expectData;
176 148 : }
177 :
178 : // 本端Memory传输到本端MS
179 : // locMSId: 本端MSId
180 : // <locGSAId, locXnId>: 本端Memory地址和Token
181 : // 数据长度: length
182 9 : void TransLocMemToLocMSInstr(
183 : CcuInstr* instr, uint16_t locMSId, uint16_t locGSAId, uint16_t locXnId, uint16_t lengthXnId, uint16_t channelId,
184 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType,
185 : uint16_t lengthEn)
186 : {
187 9 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMS_CODE);
188 9 : instr->v1.transLocMemToLocMS.locMSId = locMSId;
189 9 : instr->v1.transLocMemToLocMS.locGSAId = locGSAId;
190 9 : instr->v1.transLocMemToLocMS.locXnId = locXnId;
191 9 : instr->v1.transLocMemToLocMS.lengthXnId = lengthXnId;
192 9 : instr->v1.transLocMemToLocMS.channelId = channelId;
193 9 : instr->v1.transLocMemToLocMS.clearType = clearType & 0x1;
194 9 : instr->v1.transLocMemToLocMS.lengthEn = lengthEn & 0x1;
195 9 : instr->v1.transLocMemToLocMS.setCKEId = setCKEId;
196 9 : instr->v1.transLocMemToLocMS.setCKEMask = setCKEMask;
197 9 : instr->v1.transLocMemToLocMS.waitCKEId = waitCKEId;
198 9 : instr->v1.transLocMemToLocMS.waitCKEMask = waitCKEMask;
199 9 : }
200 :
201 : // 远端Memory传输到本端MS
202 : // locMSId: 本端MSId
203 : // <rmtGSAId, rmtXnId>: 远端Memory地址和Token
204 : // 数据长度: length
205 : // 路径: channelId
206 1 : void TransRmtMemToLocMSInstr(
207 : CcuInstr* instr, uint16_t locMSId, uint16_t rmtGSAId, uint16_t rmtXnId, uint16_t lengthXnId, uint16_t channelId,
208 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType,
209 : uint16_t lengthEn)
210 : {
211 1 : instr->header = InstrHeader(TRANS_TYPE, TRANSRMTMEMTOLOCMS_CODE);
212 1 : instr->v1.transRmtMemToLocMS.locMSId = locMSId;
213 1 : instr->v1.transRmtMemToLocMS.rmtGSAId = rmtGSAId;
214 1 : instr->v1.transRmtMemToLocMS.rmtXnId = rmtXnId;
215 1 : instr->v1.transRmtMemToLocMS.lengthXnId = lengthXnId;
216 1 : instr->v1.transRmtMemToLocMS.channelId = channelId;
217 1 : instr->v1.transRmtMemToLocMS.clearType = clearType & 0x1;
218 1 : instr->v1.transRmtMemToLocMS.lengthEn = lengthEn & 0x1;
219 1 : instr->v1.transRmtMemToLocMS.setCKEId = setCKEId;
220 1 : instr->v1.transRmtMemToLocMS.setCKEMask = setCKEMask;
221 1 : instr->v1.transRmtMemToLocMS.waitCKEId = waitCKEId;
222 1 : instr->v1.transRmtMemToLocMS.waitCKEMask = waitCKEMask;
223 1 : }
224 :
225 : // 本端MS传输到本端Memory
226 : // <locGSAId, locXnId>: 本端Memory地址和Token
227 : // locMSId: 本端MSId
228 : // 数据长度: length
229 7 : void TransLocMSToLocMemInstr(
230 : CcuInstr* instr, uint16_t locGSAId, uint16_t locXnId, uint16_t locMSId, uint16_t lengthXnId, uint16_t channelId,
231 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType,
232 : uint16_t lengthEn)
233 : {
234 7 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMEM_CODE);
235 7 : instr->v1.transLocMSToLocMem.locGSAId = locGSAId;
236 7 : instr->v1.transLocMSToLocMem.locXnId = locXnId;
237 7 : instr->v1.transLocMSToLocMem.locMSId = locMSId;
238 7 : instr->v1.transLocMSToLocMem.lengthXnId = lengthXnId;
239 7 : instr->v1.transLocMSToLocMem.channelId = channelId;
240 7 : instr->v1.transLocMSToLocMem.clearType = clearType & 0x1;
241 7 : instr->v1.transLocMSToLocMem.lengthEn = lengthEn & 0x1;
242 7 : instr->v1.transLocMSToLocMem.setCKEId = setCKEId;
243 7 : instr->v1.transLocMSToLocMem.setCKEMask = setCKEMask;
244 7 : instr->v1.transLocMSToLocMem.waitCKEId = waitCKEId;
245 7 : instr->v1.transLocMSToLocMem.waitCKEMask = waitCKEMask;
246 7 : }
247 :
248 : // 本端MS传输到远端Memory
249 : // locMSId: 本端MSId
250 : // <rmtGSAId, rmtXnId>: 远端Memory地址和Token
251 : // 数据长度: length
252 : // 路径: channelId
253 1 : void TransLocMSToRmtMemInstr(
254 : CcuInstr* instr, uint16_t rmtGSAId, uint16_t rmtXnId, uint16_t locMSId, uint16_t lengthXnId, uint16_t channelId,
255 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType,
256 : uint16_t lengthEn)
257 : {
258 1 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMSTORMTMEM_CODE);
259 1 : instr->v1.transLocMSToRmtMem.rmtGSAId = rmtGSAId;
260 1 : instr->v1.transLocMSToRmtMem.rmtXnId = rmtXnId;
261 1 : instr->v1.transLocMSToRmtMem.locMSId = locMSId;
262 1 : instr->v1.transLocMSToRmtMem.lengthXnId = lengthXnId;
263 1 : instr->v1.transLocMSToRmtMem.channelId = channelId;
264 1 : instr->v1.transLocMSToRmtMem.clearType = clearType & 0x1;
265 1 : instr->v1.transLocMSToRmtMem.lengthEn = lengthEn & 0x1;
266 1 : instr->v1.transLocMSToRmtMem.setCKEId = setCKEId;
267 1 : instr->v1.transLocMSToRmtMem.setCKEMask = setCKEMask;
268 1 : instr->v1.transLocMSToRmtMem.waitCKEId = waitCKEId;
269 1 : instr->v1.transLocMSToRmtMem.waitCKEMask = waitCKEMask;
270 1 : }
271 :
272 : // 远端MS传输到本端Memory
273 : // <locGSAId, locXnId>: 本端Memory地址和Token
274 : // rmtMSId: 远端MSId
275 : // 数据长度: length
276 : // 路径: channelId
277 0 : void TransRmtMSToLocMemInstr(
278 : CcuInstr* instr, uint16_t locGSAId, uint16_t locXnId, uint16_t rmtMSId, uint16_t lengthXnId, uint16_t channelId,
279 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType,
280 : uint16_t lengthEn)
281 : {
282 0 : instr->header = InstrHeader(TRANS_TYPE, TRANSRMTMSTOLOCMEM_CODE);
283 0 : instr->v1.transRmtMSToLocMem.locGSAId = locGSAId;
284 0 : instr->v1.transRmtMSToLocMem.locXnId = locXnId;
285 0 : instr->v1.transRmtMSToLocMem.rmtMSId = rmtMSId;
286 0 : instr->v1.transRmtMSToLocMem.lengthXnId = lengthXnId;
287 0 : instr->v1.transRmtMSToLocMem.channelId = channelId;
288 0 : instr->v1.transRmtMSToLocMem.clearType = clearType & 0x1;
289 0 : instr->v1.transRmtMSToLocMem.lengthEn = lengthEn & 0x1;
290 0 : instr->v1.transRmtMSToLocMem.setCKEId = setCKEId;
291 0 : instr->v1.transRmtMSToLocMem.setCKEMask = setCKEMask;
292 0 : instr->v1.transRmtMSToLocMem.waitCKEId = waitCKEId;
293 0 : instr->v1.transRmtMSToLocMem.waitCKEMask = waitCKEMask;
294 0 : }
295 :
296 : // 本端MS传输到本端MS
297 : // dstMSId: 本端目的MSId
298 : // srcMSId: 本端源MSId
299 : // 数据长度: length
300 0 : void TransLocMSToLocMSInstr(
301 : CcuInstr* instr, uint16_t dstMSId, uint16_t srcMSId, uint16_t lengthXnId, uint16_t channelId, uint16_t setCKEId,
302 : uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t lengthEn)
303 : {
304 0 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMS_CODE);
305 0 : instr->v1.transLocMSToLocMS.dstMSId = dstMSId;
306 0 : instr->v1.transLocMSToLocMS.srcMSId = srcMSId;
307 0 : instr->v1.transLocMSToLocMS.lengthXnId = lengthXnId;
308 0 : instr->v1.transLocMSToLocMS.channelId = channelId;
309 0 : instr->v1.transLocMSToLocMS.clearType = clearType & 0x1;
310 0 : instr->v1.transLocMSToLocMS.lengthEn = lengthEn & 0x1;
311 0 : instr->v1.transLocMSToLocMS.setCKEId = setCKEId;
312 0 : instr->v1.transLocMSToLocMS.setCKEMask = setCKEMask;
313 0 : instr->v1.transLocMSToLocMS.waitCKEId = waitCKEId;
314 0 : instr->v1.transLocMSToLocMS.waitCKEMask = waitCKEMask;
315 0 : }
316 :
317 : // 远端MS传输到本端MS
318 : // locMSId: 本端MSId
319 : // rmtMSId: 远端MSId
320 : // 数据长度: length
321 : // 路径: channelId
322 0 : void TransRmtMSToLocMSInstr(
323 : CcuInstr* instr, uint16_t locMSId, uint16_t rmtMSId, uint16_t lengthXnId, uint16_t channelId, uint16_t setCKEId,
324 : uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t lengthEn)
325 : {
326 0 : instr->header = InstrHeader(TRANS_TYPE, TRANSRMTMSTOLOCMS_CODE);
327 0 : instr->v1.transRmtMSToLocMS.locMSId = locMSId;
328 0 : instr->v1.transRmtMSToLocMS.rmtMSId = rmtMSId;
329 0 : instr->v1.transRmtMSToLocMS.lengthXnId = lengthXnId;
330 0 : instr->v1.transRmtMSToLocMS.channelId = channelId;
331 0 : instr->v1.transRmtMSToLocMS.clearType = clearType & 0x1;
332 0 : instr->v1.transRmtMSToLocMS.lengthEn = lengthEn & 0x1;
333 0 : instr->v1.transRmtMSToLocMS.setCKEId = setCKEId;
334 0 : instr->v1.transRmtMSToLocMS.setCKEMask = setCKEMask;
335 0 : instr->v1.transRmtMSToLocMS.waitCKEId = waitCKEId;
336 0 : instr->v1.transRmtMSToLocMS.waitCKEMask = waitCKEMask;
337 0 : }
338 :
339 0 : void TransLocMSToRmtMSInstr(
340 : CcuInstr* instr, uint16_t rmtMSId, uint16_t locMSId, uint16_t lengthXnId, uint16_t channelId,
341 : uint16_t setRmtCKEId, uint16_t setRmtCKEMask, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId,
342 : uint16_t waitCKEMask, uint16_t clearType, uint16_t lengthEn)
343 : {
344 0 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMSTORMTMS_CODE);
345 0 : instr->v1.transLocMSToRmtMS.rmtMSId = rmtMSId;
346 0 : instr->v1.transLocMSToRmtMS.locMSId = locMSId;
347 0 : instr->v1.transLocMSToRmtMS.lengthXnId = lengthXnId;
348 0 : instr->v1.transLocMSToRmtMS.channelId = channelId;
349 0 : instr->v1.transLocMSToRmtMS.setRmtCKEId = setRmtCKEId;
350 0 : instr->v1.transLocMSToRmtMS.setRmtCKEMask = setRmtCKEMask;
351 :
352 0 : instr->v1.transLocMSToRmtMS.clearType = clearType & 0x1;
353 0 : instr->v1.transLocMSToRmtMS.lengthEn = lengthEn & 0x1;
354 0 : instr->v1.transLocMSToRmtMS.setCKEId = setCKEId;
355 0 : instr->v1.transLocMSToRmtMS.setCKEMask = setCKEMask;
356 0 : instr->v1.transLocMSToRmtMS.waitCKEId = waitCKEId;
357 0 : instr->v1.transLocMSToRmtMS.waitCKEMask = waitCKEMask;
358 0 : }
359 :
360 : // 远端Memory传输到本端Memory
361 : // <locGSAId, locXnId>: 本端Memory地址和Token
362 : // <rmtGSAId, rmtXnId>: 远端Memory地址和Token
363 : // 数据长度: length
364 : // 路径: channelId
365 3 : void TransRmtMemToLocMemInstr(
366 : CcuInstr* instr, uint16_t locGSAId, uint16_t locXnId, uint16_t rmtGSAId, uint16_t rmtXnId, uint16_t lengthXnId,
367 : uint16_t channelId, uint16_t reduceDataType, uint16_t reduceOpCode, uint16_t setCKEId, uint16_t setCKEMask,
368 : uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t lengthEn, uint16_t reduceEn)
369 : {
370 3 : instr->header = InstrHeader(TRANS_TYPE, TRANSRMTMEMTOLOCMEM_CODE);
371 3 : instr->v1.transRmtMemToLocMem.locGSAId = locGSAId;
372 3 : instr->v1.transRmtMemToLocMem.locXnId = locXnId;
373 3 : instr->v1.transRmtMemToLocMem.rmtGSAId = rmtGSAId;
374 3 : instr->v1.transRmtMemToLocMem.rmtXnId = rmtXnId;
375 3 : instr->v1.transRmtMemToLocMem.lengthXnId = lengthXnId;
376 3 : instr->v1.transRmtMemToLocMem.channelId = channelId;
377 3 : instr->v1.transRmtMemToLocMem.udfType = 0;
378 3 : instr->v1.transRmtMemToLocMem.reduceDataType = reduceDataType & 0xf;
379 3 : instr->v1.transRmtMemToLocMem.reduceOpCode = reduceOpCode & 0xf;
380 3 : instr->v1.transRmtMemToLocMem.clearType = clearType & 0x1;
381 3 : instr->v1.transRmtMemToLocMem.lengthEn = lengthEn & 0x1;
382 3 : instr->v1.transRmtMemToLocMem.reduceEn = reduceEn & 0x1;
383 3 : instr->v1.transRmtMemToLocMem.setCKEId = setCKEId;
384 3 : instr->v1.transRmtMemToLocMem.setCKEMask = setCKEMask;
385 3 : instr->v1.transRmtMemToLocMem.waitCKEId = waitCKEId;
386 3 : instr->v1.transRmtMemToLocMem.waitCKEMask = waitCKEMask;
387 3 : }
388 :
389 : // 本端Memory传输到远端Memory
390 : // <rmtGSAId, rmtXnId>: 远端Memory地址和Token
391 : // <locGSAId, locXnId>: 本端Memory地址和Token
392 : // 数据长度: length
393 : // 路径: channelId
394 4 : void TransLocMemToRmtMemInstr(
395 : CcuInstr* instr, uint16_t rmtGSAId, uint16_t rmtXnId, uint16_t locGSAId, uint16_t locXnId, uint16_t lengthXnId,
396 : uint16_t channelId, uint16_t reduceDataType, uint16_t reduceOpCode, uint16_t setCKEId, uint16_t setCKEMask,
397 : uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t lengthEn, uint16_t reduceEn)
398 : {
399 4 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMEMTORMTMEM_CODE);
400 4 : instr->v1.transLocMemToRmtMem.rmtGSAId = rmtGSAId;
401 4 : instr->v1.transLocMemToRmtMem.rmtXnId = rmtXnId;
402 4 : instr->v1.transLocMemToRmtMem.locGSAId = locGSAId;
403 4 : instr->v1.transLocMemToRmtMem.locXnId = locXnId;
404 4 : instr->v1.transLocMemToRmtMem.lengthXnId = lengthXnId;
405 4 : instr->v1.transLocMemToRmtMem.channelId = channelId;
406 4 : instr->v1.transLocMemToRmtMem.udfType = 0;
407 4 : instr->v1.transLocMemToRmtMem.reduceDataType = reduceDataType & 0xf;
408 4 : instr->v1.transLocMemToRmtMem.reduceOpCode = reduceOpCode & 0xf;
409 4 : instr->v1.transLocMemToRmtMem.clearType = clearType & 0x1;
410 4 : instr->v1.transLocMemToRmtMem.lengthEn = lengthEn & 0x1;
411 4 : instr->v1.transLocMemToRmtMem.reduceEn = reduceEn & 0x1;
412 4 : instr->v1.transLocMemToRmtMem.setCKEId = setCKEId;
413 4 : instr->v1.transLocMemToRmtMem.setCKEMask = setCKEMask;
414 4 : instr->v1.transLocMemToRmtMem.waitCKEId = waitCKEId;
415 4 : instr->v1.transLocMemToRmtMem.waitCKEMask = waitCKEMask;
416 4 : }
417 :
418 14 : void TransLocMemToLocMemInstr(
419 : CcuInstr* instr, uint16_t dstGSAId, uint16_t dstXnId, uint16_t srcGSAId, uint16_t srcXnId, uint16_t lengthXnId,
420 : uint16_t channelId, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
421 : uint16_t clearType, uint16_t lengthEn)
422 : {
423 14 : instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMEM_CODE);
424 14 : instr->v1.transLocMemToLocMem.dstGSAId = dstGSAId;
425 14 : instr->v1.transLocMemToLocMem.dstXnId = dstXnId;
426 14 : instr->v1.transLocMemToLocMem.srcGSAId = srcGSAId;
427 14 : instr->v1.transLocMemToLocMem.srcXnId = srcXnId;
428 14 : instr->v1.transLocMemToLocMem.lengthXnId = lengthXnId;
429 14 : instr->v1.transLocMemToLocMem.channelId = channelId;
430 14 : instr->v1.transLocMemToLocMem.clearType = clearType & 0x1;
431 14 : instr->v1.transLocMemToLocMem.lengthEn = lengthEn & 0x1;
432 14 : instr->v1.transLocMemToLocMem.setCKEId = setCKEId;
433 14 : instr->v1.transLocMemToLocMem.setCKEMask = setCKEMask;
434 14 : instr->v1.transLocMemToLocMem.waitCKEId = waitCKEId;
435 14 : instr->v1.transLocMemToLocMem.waitCKEMask = waitCKEMask;
436 14 : }
437 :
438 : // 本端CKE同步到远端CKE
439 : // rmtCKEId: 远端CKEId
440 : // locCKEId: 本端CKEId
441 : // locCKEMask: mask
442 : // 路径: channelId
443 3 : void SyncCKEInstr(
444 : CcuInstr* instr, uint16_t rmtCKEId, uint16_t locCKEId, uint16_t locCKEMask, uint16_t channelId,
445 : uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType)
446 : {
447 3 : instr->header = InstrHeader(TRANS_TYPE, SYNCCKE_CODE);
448 3 : instr->v1.syncCKE.rmtCKEId = rmtCKEId;
449 3 : instr->v1.syncCKE.locCKEId = locCKEId;
450 3 : instr->v1.syncCKE.locCKEMask = locCKEMask;
451 3 : instr->v1.syncCKE.channelId = channelId;
452 3 : instr->v1.syncCKE.clearType = clearType & 0x1;
453 3 : instr->v1.syncCKE.setCKEId = setCKEId;
454 3 : instr->v1.syncCKE.setCKEMask = setCKEMask;
455 3 : instr->v1.syncCKE.waitCKEId = waitCKEId;
456 3 : instr->v1.syncCKE.waitCKEMask = waitCKEMask;
457 3 : }
458 :
459 : // 本端<locGSAId>同步到远端<rmtGSAId> 同步完成后, 置位远端的<setRmtCKEId, setRmtCKEMask>
460 0 : void SyncGSAInstr(
461 : CcuInstr* instr, uint16_t rmtGSAId, uint16_t locGSAId, uint16_t channelId, uint16_t setRmtCKEId,
462 : uint16_t setRmtCKEMask, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
463 : uint16_t clearType)
464 : {
465 0 : instr->header = InstrHeader(TRANS_TYPE, SYNCGSA_CODE);
466 0 : instr->v1.syncGSA.rmtGSAId = rmtGSAId;
467 0 : instr->v1.syncGSA.locGSAId = locGSAId;
468 0 : instr->v1.syncGSA.channelId = channelId;
469 0 : instr->v1.syncGSA.setRmtCKEId = setRmtCKEId;
470 0 : instr->v1.syncGSA.setRmtCKEMask = setRmtCKEMask;
471 0 : instr->v1.syncGSA.clearType = clearType & 0x1;
472 0 : instr->v1.syncGSA.setCKEId = setCKEId;
473 0 : instr->v1.syncGSA.setCKEMask = setCKEMask;
474 0 : instr->v1.syncGSA.waitCKEId = waitCKEId;
475 0 : instr->v1.syncGSA.waitCKEMask = waitCKEMask;
476 0 : }
477 :
478 : // 本端<locInputXnId, locOutputXnId>同步到远端<rmtInputXnId, rmtOutputXnId> 同步完成后, 置位远端的<setRmtCKEId,
479 : // setRmtCKEMask>
480 5 : void SyncXnInstr(
481 : CcuInstr* instr, uint16_t rmtXnId, uint16_t locXnId, uint16_t channelId, uint16_t setRmtCKEId,
482 : uint16_t setRmtCKEMask, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
483 : uint16_t clearType)
484 : {
485 5 : instr->header = InstrHeader(TRANS_TYPE, SYNCXN_CODE);
486 5 : instr->v1.syncXn.rmtXnId = rmtXnId;
487 5 : instr->v1.syncXn.locXnId = locXnId;
488 5 : instr->v1.syncXn.channelId = channelId;
489 5 : instr->v1.syncXn.setRmtCKEId = setRmtCKEId;
490 5 : instr->v1.syncXn.setRmtCKEMask = setRmtCKEMask;
491 5 : instr->v1.syncXn.clearType = clearType & 0x1;
492 5 : instr->v1.syncXn.setCKEId = setCKEId;
493 5 : instr->v1.syncXn.setCKEMask = setCKEMask;
494 5 : instr->v1.syncXn.waitCKEId = waitCKEId;
495 5 : instr->v1.syncXn.waitCKEMask = waitCKEMask;
496 5 : }
497 :
498 : // MSA~MSH Reduce到 MSA
499 : // count: 参与Reduce的MS数目
500 : // castEn: 输出是否截断
501 : // dataType: Reduce数据类型
502 4 : void AddInstr(
503 : CcuInstr* instr, uint16_t* msId, uint16_t count, uint16_t castEn, uint16_t dataType, uint16_t setCKEId,
504 : uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t XnIdLength)
505 : {
506 4 : count -= 2; // CCU指令中指定count数为实际参与运算的MS数减2
507 4 : instr->header = InstrHeader(REDUCE_TYPE, ADD_CODE);
508 36 : for (uint16_t index = 0; index < CCU_REDUCE_MAX_MS; index++) {
509 32 : instr->v1.add.msId[index] = msId[index];
510 : }
511 4 : instr->v1.add.XnIdLength = XnIdLength;
512 4 : instr->v1.add.count = count & 0x7;
513 4 : instr->v1.add.castEn = castEn & 0x3;
514 4 : instr->v1.add.dataType = dataType & 0x1f;
515 4 : instr->v1.add.clearType = clearType & 0x1;
516 4 : instr->v1.add.setCKEId = setCKEId;
517 4 : instr->v1.add.setCKEMask = setCKEMask;
518 4 : instr->v1.add.waitCKEId = waitCKEId;
519 4 : instr->v1.add.waitCKEMask = waitCKEMask;
520 4 : }
521 :
522 1 : void MaxInstr(
523 : CcuInstr* instr, uint16_t* msId, uint16_t count, uint16_t dataType, uint16_t setCKEId, uint16_t setCKEMask,
524 : uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t XnIdLength)
525 : {
526 1 : count -= 2; // CCU指令中指定count数为实际参与运算的MS数减2
527 1 : instr->header = InstrHeader(REDUCE_TYPE, MAX_CODE);
528 9 : for (uint16_t index = 0; index < CCU_REDUCE_MAX_MS; index++) {
529 8 : instr->v1.add.msId[index] = msId[index];
530 : }
531 1 : instr->v1.max.XnIdLength = XnIdLength;
532 1 : instr->v1.max.count = count & 0x7;
533 1 : instr->v1.max.dataType = dataType & 0x1f;
534 1 : instr->v1.max.clearType = clearType & 0x1;
535 1 : instr->v1.max.setCKEId = setCKEId;
536 1 : instr->v1.max.setCKEMask = setCKEMask;
537 1 : instr->v1.max.waitCKEId = waitCKEId;
538 1 : instr->v1.max.waitCKEMask = waitCKEMask;
539 1 : }
540 :
541 1 : void MinInstr(
542 : CcuInstr* instr, uint16_t* msId, uint16_t count, uint16_t dataType, uint16_t setCKEId, uint16_t setCKEMask,
543 : uint16_t waitCKEId, uint16_t waitCKEMask, uint16_t clearType, uint16_t XnIdLength)
544 : {
545 1 : count -= 2; // CCU指令中指定count数为实际参与运算的MS数减2
546 1 : instr->header = InstrHeader(REDUCE_TYPE, MIN_CODE);
547 9 : for (uint16_t index = 0; index < CCU_REDUCE_MAX_MS; index++) {
548 8 : instr->v1.add.msId[index] = msId[index];
549 : }
550 1 : instr->v1.max.XnIdLength = XnIdLength;
551 1 : instr->v1.min.count = count & 0x7;
552 1 : instr->v1.min.dataType = dataType & 0x1f;
553 1 : instr->v1.min.clearType = clearType & 0x1;
554 1 : instr->v1.min.setCKEId = setCKEId;
555 1 : instr->v1.min.setCKEMask = setCKEMask;
556 1 : instr->v1.min.waitCKEId = waitCKEId;
557 1 : instr->v1.min.waitCKEMask = waitCKEMask;
558 1 : }
559 :
560 0 : std::string ParseLoadSqeArgsToGSAInstr(const CcuInstr* instr)
561 : {
562 0 : uint16_t gsaId = instr->v1.loadSqeArgsToGSA.gsaId;
563 0 : uint16_t sqeArgsId = instr->v1.loadSqeArgsToGSA.sqeArgsId;
564 :
565 0 : return Hccl::StringFormat("Load SqeArg[%u] to GSA[%u]", sqeArgsId, gsaId);
566 : }
567 :
568 64 : static std::string ParseLoadSqeArgsToXnInstr(const CcuInstr* instr)
569 : {
570 64 : uint16_t xnId = instr->v1.loadSqeArgsToXn.xnId;
571 64 : uint16_t sqeArgsId = instr->v1.loadSqeArgsToXn.sqeArgsId;
572 :
573 64 : return Hccl::StringFormat("Load SqeArg[%u] to Xn[%u]", sqeArgsId, xnId);
574 : }
575 :
576 69 : static std::string ParseLoadImdToGSAInstr(const CcuInstr* instr)
577 : {
578 69 : uint16_t gsaId = instr->v1.loadImdToGSA.gsaId;
579 69 : uint64_t immediate = instr->v1.loadImdToGSA.immediate;
580 :
581 69 : return Hccl::StringFormat("Load immediate[%llu] to GSA[%u]", immediate, gsaId);
582 : }
583 :
584 1104 : static std::string ParseLoadImdToXnInstr(const CcuInstr* instr)
585 : {
586 1104 : uint16_t xnId = instr->v1.loadImdToXn.xnId;
587 1104 : uint64_t immediate = instr->v1.loadImdToXn.immediate;
588 :
589 1104 : if (instr->v1.loadImdToXn.secFlag == CCU_LOAD_TO_XN_SEC_INFO) {
590 32 : return Hccl::StringFormat("Load immediate[tokenInfo] to Xn[%u]", xnId);
591 : }
592 :
593 1072 : return Hccl::StringFormat("Load immediate[%llu] to Xn[%u]", immediate, xnId);
594 : }
595 :
596 78 : static std::string ParseLoadGSAXnInstr(const CcuInstr* instr)
597 : {
598 78 : uint16_t gsAdId = instr->v1.loadGSAXn.gsAdId;
599 78 : uint16_t gsAmId = instr->v1.loadGSAXn.gsAmId;
600 78 : uint16_t xnId = instr->v1.loadGSAXn.xnId;
601 :
602 78 : return Hccl::StringFormat("Load GSA[%u] + Xn[%u] to GSA[%u]", gsAmId, xnId, gsAdId);
603 : }
604 :
605 46 : static std::string ParseLoadGSAGSAInstr(const CcuInstr* instr)
606 : {
607 46 : uint16_t gsAdId = instr->v1.loadGSAGSA.gsAdId;
608 46 : uint16_t gsAmId = instr->v1.loadGSAGSA.gsAmId;
609 46 : uint16_t gsAnId = instr->v1.loadGSAGSA.gsAnId;
610 :
611 46 : return Hccl::StringFormat("Load GSA[%u] + GSA[%u] to GSA[%u]", gsAmId, gsAnId, gsAdId);
612 : }
613 :
614 414 : static std::string ParseLoadXXInstr(const CcuInstr* instr)
615 : {
616 414 : uint16_t xdId = instr->v1.loadXX.xdId;
617 414 : uint16_t xmId = instr->v1.loadXX.xmId;
618 414 : uint16_t xnId = instr->v1.loadXX.xnId;
619 :
620 414 : return Hccl::StringFormat("Load Xn[%u] + Xn[%u] to Xn[%u]", xmId, xnId, xdId);
621 : }
622 :
623 72 : static std::string ParseLoopInstr(const CcuInstr* instr)
624 : {
625 72 : uint16_t startInstrId = instr->v1.loop.startInstrId;
626 72 : uint16_t endInstrId = instr->v1.loop.endInstrId;
627 72 : uint16_t xnId = instr->v1.loop.xnId;
628 :
629 : return Hccl::StringFormat(
630 72 : "Loop From startInstrId[%u] to endInstrId[%u] with loopXn[%u]", startInstrId, endInstrId, xnId);
631 : }
632 :
633 36 : static std::string ParseLoopGroupInstr(const CcuInstr* instr)
634 : {
635 36 : uint16_t startLoopInstrId = instr->v1.loopGroup.startLoopInstrId;
636 36 : uint16_t xnId = instr->v1.loopGroup.xnId;
637 36 : uint16_t xmId = instr->v1.loopGroup.xmId;
638 36 : uint16_t highPerfModeEn = instr->v1.loopGroup.highPerfModeEn;
639 :
640 : return Hccl::StringFormat(
641 : "LoopGroup From startLoopInstrId[%u] with loopGroupXn[%u], offsetXn[%u] and highPerfModeEn[%u]",
642 36 : startLoopInstrId, xnId, xmId, highPerfModeEn);
643 : }
644 :
645 111 : static std::string ParseSetCKEInstr(const CcuInstr* instr)
646 : {
647 111 : uint16_t clearType = instr->v1.setCKE.clearType;
648 111 : uint16_t setCKEId = instr->v1.setCKE.setCKEId;
649 111 : uint16_t setCKEMask = instr->v1.setCKE.setCKEMask;
650 111 : uint16_t waitCKEId = instr->v1.setCKE.waitCKEId;
651 111 : uint16_t waitCKEMask = instr->v1.setCKE.waitCKEMask;
652 :
653 : return Hccl::StringFormat(
654 : "Wait CKE[%u:%04x], Set CKE[%u:%04x], clearType[%u]", waitCKEId, waitCKEMask, setCKEId, setCKEMask,
655 111 : clearType);
656 : }
657 :
658 20 : static std::string ParseClearCKEInstr(const CcuInstr* instr)
659 : {
660 20 : uint16_t clearType = instr->v1.clearCKE.clearType;
661 20 : uint16_t clearCKEId = instr->v1.clearCKE.clearCKEId;
662 20 : uint16_t clearMask = instr->v1.clearCKE.clearMask;
663 20 : uint16_t waitCKEId = instr->v1.clearCKE.waitCKEId;
664 20 : uint16_t waitCKEMask = instr->v1.clearCKE.waitCKEMask;
665 :
666 : return Hccl::StringFormat(
667 : "Wait CKE[%u:%04x], Clear CKE[%u:%04x], clearType[%u]", waitCKEId, waitCKEMask, clearCKEId, clearMask,
668 20 : clearType);
669 : }
670 :
671 282 : static std::string ParseJumpInstr(const CcuInstr* instr)
672 : {
673 282 : uint16_t dstInstrXnId = instr->v1.jmp.dstInstrXnId;
674 282 : uint16_t conditionXnId = instr->v1.jmp.conditionXnId;
675 282 : uint64_t expectData = instr->v1.jmp.expectData;
676 :
677 : return Hccl::StringFormat(
678 : "When conditionXn[%u] not equal to expectData[%llu], Jump To InstrIdXn[%u]", conditionXnId, expectData,
679 282 : dstInstrXnId);
680 : }
681 :
682 16 : static std::string ParseTransLocMemToLocMSInstr(const CcuInstr* instr)
683 : {
684 16 : uint16_t locMSId = instr->v1.transLocMemToLocMS.locMSId;
685 16 : uint16_t locGSAId = instr->v1.transLocMemToLocMS.locGSAId;
686 16 : uint16_t locXnId = instr->v1.transLocMemToLocMS.locXnId;
687 16 : uint16_t lengthXnId = instr->v1.transLocMemToLocMS.lengthXnId;
688 16 : uint16_t channelId = instr->v1.transLocMemToLocMS.channelId;
689 16 : uint16_t clearType = instr->v1.transLocMemToLocMS.clearType;
690 16 : uint16_t lengthEn = instr->v1.transLocMemToLocMS.lengthEn;
691 16 : uint16_t setCKEId = instr->v1.transLocMemToLocMS.setCKEId;
692 16 : uint16_t setCKEMask = instr->v1.transLocMemToLocMS.setCKEMask;
693 16 : uint16_t waitCKEId = instr->v1.transLocMemToLocMS.waitCKEId;
694 16 : uint16_t waitCKEMask = instr->v1.transLocMemToLocMS.waitCKEMask;
695 :
696 : return Hccl::StringFormat(
697 : "Wait CKE[%u:%04x], Trans LocMem[%u:%u] To LocMS[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
698 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
699 16 : waitCKEId, waitCKEMask, locGSAId, locXnId, locMSId / 0x8000, locMSId % 0x8000, lengthXnId, channelId,
700 16 : setCKEId, setCKEMask, clearType, lengthEn);
701 : }
702 :
703 2 : static std::string ParseTransRmtMemToLocMSInstr(const CcuInstr* instr)
704 : {
705 2 : uint16_t locMSId = instr->v1.transRmtMemToLocMS.locMSId;
706 2 : uint16_t rmtGSAId = instr->v1.transRmtMemToLocMS.rmtGSAId;
707 2 : uint16_t rmtXnId = instr->v1.transRmtMemToLocMS.rmtXnId;
708 2 : uint16_t lengthXnId = instr->v1.transRmtMemToLocMS.lengthXnId;
709 2 : uint16_t channelId = instr->v1.transRmtMemToLocMS.channelId;
710 2 : uint16_t clearType = instr->v1.transRmtMemToLocMS.clearType;
711 2 : uint16_t lengthEn = instr->v1.transRmtMemToLocMS.lengthEn;
712 2 : uint16_t setCKEId = instr->v1.transRmtMemToLocMS.setCKEId;
713 2 : uint16_t setCKEMask = instr->v1.transRmtMemToLocMS.setCKEMask;
714 2 : uint16_t waitCKEId = instr->v1.transRmtMemToLocMS.waitCKEId;
715 2 : uint16_t waitCKEMask = instr->v1.transRmtMemToLocMS.waitCKEMask;
716 :
717 : return Hccl::StringFormat(
718 : "Wait CKE[%u:%04x], Trans RmtMem[%u:%u] To LocMS[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
719 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
720 2 : waitCKEId, waitCKEMask, rmtGSAId, rmtXnId, locMSId / 0x8000, locMSId % 0x8000, lengthXnId, channelId,
721 2 : setCKEId, setCKEMask, clearType, lengthEn);
722 : }
723 :
724 12 : static std::string ParseTransLocMSToLocMemInstr(const CcuInstr* instr)
725 : {
726 12 : uint16_t locGSAId = instr->v1.transLocMSToLocMem.locGSAId;
727 12 : uint16_t locXnId = instr->v1.transLocMSToLocMem.locXnId;
728 12 : uint16_t locMSId = instr->v1.transLocMSToLocMem.locMSId;
729 12 : uint16_t lengthXnId = instr->v1.transLocMSToLocMem.lengthXnId;
730 12 : uint16_t channelId = instr->v1.transLocMSToLocMem.channelId;
731 12 : uint16_t clearType = instr->v1.transLocMSToLocMem.clearType;
732 12 : uint16_t lengthEn = instr->v1.transLocMSToLocMem.lengthEn;
733 12 : uint16_t setCKEId = instr->v1.transLocMSToLocMem.setCKEId;
734 12 : uint16_t setCKEMask = instr->v1.transLocMSToLocMem.setCKEMask;
735 12 : uint16_t waitCKEId = instr->v1.transLocMSToLocMem.waitCKEId;
736 12 : uint16_t waitCKEMask = instr->v1.transLocMSToLocMem.waitCKEMask;
737 :
738 : return Hccl::StringFormat(
739 : "Wait CKE[%u:%04x], Trans LocMS[%u:%u] To LocMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
740 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
741 12 : waitCKEId, waitCKEMask, locMSId / 0x8000, locMSId % 0x8000, locGSAId, locXnId, lengthXnId, channelId,
742 12 : setCKEId, setCKEMask, clearType, lengthEn);
743 : }
744 :
745 2 : static std::string ParseTransLocMSToRmtMemInstr(const CcuInstr* instr)
746 : {
747 2 : uint16_t rmtGSAId = instr->v1.transLocMSToRmtMem.rmtGSAId;
748 2 : uint16_t rmtXnId = instr->v1.transLocMSToRmtMem.rmtXnId;
749 2 : uint16_t locMSId = instr->v1.transLocMSToRmtMem.locMSId;
750 2 : uint16_t lengthXnId = instr->v1.transLocMSToRmtMem.lengthXnId;
751 2 : uint16_t channelId = instr->v1.transLocMSToRmtMem.channelId;
752 2 : uint16_t clearType = instr->v1.transLocMSToRmtMem.clearType;
753 2 : uint16_t lengthEn = instr->v1.transLocMSToRmtMem.lengthEn;
754 2 : uint16_t setCKEId = instr->v1.transLocMSToRmtMem.setCKEId;
755 2 : uint16_t setCKEMask = instr->v1.transLocMSToRmtMem.setCKEMask;
756 2 : uint16_t waitCKEId = instr->v1.transLocMSToRmtMem.waitCKEId;
757 2 : uint16_t waitCKEMask = instr->v1.transLocMSToRmtMem.waitCKEMask;
758 :
759 : return Hccl::StringFormat(
760 : "Wait CKE[%u:%04x], Trans LocMS[%u:%u] To RmtMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
761 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
762 2 : waitCKEId, waitCKEMask, locMSId / 0x8000, locMSId % 0x8000, rmtGSAId, rmtXnId, lengthXnId, channelId,
763 2 : setCKEId, setCKEMask, clearType, lengthEn);
764 : }
765 :
766 0 : static std::string ParseTransRmtMSToLocMemInstr(const CcuInstr* instr)
767 : {
768 0 : uint16_t locGSAId = instr->v1.transRmtMSToLocMem.locGSAId;
769 0 : uint16_t locXnId = instr->v1.transRmtMSToLocMem.locXnId;
770 0 : uint16_t rmtMSId = instr->v1.transRmtMSToLocMem.rmtMSId;
771 0 : uint16_t lengthXnId = instr->v1.transRmtMSToLocMem.lengthXnId;
772 0 : uint16_t channelId = instr->v1.transRmtMSToLocMem.channelId;
773 0 : uint16_t clearType = instr->v1.transRmtMSToLocMem.clearType;
774 0 : uint16_t lengthEn = instr->v1.transRmtMSToLocMem.lengthEn;
775 0 : uint16_t setCKEId = instr->v1.transRmtMSToLocMem.setCKEId;
776 0 : uint16_t setCKEMask = instr->v1.transRmtMSToLocMem.setCKEMask;
777 0 : uint16_t waitCKEId = instr->v1.transRmtMSToLocMem.waitCKEId;
778 0 : uint16_t waitCKEMask = instr->v1.transRmtMSToLocMem.waitCKEMask;
779 :
780 : return Hccl::StringFormat(
781 : "Wait CKE[%u:%04x], Trans RmtMS[%u:%u] To LocMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
782 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
783 0 : waitCKEId, waitCKEMask, rmtMSId / 0x8000, rmtMSId % 0x8000, locGSAId, locXnId, lengthXnId, channelId,
784 0 : setCKEId, setCKEMask, clearType, lengthEn);
785 : }
786 :
787 0 : static std::string ParseTransLocMSToLocMSInstr(const CcuInstr* instr)
788 : {
789 0 : uint16_t dstMSId = instr->v1.transLocMSToLocMS.dstMSId;
790 0 : uint16_t srcMSId = instr->v1.transLocMSToLocMS.srcMSId;
791 0 : uint16_t lengthXnId = instr->v1.transLocMSToLocMS.lengthXnId;
792 0 : uint16_t channelId = instr->v1.transLocMSToLocMS.channelId;
793 0 : uint16_t clearType = instr->v1.transLocMSToLocMS.clearType;
794 0 : uint16_t lengthEn = instr->v1.transLocMSToLocMS.lengthEn;
795 0 : uint16_t setCKEId = instr->v1.transLocMSToLocMS.setCKEId;
796 0 : uint16_t setCKEMask = instr->v1.transLocMSToLocMS.setCKEMask;
797 0 : uint16_t waitCKEId = instr->v1.transLocMSToLocMS.waitCKEId;
798 0 : uint16_t waitCKEMask = instr->v1.transLocMSToLocMS.waitCKEMask;
799 :
800 : return Hccl::StringFormat(
801 : "Wait CKE[%u:%04x], Trans LocMS[%u:%u] To LocMS[%u:%u] With LengthXn[%u] Use Channel[%u], "
802 : "Set CKE[%u:%04x], "
803 : "clearType[%u], lengthEn[%u]",
804 0 : waitCKEId, waitCKEMask, srcMSId / 0x8000, srcMSId % 0x8000, dstMSId / 0x8000, dstMSId % 0x8000, lengthXnId,
805 0 : channelId, setCKEId, setCKEMask, clearType, lengthEn);
806 : }
807 :
808 0 : static std::string ParseTransRmtMSToLocMSInstr(const CcuInstr* instr)
809 : {
810 0 : uint16_t locMSId = instr->v1.transRmtMSToLocMS.locMSId;
811 0 : uint16_t rmtMSId = instr->v1.transRmtMSToLocMS.rmtMSId;
812 0 : uint16_t lengthXnId = instr->v1.transRmtMSToLocMS.lengthXnId;
813 0 : uint16_t channelId = instr->v1.transRmtMSToLocMS.channelId;
814 0 : uint16_t clearType = instr->v1.transRmtMSToLocMS.clearType;
815 0 : uint16_t lengthEn = instr->v1.transRmtMSToLocMS.lengthEn;
816 0 : uint16_t setCKEId = instr->v1.transRmtMSToLocMS.setCKEId;
817 0 : uint16_t setCKEMask = instr->v1.transRmtMSToLocMS.setCKEMask;
818 0 : uint16_t waitCKEId = instr->v1.transRmtMSToLocMS.waitCKEId;
819 0 : uint16_t waitCKEMask = instr->v1.transRmtMSToLocMS.waitCKEMask;
820 :
821 : return Hccl::StringFormat(
822 : "Wait CKE[%u:%04x], Trans RmtMS[%u:%u] To LocMS[%u:%u] With LengthXn[%u] Use Channel[%u], "
823 : "Set CKE[%u:%04x], "
824 : "clearType[%u], lengthEn[%u]",
825 0 : waitCKEId, waitCKEMask, rmtMSId / 0x8000, rmtMSId % 0x8000, locMSId / 0x8000, locMSId % 0x8000, lengthXnId,
826 0 : channelId, setCKEId, setCKEMask, clearType, lengthEn);
827 : }
828 :
829 0 : static std::string ParseTransLocMSToRmtMSInstr(const CcuInstr* instr)
830 : {
831 0 : uint16_t rmtMSId = instr->v1.transLocMSToRmtMS.rmtMSId;
832 0 : uint16_t locMSId = instr->v1.transLocMSToRmtMS.locMSId;
833 0 : uint16_t lengthXnId = instr->v1.transLocMSToRmtMS.lengthXnId;
834 0 : uint16_t channelId = instr->v1.transLocMSToRmtMS.channelId;
835 0 : uint16_t setRmtCKEId = instr->v1.transLocMSToRmtMS.setRmtCKEId;
836 0 : uint16_t setRmtCKEMask = instr->v1.transLocMSToRmtMS.setRmtCKEMask;
837 :
838 0 : uint16_t clearType = instr->v1.transLocMSToRmtMS.clearType;
839 0 : uint16_t lengthEn = instr->v1.transLocMSToRmtMS.lengthEn;
840 0 : uint16_t setCKEId = instr->v1.transLocMSToRmtMS.setCKEId;
841 0 : uint16_t setCKEMask = instr->v1.transLocMSToRmtMS.setCKEMask;
842 0 : uint16_t waitCKEId = instr->v1.transLocMSToRmtMS.waitCKEId;
843 0 : uint16_t waitCKEMask = instr->v1.transLocMSToRmtMS.waitCKEMask;
844 :
845 : return Hccl::StringFormat(
846 : "Wait CKE[%u:%04x], Trans LocMS[%u:%u] To RmtMS[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
847 : "RmtCKE[%u:%04x], Set CKE[%u:%04x], clearType[%u], lengthEn[%u]",
848 0 : waitCKEId, waitCKEMask, locMSId / 0x8000, locMSId % 0x8000, rmtMSId / 0x8000, rmtMSId % 0x8000, lengthXnId,
849 0 : channelId, setRmtCKEId, setRmtCKEMask, setCKEId, setCKEMask, clearType, lengthEn);
850 : }
851 :
852 6 : static std::string ParseTransRmtMemToLocMemInstr(const CcuInstr* instr)
853 : {
854 6 : uint16_t locGSAId = instr->v1.transRmtMemToLocMem.locGSAId;
855 6 : uint16_t locXnId = instr->v1.transRmtMemToLocMem.locXnId;
856 6 : uint16_t rmtGSAId = instr->v1.transRmtMemToLocMem.rmtGSAId;
857 6 : uint16_t rmtXnId = instr->v1.transRmtMemToLocMem.rmtXnId;
858 6 : uint16_t lengthXnId = instr->v1.transRmtMemToLocMem.lengthXnId;
859 6 : uint16_t channelId = instr->v1.transRmtMemToLocMem.channelId;
860 6 : uint16_t reduceDataType = instr->v1.transRmtMemToLocMem.reduceDataType;
861 6 : uint16_t reduceOpCode = instr->v1.transRmtMemToLocMem.reduceOpCode;
862 6 : uint16_t clearType = instr->v1.transRmtMemToLocMem.clearType;
863 6 : uint16_t lengthEn = instr->v1.transRmtMemToLocMem.lengthEn;
864 6 : uint16_t reduceEn = instr->v1.transRmtMemToLocMem.reduceEn;
865 6 : uint16_t setCKEId = instr->v1.transRmtMemToLocMem.setCKEId;
866 6 : uint16_t setCKEMask = instr->v1.transRmtMemToLocMem.setCKEMask;
867 6 : uint16_t waitCKEId = instr->v1.transRmtMemToLocMem.waitCKEId;
868 6 : uint16_t waitCKEMask = instr->v1.transRmtMemToLocMem.waitCKEMask;
869 :
870 : return Hccl::StringFormat(
871 : "Wait CKE[%u:%04x], Trans RmtMem[%u:%u] To LocMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
872 : "CKE[%u:%04x], clearType[%u], lengthEn[%u], DataType[%u], ReduceType[%u] reduceEn[%u]",
873 : waitCKEId, waitCKEMask, rmtGSAId, rmtXnId, locGSAId, locXnId, lengthXnId, channelId, setCKEId, setCKEMask,
874 6 : clearType, lengthEn, reduceDataType, reduceOpCode, reduceEn);
875 : }
876 :
877 6 : static std::string ParseTransLocMemToRmtMemInstr(const CcuInstr* instr)
878 : {
879 6 : uint16_t rmtGSAId = instr->v1.transLocMemToRmtMem.rmtGSAId;
880 6 : uint16_t rmtXnId = instr->v1.transLocMemToRmtMem.rmtXnId;
881 6 : uint16_t locGSAId = instr->v1.transLocMemToRmtMem.locGSAId;
882 6 : uint16_t locXnId = instr->v1.transLocMemToRmtMem.locXnId;
883 6 : uint16_t lengthXnId = instr->v1.transLocMemToRmtMem.lengthXnId;
884 6 : uint16_t channelId = instr->v1.transLocMemToRmtMem.channelId;
885 6 : uint16_t reduceDataType = instr->v1.transLocMemToRmtMem.reduceDataType;
886 6 : uint16_t reduceOpCode = instr->v1.transLocMemToRmtMem.reduceOpCode;
887 6 : uint16_t clearType = instr->v1.transLocMemToRmtMem.clearType;
888 6 : uint16_t lengthEn = instr->v1.transLocMemToRmtMem.lengthEn;
889 6 : uint16_t reduceEn = instr->v1.transLocMemToRmtMem.reduceEn;
890 6 : uint16_t setCKEId = instr->v1.transLocMemToRmtMem.setCKEId;
891 6 : uint16_t setCKEMask = instr->v1.transLocMemToRmtMem.setCKEMask;
892 6 : uint16_t waitCKEId = instr->v1.transLocMemToRmtMem.waitCKEId;
893 6 : uint16_t waitCKEMask = instr->v1.transLocMemToRmtMem.waitCKEMask;
894 :
895 : return Hccl::StringFormat(
896 : "Wait CKE[%u:%04x], Trans LocMem[%u:%u] To RmtMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
897 : "CKE[%u:%04x], clearType[%u], lengthEn[%u], DataType[%u], ReduceType[%u] reduceEn[%u]",
898 : waitCKEId, waitCKEMask, locGSAId, locXnId, rmtGSAId, rmtXnId, lengthXnId, channelId, setCKEId, setCKEMask,
899 6 : clearType, lengthEn, reduceDataType, reduceOpCode, reduceEn);
900 : }
901 :
902 18 : static std::string ParseTransLocMemToLocMemInstr(const CcuInstr* instr)
903 : {
904 18 : uint16_t dstGSAId = instr->v1.transLocMemToLocMem.dstGSAId;
905 18 : uint16_t dstXnId = instr->v1.transLocMemToLocMem.dstXnId;
906 18 : uint16_t srcGSAId = instr->v1.transLocMemToLocMem.srcGSAId;
907 18 : uint16_t srcXnId = instr->v1.transLocMemToLocMem.srcXnId;
908 18 : uint16_t lengthXnId = instr->v1.transLocMemToLocMem.lengthXnId;
909 18 : uint16_t channelId = instr->v1.transLocMemToLocMem.channelId;
910 18 : uint16_t clearType = instr->v1.transLocMemToLocMem.clearType;
911 18 : uint16_t lengthEn = instr->v1.transLocMemToLocMem.lengthEn;
912 18 : uint16_t setCKEId = instr->v1.transLocMemToLocMem.setCKEId;
913 18 : uint16_t setCKEMask = instr->v1.transLocMemToLocMem.setCKEMask;
914 18 : uint16_t waitCKEId = instr->v1.transLocMemToLocMem.waitCKEId;
915 18 : uint16_t waitCKEMask = instr->v1.transLocMemToLocMem.waitCKEMask;
916 :
917 : return Hccl::StringFormat(
918 : "Wait CKE[%u:%04x], Trans LocMem[%u:%u] To LocMem[%u:%u] With LengthXn[%u] Use Channel[%u], Set "
919 : "CKE[%u:%04x], clearType[%u], lengthEn[%u]",
920 : waitCKEId, waitCKEMask, srcGSAId, srcXnId, dstGSAId, dstXnId, lengthXnId, channelId, setCKEId, setCKEMask,
921 18 : clearType, lengthEn);
922 : }
923 :
924 4 : static std::string ParseSyncCKEInstr(const CcuInstr* instr)
925 : {
926 4 : uint16_t rmtCKEId = instr->v1.syncCKE.rmtCKEId;
927 4 : uint16_t locCKEId = instr->v1.syncCKE.locCKEId;
928 4 : uint16_t locCKEMask = instr->v1.syncCKE.locCKEMask;
929 4 : uint16_t channelId = instr->v1.syncCKE.channelId;
930 4 : uint16_t clearType = instr->v1.syncCKE.clearType;
931 4 : uint16_t setCKEId = instr->v1.syncCKE.setCKEId;
932 4 : uint16_t setCKEMask = instr->v1.syncCKE.setCKEMask;
933 4 : uint16_t waitCKEId = instr->v1.syncCKE.waitCKEId;
934 4 : uint16_t waitCKEMask = instr->v1.syncCKE.waitCKEMask;
935 :
936 : return Hccl::StringFormat(
937 : "Wait CKE[%u:%04x], Sync LocCKE[%u:%04x] To rmtCKE[%u:%04x] Use Channel[%u], Set "
938 : "CKE[%u:%04x], clearType[%u]",
939 : waitCKEId, waitCKEMask, locCKEId, locCKEMask, rmtCKEId, locCKEMask, channelId, setCKEId, setCKEMask,
940 4 : clearType);
941 : }
942 :
943 0 : static std::string ParseSyncGSAInstr(const CcuInstr* instr)
944 : {
945 0 : uint16_t rmtGSAId = instr->v1.syncGSA.rmtGSAId;
946 0 : uint16_t locGSAId = instr->v1.syncGSA.locGSAId;
947 0 : uint16_t channelId = instr->v1.syncGSA.channelId;
948 0 : uint16_t setRmtCKEId = instr->v1.syncGSA.setRmtCKEId;
949 0 : uint16_t setRmtCKEMask = instr->v1.syncGSA.setRmtCKEMask;
950 0 : uint16_t clearType = instr->v1.syncGSA.clearType;
951 0 : uint16_t setCKEId = instr->v1.syncGSA.setCKEId;
952 0 : uint16_t setCKEMask = instr->v1.syncGSA.setCKEMask;
953 0 : uint16_t waitCKEId = instr->v1.syncGSA.waitCKEId;
954 0 : uint16_t waitCKEMask = instr->v1.syncGSA.waitCKEMask;
955 :
956 : return Hccl::StringFormat(
957 : "Wait CKE[%u:%04x], Sync locGSAId[%u] To rmtGSAId[%u] Use Channel[%u], Set rmtCKE[%u:%04x], Set "
958 : "CKE[%u:%04x], clearType[%u]",
959 : waitCKEId, waitCKEMask, locGSAId, rmtGSAId, channelId, setRmtCKEId, setRmtCKEMask, setCKEId, setCKEMask,
960 0 : clearType);
961 : }
962 :
963 10 : static std::string ParseSyncXnInstr(const CcuInstr* instr)
964 : {
965 10 : uint16_t rmtXnId = instr->v1.syncXn.rmtXnId;
966 10 : uint16_t locXnId = instr->v1.syncXn.locXnId;
967 10 : uint16_t channelId = instr->v1.syncXn.channelId;
968 10 : uint16_t setRmtCKEId = instr->v1.syncXn.setRmtCKEId;
969 10 : uint16_t setRmtCKEMask = instr->v1.syncXn.setRmtCKEMask;
970 10 : uint16_t clearType = instr->v1.syncXn.clearType;
971 10 : uint16_t setCKEId = instr->v1.syncXn.setCKEId;
972 10 : uint16_t setCKEMask = instr->v1.syncXn.setCKEMask;
973 10 : uint16_t waitCKEId = instr->v1.syncXn.waitCKEId;
974 10 : uint16_t waitCKEMask = instr->v1.syncXn.waitCKEMask;
975 :
976 : return Hccl::StringFormat(
977 : "Wait CKE[%u:%04x], Sync locXnId[%u] To rmtXnId[%u] Use Channel[%u], Set rmtCKE[%u:%04x], Set "
978 : "CKE[%u:%04x], clearType[%u]",
979 : waitCKEId, waitCKEMask, locXnId, rmtXnId, channelId, setRmtCKEId, setRmtCKEMask, setCKEId, setCKEMask,
980 10 : clearType);
981 : }
982 :
983 5 : static std::string ParseMSList(const CcuInstr* instr)
984 : {
985 : uint16_t msId[CCU_REDUCE_MAX_MS];
986 5 : uint16_t count = instr->v1.add.count;
987 45 : for (uint16_t index = 0; index < CCU_REDUCE_MAX_MS; index++) {
988 40 : msId[index] = instr->v1.add.msId[index];
989 : }
990 :
991 : // CCU指令中指定count数为实际参与运算的MS数减2,因此当count +
992 : // 2大于CCU_REDUCE_MAX_MS时,说明MS列表中的MS数量超过了CCU指令的最大支持数量,此时无法正确解析MS列表,直接返回"MS[]"
993 5 : if (count + 2 > CCU_REDUCE_MAX_MS) {
994 2 : return "MS[]";
995 : }
996 :
997 4 : std::string res = "MS[";
998 12 : for (uint16_t i = 0; i < count + 2; i++) { // 循环范围 0~count + 2
999 8 : if (i == count + 1) {
1000 4 : res += std::to_string(msId[i] / 0x8000) + ":" + std::to_string(msId[i] % 0x8000) + "]";
1001 : } else {
1002 4 : res += std::to_string(msId[i] / 0x8000) + ":" + std::to_string(msId[i] % 0x8000) + ", ";
1003 : }
1004 : }
1005 4 : return res;
1006 4 : }
1007 :
1008 5 : static std::string ParseAddInstr(const CcuInstr* instr)
1009 : {
1010 5 : uint16_t count = instr->v1.add.count;
1011 5 : uint16_t castEn = instr->v1.add.castEn;
1012 5 : uint16_t dataType = instr->v1.add.dataType;
1013 5 : uint16_t clearType = instr->v1.add.clearType;
1014 5 : uint16_t setCKEId = instr->v1.add.setCKEId;
1015 5 : uint16_t setCKEMask = instr->v1.add.setCKEMask;
1016 5 : uint16_t waitCKEId = instr->v1.add.waitCKEId;
1017 5 : uint16_t waitCKEMask = instr->v1.add.waitCKEMask;
1018 :
1019 : return Hccl::StringFormat(
1020 : "Wait CKE[%u:%04x], Add %s with Count[%u], DataType[%u] and CastEn[%u], Set CKE[%u:%04x], clearType[%u]",
1021 5 : waitCKEId, waitCKEMask, ParseMSList(instr).c_str(), count, dataType, castEn, setCKEId, setCKEMask,
1022 10 : clearType);
1023 : }
1024 :
1025 0 : static std::string ParseMaxInstr(const CcuInstr* instr)
1026 : {
1027 0 : uint16_t count = instr->v1.max.count;
1028 0 : uint16_t dataType = instr->v1.max.dataType;
1029 0 : uint16_t clearType = instr->v1.max.clearType;
1030 0 : uint16_t setCKEId = instr->v1.max.setCKEId;
1031 0 : uint16_t setCKEMask = instr->v1.max.setCKEMask;
1032 0 : uint16_t waitCKEId = instr->v1.max.waitCKEId;
1033 0 : uint16_t waitCKEMask = instr->v1.max.waitCKEMask;
1034 :
1035 : return Hccl::StringFormat(
1036 : "Wait CKE[%u:%04x], Max %s with Count[%u], DataType[%u], Set CKE[%u:%04x], clearType[%u]", waitCKEId,
1037 0 : waitCKEMask, ParseMSList(instr).c_str(), count, dataType, setCKEId, setCKEMask, clearType);
1038 : }
1039 :
1040 0 : static std::string ParseMinInstr(const CcuInstr* instr)
1041 : {
1042 0 : uint16_t count = instr->v1.min.count;
1043 0 : uint16_t dataType = instr->v1.min.dataType;
1044 0 : uint16_t clearType = instr->v1.min.clearType;
1045 0 : uint16_t setCKEId = instr->v1.min.setCKEId;
1046 0 : uint16_t setCKEMask = instr->v1.min.setCKEMask;
1047 0 : uint16_t waitCKEId = instr->v1.min.waitCKEId;
1048 0 : uint16_t waitCKEMask = instr->v1.min.waitCKEMask;
1049 :
1050 : return Hccl::StringFormat(
1051 : "Wait CKE[%u:%04x], Min %s with Count[%u], DataType[%u], Set CKE[%u:%04x], clearType[%u]", waitCKEId,
1052 0 : waitCKEMask, ParseMSList(instr).c_str(), count, dataType, setCKEId, setCKEMask, clearType);
1053 : }
1054 :
1055 : using ParseInstrFunc = std::string (*)(const CcuInstr*);
1056 :
1057 : static std::unordered_map<uint16_t, ParseInstrFunc> g_parseInstrSqeMap = {
1058 : {InstrHeader(LOAD_TYPE, LOADSQEARGSTOGSA_CODE).header, &ParseLoadSqeArgsToGSAInstr},
1059 : {InstrHeader(LOAD_TYPE, LOADSQEARGSTOXN_CODE).header, &ParseLoadSqeArgsToXnInstr},
1060 : {InstrHeader(LOAD_TYPE, LOADIMDTOGSA_CODE).header, &ParseLoadImdToGSAInstr},
1061 : {InstrHeader(LOAD_TYPE, LOADIMDTOXN_CODE).header, &ParseLoadImdToXnInstr},
1062 : {InstrHeader(LOAD_TYPE, LOADGSAXN_CODE).header, &ParseLoadGSAXnInstr},
1063 : {InstrHeader(LOAD_TYPE, LOADGSAGSA_CODE).header, &ParseLoadGSAGSAInstr},
1064 : {InstrHeader(LOAD_TYPE, LOADXX_CODE).header, &ParseLoadXXInstr},
1065 : {InstrHeader(CTRL_TYPE, LOOP_CODE).header, &ParseLoopInstr},
1066 : {InstrHeader(CTRL_TYPE, LOOPGROUP_CODE).header, &ParseLoopGroupInstr},
1067 : {InstrHeader(CTRL_TYPE, SETCKE_CODE).header, &ParseSetCKEInstr},
1068 : {InstrHeader(CTRL_TYPE, CLEARCKE_CODE).header, &ParseClearCKEInstr},
1069 : {InstrHeader(CTRL_TYPE, JMP_CODE).header, &ParseJumpInstr},
1070 : {InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMS_CODE).header, &ParseTransLocMemToLocMSInstr},
1071 : {InstrHeader(TRANS_TYPE, TRANSRMTMEMTOLOCMS_CODE).header, &ParseTransRmtMemToLocMSInstr},
1072 : {InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMEM_CODE).header, &ParseTransLocMSToLocMemInstr},
1073 : {InstrHeader(TRANS_TYPE, TRANSLOCMSTORMTMEM_CODE).header, &ParseTransLocMSToRmtMemInstr},
1074 : {InstrHeader(TRANS_TYPE, TRANSRMTMSTOLOCMEM_CODE).header, &ParseTransRmtMSToLocMemInstr},
1075 : {InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMS_CODE).header, &ParseTransLocMSToLocMSInstr},
1076 : {InstrHeader(TRANS_TYPE, TRANSRMTMSTOLOCMS_CODE).header, &ParseTransRmtMSToLocMSInstr},
1077 : {InstrHeader(TRANS_TYPE, TRANSLOCMSTORMTMS_CODE).header, &ParseTransLocMSToRmtMSInstr},
1078 : {InstrHeader(TRANS_TYPE, TRANSRMTMEMTOLOCMEM_CODE).header, &ParseTransRmtMemToLocMemInstr},
1079 : {InstrHeader(TRANS_TYPE, TRANSLOCMEMTORMTMEM_CODE).header, &ParseTransLocMemToRmtMemInstr},
1080 : {InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMEM_CODE).header, &ParseTransLocMemToLocMemInstr},
1081 : {InstrHeader(TRANS_TYPE, SYNCCKE_CODE).header, &ParseSyncCKEInstr},
1082 : {InstrHeader(TRANS_TYPE, SYNCGSA_CODE).header, &ParseSyncGSAInstr},
1083 : {InstrHeader(TRANS_TYPE, SYNCXN_CODE).header, &ParseSyncXnInstr},
1084 : {InstrHeader(REDUCE_TYPE, ADD_CODE).header, &ParseAddInstr},
1085 : {InstrHeader(REDUCE_TYPE, MAX_CODE).header, &ParseMaxInstr},
1086 : {InstrHeader(REDUCE_TYPE, MIN_CODE).header, &ParseMinInstr},
1087 : };
1088 :
1089 2378 : std::string ParseInstr(const CcuInstr* instr)
1090 : {
1091 2378 : if (g_parseInstrSqeMap.find(instr->header.header) == g_parseInstrSqeMap.end()) {
1092 1 : return Hccl::StringFormat("Unsupported instruction with header: 0x%04x", instr->header.header);
1093 : }
1094 2377 : return g_parseInstrSqeMap[instr->header.header](instr);
1095 : }
1096 :
1097 : }; // namespace CcuRep
1098 : }; // namespace hcomm
|