From 90d746f79e41ed6c8f28e2d50517643565b03be2 Mon Sep 17 00:00:00 2001 From: Catherine Date: Wed, 22 Jan 2025 22:43:34 +0000 Subject: [PATCH] CMake: add support for exporting and importing .bba files. This is useful for certain cross-compilation workloads, and to cache rarely changing build products. To use this functionality, build e.g. as follows: cmake . -B build-export -DEXPORT_BBA_FILES=../bba-files -DARCH=all cmake --build build-export -t nextpnr-all-bba cmake . -B build-import -DIMPORT_BBA_FILES=../bba-files -DARCH=all cmake --build build-import --- CMakeLists.txt | 6 ++ cmake/BBAsm.cmake | 83 ++++++++++++++++++++---- ecp5/CMakeLists.txt | 1 + gowin/CMakeLists.txt | 1 + himbaechel/CMakeLists.txt | 4 ++ himbaechel/uarch/example/CMakeLists.txt | 1 + himbaechel/uarch/gowin/CMakeLists.txt | 1 + himbaechel/uarch/ng-ultra/CMakeLists.txt | 1 + himbaechel/uarch/xilinx/CMakeLists.txt | 1 + ice40/CMakeLists.txt | 1 + machxo2/CMakeLists.txt | 1 + nexus/CMakeLists.txt | 1 + 12 files changed, 89 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 31073c87..c8fb6aed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,6 +237,8 @@ add_subdirectory(rust) add_subdirectory(tests/gui) +add_custom_target(nextpnr-all-bba) + function(add_nextpnr_architecture target) cmake_parse_arguments(arg "" "MAIN_SOURCE" "CORE_SOURCES;TEST_SOURCES;CURRENT_SOURCE_DIR;CURRENT_BINARY_DIR" ${ARGN}) @@ -325,6 +327,10 @@ function(add_nextpnr_architecture target) # Chip database + add_library(nextpnr-${target}-bba INTERFACE) + + add_dependencies(nextpnr-all-bba nextpnr-${target}-bba) + add_library(nextpnr-${target}-chipdb INTERFACE) target_link_libraries(nextpnr-${target}-core INTERFACE nextpnr-${target}-chipdb) diff --git a/cmake/BBAsm.cmake b/cmake/BBAsm.cmake index c72b64de..2075560a 100644 --- a/cmake/BBAsm.cmake +++ b/cmake/BBAsm.cmake @@ -7,9 +7,24 @@ else() set(BBASM_ENDIAN_FLAG "--le") endif() +set(EXPORT_BBA_FILES "" CACHE PATH "Copy generated .bba files to this directory") +set(IMPORT_BBA_FILES "" CACHE PATH "Use pre-generated .bba files from this directory") +mark_as_advanced(EXPORT_BBA_FILES IMPORT_BBA_FILES) + +if (EXPORT_BBA_FILES) + file(REAL_PATH ${EXPORT_BBA_FILES} EXPORT_BBA_FILES BASE_DIRECTORY ${CMAKE_BINARY_DIR}) + message(STATUS "Exporting .bba files to ${EXPORT_BBA_FILES}") +endif() + +if (IMPORT_BBA_FILES) + file(REAL_PATH ${IMPORT_BBA_FILES} IMPORT_BBA_FILES BASE_DIRECTORY ${CMAKE_BINARY_DIR}) + message(STATUS "Importing .bba files from ${EXPORT_BBA_FILES}") +endif() + # Example usage (note the `.new`, used for atomic updates): # # add_bba_produce_command( +# TARGET nextpnr-ice40-bba # COMMAND ${Python_EXECUTABLE} # ${CMAKE_CURRENT_SOURCE_DIR}/chipdb.py # -o ${CMAKE_CURRENT_BINARY_DIR}/chipdb-hx8k.bba.new @@ -20,26 +35,68 @@ endif() # Paths must be absolute. # function(add_bba_produce_command) - cmake_parse_arguments(arg "" "OUTPUT" "COMMAND;INPUTS" ${ARGN}) + cmake_parse_arguments(arg "" "OUTPUT" "TARGET;COMMAND;INPUTS" ${ARGN}) cmake_path(GET arg_OUTPUT PARENT_PATH arg_OUTPUT_DIR) + cmake_path(GET arg_OUTPUT FILENAME arg_OUTPUT_NAME) + file(RELATIVE_PATH arg_OUTPUT_RELATIVE ${CMAKE_BINARY_DIR} ${arg_OUTPUT}) file(MAKE_DIRECTORY ${arg_OUTPUT_DIR}) list(GET arg_COMMAND 0 arg_EXECUTABLE) - add_custom_command( - OUTPUT - ${arg_OUTPUT} - COMMAND - ${arg_COMMAND} - COMMAND - ${CMAKE_COMMAND} -E rename # atomic update - ${arg_OUTPUT}.new + if (NOT IMPORT_BBA_FILES) + + add_custom_command( + OUTPUT ${arg_OUTPUT} - DEPENDS - ${arg_EXECUTABLE} - ${arg_INPUTS} - VERBATIM + COMMAND + ${arg_COMMAND} + COMMAND + ${CMAKE_COMMAND} -E rename # atomic update + ${arg_OUTPUT}.new + ${arg_OUTPUT} + DEPENDS + ${arg_EXECUTABLE} + ${arg_INPUTS} + VERBATIM + ) + + else() + + add_custom_command( + OUTPUT + ${arg_OUTPUT} + COMMAND + ${CMAKE_COMMAND} -E copy + ${IMPORT_BBA_FILES}/${arg_OUTPUT_RELATIVE} + ${arg_OUTPUT} + DEPENDS + ${IMPORT_BBA_FILES}/${arg_OUTPUT_RELATIVE} + COMMENT + "Importing ${arg_OUTPUT_NAME}" + VERBATIM + ) + + endif() + + if (EXPORT_BBA_FILES) + + add_custom_command( + OUTPUT + ${arg_OUTPUT} + COMMAND + ${CMAKE_COMMAND} -E copy + ${arg_OUTPUT} + ${EXPORT_BBA_FILES}/${arg_OUTPUT_RELATIVE} + APPEND + VERBATIM + ) + + endif() + + target_sources( + ${arg_TARGET} PUBLIC + ${arg_OUTPUT} ) endfunction() diff --git a/ecp5/CMakeLists.txt b/ecp5/CMakeLists.txt index cbeb4f85..fdc51fbb 100644 --- a/ecp5/CMakeLists.txt +++ b/ecp5/CMakeLists.txt @@ -43,6 +43,7 @@ foreach (device ${ECP5_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-${family}-bba COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/trellis_import.py -L ${TRELLIS_LIBDIR} diff --git a/gowin/CMakeLists.txt b/gowin/CMakeLists.txt index 4c154a48..b09aa44e 100644 --- a/gowin/CMakeLists.txt +++ b/gowin/CMakeLists.txt @@ -34,6 +34,7 @@ foreach (device ${GOWIN_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-${family}-bba COMMAND ${GOWIN_BBA_EXECUTABLE} -d ${device} -i ${CMAKE_CURRENT_SOURCE_DIR}/constids.inc diff --git a/himbaechel/CMakeLists.txt b/himbaechel/CMakeLists.txt index 1fc37b98..f5c1fa96 100644 --- a/himbaechel/CMakeLists.txt +++ b/himbaechel/CMakeLists.txt @@ -49,6 +49,10 @@ else() target_sources(nextpnr-himbaechel-core INTERFACE ${arg_CORE_SOURCES}) + add_library(nextpnr-himbaechel-${microtarget}-bba INTERFACE) + + add_dependencies(nextpnr-himbaechel-bba nextpnr-himbaechel-${microtarget}-bba) + add_library(nextpnr-himbaechel-${microtarget}-chipdb INTERFACE) target_link_libraries(nextpnr-himbaechel-core INTERFACE nextpnr-himbaechel-${microtarget}-chipdb) diff --git a/himbaechel/uarch/example/CMakeLists.txt b/himbaechel/uarch/example/CMakeLists.txt index 9b4acc74..4821076f 100644 --- a/himbaechel/uarch/example/CMakeLists.txt +++ b/himbaechel/uarch/example/CMakeLists.txt @@ -19,6 +19,7 @@ foreach (device ${HIMBAECHEL_EXAMPLE_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-himbaechel-example-bba COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/example_arch_gen.py ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba.new diff --git a/himbaechel/uarch/gowin/CMakeLists.txt b/himbaechel/uarch/gowin/CMakeLists.txt index e2c0bbbe..1b60b115 100644 --- a/himbaechel/uarch/gowin/CMakeLists.txt +++ b/himbaechel/uarch/gowin/CMakeLists.txt @@ -32,6 +32,7 @@ foreach (device ${HIMBAECHEL_GOWIN_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-himbaechel-gowin-bba COMMAND ${apycula_Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gowin_arch_gen.py -d ${device} diff --git a/himbaechel/uarch/ng-ultra/CMakeLists.txt b/himbaechel/uarch/ng-ultra/CMakeLists.txt index 54b40cc6..02ddbfb4 100644 --- a/himbaechel/uarch/ng-ultra/CMakeLists.txt +++ b/himbaechel/uarch/ng-ultra/CMakeLists.txt @@ -41,6 +41,7 @@ foreach (device ${HIMBAECHEL_NGULTRA_DEVICES}) string(TOUPPER ${device} device_upper) add_bba_produce_command( + TARGET nextpnr-himbaechel-ng-ultra-bba COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/gen/arch_gen.py --db ${HIMBAECHEL_PRJBEYOND_DB} diff --git a/himbaechel/uarch/xilinx/CMakeLists.txt b/himbaechel/uarch/xilinx/CMakeLists.txt index 002f6d65..7f3a6df8 100644 --- a/himbaechel/uarch/xilinx/CMakeLists.txt +++ b/himbaechel/uarch/xilinx/CMakeLists.txt @@ -34,6 +34,7 @@ message(STATUS "Enabled Himbaechel-Xilinx devices: ${HIMBAECHEL_XILINX_DEVICES}" foreach (device ${HIMBAECHEL_XILINX_DEVICES}) add_bba_produce_command( + TARGET nextpnr-himbaechel-xilinx-bba COMMAND /usr/bin/pypy3 ${CMAKE_CURRENT_SOURCE_DIR}/gen/xilinx_gen.py --xray ${HIMBAECHEL_PRJXRAY_DB}/artix7 --device ${device} diff --git a/ice40/CMakeLists.txt b/ice40/CMakeLists.txt index 73c1f891..923fbffa 100644 --- a/ice40/CMakeLists.txt +++ b/ice40/CMakeLists.txt @@ -64,6 +64,7 @@ foreach (device ${ICE40_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-${family}-bba COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/chipdb.py -p ${CMAKE_CURRENT_SOURCE_DIR}/constids.inc diff --git a/machxo2/CMakeLists.txt b/machxo2/CMakeLists.txt index ee6f5262..57a470b2 100644 --- a/machxo2/CMakeLists.txt +++ b/machxo2/CMakeLists.txt @@ -43,6 +43,7 @@ foreach (device ${MACHXO2_DEVICES}) endif() add_bba_produce_command( + TARGET nextpnr-${family}-bba COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/facade_import.py -L ${TRELLIS_LIBDIR} diff --git a/nexus/CMakeLists.txt b/nexus/CMakeLists.txt index 1c7d59a7..bc0976fa 100644 --- a/nexus/CMakeLists.txt +++ b/nexus/CMakeLists.txt @@ -35,6 +35,7 @@ foreach (subfamily ${NEXUS_FAMILIES}) endif() add_bba_produce_command( + TARGET nextpnr-${family}-bba COMMAND ${PRJOXIDE_TOOL} bba-export ${subfamily} ${CMAKE_CURRENT_SOURCE_DIR}/constids.inc