From 53821468ae4478e2cd48035ba02db6083e4f94ac Mon Sep 17 00:00:00 2001 From: Catherine Date: Wed, 15 Jan 2025 12:57:00 +0000 Subject: [PATCH] CMake: extract bbasm compilation into a function. This fully preserves existing functionality, although the `embed` mode is untested and seems broken. --- BBAsm.cmake | 124 +++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 14 ++--- ecp5/CMakeLists.txt | 2 +- ecp5/family.cmake | 58 +++++-------------- gowin/CMakeLists.txt | 2 +- gowin/family.cmake | 58 +++++-------------- ice40/CMakeLists.txt | 2 +- ice40/family.cmake | 58 +++++-------------- machxo2/CMakeLists.txt | 4 +- machxo2/family.cmake | 60 +++++--------------- nexus/CMakeLists.txt | 2 +- nexus/family.cmake | 58 +++++-------------- 12 files changed, 201 insertions(+), 241 deletions(-) create mode 100644 BBAsm.cmake diff --git a/BBAsm.cmake b/BBAsm.cmake new file mode 100644 index 0000000000..5cdaff9b69 --- /dev/null +++ b/BBAsm.cmake @@ -0,0 +1,124 @@ +include(TestBigEndian) + +test_big_endian(IS_BIG_ENDIAN) +if (IS_BIG_ENDIAN) + set(BBASM_ENDIAN_FLAG "--be") +else() + set(BBASM_ENDIAN_FLAG "--le") +endif() + +# Example usage: +# +# add_bba_compile_command( +# TARGET chipdb-ice40 +# OUTPUT ice40/chipdb-hx8k.bin +# INPUT ice40/chipdb-hx8k.bba +# MODE binary +# ) +# +# All paths are relative to ${CMAKE_BINARY_DIR} (sic!). +# +function(add_bba_compile_command) + cmake_parse_arguments(arg "" "DEPENDS;TARGET;OUTPUT;INPUT;MODE" "" ${ARGN}) + + cmake_path(ABSOLUTE_PATH arg_INPUT BASE_DIRECTORY ${CMAKE_BINARY_DIR}) + + if (NOT arg_DEPENDS) + set(arg_DEPENDS ${arg_INPUT}) + endif() + + if (arg_MODE STREQUAL "binary" OR arg_MODE STREQUAL "resource") + + add_custom_command( + OUTPUT + ${CMAKE_BINARY_DIR}/${arg_OUTPUT} + COMMAND + bbasm ${BBASM_ENDIAN_FLAG} + ${arg_INPUT} + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.new + COMMAND + ${CMAKE_COMMAND} -E rename # atomic update + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.new + ${CMAKE_BINARY_DIR}/${arg_OUTPUT} + DEPENDS + bbasm + ${arg_DEPENDS} + VERBATIM + ) + + if (arg_MODE STREQUAL "resource") + + file(WRITE ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.rc + "${arg_OUTPUT} RCDATA \"${CMAKE_BINARY_DIR}/${arg_OUTPUT}\"") + + target_sources( + ${arg_TARGET} PRIVATE + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.rc + ) + + else() + + target_sources( + ${arg_TARGET} PRIVATE + ${CMAKE_BINARY_DIR}/${arg_OUTPUT} + ) + + endif() + + elseif (arg_MODE STREQUAL "embed") + + add_custom_command( + OUTPUT + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + ${CMAKE_BINARY_DIR}/${arg_OUTPUT} + COMMAND + bbasm ${BBASM_ENDIAN_FLAG} --e + ${arg_INPUT} + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc.new + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.new + COMMAND + ${CMAKE_COMMAND} -E rename # atomic update + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc.new + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + COMMAND + ${CMAKE_COMMAND} -E rename # atomic update + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.new + ${CMAKE_BINARY_DIR}/${arg_OUTPUT} + DEPENDS + bbasm + ${arg_DEPENDS} + VERBATIM + ) + + target_sources( + ${arg_TARGET} PRIVATE + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + ) + + elseif (arg_MODE STREQUAL "string") + + add_custom_command( + OUTPUT + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + COMMAND + bbasm ${BBASM_ENDIAN_FLAG} --c + ${arg_INPUT} + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc.new + COMMAND + ${CMAKE_COMMAND} -E rename # atomic update + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc.new + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + DEPENDS + bbasm + ${arg_DEPENDS} + VERBATIM + ) + + target_sources( + ${arg_TARGET} PRIVATE + ${CMAKE_BINARY_DIR}/${arg_OUTPUT}.cc + ) + + endif() + +endfunction() diff --git a/CMakeLists.txt b/CMakeLists.txt index 53b01b1a07..f2c89e5512 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,7 +52,9 @@ else() set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE) endif() -if (WIN32 OR EXTERNAL_CHIPDB) +if (WIN32) + set(BBASM_MODE "resource") +elseif (EXTERNAL_CHIPDB) set(BBASM_MODE "binary") else() set(BBASM_MODE "string") @@ -204,7 +206,7 @@ add_subdirectory(3rdparty/json11) add_subdirectory(3rdparty/oourafft) -set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/3rdparty/sanitizers-cmake/cmake;." ${CMAKE_MODULE_PATH}) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/3rdparty/sanitizers-cmake/cmake;${CMAKE_SOURCE_DIR}" ${CMAKE_MODULE_PATH}) find_package(Sanitizers) if (COVERAGE) @@ -224,13 +226,7 @@ else() add_subdirectory(bba) endif() -include(TestBigEndian) -test_big_endian(IS_BIG_ENDIAN) -if (IS_BIG_ENDIAN) - set(BBASM_ENDIAN_FLAG "--be") -else() - set(BBASM_ENDIAN_FLAG "--le") -endif() +include(BBAsm) if (NOT DEFINED CURRENT_GIT_VERSION) # Get the latest abbreviated commit hash of the working branch diff --git a/ecp5/CMakeLists.txt b/ecp5/CMakeLists.txt index 858042949e..e6f20806f3 100644 --- a/ecp5/CMakeLists.txt +++ b/ecp5/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(chipdb-ecp5 NONE) set(ALL_ECP5_DEVICES 25k 45k 85k) diff --git a/ecp5/family.cmake b/ecp5/family.cmake index c475a10c43..9ad95208d4 100644 --- a/ecp5/family.cmake +++ b/ecp5/family.cmake @@ -1,53 +1,21 @@ add_subdirectory(${family}) message(STATUS "Using ECP5 chipdb: ${ECP5_CHIPDB}") -set(chipdb_sources) -set(chipdb_binaries) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb) -foreach (device ${ECP5_DEVICES}) - set(chipdb_bba ${ECP5_CHIPDB}/chipdb-${device}.bba) - set(chipdb_bin ${family}/chipdb/chipdb-${device}.bin) - set(chipdb_cc ${family}/chipdb/chipdb-${device}.cc) - if (BBASM_MODE STREQUAL "binary") - add_custom_command( - OUTPUT ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${chipdb_bba} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "embed") - add_custom_command( - OUTPUT ${chipdb_cc} ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${chipdb_bba} ${chipdb_cc} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "string") - add_custom_command( - OUTPUT ${chipdb_cc} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${chipdb_bba} ${chipdb_cc} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - endif() -endforeach() -if (WIN32) - set(chipdb_rc ${CMAKE_CURRENT_BINARY_DIR}/${family}/resource/chipdb.rc) - list(APPEND chipdb_sources ${chipdb_rc}) - - file(WRITE ${chipdb_rc}) - foreach (device ${ECP5_DEVICES}) - file(APPEND ${chipdb_rc} - "${family}/chipdb-${device}.bin RCDATA \"${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb/chipdb-${device}.bin\"") - endforeach() -endif() - -add_custom_target(chipdb-${family}-bins DEPENDS ${chipdb_sources} ${chipdb_binaries}) - -add_library(chipdb-${family} OBJECT ${ECP5_CHIPDB} ${chipdb_sources}) -add_dependencies(chipdb-${family} chipdb-${family}-bins) -target_compile_options(chipdb-${family} PRIVATE -g0 -O0 -w) +add_library(chipdb-${family} OBJECT) +target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE ${family}) foreach (family_target ${family_targets}) - target_sources(${family_target} PRIVATE $) + target_link_libraries(${family_target} PRIVATE chipdb-${family}) +endforeach() + +foreach (device ${ECP5_DEVICES}) + add_bba_compile_command( + DEPENDS chipdb-${family}-bbas + TARGET chipdb-${family} + OUTPUT ${family}/chipdb-${device}.bin + INPUT ${ECP5_CHIPDB}/chipdb-${device}.bba + MODE ${BBASM_MODE} + ) endforeach() diff --git a/gowin/CMakeLists.txt b/gowin/CMakeLists.txt index d43928a4b1..2a78250afb 100644 --- a/gowin/CMakeLists.txt +++ b/gowin/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(chipdb-gowin NONE) set(ALL_GOWIN_DEVICES GW1N-1 GW1NZ-1 GW1N-4 GW1N-9 GW1N-9C GW1NS-2 GW1NS-4 GW2A-18) diff --git a/gowin/family.cmake b/gowin/family.cmake index 3b3f955744..33fd97d9d1 100644 --- a/gowin/family.cmake +++ b/gowin/family.cmake @@ -1,53 +1,21 @@ add_subdirectory(${family}) message(STATUS "Using Gowin chipdb: ${GOWIN_CHIPDB}") -set(chipdb_sources) -set(chipdb_binaries) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb) -foreach (device ${GOWIN_DEVICES}) - set(chipdb_bba ${GOWIN_CHIPDB}/chipdb-${device}.bba) - set(chipdb_bin ${family}/chipdb/chipdb-${device}.bin) - set(chipdb_cc ${family}/chipdb/chipdb-${device}.cc) - if (BBASM_MODE STREQUAL "binary") - add_custom_command( - OUTPUT ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${chipdb_bba} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "embed") - add_custom_command( - OUTPUT ${chipdb_cc} ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${chipdb_bba} ${chipdb_cc} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "string") - add_custom_command( - OUTPUT ${chipdb_cc} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${chipdb_bba} ${chipdb_cc} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - endif() -endforeach() -if (WIN32) - set(chipdb_rc ${CMAKE_CURRENT_BINARY_DIR}/${family}/resource/chipdb.rc) - list(APPEND chipdb_sources ${chipdb_rc}) - - file(WRITE ${chipdb_rc}) - foreach (device ${GOWIN_DEVICES}) - file(APPEND ${chipdb_rc} - "${family}/chipdb-${device}.bin RCDATA \"${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb/chipdb-${device}.bin\"") - endforeach() -endif() - -add_custom_target(chipdb-${family}-bins DEPENDS ${chipdb_sources} ${chipdb_binaries}) - -add_library(chipdb-${family} OBJECT ${GOWIN_CHIPDB} ${chipdb_sources}) -add_dependencies(chipdb-${family} chipdb-${family}-bins) -target_compile_options(chipdb-${family} PRIVATE -g0 -O0 -w) +add_library(chipdb-${family} OBJECT) +target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE ${family}) foreach (family_target ${family_targets}) - target_sources(${family_target} PRIVATE $) + target_link_libraries(${family_target} PRIVATE chipdb-${family}) +endforeach() + +foreach (device ${GOWIN_DEVICES}) + add_bba_compile_command( + DEPENDS chipdb-${family}-bbas + TARGET chipdb-${family} + OUTPUT ${family}/chipdb-${device}.bin + INPUT ${GOWIN_CHIPDB}/chipdb-${device}.bba + MODE ${BBASM_MODE} + ) endforeach() diff --git a/ice40/CMakeLists.txt b/ice40/CMakeLists.txt index 0644395d46..12cf0561ae 100644 --- a/ice40/CMakeLists.txt +++ b/ice40/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(chipdb-ice40 NONE) set(ALL_ICE40_DEVICES 384 1k 5k u4k 8k) diff --git a/ice40/family.cmake b/ice40/family.cmake index d8eb6d832c..942796e381 100644 --- a/ice40/family.cmake +++ b/ice40/family.cmake @@ -1,53 +1,21 @@ add_subdirectory(${family}) message(STATUS "Using iCE40 chipdb: ${ICE40_CHIPDB}") -set(chipdb_sources) -set(chipdb_binaries) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb) -foreach (device ${ICE40_DEVICES}) - set(chipdb_bba ${ICE40_CHIPDB}/chipdb-${device}.bba) - set(chipdb_bin ${family}/chipdb/chipdb-${device}.bin) - set(chipdb_cc ${family}/chipdb/chipdb-${device}.cc) - if (BBASM_MODE STREQUAL "binary") - add_custom_command( - OUTPUT ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${chipdb_bba} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "embed") - add_custom_command( - OUTPUT ${chipdb_cc} ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${chipdb_bba} ${chipdb_cc} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "string") - add_custom_command( - OUTPUT ${chipdb_cc} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${chipdb_bba} ${chipdb_cc} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - endif() -endforeach() -if (WIN32) - set(chipdb_rc ${CMAKE_CURRENT_BINARY_DIR}/${family}/resource/chipdb.rc) - list(APPEND chipdb_sources ${chipdb_rc}) - - file(WRITE ${chipdb_rc}) - foreach (device ${ICE40_DEVICES}) - file(APPEND ${chipdb_rc} - "${family}/chipdb-${device}.bin RCDATA \"${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb/chipdb-${device}.bin\"") - endforeach() -endif() - -add_custom_target(chipdb-${family}-bins DEPENDS ${chipdb_sources} ${chipdb_binaries}) - -add_library(chipdb-${family} OBJECT ${ICE40_CHIPDB} ${chipdb_sources}) -add_dependencies(chipdb-${family} chipdb-${family}-bins) -target_compile_options(chipdb-${family} PRIVATE -g0 -O0 -w) +add_library(chipdb-${family} OBJECT) +target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE ${family}) foreach (family_target ${family_targets}) - target_sources(${family_target} PRIVATE $) + target_link_libraries(${family_target} PRIVATE chipdb-${family}) +endforeach() + +foreach (device ${ICE40_DEVICES}) + add_bba_compile_command( + DEPENDS chipdb-${family}-bbas + TARGET chipdb-${family} + OUTPUT ${family}/chipdb-${device}.bin + INPUT ${ICE40_CHIPDB}/chipdb-${device}.bba + MODE ${BBASM_MODE} + ) endforeach() diff --git a/machxo2/CMakeLists.txt b/machxo2/CMakeLists.txt index 9bc6e9e075..98cfe0cdcd 100644 --- a/machxo2/CMakeLists.txt +++ b/machxo2/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(chipdb-machxo2 NONE) set(ALL_MACHXO2_DEVICES 256X 640X 1200X 2280X 256 640 1200 2000 4000 7000 1300 2100 4300 6900 9400 4300D 9400D) @@ -109,6 +109,6 @@ else() # serialize chipdb build across multiple architectures set(PREVIOUS_CHIPDB_TARGET chipdb-machxo2-bbas PARENT_SCOPE) else() - message(STATUS "Build nextpnr with -DMACHXO2_CHIPDB=${CMAKE_CURRENT_BINARY_DIR}") + message(STATUS "Build nextpnr with -DMACHXO2_CHIPDB=${CMAKE_CURRENT_BINARY_DIR}/chipdb") endif() endif() diff --git a/machxo2/family.cmake b/machxo2/family.cmake index 949bf89e20..f2b46a4377 100644 --- a/machxo2/family.cmake +++ b/machxo2/family.cmake @@ -1,56 +1,24 @@ add_subdirectory(${family}) message(STATUS "Using MachXO2/XO3 chipdb: ${MACHXO2_CHIPDB}") -set(chipdb_sources) -set(chipdb_binaries) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb) -foreach (device ${MACHXO2_DEVICES}) - set(chipdb_bba ${MACHXO2_CHIPDB}/chipdb-${device}.bba) - set(chipdb_bin ${family}/chipdb/chipdb-${device}.bin) - set(chipdb_cc ${family}/chipdb/chipdb-${device}.cc) - if (BBASM_MODE STREQUAL "binary") - add_custom_command( - OUTPUT ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${chipdb_bba} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "embed") - add_custom_command( - OUTPUT ${chipdb_cc} ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${chipdb_bba} ${chipdb_cc} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "string") - add_custom_command( - OUTPUT ${chipdb_cc} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${chipdb_bba} ${chipdb_cc} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - endif() -endforeach() -if (WIN32) - set(chipdb_rc ${CMAKE_CURRENT_BINARY_DIR}/${family}/resource/chipdb.rc) - list(APPEND chipdb_sources ${chipdb_rc}) - - file(WRITE ${chipdb_rc}) - foreach (device ${MACHXO2_DEVICES}) - file(APPEND ${chipdb_rc} - "${family}/chipdb-${device}.bin RCDATA \"${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb/chipdb-${device}.bin\"") - endforeach() -endif() - -add_custom_target(chipdb-${family}-bins DEPENDS ${chipdb_sources} ${chipdb_binaries}) - -add_library(chipdb-${family} OBJECT ${MACHXO2_CHIPDB} ${chipdb_sources}) -add_dependencies(chipdb-${family} chipdb-${family}-bins) -target_compile_options(chipdb-${family} PRIVATE -g0 -O0 -w) +add_library(chipdb-${family} OBJECT) +target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE ${family}) configure_file(${family}/machxo2_available.h.in ${CMAKE_CURRENT_BINARY_DIR}/generated/machxo2_available.h) +target_sources(chipdb-${family} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/machxo2_available.h) foreach (family_target ${family_targets}) - target_sources(${family_target} PRIVATE $) - target_sources(${family_target} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/machxo2_available.h) + target_link_libraries(${family_target} PRIVATE chipdb-${family}) +endforeach() + +foreach (device ${MACHXO2_DEVICES}) + add_bba_compile_command( + DEPENDS chipdb-${family}-bbas + TARGET chipdb-${family} + OUTPUT ${family}/chipdb-${device}.bin + INPUT ${MACHXO2_CHIPDB}/chipdb-${device}.bba + MODE ${BBASM_MODE} + ) endforeach() diff --git a/nexus/CMakeLists.txt b/nexus/CMakeLists.txt index 2becf9ef90..c1cec4d091 100644 --- a/nexus/CMakeLists.txt +++ b/nexus/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.5) +cmake_minimum_required(VERSION 3.25) project(chipdb-nexus NONE) set(ALL_NEXUS_FAMILIES LIFCL) diff --git a/nexus/family.cmake b/nexus/family.cmake index b46df71cc6..68049662ed 100644 --- a/nexus/family.cmake +++ b/nexus/family.cmake @@ -1,53 +1,21 @@ add_subdirectory(${family}) message(STATUS "Using Nexus chipdb: ${NEXUS_CHIPDB}") -set(chipdb_sources) -set(chipdb_binaries) -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb) -foreach (subfamily ${NEXUS_FAMILIES}) - set(chipdb_bba ${NEXUS_CHIPDB}/chipdb-${subfamily}.bba) - set(chipdb_bin ${family}/chipdb/chipdb-${subfamily}.bin) - set(chipdb_cc ${family}/chipdb/chipdb-${subfamily}.cc) - if (BBASM_MODE STREQUAL "binary") - add_custom_command( - OUTPUT ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${chipdb_bba} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "embed") - add_custom_command( - OUTPUT ${chipdb_cc} ${chipdb_bin} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --e ${chipdb_bba} ${chipdb_cc} ${chipdb_bin} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - list(APPEND chipdb_binaries ${chipdb_bin}) - elseif (BBASM_MODE STREQUAL "string") - add_custom_command( - OUTPUT ${chipdb_cc} - COMMAND bbasm ${BBASM_ENDIAN_FLAG} --c ${chipdb_bba} ${chipdb_cc} - DEPENDS bbasm chipdb-${family}-bbas ${chipdb_bba}) - list(APPEND chipdb_sources ${chipdb_cc}) - endif() -endforeach() -if (WIN32) - set(chipdb_rc ${CMAKE_CURRENT_BINARY_DIR}/${family}/resource/chipdb.rc) - list(APPEND chipdb_sources ${chipdb_rc}) - - file(WRITE ${chipdb_rc}) - foreach (subfamily ${NEXUS_FAMILIES}) - file(APPEND ${chipdb_rc} - "${family}/chipdb-${subfamily}.bin RCDATA \"${CMAKE_CURRENT_BINARY_DIR}/${family}/chipdb/chipdb-${subfamily}.bin\"") - endforeach() -endif() - -add_custom_target(chipdb-${family}-bins DEPENDS ${chipdb_sources} ${chipdb_binaries}) - -add_library(chipdb-${family} OBJECT ${NEXUS_CHIPDB} ${chipdb_sources}) -add_dependencies(chipdb-${family} chipdb-${family}-bins) -target_compile_options(chipdb-${family} PRIVATE -g0 -O0 -w) +add_library(chipdb-${family} OBJECT) +target_compile_options(chipdb-${family} PRIVATE -w -g0 -O0) target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) target_include_directories(chipdb-${family} PRIVATE ${family}) foreach (family_target ${family_targets}) - target_sources(${family_target} PRIVATE $) + target_link_libraries(${family_target} PRIVATE chipdb-${family}) +endforeach() + +foreach (subfamily ${NEXUS_FAMILIES}) + add_bba_compile_command( + DEPENDS chipdb-${family}-bbas + TARGET chipdb-${family} + OUTPUT ${family}/chipdb-${subfamily}.bin + INPUT ${NEXUS_CHIPDB}/chipdb-${subfamily}.bba + MODE ${BBASM_MODE} + ) endforeach()