LCOV - code coverage report
Current view: top level - legacy/ascend950/unified_platform/ccu/ccu_microcode - ccu_microcode.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 622 622
Test Date: 2026-08-18 17:47:01 Functions: 100.0 % 60 60

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

Generated by: LCOV version 2.0-1