if (NOT EXTERNAL_CHIPDB)
    if (ICE40_HX1K_ONLY)
        set(devices 1k)
        foreach (target ${family_targets})
            target_compile_definitions(${target} PRIVATE ICE40_HX1K_ONLY=1)
        endforeach (target)
    else()
        set(devices 384 1k 5k u4k 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/)
    file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ice40/chipdbs/)
    add_library(ice40_chipdb OBJECT ${CMAKE_CURRENT_BINARY_DIR}/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)
        set(PREV_DEV_CC_BBA_DB)
        foreach (dev ${devices})
            if (dev STREQUAL "5k")
                set(OPT_FAST "")
                set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
            elseif (dev STREQUAL "u4k")
                set(OPT_FAST "")
                set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_u4k.txt)
            elseif (dev STREQUAL "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_BINARY_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)

            if(PREGENERATED_BBA_PATH)
                add_custom_command(OUTPUT ${DEV_CC_DB}
                    COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${PREGENERATED_BBA_PATH}/chipdb-${dev}.bba ${DEV_CC_DB}
                    )
            else()
                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} ${PREV_DEV_CC_BBA_DB}
                    )
                add_custom_command(OUTPUT ${DEV_CC_DB}
                    COMMAND bbasm ${BBASM_ENDIAN_FLAG} ${DEV_CC_BBA_DB} ${DEV_CC_DB}
                    DEPENDS bbasm ${DEV_CC_BBA_DB}
                    )
            endif()
            if (SERIALIZE_CHIPDB)
                set(PREV_DEV_CC_BBA_DB ${DEV_CC_BBA_DB})
            endif()
            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()
        endforeach()
    else()
        target_compile_options(ice40_chipdb PRIVATE -g0 -O0 -w)
        set(PREV_DEV_CC_BBA_DB)
        foreach (dev ${devices})
            if (dev STREQUAL "5k")
                set(OPT_FAST "")
                set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_up5k.txt)
            elseif (dev STREQUAL "u4k")
                set(OPT_FAST "")
                set(OPT_SLOW --slow ${ICEBOX_ROOT}/timings_u4k.txt)
            elseif (dev STREQUAL "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_BINARY_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)
            if(PREGENERATED_BBA_PATH)
                add_custom_command(OUTPUT ${DEV_CC_DB}
                    COMMAND bbasm --c ${BBASM_ENDIAN_FLAG} ${PREGENERATED_BBA_PATH}/chipdb-${dev}.bba ${DEV_CC_DB}.new
                    COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
                    )
            else()
                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} ${PREV_DEV_CC_BBA_DB}
                    )
                add_custom_command(OUTPUT ${DEV_CC_DB}
                    COMMAND bbasm --c ${BBASM_ENDIAN_FLAG} ${DEV_CC_BBA_DB} ${DEV_CC_DB}.new
                    COMMAND mv ${DEV_CC_DB}.new ${DEV_CC_DB}
                    DEPENDS bbasm ${DEV_CC_BBA_DB}
                    )
            endif()
            if (SERIALIZE_CHIPDB)
                set(PREV_DEV_CC_BBA_DB ${DEV_CC_BBA_DB})
            endif()
            target_sources(ice40_chipdb PRIVATE ${DEV_CC_DB})
            foreach (target ${family_targets})
                target_sources(${target} PRIVATE $<TARGET_OBJECTS:ice40_chipdb>)
            endforeach()
        endforeach()
    endif()
endif()
