/**
 * Copyright (c) 2026 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.
 */

#include "stable_part_provider.h"

namespace ge {
Status ResolveStablePart(StablePartId id, std::string &output) {
  switch (id) {
    case StablePartId::kChkStatusMacro:
      output =
          "#define OM2_CHK_STATUS(expr, ...)            \\\n"
          "do {                                       \\\n"
          "  const aclError _chk_status = (expr);     \\\n"
          "  if (_chk_status != ACL_SUCCESS) {        \\\n"
          "    return _chk_status;                    \\\n"
          "  }                                        \\\n"
          "} while (false)\n";
      return SUCCESS;
    case StablePartId::kChkNotNullMacro:
      output =
          "#define OM2_CHK_NOTNULL(ptr, ...)            \\\n"
          "do {                                       \\\n"
          "  if ((ptr) == nullptr) {                  \\\n"
          "    return ACL_ERROR_FAILURE;              \\\n"
          "  }                                        \\\n"
          "} while (false)\n";
      return SUCCESS;
    case StablePartId::kChkTrueMacro:
      output =
          "#define OM2_CHK_TRUE(expr, ...)              \\\n"
          "do {                                       \\\n"
          "  if (!(expr)) {                           \\\n"
          "    return ACL_ERROR_FAILURE;              \\\n"
          "  }                                        \\\n"
          "} while (false)\n";
      return SUCCESS;
    case StablePartId::kGetAddrMacro:
      output =
          "#define GET_ADDR(mem_ptr, offset)   \\\n"
          "(reinterpret_cast<void *>(                 \\\n"
          "  reinterpret_cast<uintptr_t>(mem_ptr) +   \\\n"
          "  static_cast<uintptr_t>(offset)))\n";
      return SUCCESS;
    case StablePartId::kMakeGuardMacro:
      output = "#define OM2_MAKE_GUARD(var, callback) const ::om2::ScopeGuard const_guard_##var(callback)\n";
      return SUCCESS;
    case StablePartId::kInterfaceMacros:
      output =
          "#define OM2_CHK_STATUS(expr, ...)            \\\n"
          "do {                                       \\\n"
          "  const aclError _chk_status = (expr);     \\\n"
          "  if (_chk_status != ACL_SUCCESS) {        \\\n"
          "    return _chk_status;                    \\\n"
          "  }                                        \\\n"
          "} while (false)\n"
          "\n"
          "#define OM2_CHK_NOTNULL(ptr, ...)            \\\n"
          "do {                                       \\\n"
          "  if ((ptr) == nullptr) {                  \\\n"
          "    return ACL_ERROR_FAILURE;              \\\n"
          "  }                                        \\\n"
          "} while (false)\n"
          "\n"
          "#define OM2_CHK_TRUE(expr, ...)              \\\n"
          "do {                                       \\\n"
          "  if (!(expr)) {                           \\\n"
          "    return ACL_ERROR_FAILURE;              \\\n"
          "  }                                        \\\n"
          "} while (false)\n"
          "\n"
          "#define OM2_CHK_RT(expr, ...)               \\\n"
          "do {                                       \\\n"
          "  const rtError_t _rt_err = (expr);        \\\n"
          "  if (_rt_err != RT_ERROR_NONE) {          \\\n"
          "    return ACL_ERROR_FAILURE;              \\\n"
          "  }                                        \\\n"
          "} while (false)\n"
          "\n"
          "#define GET_ADDR(mem_ptr, offset)   \\\n"
          "(reinterpret_cast<void *>(                 \\\n"
          "  reinterpret_cast<uintptr_t>(mem_ptr) +   \\\n"
          "  static_cast<uintptr_t>(offset)))\n"
          "\n"
          "#define OM2_MAKE_GUARD(var, callback) const ::om2::ScopeGuard const_guard_##var(callback)\n";
      return SUCCESS;
    case StablePartId::kPointerHelpers:
      output =
          "template<typename T>\n"
          "inline T *PtrAdd(T *const ptr, const size_t max_buf_len, const size_t idx) {\n"
          "  if ((ptr != nullptr) && (idx < max_buf_len)) {\n"
          "    return reinterpret_cast<T *>(ptr + idx);\n"
          "  }\n"
          "  return nullptr;\n"
          "}\n"
          "template<typename TI, typename TO>\n"
          "inline TO *PtrToPtr(TI *const ptr) {\n"
          "  return reinterpret_cast<TO *>(ptr);\n"
          "}\n"
          "inline uint64_t PtrToValue(const void *const ptr) {\n"
          "  return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr));\n"
          "}\n"
          "inline void *ValueToPtr(const uint64_t value) {\n"
          "  return reinterpret_cast<void *>(static_cast<uintptr_t>(value));\n"
          "}\n"
          "\n";
      return SUCCESS;
    case StablePartId::kInterfacePointerHelpers:
      output =
          "template<typename T>\n"
          "inline T *PtrAdd(T *const ptr, const size_t max_buf_len, const size_t idx) {\n"
          "  if ((ptr != nullptr) && (idx < max_buf_len)) {\n"
          "    return reinterpret_cast<T *>(ptr + idx);\n"
          "  }\n"
          "  return nullptr;\n"
          "}\n"
          "template<typename TI, typename TO>\n"
          "inline TO *PtrToPtr(TI *const ptr) {\n"
          "  return reinterpret_cast<TO *>(ptr);\n"
          "}\n"
          "inline uint64_t PtrToValue(const void *const ptr) {\n"
          "  return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr));\n"
          "}\n"
          "inline void *ValueToPtr(const uint64_t value) {\n"
          "  return reinterpret_cast<void *>(static_cast<uintptr_t>(value));\n"
          "}\n"
          "inline uint64_t PtrToU64(const void *ptr) {\n"
          "  return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr));\n"
          "}\n"
          "\n"
          "inline void *ResolveOpAddr(uint32_t mem_src, uint64_t offset,\n"
          "                          void *total_dev_mem_ptr, void *session_scope_mem_ptr,\n"
          "                          void **constants) {\n"
          "  void *base_ptr;\n"
          "  if (mem_src == 0xFFFFFFFFU) {\n"
          "    base_ptr = session_scope_mem_ptr;\n"
          "  } else if (mem_src == 0U) {\n"
          "    base_ptr = total_dev_mem_ptr;\n"
          "  } else {\n"
          "    base_ptr = constants[mem_src - 1U];\n"
          "  }\n"
          "  return GET_ADDR(base_ptr, offset);\n"
          "}\n"
          "\n"
          "extern \"C\" {\n"
          "struct Om2Tensor {\n"
          "  uint64_t device_address;\n"
          "  uint64_t size;\n"
          "  int32_t data_type;\n"
          "  int32_t format;\n"
          "  const int64_t* shape_dims;\n"
          "  uint64_t shape_dims_num;\n"
          "};\n"
          "}\n"
          "\n"
          "template<typename... Args>\n"
          "inline std::vector<uint64_t> FlattenHostArgs(Args&&... args) {\n"
          "  std::vector<uint64_t> buf;\n"
          "  auto append_arg = [&](auto&& arg) {\n"
          "    using T = std::decay_t<decltype(arg)>;\n"
          "    if constexpr (std::is_pointer_v<T>) {\n"
          "      buf.push_back(reinterpret_cast<uint64_t>(arg));\n"
          "    } else if constexpr (std::is_same_v<T, Om2Tensor>) {\n"
          "      buf.push_back(arg.device_address);\n"
          "    } else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {\n"
          "      for (auto d : arg) buf.push_back(static_cast<uint64_t>(d));\n"
          "    } else if constexpr (std::is_integral_v<T>) {\n"
          "      buf.push_back(static_cast<uint64_t>(arg));\n"
          "    } else {\n"
          "      static_assert(sizeof(T) == 0, \"Unsupported type in FlattenHostArgs\");\n"
          "    }\n"
          "  };\n"
          "  (append_arg(std::forward<Args>(args)), ...);\n"
          "  return buf;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kFlattenHostArgs:
      output =
          "extern \"C\" {\n"
          "struct Om2Tensor {\n"
          "  uint64_t device_address;\n"
          "  uint64_t size;\n"
          "  int32_t data_type;\n"
          "  int32_t format;\n"
          "  const int64_t* shape_dims;\n"
          "  uint64_t shape_dims_num;\n"
          "};\n"
          "}\n"
          "\n"
          "template<typename... Args>\n"
          "inline std::vector<uint64_t> FlattenHostArgs(Args&&... args) {\n"
          "  std::vector<uint64_t> buf;\n"
          "  auto append_arg = [&](auto&& arg) {\n"
          "    using T = std::decay_t<decltype(arg)>;\n"
          "    if constexpr (std::is_pointer_v<T>) {\n"
          "      buf.push_back(reinterpret_cast<uint64_t>(arg));\n"
          "    } else if constexpr (std::is_same_v<T, Om2Tensor>) {\n"
          "      buf.push_back(arg.device_address);\n"
          "    } else if constexpr (std::is_same_v<T, std::vector<int64_t>>) {\n"
          "      for (auto d : arg) buf.push_back(static_cast<uint64_t>(d));\n"
          "    } else if constexpr (std::is_integral_v<T>) {\n"
          "      buf.push_back(static_cast<uint64_t>(arg));\n"
          "    } else {\n"
          "      static_assert(sizeof(T) == 0, \"Unsupported type in FlattenHostArgs\");\n"
          "    }\n"
          "  };\n"
          "  (append_arg(std::forward<Args>(args)), ...);\n"
          "  return buf;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kScopeGuard:
      output =
          "class ScopeGuard {\n"
          "  public:\n"
          "    ScopeGuard(const ScopeGuard &) = delete;\n"
          "    ScopeGuard &operator=(const ScopeGuard &) = delete;\n"
          "\n"
          "    explicit ScopeGuard(const std::function<void()> &on_exit_scope)\n"
          "        : on_exit_scope_(on_exit_scope) {}\n"
          "\n"
          "    ~ScopeGuard() {\n"
          "      if (on_exit_scope_) {\n"
          "        try {\n"
          "          on_exit_scope_();\n"
          "        } catch (std::bad_function_call &) {\n"
          "        } catch (...) {\n"
          "        }\n"
          "      }\n"
          "    }\n"
          "\n"
          "  private:\n"
          "    std::function<void()> on_exit_scope_;\n"
          "};\n";
      return SUCCESS;
    case StablePartId::kReadBinaryFileToBuffer:
      output =
          "BinaryBuffer ReadBinaryFileToBuffer(const std::string &file_path) {\n"
          "  BinaryBuffer result;\n"
          "  std::ifstream file(file_path, std::ios::binary | std::ios::ate);\n"
          "  if (!file.is_open()) {\n"
          "    return result;\n"
          "  }\n"
          "  std::streamsize file_size = file.tellg();\n"
          "  if (file_size <= 0) {\n"
          "    return result;\n"
          "  }\n"
          "  result.size = static_cast<size_t>(file_size);\n"
          "  result.data = std::make_unique<uint8_t[]>(result.size);\n"
          "  file.seekg(0, std::ios::beg);\n"
          "  file.read(reinterpret_cast<char *>(result.data.get()), result.size);\n"
          "  if (!file.good()) {\n"
          "    file.close();\n"
          "    result.data.reset();\n"
          "    result.size = 0;\n"
          "  }\n"
          "  return result;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kGenerateJsonFile:
      output =
          "aclError GenerateJsonFile(const AicpuRegisterInfo &register_info, std::string &json_path) {\n"
          "  using namespace std::chrono;\n"
          "  int64_t cur_timestamp = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();\n"
          "  json_path = \"/tmp/temp_ops_info_\" + std::to_string(cur_timestamp) + \".json\";\n"
          "  std::string json_data_format = R\"(\n"
          "{\n"
          "    \"%s\":{\n"
          "        \"opInfo\":{\n"
          "            \"opKernelLib\":\"%s\",\n"
          "            \"kernelSo\":\"%s\",\n"
          "            \"functionName\":\"%s\"\n"
          "        }\n"
          "    }\n"
          "}\n"
          ")\";\n"
          "  char json_data[kMaxJsonFileLen];\n"
          "  auto ret = snprintf_s(json_data, kMaxJsonFileLen, kMaxJsonFileLen - 1U, json_data_format.c_str(),\n"
          "                        register_info.op_type, register_info.op_kernel_lib, register_info.so_name,\n"
          "                        register_info.kernel_name);\n"
          "  OM2_CHK_TRUE(ret >= 0);\n"
          "  std::ofstream ofs(json_path.c_str(), std::ios::trunc);\n"
          "  OM2_CHK_TRUE(ofs);\n"
          "  ofs << json_data;\n"
          "  return ACL_SUCCESS;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kLoadAndRunExternalApis:
      output =
          "aclError Om2ModelCreate(om2::Om2ModelHandle *model_handle, aclmdlRI *rt_model_handle, "
          "const char **bin_files, const void **bin_data, size_t *bin_size, int bin_num, void **constants, "
          "void *work_ptr, uint64_t *session_id, uint32_t model_id, void *instance_handle) {\n"
          "  if ((model_handle == nullptr) || (rt_model_handle == nullptr) || (*model_handle != nullptr)) {\n"
          "    return ACL_ERROR_FAILURE;\n"
          "  }\n"
          "  auto *obj = new om2::Om2Model(bin_files, bin_data, bin_size, bin_num, constants, work_ptr, session_id,\n"
          "                                model_id, instance_handle);\n"
          "  if (obj == nullptr) {\n"
          "    return ACL_ERROR_FAILURE;\n"
          "  }\n"
          "  auto ret = obj->InitResources();\n"
          "  if (ret != ACL_SUCCESS) {\n"
          "    delete obj;\n"
          "    return ret;\n"
          "  }\n"
          "  ret = obj->RegisterKernels();\n"
          "  if (ret != ACL_SUCCESS) {\n"
          "    delete obj;\n"
          "    return ret;\n"
          "  }\n"
          "  *model_handle = reinterpret_cast<om2::Om2ModelHandle>(obj);\n"
          "  *rt_model_handle = obj->GetRtModelHandle();\n"
          "  return ACL_SUCCESS;\n"
          "}\n"
          "\n"
          "aclError Om2ModelLoad(om2::Om2ModelHandle *model_handle) {\n"
          "  if ((model_handle == nullptr) || (*model_handle == nullptr)) {\n"
          "    return ACL_ERROR_FAILURE;\n"
          "  }\n"
          "  return static_cast<om2::Om2Model*>(*model_handle)->Load();\n"
          "}\n"
          "\n"
          "aclError Om2ModelRunAsync(om2::Om2ModelHandle *model_handle, aclrtStream stream, int input_count, "
          "void **input_data, int output_count, void **output_data) {\n"
          "  return static_cast<om2::Om2Model*>(*model_handle)->RunAsync(stream, input_count, input_data, output_count, "
          "output_data);\n"
          "}\n"
          "\n"
          "aclError Om2ModelRun(om2::Om2ModelHandle *model_handle, int input_count, void **input_data, int output_count, "
          "void **output_data, int32_t stream_sync_timeout) {\n"
          "  return static_cast<om2::Om2Model*>(*model_handle)->Run(input_count, input_data, output_count, output_data, stream_sync_timeout);\n"
          "}\n"
          "\n"
          "aclError Om2ModelDestroy(om2::Om2ModelHandle *model_handle) {\n"
          "  delete static_cast<om2::Om2Model*>(*model_handle);\n"
          "  return ACL_SUCCESS;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kInterfaceDumpApis:
      output =
          "struct Om2TaskIoEntry {\n"
          "  const struct Om2Tensor *tensor;\n"
          "  uint64_t offset;\n"
          "};\n"
          "\n"
          "enum Om2L0ArgKind {\n"
          "    OM2_L0_ARG_INPUT = 0,\n"
          "    OM2_L0_ARG_OUTPUT = 1,\n"
          "    OM2_L0_ARG_WORKSPACE = 2,\n"
          "    OM2_L0_ARG_TILING = 3,\n"
          "    OM2_L0_ARG_SHAPE_INFO = 4,\n"
          "    OM2_L0_ARG_LEVEL1_DESC = 5,\n"
          "    OM2_L0_ARG_PLACEHOLDER = 6,\n"
          "    OM2_L0_ARG_CUSTOM_VALUE = 7,\n"
          "    OM2_L0_ARG_FFTS_ADDR = 8,\n"
          "    OM2_L0_ARG_EVENT_ADDR = 9,\n"
          "    OM2_L0_ARG_OVERFLOW_ADDR = 10,\n"
          "    OM2_L0_ARG_EMPTY_ADDR = 11\n"
          "};\n"
          "\n"
          "struct Om2L0ArgSlotInfo {\n"
          "    uint32_t kind;\n"
          "    uint32_t flags;\n"
          "    uint64_t args_offset;\n"
          "    uint64_t value;\n"
          "    uint32_t related_index;\n"
          "    uint32_t event_id;\n"
          "    uint64_t level1_target_offset;\n"
          "};\n"
          "\n"
          "struct Om2L0TaskRawInfo {\n"
          "    uint32_t version;\n"
          "    uint32_t need_assert_or_printf;\n"
          "    uint64_t arg_num;\n"
          "    const struct Om2L0ArgSlotInfo* args;\n"
          "};\n"
          "\n"
          "struct Om2TaskInfo {\n"
          "  const char* op_name;\n"
          "  const char* op_type;\n"
          "  uint32_t task_id;\n"
          "  uint32_t stream_id;\n"
          "  uint32_t context_id;\n"
          "  uint32_t thread_id;\n"
          "  uint32_t block_dim;\n"
          "  uint64_t op_desc_id;\n"
          "  uintptr_t args_base;\n"
          "  uint64_t args_size;\n"
          "  uint64_t input_num;\n"
          "  const struct Om2TaskIoEntry* inputs;\n"
          "  uint32_t output_num;\n"
          "  const struct Om2TaskIoEntry* outputs;\n"
          "  uint32_t workspace_num;\n"
          "  const uint64_t* workspace_addrs;\n"
          "  const uint64_t* workspace_sizes;\n"
          "  uint32_t task_type;\n"
          "  void* stream;\n"
          "  uint32_t is_raw_address;\n"
          "  const struct Om2L0TaskRawInfo* l0_exception_dump_info;\n"
          "};\n"
          "\n"
          "extern \"C\" {\n"
          "__attribute__((weak)) int32_t ReportDfxTaskPreprocess(uint32_t model_id,\n"
          "                                                       void* instance_handle,\n"
          "                                                       const struct Om2TaskInfo* task_info,\n"
          "                                                       const void* extended_attrs,\n"
          "                                                       size_t extended_attrs_size);\n"
          "\n"
          "__attribute__((weak)) int32_t ReportDfxTaskPostprocess(uint32_t model_id,\n"
          "                                                        void* instance_handle,\n"
          "                                                        const struct Om2TaskInfo* task_info,\n"
          "                                                        const void* extended_attrs,\n"
          "                                                        size_t extended_attrs_size);\n"
          "\n"
          "__attribute__((weak)) int32_t IsDataDumpEnabled(uint32_t model_id,\n"
          "                                                      void* instance_handle,\n"
          "                                                      const char* op_name,\n"
          "                                                      uint8_t* is_data_dump);\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kLoadAndRunDumpHelpers:
      output =
          "Om2Tensor BuildOm2Tensor(void *device_address, uint64_t size, int32_t data_type,\n"
          "                         int32_t format, const int64_t *shape_dims, uint64_t shape_dims_num) {\n"
          "  Om2Tensor tensor{};\n"
          "  tensor.device_address = PtrToU64(device_address);\n"
          "  tensor.size = size;\n"
          "  tensor.data_type = data_type;\n"
          "  tensor.format = format;\n"
          "  tensor.shape_dims = shape_dims;\n"
          "  tensor.shape_dims_num = shape_dims_num;\n"
          "  return tensor;\n"
          "}\n"
          "\n"
          "aclError AssembleOm2TaskInfo(Om2TaskInfo *task_info, const char *op_name, const char *op_type,\n"
          "                             uint32_t task_id, uint32_t stream_id, uint32_t block_dim,\n"
          "                             uint64_t op_desc_id, uintptr_t args_base, uint64_t args_size,\n"
          "                             const Om2TaskIoEntry *inputs, uint64_t input_num,\n"
          "                             const Om2TaskIoEntry *outputs, uint32_t output_num,\n"
          "                             const uint64_t *workspace_addrs, const uint64_t *workspace_sizes,\n"
          "                             uint32_t workspace_num, uint32_t task_type, void *stream,\n"
          "                             uint32_t is_raw_address = 0U) {\n"
          "  task_info->op_name = op_name;\n"
          "  task_info->op_type = op_type;\n"
          "  task_info->task_id = task_id;\n"
          "  task_info->stream_id = stream_id;\n"
          "  task_info->context_id = 0U;\n"
          "  task_info->thread_id = 0U;\n"
          "  task_info->block_dim = block_dim;\n"
          "  task_info->op_desc_id = op_desc_id;\n"
          "  task_info->args_base = args_base;\n"
          "  task_info->args_size = args_size;\n"
          "  task_info->input_num = input_num;\n"
          "  task_info->inputs = inputs;\n"
          "  task_info->output_num = output_num;\n"
          "  task_info->outputs = outputs;\n"
          "  task_info->workspace_num = workspace_num;\n"
          "  task_info->workspace_addrs = workspace_addrs;\n"
          "  task_info->workspace_sizes = workspace_sizes;\n"
          "  task_info->task_type = task_type;\n"
          "  task_info->stream = stream;\n"
          "  task_info->is_raw_address = is_raw_address;\n"
          "  task_info->l0_exception_dump_info = nullptr;\n"
          "  return ACL_SUCCESS;\n"
          "}\n"
          "\n"
          "aclError ReportOm2TaskPreprocess(const char *op_name, const char *op_type, uint64_t op_desc_id,\n"
          "                                uintptr_t args_base, uint64_t args_size,\n"
          "                                const std::vector<Om2TaskIoEntry> &inputs,\n"
          "                                const std::vector<Om2TaskIoEntry> &outputs,\n"
          "                                const std::vector<uint64_t> &workspace_addrs,\n"
          "                                const std::vector<uint64_t> &workspace_sizes,\n"
          "                                uint32_t task_type, uint32_t block_dim, void *stream,\n"
          "                                const Om2L0TaskRawInfo *l0_info,\n"
          "                                uint32_t model_id, void *instance_handle,\n"
          "                                uint32_t is_raw_address = 0U) {\n"
          "  uint32_t stream_id = 0U;\n"
          "  OM2_CHK_STATUS(aclrtStreamGetId(stream, reinterpret_cast<int32_t *>(&stream_id)));\n"
          "\n"
          "  OM2_CHK_TRUE(workspace_addrs.size() == workspace_sizes.size());\n"
          "\n"
          "  Om2TaskInfo task_info{};\n"
          "  OM2_CHK_STATUS(AssembleOm2TaskInfo(&task_info, op_name, op_type, 0U, stream_id, block_dim,\n"
          "                                      op_desc_id, args_base, args_size,\n"
          "                                      inputs.data(), static_cast<uint64_t>(inputs.size()),\n"
          "                                      outputs.data(), static_cast<uint32_t>(outputs.size()),\n"
          "                                      workspace_addrs.empty() ? nullptr : workspace_addrs.data(),\n"
          "                                      workspace_sizes.empty() ? nullptr : workspace_sizes.data(),\n"
          "                                      static_cast<uint32_t>(workspace_addrs.size()),\n"
          "                                      task_type, stream, is_raw_address));\n"
          "  task_info.l0_exception_dump_info = l0_info;\n"
          "  if (ReportDfxTaskPreprocess != nullptr && instance_handle != nullptr) {\n"
          "    OM2_CHK_STATUS(ReportDfxTaskPreprocess(model_id, instance_handle, &task_info, nullptr, 0U));\n"
          "  }\n"
          "  return ACL_SUCCESS;\n"
          "}\n"
          "\n"
          "aclError ReportLaunchedOm2Task(const char *op_name, const char *op_type, uint64_t op_desc_id,\n"
          "                               uintptr_t args_base, uint64_t args_size,\n"
          "                               const Om2TaskIoEntry *inputs, uint64_t input_num,\n"
          "                               const Om2TaskIoEntry *outputs, uint32_t output_num,\n"
          "                               const uint64_t *workspace_addrs, const uint64_t *workspace_sizes,\n"
          "                               uint32_t workspace_num,\n"
          "                               uint32_t task_type, uint32_t block_dim, void *stream,\n"
          "                               uint32_t model_id, void *instance_handle,\n"
          "                               uint32_t is_raw_address = 0U) {\n"
          "  uint32_t task_id = 0U;\n"
          "  OM2_CHK_RT(aclrtGetThreadLastTaskId(&task_id));\n"
          "\n"
          "  uint32_t stream_id = 0U;\n"
          "  OM2_CHK_STATUS(aclrtStreamGetId(stream, reinterpret_cast<int32_t *>(&stream_id)));\n"
          "\n"
          "  Om2TaskInfo task_info{};\n"
          "  OM2_CHK_STATUS(AssembleOm2TaskInfo(&task_info, op_name, op_type, task_id, stream_id, block_dim,\n"
          "                                      op_desc_id, args_base, args_size,\n"
          "                                      inputs, input_num,\n"
          "                                      outputs, output_num,\n"
          "                                      workspace_addrs, workspace_sizes, workspace_num,\n"
          "                                      task_type, stream, is_raw_address));\n"
          "  task_info.l0_exception_dump_info = nullptr;\n"
          "  if (ReportDfxTaskPostprocess != nullptr && instance_handle != nullptr) {\n"
          "    OM2_CHK_STATUS(ReportDfxTaskPostprocess(model_id, instance_handle, &task_info, nullptr, 0U));\n"
          "  }\n"
          "  return ACL_SUCCESS;\n"
          "}\n"
          "\n"
          "uint8_t GetIsDataDump(const char *op_name, uint32_t model_id, void *instance_handle) {\n"
          "  if (IsDataDumpEnabled != nullptr && instance_handle != nullptr) {\n"
          "    uint8_t is_data_dump = 0U;\n"
          "    auto ret = IsDataDumpEnabled(model_id, instance_handle, op_name, &is_data_dump);\n"
          "    return ret == 0 ? is_data_dump : 0U;\n"
          "  }\n"
          "  return 0U;\n"
          "}\n";
      return SUCCESS;
    case StablePartId::kCreateLabelListForLabelSwitch:
      output = 
              "aclError Om2Model::CreateLabelListForLabelSwitch(uint32_t op_index, std::vector<uint32_t> label_list_indexs)\n"
              "{\n"
              "  label_switch_label_list_[op_index] = nullptr;\n"
              "  uint32_t label_used_size = label_list_indexs.size();\n"
              "  label_used_.resize(label_used_size, nullptr);\n"
              "  for (uint32_t i = 0; i < label_used_size; i++) {\n"
              "    label_used_[i] = label_list_[label_list_indexs[i]];\n"
              "  }\n"
              "  OM2_CHK_STATUS(aclrtCreateLabelList(label_used_.data(), label_used_.size(), &(label_switch_label_list_[op_index])));\n"
              "  return ACL_SUCCESS;\n"
              "}\n";
      return SUCCESS;
    case StablePartId::kCreateLabelListForLabelGotoEx:
      output =
              "aclError Om2Model::CreateLabelListForLabelGotoEx(uint32_t op_index, uint32_t label_index)\n"
              "{\n"
              "  label_goto_ex_label_list_[op_index] = nullptr;\n"
              "  const auto it = label_goto_args_.find(label_index);\n"
              "  if (it != label_goto_args_.cend()) {\n"
              "    label_goto_ex_label_list_[op_index] = it->second.first;\n"
              "  } else {\n"
              "    label_used_.resize(1, nullptr);\n"
              "    label_used_[0] = label_list_[static_cast<size_t>(label_index)];\n"
              "    OM2_CHK_STATUS(aclrtCreateLabelList(label_used_.data(), label_used_.size(), &(label_goto_ex_label_list_[op_index])));\n"
              "    label_goto_args_[label_index] = {label_goto_ex_label_list_[op_index], static_cast<uint32_t>(sizeof(rtLabelDevInfo))};\n"
              "  }\n"
              "  return ACL_SUCCESS;\n"
              "}\n";
      return SUCCESS;
    case StablePartId::kOpDefStructs:
      output =
          "// 算子分发类型枚举\n"
          "enum OpDispatchType : uint32_t {\n"
          "    DISPATCH_AICORE = 0,        // AI Core / AICPU 算子执行\n"
          "};\n"
          "\n"
          "// 算子参数类型枚举\n"
          "enum OpArgType : int32_t {\n"
          "    OP_ARG_INPUT = 0,          // 输入张量\n"
          "    OP_ARG_OUTPUT = 1,         // 输出张量\n"
          "    OP_ARG_WORKSPACE = 2,      // 工作空间\n"
          "    OP_ARG_CONST_TENSOR = 3,   // 常量张量\n"
          "    OP_ARG_LEVEL1_DESC = 4,    // Level1 描述符\n"
          "    OP_ARG_SHAPE_INFO = 5,     // Shape 信息\n"
          "    OP_ARG_CUSTOM_VALUE = 6,   // 自定义值\n"
          "    OP_ARG_PLACEHOLDER = 7,    // 占位符\n"
          "    OP_ARG_OPTIONAL_EMPTY = 8, // 可选空参数\n"
          "    OP_ARG_FFTS_ADDR = 9,      // FFTS 地址\n"
          "    OP_ARG_EVENT_ADDR = 10,    // 事件地址\n"
          "    OP_ARG_OVERFLOW_ADDR = 11, // 溢出地址\n"
          "    OP_ARG_TILING = 12,        // Tiling 数据\n"
          "    OP_ARG_RAW_ADDR = 13,      // 原始地址\n"
          "};\n"
          "\n"
          "// 算子参数信息结构体\n"
          "struct OpArgInfo {\n"
          "  int32_t type;                      // 参数类型(OpArgType,switch 条件)\n"
          "  struct {                           // 地址解析(INPUT/OUTPUT/WORKSPACE/CONST_TENSOR)\n"
          "    uint32_t mem_src;                // 内存来源(0=设备内存,0xFFFFFFFF=session,≥1=常量数组索引)\n"
          "    uint64_t offset;                 // 内存偏移量\n"
          "  } addr;\n"
          "  union {\n"
          "    struct {                         // Tensor 元数据(INPUT/OUTPUT)\n"
          "      uint64_t size;                 // 数据大小(字节),WORKSPACE 也用此字段\n"
          "      int32_t data_type;             // 数据类型\n"
          "      int32_t format;                // 数据格式\n"
          "      int64_t shape[8];              // Shape 维度数组(最多8维)\n"
          "      uint32_t num_shape_dims;       // 实际 shape 维度数\n"
          "      uint64_t args_offset;          // args table 内字节偏移\n"
          "    } tensor;\n"
          "    uint64_t custom_value;           // 自定义值(LEVEL1_DESC/SHAPE_INFO/CUSTOM_VALUE/EVENT_ADDR)\n"
          "    struct {                         // Tiling 数据(TILING)\n"
          "      const uint8_t *raw_data;       // 原始数据指针\n"
          "      uint32_t raw_data_len;         // 原始数据长度\n"
          "    } tiling;\n"
          "  } data;\n"
          "};\n"
          "\n"
          "// 算子定义结构体\n"
          "struct OpDef {\n"
          "  OpDispatchType dispatch_type;   // 分发类型,决定走哪个 case 分支\n"
          "  const char *op_name;            // 算子名称,用于日志和 Report 上报\n"
          "  const OpArgInfo *argsInfo;           // 参数信息数组,地址解析时遍历\n"
          "  // 各 task 专属数据下沉到 union(后续适配其他 task 时再增加对应成员)\n"
          "  union {\n"
          "    struct {                      // AICORE 专属 (kernel_type=0)\n"
          "      const char *op_type;        // 算子类型名,用于 Report 上报\n"
          "      uint32_t num_io_addrs;      // IO 地址数量,控制地址解析循环次数\n"
          "      uint32_t args_idx;          // 参数表索引,用于 GetArgsInfo 查找\n"
          "      struct {                    // Launch 配置,构建 LaunchKernelConfig → AssembleLaunchConfig\n"
          "        uint8_t schedule_mode;    // 调度模式\n"
          "        uint32_t engine_type;     // 引擎类型\n"
          "        uint32_t block_dim_offset;// BlockDim 偏移量\n"
          "        bool is_block_task_prefetch; // 是否预取 Block Task\n"
          "        uint16_t time_out;        // 超时时间\n"
          "        uint32_t local_memory_size;  // 本地内存大小\n"
          "      } launch;\n"
          "      struct {                    // Kernel 执行参数,传给 KernelTaskDistribute\n"
          "        uint32_t block_dim;       // Block 维度\n"
          "        uint32_t func_idx;        // 函数句柄索引,用于查找 func_handles\n"
          "      } kernel;\n"
          "      struct {                    // L0 信息,构建 Om2L0TaskRawInfo\n"
          "        uint32_t need_assert_or_printf; // 是否需要 assert/printf\n"
          "        uint32_t num_l0_slots;    // L0 slot 数量\n"
          "        const Om2L0ArgSlotInfo *l0_slots; // L0 slot 信息数组\n"
          "      } l0;\n"
          "    } aicore;\n"
          "    struct {  // AICPU 专属(共享 DISPATCH_AICORE, kernel_type=1)\n"
          "      uint32_t kernel_type;\n"
          "      uint32_t args_idx;\n"
          "      uint32_t num_io_addrs;\n"
          "      uint32_t func_idx;\n"
          "      uint32_t block_dim;\n"
          "      uint8_t schedule_mode;\n"
          "      uint32_t engine_type;\n"
          "      uint32_t block_dim_offset;\n"
          "      bool is_block_task_prefetch;\n"
          "      uint16_t time_out;\n"
          "      uint32_t local_memory_size;\n"
          "      uint32_t ext_info_len;\n"
          "      int32_t session_info_offset;\n"
          "      uint32_t aicpu_task_index;\n"
          "      uint32_t task_type;\n"
          "    } aicpu;\n"
          "  } task_data;\n"
          "};\n"
          "\n"
          "// 算子分发上下文结构体\n"
          "struct DispatchOpContext {\n"
          "  void *total_dev_mem_ptr;   // 设备总内存指针\n"
          "  void *session_scope_mem_ptr; // Session 作用域内存指针\n"
          "  void **constants;          // 常量数组\n"
          "  Om2ArgsTable &args_table;  // 参数表\n"
          "  aclrtFuncHandle *func_handles; // 函数句柄数组\n"
          "  aclrtStream stream;        // 执行流\n"
          "  uint32_t model_id;         // 模型 ID\n"
          "  void *instance_handle;     // 实例句柄\n"
          "  std::map<uint32_t, void *> &event_id_mem_map; // 事件 ID 到内存的映射\n"
          "  std::vector<void *> &dev_dynamic_mem_ptrs; // 设备动态内存指针列表\n"
          "  void *overflow_addr;       // 溢出地址\n"
          "};\n"
          "\n";
      return SUCCESS;
    default:
      output.clear();
      return FAILED;
  }
}
}  // namespace ge