blob: 0dd78bf09c6dbb686ed040ccb4c94356896d0e8f [file] [log] [blame] [edit]
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()