# ADD_BINARY_TOOLCHAIN_TEST
#
# This function adds a test for installed SymbiFlow toolchain (a.k.a. binary
# toolchain)
#
# Tests added require "make install" to be run upfront to install the toolchain

function(ADD_BINARY_TOOLCHAIN_TEST)

  set(options CHECK_CONSTRAINTS)
  set(oneValueArgs TEST_NAME DIRECTIVE DEVICE PINMAP PCF SDC EXTRA_ARGS ASSERT_BLOCK_TYPES_ARE_USED ASSERT_TIMING)
  set(multiValueArgs SOURCES ASSERT_EXISTS)

  cmake_parse_arguments(
    ADD_BINARY_TOOLCHAIN_TEST
    "${options}"
    "${oneValueArgs}"
    "${multiValueArgs}"
    ${ARGN}
  )

  set(INSTALLATION_DIR_BIN "${CMAKE_INSTALL_PREFIX}/bin")

  set(TEST_NAME  ${ADD_BINARY_TOOLCHAIN_TEST_TEST_NAME})
  set(SOURCES    ${ADD_BINARY_TOOLCHAIN_TEST_SOURCES})
  set(DIRECTIVE  ${ADD_BINARY_TOOLCHAIN_TEST_DIRECTIVE})
  set(DEVICE     ${ADD_BINARY_TOOLCHAIN_TEST_DEVICE})
  set(PINMAP     ${ADD_BINARY_TOOLCHAIN_TEST_PINMAP})
  set(PCF        ${ADD_BINARY_TOOLCHAIN_TEST_PCF})
  set(SDC        ${ADD_BINARY_TOOLCHAIN_TEST_SDC})
  set(EXTRA_ARGS ${ADD_BINARY_TOOLCHAIN_TEST_EXTRA_ARGS})

  string(REPLACE " " ";" SOURCES "${SOURCES}")
  if("${SOURCES}" STREQUAL "")
      set(SOURCES "${TEST_NAME}.v")
  endif()

  if("${PCF}" STREQUAL "")
    set(PCF "${TEST_NAME}.pcf")
  endif()

  if("${SDC}" STREQUAL "")
    set(SDC "${TEST_NAME}.sdc")
  endif()

  if("${DIRECTIVE}" STREQUAL "")
    set(DIRECTIVE "compile")
  endif()

  set(TOOLCHAIN_COMMAND "\
    ql_symbiflow \
    -${DIRECTIVE} \
    -src ${CMAKE_CURRENT_SOURCE_DIR} \
    -d ${DEVICE} \
    -t top \
    -v ${SOURCES} \
    -P ${PINMAP} "
  )

  set(REF_PCF "")
  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PCF}")
    set(TOOLCHAIN_COMMAND "${TOOLCHAIN_COMMAND} -p \"${PCF}\"")
    if(${ADD_BINARY_TOOLCHAIN_TEST_CHECK_CONSTRAINTS})
        file(REAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${PCF}" REF_PCF)
    endif()
  endif()
  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${SDC}")
    set(TOOLCHAIN_COMMAND "${TOOLCHAIN_COMMAND} -s \"${SDC}\"")
  endif()

  set(BUILD_DIR_REL "build.${TEST_NAME}")
  set(TOOLCHAIN_COMMAND "${TOOLCHAIN_COMMAND} -build_dir \"${BUILD_DIR_REL}\"")

  set(BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR_REL})

  # Build a list of files which existence is to be checked after the toolchain
  # is executed.
  set(ASSERT_EXISTS "")
  list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.eblif")

  if("${DIRECTIVE}" STREQUAL "compile")
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.net")
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.place")
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.fasm")
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.bit")
  endif()

  # qlf* architectures use repacker hence the "top.route" name is
  # different.
  if("${DEVICE}" MATCHES "qlf_.*")
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.repacked.route")
  else()
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/top.route")
  endif()

  foreach(FILE ${ADD_BINARY_TOOLCHAIN_TEST_ASSERT_EXISTS})
    list(APPEND ASSERT_EXISTS "${BUILD_DIR}/${FILE}")
  endforeach()

  string(REPLACE ";" "," ASSERT_EXISTS "${ASSERT_EXISTS}")

  # Add the test
  set(TOOLCHAIN_COMMAND "${TOOLCHAIN_COMMAND} ${EXTRA_ARGS}")
  add_test(NAME quicklogic_toolchain_test_${TEST_NAME}_${DEVICE}
    COMMAND
      ${CMAKE_COMMAND}
        -DTOOLCHAIN_COMMAND=${TOOLCHAIN_COMMAND}
        -DSYMBIFLOW_DIR=${f4pga-arch-defs_SOURCE_DIR}
        -DINSTALLATION_DIR=${CMAKE_INSTALL_PREFIX}
        -DBUILD_DIR=${BUILD_DIR}
        -DASSERT_BLOCK_TYPES_ARE_USED=${ADD_BINARY_TOOLCHAIN_TEST_ASSERT_BLOCK_TYPES_ARE_USED}
        -DASSERT_TIMING=${ADD_BINARY_TOOLCHAIN_TEST_ASSERT_TIMING}
        -DASSERT_EXISTS=${ASSERT_EXISTS}
        -DREF_PCF=${REF_PCF}
        -P ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/common/cmake/run_toolchain_test.cmake
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  )

endfunction()
