Allow splitting nextpnr-himbaechel per microarchitecture.

This is added primarily for YoWASP.
This commit is contained in:
Catherine 2025-01-16 21:09:33 +00:00
parent cd7f7c12f1
commit dbba1328bf
3 changed files with 68 additions and 17 deletions

View File

@ -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.

View File

@ -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/<microarchitecture>/` 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
-----------------

View File

@ -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)