| function(QUICKLOGIC_DEFINE_QLF_DEVICE) |
| # ~~~ |
| # QUICKLOGIC_DEFINE_QLF_DEVICE( |
| # NAME <name> |
| # FAMILY <family> |
| # ARCH <arch> |
| # ARCH_XML <arch.xml> |
| # LAYOUT <layout name> |
| # RR_GRAPH <rr_graph> |
| # [ROUTE_CHAN_WIDTH <route channel width>] |
| # REPACKING_RULES <repacking_rules.json> |
| # ) |
| # ~~~ |
| set(options) |
| set(oneValueArgs NAME FAMILY ARCH ARCH_XML LAYOUT RR_GRAPH ROUTE_CHAN_WIDTH REPACKING_RULES) |
| set(multiValueArgs) |
| cmake_parse_arguments( |
| QUICKLOGIC_DEFINE_QLF_DEVICE |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| ${ARGN} |
| ) |
| |
| # Get args |
| set(NAME ${QUICKLOGIC_DEFINE_QLF_DEVICE_NAME}) |
| set(FAMILY ${QUICKLOGIC_DEFINE_QLF_DEVICE_FAMILY}) |
| set(ARCH ${QUICKLOGIC_DEFINE_QLF_DEVICE_ARCH}) |
| set(ARCH_XML ${QUICKLOGIC_DEFINE_QLF_DEVICE_ARCH_XML}) |
| set(LAYOUT ${QUICKLOGIC_DEFINE_QLF_DEVICE_LAYOUT}) |
| set(RR_GRAPH ${QUICKLOGIC_DEFINE_QLF_DEVICE_RR_GRAPH}) |
| |
| set(REPACKING_RULES ${QUICKLOGIC_DEFINE_QLF_DEVICE_REPACKING_RULES}) |
| |
| # If ROUTE_CHAN_WIDTH is not given then use the value from the architecture |
| if("${QUICKLOGIC_DEFINE_QLF_DEVICE_ROUTE_CHAN_WIDTH}" STREQUAL "") |
| get_target_property_required(ROUTE_CHAN_WIDTH ${ARCH} ROUTE_CHAN_WIDTH) |
| else() |
| set(ROUTE_CHAN_WIDTH ${QUICKLOGIC_DEFINE_QLF_DEVICE_ROUTE_CHAN_WIDTH}) |
| endif() |
| |
| get_target_property_required(PYTHON3 env PYTHON3) |
| |
| # Format device name and device type name |
| set(DEVICE "${ARCH}-${NAME}") |
| set(DEVICE_TYPE ${DEVICE}-virt) |
| |
| set(PACKAGE ${DEVICE}) |
| |
| # ....................................................... |
| |
| set(ARCH_XML_NAME ${DEVICE}.arch.xml) |
| |
| # If there is a file target then depend on it |
| get_file_target(ARCH_XML_TARGET ${ARCH_XML}) |
| if (TARGET "${ARCH_XML_TARGET}") |
| set(ARCH_XML_DEP ${ARCH_XML_TARGET}) |
| get_file_location(ARCH_XML ${ARCH_XML}) |
| else () |
| set(ARCH_XML_DEP ${ARCH_XML}) |
| endif () |
| |
| # Copy VPR arch XML |
| add_custom_command( |
| OUTPUT |
| ${CMAKE_CURRENT_BINARY_DIR}/${ARCH_XML_NAME} |
| DEPENDS |
| ${ARCH_XML_DEP} |
| COMMAND |
| ${CMAKE_COMMAND} -E copy |
| ${ARCH_XML} |
| ${CMAKE_CURRENT_BINARY_DIR}/${ARCH_XML_NAME} |
| ) |
| |
| add_file_target(FILE ${ARCH_XML_NAME} GENERATED) |
| |
| # ....................................................... |
| |
| set(RR_GRAPH_FOR_DEVICE ${DEVICE}.rr_graph.bin) |
| |
| # If there is a file target then depend on it |
| get_file_target(RR_GRAPH_TARGET ${RR_GRAPH}) |
| if (TARGET "${RR_GRAPH_TARGET}") |
| set(RR_GRAPH_DEP ${RR_GRAPH_TARGET}) |
| get_file_location(RR_GRAPH ${RR_GRAPH}) |
| else () |
| set(RR_GRAPH_DEP ${RR_GRAPH}) |
| endif () |
| |
| # If the routing graph is compressed uncompress it |
| if ("${RR_GRAPH}" MATCHES ".*\\.gz$") |
| |
| add_custom_command( |
| OUTPUT |
| ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE} |
| DEPENDS |
| ${RR_GRAPH_DEP} |
| COMMAND |
| ${CMAKE_COMMAND} -E copy |
| ${RR_GRAPH} |
| ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE}.gz |
| COMMAND |
| gunzip -v -f ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE}.gz |
| ) |
| |
| # If not then copy it |
| else () |
| |
| add_custom_command( |
| OUTPUT |
| ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE} |
| DEPENDS |
| ${RR_GRAPH_DEP} |
| COMMAND |
| ${CMAKE_COMMAND} -E copy |
| ${RR_GRAPH} |
| ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE} |
| ) |
| |
| endif () |
| |
| add_file_target(FILE ${RR_GRAPH_FOR_DEVICE} GENERATED) |
| |
| # ....................................................... |
| |
| set(REPACKING_RULES_NAME ${DEVICE}.repacking_rules.json) |
| |
| # If there is a file target then depend on it |
| get_file_target(REPACKING_RULES_TARGET ${REPACKING_RULES}) |
| if (TARGET "${REPACKING_RULES_TARGET}") |
| set(REPACKING_RULES_DEP ${REPACKING_RULES_TARGET}) |
| get_file_location(REPACKING_RULES ${REPACKING_RULES}) |
| else () |
| set(REPACKING_RULES_DEP ${REPACKING_RULES}) |
| endif () |
| |
| # Copy repacking rules |
| add_custom_command( |
| OUTPUT |
| ${CMAKE_CURRENT_BINARY_DIR}/${REPACKING_RULES_NAME} |
| DEPENDS |
| ${REPACKING_RULES_DEP} |
| COMMAND |
| ${CMAKE_COMMAND} -E copy |
| ${REPACKING_RULES} |
| ${CMAKE_CURRENT_BINARY_DIR}/${REPACKING_RULES_NAME} |
| ) |
| |
| add_file_target(FILE ${REPACKING_RULES_NAME} GENERATED) |
| |
| # ....................................................... |
| |
| add_custom_target( |
| ${DEVICE_TYPE} |
| ) |
| |
| set_target_properties( |
| ${DEVICE_TYPE} |
| PROPERTIES |
| USE_ROI FALSE |
| LIMIT_GRAPH_TO_DEVICE FALSE |
| TECHFILE "" |
| FAMILY ${FAMILY} |
| DEVICE_MERGED_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${ARCH_XML_NAME} |
| USE_ROI FALSE |
| LIMIT_GRAPH_TO_DEVICE FALSE |
| ) |
| |
| # ....................................................... |
| |
| get_file_target(REPACKING_RULES_TARGET ${REPACKING_RULES_NAME}) |
| |
| set(DEVICE_NET_PATCH_DEPS ${REPACKING_RULES_TARGET}) |
| set(DEVICE_NET_PATCH_EXTRA_ARGS "--repacking-rules ${CMAKE_CURRENT_BINARY_DIR}/${REPACKING_RULES_NAME}") |
| |
| # Add the repacking rules as an extra file to be installed |
| set(EXTRA_INSTALL_FILES |
| ${CMAKE_CURRENT_SOURCE_DIR}/${REPACKING_RULES_NAME} |
| ) |
| |
| # Define the device |
| define_device( |
| DEVICE ${DEVICE} |
| ARCH ${ARCH} |
| DEVICE_TYPE ${DEVICE_TYPE} |
| PACKAGES ${PACKAGE} |
| ROUTE_CHAN_WIDTH ${ROUTE_CHAN_WIDTH} |
| |
| EXT_RR_GRAPH ${CMAKE_CURRENT_BINARY_DIR}/${RR_GRAPH_FOR_DEVICE} |
| NO_RR_PATCHING |
| |
| NET_PATCH_DEPS ${DEVICE_NET_PATCH_DEPS} |
| NET_PATCH_EXTRA_ARGS ${DEVICE_NET_PATCH_EXTRA_ARGS} |
| |
| CACHE_PLACE_DELAY |
| CACHE_LOOKAHEAD |
| CACHE_ARGS |
| --constant_net_method route |
| --clock_modeling ideal # Do not route clocks |
| --place_delay_model delta_override |
| --place_delta_delay_matrix_calculation_method dijkstra |
| --router_lookahead extended_map |
| --route_chan_width ${ROUTE_CHAN_WIDTH} |
| |
| EXTRA_INSTALL_FILES ${EXTRA_INSTALL_FILES} |
| ) |
| |
| # ....................................................... |
| |
| # Add install targets for additional device-specific files |
| define_ql_device_cells_install_target( |
| DEVICE ${DEVICE} |
| DEVICE_TYPE ${DEVICE_TYPE} |
| PACKAGE ${PACKAGE} |
| ) |
| |
| endfunction() |
| |