LCOV - code coverage report
Current view: top level - base_comm/resources/ccu/ccu_microcode - ccu_microcode_v2.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 68.7 % 629 432
Test Date: 2026-08-17 10:19:35 Functions: 72.4 % 76 55

            Line data    Source code
       1              : /*
       2              :  * Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
       3              :  * Description: ccu instruction implement file
       4              :  * Author: sunzhepeng
       5              :  * Create: 2025-06-07
       6              :  */
       7              : 
       8              : #include "ccu_microcode_v1.h"
       9              : 
      10              : #include <unordered_map>
      11              : 
      12              : #include "log.h"
      13              : #include <string_util.h>
      14              : 
      15              : namespace {
      16              : constexpr uint16_t LOAD_TYPE = 0x0;
      17              : 
      18              : constexpr uint16_t LOADSQEARGSTOX_CODE = 0x1;
      19              : constexpr uint16_t LOADIMDTOX_CODE = 0x2;
      20              : constexpr uint16_t LOADX_CODE = 0x6;
      21              : constexpr uint16_t STOREX_CODE = 0x7;
      22              : constexpr uint16_t CLEARX_CODE = 0x8;
      23              : constexpr uint16_t NOP_CODE = 0x9;
      24              : constexpr uint16_t LOAD_CODE = 0xA;
      25              : constexpr uint16_t STORE_CODE = 0xB;
      26              : constexpr uint16_t ADD_CODE = 0xD;
      27              : constexpr uint16_t SUB_CODE = 0xE;
      28              : constexpr uint16_t MUL_CODE = 0xF;
      29              : constexpr uint16_t AND_CODE = 0x10;
      30              : constexpr uint16_t OR_CODE = 0x11;
      31              : constexpr uint16_t NOT_CODE = 0x12;
      32              : constexpr uint16_t XOR_CODE = 0x13;
      33              : constexpr uint16_t SHL_CODE = 0x14;
      34              : constexpr uint16_t SHR_CODE = 0x15;
      35              : constexpr uint16_t POPCNT_CODE = 0x16;
      36              : 
      37              : constexpr uint16_t CTRL_TYPE = 0x1;
      38              : 
      39              : constexpr uint16_t LOOP_CODE = 0x0;
      40              : constexpr uint16_t LOOPGROUP_CODE = 0x1;
      41              : constexpr uint16_t SETCKBIT_CODE = 0x2;
      42              : constexpr uint16_t CLEARCKBIT_CODE = 0x4;
      43              : constexpr uint16_t JMP_CODE = 0x5;
      44              : constexpr uint16_t WAIT_CODE = 0x7;
      45              : constexpr uint16_t FENCE_CODE = 0x8;
      46              : 
      47              : constexpr uint16_t TRANS_TYPE = 0x2;
      48              : 
      49              : constexpr uint16_t TRANSLOCMEMTOLOCMS_CODE = 0x0;
      50              : constexpr uint16_t TRANSLOCMSTOLOCMEM_CODE = 0x2;
      51              : constexpr uint16_t TRANSLOCMSTOLOCMS_CODE = 0x5;
      52              : constexpr uint16_t TRANSLOCMEMTOLOCMEM_CODE = 0x6;
      53              : constexpr uint16_t TRANSMEM_CODE = 0x10;
      54              : constexpr uint16_t SYNCWTX_CODE = 0xD;
      55              : constexpr uint16_t SYNCATX_CODE = 0xE;
      56              : 
      57              : constexpr uint16_t REDUCE_TYPE = 0x3;
      58              : 
      59              : constexpr uint16_t REDUCE_ADD_CODE = 0x0;
      60              : constexpr uint16_t REDUCE_MAX_CODE = 0x1;
      61              : constexpr uint16_t REDUCE_MIN_CODE = 0x2;
      62              : 
      63              : constexpr uint16_t JMP_TARGET_PC_IF_BRANCH = 5;  // Jmp跳转到IF分支的目标PC
      64              : constexpr uint16_t JMP_TARGET_PC_NOP_BRANCH = 3; // Jmp跳转到Nop的目标PC
      65              : constexpr uint16_t JMP_COND_TYPE_IF = 2;         // Jmp条件类型: IF分支
      66              : constexpr uint16_t JMP_COND_TYPE_UNCOND = 6;     // Jmp条件类型: 无条件
      67              : } // namespace
      68              : 
      69              : namespace hcomm {
      70              : namespace CcuRep {
      71              :     namespace CcuV2 {
      72              :         // *XnId = *sqeArgsId
      73           15 :         void LoadSqeArgsToX(CcuInstr* instr, uint16_t xnId, uint16_t sqeArgsId, uint16_t setCKEId, uint16_t setCKEMask)
      74              :         {
      75           15 :             instr->header = InstrHeader(LOAD_TYPE, LOADSQEARGSTOX_CODE);
      76           15 :             instr->v2.loadSqeArgsToX.xnId = xnId;
      77           15 :             instr->v2.loadSqeArgsToX.sqeArgsId = sqeArgsId;
      78           15 :             instr->v2.loadSqeArgsToX.setCKEId = setCKEId;
      79           15 :             instr->v2.loadSqeArgsToX.setCKEMask = setCKEMask;
      80           15 :         }
      81              : 
      82              :         // *XnId = immediate
      83          266 :         void LoadImdToXn(CcuInstr* instr, uint16_t xnId, uint64_t immediate, uint16_t setCKEId, uint16_t setCKEMask)
      84              :         {
      85          266 :             instr->header = InstrHeader(LOAD_TYPE, LOADIMDTOX_CODE);
      86          266 :             instr->v2.loadImdToX.xnId = xnId;
      87          266 :             instr->v2.loadImdToX.immediate = immediate;
      88          266 :             instr->v2.loadImdToX.setCKEId = setCKEId;
      89          266 :             instr->v2.loadImdToX.setCKEMask = setCKEMask;
      90          266 :         }
      91              : 
      92            0 :         void ClearX(
      93              :             CcuInstr* instr, uint16_t xnId, uint16_t xmId, uint16_t xnIdMode, uint16_t xmIdMode, uint16_t setCKEId,
      94              :             uint16_t setCKEMask)
      95              :         {
      96            0 :             instr->header = InstrHeader(LOAD_TYPE, CLEARX_CODE);
      97            0 :             instr->v2.clearX.xnId = xnId & 0x7FFF;
      98            0 :             instr->v2.clearX.xnIdMode = xnIdMode & 0x1;
      99            0 :             instr->v2.clearX.xmId = xmId & 0x7FFF;
     100            0 :             instr->v2.clearX.xmIdMode = xmIdMode & 0x1;
     101            0 :             instr->v2.clearX.setCKEId = setCKEId;
     102            0 :             instr->v2.clearX.setCKEMask = setCKEMask;
     103            0 :         }
     104              : 
     105          181 :         void Nop(CcuInstr* instr) { instr->header = InstrHeader(LOAD_TYPE, NOP_CODE); }
     106              : 
     107              :         inline void
     108          178 :         Operator(CcuInstr* instr, uint16_t xdId, uint16_t xnId, uint16_t xmId, uint16_t setCKEId, uint16_t setCKEMask)
     109              :         {
     110          178 :             instr->v2.operate.xdId = xdId;
     111          178 :             instr->v2.operate.xnId = xnId;
     112          178 :             instr->v2.operate.xmId = xmId;
     113          178 :             instr->v2.operate.setCKEId = setCKEId;
     114          178 :             instr->v2.operate.setCKEMask = setCKEMask;
     115          178 :         }
     116              : 
     117           59 :         void Assign(CcuInstr* instr, uint16_t result, uint16_t operand, uint16_t setCKEId, uint16_t setCKEMask)
     118              :         {
     119           59 :             AddI(instr, result, operand, 0, setCKEId, setCKEMask);
     120           59 :         }
     121              : 
     122          131 :         void AssignI(CcuInstr* instr, uint16_t result, uint64_t operand, uint16_t setCKEId, uint16_t setCKEMask)
     123              :         {
     124          131 :             LoadImdToXn(instr, result, operand, setCKEId, setCKEMask);
     125          131 :         }
     126              : 
     127              :         void
     128           57 :         Add(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     129              :             uint16_t setCKEMask)
     130              :         {
     131           57 :             instr->header = InstrHeader(LOAD_TYPE, ADD_CODE);
     132           57 :             instr->v2.operate.parMode = 1;
     133           57 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     134           57 :         }
     135              : 
     136              :         void
     137           64 :         AddI(CcuInstr* instr, uint16_t result, uint16_t operand, uint16_t imm, uint16_t setCKEId, uint16_t setCKEMask)
     138              :         {
     139           64 :             instr->header = InstrHeader(LOAD_TYPE, ADD_CODE);
     140           64 :             instr->v2.operate.parMode = 0;
     141           64 :             Operator(instr, result, operand, imm, setCKEId, setCKEMask);
     142           64 :         }
     143              : 
     144              :         void
     145            5 :         Sub(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     146              :             uint16_t setCKEMask)
     147              :         {
     148            5 :             instr->header = InstrHeader(LOAD_TYPE, SUB_CODE);
     149              : 
     150              :             // 设置指令模式,Par_Mode = 1’b1时,*Xd = *Xn – *Xm
     151            5 :             instr->v2.operate.parMode = 1;
     152            5 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     153            5 :         }
     154              : 
     155              :         void
     156            3 :         SubI(CcuInstr* instr, uint16_t result, uint16_t operand, uint16_t imm, uint16_t setCKEId, uint16_t setCKEMask)
     157              :         {
     158            3 :             instr->header = InstrHeader(LOAD_TYPE, SUB_CODE);
     159              : 
     160              :             // 设置指令模式,Par_Mode = 1’b0时,*Xd = *Xn - {48’b0,Immedata[15:0]}
     161            3 :             instr->v2.operate.parMode = 0;
     162            3 :             Operator(instr, result, operand, imm, setCKEId, setCKEMask);
     163            3 :         }
     164              : 
     165              :         void
     166            5 :         Mul(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     167              :             uint16_t setCKEMask)
     168              :         {
     169            5 :             instr->header = InstrHeader(LOAD_TYPE, MUL_CODE);
     170            5 :             instr->v2.operate.parMode = 1;
     171            5 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     172            5 :         }
     173              : 
     174              :         void
     175            3 :         MulI(CcuInstr* instr, uint16_t result, uint16_t operand, uint16_t imm, uint16_t setCKEId, uint16_t setCKEMask)
     176              :         {
     177            3 :             instr->header = InstrHeader(LOAD_TYPE, MUL_CODE);
     178            3 :             instr->v2.operate.parMode = 0;
     179            3 :             Operator(instr, result, operand, imm, setCKEId, setCKEMask);
     180            3 :         }
     181              : 
     182              :         void
     183           13 :         And(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     184              :             uint16_t setCKEMask)
     185              :         {
     186           13 :             instr->header = InstrHeader(LOAD_TYPE, AND_CODE);
     187           13 :             instr->v2.operate.parMode = 1;
     188           13 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     189           13 :         }
     190              : 
     191              :         void
     192            4 :         Or(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     193              :            uint16_t setCKEMask)
     194              :         {
     195            4 :             instr->header = InstrHeader(LOAD_TYPE, OR_CODE);
     196            4 :             instr->v2.operate.parMode = 1;
     197            4 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     198            4 :         }
     199              : 
     200              :         void
     201            2 :         Xor(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     202              :             uint16_t setCKEMask)
     203              :         {
     204            2 :             instr->header = InstrHeader(LOAD_TYPE, XOR_CODE);
     205            2 :             instr->v2.operate.parMode = 1;
     206            2 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     207            2 :         }
     208              : 
     209            1 :         void Not(CcuInstr* instr, uint16_t result, uint16_t operand, uint16_t setCKEId, uint16_t setCKEMask)
     210              :         {
     211            1 :             instr->header = InstrHeader(LOAD_TYPE, NOT_CODE);
     212            1 :             instr->v2.operate.parMode = 0;
     213            1 :             Operator(instr, result, operand, 0, setCKEId, setCKEMask);
     214            1 :         }
     215              : 
     216              :         void
     217            8 :         SLL(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     218              :             uint16_t setCKEMask)
     219              :         {
     220            8 :             instr->header = InstrHeader(LOAD_TYPE, SHL_CODE);
     221            8 :             instr->v2.operate.shiftType = 0;
     222            8 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     223            8 :         }
     224              : 
     225              :         void
     226           13 :         SRL(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     227              :             uint16_t setCKEMask)
     228              :         {
     229           13 :             instr->header = InstrHeader(LOAD_TYPE, SHR_CODE);
     230           13 :             instr->v2.operate.shiftType = 0;
     231           13 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     232           13 :         }
     233              : 
     234              :         void
     235            0 :         SLA(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     236              :             uint16_t setCKEMask)
     237              :         {
     238            0 :             instr->header = InstrHeader(LOAD_TYPE, SHL_CODE);
     239            0 :             instr->v2.operate.shiftType = 1;
     240            0 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     241            0 :         }
     242              : 
     243              :         void
     244            0 :         SRA(CcuInstr* instr, uint16_t result, uint16_t operand1, uint16_t operand2, uint16_t setCKEId,
     245              :             uint16_t setCKEMask)
     246              :         {
     247            0 :             instr->header = InstrHeader(LOAD_TYPE, SHR_CODE);
     248            0 :             instr->v2.operate.shiftType = 1;
     249            0 :             Operator(instr, result, operand1, operand2, setCKEId, setCKEMask);
     250            0 :         }
     251              : 
     252              :         // LoadChannel、LoadInstruction暂不实现
     253              : 
     254            0 :         void LoadFromMem(
     255              :             CcuInstr* instr, uint16_t dst, uint16_t src, uint16_t srcToken, uint16_t len,
     256              :             const CacheConfig& cacheConfig, uint16_t setCKEId, uint16_t setCKEMask)
     257              :         {
     258            0 :             instr->header = InstrHeader(LOAD_TYPE, LOAD_CODE);
     259            0 :             instr->v2.load.xdId = dst;
     260            0 :             instr->v2.load.xsId = src;
     261            0 :             instr->v2.load.xstId = srcToken;
     262            0 :             instr->v2.load.xlId = len;
     263              : 
     264            0 :             instr->v2.load.allocHint = cacheConfig.allocHint & 0x3;
     265            0 :             instr->v2.load.victimHint = cacheConfig.victimHint & 0x3;
     266              : 
     267            0 :             instr->v2.load.setCKEId = setCKEId;
     268            0 :             instr->v2.load.setCKEMask = setCKEMask;
     269            0 :         }
     270              : 
     271            0 :         void LoadXFromMem(
     272              :             CcuInstr* instr, uint16_t dst, uint16_t src, uint16_t srcToken, uint16_t len,
     273              :             const CacheConfig& cacheConfig, uint16_t setCKEId, uint16_t setCKEMask)
     274              :         {
     275            0 :             if (instr == nullptr) {
     276            0 :                 HCCL_ERROR("[CcuV2::LoadXFromMem] instr is nullptr!");
     277            0 :                 return;
     278              :             }
     279            0 :             LoadFromMem(instr, dst, src, srcToken, len, cacheConfig, setCKEId, setCKEMask);
     280            0 :             instr->v2.load.dstType = 0x0;
     281              :         }
     282              : 
     283              :         // HSCB Store暂不实现
     284              : 
     285            0 :         void StoreXToMem(
     286              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t src, uint16_t len,
     287              :             const CacheConfig& cacheConfig, uint16_t setCKEId, uint16_t setCKEMask)
     288              :         {
     289            0 :             instr->header = InstrHeader(LOAD_TYPE, STORE_CODE);
     290            0 :             instr->v2.store.xdId = dst;
     291            0 :             instr->v2.store.xdtId = dstToken;
     292            0 :             instr->v2.store.xsId = src;
     293            0 :             instr->v2.store.xlId = len;
     294            0 :             instr->v2.store.xhId = 0x0;
     295              : 
     296            0 :             instr->v2.store.srcType = 0x0;
     297            0 :             instr->v2.store.storeType = 0b0;
     298            0 :             instr->v2.store.hscbBroadCastDstType = 0x0;
     299              : 
     300            0 :             instr->v2.store.allocHint = cacheConfig.allocHint & 0x3;
     301            0 :             instr->v2.store.victimHint = cacheConfig.victimHint & 0x3;
     302              : 
     303            0 :             instr->v2.store.setCKEId = setCKEId;
     304            0 :             instr->v2.store.setCKEMask = setCKEMask;
     305            0 :         }
     306              : 
     307              :         // HSCB Broadcast 暂不实现
     308            0 :         void HSCBStoreXToMem(
     309              :             CcuInstr* instr, uint16_t dst, uint16_t src, uint16_t len, const CacheConfig& cacheConfig,
     310              :             uint16_t setCKEId, uint16_t setCKEMask)
     311              :         {
     312            0 :             instr->header = InstrHeader(LOAD_TYPE, STORE_CODE);
     313            0 :             instr->v2.store.xdId = dst;
     314            0 :             instr->v2.store.xdtId = 0x0;
     315            0 :             instr->v2.store.xsId = src;
     316            0 :             instr->v2.store.xlId = len;
     317            0 :             instr->v2.store.xhId = 0x0;
     318              : 
     319            0 :             instr->v2.store.srcType = 0x0;
     320            0 :             instr->v2.store.storeType = 0b1;
     321            0 :             instr->v2.store.hscbType = 0b0;
     322            0 :             instr->v2.store.hscbBroadCastDstType = 0x0;
     323              : 
     324            0 :             instr->v2.store.allocHint = cacheConfig.allocHint & 0x3;
     325            0 :             instr->v2.store.victimHint = cacheConfig.victimHint & 0x3;
     326              : 
     327            0 :             instr->v2.store.setCKEId = setCKEId;
     328            0 :             instr->v2.store.setCKEMask = setCKEMask;
     329            0 :         }
     330              : 
     331              :         // startInstrId ~ endInstrId之间的指令构成loop
     332              :         // Xm寄存器中的内容:LoopCtxId[52:45], Offset[44:13], IterNum[12:0]
     333              :         // IterNum[12:0] loop执行IterNum次 loop每次执行, 地址偏移为Offset loop在第LoopCtxId个LoopEngine上执行
     334           19 :         void Loop(
     335              :             CcuInstr* instr, uint16_t startInstrId, uint16_t endInstrId, uint16_t iterNum, uint16_t offset,
     336              :             uint16_t contextId)
     337              :         {
     338           19 :             instr->header = InstrHeader(CTRL_TYPE, LOOP_CODE);
     339           19 :             instr->v2.loop.startInstrId = startInstrId;
     340           19 :             instr->v2.loop.endInstrId = endInstrId;
     341           19 :             instr->v2.loop.xmId = iterNum;
     342           19 :             instr->v2.loop.xnId = offset;
     343           19 :             instr->v2.loop.xpId = contextId;
     344           19 :             instr->v2.loop.mode = 0;
     345           19 :             instr->v2.loop.wishCKEBit = 0;
     346           19 :         }
     347              : 
     348              :         // startLoopInstrId为LoopGroup所包含的Loop的起始地址
     349              :         // Xn寄存器中的内容:ExtendNum[22:16], RepeatLoopIndex[15:9], LoopNum[8:0]
     350              :         // Xm寄存器中的内容:gsaOffset[52:21], MSOffset[20:10], ckeOffset[9:0]
     351              :         // xnOffset[52:21], xnOffset[31:0]
     352              :         // 从startLoopInstrId开始,共LoopNum个Loop,并且从RepeatLoopIndex个开始,展开ExtendNum次
     353              :         // 每个展开的Loop,使用的MSId偏移为msOffset,使用的CKEId偏移为ckeOffset,使用的地址偏移为gsaOffset,
     354              :         // 使用的XnId偏移为xnOffset
     355            9 :         void LoopGroup(
     356              :             CcuInstr* instr, uint16_t startLoopInstrId, uint16_t loopGroupConfig, uint16_t resOffset, uint16_t xnOffset)
     357              :         {
     358            9 :             instr->header = InstrHeader(CTRL_TYPE, LOOPGROUP_CODE);
     359            9 :             instr->v2.loopGroup.startLoopInstrId = startLoopInstrId;
     360            9 :             instr->v2.loopGroup.xnId = loopGroupConfig;
     361            9 :             instr->v2.loopGroup.xmId = resOffset;
     362            9 :             instr->v2.loopGroup.xpId = xnOffset;
     363            9 :         }
     364              : 
     365              :         // 后续函数中, 均需要wait到<waitCKEId, waitCKEMask>后, 再执行相关操作, 执行完之后再set<setCKEId, setCKEMask>
     366              :         // clearType = 1时, wait到之后需要对<waitCKEId, waitCKEMask>清零, 否则不清零
     367              : 
     368            4 :         void SetCKE(
     369              :             CcuInstr* instr, uint16_t setCKEId, uint16_t setCKEMask, uint16_t waitCKEId, uint16_t waitCKEMask,
     370              :             uint16_t clearType)
     371              :         {
     372            4 :             instr->header = InstrHeader(CTRL_TYPE, SETCKBIT_CODE);
     373            4 :             instr->v2.setCKE.clearType = clearType & 0x1;
     374            4 :             instr->v2.setCKE.setCKEId = setCKEId;
     375            4 :             instr->v2.setCKE.setCKEMask = setCKEMask;
     376            4 :             instr->v2.setCKE.waitCKEId = waitCKEId;
     377            4 :             instr->v2.setCKE.waitCKEMask = waitCKEMask;
     378            4 :             instr->v2.setCKE.userData = 0;
     379            4 :         }
     380              : 
     381            6 :         void ClearCKE(
     382              :             CcuInstr* instr, uint16_t clearCKEId, uint16_t clearMask, uint16_t waitCKEId, uint16_t waitCKEMask,
     383              :             uint16_t clearType)
     384              :         {
     385            6 :             instr->header = InstrHeader(CTRL_TYPE, CLEARCKBIT_CODE);
     386            6 :             instr->v2.clearCKE.clearType = clearType & 0x1;
     387            6 :             instr->v2.clearCKE.clearCKEId = clearCKEId;
     388            6 :             instr->v2.clearCKE.clearMask = clearMask;
     389            6 :             instr->v2.clearCKE.waitCKEId = waitCKEId;
     390            6 :             instr->v2.clearCKE.waitCKEMask = waitCKEMask;
     391            6 :         }
     392              : 
     393           40 :         void Jump(
     394              :             CcuInstr* instr, uint16_t relTarInstrXnId, uint16_t conditionXnId, uint16_t expectedXnId,
     395              :             uint16_t conditionType)
     396              :         {
     397           40 :             instr->header = InstrHeader(CTRL_TYPE, JMP_CODE);
     398           40 :             instr->v2.jmp.expectedXnId = expectedXnId;
     399           40 :             instr->v2.jmp.conditionXnId = conditionXnId;
     400           40 :             instr->v2.jmp.relTarInstrXnId = relTarInstrXnId;
     401           40 :             instr->v2.jmp.conditionType = conditionType & 0xF;
     402           40 :         }
     403              : 
     404            0 :         void Wait(CcuInstr* instr, uint16_t conditionXnId, uint16_t expectedXnId, uint16_t conditionType)
     405              :         {
     406            0 :             instr->header = InstrHeader(CTRL_TYPE, WAIT_CODE);
     407            0 :             instr->v2.wait.expectedXnId = expectedXnId;
     408            0 :             instr->v2.wait.conditionXnId = conditionXnId;
     409            0 :             instr->v2.wait.conditionType = conditionType & 0xF;
     410            0 :         }
     411              : 
     412            0 :         void Fence(CcuInstr* instr) { instr->header = InstrHeader(CTRL_TYPE, FENCE_CODE); }
     413              : 
     414              :         // 本端Memory传输到本端MS
     415            4 :         void TransLocMemToLocMS(
     416              :             CcuInstr* instr, uint16_t ms, uint16_t src, uint16_t srcToken, uint16_t len, uint16_t offset,
     417              :             uint16_t setCKEId, uint16_t setCKEMask, const CacheConfig& cacheConfig)
     418              :         {
     419            4 :             instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMS_CODE);
     420            4 :             instr->v2.transLocMemToLocMS.msId = ms;
     421            4 :             instr->v2.transLocMemToLocMS.xsId = src;
     422            4 :             instr->v2.transLocMemToLocMS.xstId = srcToken;
     423            4 :             instr->v2.transLocMemToLocMS.xlId = len;
     424            4 :             instr->v2.transLocMemToLocMS.xoId = offset;
     425            4 :             instr->v2.transLocMemToLocMS.allocHint = cacheConfig.allocHint & 0x3;
     426            4 :             instr->v2.transLocMemToLocMS.victimHint = cacheConfig.victimHint & 0x3;
     427            4 :             instr->v2.transLocMemToLocMS.setCKEId = setCKEId;
     428            4 :             instr->v2.transLocMemToLocMS.setCKEMask = setCKEMask;
     429            4 :         }
     430              : 
     431              :         // 本端MS传输到本端Memory
     432            2 :         void TransLocMSToLocMem(
     433              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t ms, uint16_t len, uint16_t offset,
     434              :             uint16_t setCKEId, uint16_t setCKEMask, const CacheConfig& cacheConfig)
     435              :         {
     436            2 :             instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMEM_CODE);
     437            2 :             instr->v2.transLocMSToLocMem.xdId = dst;
     438            2 :             instr->v2.transLocMSToLocMem.xdtId = dstToken;
     439            2 :             instr->v2.transLocMSToLocMem.msId = ms;
     440            2 :             instr->v2.transLocMSToLocMem.xlId = len;
     441            2 :             instr->v2.transLocMSToLocMem.xoId = offset;
     442            2 :             instr->v2.transLocMSToLocMem.allocHint = cacheConfig.allocHint & 0x3;
     443            2 :             instr->v2.transLocMSToLocMem.victimHint = cacheConfig.victimHint & 0x3;
     444            2 :             instr->v2.transLocMSToLocMem.setCKEId = setCKEId;
     445            2 :             instr->v2.transLocMSToLocMem.setCKEMask = setCKEMask;
     446            2 :         }
     447              : 
     448            0 :         void TransLocMemToLocMem(
     449              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t src, uint16_t srcToken, uint16_t len,
     450              :             uint16_t usedMSId, uint16_t usedMSNum, uint16_t setCKEId, uint16_t setCKEMask,
     451              :             const CacheConfig& srcCacheConfig, const CacheConfig& dstcacheConfig)
     452              :         {
     453            0 :             instr->header = InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMEM_CODE);
     454            0 :             instr->v2.transLocMemToLocMem.xdId = dst;
     455            0 :             instr->v2.transLocMemToLocMem.xdtId = dstToken;
     456            0 :             instr->v2.transLocMemToLocMem.xsId = src;
     457            0 :             instr->v2.transLocMemToLocMem.xstId = srcToken;
     458            0 :             instr->v2.transLocMemToLocMem.xlId = len;
     459            0 :             instr->v2.transLocMemToLocMem.usedMSId = usedMSId;
     460            0 :             instr->v2.transLocMemToLocMem.msNum = usedMSNum;
     461              : 
     462            0 :             instr->v2.transLocMemToLocMem.srcAllocHint = srcCacheConfig.allocHint & 0x3;
     463            0 :             instr->v2.transLocMemToLocMem.srcVictimHint = srcCacheConfig.victimHint & 0x3;
     464            0 :             instr->v2.transLocMemToLocMem.dstAllocHint = dstcacheConfig.allocHint & 0x3;
     465            0 :             instr->v2.transLocMemToLocMem.dstVictimHint = dstcacheConfig.victimHint & 0x3;
     466              : 
     467            0 :             instr->v2.transLocMemToLocMem.setCKEId = setCKEId;
     468            0 :             instr->v2.transLocMemToLocMem.setCKEMask = setCKEMask;
     469            0 :         }
     470              : 
     471            1 :         void TransMem(
     472              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t src, uint16_t srcToken, uint16_t len,
     473              :             uint16_t channel, const TransMemNotifyInfo& notify, const TransMemReduceInfo& reduce,
     474              :             const TransMemConfig& config, uint16_t setCKEId, uint16_t setCKEMask)
     475              :         {
     476            1 :             instr->header = InstrHeader(TRANS_TYPE, TRANSMEM_CODE);
     477            1 :             instr->v2.transMem.xdId = dst;
     478            1 :             instr->v2.transMem.xdtId = dstToken;
     479            1 :             instr->v2.transMem.xsId = src;
     480            1 :             instr->v2.transMem.xstId = srcToken;
     481            1 :             instr->v2.transMem.xlId = len;
     482            1 :             instr->v2.transMem.xcId = channel;
     483            1 :             instr->v2.transMem.xnId = notify.xnId;
     484            1 :             instr->v2.transMem.xntId = notify.xntId;
     485            1 :             instr->v2.transMem.value = notify.value;
     486            1 :             instr->v2.transMem.udfType = reduce.udfType & 0xFF;
     487            1 :             instr->v2.transMem.reduceDataType = reduce.reduceDataType & 0xF;
     488            1 :             instr->v2.transMem.reduceOpCode = reduce.reduceOpCode & 0xF;
     489            1 :             instr->v2.transMem.dmaOpCode = config.dmaOpCode & 0xFF;
     490              : 
     491            1 :             instr->v2.transMem.order = config.order & 0x7;
     492            1 :             instr->v2.transMem.fence = config.fence & 0x1;
     493            1 :             instr->v2.transMem.cqe = config.cqe & 0x1;
     494            1 :             instr->v2.transMem.nf = config.nf & 0x1;
     495            1 :             instr->v2.transMem.udfEnable = config.udfEnable & 0x1;
     496            1 :             instr->v2.transMem.splitMode = config.splitMode & 0x1;
     497            1 :             instr->v2.transMem.se = config.se & 0x1;
     498            1 :             instr->v2.transMem.rmtJettyType = config.rmtJettyType & 0x3;
     499              : 
     500            1 :             instr->v2.transMem.src_mode = config.src_mode & 0x1;
     501            1 :             instr->v2.transMem.dst_mode = config.dst_mode & 0x1;
     502            1 :             instr->v2.transMem.msIdMode = config.msIdMode & 0x1;
     503              : 
     504            1 :             instr->v2.transMem.targetHint = 0x0;
     505              : 
     506            1 :             instr->v2.transMem.setCKEId = setCKEId;
     507            1 :             instr->v2.transMem.setCKEMask = setCKEMask;
     508            1 :         }
     509              : 
     510              :         // 将本端Xn的值写入远端8B地址
     511            4 :         inline void SyncWtX(
     512              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t xn, uint16_t channelId, uint16_t setCKEId,
     513              :             uint16_t setCKEMask)
     514              :         {
     515            4 :             instr->header = InstrHeader(TRANS_TYPE, SYNCWTX_CODE);
     516            4 :             instr->v2.syncWtX.xdId = dst;
     517            4 :             instr->v2.syncWtX.xdtId = dstToken;
     518            4 :             instr->v2.syncWtX.xsId = xn;
     519            4 :             instr->v2.syncWtX.xcId = channelId;
     520              : 
     521            4 :             instr->v2.syncWtX.setCKEId = setCKEId;
     522            4 :             instr->v2.syncWtX.setCKEMask = setCKEMask;
     523            4 :         }
     524              : 
     525              :         // 将本端Xn的值写入远端8B地址并置位远端CKE
     526            3 :         void SyncWtX(
     527              :             CcuInstr* instr, uint16_t dst, uint16_t dstToken, uint16_t xn, uint16_t channelId,
     528              :             const TransMemNotifyInfo& notify, uint16_t setCKEId, uint16_t setCKEMask)
     529              :         {
     530            3 :             SyncWtX(instr, dst, dstToken, xn, channelId, setCKEId, setCKEMask);
     531            3 :             instr->v2.syncWtX.xnId = notify.xnId;
     532            3 :             instr->v2.syncWtX.xntId = notify.xntId;
     533            3 :             instr->v2.syncWtX.value = notify.value;
     534              : 
     535            3 :             instr->v2.syncWtX.notifyValid = 1;
     536            3 :             instr->v2.syncWtX.parMode = 1;
     537            3 :         }
     538              : 
     539              :         // 置位远端CKE
     540            1 :         void SyncWtX(
     541              :             CcuInstr* instr, const TransMemNotifyInfo& notify, uint16_t channelId, uint16_t setCKEId,
     542              :             uint16_t setCKEMask)
     543              :         {
     544            1 :             SyncWtX(instr, notify.xnId, notify.xntId, notify.value, channelId, setCKEId, setCKEMask);
     545              : 
     546            1 :             instr->v2.syncWtX.notifyValid = 0;
     547            1 :             instr->v2.syncWtX.parMode = 0;
     548            1 :         }
     549              : 
     550              :         // 将本端Xn的值以atomic store add的方式写入远端8B地址
     551            0 :         void SyncAtX(
     552              :             CcuInstr* instr, uint16_t dstAddr, uint16_t dstToken, uint16_t srcId, uint16_t channelId, uint16_t setCKEId,
     553              :             uint16_t setCKEMask)
     554              :         {
     555            0 :             instr->header = InstrHeader(TRANS_TYPE, SYNCATX_CODE);
     556            0 :             instr->v2.syncAtX.xdId = dstAddr;
     557            0 :             instr->v2.syncAtX.xdtId = dstToken;
     558            0 :             instr->v2.syncAtX.xsId = srcId;
     559            0 :             instr->v2.syncAtX.xcId = channelId;
     560              : 
     561            0 :             instr->v2.syncAtX.parMode = 1;
     562              : 
     563            0 :             instr->v2.syncAtX.setCKEId = setCKEId;
     564            0 :             instr->v2.syncAtX.setCKEMask = setCKEMask;
     565            0 :         }
     566              : 
     567              :         // MSA~MSH Reduce到 MSA
     568            2 :         inline void Reduce(
     569              :             CcuInstr* instr, const uint16_t* ms, uint16_t count, uint16_t castEn, uint16_t dataType, uint16_t setCKEId,
     570              :             uint16_t setCKEMask, uint16_t XnIdLength)
     571              :         {
     572              :             // 由调用者保证传入的count >= 2(reduce的数据源)
     573            2 :             if (count < CCU_REDUCE_MIN_MS) {
     574            0 :                 HCCL_ERROR("[CcuV2::Reduce] count %u < min %u", count, CCU_REDUCE_MIN_MS);
     575            0 :                 return;
     576              :             }
     577            2 :             count -= 2; // CCU指令中指定count数为实际参与运算的MS数减2
     578              : 
     579           18 :             for (uint16_t index = 0; index < CCU_REDUCE_MAX_MS; index++) {
     580           16 :                 instr->v2.reduce.msId[index] = ms[index];
     581              :             }
     582            2 :             instr->v2.reduce.XnIdLength = XnIdLength;
     583            2 :             instr->v2.reduce.count = count & 0x7;
     584            2 :             instr->v2.reduce.castEn = castEn & 0x3;
     585            2 :             instr->v2.reduce.dataType = dataType & 0x1f;
     586            2 :             instr->v2.reduce.setCKEId = setCKEId;
     587            2 :             instr->v2.reduce.setCKEMask = setCKEMask;
     588              :         }
     589              : 
     590            2 :         void ReduceAdd(
     591              :             CcuInstr* instr, const uint16_t* ms, uint16_t count, uint16_t castEn, uint16_t dataType, uint16_t setCKEId,
     592              :             uint16_t setCKEMask, uint16_t XnIdLength)
     593              :         {
     594            2 :             if (instr == nullptr) {
     595            0 :                 HCCL_ERROR("[CcuV2::ReduceAdd] instr is nullptr!");
     596            0 :                 return;
     597              :             }
     598            2 :             instr->header = InstrHeader(REDUCE_TYPE, REDUCE_ADD_CODE);
     599            2 :             Reduce(instr, ms, count, castEn, dataType, setCKEId, setCKEMask, XnIdLength);
     600              :         }
     601              : 
     602            0 :         void ReduceMax(
     603              :             CcuInstr* instr, const uint16_t* ms, uint16_t count, uint16_t dataType, uint16_t setCKEId,
     604              :             uint16_t setCKEMask, uint16_t XnIdLength)
     605              :         {
     606            0 :             if (instr == nullptr) {
     607            0 :                 HCCL_ERROR("[CcuV2::ReduceMax] instr is nullptr!");
     608            0 :                 return;
     609              :             }
     610            0 :             instr->header = InstrHeader(REDUCE_TYPE, REDUCE_MAX_CODE);
     611            0 :             Reduce(instr, ms, count, 0, dataType, setCKEId, setCKEMask, XnIdLength);
     612              :         }
     613              : 
     614            0 :         void ReduceMin(
     615              :             CcuInstr* instr, const uint16_t* ms, uint16_t count, uint16_t dataType, uint16_t setCKEId,
     616              :             uint16_t setCKEMask, uint16_t xnIdLength)
     617              :         {
     618            0 :             if (instr == nullptr) {
     619            0 :                 HCCL_ERROR("[CcuV2::ReduceMin] instr is nullptr!");
     620            0 :                 return;
     621              :             }
     622            0 :             instr->header = InstrHeader(REDUCE_TYPE, REDUCE_MIN_CODE);
     623            0 :             Reduce(instr, ms, count, 0, dataType, setCKEId, setCKEMask, xnIdLength);
     624              :         }
     625              : 
     626           30 :         std::string ParseLoadSqeArgsToX(const CcuInstr* instr)
     627              :         {
     628           30 :             uint16_t xnId = instr->v2.loadSqeArgsToX.xnId;
     629           30 :             uint16_t sqeArgsId = instr->v2.loadSqeArgsToX.sqeArgsId;
     630           30 :             uint16_t setCKEId = instr->v2.loadSqeArgsToX.setCKEId;
     631           30 :             uint16_t setCKEMask = instr->v2.loadSqeArgsToX.setCKEMask;
     632              : 
     633              :             // 使用 StringFormat 格式化字符串
     634              :             return Hccl::StringFormat(
     635           30 :                 "Load SqeArg[%u] to Xn[%u], Set CKE[%u:%04x]", sqeArgsId, xnId, setCKEId, setCKEMask);
     636              :         }
     637              : 
     638          499 :         std::string ParseLoadImdToXn(const CcuInstr* instr)
     639              :         {
     640          499 :             uint16_t xnId = instr->v2.loadImdToX.xnId;
     641          499 :             uint64_t immediate = instr->v2.loadImdToX.immediate;
     642          499 :             uint16_t setCKEId = instr->v2.loadImdToX.setCKEId;
     643          499 :             uint16_t setCKEMask = instr->v2.loadImdToX.setCKEMask;
     644              : 
     645              :             // 使用 StringFormat 格式化字符串
     646              :             return Hccl::StringFormat(
     647          499 :                 "Load immediate[%llu] to Xn[%u], Set CKE[%u:%04x]", immediate, xnId, setCKEId, setCKEMask);
     648              :         }
     649              : 
     650            0 :         std::string ParseClearX(const CcuInstr* instr)
     651              :         {
     652            0 :             uint16_t xnId = instr->v2.clearX.xnId;
     653            0 :             uint16_t xmId = instr->v2.clearX.xmId;
     654            0 :             uint16_t setCKEId = instr->v2.clearX.setCKEId;
     655            0 :             uint16_t setCKEMask = instr->v2.clearX.setCKEMask;
     656              : 
     657              :             // 使用 StringFormat 格式化字符串
     658              :             return Hccl::StringFormat(
     659            0 :                 "CleanX: xnId[%u] to xmId[%u], Set CKE[%u:%04x]", xnId, xmId, setCKEId, setCKEMask);
     660              :         }
     661              : 
     662          212 :         std::string ParseNop(const CcuInstr* instr)
     663              :         {
     664              :             (void)instr;
     665          212 :             return Hccl::StringFormat("Nop");
     666              :         }
     667              : 
     668          232 :         std::string ParseAdd(const CcuInstr* instr)
     669              :         {
     670          232 :             uint16_t xdId = instr->v2.operate.xdId;
     671          232 :             uint16_t xnId = instr->v2.operate.xnId;
     672          232 :             uint16_t xmId = instr->v2.operate.xmId;
     673          232 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     674          232 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     675          232 :             uint16_t parMode = instr->v2.operate.parMode;
     676              : 
     677              :             // 使用 StringFormat 格式化字符串
     678          232 :             if (instr->v2.operate.parMode == 0) {
     679              :                 return Hccl::StringFormat(
     680              :                     "AddI:xdId[%u] = xnId[%u] + immediata[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId,
     681          122 :                     setCKEId, setCKEMask, parMode);
     682              :             } else {
     683              :                 return Hccl::StringFormat(
     684              :                     "Add:xdId[%u] = xnId[%u] + xmId[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId, setCKEId,
     685          110 :                     setCKEMask, parMode);
     686              :             }
     687              :         }
     688              : 
     689            8 :         std::string ParseSub(const CcuInstr* instr)
     690              :         {
     691            8 :             uint16_t xdId = instr->v2.operate.xdId;
     692            8 :             uint16_t xnId = instr->v2.operate.xnId;
     693            8 :             uint16_t xmId = instr->v2.operate.xmId;
     694            8 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     695            8 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     696            8 :             uint16_t parMode = instr->v2.operate.parMode;
     697              : 
     698              :             // 使用 StringFormat 格式化字符串
     699            8 :             if (instr->v2.operate.parMode == 0) {
     700              :                 return Hccl::StringFormat(
     701              :                     "SubI:xdId[%u] = xnId[%u] - immediata[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId,
     702            4 :                     setCKEId, setCKEMask, parMode);
     703              :             } else {
     704              :                 return Hccl::StringFormat(
     705              :                     "Sub:xdId[%u] = xnId[%u] - xmId[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId, setCKEId,
     706            4 :                     setCKEMask, parMode);
     707              :             }
     708              :         }
     709              : 
     710            8 :         std::string ParseMul(const CcuInstr* instr)
     711              :         {
     712            8 :             uint16_t xdId = instr->v2.operate.xdId;
     713            8 :             uint16_t xnId = instr->v2.operate.xnId;
     714            8 :             uint16_t xmId = instr->v2.operate.xmId;
     715            8 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     716            8 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     717            8 :             uint16_t parMode = instr->v2.operate.parMode;
     718              : 
     719              :             // 使用 StringFormat 格式化字符串
     720            8 :             if (instr->v2.operate.parMode == 0) {
     721              :                 return Hccl::StringFormat(
     722              :                     "MulI:xdId[%u] = xnId[%u] * immediata[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId,
     723            4 :                     setCKEId, setCKEMask, parMode);
     724              :             } else {
     725              :                 return Hccl::StringFormat(
     726              :                     "Mul:xdId[%u] = xnId[%u] * xmId[%u], Set CKE[%u:%04x], parMode[%u]", xdId, xnId, xmId, setCKEId,
     727            4 :                     setCKEMask, parMode);
     728              :             }
     729              :         }
     730              : 
     731           26 :         std::string ParseAnd(const CcuInstr* instr)
     732              :         {
     733           26 :             uint16_t xdId = instr->v2.operate.xdId;
     734           26 :             uint16_t xnId = instr->v2.operate.xnId;
     735           26 :             uint16_t xmId = instr->v2.operate.xmId;
     736           26 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     737           26 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     738              : 
     739              :             // 使用 StringFormat 格式化字符串
     740              :             return Hccl::StringFormat(
     741           26 :                 "And:xdId[%u] = xnId[%u] & xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId, setCKEId, setCKEMask);
     742              :         }
     743              : 
     744            8 :         std::string ParseOr(const CcuInstr* instr)
     745              :         {
     746            8 :             uint16_t xdId = instr->v2.operate.xdId;
     747            8 :             uint16_t xnId = instr->v2.operate.xnId;
     748            8 :             uint16_t xmId = instr->v2.operate.xmId;
     749            8 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     750            8 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     751              : 
     752              :             // 使用 StringFormat 格式化字符串
     753              :             return Hccl::StringFormat(
     754            8 :                 "Or:xdId[%u] = xnId[%u] | xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId, setCKEId, setCKEMask);
     755              :         }
     756              : 
     757            4 :         std::string ParseXor(const CcuInstr* instr)
     758              :         {
     759            4 :             uint16_t xdId = instr->v2.operate.xdId;
     760            4 :             uint16_t xnId = instr->v2.operate.xnId;
     761            4 :             uint16_t xmId = instr->v2.operate.xmId;
     762            4 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     763            4 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     764              : 
     765              :             // 使用 StringFormat 格式化字符串
     766              :             return Hccl::StringFormat(
     767            4 :                 "Xor:xdId[%u] = xnId[%u] ^ xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId, setCKEId, setCKEMask);
     768              :         }
     769              : 
     770            2 :         std::string ParseNot(const CcuInstr* instr)
     771              :         {
     772            2 :             uint16_t xdId = instr->v2.operate.xdId;
     773            2 :             uint16_t xnId = instr->v2.operate.xnId;
     774            2 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     775            2 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     776              : 
     777              :             // 使用 StringFormat 格式化字符串
     778            2 :             return Hccl::StringFormat("Not:xdId[%u] = ~xnId[%u], Set CKE[%u:%04x]", xdId, xnId, setCKEId, setCKEMask);
     779              :         }
     780              : 
     781            8 :         std::string ParseShl(const CcuInstr* instr)
     782              :         {
     783            8 :             uint16_t xdId = instr->v2.operate.xdId;
     784            8 :             uint16_t xnId = instr->v2.operate.xnId;
     785            8 :             uint16_t xmId = instr->v2.operate.xmId;
     786            8 :             uint16_t shiftType = instr->v2.operate.shiftType;
     787            8 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     788            8 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     789              : 
     790              :             // 使用 StringFormat 格式化字符串
     791            8 :             if (shiftType == 0) {
     792              :                 return Hccl::StringFormat(
     793              :                     "logic left shift:xdId[%u] = xnId[%u] << xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId, setCKEId,
     794            8 :                     setCKEMask);
     795              :             } else {
     796              :                 return Hccl::StringFormat(
     797              :                     "arithmetic left shift:xdId[%u] = xnId[%u] << xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId,
     798            0 :                     setCKEId, setCKEMask);
     799              :             }
     800              :         }
     801              : 
     802           18 :         std::string ParseShr(const CcuInstr* instr)
     803              :         {
     804           18 :             uint16_t xdId = instr->v2.operate.xdId;
     805           18 :             uint16_t xnId = instr->v2.operate.xnId;
     806           18 :             uint16_t xmId = instr->v2.operate.xmId;
     807           18 :             uint16_t shiftType = instr->v2.operate.shiftType;
     808           18 :             uint16_t setCKEId = instr->v2.operate.setCKEId;
     809           18 :             uint16_t setCKEMask = instr->v2.operate.setCKEMask;
     810              : 
     811              :             // 使用 StringFormat 格式化字符串
     812           18 :             if (shiftType == 0) {
     813              :                 return Hccl::StringFormat(
     814              :                     "logic right shift:xdId[%u] = xnId[%u] >> xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId, setCKEId,
     815           18 :                     setCKEMask);
     816              :             } else {
     817              :                 return Hccl::StringFormat(
     818              :                     "arithmetic right shift:xdId[%u] = xnId[%u] >> xmId[%u], Set CKE[%u:%04x]", xdId, xnId, xmId,
     819            0 :                     setCKEId, setCKEMask);
     820              :             }
     821              :         }
     822              : 
     823            0 :         std::string ParseLoadFromMem(const CcuInstr* instr)
     824              :         {
     825            0 :             uint16_t xdId = instr->v2.load.xdId;
     826            0 :             uint16_t xsId = instr->v2.load.xsId;
     827            0 :             uint16_t xstId = instr->v2.load.xstId;
     828            0 :             uint16_t xlId = instr->v2.load.xlId;
     829            0 :             uint16_t allocHint = instr->v2.load.allocHint;
     830            0 :             uint16_t victimHint = instr->v2.load.victimHint;
     831            0 :             uint16_t setCKEId = instr->v2.load.setCKEId;
     832            0 :             uint16_t setCKEMask = instr->v2.load.setCKEMask;
     833            0 :             uint16_t dstType = instr->v2.load.dstType;
     834              : 
     835              :             return Hccl::StringFormat(
     836              :                 "LoadFromMem: xdId[%u] xsId[%u] xstId[%u] xlId[%u], allocHint[%u], victimHint[%u], setCKEId[%u], "
     837              :                 "setCKEMask[%u] dstType[%u]",
     838            0 :                 xdId, xsId, xstId, xlId, allocHint, victimHint, setCKEId, setCKEMask, dstType);
     839              :         }
     840              : 
     841            0 :         std::string ParseStoreXToMem(const CcuInstr* instr)
     842              :         {
     843            0 :             uint16_t xdId = instr->v2.store.xdId;
     844            0 :             uint16_t xdtId = instr->v2.store.xdtId;
     845            0 :             uint16_t xsId = instr->v2.store.xsId;
     846            0 :             uint16_t xlId = instr->v2.store.xlId;
     847            0 :             uint16_t xhId = instr->v2.store.xhId;
     848            0 :             uint16_t srcType = instr->v2.store.srcType;
     849            0 :             uint16_t allocHint = instr->v2.store.allocHint;
     850            0 :             uint16_t victimHint = instr->v2.store.victimHint;
     851            0 :             uint16_t storeType = instr->v2.store.storeType;
     852            0 :             uint16_t hscbType = instr->v2.store.hscbType;
     853            0 :             uint16_t hscbBroadCastDstType = instr->v2.store.hscbBroadCastDstType;
     854            0 :             uint16_t setCKEId = instr->v2.store.setCKEId;
     855            0 :             uint16_t setCKEMask = instr->v2.store.setCKEMask;
     856              : 
     857              :             // 使用 StringFormat 格式化字符串
     858              :             return Hccl::StringFormat(
     859              :                 "StoreXToMem: xdId[%u] xdtId[%u], xsId[%u], xlId[%u], xhId[%u], srcType[%u], allocHint[%u], "
     860              :                 "victimHint[%u], storeType[%u], hscbType[%u], hscbBroadCastDstType[%u], set CKE[%u:%04x]",
     861              :                 xdId, xdtId, xsId, xlId, xhId, srcType, allocHint, victimHint, storeType, hscbType,
     862            0 :                 hscbBroadCastDstType, setCKEId, setCKEMask);
     863              :         }
     864              : 
     865           38 :         std::string ParseLoop(const CcuInstr* instr)
     866              :         {
     867           38 :             uint16_t startInstrId = instr->v2.loop.startInstrId;
     868           38 :             uint16_t endInstrId = instr->v2.loop.endInstrId;
     869           38 :             uint16_t xmId = instr->v2.loop.xmId;
     870           38 :             uint16_t xnId = instr->v2.loop.xnId;
     871           38 :             uint16_t xpId = instr->v2.loop.xpId;
     872           38 :             uint16_t wishCKEBit = instr->v2.loop.wishCKEBit;
     873           38 :             uint16_t mode = instr->v2.loop.mode;
     874              : 
     875              :             // 使用 StringFormat 格式化字符串
     876              :             return Hccl::StringFormat(
     877              :                 "Loop From startInstrId[%u] to endInstrId[%u] with iterNumXn[%u], OffsetXn[%u], ContextIdXn[%u],"
     878              :                 "wishCKEBit[%u], mode[%u]",
     879           38 :                 startInstrId, endInstrId, xmId, xnId, xpId, wishCKEBit, mode);
     880              :         }
     881              : 
     882           18 :         std::string ParseLoopGroup(const CcuInstr* instr)
     883              :         {
     884           18 :             uint16_t startLoopInstrId = instr->v2.loopGroup.startLoopInstrId;
     885           18 :             uint16_t xnId = instr->v2.loopGroup.xnId;
     886           18 :             uint16_t xmId = instr->v2.loopGroup.xmId;
     887           18 :             uint16_t xpId = instr->v2.loopGroup.xpId;
     888              : 
     889              :             // 使用 StringFormat 格式化字符串
     890              :             return Hccl::StringFormat(
     891              :                 "LoopGroup From startLoopInstrId[%u] with loopGroupXn[%u], resOffsetXn[%u], xnOffset[%u]",
     892           18 :                 startLoopInstrId, xnId, xmId, xpId);
     893              :         }
     894              : 
     895           80 :         std::string ParseJump(const CcuInstr* instr)
     896              :         {
     897           80 :             uint16_t relTarInstrXnId = instr->v2.jmp.relTarInstrXnId;
     898           80 :             uint16_t conditionXnId = instr->v2.jmp.conditionXnId;
     899           80 :             uint16_t expectedXnId = instr->v2.jmp.expectedXnId;
     900           80 :             uint16_t conditionType = instr->v2.jmp.conditionType;
     901              : 
     902              :             // 使用 StringFormat 格式化字符串
     903              :             return Hccl::StringFormat(
     904              :                 "When conditionXn[%u] condition with[%u] expectedXn[%u], Jump To RelInstrIdXn[%u]", conditionXnId,
     905           80 :                 conditionType, expectedXnId, relTarInstrXnId);
     906              :         }
     907              : 
     908            0 :         std::string ParseWait(const CcuInstr* instr)
     909              :         {
     910            0 :             uint16_t conditionXnId = instr->v2.wait.conditionXnId;
     911            0 :             uint16_t expectedXnId = instr->v2.wait.expectedXnId;
     912            0 :             uint16_t conditionType = instr->v2.wait.conditionType;
     913              : 
     914              :             // 使用 StringFormat 格式化字符串
     915              :             return Hccl::StringFormat(
     916            0 :                 "Wait conditionXn[%u] condition with[%u] expectedXn[%u]", conditionXnId, conditionType, expectedXnId);
     917              :         }
     918              : 
     919            0 :         std::string ParseFence(const CcuInstr* instr)
     920              :         {
     921              :             (void)instr;
     922            0 :             return Hccl::StringFormat("Fence");
     923              :         }
     924              : 
     925           23 :         std::string ParseSetCKE(const CcuInstr* instr)
     926              :         {
     927           23 :             uint16_t setCKEId = instr->v2.setCKE.setCKEId;
     928           23 :             uint16_t setCKEMask = instr->v2.setCKE.setCKEMask;
     929           23 :             uint16_t waitCKEId = instr->v2.setCKE.waitCKEId;
     930           23 :             uint16_t waitCKEMask = instr->v2.setCKE.waitCKEMask;
     931           23 :             uint16_t clearType = instr->v2.setCKE.clearType;
     932           23 :             uint64_t userData = instr->v2.setCKE.userData;
     933              : 
     934              :             // 使用 StringFormat 格式化字符串
     935              :             return Hccl::StringFormat(
     936              :                 "Wait CKE[%u:%04x], Set CKE[%u:%04x], clearType[%u], userData[%llu]", waitCKEId, waitCKEMask, setCKEId,
     937           23 :                 setCKEMask, clearType, userData);
     938              :         }
     939              : 
     940           12 :         std::string ParseClearCKE(const CcuInstr* instr)
     941              :         {
     942           12 :             uint16_t clearCKEId = instr->v2.clearCKE.clearCKEId;
     943           12 :             uint16_t clearMask = instr->v2.clearCKE.clearMask;
     944           12 :             uint16_t waitCKEId = instr->v2.clearCKE.waitCKEId;
     945           12 :             uint16_t waitCKEMask = instr->v2.clearCKE.waitCKEMask;
     946           12 :             uint16_t clearType = instr->v2.clearCKE.clearType & 0x1;
     947              : 
     948              :             // 使用 StringFormat 格式化字符串
     949              :             return Hccl::StringFormat(
     950              :                 "Wait CKE[%u:%04x], Clear CKE[%u:%04x], clearType[%u]", waitCKEId, waitCKEMask, clearCKEId, clearMask,
     951           12 :                 clearType);
     952              :         }
     953              : 
     954            8 :         std::string ParseTransLocMemToLocMS(const CcuInstr* instr)
     955              :         {
     956            8 :             uint16_t ms = instr->v2.transLocMemToLocMS.msId;
     957            8 :             uint16_t src = instr->v2.transLocMemToLocMS.xsId;
     958            8 :             uint16_t srcToken = instr->v2.transLocMemToLocMS.xstId;
     959            8 :             uint16_t len = instr->v2.transLocMemToLocMS.xlId;
     960            8 :             uint16_t offset = instr->v2.transLocMemToLocMS.xoId;
     961            8 :             uint16_t allocHint = instr->v2.transLocMemToLocMS.allocHint;
     962            8 :             uint16_t victimHint = instr->v2.transLocMemToLocMS.victimHint;
     963            8 :             uint16_t setCKEId = instr->v2.transLocMemToLocMS.setCKEId;
     964            8 :             uint16_t setCKEMask = instr->v2.transLocMemToLocMS.setCKEMask;
     965              : 
     966              :             // 使用 StringFormat 格式化字符串
     967              :             return Hccl::StringFormat(
     968              :                 "Trans LocMem[%u:%u] To LocMS[%u] With LengthXn[%u], Offset[%u], Set CKE[%u:%04x], "
     969              :                 "allocHint[%u], victimHint[%u]",
     970            8 :                 src, srcToken, ms, len, offset, setCKEId, setCKEMask, allocHint, victimHint);
     971              :         }
     972              : 
     973            4 :         std::string ParseTransLocMSToLocMem(const CcuInstr* instr)
     974              :         {
     975            4 :             uint16_t dst = instr->v2.transLocMSToLocMem.xdId;
     976            4 :             uint16_t dstToken = instr->v2.transLocMSToLocMem.xdtId;
     977            4 :             uint16_t ms = instr->v2.transLocMSToLocMem.msId;
     978            4 :             uint16_t len = instr->v2.transLocMSToLocMem.xlId;
     979            4 :             uint16_t offset = instr->v2.transLocMSToLocMem.xoId;
     980            4 :             uint16_t allocHint = instr->v2.transLocMSToLocMem.allocHint;
     981            4 :             uint16_t victimHint = instr->v2.transLocMSToLocMem.victimHint;
     982            4 :             uint16_t setCKEId = instr->v2.transLocMSToLocMem.setCKEId;
     983            4 :             uint16_t setCKEMask = instr->v2.transLocMSToLocMem.setCKEMask;
     984              : 
     985              :             // 使用 StringFormat 格式化字符串
     986              :             return Hccl::StringFormat(
     987              :                 "Trans LocMS[%u] To LocMem[%u:%u] With LengthXn[%u], Offset[%u], Set CKE[%u:%04x], "
     988              :                 "allocHint[%u], victimHint[%u]",
     989            4 :                 ms, dst, dstToken, len, offset, setCKEId, setCKEMask, allocHint, victimHint);
     990              :         }
     991              : 
     992            0 :         std::string ParseTransLocMemToLocMem(const CcuInstr* instr)
     993              :         {
     994            0 :             uint16_t dst = instr->v2.transLocMemToLocMem.xdId;
     995            0 :             uint16_t dstToken = instr->v2.transLocMemToLocMem.xdtId;
     996            0 :             uint16_t src = instr->v2.transLocMemToLocMem.xsId;
     997            0 :             uint16_t srcToken = instr->v2.transLocMemToLocMem.xstId;
     998            0 :             uint16_t len = instr->v2.transLocMemToLocMem.xlId;
     999            0 :             uint16_t usedMSId = instr->v2.transLocMemToLocMem.usedMSId;
    1000            0 :             uint16_t msNum = instr->v2.transLocMemToLocMem.msNum;
    1001              : 
    1002            0 :             uint16_t srcAllocHint = instr->v2.transLocMemToLocMem.srcAllocHint;
    1003            0 :             uint16_t srcVictimHint = instr->v2.transLocMemToLocMem.srcVictimHint;
    1004            0 :             uint16_t dstAllocHint = instr->v2.transLocMemToLocMem.dstAllocHint;
    1005            0 :             uint16_t dstVictimHint = instr->v2.transLocMemToLocMem.dstVictimHint;
    1006              : 
    1007            0 :             uint16_t setCKEId = instr->v2.transLocMemToLocMem.setCKEId;
    1008            0 :             uint16_t setCKEMask = instr->v2.transLocMemToLocMem.setCKEMask;
    1009              : 
    1010              :             // 使用 StringFormat 格式化字符串
    1011              :             return Hccl::StringFormat(
    1012              :                 "Trans LocMem[%u:%u] To LocMem[%u:%u] With Length[%u], Set CKE[%u:%04x], usedMSId[%u], msNum[%u],"
    1013              :                 "srcAllocHint[%u], srcVictimHint[%u], dstAllocHint[%u], dstVictimHint[%u]",
    1014              :                 src, srcToken, dst, dstToken, len, setCKEId, setCKEMask, usedMSId, msNum, srcAllocHint, srcVictimHint,
    1015            0 :                 dstAllocHint, dstVictimHint);
    1016              :         }
    1017              : 
    1018            2 :         std::string ParseTransMem(const CcuInstr* instr)
    1019              :         {
    1020            2 :             uint16_t dst = instr->v2.transMem.xdId;
    1021            2 :             uint16_t dstToken = instr->v2.transMem.xdtId;
    1022            2 :             uint16_t src = instr->v2.transMem.xsId;
    1023            2 :             uint16_t srcToken = instr->v2.transMem.xstId;
    1024            2 :             uint16_t len = instr->v2.transMem.xlId;
    1025            2 :             uint16_t channel = instr->v2.transMem.xcId;
    1026              : 
    1027            2 :             uint16_t notifyXnId = instr->v2.transMem.xnId;
    1028            2 :             uint16_t notifyXntId = instr->v2.transMem.xntId;
    1029            2 :             uint16_t notifyValue = instr->v2.transMem.value;
    1030              : 
    1031            2 :             uint16_t reduceUdfType = instr->v2.transMem.udfType;
    1032            2 :             uint16_t reduceDataType = instr->v2.transMem.reduceDataType;
    1033            2 :             uint16_t reduceOpCode = instr->v2.transMem.reduceOpCode;
    1034              : 
    1035            2 :             uint16_t configOpCode = instr->v2.transMem.dmaOpCode;
    1036            2 :             uint16_t configOrder = instr->v2.transMem.order;
    1037            2 :             uint16_t configFence = instr->v2.transMem.fence;
    1038            2 :             uint16_t configCqe = instr->v2.transMem.cqe;
    1039            2 :             uint16_t configNf = instr->v2.transMem.nf;
    1040            2 :             uint16_t configUdfEnable = instr->v2.transMem.udfEnable;
    1041            2 :             uint16_t configSplitMode = instr->v2.transMem.splitMode;
    1042            2 :             uint16_t configSe = instr->v2.transMem.se;
    1043            2 :             uint16_t configRmtJettyType = instr->v2.transMem.rmtJettyType;
    1044            2 :             uint16_t configTargetHint = instr->v2.transMem.targetHint;
    1045              : 
    1046            2 :             uint16_t setCKEId = instr->v2.transMem.setCKEId;
    1047            2 :             uint16_t setCKEMask = instr->v2.transMem.setCKEMask;
    1048              : 
    1049            2 :             uint16_t srcMode = instr->v2.transMem.src_mode;
    1050            2 :             uint16_t dstMode = instr->v2.transMem.dst_mode;
    1051            2 :             uint16_t msIdMode = instr->v2.transMem.msIdMode;
    1052              : 
    1053              :             // 使用 StringFormat 格式化字符串
    1054              :             return Hccl::StringFormat(
    1055              :                 "Trans Mem[%u:%u] To Mem[%u:%u] With Len[%u] Use Channel[%u] Set CKE[%u:%04x], notifyXnId[%u], "
    1056              :                 "notifyXntId[%u], notifyValue[%u], reduceUdfType[%u], reduceDataType[%u], reduceOpCode[%u], "
    1057              :                 "configOpCode[%u], Order[%u], Fence[%u], Cqe[%u], Nf[%u], UdfEnable[%u], SplitMode[%u], Se[%u], "
    1058              :                 "RmtJettyType[%u], configTargetHint[%u], srcMode[%u], dstMode[%u], msIdMode[%u]",
    1059              :                 src, srcToken, dst, dstToken, len, channel, setCKEId, setCKEMask, notifyXnId, notifyXntId, notifyValue,
    1060              :                 reduceUdfType, reduceDataType, reduceOpCode, configOpCode, configOrder, configFence, configCqe,
    1061              :                 configNf, configUdfEnable, configSplitMode, configSe, configRmtJettyType, configTargetHint, srcMode,
    1062            2 :                 dstMode, msIdMode);
    1063              :         }
    1064              : 
    1065            8 :         std::string ParseSyncWtX(const CcuInstr* instr)
    1066              :         {
    1067            8 :             uint16_t dst = instr->v2.syncWtX.xdId;
    1068            8 :             uint16_t dstToken = instr->v2.syncWtX.xdtId;
    1069            8 :             uint16_t xn = instr->v2.syncWtX.xsId;
    1070            8 :             uint16_t channelId = instr->v2.syncWtX.xcId;
    1071              : 
    1072            8 :             uint16_t setCKEId = instr->v2.syncWtX.setCKEId;
    1073            8 :             uint16_t setCKEMask = instr->v2.syncWtX.setCKEMask;
    1074              : 
    1075              :             // 检查是否包含通知信息
    1076            8 :             bool hasNotify = (instr->v2.syncWtX.notifyValid != 0);
    1077            8 :             uint16_t parMode = instr->v2.syncWtX.parMode;
    1078            8 :             uint16_t notifyXnId = hasNotify ? instr->v2.syncWtX.xnId : 0;
    1079            8 :             uint16_t notifyXntId = hasNotify ? instr->v2.syncWtX.xntId : 0;
    1080            8 :             uint16_t notifyValue = hasNotify ? instr->v2.syncWtX.value : 0;
    1081              : 
    1082              :             // 使用 StringFormat 格式化字符串
    1083            8 :             if (hasNotify) {
    1084              :                 return Hccl::StringFormat(
    1085              :                     "Sync Xn[%u] To Mem[%u:%u] Use ChannelXn[%u], with notify[%u:%u:%04x], and Set CKE[%u:%04x], "
    1086              :                     "parMode[%u]",
    1087            6 :                     xn, dst, dstToken, channelId, notifyXnId, notifyXntId, notifyValue, setCKEId, setCKEMask, parMode);
    1088              :             } else {
    1089              :                 return Hccl::StringFormat(
    1090              :                     "Sync Xn[%u] To Mem[%u:%u] Use ChannelXn[%u], and Set CKE[%u:%04x], parMode[%u]", xn, dst, dstToken,
    1091            2 :                     channelId, setCKEId, setCKEMask, parMode);
    1092              :             }
    1093              :         }
    1094              : 
    1095            0 :         std::string ParseSyncAtX(const CcuInstr* instr)
    1096              :         {
    1097            0 :             uint16_t xdId = instr->v2.syncAtX.xdId;
    1098            0 :             uint16_t xdtId = instr->v2.syncAtX.xdtId;
    1099            0 :             uint16_t xsId = instr->v2.syncAtX.xsId;
    1100            0 :             uint16_t xcId = instr->v2.syncAtX.xcId;
    1101            0 :             uint16_t parMode = instr->v2.syncAtX.parMode;
    1102            0 :             uint16_t setCKEId = instr->v2.syncAtX.setCKEId;
    1103            0 :             uint16_t setCKEMask = instr->v2.syncAtX.setCKEMask;
    1104              : 
    1105              :             return Hccl::StringFormat(
    1106              :                 "Atomic Sync xsId[%u] To Mem[%u:%u] Use ChannelXn[%u], parMode[%u], setCKEId[%u:%04x]", xsId, xdId,
    1107            0 :                 xdtId, xcId, parMode, setCKEId, setCKEMask);
    1108              :         }
    1109              : 
    1110            4 :         std::string ParseMSListV2(const uint16_t* msId, uint16_t msNum)
    1111              :         {
    1112            4 :             std::string res = "MS[";
    1113           12 :             for (uint16_t i = 0; i < msNum + 2 && i < CCU_REDUCE_MAX_MS; i++) { // 循环范围 0 ~ count+ 2,防止越界
    1114            8 :                 if (i == msNum + 1) {
    1115            4 :                     res += std::to_string(msId[i] / 0x8000) + ":" + std::to_string(msId[i] % 0x8000) + "]";
    1116              :                 } else {
    1117            4 :                     res += std::to_string(msId[i] / 0x8000) + ":" + std::to_string(msId[i] % 0x8000) + ", ";
    1118              :                 }
    1119              :             }
    1120              : 
    1121            4 :             return res;
    1122            0 :         }
    1123              : 
    1124            4 :         std::string ParseReduce(const CcuInstr* instr)
    1125              :         {
    1126            4 :             uint16_t reduceType = instr->header.code;
    1127            4 :             uint16_t count = instr->v2.reduce.count;
    1128            4 :             uint16_t castEn = instr->v2.reduce.castEn;
    1129            4 :             uint16_t dataType = instr->v2.reduce.dataType;
    1130            4 :             uint16_t setCKEId = instr->v2.reduce.setCKEId;
    1131            4 :             uint16_t setCKEMask = instr->v2.reduce.setCKEMask;
    1132              : 
    1133              :             return Hccl::StringFormat(
    1134              :                 "Reduce %s, count[%u], reduceType[%u], castEn[%u] and dataType[%u], Set CKE[%u:%04x]",
    1135            4 :                 ParseMSListV2(instr->v2.reduce.msId, count).c_str(), count, reduceType, castEn, dataType, setCKEId,
    1136            8 :                 setCKEMask);
    1137              :         }
    1138              : 
    1139              :         using ParseInstrFunc = std::string (*)(const CcuInstr*);
    1140              :         static const std::unordered_map<uint16_t, ParseInstrFunc> g_parseInstrSqeMapV2
    1141              :             = {{InstrHeader(LOAD_TYPE, LOADSQEARGSTOX_CODE).header, &ParseLoadSqeArgsToX},
    1142              :                {InstrHeader(LOAD_TYPE, LOADIMDTOX_CODE).header, &ParseLoadImdToXn},
    1143              :                {InstrHeader(LOAD_TYPE, CLEARX_CODE).header, &ParseClearX},
    1144              :                {InstrHeader(LOAD_TYPE, NOP_CODE).header, &ParseNop},
    1145              :                {InstrHeader(LOAD_TYPE, ADD_CODE).header, &ParseAdd},
    1146              :                {InstrHeader(LOAD_TYPE, SUB_CODE).header, &ParseSub},
    1147              :                {InstrHeader(LOAD_TYPE, MUL_CODE).header, &ParseMul},
    1148              :                {InstrHeader(LOAD_TYPE, AND_CODE).header, &ParseAnd},
    1149              :                {InstrHeader(LOAD_TYPE, OR_CODE).header, &ParseOr},
    1150              :                {InstrHeader(LOAD_TYPE, XOR_CODE).header, &ParseXor},
    1151              :                {InstrHeader(LOAD_TYPE, NOT_CODE).header, &ParseNot},
    1152              :                {InstrHeader(LOAD_TYPE, SHL_CODE).header, &ParseShl},
    1153              :                {InstrHeader(LOAD_TYPE, SHR_CODE).header, &ParseShr},
    1154              :                {InstrHeader(LOAD_TYPE, LOAD_CODE).header, &ParseLoadFromMem},
    1155              :                {InstrHeader(LOAD_TYPE, STORE_CODE).header, &ParseStoreXToMem},
    1156              :                {InstrHeader(CTRL_TYPE, LOOP_CODE).header, &ParseLoop},
    1157              :                {InstrHeader(CTRL_TYPE, LOOPGROUP_CODE).header, &ParseLoopGroup},
    1158              :                {InstrHeader(CTRL_TYPE, JMP_CODE).header, &ParseJump},
    1159              :                {InstrHeader(CTRL_TYPE, WAIT_CODE).header, &ParseWait},
    1160              :                {InstrHeader(CTRL_TYPE, FENCE_CODE).header, &ParseFence},
    1161              :                {InstrHeader(CTRL_TYPE, SETCKBIT_CODE).header, &ParseSetCKE},
    1162              :                {InstrHeader(CTRL_TYPE, CLEARCKBIT_CODE).header, &ParseClearCKE},
    1163              :                {InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMS_CODE).header, &ParseTransLocMemToLocMS},
    1164              :                {InstrHeader(TRANS_TYPE, TRANSLOCMSTOLOCMEM_CODE).header, &ParseTransLocMSToLocMem},
    1165              :                {InstrHeader(TRANS_TYPE, TRANSLOCMEMTOLOCMEM_CODE).header, &ParseTransLocMemToLocMem},
    1166              :                {InstrHeader(TRANS_TYPE, TRANSMEM_CODE).header, &ParseTransMem},
    1167              :                {InstrHeader(TRANS_TYPE, SYNCWTX_CODE).header, &ParseSyncWtX},
    1168              :                {InstrHeader(TRANS_TYPE, SYNCATX_CODE).header, &ParseSyncAtX},
    1169              :                {InstrHeader(REDUCE_TYPE, REDUCE_ADD_CODE).header, &ParseReduce},
    1170              :                {InstrHeader(REDUCE_TYPE, REDUCE_MAX_CODE).header, &ParseReduce},
    1171              :                {InstrHeader(REDUCE_TYPE, REDUCE_MIN_CODE).header, &ParseReduce}};
    1172              : 
    1173         1252 :         std::string ParseInstrV2(const CcuInstr* instr)
    1174              :         {
    1175         1252 :             if (instr == nullptr) {
    1176            0 :                 HCCL_ERROR("ParseInstr input nullptr!");
    1177            0 :                 return std::string();
    1178              :             }
    1179              : 
    1180         1252 :             auto it = g_parseInstrSqeMapV2.find(instr->header.header);
    1181         1252 :             if (it == g_parseInstrSqeMapV2.end()) {
    1182            0 :                 HCCL_ERROR("Not support instr type %u code %u", instr->header.type, instr->header.code);
    1183            0 :                 return std::string();
    1184              :             }
    1185              : 
    1186         1252 :             return it->second(instr);
    1187              :         }
    1188              : 
    1189            0 :         void RelJmp(CcuInstr* instr, uint16_t targetXnId, uint32_t jmpInstrId, uint16_t xn0, uint16_t xn1)
    1190              :         {
    1191            0 :             CcuV2::LoadImdToXn(instr++, xn0, jmpInstrId);
    1192            0 :             CcuV2::LoadImdToXn(instr++, xn1, JMP_TARGET_PC_IF_BRANCH);
    1193            0 :             CcuV2::Jump(instr++, xn1, targetXnId, xn0, JMP_COND_TYPE_IF);
    1194            0 :             CcuV2::LoadImdToXn(instr++, xn0, 0x10000 - jmpInstrId);
    1195            0 :             CcuV2::Add(instr++, targetXnId, targetXnId, xn0);
    1196            0 :             CcuV2::LoadImdToXn(instr++, xn1, JMP_TARGET_PC_NOP_BRANCH);
    1197            0 :             CcuV2::Jump(instr++, xn1, 0, 0, JMP_COND_TYPE_UNCOND);
    1198            0 :             CcuV2::Sub(instr++, targetXnId, targetXnId, xn0);
    1199            0 :             CcuV2::Nop(instr++);
    1200            0 :         }
    1201              :     }; // namespace CcuV2
    1202              : 
    1203              : }; // namespace CcuRep
    1204              : }; // namespace hcomm
        

Generated by: LCOV version 2.0-1