|  | function(get_project_ray_dependencies db_dir var part element) | 
|  | list(APPEND ${var} ${db_dir}/Info.md) | 
|  | string(TOLOWER ${element} element_LOWER) | 
|  | file(GLOB other_sources ${db_dir}/${part}/*${element_LOWER}*.db) | 
|  | list(APPEND ${var} ${other_sources}) | 
|  | file(GLOB other_sources ${db_dir}/${part}/*${element}*.json) | 
|  | list(APPEND ${var} ${other_sources}) | 
|  | set(${var} ${${var}} PARENT_SCOPE) | 
|  | endfunction() | 
|  |  | 
|  | function(PROJECT_RAY_ARCH) | 
|  | set(options) | 
|  | set(oneValueArgs ARCH PART USE_ROI DEVICE GRAPH_LIMIT USE_OVERLAY) | 
|  | set(multiValueArgs TILE_TYPES PB_TYPES) | 
|  | cmake_parse_arguments( | 
|  | PROJECT_RAY_ARCH | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | get_target_property_required(PYTHON3 env PYTHON3) | 
|  |  | 
|  | set(ARCH ${PROJECT_RAY_ARCH_ARCH}) | 
|  | get_target_property_required(PRJRAY_ARCH ${ARCH} PRJRAY_ARCH) | 
|  | 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}) | 
|  |  | 
|  | set(PART ${PROJECT_RAY_ARCH_PART}) | 
|  | set(DEVICE ${PROJECT_RAY_ARCH_DEVICE}) | 
|  | set(ARCH_IMPORT ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_arch_import.py) | 
|  | set(CREATE_SYNTH_TILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_synth_tiles.py) | 
|  | set(CREATE_EDGES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_edges.py) | 
|  | set(GET_FABRIC ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_get_fabric.py) | 
|  | execute_process( | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${GET_FABRIC} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PART} | 
|  | -cmake | 
|  | OUTPUT_VARIABLE FABRIC | 
|  | ) | 
|  | string(REPLACE "\n" "" FABRIC "${FABRIC}") | 
|  | set(DEPS ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${FABRIC}/tilegrid.json) | 
|  |  | 
|  | if("${PROJECT_RAY_ARCH_PB_TYPES}" STREQUAL "") | 
|  | set(PROJECT_RAY_ARCH_PB_TYPES ${PROJECT_RAY_ARCH_TILE_TYPES}) | 
|  | endif() | 
|  |  | 
|  | set(ARCH_INCLUDE_FILES "") | 
|  | foreach(TILE_TYPE ${PROJECT_RAY_ARCH_TILE_TYPES}) | 
|  | string(TOLOWER ${TILE_TYPE} TILE_TYPE_LOWER) | 
|  | set(TILE_XML ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${TILE_TYPE_LOWER}/${TILE_TYPE_LOWER}.tile.xml) | 
|  | append_file_dependency(DEPS ${TILE_XML}) | 
|  | get_file_location(TILE_XML_LOCATION ${TILE_XML}) | 
|  |  | 
|  | get_file_target(TILE_TARGET ${TILE_XML}) | 
|  | get_target_property(INCLUDE_FILES ${TILE_TARGET} INCLUDE_FILES) | 
|  | list(APPEND ARCH_INCLUDE_FILES ${TILE_XML} ${INCLUDE_FILES}) | 
|  | endforeach() | 
|  |  | 
|  | foreach(PB_TYPE ${PROJECT_RAY_ARCH_PB_TYPES}) | 
|  | string(TOLOWER ${PB_TYPE} PB_TYPE_LOWER) | 
|  | set(PB_TYPE_XML ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.pb_type.xml) | 
|  | set(MODEL_XML ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.model.xml) | 
|  | append_file_dependency(DEPS ${PB_TYPE_XML}) | 
|  | append_file_dependency(DEPS ${MODEL_XML}) | 
|  |  | 
|  | get_file_target(PB_TYPE_TARGET ${PB_TYPE_XML}) | 
|  | get_target_property(INCLUDE_FILES ${PB_TYPE_TARGET} INCLUDE_FILES) | 
|  | list(APPEND ARCH_INCLUDE_FILES ${PB_TYPE_XML} ${INCLUDE_FILES}) | 
|  |  | 
|  | get_file_target(MODEL_TARGET ${MODEL_XML}) | 
|  | get_target_property(INCLUDE_FILES ${MODEL_TARGET} INCLUDE_FILES) | 
|  | list(APPEND ARCH_INCLUDE_FILES ${MODEL_XML} ${INCLUDE_FILES}) | 
|  | endforeach() | 
|  |  | 
|  | set(ROI_ARG "") | 
|  | set(ROI_ARG_FOR_CREATE_EDGES "") | 
|  |  | 
|  | set(GENERIC_CHANNELS | 
|  | ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/channels/${PART}/channels.db) | 
|  | get_file_location(GENERIC_CHANNELS_LOCATION ${GENERIC_CHANNELS}) | 
|  | set(VPR_GRID_MAP | 
|  | ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/channels/${PART}/vpr_grid_map.csv) | 
|  | get_file_location(VPR_GRID_MAP_LOCATION ${VPR_GRID_MAP}) | 
|  |  | 
|  | if(NOT "${PROJECT_RAY_ARCH_USE_ROI}" STREQUAL "") | 
|  | set(SYNTH_DEPS "") | 
|  | append_file_dependency(SYNTH_DEPS ${GENERIC_CHANNELS}) | 
|  | add_custom_command( | 
|  | OUTPUT synth_tiles.json | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${CREATE_SYNTH_TILES} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PART} | 
|  | --connection_database ${GENERIC_CHANNELS_LOCATION} | 
|  | --roi ${PROJECT_RAY_ARCH_USE_ROI} | 
|  | --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json | 
|  | DEPENDS | 
|  | ${CREATE_SYNTH_TILES} | 
|  | ${PROJECT_RAY_ARCH_USE_ROI} ${SYNTH_DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE synth_tiles.json GENERATED) | 
|  | set_target_properties(${ARCH_TARGET} PROPERTIES USE_ROI TRUE) | 
|  | set_target_properties(${ARCH_TARGET} PROPERTIES | 
|  | SYNTH_TILES ${CMAKE_CURRENT_SOURCE_DIR}/synth_tiles.json) | 
|  |  | 
|  | set(ROI_ARG --use_roi ${PROJECT_RAY_ARCH_USE_ROI} --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json) | 
|  | append_file_dependency(DEPS synth_tiles.json) | 
|  | list(APPEND DEPS ${PROJECT_RAY_ARCH_USE_ROI}) | 
|  |  | 
|  | set(ROI_ARG_FOR_CREATE_EDGES --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json) | 
|  | append_file_dependency(CHANNELS_DEPS synth_tiles.json) | 
|  | endif() | 
|  |  | 
|  | if(NOT "${PROJECT_RAY_ARCH_GRAPH_LIMIT}" STREQUAL "") | 
|  | set(ROI_ARG_FOR_CREATE_EDGES --graph_limit ${PROJECT_RAY_ARCH_GRAPH_LIMIT}) | 
|  | set(ROI_ARG --graph_limit ${PROJECT_RAY_ARCH_GRAPH_LIMIT}) | 
|  | endif() | 
|  |  | 
|  | if(NOT "${PROJECT_RAY_ARCH_USE_OVERLAY}" STREQUAL "") | 
|  | set(SYNTH_DEPS "") | 
|  | append_file_dependency(SYNTH_DEPS ${GENERIC_CHANNELS}) | 
|  | add_custom_command( | 
|  | OUTPUT synth_tiles.json | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${CREATE_SYNTH_TILES} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PART} | 
|  | --connection_database ${GENERIC_CHANNELS_LOCATION} | 
|  | --overlay ${PROJECT_RAY_ARCH_USE_OVERLAY} | 
|  | --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json | 
|  | DEPENDS | 
|  | ${CREATE_SYNTH_TILES} | 
|  | ${PROJECT_RAY_ARCH_USE_OVERLAY} ${SYNTH_DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE synth_tiles.json GENERATED) | 
|  | set_target_properties(${ARCH_TARGET} PROPERTIES USE_OVERLAY TRUE) | 
|  | set_target_properties(${ARCH_TARGET} PROPERTIES | 
|  | SYNTH_TILES ${CMAKE_CURRENT_SOURCE_DIR}/synth_tiles.json) | 
|  |  | 
|  | set(ROI_ARG --use_overlay ${PROJECT_RAY_ARCH_USE_OVERLAY} --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json) | 
|  | append_file_dependency(DEPS synth_tiles.json) | 
|  | list(APPEND DEPS ${PROJECT_RAY_ARCH_USE_OVERLAY}) | 
|  |  | 
|  | set(ROI_ARG_FOR_CREATE_EDGES --synth_tiles ${CMAKE_CURRENT_BINARY_DIR}/synth_tiles.json --overlay) | 
|  | append_file_dependency(CHANNELS_DEPS synth_tiles.json) | 
|  | endif() | 
|  |  | 
|  | append_file_dependency(CHANNELS_DEPS ${GENERIC_CHANNELS}) | 
|  | append_file_dependency(CHANNELS_DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | get_file_location(PIN_ASSIGNMENTS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | list(APPEND CHANNELS_DEPS ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${FABRIC}/tilegrid.json) | 
|  | list(APPEND CHANNELS_DEPS ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${FABRIC}/tileconn.json) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT channels.db vpr_grid_map.csv | 
|  | COMMAND ${CMAKE_COMMAND} -E copy ${GENERIC_CHANNELS_LOCATION} ${CMAKE_CURRENT_BINARY_DIR}/channels.db | 
|  | COMMAND ${CMAKE_COMMAND} -E copy ${VPR_GRID_MAP_LOCATION} ${CMAKE_CURRENT_BINARY_DIR}/vpr_grid_map.csv | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${CREATE_EDGES} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PART} | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | --connection_database ${CMAKE_CURRENT_BINARY_DIR}/channels.db | 
|  | ${ROI_ARG_FOR_CREATE_EDGES} | 
|  | DEPENDS | 
|  | ${PYTHON3} ${CREATE_EDGES} ${CREATE_EDGES_DEPS} ${CHANNELS_DEPS} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE channels.db GENERATED) | 
|  | get_file_target(CHAN channels.db) | 
|  |  | 
|  | add_file_target(FILE vpr_grid_map.csv GENERATED) | 
|  |  | 
|  | # Linearize dependency to avoid double builds | 
|  | get_file_target(GRID_MAP vpr_grid_map.csv) | 
|  | add_dependencies(${GRID_MAP} ${CHAN}) | 
|  |  | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | append_file_dependency(DEPS channels.db) | 
|  |  | 
|  | string(REPLACE ";" "," TILE_TYPES_COMMA "${PROJECT_RAY_ARCH_TILE_TYPES}") | 
|  | string(REPLACE ";" "," PB_TYPES_COMMA "${PROJECT_RAY_ARCH_PB_TYPES}") | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT arch.xml | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${ARCH_IMPORT} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PART} | 
|  | --connection_database ${CMAKE_CURRENT_BINARY_DIR}/channels.db | 
|  | --output-arch ${CMAKE_CURRENT_BINARY_DIR}/arch.xml | 
|  | --tile-types "${TILE_TYPES_COMMA}" | 
|  | --pb_types "${PB_TYPES_COMMA}" | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | --device ${DEVICE} | 
|  | ${ROI_ARG} | 
|  | DEPENDS | 
|  | ${ARCH_IMPORT} | 
|  | ${DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE arch.xml GENERATED) | 
|  | get_file_target(ARCH_TARGET arch.xml) | 
|  | set_target_properties(${ARCH_TARGET} PROPERTIES INCLUDE_FILES "${ARCH_INCLUDE_FILES}") | 
|  | endfunction() | 
|  |  | 
|  | function(PROJECT_RAY_PREPARE_DATABASE) | 
|  | set(options) | 
|  | set(oneValueArgs FAMILY PRJRAY_ARCH PRJRAY_DIR PRJRAY_DB_DIR PROTOTYPE_PART) | 
|  | set(multiValueArgs PARTS) | 
|  | cmake_parse_arguments( | 
|  | PROJECT_RAY_PREPARE_DATABASE | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | get_target_property_required(PYTHON3 env PYTHON3) | 
|  |  | 
|  | set(FAMILY ${PROJECT_RAY_PREPARE_DATABASE_PRJRAY_FAMILY}) | 
|  | set(PRJRAY_ARCH ${PROJECT_RAY_PREPARE_DATABASE_PRJRAY_ARCH}) | 
|  | set(PRJRAY_DIR ${PROJECT_RAY_PREPARE_DATABASE_PRJRAY_DIR}) | 
|  | set(PRJRAY_DB_DIR ${PROJECT_RAY_PREPARE_DATABASE_PRJRAY_DB_DIR}) | 
|  | set(PROTOTYPE_PART ${PROJECT_RAY_PREPARE_DATABASE_PROTOTYPE_PART}) | 
|  |  | 
|  | set(FORM_CHANNELS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_form_channels.py) | 
|  | set(ASSIGN_PINS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_assign_tile_pin_direction.py) | 
|  | file(GLOB DEPS ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/*.json) | 
|  | file(GLOB DEPS2 ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/${PART}/*.json) | 
|  | file(GLOB DEPS3 ${PRJRAY_DIR}/prjxray/*.py) | 
|  |  | 
|  | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/channels) | 
|  | foreach(PART ${PROJECT_RAY_PREPARE_DATABASE_PARTS}) | 
|  | file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/channels/${PART}) | 
|  | set(CHANNELS channels/${PART}/channels.db) | 
|  | set(VPR_GRID_MAP channels/${PART}/vpr_grid_map.csv) | 
|  | add_custom_command( | 
|  | OUTPUT ${CHANNELS} ${VPR_GRID_MAP} | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${FORM_CHANNELS} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PROTOTYPE_PART} | 
|  | --connection_database ${CMAKE_CURRENT_BINARY_DIR}/${CHANNELS} | 
|  | --grid_map_output ${CMAKE_CURRENT_BINARY_DIR}/${VPR_GRID_MAP} | 
|  | DEPENDS | 
|  | ${FORM_CHANNELS} | 
|  | ${DEPS} ${DEPS2} ${DEPS3} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE ${CHANNELS} GENERATED) | 
|  | get_file_target(CHAN ${CHANNELS}) | 
|  |  | 
|  | add_file_target(FILE ${VPR_GRID_MAP} GENERATED) | 
|  |  | 
|  | # Linearize dependency to avoid double builds | 
|  | get_file_target(GRID_MAP ${VPR_GRID_MAP}) | 
|  | add_dependencies(${GRID_MAP} ${CHAN}) | 
|  |  | 
|  | endforeach() | 
|  |  | 
|  | set(PROTOTYPE_CHANNELS channels/${PROTOTYPE_PART}/channels.db) | 
|  | append_file_dependency(DEPS ${PROTOTYPE_CHANNELS}) | 
|  | set(PIN_ASSIGNMENTS pin_assignments.json) | 
|  | add_custom_command( | 
|  | OUTPUT ${PIN_ASSIGNMENTS} | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${ASSIGN_PINS} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PROTOTYPE_PART} | 
|  | --connection_database ${CMAKE_CURRENT_BINARY_DIR}/${PROTOTYPE_CHANNELS} | 
|  | --pin_assignments ${CMAKE_CURRENT_BINARY_DIR}/${PIN_ASSIGNMENTS} | 
|  | DEPENDS | 
|  | ${ASSIGN_PINS} | 
|  | ${DEPS} ${DEPS2} ${DEPS3} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE ${PIN_ASSIGNMENTS} GENERATED) | 
|  | endfunction() | 
|  |  | 
|  | function(PROJECT_RAY_TILE) | 
|  | # | 
|  | # This function is used to create targets to generate pb_type, model and tile XML definitions. | 
|  | # | 
|  | # ARCH name of the arch that is considered (e.g. artix7, zynq7, etc.) | 
|  | # TILE name of the tile that has to be generated (e.g. CLBLM_R, BRAM_L, etc.) | 
|  | # SITE_TYPES list of sites contained in the considered tile (e.g. CLBLM_R contains a SLICEM and SLICEL sites) | 
|  | # EQUIVALENT_TILES list of pb_types that can be placed at the tile's location (e.g. SLICEM tile can have both SLICEM and SLICEL pb_types) | 
|  | # SITE_AS_TILE option to state if the tile physically is a site, but it needs to be treated as a site | 
|  | # USE_DATABASE option enables usage of connection database for tile | 
|  | #     definition, instead of using the project X-Ray database. | 
|  | # FILTER_X can be supplied to filter to sites that have the given X | 
|  | #     coordinate. | 
|  | # UNUSED_WIRES: contains a list of wires in site to be dropped | 
|  | # | 
|  | # Usage: | 
|  | # ~~~ | 
|  | # project_xray_tile( | 
|  | #   ARCH <arch_name> | 
|  | #   TILE <tile_name> | 
|  | #   SITE_TYPES <site_name_1> <site_name_2> ... | 
|  | #   EQUIVALENT_SITES <equivalent_site_name_1> <equivalent_site_name_2> ... | 
|  | #   SITE_AS_TILE (option) | 
|  | #   FUSED_SITES (option) | 
|  | #   USE_DATABASE (option) | 
|  | #   SITE_COORDS (option) | 
|  | #   NO_FASM_PREFIX (option) | 
|  | #   [FILTER_X <x_coord>] | 
|  | #   UNUSED_WIRES <unused wires> | 
|  | #   ) | 
|  | # ~~~ | 
|  |  | 
|  | set(options FUSED_SITES SITE_AS_TILE USE_DATABASE NO_FASM_PREFIX) | 
|  | set(oneValueArgs ARCH TILE FILTER_X SITE_COORDS) | 
|  | set(multiValueArgs SITE_TYPES EQUIVALENT_SITES UNUSED_WIRES) | 
|  | cmake_parse_arguments( | 
|  | PROJECT_RAY_TILE | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | string(TOLOWER ${PROJECT_RAY_TILE_TILE} TILE) | 
|  |  | 
|  | get_target_property_required(PYTHON3 env PYTHON3) | 
|  |  | 
|  | set(ARCH ${PROJECT_RAY_TILE_ARCH}) | 
|  | get_target_property_required(PRJRAY_ARCH ${ARCH} PRJRAY_ARCH) | 
|  | get_target_property_required(PROTOTYPE_PART ${ARCH} PROTOTYPE_PART) | 
|  | 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}) | 
|  |  | 
|  | set(TILE_IMPORT ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_tile_import.py) | 
|  | get_project_ray_dependencies(DEPS ${PRJRAY_DB_DIR} ${PRJRAY_ARCH} ${TILE}) | 
|  |  | 
|  | set(PB_TYPE_INCLUDE_FILES "") | 
|  | set(MODEL_INCLUDE_FILES "") | 
|  | foreach(SITE_TYPE ${PROJECT_RAY_TILE_SITE_TYPES}) | 
|  | string(TOLOWER ${SITE_TYPE} SITE_TYPE_LOWER) | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}.pb_type.xml) | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}.model.xml) | 
|  | list(APPEND PB_TYPE_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}.pb_type.xml) | 
|  | list(APPEND MODEL_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}.model.xml) | 
|  | endforeach() | 
|  | string(REPLACE ";" "," SITE_TYPES_COMMA "${PROJECT_RAY_TILE_SITE_TYPES}") | 
|  |  | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | get_file_location(PIN_ASSIGNMENTS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  |  | 
|  | set(FUSED_SITES_ARGS "") | 
|  | if(PROJECT_RAY_TILE_FUSED_SITES) | 
|  | set(FUSED_SITES_ARGS "--fused_sites") | 
|  | endif() | 
|  | if(PROJECT_RAY_TILE_SITE_AS_TILE) | 
|  | set(FUSED_SITES_ARGS "--site_as_tile") | 
|  | endif() | 
|  | if(PROJECT_RAY_TILE_USE_DATABASE) | 
|  | set(GENERIC_CHANNELS | 
|  | ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/channels/${PROTOTYPE_PART}/channels.db) | 
|  | get_file_location(GENERIC_CHANNELS_LOCATION ${GENERIC_CHANNELS}) | 
|  | append_file_dependency(DEPS ${GENERIC_CHANNELS}) | 
|  | set(FUSED_SITES_ARGS --connection_database ${GENERIC_CHANNELS_LOCATION}) | 
|  | endif() | 
|  |  | 
|  | set(SITE_COORDS_ARGS "") | 
|  | if(NOT "${PROJECT_RAY_TILE_SITE_COORDS}" STREQUAL "") | 
|  | set(SITE_COORDS_ARGS "--site_coords" ${PROJECT_RAY_TILE_SITE_COORDS}) | 
|  | endif() | 
|  |  | 
|  | set(FILTER_X_ARGS "") | 
|  | if(NOT "${PROJECT_RAY_TILE_FILTER_X}" STREQUAL "") | 
|  | set(FILTER_X_ARGS --filter_x ${PROJECT_RAY_TILE_FILTER_X}) | 
|  | endif() | 
|  |  | 
|  | set(FASM_ARGS "") | 
|  | if(PROJECT_RAY_TILE_NO_FASM_PREFIX) | 
|  | set(FASM_ARGS "--no_fasm_prefix") | 
|  | endif() | 
|  |  | 
|  | set(UNUSED_WIRES "") | 
|  | if(PROJECT_RAY_TILE_UNUSED_WIRES) | 
|  | string(REPLACE ";" "," UNUSED_WIRES_COMMA "${PROJECT_RAY_TILE_UNUSED_WIRES}") | 
|  | set(UNUSED_WIRES "--unused_wires" ${UNUSED_WIRES_COMMA}) | 
|  | endif() | 
|  |  | 
|  | string(TOUPPER ${TILE} TILE_UPPER) | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${TILE}.pb_type.xml ${TILE}.model.xml | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${TILE_IMPORT} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PROTOTYPE_PART} | 
|  | --tile ${TILE_UPPER} | 
|  | --site_directory ${f4pga-arch-defs_BINARY_DIR}/xilinx/common/primitives | 
|  | --site_types ${SITE_TYPES_COMMA} | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | --output-pb-type ${CMAKE_CURRENT_BINARY_DIR}/${TILE}.pb_type.xml | 
|  | --output-model ${CMAKE_CURRENT_BINARY_DIR}/${TILE}.model.xml | 
|  | ${UNUSED_WIRES} | 
|  | ${FUSED_SITES_ARGS} | 
|  | ${SITE_COORDS_ARGS} | 
|  | ${FASM_ARGS} | 
|  | ${FILTER_X_ARGS} | 
|  | DEPENDS | 
|  | ${TILE_IMPORT} | 
|  | ${DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE ${TILE}.pb_type.xml GENERATED) | 
|  | get_file_target(PB_TYPE_TARGET ${TILE}.pb_type.xml) | 
|  | set_target_properties(${PB_TYPE_TARGET} PROPERTIES INCLUDE_FILES "${PB_TYPE_INCLUDE_FILES}") | 
|  |  | 
|  | get_file_target(MODEL_TARGET ${TILE}.model.xml) | 
|  | add_custom_target(${MODEL_TARGET}) | 
|  |  | 
|  | # Linearize the dependency to prevent double builds. | 
|  | add_dependencies(${MODEL_TARGET} ${PB_TYPE_TARGET}) | 
|  | set_target_properties(${MODEL_TARGET} PROPERTIES | 
|  | INCLUDE_FILES "${MODEL_INCLUDE_FILES}" | 
|  | LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${TILE}.model.xml | 
|  | ) | 
|  |  | 
|  | # tile tags | 
|  | set(PHYSICAL_TILE_IMPORT ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_physical_tile_import.py) | 
|  | get_project_ray_dependencies(DEPS ${PRJRAY_DB_DIR} ${PRJRAY_ARCH} ${TILE}) | 
|  |  | 
|  | foreach(EQUIVALENT_SITE ${PROJECT_RAY_TILE_EQUIVALENT_SITES}) | 
|  | string(TOLOWER ${EQUIVALENT_SITE} EQUIVALENT_SITE_LOWER) | 
|  | append_file_dependency(TILES_DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${EQUIVALENT_SITE_LOWER}/${EQUIVALENT_SITE_LOWER}.pb_type.xml) | 
|  | list(APPEND EQUIVALENT_SITES_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${EQUIVALENT_SITE_LOWER}/${EQUIVALENT_SITE_LOWER}.pb_type.xml) | 
|  | endforeach() | 
|  | append_file_dependency(TILES_DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${TILE}/${TILE}.pb_type.xml) | 
|  | list(APPEND EQUIVALENT_SITES_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles/${TILE}/${TILE}.pb_type.xml) | 
|  |  | 
|  | string(REPLACE ";" "," EQUIVALENT_SITES_COMMA "${PROJECT_RAY_TILE_EQUIVALENT_SITES}") | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${TILE}.tile.xml | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${PHYSICAL_TILE_IMPORT} | 
|  | --tile ${TILE_UPPER} | 
|  | --tiles-directory ${f4pga-arch-defs_BINARY_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles | 
|  | --equivalent-sites=${EQUIVALENT_SITES_COMMA} | 
|  | --pin-prefix=${PIN_PREFIX_COMMA} | 
|  | --output-tile ${CMAKE_CURRENT_BINARY_DIR}/${TILE}.tile.xml | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | DEPENDS | 
|  | ${PHYSICAL_TILE_IMPORT} | 
|  | ${TILES_DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | add_file_target(FILE ${TILE}.tile.xml GENERATED) | 
|  | get_file_target(TILE_TARGET ${TILE}.tile.xml) | 
|  | set_target_properties(${TILE_TARGET} PROPERTIES INCLUDE_FILES "${EQUIVALENT_SITES_INCLUDE_FILES}") | 
|  | endfunction() | 
|  |  | 
|  | function(PROJECT_RAY_EQUIV_TILE) | 
|  | # | 
|  | # This function is used to create targets to generate pb_type, model and | 
|  | # tile XML definitions for tile groups. | 
|  | # | 
|  | # A tile group is a set of related tiles that share some equivilances. | 
|  | # | 
|  | # ARCH name of the part that is considered (e.g. artix7, zynq7, etc.) | 
|  | # TILES name of the tile that has to be generated (e.g. RIOPAD_M, etc.) | 
|  | # PB_TYPES list of pb_types to be generated that map into tiles. | 
|  | # PB_TYPE_SITES list of variables containing a list of site types in each | 
|  | #     PB_TYPE. | 
|  | # SITE_EQUIV list of sites that have an equivalent relationship. | 
|  | # | 
|  | #     Examples: | 
|  | #         SITE_EQUIV IOB33M=IOB33 IOB33S=IOB33 | 
|  | # | 
|  | #         IOB33M can be used as a IOB33 | 
|  | #         IOB33S can be used as a IOB33. | 
|  | # | 
|  | #  The length of PB_TYPES and PB_TYPE_SITES should be the same | 
|  | # | 
|  | # Usage: | 
|  | # ~~~ | 
|  | # project_xray_equiv_tile( | 
|  | #   ARCH <part_name> | 
|  | #   TILES <tile_name_1> <tile_name_2> ... | 
|  | #   PB_TYPES <site_name_1> <site_name_2> ... | 
|  | #   PB_TYPE_SITES <list_name_1> <list_name_2> ... | 
|  | #   SITE_EQUIV <general_site1>=<specific_site1> ... | 
|  | #   ) | 
|  | # ~~~ | 
|  |  | 
|  | set(options) | 
|  | set(oneValueArgs ARCH) | 
|  | set(multiValueArgs TILES PB_TYPES PB_TYPE_SITES SITE_EQUIV) | 
|  | cmake_parse_arguments( | 
|  | PROJECT_RAY_EQUIV_TILE | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | set(ARCH ${PROJECT_RAY_EQUIV_TILE_ARCH}) | 
|  | get_target_property_required(FAMILY ${ARCH} FAMILY) | 
|  | if(NOT "${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${PROJECT_RAY_EQUIV_TILE_ARCH}/tiles") | 
|  | message(FATAL_ERROR "project_xray_equiv_tile can only be invoked from the ARCH tiles directory (xc/${FAMILY}/archs/${PROJECT_RAY_EQUIV_TILE_ARCH}/tiles/), in ${CMAKE_CURRENT_SOURCE_DIR}") | 
|  | endif() | 
|  |  | 
|  | 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}) | 
|  |  | 
|  | # This code is using prefixed variables because PB_TYPE_SITES list are | 
|  | # variables from parent scope, and prefixing is the canonical CMake way to | 
|  | # avoid collisions. | 
|  | list(LENGTH PROJECT_RAY_EQUIV_TILE_PB_TYPES      PROJECT_RAY_EQUIV_TILE_NPB_TYPES) | 
|  | list(LENGTH PROJECT_RAY_EQUIV_TILE_PB_TYPE_SITES PROJECT_RAY_EQUIV_TILE_NPB_TYPE_SITES) | 
|  |  | 
|  | if(NOT ${PROJECT_RAY_EQUIV_TILE_NPB_TYPES} EQUAL ${PROJECT_RAY_EQUIV_TILE_NPB_TYPE_SITES}) | 
|  | message(FATAL_ERROR "Number of pb_types (${PROJECT_RAY_EQUIV_TILE_NPB_TYPES}) != number of pb_type sites (${PROJECT_RAY_EQUIV_TILE_NPB_TYPE_SITES})") | 
|  | endif() | 
|  |  | 
|  | set(PROJECT_RAY_EQUIV_TILE_SITES "") | 
|  | set(PROJECT_RAY_EQUIV_TILE_PB_TYPES_ARGS "") | 
|  | math(EXPR PROJECT_RAY_EQUIV_TILE_NPB_TYPES_N1 ${PROJECT_RAY_EQUIV_TILE_NPB_TYPES}-1) | 
|  | foreach(PROJECT_RAY_EQUIV_TILE_IDX RANGE ${PROJECT_RAY_EQUIV_TILE_NPB_TYPES_N1}) | 
|  | list(GET PROJECT_RAY_EQUIV_TILE_PB_TYPES ${PROJECT_RAY_EQUIV_TILE_IDX} PROJECT_RAY_EQUIV_TILE_PB_TYPE) | 
|  | list(GET PROJECT_RAY_EQUIV_TILE_PB_TYPE_SITES  ${PROJECT_RAY_EQUIV_TILE_IDX} PROJECT_RAY_EQUIV_TILE_PB_SITES) | 
|  |  | 
|  | # Bring in list from parent scope. | 
|  | set(PROJECT_RAY_EQUIV_TILE_PB_SITES ${${PROJECT_RAY_EQUIV_TILE_PB_SITES}}) | 
|  |  | 
|  | foreach(PROJECT_RAY_EQUIV_TILE_SITE ${PROJECT_RAY_EQUIV_TILE_PB_SITES}) | 
|  | list(APPEND PROJECT_RAY_EQUIV_TILE_SITES ${PROJECT_RAY_EQUIV_TILE_PB_SITES}) | 
|  | endforeach() | 
|  |  | 
|  | set(PROJECT_RAY_EQUIV_TILE_ARG "${PROJECT_RAY_EQUIV_TILE_PB_TYPE}=${PROJECT_RAY_EQUIV_TILE_PB_SITES}") | 
|  | string(REPLACE ";" "," PROJECT_RAY_EQUIV_TILE_ARG "${PROJECT_RAY_EQUIV_TILE_ARG}") | 
|  |  | 
|  | list(APPEND PROJECT_RAY_EQUIV_TILE_PB_TYPES_ARGS ${PROJECT_RAY_EQUIV_TILE_ARG}) | 
|  | endforeach() | 
|  |  | 
|  | # Done with variables from parent scope, prefix is not longer required. | 
|  |  | 
|  |  | 
|  | get_target_property_required(PYTHON3 env PYTHON3) | 
|  |  | 
|  | get_target_property(PROTOTYPE_PART ${ARCH} PROTOTYPE_PART) | 
|  | set(PB_TYPE_INCLUDE_FILES "") | 
|  | set(MODEL_INCLUDE_FILES "") | 
|  | list(REMOVE_DUPLICATES PROJECT_RAY_EQUIV_TILE_SITES) | 
|  | foreach(SITE_TYPE ${PROJECT_RAY_EQUIV_TILE_SITES}) | 
|  | string(TOLOWER ${SITE_TYPE} SITE_TYPE_LOWER) | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}/${SITE_TYPE_LOWER}.pb_type.xml) | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}/${SITE_TYPE_LOWER}.model.xml) | 
|  | list(APPEND PB_TYPE_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}/${SITE_TYPE_LOWER}.pb_type.xml) | 
|  | list(APPEND MODEL_INCLUDE_FILES ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/primitives/${SITE_TYPE_LOWER}/${SITE_TYPE_LOWER}.model.xml) | 
|  | endforeach() | 
|  |  | 
|  | set(TILES_ARGS "${PROJECT_RAY_EQUIV_TILE_TILES}") | 
|  | string(REPLACE ";" "," TILES_ARGS "${TILES_ARGS}") | 
|  |  | 
|  | set(EQUIV_ARGS "") | 
|  | if(NOT "${PROJECT_RAY_EQUIV_TILE_SITE_EQUIV}" STREQUAL "") | 
|  | set(EQUIV_ARGS "${PROJECT_RAY_EQUIV_TILE_SITE_EQUIV}") | 
|  | string(REPLACE ";" "," EQUIV_ARGS "${EQUIV_ARGS}") | 
|  | set(EQUIV_ARGS --site_equivilances ${EQUIV_ARGS}) | 
|  | endif() | 
|  |  | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | get_file_location(PIN_ASSIGNMENTS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  |  | 
|  | set(GENERIC_CHANNELS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/channels/${PROTOTYPE_PART}/channels.db) | 
|  | get_file_location(GENERIC_CHANNELS_LOCATION ${GENERIC_CHANNELS}) | 
|  | append_file_dependency(DEPS ${GENERIC_CHANNELS}) | 
|  |  | 
|  | set(OUTPUTS "") | 
|  |  | 
|  | foreach(TILE ${PROJECT_RAY_EQUIV_TILE_TILES}) | 
|  | string(TOLOWER ${TILE} TILE_LOWER) | 
|  | list(APPEND OUTPUTS ${TILE_LOWER}/${TILE_LOWER}.tile.xml) | 
|  | endforeach() | 
|  |  | 
|  | foreach(PB_TYPE ${PROJECT_RAY_EQUIV_TILE_PB_TYPES}) | 
|  | string(TOLOWER ${PB_TYPE} PB_TYPE_LOWER) | 
|  | list(APPEND OUTPUTS ${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.pb_type.xml) | 
|  | list(APPEND OUTPUTS ${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.model.xml) | 
|  | endforeach() | 
|  |  | 
|  | set(TILE_IMPORT ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_create_equiv_tiles.py) | 
|  | add_custom_command( | 
|  | OUTPUT ${OUTPUTS} | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${TILE_IMPORT} | 
|  | --output_directory ${f4pga-arch-defs_BINARY_DIR}/xilinx/${FAMILY}/archs/${ARCH}/tiles | 
|  | --site_directory ${f4pga-arch-defs_BINARY_DIR}/xilinx/common/primitives | 
|  | --connection_database ${GENERIC_CHANNELS_LOCATION} | 
|  | --tile_types ${TILES_ARGS} | 
|  | --pb_types ${PROJECT_RAY_EQUIV_TILE_PB_TYPES_ARGS} | 
|  | ${EQUIV_ARGS} | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | DEPENDS | 
|  | ${TILE_IMPORT} | 
|  | ${DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  |  | 
|  | set(TARGETS "") | 
|  | foreach(TILE ${PROJECT_RAY_EQUIV_TILE_TILES}) | 
|  | string(TOLOWER ${TILE} TILE_LOWER) | 
|  | set(FILE_REL ${TILE_LOWER}/${TILE_LOWER}.tile.xml) | 
|  | add_file_target(FILE ${FILE_REL} GENERATED) | 
|  | get_file_target(TILE_TARGET ${FILE_REL}) | 
|  | list(APPEND TARGETS ${TILE_TARGET}) | 
|  | endforeach() | 
|  |  | 
|  | foreach(PB_TYPE ${PROJECT_RAY_EQUIV_TILE_PB_TYPES}) | 
|  | string(TOLOWER ${PB_TYPE} PB_TYPE_LOWER) | 
|  | set(FILE_REL ${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.pb_type.xml) | 
|  | add_file_target(FILE ${FILE_REL} GENERATED) | 
|  | get_file_target(PB_TYPE_TARGET ${FILE_REL}) | 
|  | set_target_properties(${PB_TYPE_TARGET} PROPERTIES | 
|  | INCLUDE_FILES "${PB_TYPE_INCLUDE_FILES}") | 
|  | list(APPEND TARGETS ${PB_TYPE_TARGET}) | 
|  |  | 
|  | set(FILE_REL ${PB_TYPE_LOWER}/${PB_TYPE_LOWER}.model.xml) | 
|  | add_file_target(FILE ${FILE_REL} GENERATED) | 
|  | get_file_target(MODEL_TARGET ${FILE_REL}) | 
|  | set_target_properties(${MODEL_TARGET} PROPERTIES | 
|  | INCLUDE_FILES "${MODEL_INCLUDE_FILES}") | 
|  | list(APPEND TARGETS ${MODEL_TARGET}) | 
|  | endforeach() | 
|  |  | 
|  | # Linearize the dependency to prevent double builds. | 
|  | list(GET TARGETS 0 TARGET0) | 
|  | list(LENGTH TARGETS NTARGETS) | 
|  |  | 
|  | math(EXPR NTARGETS_N1 ${NTARGETS}-1) | 
|  | foreach(IDX RANGE 1 ${NTARGETS_N1}) | 
|  | list(GET TARGETS ${IDX} TARGET) | 
|  | add_dependencies(${TARGET} ${TARGET0}) | 
|  | endforeach() | 
|  | endfunction() | 
|  |  | 
|  | function(PROJECT_RAY_TILE_CAPACITY) | 
|  | # ~~~ | 
|  | # PROJECT_RAY_TILE_CAPACITY( | 
|  | #   ARCH <arch> | 
|  | #   TILE <tile> | 
|  | #   SITE_TYPES <site types> | 
|  | #   [UNUSED_WIRES <unused wires>] | 
|  | #   ) | 
|  | # ~~~ | 
|  | # | 
|  | # SITE_TYPES: contains a list of sites that are used as sub tiles for the specified tile. | 
|  | #             The total number of instances of a site type appears as the capacity of the sub tile | 
|  | # UNUSED_WIRES: optional list of wires in site to be dropped | 
|  |  | 
|  | set(options) | 
|  | set(oneValueArgs ARCH TILE) | 
|  | set(multiValueArgs SITE_TYPES UNUSED_WIRES) | 
|  | cmake_parse_arguments( | 
|  | PROJECT_RAY_TILE_CAPACITY | 
|  | "${options}" | 
|  | "${oneValueArgs}" | 
|  | "${multiValueArgs}" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | set(DEPS "") | 
|  | set(TILE ${PROJECT_RAY_TILE_CAPACITY_TILE}) | 
|  | set(ARCH ${PROJECT_RAY_TILE_CAPACITY_ARCH}) | 
|  |  | 
|  | get_target_property_required(PYTHON3 env PYTHON3) | 
|  | get_target_property_required(PRJRAY_ARCH ${ARCH} PRJRAY_ARCH) | 
|  | get_target_property_required(FAMILY ${ARCH} FAMILY) | 
|  | get_target_property_required(PROTOTYPE_PART ${ARCH} PROTOTYPE_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}) | 
|  |  | 
|  | append_file_dependency(DEPS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  | get_file_location(PIN_ASSIGNMENTS ${f4pga-arch-defs_SOURCE_DIR}/xilinx/${FAMILY}/archs/${ARCH}/pin_assignments.json) | 
|  |  | 
|  | set(TILE_CAPACITY_IMPORT ${f4pga-arch-defs_SOURCE_DIR}/xilinx/common/utils/prjxray_import_tile_capacity.py) | 
|  |  | 
|  | string(REPLACE ";" "," SITE_TYPES_COMMA "${PROJECT_RAY_TILE_CAPACITY_SITE_TYPES}") | 
|  |  | 
|  | string(TOLOWER ${TILE} TILE_LOWER) | 
|  |  | 
|  | set(UNUSED_WIRES "") | 
|  | if(PROJECT_RAY_TILE_CAPACITY_UNUSED_WIRES) | 
|  | string(REPLACE ";" "," UNUSED_WIRES_COMMA "${PROJECT_RAY_TILE_CAPACITY_UNUSED_WIRES}") | 
|  | set(UNUSED_WIRES "--unused_wires" ${UNUSED_WIRES_COMMA}) | 
|  | endif() | 
|  |  | 
|  | add_custom_command( | 
|  | OUTPUT ${TILE_LOWER}.tile.xml | 
|  | COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${PRJRAY_DIR}:${f4pga-arch-defs_SOURCE_DIR}/utils | 
|  | ${PYTHON3} ${TILE_CAPACITY_IMPORT} | 
|  | --db_root ${PRJRAY_DB_DIR}/${PRJRAY_ARCH}/ | 
|  | --part ${PROTOTYPE_PART} | 
|  | --output_directory ${CMAKE_CURRENT_BINARY_DIR} | 
|  | --site_directory ${f4pga-arch-defs_BINARY_DIR}/xilinx/common/primitives | 
|  | --tile_type ${TILE} | 
|  | --pb_types ${SITE_TYPES_COMMA} | 
|  | --pin_assignments ${PIN_ASSIGNMENTS} | 
|  | ${UNUSED_WIRES} | 
|  | DEPENDS | 
|  | ${TILE_CAPACITY_IMPORT} | 
|  | ${DEPS} | 
|  | ${PYTHON3} | 
|  | ) | 
|  | add_file_target(FILE ${TILE_LOWER}.tile.xml GENERATED) | 
|  | endfunction() |