blob: 7f09f1591b31d653dc7e18021954136e9cd91c47 [file] [log] [blame] [edit]
macro(RUN CMD)
message(STATUS "Running \"${CMD}\"")
separate_arguments(CMD_LIST NATIVE_COMMAND ${CMD})
execute_process(
COMMAND
${CMAKE_COMMAND} -E env
${CMD_LIST}
RESULT_VARIABLE
CMD_RESULT
)
if(CMD_RESULT)
message(FATAL_ERROR "Command \"${CMD}\" failed!")
endif()
endmacro()
# Remove the build directory
file(REMOVE_RECURSE ${BUILD_DIR})
# Run the toolchain
set(TOOLCHAIN_COMMAND "PATH=${INSTALLATION_DIR}/bin:$ENV{PATH} ${TOOLCHAIN_COMMAND}")
run(${TOOLCHAIN_COMMAND} "")
# Verify that all required output files are generated
message(STATUS "Checking output files...")
string(REPLACE "," ";" ASSERT_EXISTS "${ASSERT_EXISTS}")
set(MISSING_FILES FALSE)
foreach(FILE ${ASSERT_EXISTS})
file(RELATIVE_PATH FNAME ${BUILD_DIR} ${FILE})
if(NOT EXISTS "${FILE}")
message(STATUS "[X] '${FNAME}'")
set(MISSING_FILES TRUE)
else()
message(STATUS "[V] '${FNAME}'")
endif()
endforeach()
if(MISSING_FILES)
message(FATAL_ERROR "Some output files are missing!")
endif()
# Assert usage and timing if any
set(PYTHONPATH ${SYMBIFLOW_DIR}/utils)
set(USAGE_UTIL ${PYTHONPATH}/report_block_usage.py)
set(TIMING_UTIL ${PYTHONPATH}/report_timing.py)
set(BLOCK_USAGE ${BUILD_DIR}/block_usage.json)
set(TIMING_SUMMARY ${BUILD_DIR}/timing_summary.json)
if (NOT "${ASSERT_BLOCK_TYPES_ARE_USED}" STREQUAL "")
run("PYTHONPATH=${PYTHONPATH} python3 ${USAGE_UTIL} ${BLOCK_USAGE} --assert_usage ${ASSERT_BLOCK_TYPES_ARE_USED}")
endif ()
if (NOT "${ASSERT_TIMING}" STREQUAL "")
run("PYTHONPATH=${PYTHONPATH} python3 ${TIMING_UTIL} ${TIMING_SUMMARY} --assert ${ASSERT_TIMING}")
endif ()
# Check if IO constraints has been correctly applied. This is done by verifying
# the original PCF file agains the one produced by fasm2bels. For this to work
# "post_verilog" dump option must be enabled for a test (i.e. provided within
# EXTRA_ARGS).
set(PCF_UTIL ${PYTHONPATH}/pcf_compare.py)
set(OUT_PCF ${BUILD_DIR}/top.bit.v.pcf)
if (NOT "${REF_PCF}" STREQUAL "")
run("PYTHONPATH=${PYTHONPATH} python3 ${PCF_UTIL} ${REF_PCF} ${OUT_PCF}")
endif()
# Check if post synthesis verilog has correct format
# We look for verilog escaped identifiers in ports definitions ending with
# array indexing, e.g. [0]
# MERGED_POST_VERILOG shouldn't contain such identifiers
set(MERGED_POST_VERILOG ${BUILD_DIR}/top_merged_post_implementation.v)
if (EXISTS "${MERGED_POST_VERILOG}")
SET(GREP_ARGS "(input|output)\\s+\\\\\\S*\\[[0-9]*\\]\\s,?" "${MERGED_POST_VERILOG}")
message(STATUS "${GREP_ARGS}")
EXECUTE_PROCESS(
COMMAND
grep ${GREP_ARGS}
OUTPUT_VARIABLE MERGED_VAL_OUT
RESULT_VARIABLE MERGED_VAL_RES)
if (${MERGED_VAL_RES} EQUAL 0 AND NOT "${MERGED_VAL_OUT}" STREQUAL "")
MESSAGE(FATAL_ERROR "Found illegal escaped identifiers in ${MERGED_POST_VERILOG}: ${MERGED_VAL_OUT}")
endif()
endif()