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