blob: b78e8ccdd3c72f26a2c830b7d4fa8cca2f1b2fff [file] [log] [blame] [edit]
function(V2X)
# ~~~
# V2X(
# NAME <name>
# [TOP_MODULE <top module>]
# SRCS <src1> <src2>
# [DO_NOT_APPLY_VERILOG_IMAGE_GEN]
# )
# ~~~
#
# V2X converts SRCS from verilog to .pb_type.xml and .model.xml via the
# utilities in <root>/ ./third_party/../f4pga-v2x/v2x/vlog_to_<x>.
#
# V2X requires all files in SRCS to have a file target via ADD_FILE_TARGET.
#
# V2X will generate a dummy target <name> that will build both xml outputs.
#
# By default V2X implicitly calls ADD_VERILOG_IMAGE_GEN for the input source
# files. DO_NOT_APPLY_VERILOG_IMAGE_GEN suppress this default.
set(options DO_NOT_APPLY_VERILOG_IMAGE_GEN)
set(oneValueArgs NAME TOP_MODULE)
set(multiValueArgs SRCS)
cmake_parse_arguments(
V2X
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
set(INCLUDES "")
set(DEPENDS_LIST "")
set(MODEL_INCLUDE_FILES "")
set(PB_TYPE_INCLUDE_FILES "")
get_target_property_required(PYTHON3 env PYTHON3)
list(APPEND DEPENDS_LIST ${PYTHON3})
get_target_property_required(YOSYS env YOSYS)
list(APPEND DEPENDS_LIST ${YOSYS})
set(REAL_SOURCE_LIST "")
foreach(SRC ${V2X_SRCS})
if(NOT "${SRC}" MATCHES "\\.sim\\.v$")
message(FATAL_ERROR "File ${SRC} does not end with .sim.v")
endif()
if(NOT ${V2X_DO_NOT_APPLY_VERILOG_IMAGE_GEN})
add_verilog_image_gen(FILE ${SRC})
endif()
append_file_dependency(DEPENDS_LIST ${SRC})
append_file_includes(INCLUDES ${SRC})
get_file_target(SRC_TARGET ${SRC})
get_target_property(INCLUDE_FILES ${SRC_TARGET} INCLUDE_FILES)
foreach(INCLUDE_SRC ${INCLUDE_FILES})
get_filename_component(INCLUDE_SRC_DIR ${INCLUDE_SRC} DIRECTORY)
get_filename_component(INCLUDE_ROOT ${INCLUDE_SRC} NAME_WE)
append_file_dependency(DEPENDS_LIST ${INCLUDE_SRC_DIR}/${INCLUDE_ROOT}.model.xml)
append_file_dependency(DEPENDS_LIST ${INCLUDE_SRC_DIR}/${INCLUDE_ROOT}.pb_type.xml)
list(APPEND MODEL_INCLUDE_FILES ${INCLUDE_SRC_DIR}/${INCLUDE_ROOT}.model.xml)
list(APPEND PB_TYPE_INCLUDE_FILES ${INCLUDE_SRC_DIR}/${INCLUDE_ROOT}.pb_type.xml)
endforeach()
endforeach()
list(GET V2X_SRCS 0 FIRST_SOURCE_FILE)
get_file_location(FIRST_SOURCE ${FIRST_SOURCE_FILE})
set(TOP_ARG "")
if(NOT ${V2X_TOP_MODULE} STREQUAL "")
set(TOP_ARG "--top=${V2X_TOP_MODULE}")
endif()
string(
REPLACE
";"
","
INCLUDES_LIST
"${INCLUDES}"
)
set(INCLUDE_ARG "")
if(NOT "${INCLUDES_LIST}" STREQUAL "")
set(INCLUDE_ARG "--includes=${INCLUDES_LIST}")
endif()
add_custom_command(
OUTPUT "${V2X_NAME}.pb_type.xml"
DEPENDS
${DEPENDS_LIST}
COMMAND
${CMAKE_COMMAND} -E env YOSYS=${YOSYS}
${PYTHON3} -m v2x --mode=pb_type ${TOP_ARG}
-o ${CMAKE_CURRENT_BINARY_DIR}/${V2X_NAME}.pb_type.xml ${FIRST_SOURCE}
${INCLUDE_ARG}
)
add_file_target(FILE "${V2X_NAME}.pb_type.xml" GENERATED)
get_file_target(SRC_TARGET_NAME "${V2X_NAME}.pb_type.xml")
set_target_properties(${SRC_TARGET_NAME} PROPERTIES INCLUDE_FILES "${PB_TYPE_INCLUDE_FILES}")
add_custom_command(
OUTPUT "${V2X_NAME}.model.xml"
DEPENDS
${DEPENDS_LIST}
COMMAND
${CMAKE_COMMAND} -E env YOSYS=${YOSYS}
${PYTHON3} -m v2x --mode=model ${TOP_ARG}
-o ${CMAKE_CURRENT_BINARY_DIR}/${V2X_NAME}.model.xml ${FIRST_SOURCE}
${INCLUDE_ARG}
)
add_file_target(FILE "${V2X_NAME}.model.xml" GENERATED)
get_file_target(SRC_TARGET_NAME "${V2X_NAME}.model.xml")
set_target_properties(${SRC_TARGET_NAME} PROPERTIES INCLUDE_FILES "${MODEL_INCLUDE_FILES}")
get_rel_target(REL_V2X_NAME v2x ${V2X_NAME})
add_custom_target(
${REL_V2X_NAME}
DEPENDS
"${V2X_NAME}.model.xml"
"${V2X_NAME}.pb_type.xml"
)
endfunction(V2X)
function(VPR_TEST_PB_TYPE)
# ~~~
# VPR_TEST_PB_TYPE(
# NAME name
# TOP_MODULE name
# )
# ~~~
#
# Run the pb_type.xml file through vpr to check it is valid.
set(options)
set(oneValueArgs NAME TOP_MODULE)
set(multiValueArgs)
cmake_parse_arguments(
VPR_TEST_PB_TYPE
"${options}"
"${oneValueArgs}"
"${multiValueArgs}"
${ARGN}
)
get_target_property_required(PYTHON3 env PYTHON3)
get_target_property_required(XMLLINT env XMLLINT)
set(DEPENDS_ARCH "")
append_file_dependency(DEPENDS_ARCH "${f4pga-arch-defs_SOURCE_DIR}/utils/template.arch.xml")
append_file_dependency(DEPENDS_ARCH "${VPR_TEST_PB_TYPE_NAME}.pb_type.xml")
append_file_dependency(DEPENDS_ARCH "${VPR_TEST_PB_TYPE_NAME}.model.xml")
add_custom_command(
OUTPUT "${VPR_TEST_PB_TYPE_NAME}.arch.xml"
DEPENDS
${PYTHON3}
${XMLLINT}
${f4pga-arch-defs_SOURCE_DIR}/utils/vpr_pbtype_arch_wrapper.py
${DEPENDS_ARCH}
COMMAND
${PYTHON3} ${f4pga-arch-defs_SOURCE_DIR}/utils/vpr_pbtype_arch_wrapper.py
--pb_type ${CMAKE_CURRENT_BINARY_DIR}/${VPR_TEST_PB_TYPE_NAME}.pb_type.xml
--output ${CMAKE_CURRENT_BINARY_DIR}/${VPR_TEST_PB_TYPE_NAME}.arch.xml
--xmllint ${XMLLINT}
WORKING_DIRECTORY ${f4pga-arch-defs_SOURCE_DIR}/utils
)
add_file_target(FILE "${VPR_TEST_PB_TYPE_NAME}.arch.xml" GENERATED)
set(DEPENDS_EBLIF "")
append_file_dependency(DEPENDS_EBLIF "${VPR_TEST_PB_TYPE_NAME}.sim.v")
set(TECHMAP_DEP "")
append_file_dependency(TECHMAP_DEP "${VPR_TEST_PB_TYPE_NAME}.techmap.merged.v")
set(PB_TYPE_VERILOG "${VPR_TEST_PB_TYPE_NAME}.sim.v")
set(PB_TYPE_TECHMAP "${VPR_TEST_PB_TYPE_NAME}.techmap.merged.v")
set(YOSYS_OUTPUT_BLIF "${VPR_TEST_PB_TYPE_NAME}.test.eblif")
get_target_property_required(YOSYS env YOSYS)
add_custom_command(
OUTPUT "${YOSYS_OUTPUT_BLIF}"
DEPENDS
${YOSYS}
${DEPENDS_EBLIF} ${TECHMAP_DEP}
COMMAND
${YOSYS} -p "read_verilog ${PB_TYPE_VERILOG}\; hierarchy -top ${VPR_TEST_PB_TYPE_TOP_MODULE}\; techmap -map ${PB_TYPE_TECHMAP}\; flatten\; proc\; opt\; write_blif ${YOSYS_OUTPUT_BLIF}"
WORKING_DIRECTORY
${CMAKE_CURRENT_BINARY_DIR}
)
add_file_target(FILE "${VPR_TEST_PB_TYPE_NAME}.test.eblif" GENERATED)
set(ARCH_MERGED_XML "${VPR_TEST_PB_TYPE_NAME}.arch.merged.xml")
set(ARCH_TILES_XML "${VPR_TEST_PB_TYPE_NAME}.arch.tiles.xml")
set(ARCH_TIMINGS_XML "${VPR_TEST_PB_TYPE_NAME}.arch.timings.xml")
set(update_arch_tiles_py "${f4pga-arch-defs_SOURCE_DIR}/utils/update_arch_tiles.py")
xml_canonicalize_merge(
NAME ${VPR_TEST_PB_TYPE_NAME}_arch_merged
FILE ${VPR_TEST_PB_TYPE_NAME}.arch.xml
OUTPUT ${ARCH_MERGED_XML}
)
add_file_target(FILE ${ARCH_TILES_XML} GENERATED)
add_custom_command(
OUTPUT "${ARCH_TILES_XML}"
DEPENDS
${PYTHON3}
${ARCH_MERGED_XML}
${update_arch_tiles_py}
COMMAND
${PYTHON3} ${update_arch_tiles_py}
--in_xml ${ARCH_MERGED_XML}
--out_xml ${ARCH_TILES_XML}
)
update_arch_timings(INPUT ${ARCH_TILES_XML} OUTPUT ${ARCH_TIMINGS_XML})
get_target_property_required(VPR env VPR)
get_target_property_required(QUIET_CMD env QUIET_CMD)
set(OUT_LOCAL_REL test_${VPR_TEST_PB_TYPE_NAME})
set(OUT_LOCAL ${CMAKE_CURRENT_BINARY_DIR}/${OUT_LOCAL_REL})
set(DEPENDS_TEST "")
append_file_dependency(DEPENDS_TEST ${ARCH_TIMINGS_XML})
append_file_dependency(DEPENDS_TEST ${VPR_TEST_PB_TYPE_NAME}.test.eblif)
add_custom_command(
OUTPUT
${OUT_LOCAL_REL}/vpr.stdout
DEPENDS
${QUIET_CMD}
${VPR}
${DEPENDS_TEST}
COMMAND
${CMAKE_COMMAND} -E make_directory ${OUT_LOCAL}
COMMAND
${CMAKE_COMMAND} -E chdir ${OUT_LOCAL}
${QUIET_CMD} ${VPR}
${CMAKE_CURRENT_BINARY_DIR}/${ARCH_TIMINGS_XML}
${CMAKE_CURRENT_BINARY_DIR}/${VPR_TEST_PB_TYPE_NAME}.test.eblif
--echo_file on
--pack
--pack_verbosity 100
--place
--route
--device device
--target_ext_pin_util 1.0,1.0
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)
add_file_target(FILE "${OUT_LOCAL_REL}/vpr.stdout" GENERATED)
get_rel_target(VPR_TEST_REL_NAME test ${VPR_TEST_PB_TYPE_NAME})
add_custom_target(
${VPR_TEST_REL_NAME}
DEPENDS
"${OUT_LOCAL_REL}/vpr.stdout"
)
add_dependencies(all_vpr_test_pbtype ${VPR_TEST_REL_NAME})
endfunction(VPR_TEST_PB_TYPE)