/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
 * CANN Open Software License Agreement Version 2.0 (the "License").
 * Please refer to the License for details. You may not use this file except in compliance with the License.
 * 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 FITNESS FOR A PARTICULAR PURPOSE.
 * See LICENSE in the root of the software repository for the full text of the License.
 */
/*!
 * \file hccl_common.h
 * \brief
 */
#ifndef LIB_HCCL_HCCL_COMMON_H
#define LIB_HCCL_HCCL_COMMON_H

#include <cstdint>
namespace AscendC {
constexpr uint32_t HCCL_GROUP_ID_0 = 0; // communication group id, 0 for only one communication group
using HcclHandle = int8_t;

enum class HcclCMDType { // use enum class to differentiate from enum AicpuComType
    HCCL_CMD_INVALID = 0,
    HCCL_CMD_BROADCAST = 1,
    HCCL_CMD_ALLREDUCE,
    HCCL_CMD_REDUCE,
    HCCL_CMD_SEND,
    HCCL_CMD_RECEIVE,
    HCCL_CMD_ALLGATHER,
    HCCL_CMD_REDUCE_SCATTER,
    HCCL_CMD_ALLTOALLV,
    HCCL_CMD_ALLTOALLVC,
    HCCL_CMD_ALLTOALL,
    HCCL_CMD_GATHER,
    HCCL_CMD_SCATTER,
    HCCL_CMD_BATCH_SEND_RECV,
    HCCL_CMD_BATCH_PUT,
    HCCL_CMD_BATCH_GET,
    HCCL_CMD_ALLGATHER_V,
    HCCL_CMD_REDUCE_SCATTER_V,
    HCCL_CMD_BATCH_WRITE,
    HCCL_CMD_HALF_ALLTOALLV = 20,
    HCCL_CMD_ALL
};

enum HcclReduceOp {
    HCCL_REDUCE_SUM = 0,  // sum
    HCCL_REDUCE_PROD = 1, // prod
    HCCL_REDUCE_MAX = 2,  // max
    HCCL_REDUCE_MIN = 3,  // min
    HCCL_REDUCE_RESERVED  // reserved
};

enum class MC2_BUFFER_LOCATION {
    MC2_BUFFER_TYPE_DEFAULT = 0,
    MC2_BUFFER_TYPE_OUTPUT,
    MC2_BUFFER_TYPE_WINDOW_IN,
    MC2_BUFFER_TYPE_WINDOW_OUT,
    MC2_BUFFER_TYPE_WORKSPACE,
    MC2_BUFFER_TYPE_INPUT,
    MC2_BUFFER_TYPE_COMMOUT,
    MC2_BUFFER_TYPE_END
};

enum HcclServerType { HCCL_SERVER_TYPE_AICPU = 0, HCCL_SERVER_TYPE_CCU = 5, HCCL_SERVER_TYPE_END };

enum class CoreType : uint8_t { DEFAULT, ON_AIV, ON_AIC };

struct HcclServerConfig {
    CoreType type;
    int64_t blockId;
};

enum HcclDataType {
    HCCL_DATA_TYPE_INT8 = 0,      // int8
    HCCL_DATA_TYPE_INT16 = 1,     // int16
    HCCL_DATA_TYPE_INT32 = 2,     // int32
    HCCL_DATA_TYPE_FP16 = 3,      // fp16
    HCCL_DATA_TYPE_FP32 = 4,      // fp32
    HCCL_DATA_TYPE_INT64 = 5,     // int64
    HCCL_DATA_TYPE_UINT64 = 6,    // uint64
    HCCL_DATA_TYPE_UINT8 = 7,     // uint8
    HCCL_DATA_TYPE_UINT16 = 8,    // uint16
    HCCL_DATA_TYPE_UINT32 = 9,    // uint32
    HCCL_DATA_TYPE_FP64 = 10,     // fp64
    HCCL_DATA_TYPE_BFP16 = 11,    // bfp16
    HCCL_DATA_TYPE_INT128 = 12,   // int128
    HCCL_DATA_TYPE_HIF8 = 14,     // hif8
    HCCL_DATA_TYPE_FP8E4M3 = 15,  // fp8e4m3
    HCCL_DATA_TYPE_FP8E5M2 = 16,  // fp8e5m2
    HCCL_DATA_TYPE_FP8E8M0 = 17,  // fp8e8m0
    HCCL_DATA_TYPE_MXFP8 = 18,    // mxfp8
    HCCL_DATA_TYPE_RESERVED = 255 // reserved
};

enum class ScopeType : uint8_t {
    ALL,
    QUEUE,
    BLOCK,

    INVALID_TYPE
};
} // namespace AscendC

#endif // LIB_HCCL_HCCL_COMMON_H