| function(DEFINE_QL_TOOLCHAIN_TARGET) |
| set(options) |
| set(oneValueArgs FAMILY ARCH CONV_SCRIPT SYNTH_SCRIPT ROUTE_CHAN_WIDTH CELLS_SIM) |
| set(multiValueArgs VPR_ARCH_ARGS) |
| |
| cmake_parse_arguments( |
| DEFINE_QL_TOOLCHAIN_TARGET |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| "${ARGN}" |
| ) |
| |
| set(FAMILY ${DEFINE_QL_TOOLCHAIN_TARGET_FAMILY}) |
| set(ARCH ${DEFINE_QL_TOOLCHAIN_TARGET_ARCH}) |
| set(VPR_ARCH_ARGS ${DEFINE_QL_TOOLCHAIN_TARGET_VPR_ARCH_ARGS}) |
| set(ROUTE_CHAN_WIDTH ${DEFINE_QL_TOOLCHAIN_TARGET_ROUTE_CHAN_WIDTH}) |
| |
| # Check if the architecture and family should be installed |
| check_arch_install(${ARCH} DO_INSTALL) |
| if (NOT DO_INSTALL) |
| message(STATUS "Skipping installation of toolchain for arch '${ARCH}' family '${FAMILY}'") |
| return() |
| endif () |
| |
| # Add cells.sim to all deps, so it is installed with make install |
| get_file_target(CELLS_SIM_TARGET ${DEFINE_QL_TOOLCHAIN_TARGET_CELLS_SIM}) |
| add_custom_target( |
| "DEVICE_INSTALL_${CELLS_SIM_TARGET}" |
| ALL |
| DEPENDS ${DEFINE_QL_TOOLCHAIN_TARGET_CELLS_SIM} |
| ) |
| |
| install(FILES ${VPR_CONFIG} |
| DESTINATION share/f4pga/scripts/${FAMILY}) |
| |
| # Example design to run through the flow |
| # FIXME: Installation of the example should me moved out of this function |
| # For now there is the following workaround which installs it only for qlf_k4n8 |
| if(${FAMILY} STREQUAL "qlf_k4n8") |
| install(FILES ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/tests/design_flow/counter_16bit/counter_16bit.v |
| DESTINATION share/f4pga/tests/counter_16bit |
| PERMISSIONS WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) |
| install(FILES ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/tests/design_flow/counter_16bit/counter_16bit_tb.v |
| DESTINATION share/f4pga/tests/counter_16bit |
| PERMISSIONS WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) |
| install(FILES ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/tests/design_flow/counter_16bit/counter_16bit.pcf |
| DESTINATION share/f4pga/tests/counter_16bit |
| PERMISSIONS WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) |
| install(FILES ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/tests/design_flow/counter_16bit/pinmap_qlf_k4n8_umc22.csv |
| DESTINATION share/f4pga/tests/counter_16bit |
| PERMISSIONS WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) |
| install(FILES ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/tests/design_flow/counter_16bit/counter_16bit.sdc |
| DESTINATION share/f4pga/tests/counter_16bit |
| PERMISSIONS WORLD_READ OWNER_WRITE OWNER_READ GROUP_READ) |
| endif() |
| |
| # install techmap |
| install(DIRECTORY ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/techmap/. |
| DESTINATION share/f4pga/techmaps/${FAMILY} |
| FILES_MATCHING PATTERN *.v) |
| |
| install(FILES ${DEFINE_QL_TOOLCHAIN_TARGET_CELLS_SIM} |
| DESTINATION share/f4pga/techmaps/${FAMILY}) |
| |
| if("${FAMILY}" STREQUAL "qlf_k4n8") |
| # install lib files |
| install(DIRECTORY ${f4pga-arch-defs_SOURCE_DIR}/quicklogic/${FAMILY}/devices/umc22/ |
| DESTINATION "share/f4pga/arch/${FAMILY}-${FAMILY}_umc22_${FAMILY}-${FAMILY}_umc22/lib" |
| FILES_MATCHING |
| PATTERN "*.txt" |
| PATTERN "*.json" |
| PATTERN "*.xml") |
| endif() |
| |
| # Install FASM database |
| set(FASM_DATABASE_DIR "${QLF_FPGA_DATABASE_DIR}/${FAMILY}/fasm_database/") |
| if("${FAMILY}" STREQUAL "qlf_k4n8") |
| get_file_target(FASM_DATABASE_TARGET "/${FASM_DATABASE_DIR}") |
| get_file_location(FASM_DATABASE "/${FASM_DATABASE_DIR}") |
| add_custom_target("FASM_DB_INSTALL_${FAMILY}_FASM_DATABASE" |
| ALL |
| DEPENDS ${FASM_DATABASE_TARGET} ${FASM_DATABASE} |
| ) |
| install(DIRECTORY ${CMAKE_BINARY_DIR}/${FASM_DATABASE_DIR} |
| DESTINATION share/f4pga/fasm_database/${FAMILY}) |
| elseif(EXISTS "${FASM_DATABASE_DIR}" AND IS_DIRECTORY "${FASM_DATABASE_DIR}") |
| install(DIRECTORY ${FASM_DATABASE_DIR} |
| DESTINATION share/f4pga/fasm_database/${FAMILY}) |
| endif() |
| |
| endfunction() |
| |
| function(DEFINE_QL_DEVICE_CELLS_INSTALL_TARGET) |
| set(options) |
| set(oneValueArgs DEVICE_TYPE DEVICE PACKAGE) |
| set(multiValueArgs) |
| |
| cmake_parse_arguments( |
| DEFINE_QL_DEVICE_CELLS_INSTALL_TARGET |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| "${ARGN}" |
| ) |
| |
| set(DEVICE_TYPE ${DEFINE_QL_DEVICE_CELLS_INSTALL_TARGET_DEVICE_TYPE}) |
| set(DEVICE ${DEFINE_QL_DEVICE_CELLS_INSTALL_TARGET_DEVICE}) |
| set(PACKAGE ${DEFINE_QL_DEVICE_CELLS_INSTALL_TARGET_PACKAGE}) |
| |
| # Check if the device should be installed |
| check_device_install(${DEVICE} DO_INSTALL) |
| if (NOT DO_INSTALL) |
| message(STATUS "Skipping installation of device ${DEVICE}-${PACKAGE} (type ${DEVICE_TYPE})") |
| return() |
| endif () |
| |
| # Install the final architecture file. This is actually already done in |
| # DEFINE_DEVICE but in case when the file name differs across devices we |
| # want it to be unified for the installed toolchain. |
| get_target_property_required(DEVICE_MERGED_FILE ${DEVICE_TYPE} DEVICE_MERGED_FILE) |
| get_file_location(DEVICE_MERGED_FILE_LOCATION ${DEVICE_MERGED_FILE}) |
| |
| install(FILES ${DEVICE_MERGED_FILE_LOCATION} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}" |
| RENAME "arch_${DEVICE}_${PACKAGE}.xml") |
| |
| if("${FAMILY}" STREQUAL "qlf_k4n8") |
| # install lib files |
| if(EXISTS "${QLF_FPGA_DATABASE_DIR}/${FAMILY}/lib" AND IS_DIRECTORY "${QLF_FPGA_DATABASE_DIR}/${FAMILY}/lib") |
| install(DIRECTORY ${QLF_FPGA_DATABASE_DIR}/${FAMILY}/lib/ |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/lib") |
| endif() |
| else() |
| message(status ": workaround: skipping lib install for ${DEVICE} device") |
| endif() |
| |
| # Install device-specific cells sim and cells map files |
| get_target_property(CELLS_SIM ${DEVICE_TYPE} CELLS_SIM) |
| get_target_property(CELLS_MAP ${DEVICE_TYPE} CELLS_MAP) |
| if (NOT "${CELLS_SIM}" MATCHES ".*NOTFOUND") |
| get_file_target(CELLS_SIM_TARGET ${CELLS_SIM}) |
| get_file_location(CELLS_SIM ${CELLS_SIM}) |
| add_custom_target( |
| "CELLS_INSTALL_${DEVICE}_CELLS_SIM" |
| ALL |
| DEPENDS ${CELLS_SIM_TARGET} ${CELLS_SIM} |
| ) |
| install(FILES ${CELLS_SIM} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/cells") |
| endif() |
| |
| if (NOT "${CELLS_MAP}" MATCHES ".*NOTFOUND") |
| get_file_target(CELLS_MAP_TARGET ${CELLS_MAP}) |
| get_file_location(CELLS_MAP ${CELLS_MAP}) |
| add_custom_target( |
| "CELLS_INSTALL_${DEVICE}_CELLS_MAP" |
| ALL |
| DEPENDS ${CELLS_MAP_TARGET} ${CELLS_MAP} |
| ) |
| install(FILES ${CELLS_MAP} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/cells") |
| endif() |
| endfunction() |
| |
| function(DEFINE_QL_PINMAP_CSV_INSTALL_TARGET) |
| set(options) |
| set(oneValueArgs PART DEVICE_TYPE BOARD DEVICE PACKAGE FABRIC_PACKAGE) |
| set(multiValueArgs) |
| |
| cmake_parse_arguments( |
| DEFINE_QL_PINMAP_CSV_INSTALL_TARGET |
| "${options}" |
| "${oneValueArgs}" |
| "${multiValueArgs}" |
| "${ARGN}" |
| ) |
| |
| set(PART ${DEFINE_QL_PINMAP_CSV_INSTALL_TARGET_PART}) |
| set(BOARD ${DEFINE_QL_PINMAP_CSV_INSTALL_TARGET_BOARD}) |
| set(DEVICE ${DEFINE_QL_PINMAP_CSV_INSTALL_TARGET_DEVICE}) |
| set(DEVICE_TYPE ${DEFINE_QL_PINMAP_CSV_INSTALL_TARGET_DEVICE_TYPE}) |
| set(PACKAGE ${DEFINE_QL_PINMAP_CSV_INSTALL_TARGET_PACKAGE}) |
| |
| get_target_property_required(NO_INSTALL ${ARCH} NO_INSTALL) |
| if(${NO_INSTALL}) |
| message(STATUS "Architecture ${ARCH} not set for install") |
| return() |
| endif() |
| |
| get_target_property_required(PINMAP ${BOARD} PINMAP) |
| get_file_location(PINMAP_FILE ${PINMAP}) |
| get_filename_component(PINMAP_FILE_REAL ${PINMAP_FILE} REALPATH) |
| get_filename_component(PINMAP_FILE_NAME ${PINMAP_FILE} NAME) |
| append_file_dependency(DEPS ${PINMAP}) |
| add_custom_target( |
| "PINMAP_INSTALL_${BOARD}_${DEVICE}_${PACKAGE}_${PINMAP_FILE_NAME}" |
| ALL |
| DEPENDS ${DEPS} |
| ) |
| install(FILES ${PINMAP_FILE_REAL} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/${PART}" |
| RENAME "pinmap_${ADD_QUICKLOGIC_BOARD_FABRIC_PACKAGE}.csv") |
| |
| |
| if(NOT "${FAMILY}" STREQUAL "pp3") |
| get_target_property_required(PINMAP ${BOARD} PINMAP_XML) |
| get_file_location(PINMAP_XML_FILE ${PINMAP_XML}) |
| get_filename_component(PINMAP_XML_FILE_REAL ${PINMAP_XML_FILE} REALPATH) |
| get_filename_component(PINMAP_XML_FILE_NAME ${PINMAP_XML_FILE} NAME) |
| append_file_dependency(DEPS ${PINMAP_XML}) |
| add_custom_target( |
| "PINMAP_XML_INSTALL_${BOARD}_${DEVICE}_${PACKAGE}_${PINMAP_XML_FILE_NAME}" |
| ALL |
| DEPENDS ${DEPS} |
| ) |
| install(FILES ${PINMAP_XML_FILE_REAL} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/${PART}" |
| RENAME "pinmap_${ADD_QUICKLOGIC_BOARD_FABRIC_PACKAGE}.xml") |
| else() |
| message(status ": workaround: skipping PINMAP_XML install for ${FAMILY} ${DEVICE}") |
| endif() |
| |
| get_target_property(CLKMAP ${BOARD} CLKMAP) |
| if(NOT "${CLKMAP}" MATCHES ".*-NOTFOUND") |
| get_file_location(CLKMAP_FILE ${CLKMAP}) |
| get_filename_component(CLKMAP_FILE_REAL ${CLKMAP_FILE} REALPATH) |
| get_filename_component(CLKMAP_FILE_NAME ${CLKMAP_FILE} NAME) |
| append_file_dependency(DEPS ${CLKMAP}) |
| add_custom_target( |
| "CLKMAP_INSTALL_${BOARD}_${DEVICE}_${PACKAGE}_${CLKMAP_FILE_NAME}" |
| ALL |
| DEPENDS ${DEPS} |
| ) |
| install(FILES ${CLKMAP_FILE_REAL} |
| DESTINATION "share/f4pga/arch/${DEVICE}_${PACKAGE}/${PART}" |
| RENAME "clkmap_${ADD_QUICKLOGIC_BOARD_FABRIC_PACKAGE}.csv") |
| endif() |
| |
| endfunction() |