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-18 17:47:01 Functions: 76.7 % 60 46

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

Generated by: LCOV version 2.0-1