| # 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() |