# SPDX-License-Identifier: MIT
# Copyright (C) 2024-2025 Advanced Micro Devices, Inc. All rights reserved.
PROJECT(cpp_api)

set(AIE2_TESTNAME "aie2_cpp")
add_executable(${AIE2_TESTNAME} aie2_test.cpp)
target_link_libraries(${AIE2_TESTNAME} PRIVATE aiebu_static)
target_include_directories(${AIE2_TESTNAME} PRIVATE ${AIEBU_SOURCE_DIR}/src/cpp/include)

set(AIE2PS_TESTNAME "aie2ps_cpp")
set(CHECKSUMS_FILE "${CMAKE_CURRENT_BINARY_DIR}/checksums.txt")
add_executable(${AIE2PS_TESTNAME} aie2ps_test.cpp)
target_link_libraries(${AIE2PS_TESTNAME} PRIVATE aiebu_static)
target_include_directories(${AIE2PS_TESTNAME} PRIVATE ${AIEBU_SOURCE_DIR}/src/cpp/include)

set(AIE2_FULLELF_TESTNAME "aie2_full_elf_cpp")
add_executable(${AIE2_FULLELF_TESTNAME} aie2_full_elf_test.cpp)
target_link_libraries(${AIE2_FULLELF_TESTNAME} PRIVATE aiebu_static)
target_include_directories(${AIE2_FULLELF_TESTNAME} PRIVATE ${AIEBU_SOURCE_DIR}/src/cpp/include)

set(AIE4_SAVETIMESTAMPS_TESTNAME "aie4_savetimestamps_cpp")
add_executable(${AIE4_SAVETIMESTAMPS_TESTNAME} aie4_savetimestamps_test.cpp)
target_link_libraries(${AIE4_SAVETIMESTAMPS_TESTNAME} PRIVATE aiebu_static)
target_include_directories(${AIE4_SAVETIMESTAMPS_TESTNAME} PRIVATE
  ${AIEBU_SOURCE_DIR}/src/cpp/include
  ${AIEBU_ELFIO_SRC_DIR})
if (NOT WIN32)
  target_link_libraries(${AIE4_SAVETIMESTAMPS_TESTNAME} PRIVATE pthread)
endif()


if (NOT WIN32)
  target_link_libraries(${AIE2_TESTNAME} PRIVATE pthread)
  target_link_libraries(${AIE2PS_TESTNAME} PRIVATE pthread)
endif()

add_custom_command(OUTPUT ctrl_pkt0.bin
  COMMAND ${CMAKE_COMMAND} -P "${AIEBU_SOURCE_DIR}/cmake/b64.cmake" -d "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket/ctrl_pkt/ctrl_pkt0.b64" ctrl_pkt0.bin
  # COMMAND ${CMAKE_COMMAND} -E copy "ctrl_pkt0.bin" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket/ctrl_pkt/"
  DEPENDS "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket/ctrl_pkt/ctrl_pkt0.b64"
  COMMENT "Decoding base64 ctrlcode and ctrlpkt to binary in ${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  VERBATIM)

add_custom_target(aie2psbins ALL
  DEPENDS ctrl_pkt0.bin)

add_test(NAME "aie2ps_cpp_eff_net_coal"
  COMMAND ${AIE2PS_TESTNAME} "eff_net_coal" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_coal/"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

#add_test(NAME "aie4_move_ddr_to_memtile_ctrlpkt"
#  COMMAND ${AIE2PS_TESTNAME} "move_ddr_to_memtile_ctrlpkt" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie4/move_ddr_to_memtile_ctrlpkt/"
#  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_test(NAME "aie4_move_ddr_to_memtile"
  COMMAND ${AIE2PS_TESTNAME} "move_ddr_to_memtile" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie4/move_ddr_to_memtile/"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# add_test(NAME "aie2ps_cpp_eff_net_ctrlpacket"
#   COMMAND ${AIE2PS_TESTNAME} "eff_net_ctrlpacket" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket/"
#   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

# Check checksum only then boost > 1.70 else there is mismatch in uid because of endianness issue
# https://github.com/boostorg/uuid/pull/109
# https://github.com/boostorg/uuid/issues/111
if(Boost_VERSION VERSION_GREATER 1.70)
  add_test(NAME "aie2ps_cpp_eff_net_coal_md5sum"
    COMMAND cmake -P "${AIEBU_SOURCE_DIR}/cmake/md5sum-compare.cmake" "${CMAKE_CURRENT_BINARY_DIR}/eff_net_coal.elf" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_coal/gold.md5"
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  set_tests_properties("aie2ps_cpp_eff_net_coal_md5sum" PROPERTIES DEPENDS "aie2ps_cpp_eff_net_coal")

  add_test(NAME "aie2ps_cpp_eff_net_coal_modified_md5sum"
    COMMAND cmake -P "${AIEBU_SOURCE_DIR}/cmake/md5sum-compare.cmake" "${CMAKE_CURRENT_BINARY_DIR}/eff_net_coal_modified.elf" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_coal/gold_modified.md5"
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  set_tests_properties("aie2ps_cpp_eff_net_coal_modified_md5sum" PROPERTIES DEPENDS "aie2ps_cpp_eff_net_coal")

# add_test(NAME "aie2ps_cpp_eff_net_ctrlpacket_md5sum"
#   COMMAND cmake -P "${AIEBU_SOURCE_DIR}/cmake/md5sum-compare.cmake" "${CMAKE_CURRENT_BINARY_DIR}/eff_net_ctrlpacket.elf" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2ps/eff_net_ctrlpacket/gold.md5"
#   WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endif()

add_test(NAME "aie2_cpp_4x4"
  COMMAND ${AIE2_TESTNAME} "${AIEBU_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/gen/preempt_restore_stx_4x4.bin"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_test(NAME "aie2_cpp_4x8"
  COMMAND ${AIE2_TESTNAME} "${AIEBU_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}/gen/preempt_restore_stx_4x8.bin"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

#add_test(NAME "aie2_tinyyolo_preempt"
#  COMMAND ${AIE2_FULLELF_TESTNAME} "tinyyolo_preempt" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2/tinyyolo_preempt/"
#  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

#add_test(NAME "aie2_tinyyolo_preempt_cp"
#  COMMAND ${AIE2_FULLELF_TESTNAME} "tinyyolo_preempt_cp" "${AIEBU_SOURCE_DIR}/test/cpp_test/aie2/tinyyolo_preempt_cp/"
#  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_tests_properties("aie2_cpp_4x4" PROPERTIES LABELS memcheck)
set_tests_properties("aie2_cpp_4x8" PROPERTIES LABELS memcheck)

add_test(NAME "aie4_1col_preempt_savetimestamps_config"
  COMMAND ${AIE4_SAVETIMESTAMPS_TESTNAME} "config" "${AIEBU_SOURCE_DIR}/test/aie4-ctrlcode/1col_preempt"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

add_test(NAME "aie4_1col_preempt_savetimestamps_target"
  COMMAND ${AIE4_SAVETIMESTAMPS_TESTNAME} "target" "${AIEBU_SOURCE_DIR}/test/aie4-ctrlcode/1col_preempt"
  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
