LCOV - code coverage report
Current view: top level - base_comm/resources/ccu/ccu_microcode - ccu_microcode.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 74.0 % 622 460
Test Date: 2026-08-17 10:19:35 Functions: 76.7 % 60 46

            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
        

Generated by: LCOV version 2.0-1