| function(ADD_XC_BOARD) |
| # ~~~ |
| # ADD_XC_BOARD( |
| # BOARD <board> |
| # DEVICE <device> |
| # PACKAGE <package> |
| # PART <part> |
| # PROG_TOOL <prog_tool> |
| # [PROG_CMD <command to use PROG_TOOL> |
| # ) |
| # ~~~ |
| # |
| # Defines a target board for a xc7 project. The listed DEVICE must |
| # have been defined using ADD_XC_DEVICE_DEFINE. Currently PACKAGE should |
| # always be set to test. |
| # |
| # PART must be defined as the packaging of device. This is used to defined |
| # the package pin names and bitstream .yaml file to use. To see available |
| # parts, browse to third_party/prjxray-db/<arch>/*.yaml. |
| # |
| # PROG_TOOL should be an executable that will program a bitstream to the |
| # specified board. PROG_CMD is an optional command string. If PROG_CMD is not |
| # provided, PROG_CMD will simply be ${PROG_TOOL}. |
| # |
| set(options) |
| set(oneValueArgs BOARD DEVICE PACKAGE PROG_TOOL PROG_CMD PART) |
| set(multiValueArgs) |
| cmake_parse_arguments( |
| ADD_XC_BOARD |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| define_board( |
| BOARD ${ADD_XC_BOARD_BOARD} |
| DEVICE ${ADD_XC_BOARD_DEVICE} |
| PACKAGE ${ADD_XC_BOARD_PACKAGE} |
| PROG_TOOL ${ADD_XC_BOARD_PROG_TOOL} |
| PROG_CMD ${ADD_XC_BOARD_PROG_CMD} |
| ) |
| |
| set(DEVICE ${ADD_XC_BOARD_DEVICE}) |
| get_target_property_required(ARCH ${DEVICE} ARCH) |
| get_target_property_required(PRJRAY_ARCH ${ARCH} PRJRAY_ARCH) |
| get_target_property_required(DEVICE_TYPE ${DEVICE} DEVICE_TYPE) |
| get_target_property_required(USE_ROI ${DEVICE_TYPE} USE_ROI) |
| set(BOARD ${ADD_XC_BOARD_BOARD}) |
| set(PART ${ADD_XC_BOARD_PART}) |
| |
| get_target_property_required(DOC_PRJ ${ARCH} DOC_PRJ) |
| get_target_property_required(DOC_PRJ_DB ${ARCH} DOC_PRJ_DB) |
| |
| set(PRJRAY_DIR ${DOC_PRJ}) |
| set(PRJRAY_DB_DIR ${DOC_PRJ_DB}) |
| set(DB_ROOT "${PRJRAY_DB_DIR}/${PRJRAY_ARCH}") |
| |
| set_target_properties(${BOARD} |
| PROPERTIES PART ${PART} |
| ) |
| set_target_properties(${BOARD} |
| PROPERTIES PART_JSON ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/part.json |
| ) |
| |
| get_target_property_required(CHANNELS_DB ${DEVICE_TYPE} CHANNELS_DB) |
| get_file_location(CHANNELS_LOCATION ${CHANNELS_DB}) |
| |
| get_target_property_required(VPR_GRID_MAP ${DEVICE_TYPE} VPR_GRID_MAP) |
| get_file_location(VPR_GRID_MAP_LOCATION ${VPR_GRID_MAP}) |
| |
| set_target_properties(${BOARD} |
| PROPERTIES BIT_TO_V_EXTRA_ARGS " \ |
| --part ${PART} |
| --connection_database ${CHANNELS_LOCATION} |
| --vpr_grid_map ${VPR_GRID_MAP_LOCATION} |
| ") |
| |
| get_target_property(USE_OVERLAY ${DEVICE_TYPE} USE_OVERLAY) |
| get_target_property_required(PYTHON3 env PYTHON3) |
| |
| |
| if(${USE_ROI}) |
| get_target_property_required(ROI_DIR ${DEVICE_TYPE} ROI_DIR) |
| |
| get_target_property_required(SYNTH_TILES ${DEVICE_TYPE} SYNTH_TILES) |
| get_file_location(SYNTH_TILES_LOCATION ${SYNTH_TILES}) |
| |
| set_target_properties(${BOARD} |
| PROPERTIES FASM_TO_BIT_EXTRA_ARGS " \ |
| --roi ${ROI_DIR}/design.json \ |
| --part ${PART} \ |
| --part_file ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/part.yaml \ |
| ") |
| |
| set_target_properties(${BOARD} |
| PROPERTIES PLACE_CONSTR_TOOL_EXTRA_ARGS " \ |
| --db_root ${PRJRAY_DB_DIR} \ |
| --part ${PART} \ |
| --vpr_grid_map ${VPR_GRID_MAP_LOCATION} \ |
| --roi |
| ") |
| |
| get_target_property_required(SYNTH_TILES ${DEVICE_TYPE} SYNTH_TILES) |
| get_file_location(SYNTH_TILES_LOCATION ${SYNTH_TILES}) |
| set(CREATE_PINMAP_CSV ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_pinmap_csv.py) |
| set(PINMAP_CSV ${BOARD}_pinmap.csv) |
| set(PINMAP_CSV_DEPS ${PYTHON3} ${CREATE_PINMAP_CSV}) |
| append_file_dependency(PINMAP_CSV_DEPS ${CHANNELS_DB}) |
| append_file_dependency(PINMAP_CSV_DEPS ${SYNTH_TILES}) |
| |
| add_custom_command( |
| OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| COMMAND ${PYTHON3} ${CREATE_PINMAP_CSV} |
| --connection_database ${CHANNELS_LOCATION} |
| --synth_tiles ${SYNTH_TILES_LOCATION} |
| --package_pins ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/package_pins.csv |
| --output ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| DEPENDS ${PINMAP_CSV_DEPS} |
| ) |
| elseif(${USE_OVERLAY}) |
| set_target_properties(${BOARD} |
| PROPERTIES FASM_TO_BIT_EXTRA_ARGS " \ |
| --part ${PART} \ |
| --part_file ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/part.yaml \ |
| ") |
| |
| set_target_properties(${BOARD} |
| PROPERTIES PLACE_CONSTR_TOOL_EXTRA_ARGS " \ |
| --db_root ${PRJRAY_DB_DIR} \ |
| --part ${PART} \ |
| --vpr_grid_map ${VPR_GRID_MAP_LOCATION} |
| ") |
| |
| get_target_property_required(SYNTH_TILES ${DEVICE_TYPE} SYNTH_TILES) |
| get_file_location(SYNTH_TILES_LOCATION ${SYNTH_TILES}) |
| set(CREATE_PINMAP_CSV ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_pinmap_csv.py) |
| set(PINMAP_CSV ${BOARD}_pinmap.csv) |
| set(PINMAP_CSV_DEPS ${PYTHON3} ${CREATE_PINMAP_CSV}) |
| append_file_dependency(PINMAP_CSV_DEPS ${CHANNELS_DB}) |
| append_file_dependency(PINMAP_CSV_DEPS ${SYNTH_TILES}) |
| |
| add_custom_command( |
| OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| COMMAND ${PYTHON3} ${CREATE_PINMAP_CSV} |
| --connection_database ${CHANNELS_LOCATION} |
| --synth_tiles ${SYNTH_TILES_LOCATION} |
| --package_pins ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/package_pins.csv |
| --output ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| --overlay |
| DEPENDS ${PINMAP_CSV_DEPS} |
| ) |
| else() |
| set_target_properties(${BOARD} |
| PROPERTIES FASM_TO_BIT_EXTRA_ARGS " \ |
| --part ${PART} \ |
| --part_file ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/part.yaml \ |
| ") |
| |
| set_target_properties(${BOARD} |
| PROPERTIES PLACE_CONSTR_TOOL_EXTRA_ARGS " \ |
| --db_root ${PRJRAY_DB_DIR} \ |
| --part ${PART} \ |
| --vpr_grid_map ${VPR_GRID_MAP_LOCATION} \ |
| ") |
| |
| set(CREATE_PINMAP_CSV ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_pinmap_csv.py) |
| set(PINMAP_CSV ${BOARD}_pinmap.csv) |
| set(PINMAP_CSV_DEPS ${PYTHON3} ${CREATE_PINMAP_CSV}) |
| append_file_dependency(PINMAP_CSV_DEPS ${CHANNELS_DB}) |
| |
| add_custom_command( |
| OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| COMMAND ${PYTHON3} ${CREATE_PINMAP_CSV} |
| --connection_database ${CHANNELS_LOCATION} |
| --package_pins ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/package_pins.csv |
| --output ${CMAKE_CURRENT_BINARY_DIR}/${PINMAP_CSV} |
| DEPENDS ${PINMAP_CSV_DEPS} |
| ) |
| endif() |
| |
| get_target_property(GRAPH_LIMIT ${DEVICE_TYPE} GRAPH_LIMIT) |
| if(NOT "${GRAPH_LIMIT}" STREQUAL "GRAPH_LIMIT-NOTFOUND") |
| set_property( |
| TARGET ${BOARD} |
| APPEND_STRING PROPERTY PLACE_CONSTR_TOOL_EXTRA_ARGS "--graph_limit ${GRAPH_LIMIT}" |
| ) |
| endif() |
| |
| add_file_target(FILE ${PINMAP_CSV} GENERATED) |
| |
| set_target_properties( |
| ${BOARD} |
| PROPERTIES |
| PINMAP |
| ${CMAKE_CURRENT_SOURCE_DIR}/${PINMAP_CSV} |
| ) |
| |
| get_target_property_required(VPR_GRID_MAP ${DEVICE_TYPE} VPR_GRID_MAP) |
| get_file_location(VPR_GRID_MAP_LOCATION ${VPR_GRID_MAP}) |
| |
| set_target_properties( |
| dummy_${ARCH}_${DEVICE}_${ADD_XC_BOARD_PACKAGE} |
| PROPERTIES |
| PLACE_CONSTR_TOOL_EXTRA_ARGS " \ |
| --db_root ${PRJRAY_DB_DIR} \ |
| --part ${PART} \ |
| --vpr_grid_map ${VPR_GRID_MAP_LOCATION} --roi" |
| PINMAP |
| ${CMAKE_CURRENT_SOURCE_DIR}/${PINMAP_CSV}) |
| |
| define_xc_pinmap_csv_install_target( |
| PART ${PART} |
| BOARD ${BOARD} |
| DEVICE_TYPE ${DEVICE_TYPE} |
| DEVICE ${ADD_XC_BOARD_DEVICE} |
| PACKAGE ${ADD_XC_BOARD_PACKAGE} |
| ) |
| endfunction() |
| |
| function(ADD_XC_DEVICE_DEFINE_TYPE) |
| set(options) |
| set(oneValueArgs ARCH PART DEVICE ROI_DIR GRAPH_LIMIT OVERLAY_DIR) |
| set(multiValueArgs TILE_TYPES PB_TYPES) |
| cmake_parse_arguments( |
| ADD_XC_DEVICE_DEFINE_TYPE |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| set(ARCH ${ADD_XC_DEVICE_DEFINE_TYPE_ARCH}) |
| set(DEVICE ${ADD_XC_DEVICE_DEFINE_TYPE_DEVICE}) |
| set(ROI_DIR ${ADD_XC_DEVICE_DEFINE_TYPE_ROI_DIR}) |
| set(OVERLAY_DIR ${ADD_XC_DEVICE_DEFINE_TYPE_OVERLAY_DIR}) |
| set(TILE_TYPES ${ADD_XC_DEVICE_DEFINE_TYPE_TILE_TYPES}) |
| get_target_property_required(FAMILY ${ARCH} FAMILY) |
| get_target_property_required(DOC_PRJ ${ARCH} DOC_PRJ) |
| get_target_property_required(DOC_PRJ_DB ${ARCH} DOC_PRJ_DB) |
| |
| set(PRJRAY_DIR ${DOC_PRJ}) |
| set(PRJRAY_DB_DIR ${DOC_PRJ_DB}) |
| |
| get_target_property_required(PRJRAY_ARCH ${ARCH} PRJRAY_ARCH) |
| |
| if(NOT "${ROI_DIR}" STREQUAL "") |
| set(ROI_ARGS USE_ROI ${ROI_DIR}/design.json) |
| set(DEVICE_TYPE ${DEVICE}-roi-virt) |
| elseif(NOT "${ADD_XC_DEVICE_DEFINE_TYPE_GRAPH_LIMIT}" STREQUAL "") |
| set(DEVICE_TYPE ${DEVICE}-virt) |
| set(ROI_ARGS GRAPH_LIMIT ${ADD_XC_DEVICE_DEFINE_TYPE_GRAPH_LIMIT}) |
| elseif(NOT "${OVERLAY_DIR}" STREQUAL "") |
| set(DEVICE_TYPE ${DEVICE}-virt) |
| set(ROI_ARGS USE_OVERLAY ${OVERLAY_DIR}/design.json) |
| else() |
| set(DEVICE_TYPE ${DEVICE}-virt) |
| set(ROI_ARGS "") |
| endif() |
| |
| set(PB_TYPE_ARGS "") |
| if(NOT "${ADD_XC_DEVICE_DEFINE_TYPE_PB_TYPES}" STREQUAL "") |
| set(PB_TYPE_ARGS PB_TYPES ${ADD_XC_DEVICE_DEFINE_TYPE_PB_TYPES}) |
| endif() |
| |
| project_ray_arch( |
| ARCH ${ARCH} |
| PART ${PART} |
| DEVICE ${DEVICE} |
| TILE_TYPES ${TILE_TYPES} |
| ${ROI_ARGS} |
| ${PB_TYPE_ARGS} |
| ) |
| |
| set(SDF_TIMING_DIRECTORY ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/timings) |
| set(UPDATE_ARCH_TIMINGS ${f4pga-arch-defs_SOURCE_DIR}/utils/update_arch_timings.py) |
| set(UPDATE_PACK_PATTERNS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/add_pack_patterns.py) |
| set(PYTHON_SDF_TIMING_DIR ${f4pga-arch-defs_SOURCE_DIR}/third_party/python-sdf-timing) |
| set(BELS_MAP ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/bels.json) |
| |
| set(ADD_PACK_PATTERN "${PYTHON3} ${UPDATE_PACK_PATTERNS} --in_arch /dev/stdin") |
| |
| get_file_target(UPDATE_PACK_PATTERNS_TARGET ${UPDATE_PACK_PATTERNS}) |
| set(PACK_PATTERN_DEPS ${UPDATE_PACK_PATTERNS_TARGET}) |
| |
| set(TIMING_IMPORT "${PYTHON3} ${UPDATE_ARCH_TIMINGS} --sdf_dir ${SDF_TIMING_DIRECTORY} --bels_map ${BELS_MAP} --out_arch /dev/stdout --input_arch /dev/stdin") |
| |
| get_file_target(BELS_MAP_TARGET ${BELS_MAP}) |
| get_file_target(UPDATE_ARCH_TIMINGS_TARGET ${UPDATE_ARCH_TIMINGS}) |
| set(TIMING_DEPS ${BELS_MAP_TARGET} ${UPDATE_ARCH_TIMINGS_TARGET}) |
| |
| define_device_type( |
| DEVICE_TYPE ${DEVICE_TYPE} |
| ARCH ${ARCH} |
| ARCH_XML arch.xml |
| SCRIPT_OUTPUT_NAME pack_patterns timing |
| SCRIPTS ADD_PACK_PATTERN TIMING_IMPORT |
| SCRIPT_DEPS PACK_PATTERN_DEPS TIMING_DEPS |
| ) |
| add_dependencies(${ARCH}_${DEVICE_TYPE}_arch arch_import_timing_deps) |
| get_target_property_required(VIRT_DEVICE_MERGED_FILE ${DEVICE_TYPE} DEVICE_MERGED_FILE) |
| get_file_target(DEVICE_MERGED_FILE_TARGET ${VIRT_DEVICE_MERGED_FILE}) |
| add_dependencies(${DEVICE_MERGED_FILE_TARGET} arch_import_timing_deps) |
| if(NOT "${ROI_DIR}" STREQUAL "") |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| USE_ROI TRUE |
| ROI_DIR ${ROI_DIR} |
| CHANNELS_DB ${CMAKE_CURRENT_SOURCE_DIR}/channels.db |
| SYNTH_TILES ${CMAKE_CURRENT_SOURCE_DIR}/synth_tiles.json |
| VPR_GRID_MAP ${CMAKE_CURRENT_SOURCE_DIR}/vpr_grid_map.csv |
| ) |
| else() |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| USE_ROI FALSE |
| CHANNELS_DB ${CMAKE_CURRENT_SOURCE_DIR}/channels.db |
| VPR_GRID_MAP ${CMAKE_CURRENT_SOURCE_DIR}/vpr_grid_map.csv |
| ) |
| endif() |
| |
| if(NOT "${ADD_XC_DEVICE_DEFINE_TYPE_GRAPH_LIMIT}" STREQUAL "") |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| LIMIT_GRAPH_TO_DEVICE TRUE |
| GRAPH_LIMIT "${ADD_XC_DEVICE_DEFINE_TYPE_GRAPH_LIMIT}" |
| ) |
| else() |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| LIMIT_GRAPH_TO_DEVICE FALSE |
| ) |
| endif() |
| |
| if(NOT "${OVERLAY_DIR}" STREQUAL "") |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| USE_OVERLAY TRUE |
| OVERLAY_DIR ${OVERLAY_DIR} |
| SYNTH_TILES ${CMAKE_CURRENT_SOURCE_DIR}/synth_tiles.json |
| ) |
| else() |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| USE_OVERLAY FALSE |
| ) |
| endif() |
| endfunction() |
| |
| function(ADD_XC_DEVICE_DEFINE) |
| set(options USE_ROI USE_OVERLAY) |
| set(oneValueArgs ARCH PART) |
| set(multiValueArgs DEVICES) |
| cmake_parse_arguments( |
| ADD_XC_DEVICE_DEFINE |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| set(USE_ROI ${ADD_XC_DEVICE_DEFINE_USE_ROI}) |
| set(USE_OVERLAY ${ADD_XC_DEVICE_DEFINE_USE_OVERLAY}) |
| set(ARCH ${ADD_XC_DEVICE_DEFINE_ARCH}) |
| set(PART ${ADD_XC_DEVICE_DEFINE_PART}) |
| set(DEVICES ${ADD_XC_DEVICE_DEFINE_DEVICES}) |
| |
| list(LENGTH DEVICES DEVICE_COUNT) |
| math(EXPR DEVICE_COUNT_N_1 "${DEVICE_COUNT} - 1") |
| foreach(INDEX RANGE ${DEVICE_COUNT_N_1}) |
| list(GET DEVICES ${INDEX} DEVICE) |
| |
| if(${USE_ROI}) |
| set(DEVICE_TYPE ${DEVICE}-roi-virt) |
| else() |
| set(DEVICE_TYPE ${DEVICE}-virt) |
| endif() |
| |
| add_subdirectory(${DEVICE_TYPE}) |
| |
| get_target_property_required(CHANNELS_DB ${DEVICE_TYPE} CHANNELS_DB) |
| get_file_location(CHANNELS_LOCATION ${CHANNELS_DB}) |
| set(RR_PATCH_EXTRA_ARGS --connection_database ${CHANNELS_LOCATION}) |
| |
| # Clear variable before adding deps for next device |
| set(DEVICE_RR_PATCH_DEPS "") |
| append_file_dependency(DEVICE_RR_PATCH_DEPS ${CHANNELS_DB}) |
| |
| if(${USE_ROI} OR ${USE_OVERLAY}) |
| # SYNTH_TILES used in ROI. |
| get_target_property_required(SYNTH_TILES ${DEVICE_TYPE} SYNTH_TILES) |
| get_file_location(SYNTH_TILES_LOCATION ${SYNTH_TILES}) |
| append_file_dependency(DEVICE_RR_PATCH_DEPS ${SYNTH_TILES}) |
| if(${USE_ROI}) |
| set(RR_PATCH_EXTRA_ARGS --synth_tiles ${SYNTH_TILES_LOCATION} ${RR_PATCH_EXTRA_ARGS}) |
| else() |
| set(RR_PATCH_EXTRA_ARGS --synth_tiles ${SYNTH_TILES_LOCATION} --overlay ${RR_PATCH_EXTRA_ARGS}) |
| endif() |
| endif() |
| |
| get_target_property_required(LIMIT_GRAPH_TO_DEVICE ${DEVICE_TYPE} LIMIT_GRAPH_TO_DEVICE) |
| |
| if(${LIMIT_GRAPH_TO_DEVICE}) |
| get_target_property_required(GRAPH_LIMIT ${DEVICE_TYPE} GRAPH_LIMIT) |
| set(RR_PATCH_EXTRA_ARGS --graph_limit ${GRAPH_LIMIT} ${RR_PATCH_EXTRA_ARGS}) |
| endif() |
| |
| define_device( |
| DEVICE ${DEVICE} |
| ARCH ${ARCH} |
| PART ${PART} |
| DEVICE_TYPE ${DEVICE_TYPE} |
| PACKAGES test |
| RR_PATCH_EXTRA_ARGS ${RR_PATCH_EXTRA_ARGS} |
| RR_PATCH_DEPS ${DEVICE_RR_PATCH_DEPS} |
| CACHE_PLACE_DELAY |
| CACHE_LOOKAHEAD |
| CACHE_ARGS |
| --constant_net_method route |
| --clock_modeling route |
| --place_delay_model delta_override |
| --place_delta_delay_matrix_calculation_method dijkstra |
| --router_lookahead extended_map |
| --disable_errors check_unbuffered_edges:check_route:check_place |
| --suppress_warnings sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R |
| --route_chan_width 500 |
| --allowed_tiles_for_delay_model BLK-TL-CLBLL_L,BLK-TL-CLBLL_R,BLK-TL-CLBLM_L,BLK-TL-CLBLM_R |
| ) |
| endforeach() |
| endfunction() |