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: 73.9 % 621 459
Test Date: 2026-07-28 12:11:00 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           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          371 : void LoadImdToXnInstr(CcuInstr *instr, uint16_t xnId, uint64_t immediate, uint16_t secFlag)
      83              : {
      84          371 :     instr->header              = InstrHeader(LOAD_TYPE, LOADIMDTOXN_CODE);
      85          371 :     instr->v1.loadImdToXn.xnId      = xnId;
      86          371 :     instr->v1.loadImdToXn.immediate = immediate;
      87          371 :     instr->v1.loadImdToXn.secFlag   = secFlag;
      88          371 : }
      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           55 : void SetCKEInstr(CcuInstr *instr, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
     145              :                  uint16_t clearType)
     146              : {
     147           55 :     instr->header           = InstrHeader(CTRL_TYPE, SETCKE_CODE);
     148           55 :     instr->v1.setCKE.clearType   = clearType & 0x1;
     149           55 :     instr->v1.setCKE.setCKEId    = setCKEId;
     150           55 :     instr->v1.setCKE.setCKEMask  = setCKEMask;
     151           55 :     instr->v1.setCKE.waitCKEId   = waitCKEId;
     152           55 :     instr->v1.setCKE.waitCKEMask = waitCKEMask;
     153           55 : }
     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           56 : static std::string ParseLoadImdToGSAInstr(const CcuInstr *instr)
     562              : {
     563           56 :     uint16_t gsaId     = instr->v1.loadImdToGSA.gsaId;
     564           56 :     uint64_t immediate = instr->v1.loadImdToGSA.immediate;
     565              : 
     566           56 :     return Hccl::StringFormat("Load immediate[%llu] to GSA[%u]", immediate, gsaId);
     567              : }
     568              : 
     569          630 : static std::string ParseLoadImdToXnInstr(const CcuInstr *instr)
     570              : {
     571          630 :     uint16_t xnId      = instr->v1.loadImdToXn.xnId;
     572          630 :     uint64_t immediate = instr->v1.loadImdToXn.immediate;
     573              : 
     574          630 :     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          598 :     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           76 : static std::string ParseSetCKEInstr(const CcuInstr *instr)
     629              : {
     630           76 :     uint16_t clearType   = instr->v1.setCKE.clearType;
     631           76 :     uint16_t setCKEId    = instr->v1.setCKE.setCKEId;
     632           76 :     uint16_t setCKEMask  = instr->v1.setCKE.setCKEMask;
     633           76 :     uint16_t waitCKEId   = instr->v1.setCKE.waitCKEId;
     634           76 :     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           76 :                         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         1522 : std::string ParseInstr(const CcuInstr *instr)
    1058              : {
    1059         1522 :     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         1521 :     return g_parseInstrSqeMap[instr->header.header](instr);
    1063              : }
    1064              : 
    1065              : }; // namespace Ccu
    1066              : }; // namespace hcomm
        

Generated by: LCOV version 2.0-1