#ifndef __TILINGDATA_HEADER__
#define __TILINGDATA_HEADER__
#include "kernel_tiling/kernel_tiling.h"
#ifdef ASCENDC_CPU_DEBUG
#include "kernel_log.h"
#else
#ifndef __aicore__
#define __aicore__ [aicore]
#endif
#endif
class TilingData_A
{
public:
    uint32_t A_xxx1 = 0;
    uint32_t A_xxx2 = 0;
    uint32_t totalLength = 0;
    uint32_t tileNum = 0;
};

class TilingData_B
{
public:
    uint32_t B_xxx1 = 0;
    uint32_t B_xxx2 = 0;
    TilingData_A A_in_B;
};

class TilingData_C
{
public:
    uint32_t C_xxx1 = 0;
    uint32_t C_xxx2 = 0;
    TilingData_B B_in_C;
};

class TilingData_E
{
public:
    uint32_t E_xxx1 = 0;
    uint32_t E_xxx2 = 0;
    TilingData_B B_in_E;
};

class TilingData_D
{
public:
    uint32_t D_xxx1 = 0;
    uint8_t C_in_DPH[4] = {};
    TilingData_C C_in_D;
    uint32_t D_xxx2 = 0;
    uint8_t E_in_DPH[4] = {};
    TilingData_E E_in_D;
};

class TilingData_D2
{
public:
__aicore__  __inline__ __attribute__ ((always_inline)) TilingData_D2 () { }
    uint32_t totalLength;
    uint8_t D_in_tilingPH[4];
    TilingData_D D_in_tiling;
    uint32_t tileNum;
    uint8_t TilingData_D2PH[4];
}__attribute__((__may_alias__));

class TilingData
{
public:
    uint32_t totalLength = 0;
    uint8_t D_in_tilingPH[4] = {0, 0, 0, 0};
    TilingData_D D_in_tiling = {0, {0, 0, 0, 0}, {0, 0, {0, 0, {0, 0, 16384, 8, }, }, }, 0, {0, 0, 0, 0}, {0, 0, {0, 0, {0, 0, 0, 0, }, }, }, };
    uint32_t tileNum = 0;
    uint8_t TilingDataPH[4] = {0, 0, 0, 0};
};

#ifdef ASCENDC_TIME_STAMP_ON
#define GET_TILING_DATA(tiling_data, tiling_arg)                                     \
    const TilingData tiling_data;                                      \
    AscendC::PrintTimeStamp(static_cast<uint32_t>(AscendC::TimeStampId::TIME_STAMP_TILING_DATA));

#define GET_TILING_DATA_WITH_STRUCT(tiling_struct, tiling_data, tiling_arg)          \
    const tiling_struct tiling_data;                                                 \
    AscendC::PrintTimeStamp(static_cast<uint32_t>(AscendC::TimeStampId::TIME_STAMP_TILING_DATA_STRUCT));

#define GET_TILING_DATA_MEMBER(tiling_type, member, var, tiling)                     \
    const tiling_type point##var;                                                    \
    auto& var = point##var.member;                                                   \
    AscendC::PrintTimeStamp(static_cast<uint32_t>(AscendC::TimeStampId::TIME_STAMP_TILING_DATA_MEMBER));

#else
#define GET_TILING_DATA(tiling_data, tiling_arg)                                           \
    const TilingData tiling_data;

#define GET_TILING_DATA_WITH_STRUCT(tiling_struct, tiling_data, tiling_arg)                \
    const tiling_struct tiling_data;

#define GET_TILING_DATA_MEMBER(tiling_type, member, var, tiling)                           \
    const tiling_type point##var;                                                          \
    auto& var = point##var.member;

#endif
#endif // __TILINGDATA_HEADER__