# -------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This file is part of the MindStudio project.
#
# MindStudio is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#    http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# -------------------------------------------------------------------------

import struct


class StructFmt:
    """
    struct format constant
    """

    BYTE_ORDER_CHAR = '='
    AICORE_FMT_SIZE = 128
    AICORE_FMT = 'BBHHHII10Q8I'
    AICORE_SAMPLE_FMT_SIZE = 96
    AICORE_SAMPLE_V6_FMT_SIZE = 112
    AICORE_SAMPLE_FMT = 'BBHHH8QQQBB6B'
    AICORE_SAMPLE_V6_FMT = 'BBHHH10QQQBB6B'
    AIV_SAMPLE_FMT_SIZE = 96
    AIV_SAMPLE_FMT = 'BBHHH8QQQBB6B'
    AIV_FMT_SIZE = 128
    AIV_FMT = 'BBHHHIIqqqqqqqqqqIIIIIIII'
    TSCPU_FMT_SIZE = 304
    TSCPU_FMT = "LL20QLLQQ14Q"
    MDC_TSCPU_FMT_SIZE = 184
    MDC_TSCPU_FMT = "LL20LLLQ10Q"
    DDR_FMT_SIZE = 20
    DDR_FMT = "LLLLL"
    PCIE_FMT = "Q22I"
    PCIE_FMT_SIZE = 96
    HBM_FMT = "QQII"
    HBM_FMT_SIZE = 24
    QOS_FMT = "2I2Q10I"
    QOS_FMT_SIZE = 64
    LLC_FMT = 'QQII'
    LLC_FMT_SIZE = 24
    STEP_TRACE_FMT = "BBHLQQQHHHH"
    STEP_TRACE_FMT_SIZE = 40
    STEP_TRACE_V6_FMT = "BBHLQQQHHI"
    ACL_FMT = "HHIQQII64s4Q"
    ACL_FMT_SIZE = 128
    RTS_TRACK_FMT = "HHIQ32sHHHHQ"
    RTS_TRACK_FMT_SIZE = 64
    L2_CACHE_STRUCT_FMT = "HHHH8Q"
    L2_CACHE_SAMPLE_STRUCT_FMT = "BBH4B8QQ"
    L2_CACHE_SAMPLE_SIZE = 80
    L2_CACHE_DATA_SIZE = 72
    UB_FMT = "4H15Q"
    UB_FMT_SIZE = 128
    CCU_MISSION_FMT = "16HQHQQ3H"
    CCU_MISSION_FMT_SIZE = 64
    CCU_CHANNEL_FMT = "704I"
    CCU_CHANNEL_FMT_SIZE = 2816
    # ccu_add_info, three ccu host info struct lens all is 256, Initial "6I" is header, and the sequent 232B is data.
    # 256B is not fully occupied by reasonable data, so use n * B to occupy it.
    # this data struct is weird, for the "I" after "6I4B" make no sense, but it existed, so occupied with "I".
    CCU_TASK_INFO_FMT_SIZE = 256
    CCU_TASK_INFO_FMT = "6I4BIQQIIHHIBBH188B"
    CCU_WAIT_SIGNAL_INFO_FMT_SIZE = 256
    CCU_WAIT_SIGNAL_INFO_FMT = "6I4BIQQIIBBHIBBH4BII16H16I80B"
    CCU_GROUP_INFO_FMT_SIZE = 256
    CCU_GROUP_INFO_FMT = "6I4BIQQIIBBHIBBH4BQ16H16I80B"
    BIU_PERF_FMT = "HH"
    BIU_PERF_FMT_SIZE = 4
    SOC_PMU_FMT = "8B4H8Q"
    SOC_PMU_CHIP6_FMT = "6B3HI8Q"
    SOC_PMU_FMT_SIZE = 80
    STREAM_EXPAND_FMT = "2H3IQ4B9I"
    STREAM_EXPAND_FMT_SIZE = 64

    # binary data struct fmt
    API_CALL_FMT = "QQLLLLLL"
    TIME_LINE_FMT = "BBHLHHHHQLL"
    TS_MEMCPY_FMT = "BBHLQHHBBHQQ"
    TS_TASK_TYPE_FMT = "BBHLQHHHBBQQ"
    EVENT_COUNT_FMT = "BBHLHHHHQ8QQQH3H"
    HWTS_LOG_FMT = 'BBHHHQ12I'
    AIC_PMU_FMT = 'BBHHHII10Q8I'
    DEVICE_TASK_FLIP = 'BBHLQHHHH16B'
    TS_BLOCK_DIM_FMT = 'BBHLQHHL16B'

    # stars
    ACSQ_TASK_FMT = "4HQHH11L"
    STARS_PCIE_FMT = "HHLQHBB3LQQ4L"
    ACC_PMU_FMT = "HHLQHH3L4Q"
    SOC_FMT = "HHLQ4LHH7L"
    SIO_FMT = "HHIQHH11I"
    V6_SIO_FMT = "BBHIQQ10I"
    FFTS_PMU_FMT = "4HQ4HQ12Q"
    FFTS_BLOCK_PMU_FMT = "4HQ2HBBHLHH12Q"
    FFTS_LOG_FMT = "HHHHQHHBBH10L"
    FFTS_PLUS_LOG_FMT = "4HQ4H10L"
    LPS_FMT = "HHLQ12LHHLQ12LHHLQ12L"
    LPE_FMT = "HHLQQLL8L"
    STARS_FMT = "HHLQ12L"
    CHIP_TRANS_FMT = "2HLQ2H3L2Q4L"
    CHIP_TRANS_V6_FMT = "2HI3Q8L"
    LOWPOWER_FMT = "HHLQQ20H"
    ACSQ_TASK_V6_FMT = "4HQHH3L"
    BLOCK_LOG_FMT = "4HQBBHBB3HL"
    PMU_BLOCK_FMT = "4HQ2BH2B3HL12Q"
    STARS_QOS_FMT = "HHLQQ10L"

    # other fmt
    STARS_HEADER_FMT = "=HH"
    RUNTIME_HEADER_FMT = "=BBH"
    STEP_HEADER_FMT = "=BB"
    HELPER_HEADER_FMT = "=HH"
    RUNTIME_RESERVED_FMT = "L"
    RUNTIME_API_FMT = "2HI3Q64s3I20HH106B"
    RUNTIME_API_FMT_SIZE = 256
    AI_CPU_FMT = 'HHHHQQQQQQQIIQQQQIIIHBBQ'
    AI_CPU_FMT_SIZE = 128
    AI_CPU_NODE_ADD_FMT = 'HHIIIQHHIQQQQQQQIIQQQQIIIHBB14Q'
    AI_CPU_DP_ADD_FMT = 'HHIIIQ16s64sQQ2Q15Q'
    AI_CPU_MODEL_ADD_FMT = 'HHIIIQQIHHQ26Q'
    AI_CPU_MI_ADD_FMT = 'HHIIIQIIQQQ25Q'
    AI_CPU_ADD_FMT_SIZE = 256
    TASK_NUM_OFFSET = struct.calcsize(BYTE_ORDER_CHAR + API_CALL_FMT[:-1])

    # msproftx
    MSPROFTX_FMT = 'HH3IQ2HI2H4Ii5Qi156s'
    MSPROFTX_FMT_SIZE = struct.calcsize(BYTE_ORDER_CHAR + MSPROFTX_FMT)

    # ge
    GE_TASK_SIZE = 256
    GE_TENSOR_FMT = "HHIQIHHI55IQ"
    GE_TENSOR_SIZE = 256
    GE_STEP_FMT = "HHIIHHQQIB27B"
    GE_STEP_SIZE = 64
    GE_SESSION_FMT = "HHIIIQH6B"
    GE_SESSION_SIZE = 32
    GE_LOGIC_STREAM_INFO_FMT = "HHIIIQII56I"
    GE_LOGIC_STREAM_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + GE_LOGIC_STREAM_INFO_FMT)

    # ge fusion
    GE_FUSION_PRE_FMT = "HHI8B"
    GE_FUSION_PRE_SIZE = 16
    GE_MODEL_LOAD_SIZE = 256
    GE_MODEL_TIME_SIZE = 256
    GE_FUSION_OP_SIZE = 256
    GE_HOST_FMT = 'HHL4Q3Q'
    GE_HOST_FMT_SIZE = struct.calcsize(BYTE_ORDER_CHAR + GE_HOST_FMT)

    # helper
    HELPER_MODEL_WITH_Q_FMT = "HHIQQIHHQ24B"
    HELPER_MODEL_WITH_Q_FMT_SIZE = struct.calcsize(BYTE_ORDER_CHAR + HELPER_MODEL_WITH_Q_FMT)

    # biu perf
    FLOW_FMT = "HHTTTTTTQH"
    CYCLES_FMT = "ttttttttttH"

    # npu mem
    NPU_MEM_FMT = "IIQQQ"
    NPU_MEM_DATA_SIZE = 32

    # freq
    FREQ_LPM_DATA_COUNT = 55
    FREQ_FMT = "II" + "QII" * FREQ_LPM_DATA_COUNT
    FREQ_DATA_SIZE = struct.calcsize(FREQ_FMT)

    # lpm
    LPM_INFO_DATA_COUNT = 55
    LPM_INFO_FMT = "II" + "QII" * LPM_INFO_DATA_COUNT
    LPM_INFO_DATA_SIZE = struct.calcsize(LPM_INFO_FMT)

    # new struct
    API_FMT = "HHIIIQQQ"
    EVENT_FMT = "HHIIIQQQ"
    API_EVENT_FMT = "HHIIIQQQ"
    GRAPH_ADD_INFO_FMT = "HHIIIQQ56I"
    GRAPH_ADD_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + GRAPH_ADD_INFO_FMT)
    TENSOR_ADD_INFO_FMT = "HHIIIQQI55I"
    TENSOR_ADD_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + TENSOR_ADD_INFO_FMT)
    NODE_BASIC_INFO_FMT = "HHIIIQQIQIIQI"
    NODE_BASIC_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + NODE_BASIC_INFO_FMT)
    NODE_ATTR_INFO_FMT = "HHIIIQQIQIQQ"
    NODE_ATTR_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + NODE_ATTR_INFO_FMT)
    FUSION_ADD_INFO_FMT = "HHIIIQQI13Q29I"
    FUSION_ADD_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + FUSION_ADD_INFO_FMT)
    CTX_ID_FMT = "HHIIIQQI55I"
    CTX_ID_SIZE = struct.calcsize(BYTE_ORDER_CHAR + CTX_ID_FMT)
    MEMORY_APPLICATION_FMT = "HHIIIQQQQQQss"
    MEMORY_APPLICATION_SIZE = struct.calcsize(BYTE_ORDER_CHAR + MEMORY_APPLICATION_FMT)
    MEMORY_OP_FMT = "HHIIIQQqQQQII184B"
    MEMORY_OP_SIZE = struct.calcsize(MEMORY_OP_FMT)
    STATIC_OP_MEM_FMT = "3Qq5QI180B"
    STATIC_OP_MEM_SIZE = struct.calcsize(STATIC_OP_MEM_FMT)
    NPU_MODULE_MEM_FMT = "IIQQ"
    NPU_MODULE_MEM_SIZE = struct.calcsize(NPU_MODULE_MEM_FMT)

    # compact hccl op info
    HCCL_OP_INFO_RESIDUAL_SIZE = 14
    HCCL_OP_INFO_FMT = "HHIIIQBBQQQ" + "B" * HCCL_OP_INFO_RESIDUAL_SIZE
    HCCL_OP_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + HCCL_OP_INFO_FMT)

    # compact runtime
    TASK_TRACK_RESIDUAL_SIZE = 16
    TASK_TRACK_FMT = "HHIIIQHHHHQQ" + "B" * TASK_TRACK_RESIDUAL_SIZE
    TASK_TRACK_DATA_SIZE = struct.calcsize(TASK_TRACK_FMT)

    # capture
    CAPTURE_STREAM_INFO_RESIDUAL_SIZE = 32
    CAPTURE_STREAM_INFO_FMT = "HHIIIQHHHH" + "B" * CAPTURE_STREAM_INFO_RESIDUAL_SIZE
    CAPTURE_STREAM_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + CAPTURE_STREAM_INFO_FMT)

    MEMCPY_INFO_RESIDUAL_SIZE = 30
    MEMCPY_INFO_FMT = "HHIIIQQH" + "B" * MEMCPY_INFO_RESIDUAL_SIZE
    MEMCPY_INFO_DATA_SIZE = struct.calcsize(MEMCPY_INFO_FMT)
    MULTI_THREAD_FMT = "HHIIIQI25I16Q"
    MULTI_THREAD_FMT_SIZE = struct.calcsize(MULTI_THREAD_FMT)

    HCCL_INFO_FMT = "HHIII4Q6IQ2Id3Q6I112B"
    HCCL_INFO_FMT_SIZE = struct.calcsize(HCCL_INFO_FMT)

    # mc2
    MC2_COMM_INFO_FMT = "HHIIIQQ56I"
    MC2_COMM_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + MC2_COMM_INFO_FMT)
    KFC_HCCL_INFO_FMT = "HHIIIQ3Q4I2Qd3Q2I2H16B3Q4I2Qd3Q2I2H16B"
    KFC_HCCL_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + KFC_HCCL_INFO_FMT)
    KFC_COMM_TURN_FMT = "HHIII9QIHH8B38I"
    KFC_COMM_TURN_SIZE = struct.calcsize(BYTE_ORDER_CHAR + KFC_COMM_TURN_FMT)
    KFC_COMPUTE_TURN_FMT = "HHIII5QIHH8B46I"
    KFC_COMPUTE_TURN_SIZE = struct.calcsize(BYTE_ORDER_CHAR + KFC_COMPUTE_TURN_FMT)
    DEVICE_HCCL_OP_INFO_FMT = "HHIIIQBBQQQIHI" + "196B"
    DEVICE_HCCL_OP_INFO_SIZE = struct.calcsize(BYTE_ORDER_CHAR + DEVICE_HCCL_OP_INFO_FMT)
    AICPU_FLIP_TASK_FMT = "HHIIIQHHI" + "224B"
    AICPU_FLIP_TASK_SIZE = struct.calcsize(BYTE_ORDER_CHAR + AICPU_FLIP_TASK_FMT)
    AICPU_MASTER_STREAM_HCCL_TASK_FMT = "HHIIIQHHHHH" + "222B"
    AICPU_MASTER_STREAM_HCCL_TASK_SIZE = struct.calcsize(BYTE_ORDER_CHAR + AICPU_MASTER_STREAM_HCCL_TASK_FMT)

    # runtime
    RUNTIME_OP_INFO_FMT = "HHIIIQIIIIIIQQII" # 到tensor_num
    RUNTIME_OP_INFO_WITHOUT_HEAD_FMT = "IIIIIIQQII"
    RUNTIME_OP_INFO_256_FMT = RUNTIME_OP_INFO_FMT + "46I"
    RUNTIME_OP_INFO_TENSOR_FMT = "11I"
    RUNTIME_OP_INFO_BODY_SIZE = struct.calcsize(BYTE_ORDER_CHAR + RUNTIME_OP_INFO_FMT)
    RUNTIME_OP_INFO_WITHOUT_HEAD_SIZE = struct.calcsize(BYTE_ORDER_CHAR + RUNTIME_OP_INFO_WITHOUT_HEAD_FMT)
    RUNTIME_OP_INFO_256_SIZE = struct.calcsize(BYTE_ORDER_CHAR + RUNTIME_OP_INFO_256_FMT)
    RUNTIME_OP_INFO_TENSOR_SIZE = struct.calcsize(BYTE_ORDER_CHAR + RUNTIME_OP_INFO_TENSOR_FMT)

    @staticmethod
    def class_name() -> str:
        """
        class name
        """
        return "StructFmt"

    @staticmethod
    def file_name() -> str:
        """
        file name
        """
        return "data_struct_size_constant"