Load chipdb from filesystem as option

This commit is contained in:
Miodrag Milanovic 2019-02-09 13:34:57 +01:00
parent db990d2175
commit 73f200fe74
7 changed files with 218 additions and 150 deletions

View File

@ -7,6 +7,7 @@ option(BUILD_PYTHON "Build Python Integration" ON)
option(BUILD_TESTS "Build GUI" OFF) option(BUILD_TESTS "Build GUI" OFF)
option(COVERAGE "Add code coverage info" OFF) option(COVERAGE "Add code coverage info" OFF)
option(STATIC_BUILD "Create static build" OFF) option(STATIC_BUILD "Create static build" OFF)
option(EXTERNAL_CHIPDB "Create build with pre-built chipdb binaries" OFF)
set(link_param "") set(link_param "")
if (STATIC_BUILD) if (STATIC_BUILD)
@ -16,6 +17,14 @@ if (STATIC_BUILD)
endif() endif()
endif() endif()
if (EXTERNAL_CHIPDB)
if (NOT DEFINED EXTERNAL_CHIPDB_ROOT)
message(STATUS "EXTERNAL_CHIPDB_ROOT not defined using -DEXTERNAL_CHIPDB_ROOT=/path/to/nextpnr. Default to /usr/local/share/nextpnr")
set(EXTERNAL_CHIPDB_ROOT "/usr/local/share/nextpnr")
endif()
add_definitions("-DEXTERNAL_CHIPDB_ROOT=\"${EXTERNAL_CHIPDB_ROOT}\"")
endif()
# List of families to build # List of families to build
set(FAMILIES generic ice40 ecp5) set(FAMILIES generic ice40 ecp5)
@ -66,7 +75,7 @@ endif()
find_package(Sanitizers) find_package(Sanitizers)
# List of Boost libraries to include # List of Boost libraries to include
set(boost_libs filesystem thread program_options) set(boost_libs filesystem thread program_options iostreams)
if (BUILD_GUI AND NOT BUILD_PYTHON) if (BUILD_GUI AND NOT BUILD_PYTHON)
message(FATAL_ERROR "GUI requires Python to build") message(FATAL_ERROR "GUI requires Python to build")

View File

@ -19,6 +19,7 @@
*/ */
#include <algorithm> #include <algorithm>
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/range/adaptor/reversed.hpp> #include <boost/range/adaptor/reversed.hpp>
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
@ -63,11 +64,37 @@ static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return
void load_chipdb(); void load_chipdb();
#endif #endif
#if defined(EXTERNAL_CHIPDB_ROOT)
const char *chipdb_blob_25k = nullptr;
const char *chipdb_blob_45k = nullptr;
const char *chipdb_blob_85k = nullptr;
boost::iostreams::mapped_file_source blob_files[3];
const char *mmap_file(int index, const char *filename)
{
try {
blob_files[index].open(filename);
if (!blob_files[index].is_open())
log_error("Unable to read chipdb %s\n", filename);
return (const char *)blob_files[index].data();
} catch (...) {
log_error("Unable to read chipdb %s\n", filename);
}
}
void load_chipdb()
{
chipdb_blob_25k = mmap_file(0, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-25k.bin");
chipdb_blob_45k = mmap_file(1, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-45k.bin");
chipdb_blob_85k = mmap_file(2, EXTERNAL_CHIPDB_ROOT "/ecp5/chipdb-85k.bin");
}
#endif
//#define LFE5U_45F_ONLY //#define LFE5U_45F_ONLY
Arch::Arch(ArchArgs args) : args(args) Arch::Arch(ArchArgs args) : args(args)
{ {
#if defined(_MSC_VER) #if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
load_chipdb(); load_chipdb();
#endif #endif
#ifdef LFE5U_45F_ONLY #ifdef LFE5U_45F_ONLY

View File

@ -204,7 +204,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
RelPtr<SpeedGradePOD> speed_grades; RelPtr<SpeedGradePOD> speed_grades;
}); });
#if defined(_MSC_VER) #if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
extern const char *chipdb_blob_25k; extern const char *chipdb_blob_25k;
extern const char *chipdb_blob_45k; extern const char *chipdb_blob_45k;
extern const char *chipdb_blob_85k; extern const char *chipdb_blob_85k;

View File

@ -1,70 +1,71 @@
if (NOT EXTERNAL_CHIPDB)
set(devices 25k 45k 85k)
set(devices 25k 45k 85k) if (NOT DEFINED TRELLIS_ROOT)
message(STATUS "TRELLIS_ROOT not defined using -DTRELLIS_ROOT=/path/to/prjtrellis. Default to /usr/local/share/trellis")
set(TRELLIS_ROOT "/usr/local/share/trellis")
endif()
if (NOT DEFINED TRELLIS_ROOT) file(GLOB found_pytrellis ${TRELLIS_ROOT}/libtrellis/pytrellis.*)
message(STATUS "TRELLIS_ROOT not defined using -DTRELLIS_ROOT=/path/to/prjtrellis. Default to /usr/local/share/trellis")
set(TRELLIS_ROOT "/usr/local/share/trellis") if ("${found_pytrellis}" STREQUAL "")
endif() message(FATAL_ERROR "failed to find pytrellis library in ${TRELLIS_ROOT}/libtrellis/")
endif()
file(GLOB found_pytrellis ${TRELLIS_ROOT}/libtrellis/pytrellis.*)
set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py)
if ("${found_pytrellis}" STREQUAL "")
message(FATAL_ERROR "failed to find pytrellis library in ${TRELLIS_ROOT}/libtrellis/") file(MAKE_DIRECTORY ecp5/chipdbs/)
endif() add_library(ecp5_chipdb OBJECT ecp5/chipdbs/)
target_compile_definitions(ecp5_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/trellis_import.py) target_include_directories(ecp5_chipdb PRIVATE ${family}/)
file(MAKE_DIRECTORY ecp5/chipdbs/) if (CMAKE_HOST_WIN32)
add_library(ecp5_chipdb OBJECT ecp5/chipdbs/) set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=\"${TRELLIS_ROOT}/libtrellis\;${TRELLIS_ROOT}/util/common\;${TRELLIS_ROOT}/timing/util\"")
target_compile_definitions(ecp5_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family}) else()
target_include_directories(ecp5_chipdb PRIVATE ${family}/) set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=${TRELLIS_ROOT}/libtrellis:${TRELLIS_ROOT}/util/common:${TRELLIS_ROOT}/timing/util")
endif()
if (CMAKE_HOST_WIN32)
set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=\"${TRELLIS_ROOT}/libtrellis\;${TRELLIS_ROOT}/util/common\;${TRELLIS_ROOT}/timing/util\"") if (MSVC)
else() target_sources(ecp5_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/embed.cc)
set(ENV_CMD ${CMAKE_COMMAND} -E env "PYTHONPATH=${TRELLIS_ROOT}/libtrellis:${TRELLIS_ROOT}/util/common:${TRELLIS_ROOT}/timing/util") set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resources/chipdb.rc PROPERTIES LANGUAGE RC)
endif() foreach (dev ${devices})
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bin)
if (MSVC) set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
target_sources(ecp5_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/embed.cc) set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resources/chipdb.rc PROPERTIES LANGUAGE RC) add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
foreach (dev ${devices}) COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bin) DEPENDS ${DB_PY}
set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba) )
set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc) add_custom_command(OUTPUT ${DEV_CC_DB}
add_custom_command(OUTPUT ${DEV_CC_BBA_DB} COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB} DEPENDS bbasm ${DEV_CC_BBA_DB}
DEPENDS ${DB_PY} )
) target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
add_custom_command(OUTPUT ${DEV_CC_DB} set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB} foreach (target ${family_targets})
DEPENDS bbasm ${DEV_CC_BBA_DB} target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/chipdb.rc)
) endforeach (target)
target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB}) endforeach (dev)
set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE) else()
foreach (target ${family_targets}) target_compile_options(ecp5_chipdb PRIVATE -g0 -O0 -w)
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/resource/chipdb.rc) foreach (dev ${devices})
endforeach (target) set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.cc)
endforeach (dev) set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba)
else() set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc)
target_compile_options(ecp5_chipdb PRIVATE -g0 -O0 -w) add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
foreach (dev ${devices}) COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}.new
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.cc) COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/chipdbs/chipdb-${dev}.bba) DEPENDS ${DB_PY}
set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ecp5/constids.inc) )
add_custom_command(OUTPUT ${DEV_CC_BBA_DB} add_custom_command(OUTPUT ${DEV_CC_DB}
COMMAND ${ENV_CMD} python3 ${DB_PY} -p ${DEV_CONSTIDS_INC} ${dev} > ${DEV_CC_BBA_DB}.new COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB} COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
DEPENDS ${DB_PY} DEPENDS bbasm ${DEV_CC_BBA_DB}
) )
add_custom_command(OUTPUT ${DEV_CC_DB} target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB})
COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new foreach (target ${family_targets})
COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB} target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb>)
DEPENDS bbasm ${DEV_CC_BBA_DB} endforeach (target)
) endforeach (dev)
target_sources(ecp5_chipdb PRIVATE ${DEV_CC_DB}) endif()
foreach (target ${family_targets})
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ecp5_chipdb>)
endforeach (target)
endforeach (dev)
endif() endif()

View File

@ -19,6 +19,7 @@
*/ */
#include <algorithm> #include <algorithm>
#include <boost/iostreams/device/mapped_file.hpp>
#include <cmath> #include <cmath>
#include "cells.h" #include "cells.h"
#include "gfx.h" #include "gfx.h"
@ -48,9 +49,37 @@ static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return
void load_chipdb(); void load_chipdb();
#endif #endif
#if defined(EXTERNAL_CHIPDB_ROOT)
const char *chipdb_blob_384 = nullptr;
const char *chipdb_blob_1k = nullptr;
const char *chipdb_blob_5k = nullptr;
const char *chipdb_blob_8k = nullptr;
boost::iostreams::mapped_file_source blob_files[4];
const char *mmap_file(int index, const char *filename)
{
try {
blob_files[index].open(filename);
if (!blob_files[index].is_open())
log_error("Unable to read chipdb %s\n", filename);
return (const char *)blob_files[index].data();
} catch (...) {
log_error("Unable to read chipdb %s\n", filename);
}
}
void load_chipdb()
{
chipdb_blob_384 = mmap_file(0, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-384.bin");
chipdb_blob_1k = mmap_file(1, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-1k.bin");
chipdb_blob_5k = mmap_file(2, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-5k.bin");
chipdb_blob_8k = mmap_file(3, EXTERNAL_CHIPDB_ROOT "/ice40/chipdb-8k.bin");
}
#endif
Arch::Arch(ArchArgs args) : args(args) Arch::Arch(ArchArgs args) : args(args)
{ {
#if defined(_MSC_VER) #if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
load_chipdb(); load_chipdb();
#endif #endif

View File

@ -244,7 +244,7 @@ NPNR_PACKED_STRUCT(struct ChipInfoPOD {
RelPtr<RelPtr<char>> tile_wire_names; RelPtr<RelPtr<char>> tile_wire_names;
}); });
#if defined(_MSC_VER) #if defined(_MSC_VER) || defined(EXTERNAL_CHIPDB_ROOT)
extern const char *chipdb_blob_384; extern const char *chipdb_blob_384;
extern const char *chipdb_blob_1k; extern const char *chipdb_blob_1k;
extern const char *chipdb_blob_5k; extern const char *chipdb_blob_5k;

View File

@ -1,84 +1,86 @@
if(ICE40_HX1K_ONLY) if (NOT EXTERNAL_CHIPDB)
set(devices 1k) if(ICE40_HX1K_ONLY)
foreach (target ${family_targets}) set(devices 1k)
target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1)
endforeach (target)
else()
set(devices 384 1k 5k 8k)
endif()
set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdb.py)
set(ICEBOX_ROOT "/usr/local/share/icebox" CACHE STRING "icebox location root")
file(MAKE_DIRECTORY ice40/chipdbs/)
add_library(ice40_chipdb OBJECT ice40/chipdbs/)
target_compile_definitions(ice40_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
target_include_directories(ice40_chipdb PRIVATE ${family}/)
if (MSVC)
target_sources(ice40_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/embed.cc)
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ice40/resources/chipdb.rc PROPERTIES LANGUAGE RC)
foreach (dev ${devices})
if (dev EQUAL "5k")
set(OPT_FAST "")
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
elseif(dev EQUAL "384")
set(OPT_FAST "")
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
else()
set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
endif()
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}
DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
)
add_custom_command(OUTPUT ${DEV_CC_DB}
COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
DEPENDS bbasm ${DEV_CC_BBA_DB}
)
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
foreach (target ${family_targets}) foreach (target ${family_targets})
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/chipdb.rc) target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1)
endforeach (target) endforeach (target)
endforeach (dev) else()
else() set(devices 384 1k 5k 8k)
target_compile_options(ice40_chipdb PRIVATE -g0 -O0 -w) endif()
foreach (dev ${devices})
if (dev EQUAL "5k") set(DB_PY ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdb.py)
set(OPT_FAST "")
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt) set(ICEBOX_ROOT "/usr/local/share/icebox" CACHE STRING "icebox location root")
elseif(dev EQUAL "384") file(MAKE_DIRECTORY ice40/chipdbs/)
set(OPT_FAST "") add_library(ice40_chipdb OBJECT ice40/chipdbs/)
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt) target_compile_definitions(ice40_chipdb PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
else() target_include_directories(ice40_chipdb PRIVATE ${family}/)
set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt) if (MSVC)
endif() target_sources(ice40_chipdb PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/embed.cc)
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/ice40/resources/chipdb.rc PROPERTIES LANGUAGE RC)
set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba) foreach (dev ${devices})
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc) if (dev EQUAL "5k")
set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc) set(OPT_FAST "")
set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h) set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
add_custom_command(OUTPUT ${DEV_CC_BBA_DB} elseif(dev EQUAL "384")
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}.new set(OPT_FAST "")
COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB} set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY} else()
) set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
add_custom_command(OUTPUT ${DEV_CC_DB} set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new endif()
COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB} set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
DEPENDS bbasm ${DEV_CC_BBA_DB} set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
) set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bin)
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB}) set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
foreach (target ${family_targets}) set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb>) add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
endforeach (target) COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}
endforeach (dev) DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
)
add_custom_command(OUTPUT ${DEV_CC_DB}
COMMAND bbasm ${DEV_CC_BBA_DB} ${DEV_CC_DB}
DEPENDS bbasm ${DEV_CC_BBA_DB}
)
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
set_source_files_properties(${DEV_CC_DB} PROPERTIES HEADER_FILE_ONLY TRUE)
foreach (target ${family_targets})
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb> ${CMAKE_CURRENT_SOURCE_DIR}/ice40/resource/chipdb.rc)
endforeach (target)
endforeach (dev)
else()
target_compile_options(ice40_chipdb PRIVATE -g0 -O0 -w)
foreach (dev ${devices})
if (dev EQUAL "5k")
set(OPT_FAST "")
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
elseif(dev EQUAL "384")
set(OPT_FAST "")
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp384.txt)
else()
set(OPT_FAST --fast ${ICEBOX_ROOT}/timings_hx${dev}.txt)
set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_lp${dev}.txt)
endif()
set(DEV_TXT_DB ${ICEBOX_ROOT}/chipdb-${dev}.txt)
set(DEV_CC_BBA_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.bba)
set(DEV_CC_DB ${CMAKE_CURRENT_SOURCE_DIR}/ice40/chipdbs/chipdb-${dev}.cc)
set(DEV_CONSTIDS_INC ${CMAKE_CURRENT_SOURCE_DIR}/ice40/constids.inc)
set(DEV_GFXH ${CMAKE_CURRENT_SOURCE_DIR}/ice40/gfx.h)
add_custom_command(OUTPUT ${DEV_CC_BBA_DB}
COMMAND ${PYTHON_EXECUTABLE} ${DB_PY} -p ${DEV_CONSTIDS_INC} -g ${DEV_GFXH} ${OPT_FAST} ${OPT_SLOW} ${DEV_TXT_DB} > ${DEV_CC_BBA_DB}.new
COMMAND mv ${DEV_CC_BBA_DB}.new ${DEV_CC_BBA_DB}
DEPENDS ${DEV_CONSTIDS_INC} ${DEV_GFXH} ${DEV_TXT_DB} ${DB_PY}
)
add_custom_command(OUTPUT ${DEV_CC_DB}
COMMAND bbasm --c ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
DEPENDS bbasm ${DEV_CC_BBA_DB}
)
target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
foreach (target ${family_targets})
target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb>)
endforeach (target)
endforeach (dev)
endif()
endif() endif()