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