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