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