From dbba1328bf01e94f367dd37db448ed377fa677a2 Mon Sep 17 00:00:00 2001 From: Catherine Date: Thu, 16 Jan 2025 21:09:33 +0000 Subject: [PATCH] Allow splitting nextpnr-himbaechel per microarchitecture. This is added primarily for YoWASP. --- CMakeLists.txt | 17 +++++++++--- README.md | 12 +++++++++ himbaechel/CMakeLists.txt | 56 +++++++++++++++++++++++++++++---------- 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed686846..9e621335 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -241,7 +241,18 @@ add_subdirectory(rust) add_subdirectory(tests/gui) function(add_nextpnr_architecture target) - cmake_parse_arguments(arg "" "MAIN_SOURCE" "CORE_SOURCES;TEST_SOURCES" ${ARGN}) + cmake_parse_arguments(arg "" "MAIN_SOURCE" "CORE_SOURCES;TEST_SOURCES;CURRENT_SOURCE_DIR;CURRENT_BINARY_DIR" ${ARGN}) + + if (NOT arg_CURRENT_SOURCE_DIR) + set(arg_CURRENT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + if (NOT arg_CURRENT_BINARY_DIR) + set(arg_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + endif() + + set(arg_MAIN_SOURCE "${arg_CURRENT_SOURCE_DIR}/${arg_MAIN_SOURCE}") + list(TRANSFORM arg_CORE_SOURCES PREPEND ${arg_CURRENT_SOURCE_DIR}/) + list(TRANSFORM arg_TEST_SOURCES PREPEND ${arg_CURRENT_SOURCE_DIR}/) # Defs library: used by everything # @@ -251,7 +262,7 @@ function(add_nextpnr_architecture target) target_include_directories(nextpnr-${target}-defs INTERFACE ${CMAKE_SOURCE_DIR}/common/kernel - ${CMAKE_CURRENT_SOURCE_DIR} + ${arg_CURRENT_SOURCE_DIR} ) string(TOUPPER ${family} family_upper) @@ -290,7 +301,7 @@ function(add_nextpnr_architecture target) endif() if (BUILD_GUI) - add_subdirectory(${CMAKE_SOURCE_DIR}/gui ${CMAKE_CURRENT_BINARY_DIR}/gui) + add_subdirectory(${CMAKE_SOURCE_DIR}/gui ${arg_CURRENT_BINARY_DIR}/gui) # Upsettingly, there is a cyclic dependency between `common/kernel` and `gui`, so these # two libraries have to be added separately to all executable targets. diff --git a/README.md b/README.md index 9685f968..34c2deaa 100644 --- a/README.md +++ b/README.md @@ -181,6 +181,18 @@ sudo make install To build every available stable architecture, use `-DARCH=all`. To include experimental arches (currently nexus), use `-DARCH=all+alpha`. +### Per-microarchitecture Himbächel + +To build a single nextpnr-himbachel executable for each of the supported microarchitectures, use `-DHIMBAECHEL_SPLIT`. + +``` +cmake . -DARCH="himbaechel" -DHIMBAECHEL_UARCH="gowin;ng-ultra" +make -j$(nproc) +sudo make install +``` + +In such a build, instead of a single `nextpnr-himbaechel` binary, two binaries `nextpnr-himbaechel-gowin` and `nextpnr-himbaechel-ng-ultra` are built. Although they are installed together, each microarchitecture is completely independent of the other, and only needs its corresponding `.../share/himbaechel//` chip database directory to run. Split build reduces the size of individual distributed artifacts (although the total size increases), and allows co-installation of artifacts of different versions. + Cross-compilation ----------------- diff --git a/himbaechel/CMakeLists.txt b/himbaechel/CMakeLists.txt index e71468df..1fc37b98 100644 --- a/himbaechel/CMakeLists.txt +++ b/himbaechel/CMakeLists.txt @@ -1,4 +1,6 @@ -set(SOURCES +option(HIMBAECHEL_SPLIT "Whether to build one executable per Himbächel microarchitecture" OFF) + +set(HIMBAECHEL_SOURCES arch.cc archdefs.h arch.h @@ -13,24 +15,50 @@ set(SOURCES himbaechel_helpers.h ) -add_nextpnr_architecture(${family} - CORE_SOURCES ${SOURCES} - MAIN_SOURCE main.cc -) +if (HIMBAECHEL_SPLIT) -function(add_nextpnr_himbaechel_microarchitecture microtarget) - cmake_parse_arguments(arg "" "" "CORE_SOURCES;TEST_SOURCES" ${ARGN}) + function(add_nextpnr_himbaechel_microarchitecture microtarget) + cmake_parse_arguments(arg "" "" "CORE_SOURCES;TEST_SOURCES" ${ARGN}) - target_sources(nextpnr-himbaechel-core INTERFACE ${arg_CORE_SOURCES}) + list(TRANSFORM arg_CORE_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/) + list(TRANSFORM arg_TEST_SOURCES PREPEND ${CMAKE_CURRENT_SOURCE_DIR}/) - add_library(nextpnr-himbaechel-${microtarget}-chipdb INTERFACE) + add_nextpnr_architecture(himbaechel-${microtarget} + CORE_SOURCES ${HIMBAECHEL_SOURCES} + MAIN_SOURCE main.cc + CURRENT_SOURCE_DIR ${CMAKE_SOURCE_DIR}/himbaechel + CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR} + ) - target_link_libraries(nextpnr-himbaechel-core INTERFACE nextpnr-himbaechel-${microtarget}-chipdb) + target_sources(nextpnr-himbaechel-${microtarget}-core INTERFACE ${arg_CORE_SOURCES}) - if (BUILD_TESTS) - target_sources(nextpnr-himbaechel-test PRIVATE ${arg_TEST_SOURCES}) - endif() -endfunction() + if (BUILD_TESTS) + target_sources(nextpnr-himbaechel-${microtarget}-test PRIVATE ${arg_TEST_SOURCES}) + endif() + endfunction() + +else() + + add_nextpnr_architecture(himbaechel + CORE_SOURCES ${HIMBAECHEL_SOURCES} + MAIN_SOURCE main.cc + ) + + function(add_nextpnr_himbaechel_microarchitecture microtarget) + cmake_parse_arguments(arg "" "" "CORE_SOURCES;TEST_SOURCES" ${ARGN}) + + target_sources(nextpnr-himbaechel-core INTERFACE ${arg_CORE_SOURCES}) + + add_library(nextpnr-himbaechel-${microtarget}-chipdb INTERFACE) + + target_link_libraries(nextpnr-himbaechel-core INTERFACE nextpnr-himbaechel-${microtarget}-chipdb) + + if (BUILD_TESTS) + target_sources(nextpnr-himbaechel-test PRIVATE ${arg_TEST_SOURCES}) + endif() + endfunction() + +endif() set(HIMBAECHEL_UARCHES example gowin xilinx ng-ultra)