CMake: refactor architecture-specific build system parts.
Two user-visible changes were made: * `-DUSE_RUST` is replaced with `-DBUILD_RUST`, by analogy with `-DBUILD_PYTHON` * `-DCOVERAGE` was removed as it doesn't work with either modern GCC or Clang
This commit is contained in:
parent
bb2336ad73
commit
cd7f7c12f1
2
.github/ci/build_himbaechel.sh
vendored
2
.github/ci/build_himbaechel.sh
vendored
@ -8,7 +8,7 @@ function build_nextpnr {
|
|||||||
mkdir build
|
mkdir build
|
||||||
pushd build
|
pushd build
|
||||||
cmake .. -DARCH=himbaechel -DHIMBAECHEL_UARCH=example -DHIMBAECHEL_EXAMPLE_DEVICES=example
|
cmake .. -DARCH=himbaechel -DHIMBAECHEL_UARCH=example -DHIMBAECHEL_EXAMPLE_DEVICES=example
|
||||||
make nextpnr-himbaechel chipdb-himbaechel-example -j`nproc`
|
make nextpnr-himbaechel -j`nproc`
|
||||||
popd
|
popd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,3 @@
|
|||||||
/generated/
|
|
||||||
/objs/
|
/objs/
|
||||||
/nextpnr-generic*
|
/nextpnr-generic*
|
||||||
/nextpnr-ice40*
|
/nextpnr-ice40*
|
||||||
|
275
CMakeLists.txt
275
CMakeLists.txt
@ -19,17 +19,16 @@ if (CMAKE_EXPORT_COMPILE_COMMANDS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(BUILD_GUI "Build GUI" OFF)
|
option(BUILD_GUI "Build GUI" OFF)
|
||||||
option(BUILD_PYTHON "Build Python Integration" ON)
|
option(BUILD_PYTHON "Build Python integration" ON)
|
||||||
|
option(BUILD_RUST "Build Rust integration" OFF)
|
||||||
option(BUILD_TESTS "Build tests" OFF)
|
option(BUILD_TESTS "Build tests" OFF)
|
||||||
option(USE_OPENMP "Use OpenMP to accelerate analytic placer" OFF)
|
option(USE_OPENMP "Use OpenMP to accelerate analytic placer" 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)
|
option(EXTERNAL_CHIPDB "Create build with pre-built chipdb binaries" OFF)
|
||||||
option(SERIALIZE_CHIPDBS "Serialize device data preprocessing to minimize memory use" ON)
|
option(SERIALIZE_CHIPDBS "Serialize device data preprocessing to minimize memory use" ON)
|
||||||
option(WERROR "pass -Werror to compiler (used for CI)" OFF)
|
option(WERROR "pass -Werror to compiler (used for CI)" OFF)
|
||||||
option(PROFILER "Link against libprofiler" OFF)
|
option(PROFILER "Link against libprofiler" OFF)
|
||||||
option(USE_IPO "Compile nextpnr with IPO" ON)
|
option(USE_IPO "Compile nextpnr with IPO" ON)
|
||||||
option(USE_RUST "Enable Rust bindings" OFF)
|
|
||||||
|
|
||||||
set(PROGRAM_PREFIX "" CACHE STRING "Name prefix for executables")
|
set(PROGRAM_PREFIX "" CACHE STRING "Name prefix for executables")
|
||||||
|
|
||||||
@ -58,12 +57,12 @@ endif()
|
|||||||
|
|
||||||
check_cxx_compiler_hash_embed(HAS_HASH_EMBED CXX_FLAGS_HASH_EMBED)
|
check_cxx_compiler_hash_embed(HAS_HASH_EMBED CXX_FLAGS_HASH_EMBED)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_HASH_EMBED}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_FLAGS_HASH_EMBED}")
|
||||||
if (HAS_HASH_EMBED)
|
if (EXTERNAL_CHIPDB)
|
||||||
|
set(BBASM_MODE "binary")
|
||||||
|
elseif (HAS_HASH_EMBED)
|
||||||
set(BBASM_MODE "embed")
|
set(BBASM_MODE "embed")
|
||||||
elseif (WIN32)
|
elseif (WIN32)
|
||||||
set(BBASM_MODE "resource")
|
set(BBASM_MODE "resource")
|
||||||
elseif (EXTERNAL_CHIPDB)
|
|
||||||
set(BBASM_MODE "binary")
|
|
||||||
else()
|
else()
|
||||||
set(BBASM_MODE "string")
|
set(BBASM_MODE "string")
|
||||||
endif()
|
endif()
|
||||||
@ -71,12 +70,7 @@ endif()
|
|||||||
set(BBASM_SERIALIZE ${SERIALIZE_CHIPDBS})
|
set(BBASM_SERIALIZE ${SERIALIZE_CHIPDBS})
|
||||||
|
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
if (Threads_FOUND)
|
if (NOT Threads_FOUND)
|
||||||
find_package(TBB QUIET)
|
|
||||||
if (TBB_FOUND)
|
|
||||||
add_definitions(-DNEXTPNR_USE_TBB)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
add_definitions(-DNPNR_DISABLE_THREADS)
|
add_definitions(-DNPNR_DISABLE_THREADS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -91,9 +85,9 @@ if (WASI)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(link_param "")
|
|
||||||
if (STATIC_BUILD)
|
if (STATIC_BUILD)
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
set(Boost_USE_STATIC_LIBS ON)
|
||||||
|
set(Python_USE_STATIC_LIBS ON)
|
||||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
@ -101,12 +95,11 @@ if (STATIC_BUILD)
|
|||||||
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
|
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".so")
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
set(link_param "-static")
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
|
||||||
if (BUILD_PYTHON)
|
if (BUILD_PYTHON)
|
||||||
find_package(ZLIB)
|
find_package(ZLIB)
|
||||||
find_package(EXPAT)
|
find_package(EXPAT)
|
||||||
find_package(Threads)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@ -188,14 +181,17 @@ if (BUILD_PYTHON)
|
|||||||
message(STATUS "Using built-in pybind11")
|
message(STATUS "Using built-in pybind11")
|
||||||
add_subdirectory(3rdparty/pybind11 EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/pybind11 EXCLUDE_FROM_ALL)
|
||||||
endif()
|
endif()
|
||||||
|
include_directories(${Python3_INCLUDE_DIRS})
|
||||||
else()
|
else()
|
||||||
find_package(Python3 3.5 REQUIRED COMPONENTS Interpreter)
|
find_package(Python3 3.5 REQUIRED COMPONENTS Interpreter)
|
||||||
add_definitions("-DNO_PYTHON")
|
add_definitions("-DNO_PYTHON")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_RUST)
|
if (BUILD_RUST)
|
||||||
add_subdirectory(3rdparty/corrosion)
|
add_subdirectory(3rdparty/corrosion)
|
||||||
corrosion_import_crate(MANIFEST_PATH rust/Cargo.toml PROFILE "release" IMPORTED_CRATES RUST_CRATES)
|
corrosion_import_crate(MANIFEST_PATH rust/Cargo.toml PROFILE "release" IMPORTED_CRATES RUST_CRATES)
|
||||||
|
else()
|
||||||
|
add_definitions("-DNO_RUST")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (BUILD_GUI)
|
if (BUILD_GUI)
|
||||||
@ -205,7 +201,7 @@ if (BUILD_GUI)
|
|||||||
# For higher quality backtraces
|
# For higher quality backtraces
|
||||||
set(CMAKE_ENABLE_EXPORTS ON)
|
set(CMAKE_ENABLE_EXPORTS ON)
|
||||||
|
|
||||||
add_subdirectory(3rdparty/QtPropertyBrowser ${CMAKE_CURRENT_BINARY_DIR}/generated/3rdparty/QtPropertyBrowser EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/QtPropertyBrowser EXCLUDE_FROM_ALL)
|
||||||
else()
|
else()
|
||||||
add_definitions(-DNO_GUI)
|
add_definitions(-DNO_GUI)
|
||||||
endif()
|
endif()
|
||||||
@ -219,12 +215,8 @@ 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_MODULE_PATH})
|
||||||
find_package(Sanitizers)
|
find_package(Sanitizers)
|
||||||
|
|
||||||
if (COVERAGE)
|
|
||||||
include(CodeCoverage)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (BUILD_TESTS)
|
if (BUILD_TESTS)
|
||||||
add_subdirectory(3rdparty/googletest/googletest ${CMAKE_CURRENT_BINARY_DIR}/generated/3rdparty/googletest EXCLUDE_FROM_ALL)
|
add_subdirectory(3rdparty/googletest/googletest EXCLUDE_FROM_ALL)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@ -238,26 +230,7 @@ endif()
|
|||||||
|
|
||||||
include(BBAsm)
|
include(BBAsm)
|
||||||
|
|
||||||
if (NOT DEFINED CURRENT_GIT_VERSION)
|
add_subdirectory(common)
|
||||||
# Get the latest abbreviated commit hash of the working branch
|
|
||||||
# if not already defined outside (e.g. by package manager when building
|
|
||||||
# outside of git repository)
|
|
||||||
execute_process(
|
|
||||||
COMMAND git describe --tags --always
|
|
||||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
||||||
OUTPUT_VARIABLE CURRENT_GIT_VERSION
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/common/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/generated/version.h)
|
|
||||||
|
|
||||||
include_directories(
|
|
||||||
common/kernel
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
${Python3_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_subdirectory(common/kernel)
|
add_subdirectory(common/kernel)
|
||||||
add_subdirectory(common/place)
|
add_subdirectory(common/place)
|
||||||
add_subdirectory(common/route)
|
add_subdirectory(common/route)
|
||||||
@ -265,129 +238,139 @@ add_subdirectory(frontend)
|
|||||||
add_subdirectory(json)
|
add_subdirectory(json)
|
||||||
add_subdirectory(rust)
|
add_subdirectory(rust)
|
||||||
|
|
||||||
set(COMMON_LIBRARIES
|
add_subdirectory(tests/gui)
|
||||||
|
|
||||||
|
function(add_nextpnr_architecture target)
|
||||||
|
cmake_parse_arguments(arg "" "MAIN_SOURCE" "CORE_SOURCES;TEST_SOURCES" ${ARGN})
|
||||||
|
|
||||||
|
# Defs library: used by everything
|
||||||
|
#
|
||||||
|
# This library doesn't include any code, and is used to share compiler options.
|
||||||
|
|
||||||
|
add_library(nextpnr-${target}-defs INTERFACE)
|
||||||
|
|
||||||
|
target_include_directories(nextpnr-${target}-defs INTERFACE
|
||||||
|
${CMAKE_SOURCE_DIR}/common/kernel
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
string(TOUPPER ${family} family_upper)
|
||||||
|
target_compile_definitions(nextpnr-${target}-defs INTERFACE
|
||||||
|
NEXTPNR_NAMESPACE=nextpnr_${family}
|
||||||
|
ARCHNAME=${family}
|
||||||
|
ARCH_${family_upper}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Core library: used by both CLI/GUI and tests
|
||||||
|
|
||||||
|
add_library(nextpnr-${target}-core INTERFACE)
|
||||||
|
|
||||||
|
target_sources(nextpnr-${target}-core INTERFACE
|
||||||
|
${arg_CORE_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE
|
||||||
|
nextpnr-${target}-defs
|
||||||
nextpnr_kernel
|
nextpnr_kernel
|
||||||
nextpnr_place
|
nextpnr_place
|
||||||
nextpnr_route
|
nextpnr_route
|
||||||
nextpnr_frontend
|
nextpnr_frontend
|
||||||
nextpnr_json
|
nextpnr_json
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE
|
||||||
|
Boost::headers
|
||||||
|
${Boost_LIBRARIES}
|
||||||
Eigen3::Eigen
|
Eigen3::Eigen
|
||||||
oourafft
|
oourafft
|
||||||
)
|
)
|
||||||
|
|
||||||
set(EXTRA_LIB_DEPS)
|
if (Threads_FOUND)
|
||||||
if (PROFILER)
|
target_link_libraries(nextpnr-${target}-core INTERFACE Threads::Threads)
|
||||||
list(APPEND EXTRA_LIB_DEPS profiler)
|
endif()
|
||||||
endif()
|
|
||||||
if (TBB_FOUND)
|
if (BUILD_GUI)
|
||||||
list(APPEND EXTRA_LIB_DEPS TBB::tbb)
|
add_subdirectory(${CMAKE_SOURCE_DIR}/gui ${CMAKE_CURRENT_BINARY_DIR}/gui)
|
||||||
endif()
|
|
||||||
|
# Upsettingly, there is a cyclic dependency between `common/kernel` and `gui`, so these
|
||||||
|
# two libraries have to be added separately to all executable targets.
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_PYTHON)
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE ${Python3_LIBRARIES})
|
||||||
|
if (STATIC_BUILD)
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE ZLIB::ZLIB EXPAT::EXPAT)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (BUILD_RUST)
|
||||||
|
foreach (crate ${RUST_CRATES})
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE ${crate})
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (PROFILER)
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE profiler)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_sanitizers(nextpnr-${target}-core)
|
||||||
|
|
||||||
|
# Chip database
|
||||||
|
|
||||||
|
add_library(nextpnr-${target}-chipdb INTERFACE)
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${target}-core INTERFACE nextpnr-${target}-chipdb)
|
||||||
|
|
||||||
|
# CLI/GUI runner
|
||||||
|
|
||||||
|
add_executable(nextpnr-${target} ${arg_MAIN_SOURCE})
|
||||||
|
set_property(TARGET nextpnr-${target} PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
|
set_property(TARGET nextpnr-${target} PROPERTY OUTPUT_NAME ${PROGRAM_PREFIX}nextpnr-${target})
|
||||||
|
if (WASI)
|
||||||
|
# set(CMAKE_EXECUTABLE_SUFFIX) breaks CMake tests for some reason
|
||||||
|
set_property(TARGET nextpnr-${target} PROPERTY SUFFIX ".wasm")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${target} PRIVATE nextpnr-${target}-core)
|
||||||
|
if (BUILD_GUI)
|
||||||
|
target_link_libraries(nextpnr-${target} PRIVATE nextpnr-${target}-gui)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
install(TARGETS nextpnr-${target} RUNTIME DESTINATION bin)
|
||||||
|
|
||||||
|
# Test runner
|
||||||
|
|
||||||
|
if (BUILD_TESTS)
|
||||||
|
add_test(NAME nextpnr-${target}-test COMMAND nextpnr-${target}-test)
|
||||||
|
|
||||||
|
add_executable(nextpnr-${target}-test ${arg_TEST_SOURCES})
|
||||||
|
set_property(TARGET nextpnr-${target}-test PROPERTY RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
||||||
|
|
||||||
|
target_include_directories(nextpnr-${target}-test PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty/googletest/googletest/include)
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${target}-test PRIVATE gtest_main nextpnr-${target}-core)
|
||||||
|
if (BUILD_GUI)
|
||||||
|
target_link_libraries(nextpnr-${target}-test PRIVATE nextpnr-${target}-gui)
|
||||||
|
target_link_libraries(nextpnr-${target}-test PRIVATE nextpnr_test_gui)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endfunction()
|
||||||
|
|
||||||
foreach (family ${ARCH})
|
foreach (family ${ARCH})
|
||||||
message(STATUS "Configuring architecture: ${family}")
|
message(STATUS "Configuring architecture: ${family}")
|
||||||
string(TOUPPER ${family} ufamily)
|
|
||||||
aux_source_directory(${family}/ ${ufamily}_FILES)
|
|
||||||
|
|
||||||
if (BUILD_GUI)
|
|
||||||
add_subdirectory(gui ${CMAKE_CURRENT_BINARY_DIR}/generated/gui/${family} EXCLUDE_FROM_ALL)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Add the CLI binary target
|
|
||||||
add_executable(${PROGRAM_PREFIX}nextpnr-${family} ${${ufamily}_FILES})
|
|
||||||
target_link_libraries(${PROGRAM_PREFIX}nextpnr-${family} PRIVATE ${COMMON_LIBRARIES})
|
|
||||||
if (WASI)
|
|
||||||
# set(CMAKE_EXECUTABLE_SUFFIX) breaks CMake tests for some reason
|
|
||||||
set_property(TARGET ${PROGRAM_PREFIX}nextpnr-${family} PROPERTY SUFFIX ".wasm")
|
|
||||||
endif()
|
|
||||||
install(TARGETS ${PROGRAM_PREFIX}nextpnr-${family} RUNTIME DESTINATION bin)
|
|
||||||
target_compile_definitions(${PROGRAM_PREFIX}nextpnr-${family} PRIVATE MAIN_EXECUTABLE)
|
|
||||||
|
|
||||||
# Add any new per-architecture targets here
|
|
||||||
if (BUILD_TESTS)
|
|
||||||
if (COVERAGE)
|
|
||||||
APPEND_COVERAGE_COMPILER_FLAGS()
|
|
||||||
set(COVERAGE_LCOV_EXCLUDES '/usr/include/*' '3rdparty/*' 'generated/*' 'bba/*' 'tests/*')
|
|
||||||
SETUP_TARGET_FOR_COVERAGE_LCOV(
|
|
||||||
NAME ${family}-coverage
|
|
||||||
EXECUTABLE ${PROGRAM_PREFIX}nextpnr-${family}-test
|
|
||||||
DEPENDENCIES ${PROGRAM_PREFIX}nextpnr-${family}-test
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
aux_source_directory(tests/${family}/ ${ufamily}_TEST_FILES)
|
|
||||||
if (BUILD_GUI)
|
|
||||||
aux_source_directory(tests/gui/ GUI_TEST_FILES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(${PROGRAM_PREFIX}nextpnr-${family}-test ${${ufamily}_TEST_FILES}
|
|
||||||
${${ufamily}_FILES} ${GUI_TEST_FILES})
|
|
||||||
target_link_libraries(${PROGRAM_PREFIX}nextpnr-${family}-test PRIVATE ${COMMON_LIBRARIES} gtest_main)
|
|
||||||
add_sanitizers(${PROGRAM_PREFIX}nextpnr-${family}-test)
|
|
||||||
|
|
||||||
add_test(${family}-test ${CMAKE_CURRENT_BINARY_DIR}/nextpnr-${family}-test)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Set ${family_targets} to the list of targets being build for this family
|
|
||||||
set(family_targets ${PROGRAM_PREFIX}nextpnr-${family})
|
|
||||||
|
|
||||||
if (BUILD_TESTS)
|
|
||||||
set(family_targets ${family_targets} ${PROGRAM_PREFIX}nextpnr-${family}-test)
|
|
||||||
set(family_test_targets ${PROGRAM_PREFIX}nextpnr-${family}-test)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Include the family-specific CMakeFile
|
|
||||||
add_subdirectory(${family})
|
add_subdirectory(${family})
|
||||||
# include(${family}/family.cmake)
|
|
||||||
foreach (target ${family_targets})
|
|
||||||
foreach (lib_dep ${EXTRA_LIB_DEPS})
|
|
||||||
target_link_libraries(${target} PRIVATE ${lib_dep})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
# Include family-specific source files to all family targets and set defines appropriately
|
|
||||||
target_include_directories(${target} PRIVATE ${family}/ ${CMAKE_CURRENT_BINARY_DIR}/generated/ rust/)
|
|
||||||
target_compile_definitions(${target} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family} ARCH_${ufamily} ARCHNAME=${family})
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC ${Boost_LIBRARIES} ${link_param})
|
|
||||||
if (NOT MSVC)
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC pthread)
|
|
||||||
endif()
|
|
||||||
add_sanitizers(${target})
|
|
||||||
if (BUILD_GUI)
|
|
||||||
target_compile_definitions(${target} PRIVATE QT_NO_KEYWORDS)
|
|
||||||
target_include_directories(${target} PRIVATE gui/${family}/ gui/)
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC gui_${family})
|
|
||||||
endif()
|
|
||||||
if (BUILD_PYTHON)
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC ${Python3_LIBRARIES})
|
|
||||||
if (STATIC_BUILD)
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS} ${ZLIB_LIBRARIES} ${EXPAT_LIBRARIES})
|
|
||||||
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
||||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
|
||||||
else()
|
|
||||||
target_link_libraries(${target} LINK_PUBLIC -lutil)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if (USE_RUST)
|
|
||||||
target_sources(${target} PRIVATE ${RUST_FILES})
|
|
||||||
target_compile_definitions(${target} PRIVATE USE_RUST)
|
|
||||||
foreach (crate ${RUST_CRATES})
|
|
||||||
target_link_libraries(${target} PRIVATE ${crate})
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
file(GLOB_RECURSE CLANGFORMAT_FILES *.cc *.h)
|
file(GLOB_RECURSE CLANGFORMAT_FILES *.cc *.h)
|
||||||
string(REGEX REPLACE "[^;]*/ice40/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/ice40/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
string(REGEX REPLACE "[^;]*/ecp5/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/ecp5/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
string(REGEX REPLACE "[^;]*nexus/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/nexus/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
string(REGEX REPLACE "[^;]*/machxo2/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/machxo2/chipdb/chipdb-[^;]*.cc" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
string(REGEX REPLACE "[^;]*/3rdparty[^;]*" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/3rdparty/[^;]*" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
string(REGEX REPLACE "[^;]*/generated[^;]*" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
|
||||||
string(REGEX REPLACE "[^;]*/libmistral/[^;]*" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
string(REGEX REPLACE "[^;]*/libmistral/[^;]*" "" CLANGFORMAT_FILES "${CLANGFORMAT_FILES}")
|
||||||
|
|
||||||
add_custom_target(
|
add_custom_target(clangformat
|
||||||
clangformat
|
|
||||||
COMMAND clang-format
|
COMMAND clang-format
|
||||||
-style=file
|
-style=file
|
||||||
-i
|
-i
|
||||||
|
@ -59,29 +59,31 @@ endfunction()
|
|||||||
#
|
#
|
||||||
# add_bba_compile_command(
|
# add_bba_compile_command(
|
||||||
# TARGET chipdb-ice40
|
# TARGET chipdb-ice40
|
||||||
# OUTPUT ${CMAKE_BINARY_DIR}/chipdb/ice40/chipdb-1k.bin
|
# OUTPUT ice40/chipdb-1k.bin
|
||||||
# INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-1k.bba
|
# INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-1k.bba
|
||||||
# IDENT ice40/chipdb-1k.bba
|
|
||||||
# MODE binary
|
# MODE binary
|
||||||
# )
|
# )
|
||||||
#
|
#
|
||||||
# Paths must be absolute.
|
# Paths must be absolute.
|
||||||
#
|
#
|
||||||
function(add_bba_compile_command)
|
function(add_bba_compile_command)
|
||||||
cmake_parse_arguments(arg "" "TARGET;OUTPUT;INPUT;IDENT;MODE" "" ${ARGN})
|
cmake_parse_arguments(arg "" "TARGET;OUTPUT;INPUT;MODE" "" ${ARGN})
|
||||||
|
|
||||||
cmake_path(GET arg_OUTPUT PARENT_PATH arg_OUTPUT_DIR)
|
cmake_path(GET arg_OUTPUT PARENT_PATH arg_OUTPUT_DIR)
|
||||||
file(MAKE_DIRECTORY ${arg_OUTPUT_DIR})
|
cmake_path(GET arg_OUTPUT FILENAME arg_OUTPUT_NAME)
|
||||||
|
|
||||||
|
set(arg_PRODUCT ${CMAKE_BINARY_DIR}/share/${arg_OUTPUT})
|
||||||
|
cmake_path(GET arg_PRODUCT PARENT_PATH arg_PRODUCT_DIR)
|
||||||
|
|
||||||
if (arg_MODE STREQUAL "binary" OR arg_MODE STREQUAL "resource")
|
if (arg_MODE STREQUAL "binary" OR arg_MODE STREQUAL "resource")
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${arg_OUTPUT}
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
COMMAND
|
COMMAND
|
||||||
bbasm ${BBASM_ENDIAN_FLAG}
|
bbasm ${BBASM_ENDIAN_FLAG}
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
${arg_OUTPUT}
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
bbasm
|
bbasm
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
@ -91,18 +93,37 @@ function(add_bba_compile_command)
|
|||||||
if (arg_MODE STREQUAL "resource")
|
if (arg_MODE STREQUAL "resource")
|
||||||
|
|
||||||
file(WRITE ${arg_OUTPUT}.rc
|
file(WRITE ${arg_OUTPUT}.rc
|
||||||
"${arg_IDENT} RCDATA \"${arg_OUTPUT}\"")
|
"${arg_OUTPUT} RCDATA \"${arg_OUTPUT}\"")
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
${arg_TARGET} PRIVATE
|
${arg_TARGET} PUBLIC
|
||||||
${arg_OUTPUT}.rc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.rc
|
||||||
)
|
)
|
||||||
|
|
||||||
else()
|
else()
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
${arg_TARGET} PRIVATE
|
${arg_TARGET} PUBLIC
|
||||||
${arg_OUTPUT}
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E make_directory
|
||||||
|
${arg_PRODUCT_DIR}
|
||||||
|
COMMAND
|
||||||
|
${CMAKE_COMMAND} -E copy
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
|
${arg_PRODUCT}
|
||||||
|
APPEND
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
install(
|
||||||
|
FILES ${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
|
DESTINATION share/nextpnr/${arg_OUTPUT_DIR}
|
||||||
)
|
)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
@ -111,13 +132,13 @@ function(add_bba_compile_command)
|
|||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
${arg_OUTPUT}
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
COMMAND
|
COMMAND
|
||||||
bbasm ${BBASM_ENDIAN_FLAG} --e
|
bbasm ${BBASM_ENDIAN_FLAG} --e
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
${arg_OUTPUT}
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}
|
||||||
DEPENDS
|
DEPENDS
|
||||||
bbasm
|
bbasm
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
@ -125,19 +146,19 @@ function(add_bba_compile_command)
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
${arg_TARGET} PRIVATE
|
${arg_TARGET} PUBLIC
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
elseif (arg_MODE STREQUAL "string")
|
elseif (arg_MODE STREQUAL "string")
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
COMMAND
|
COMMAND
|
||||||
bbasm ${BBASM_ENDIAN_FLAG} --c
|
bbasm ${BBASM_ENDIAN_FLAG} --c
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
DEPENDS
|
DEPENDS
|
||||||
bbasm
|
bbasm
|
||||||
${arg_INPUT}
|
${arg_INPUT}
|
||||||
@ -146,14 +167,14 @@ function(add_bba_compile_command)
|
|||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
set_source_files_properties(
|
set_source_files_properties(
|
||||||
${arg_OUTPUT}.cc PROPERTIES
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc PROPERTIES
|
||||||
COMPILE_OPTIONS "-w;-g0;-O0"
|
COMPILE_OPTIONS "-w;-g0;-O0"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
target_sources(
|
target_sources(
|
||||||
${arg_TARGET} PRIVATE
|
${arg_TARGET} PUBLIC
|
||||||
${arg_OUTPUT}.cc
|
${CMAKE_CURRENT_BINARY_DIR}/${arg_OUTPUT_NAME}.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
endif()
|
endif()
|
||||||
|
20
common/CMakeLists.txt
Normal file
20
common/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
if (NOT DEFINED CURRENT_GIT_VERSION)
|
||||||
|
# Get the latest abbreviated commit hash of the working branch if not already defined outside
|
||||||
|
# (e.g. by package manager when building outside of git repository).
|
||||||
|
execute_process(
|
||||||
|
COMMAND git describe --tags --always
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE CURRENT_GIT_VERSION
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
|
||||||
|
|
||||||
|
add_library(nextpnr_version INTERFACE)
|
||||||
|
|
||||||
|
target_include_directories(nextpnr_version INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
|
target_sources(nextpnr_version INTERFACE
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/version.h
|
||||||
|
)
|
@ -68,6 +68,7 @@ target_sources(nextpnr_kernel PUBLIC
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(nextpnr_kernel INTERFACE
|
target_link_libraries(nextpnr_kernel INTERFACE
|
||||||
|
nextpnr_version
|
||||||
nextpnr_frontend
|
nextpnr_frontend
|
||||||
nextpnr_json
|
nextpnr_json
|
||||||
nextpnr_rust
|
nextpnr_rust
|
||||||
@ -75,6 +76,10 @@ target_link_libraries(nextpnr_kernel INTERFACE
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (BUILD_PYTHON)
|
if (BUILD_PYTHON)
|
||||||
|
target_include_directories(nextpnr_kernel INTERFACE
|
||||||
|
${Python3_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
target_link_libraries(nextpnr_kernel INTERFACE
|
target_link_libraries(nextpnr_kernel INTERFACE
|
||||||
pybind11::headers
|
pybind11::headers
|
||||||
)
|
)
|
||||||
|
@ -19,7 +19,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NO_GUI
|
#ifndef NO_GUI
|
||||||
#include <QApplication>
|
|
||||||
#include "application.h"
|
#include "application.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -249,7 +249,7 @@ PYBIND11_EMBEDDED_MODULE(MODULE_NAME, m)
|
|||||||
|
|
||||||
m.def("parse_json", parse_json_shim);
|
m.def("parse_json", parse_json_shim);
|
||||||
m.def("load_design", load_design_shim, py::return_value_policy::take_ownership);
|
m.def("load_design", load_design_shim, py::return_value_policy::take_ownership);
|
||||||
#ifdef USE_RUST
|
#ifndef NO_RUST
|
||||||
m.def("example_printnets", example_printnets);
|
m.def("example_printnets", example_printnets);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -311,21 +311,17 @@ void (*python_sighandler)(int) = nullptr;
|
|||||||
|
|
||||||
void init_python(const char *executable)
|
void init_python(const char *executable)
|
||||||
{
|
{
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
static const char *python_argv[1];
|
static const char *python_argv[1];
|
||||||
python_argv[0] = executable;
|
python_argv[0] = executable;
|
||||||
py::initialize_interpreter(true, 1, python_argv);
|
py::initialize_interpreter(true, 1, python_argv);
|
||||||
py::module::import(TOSTRING(MODULE_NAME));
|
py::module::import(TOSTRING(MODULE_NAME));
|
||||||
PyRun_SimpleString("from " TOSTRING(MODULE_NAME) " import *");
|
PyRun_SimpleString("from " TOSTRING(MODULE_NAME) " import *");
|
||||||
python_sighandler = signal(SIGINT, SIG_DFL);
|
python_sighandler = signal(SIGINT, SIG_DFL);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void deinit_python()
|
void deinit_python()
|
||||||
{
|
{
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
py::finalize_interpreter();
|
py::finalize_interpreter();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void execute_python_file(const char *python_file)
|
void execute_python_file(const char *python_file)
|
||||||
|
@ -1,12 +1,36 @@
|
|||||||
include(FindTrellis)
|
include(FindTrellis)
|
||||||
|
|
||||||
add_library(chipdb-${family} OBJECT)
|
set(SOURCES
|
||||||
target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
|
arch.cc
|
||||||
target_include_directories(chipdb-${family} PRIVATE .)
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_place.cc
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
baseconfigs.cc
|
||||||
|
bitstream.cc
|
||||||
|
bitstream.h
|
||||||
|
cells.cc
|
||||||
|
cells.h
|
||||||
|
config.cc
|
||||||
|
config.h
|
||||||
|
constids.inc
|
||||||
|
dcu_bitstream.h
|
||||||
|
gfx.cc
|
||||||
|
gfx.h
|
||||||
|
globals.cc
|
||||||
|
globals.h
|
||||||
|
iotypes.inc
|
||||||
|
lpf.cc
|
||||||
|
pack.cc
|
||||||
|
pio.cc
|
||||||
|
pio.h
|
||||||
|
)
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
add_nextpnr_architecture(${family}
|
||||||
target_link_libraries(${family_target} PRIVATE chipdb-${family})
|
CORE_SOURCES ${SOURCES}
|
||||||
endforeach()
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
set(ALL_ECP5_DEVICES 25k 45k 85k)
|
set(ALL_ECP5_DEVICES 25k 45k 85k)
|
||||||
set(ECP5_DEVICES ${ALL_ECP5_DEVICES} CACHE STRING
|
set(ECP5_DEVICES ${ALL_ECP5_DEVICES} CACHE STRING
|
||||||
@ -37,10 +61,9 @@ foreach (device ${ECP5_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-${family}
|
TARGET nextpnr-${family}-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/${family}/chipdb-${device}.bin
|
OUTPUT ${family}/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
IDENT ${family}/chipdb-${device}.bin
|
|
||||||
MODE ${BBASM_MODE}
|
MODE ${BBASM_MODE}
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "bitstream.h"
|
#include "bitstream.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
@ -298,5 +296,3 @@ int main(int argc, char *argv[])
|
|||||||
ECP5CommandHandler handler(argc, argv);
|
ECP5CommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -2,7 +2,7 @@ add_library(nextpnr_frontend INTERFACE)
|
|||||||
|
|
||||||
target_include_directories(nextpnr_frontend INTERFACE .)
|
target_include_directories(nextpnr_frontend INTERFACE .)
|
||||||
|
|
||||||
target_sources(nextpnr_frontend PUBLIC
|
target_sources(nextpnr_frontend INTERFACE
|
||||||
frontend_base.h
|
frontend_base.h
|
||||||
json_frontend.cc
|
json_frontend.cc
|
||||||
json_frontend.h
|
json_frontend.h
|
||||||
|
@ -1,7 +1,37 @@
|
|||||||
set(VIADUCT_UARCHES "example" "okami" "fabulous")
|
set(SOURCES
|
||||||
foreach (uarch ${VIADUCT_UARCHES})
|
arch.cc
|
||||||
aux_source_directory(viaduct/${uarch} UARCH_FILES)
|
archdefs.h
|
||||||
foreach (target ${family_targets})
|
arch.h
|
||||||
target_sources(${target} PRIVATE ${UARCH_FILES})
|
arch_pybindings.cc
|
||||||
endforeach()
|
arch_pybindings.h
|
||||||
endforeach()
|
cells.cc
|
||||||
|
cells.h
|
||||||
|
pack.cc
|
||||||
|
viaduct_api.cc
|
||||||
|
viaduct_api.h
|
||||||
|
viaduct_constids.h
|
||||||
|
viaduct_helpers.cc
|
||||||
|
viaduct_helpers.h
|
||||||
|
viaduct/example/constids.inc
|
||||||
|
viaduct/example/example.cc
|
||||||
|
viaduct/fabulous/constids.inc
|
||||||
|
viaduct/fabulous/fab_cfg.h
|
||||||
|
viaduct/fabulous/fab_defs.h
|
||||||
|
viaduct/fabulous/fabric_parsing.h
|
||||||
|
viaduct/fabulous/fabulous.cc
|
||||||
|
viaduct/fabulous/fasm.cc
|
||||||
|
viaduct/fabulous/fasm.h
|
||||||
|
viaduct/fabulous/pack.cc
|
||||||
|
viaduct/fabulous/pack.h
|
||||||
|
viaduct/fabulous/validity_check.cc
|
||||||
|
viaduct/fabulous/validity_check.h
|
||||||
|
viaduct/okami/constids.inc
|
||||||
|
viaduct/okami/okami.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_architecture(${family}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(nextpnr-${family}-chipdb PUBLIC chipdb.cc)
|
||||||
|
1
generic/chipdb.cc
Normal file
1
generic/chipdb.cc
Normal file
@ -0,0 +1 @@
|
|||||||
|
/* Intentionally left empty */
|
@ -17,8 +17,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "design_utils.h"
|
#include "design_utils.h"
|
||||||
@ -102,5 +100,3 @@ int main(int argc, char *argv[])
|
|||||||
GenericCommandHandler handler(argc, argv);
|
GenericCommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,12 +1,27 @@
|
|||||||
include(FindApycula)
|
include(FindApycula)
|
||||||
|
|
||||||
add_library(chipdb-${family} OBJECT)
|
set(SOURCES
|
||||||
target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
|
arch.cc
|
||||||
target_include_directories(chipdb-${family} PRIVATE .)
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
cells.cc
|
||||||
|
cells.h
|
||||||
|
constids.inc
|
||||||
|
cst.cc
|
||||||
|
cst.h
|
||||||
|
gfx.cc
|
||||||
|
gfx.h
|
||||||
|
globals.cc
|
||||||
|
globals.h
|
||||||
|
pack.cc
|
||||||
|
)
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
add_nextpnr_architecture(${family}
|
||||||
target_link_libraries(${family_target} PRIVATE chipdb-${family})
|
CORE_SOURCES ${SOURCES}
|
||||||
endforeach()
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
set(ALL_GOWIN_DEVICES GW1N-1 GW1NZ-1 GW1N-4 GW1N-9 GW1N-9C GW1NS-2 GW1NS-4 GW2A-18)
|
set(ALL_GOWIN_DEVICES GW1N-1 GW1NZ-1 GW1N-4 GW1N-9 GW1N-9C GW1NS-2 GW1NS-4 GW2A-18)
|
||||||
set(GOWIN_DEVICES ${ALL_GOWIN_DEVICES} CACHE STRING
|
set(GOWIN_DEVICES ${ALL_GOWIN_DEVICES} CACHE STRING
|
||||||
@ -30,10 +45,9 @@ foreach (device ${GOWIN_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-${family}
|
TARGET nextpnr-${family}-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/${family}/chipdb-${device}.bin
|
OUTPUT ${family}/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
IDENT ${family}/chipdb-${device}.bin
|
|
||||||
MODE ${BBASM_MODE}
|
MODE ${BBASM_MODE}
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <regex>
|
#include <regex>
|
||||||
@ -126,4 +124,3 @@ int main(int argc, char *argv[])
|
|||||||
GowinCommandHandler handler(argc, argv);
|
GowinCommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
add_compile_definitions(QT_NO_KEYWORDS)
|
|
||||||
|
|
||||||
set(GUI_SOURCES
|
set(GUI_SOURCES
|
||||||
application.cc
|
application.cc
|
||||||
application.h
|
application.h
|
||||||
@ -34,39 +32,43 @@ qt5_add_resources(GUI_QT_RESOURCES
|
|||||||
${family}/nextpnr.qrc
|
${family}/nextpnr.qrc
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(gui_${family} STATIC
|
add_library(nextpnr-${target}-gui OBJECT
|
||||||
${GUI_SOURCES}
|
${GUI_SOURCES}
|
||||||
${GUI_QT_RESOURCES}
|
${GUI_QT_RESOURCES}
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(gui_${family} PRIVATE
|
target_compile_definitions(nextpnr-${target}-gui PUBLIC
|
||||||
|
QT_NO_KEYWORDS
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(nextpnr-${target}-gui PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/${family}
|
${CMAKE_CURRENT_SOURCE_DIR}/${family}
|
||||||
${CMAKE_SOURCE_DIR}/${family}
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(nextpnr-${target}-gui PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/frontend
|
||||||
|
${CMAKE_SOURCE_DIR}/json
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/QtPropertyBrowser/src
|
${CMAKE_SOURCE_DIR}/3rdparty/QtPropertyBrowser/src
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/imgui
|
${CMAKE_SOURCE_DIR}/3rdparty/imgui
|
||||||
${CMAKE_SOURCE_DIR}/3rdparty/qtimgui
|
${CMAKE_SOURCE_DIR}/3rdparty/qtimgui
|
||||||
${CMAKE_BINARY_DIR}/generated
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_definitions(gui_${family} PRIVATE
|
target_link_libraries(nextpnr-${target}-gui PUBLIC
|
||||||
NEXTPNR_NAMESPACE=nextpnr_${family}
|
|
||||||
ARCH_${ufamily}
|
|
||||||
ARCHNAME=${family}
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(gui_${family} PUBLIC
|
|
||||||
Qt5::Widgets
|
Qt5::Widgets
|
||||||
)
|
)
|
||||||
target_link_libraries(gui_${family} PRIVATE
|
|
||||||
nextpnr_kernel
|
target_link_libraries(nextpnr-${target}-gui PRIVATE
|
||||||
|
nextpnr-${target}-defs
|
||||||
|
nextpnr_version
|
||||||
Qt5::OpenGL
|
Qt5::OpenGL
|
||||||
QtPropertyBrowser
|
QtPropertyBrowser
|
||||||
${EXTRA_LIB_DEPS}
|
pybind11_headers
|
||||||
)
|
)
|
||||||
|
|
||||||
# Currently always the case when the GUI is built.
|
# Currently always the case when the GUI is built.
|
||||||
if (BUILD_PYTHON)
|
if (BUILD_PYTHON)
|
||||||
target_sources(gui_${family} PRIVATE
|
target_sources(nextpnr-${target}-gui PRIVATE
|
||||||
../3rdparty/python-console/ColumnFormatter.cpp
|
../3rdparty/python-console/ColumnFormatter.cpp
|
||||||
../3rdparty/python-console/ParseHelper.cpp
|
../3rdparty/python-console/ParseHelper.cpp
|
||||||
../3rdparty/python-console/ParseHelper.BlockParseState.cpp
|
../3rdparty/python-console/ParseHelper.BlockParseState.cpp
|
||||||
@ -83,7 +85,7 @@ if (BUILD_PYTHON)
|
|||||||
../3rdparty/qtimgui/QtImGui.cpp
|
../3rdparty/qtimgui/QtImGui.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(gui_${family} PRIVATE
|
target_include_directories(nextpnr-${target}-gui PRIVATE
|
||||||
../3rdparty/python-console
|
../3rdparty/python-console
|
||||||
../3rdparty/python-console/modified
|
../3rdparty/python-console/modified
|
||||||
)
|
)
|
||||||
|
@ -226,7 +226,7 @@ template <typename CoordinateT, typename ElementT> class QuadTreeNode
|
|||||||
return *this;
|
return *this;
|
||||||
bound_ = other.bound_;
|
bound_ = other.bound_;
|
||||||
max_elems_ = other.max_elems_;
|
max_elems_ = other.max_elems_;
|
||||||
children_ = other.max_children_;
|
// children_ = other.max_children_;
|
||||||
children_ = other.children_;
|
children_ = other.children_;
|
||||||
splitx_ = other.splitx_;
|
splitx_ = other.splitx_;
|
||||||
splity_ = other.splity_;
|
splity_ = other.splity_;
|
||||||
|
@ -1,3 +1,37 @@
|
|||||||
|
set(SOURCES
|
||||||
|
arch.cc
|
||||||
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
chipdb.h
|
||||||
|
himbaechel_api.cc
|
||||||
|
himbaechel_api.h
|
||||||
|
himbaechel_constids.h
|
||||||
|
himbaechel_gfxids.h
|
||||||
|
himbaechel_helpers.cc
|
||||||
|
himbaechel_helpers.h
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_architecture(${family}
|
||||||
|
CORE_SOURCES ${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()
|
||||||
|
|
||||||
set(HIMBAECHEL_UARCHES example gowin xilinx ng-ultra)
|
set(HIMBAECHEL_UARCHES example gowin xilinx ng-ultra)
|
||||||
|
|
||||||
set(HIMBAECHEL_UARCH "" CACHE STRING "Microarchitectures for nextpnr-himbaechel build")
|
set(HIMBAECHEL_UARCH "" CACHE STRING "Microarchitectures for nextpnr-himbaechel build")
|
||||||
@ -5,7 +39,7 @@ set_property(CACHE HIMBAECHEL_UARCH PROPERTY STRINGS ${HIMBAECHEL_UARCHES})
|
|||||||
|
|
||||||
if (NOT HIMBAECHEL_UARCH)
|
if (NOT HIMBAECHEL_UARCH)
|
||||||
message(STATUS "Microarchitecture needs to be set, set desired one with -DHIMBAECHEL_UARCH=xxx")
|
message(STATUS "Microarchitecture needs to be set, set desired one with -DHIMBAECHEL_UARCH=xxx")
|
||||||
message(STATUS "Supported Himbaechel microarchitectures are :")
|
message(STATUS "Supported Himbächel microarchitectures are :")
|
||||||
message(STATUS " all")
|
message(STATUS " all")
|
||||||
foreach (item ${HIMBAECHEL_UARCHES})
|
foreach (item ${HIMBAECHEL_UARCHES})
|
||||||
message(STATUS " ${item}")
|
message(STATUS " ${item}")
|
||||||
@ -19,18 +53,9 @@ endif()
|
|||||||
|
|
||||||
foreach (uarch ${HIMBAECHEL_UARCH})
|
foreach (uarch ${HIMBAECHEL_UARCH})
|
||||||
if (NOT uarch IN_LIST HIMBAECHEL_UARCHES)
|
if (NOT uarch IN_LIST HIMBAECHEL_UARCHES)
|
||||||
message(FATAL_ERROR "Microarchitecture ${uarch} is not a supported Himbaechel microarchitecture")
|
message(FATAL_ERROR "Microarchitecture ${uarch} is not a supported Himbächel microarchitecture")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Configuring Himbächel microarchitecture: ${uarch}")
|
||||||
add_subdirectory(uarch/${uarch})
|
add_subdirectory(uarch/${uarch})
|
||||||
aux_source_directory(uarch/${uarch} HM_UARCH_FILES)
|
|
||||||
foreach (target ${family_targets})
|
|
||||||
target_sources(${target} PRIVATE ${HM_UARCH_FILES})
|
|
||||||
endforeach()
|
|
||||||
if (BUILD_TESTS)
|
|
||||||
foreach (target ${family_test_targets})
|
|
||||||
aux_source_directory(uarch/${uarch}/tests/ HM_UARCH_TEST_FILES)
|
|
||||||
target_sources(${target} PRIVATE ${HM_UARCH_TEST_FILES})
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "design_utils.h"
|
#include "design_utils.h"
|
||||||
@ -106,5 +104,3 @@ int main(int argc, char *argv[])
|
|||||||
HimbaechelCommandHandler handler(argc, argv);
|
HimbaechelCommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
add_custom_target(chipdb-himbaechel-example)
|
set(SOURCES
|
||||||
foreach (target ${family_targets})
|
constids.inc
|
||||||
add_dependencies(${target} chipdb-himbaechel-example)
|
example.cc
|
||||||
endforeach()
|
gfxids.inc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_himbaechel_microarchitecture(${uarch}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
set(ALL_HIMBAECHEL_EXAMPLE_DEVICES example)
|
set(ALL_HIMBAECHEL_EXAMPLE_DEVICES example)
|
||||||
set(HIMBAECHEL_EXAMPLE_DEVICES ${ALL_HIMBAECHEL_EXAMPLE_DEVICES} CACHE STRING
|
set(HIMBAECHEL_EXAMPLE_DEVICES ${ALL_HIMBAECHEL_EXAMPLE_DEVICES} CACHE STRING
|
||||||
@ -26,14 +31,9 @@ foreach (device ${HIMBAECHEL_EXAMPLE_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-himbaechel-example
|
TARGET nextpnr-himbaechel-example-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/himbaechel/example/chipdb-${device}.bin
|
OUTPUT himbaechel/example/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
MODE binary
|
MODE binary
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_BINARY_DIR}/share/himbaechel/example
|
|
||||||
DESTINATION share/nextpnr/himbaechel/example
|
|
||||||
)
|
|
||||||
|
@ -1,9 +1,22 @@
|
|||||||
include(FindApycula)
|
include(FindApycula)
|
||||||
|
|
||||||
add_custom_target(chipdb-himbaechel-gowin ALL)
|
set(SOURCES
|
||||||
foreach (target ${family_targets})
|
constids.inc
|
||||||
add_dependencies(${target} chipdb-himbaechel-gowin)
|
cst.cc
|
||||||
endforeach()
|
cst.h
|
||||||
|
globals.cc
|
||||||
|
globals.h
|
||||||
|
gowin.cc
|
||||||
|
gowin.h
|
||||||
|
gowin_utils.cc
|
||||||
|
gowin_utils.h
|
||||||
|
pack.cc
|
||||||
|
pack.h
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_himbaechel_microarchitecture(${uarch}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
set(ALL_HIMBAECHEL_GOWIN_DEVICES GW1N-1 GW1NZ-1 GW1N-4 GW1N-9 GW1N-9C GW1NS-4 GW2A-18 GW2A-18C)
|
set(ALL_HIMBAECHEL_GOWIN_DEVICES GW1N-1 GW1NZ-1 GW1N-4 GW1N-9 GW1N-9C GW1NS-4 GW2A-18 GW2A-18C)
|
||||||
set(HIMBAECHEL_GOWIN_DEVICES ${ALL_HIMBAECHEL_GOWIN_DEVICES} CACHE STRING
|
set(HIMBAECHEL_GOWIN_DEVICES ${ALL_HIMBAECHEL_GOWIN_DEVICES} CACHE STRING
|
||||||
@ -31,14 +44,9 @@ foreach (device ${HIMBAECHEL_GOWIN_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-himbaechel-gowin
|
TARGET nextpnr-himbaechel-gowin-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/himbaechel/gowin/chipdb-${device}.bin
|
OUTPUT himbaechel/gowin/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
MODE binary
|
MODE binary
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_BINARY_DIR}/share/himbaechel/gowin
|
|
||||||
DESTINATION share/nextpnr/himbaechel/gowin
|
|
||||||
)
|
|
||||||
|
@ -114,7 +114,7 @@ struct GowinArch : HimbaechelArch
|
|||||||
{
|
{
|
||||||
return std::make_unique<GowinImpl>();
|
return std::make_unique<GowinImpl>();
|
||||||
}
|
}
|
||||||
} gowinrArch;
|
} gowinArch;
|
||||||
|
|
||||||
void GowinImpl::init_database(Arch *arch)
|
void GowinImpl::init_database(Arch *arch)
|
||||||
{
|
{
|
||||||
|
@ -1,14 +1,33 @@
|
|||||||
|
set(SOURCES
|
||||||
|
bitstream.cc
|
||||||
|
cells.cc
|
||||||
|
constids.inc
|
||||||
|
csv.cc
|
||||||
|
extra_data.h
|
||||||
|
location_map.cc
|
||||||
|
location_map.h
|
||||||
|
ng_ultra.cc
|
||||||
|
ng_ultra.h
|
||||||
|
pack.cc
|
||||||
|
pack.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(TEST_SOURCES
|
||||||
|
tests/lut_dff.cc
|
||||||
|
tests/main.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_himbaechel_microarchitecture(${uarch}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
TEST_SOURCES ${TEST_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
set(HIMBAECHEL_PRJBEYOND_DB "" CACHE STRING
|
set(HIMBAECHEL_PRJBEYOND_DB "" CACHE STRING
|
||||||
"Path to a Project Beyond database")
|
"Path to a Project Beyond database")
|
||||||
if (NOT HIMBAECHEL_PRJBEYOND_DB)
|
if (NOT HIMBAECHEL_PRJBEYOND_DB)
|
||||||
message(FATAL_ERROR "HIMBAECHEL_PRJBEYOND_DB must be set to a prjbeyond database checkout")
|
message(FATAL_ERROR "HIMBAECHEL_PRJBEYOND_DB must be set to a prjbeyond database checkout")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_custom_target(chipdb-himbaechel-ng-ultra)
|
|
||||||
foreach (target ${family_targets})
|
|
||||||
add_dependencies(${target} chipdb-himbaechel-ng-ultra)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(ALL_HIMBAECHEL_NGULTRA_DEVICES ng-ultra)
|
set(ALL_HIMBAECHEL_NGULTRA_DEVICES ng-ultra)
|
||||||
set(HIMBAECHEL_NGULTRA_DEVICES ${ALL_HIMBAECHEL_NGULTRA_DEVICES} CACHE STRING
|
set(HIMBAECHEL_NGULTRA_DEVICES ${ALL_HIMBAECHEL_NGULTRA_DEVICES} CACHE STRING
|
||||||
"Include support for these NG-Ultra devices (available: ${ALL_HIMBAECHEL_NGULTRA_DEVICES})")
|
"Include support for these NG-Ultra devices (available: ${ALL_HIMBAECHEL_NGULTRA_DEVICES})")
|
||||||
@ -19,13 +38,13 @@ foreach (device ${HIMBAECHEL_NGULTRA_DEVICES})
|
|||||||
message(FATAL_ERROR "Device ${device} is not a supported NG-Ultra device")
|
message(FATAL_ERROR "Device ${device} is not a supported NG-Ultra device")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
string(TOUPPER ${device} upcase_device)
|
string(TOUPPER ${device} device_upper)
|
||||||
|
|
||||||
add_bba_produce_command(
|
add_bba_produce_command(
|
||||||
COMMAND ${Python3_EXECUTABLE}
|
COMMAND ${Python3_EXECUTABLE}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/gen/arch_gen.py
|
${CMAKE_CURRENT_SOURCE_DIR}/gen/arch_gen.py
|
||||||
--db ${HIMBAECHEL_PRJBEYOND_DB}
|
--db ${HIMBAECHEL_PRJBEYOND_DB}
|
||||||
--device ${upcase_device}
|
--device ${device_upper}
|
||||||
--bba ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba.new
|
--bba ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba.new
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
@ -35,14 +54,9 @@ foreach (device ${HIMBAECHEL_NGULTRA_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-himbaechel-ng-ultra
|
TARGET nextpnr-himbaechel-ng-ultra-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/himbaechel/ng-ultra/chipdb-${device}.bin
|
OUTPUT himbaechel/ng-ultra/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
MODE binary
|
MODE binary
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_BINARY_DIR}/share/himbaechel/ng-ultra
|
|
||||||
DESTINATION share/nextpnr/himbaechel/ng-ultra
|
|
||||||
)
|
|
||||||
|
@ -1,14 +1,33 @@
|
|||||||
|
set(SOURCES
|
||||||
|
cells.cc
|
||||||
|
constids.inc
|
||||||
|
extra_data.h
|
||||||
|
fasm.cc
|
||||||
|
pack_carry.cc
|
||||||
|
pack.cc
|
||||||
|
pack_clocking.cc
|
||||||
|
pack_dram.cc
|
||||||
|
pack_dsp_xc7.cc
|
||||||
|
pack.h
|
||||||
|
pack_io.cc
|
||||||
|
pins.cc
|
||||||
|
pins.h
|
||||||
|
xdc.cc
|
||||||
|
xilinx.cc
|
||||||
|
xilinx.h
|
||||||
|
xilinx_place.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_himbaechel_microarchitecture(${uarch}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
set(HIMBAECHEL_PRJXRAY_DB "" CACHE STRING
|
set(HIMBAECHEL_PRJXRAY_DB "" CACHE STRING
|
||||||
"Path to a project x-ray database")
|
"Path to a project x-ray database")
|
||||||
if (NOT HIMBAECHEL_PRJXRAY_DB)
|
if (NOT HIMBAECHEL_PRJXRAY_DB)
|
||||||
message(FATAL_ERROR "HIMBAECHEL_PRJXRAY_DB must be set to a prjxray database checkout")
|
message(FATAL_ERROR "HIMBAECHEL_PRJXRAY_DB must be set to a prjxray database checkout")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_custom_target(chipdb-himbaechel-xilinx)
|
|
||||||
foreach (target ${family_targets})
|
|
||||||
add_dependencies(${target} chipdb-himbaechel-xilinx)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(HIMBAECHEL_XILINX_DEVICES "" CACHE STRING
|
set(HIMBAECHEL_XILINX_DEVICES "" CACHE STRING
|
||||||
"Include support for these Xilinx devices")
|
"Include support for these Xilinx devices")
|
||||||
message(STATUS "Enabled Himbaechel-Xilinx devices: ${HIMBAECHEL_XILINX_DEVICES}")
|
message(STATUS "Enabled Himbaechel-Xilinx devices: ${HIMBAECHEL_XILINX_DEVICES}")
|
||||||
@ -27,14 +46,9 @@ foreach (device ${HIMBAECHEL_XILINX_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-himbaechel-xilinx
|
TARGET nextpnr-himbaechel-xilinx-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/himbaechel/xilinx/chipdb-${device}.bin
|
OUTPUT himbaechel/xilinx/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
MODE binary
|
MODE binary
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
install(
|
|
||||||
DIRECTORY ${CMAKE_BINARY_DIR}/share/himbaechel/xilinx
|
|
||||||
DESTINATION share/nextpnr/himbaechel/xilinx
|
|
||||||
)
|
|
||||||
|
@ -1,12 +1,42 @@
|
|||||||
include(FindIceStorm)
|
include(FindIceStorm)
|
||||||
|
|
||||||
add_library(chipdb-${family} OBJECT)
|
set(SOURCES
|
||||||
target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
|
arch.cc
|
||||||
target_include_directories(chipdb-${family} PRIVATE .)
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_place.cc
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
bitstream.cc
|
||||||
|
bitstream.h
|
||||||
|
cells.cc
|
||||||
|
cells.h
|
||||||
|
chains.cc
|
||||||
|
chains.h
|
||||||
|
constids.inc
|
||||||
|
delay.cc
|
||||||
|
gfx.cc
|
||||||
|
gfx.h
|
||||||
|
pack.cc
|
||||||
|
pcf.cc
|
||||||
|
pcf.h
|
||||||
|
)
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
set(TEST_SOURCES
|
||||||
target_link_libraries(${family_target} PRIVATE chipdb-${family})
|
tests/hx1k.cc
|
||||||
endforeach()
|
tests/hx8k.cc
|
||||||
|
tests/lp1k.cc
|
||||||
|
tests/lp384.cc
|
||||||
|
tests/lp8k.cc
|
||||||
|
tests/main.cc
|
||||||
|
tests/up5k.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_architecture(${family}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
TEST_SOURCES ${TEST_SOURCES}
|
||||||
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
set(ALL_ICE40_DEVICES 384 1k 5k u4k 8k)
|
set(ALL_ICE40_DEVICES 384 1k 5k u4k 8k)
|
||||||
set(ICE40_DEVICES ${ALL_ICE40_DEVICES} CACHE STRING
|
set(ICE40_DEVICES ${ALL_ICE40_DEVICES} CACHE STRING
|
||||||
@ -50,10 +80,9 @@ foreach (device ${ICE40_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-${family}
|
TARGET nextpnr-${family}-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/${family}/chipdb-${device}.bin
|
OUTPUT ${family}/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
IDENT ${family}/chipdb-${device}.bin
|
|
||||||
MODE ${BBASM_MODE}
|
MODE ${BBASM_MODE}
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "bitstream.h"
|
#include "bitstream.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
@ -280,5 +278,3 @@ int main(int argc, char *argv[])
|
|||||||
Ice40CommandHandler handler(argc, argv);
|
Ice40CommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
106
ice40/tests/hx1k.cc
Normal file
106
ice40/tests/hx1k.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class HX1KTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::HX1K;
|
||||||
|
chipArgs.package = "tq144";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(HX1KTest, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 1418);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX1KTest, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 32802);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX1KTest, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 345504);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX1KTest, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX1KTest, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
106
ice40/tests/hx8k.cc
Normal file
106
ice40/tests/hx8k.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class HX8KTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::HX8K;
|
||||||
|
chipArgs.package = "ct256";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(HX8KTest, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 7979);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX8KTest, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 165894);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX8KTest, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 1806080);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX8KTest, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(HX8KTest, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
106
ice40/tests/lp1k.cc
Normal file
106
ice40/tests/lp1k.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class LP1KTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::LP1K;
|
||||||
|
chipArgs.package = "tq144";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LP1KTest, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 1418);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP1KTest, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 32802);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP1KTest, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 345504);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP1KTest, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP1KTest, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
106
ice40/tests/lp384.cc
Normal file
106
ice40/tests/lp384.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class LP384Test : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::LP384;
|
||||||
|
chipArgs.package = "qn32";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LP384Test, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 449);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP384Test, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 9830);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP384Test, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 94544);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP384Test, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP384Test, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
106
ice40/tests/lp8k.cc
Normal file
106
ice40/tests/lp8k.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class LP8KTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::LP8K;
|
||||||
|
chipArgs.package = "ct256";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LP8KTest, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 7979);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP8KTest, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 165894);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP8KTest, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 1806080);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP8KTest, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LP8KTest, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
ice40/tests/main.cc
Normal file
27
ice40/tests/main.cc
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
::testing::InitGoogleTest(&argc, argv);
|
||||||
|
return RUN_ALL_TESTS();
|
||||||
|
}
|
106
ice40/tests/up5k.cc
Normal file
106
ice40/tests/up5k.cc
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* nextpnr -- Next Generation Place and Route
|
||||||
|
*
|
||||||
|
* Copyright (C) 2018 Claire Xenia Wolf <claire@yosyshq.com>
|
||||||
|
* Copyright (C) 2018 Miodrag Milanovic <micko@yosyshq.com>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
#include "nextpnr.h"
|
||||||
|
|
||||||
|
USING_NEXTPNR_NAMESPACE
|
||||||
|
|
||||||
|
class UP5KTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual void SetUp()
|
||||||
|
{
|
||||||
|
chipArgs.type = ArchArgs::UP5K;
|
||||||
|
chipArgs.package = "sg48";
|
||||||
|
ctx = new Context(chipArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void TearDown() { delete ctx; }
|
||||||
|
|
||||||
|
ArchArgs chipArgs;
|
||||||
|
Context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(UP5KTest, bel_names)
|
||||||
|
{
|
||||||
|
int bel_count = 0;
|
||||||
|
for (auto bel : ctx->getBels()) {
|
||||||
|
auto name = ctx->getBelName(bel);
|
||||||
|
ASSERT_EQ(bel, ctx->getBelByName(name));
|
||||||
|
bel_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(bel_count, 5438);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UP5KTest, wire_names)
|
||||||
|
{
|
||||||
|
int wire_count = 0;
|
||||||
|
for (auto wire : ctx->getWires()) {
|
||||||
|
auto name = ctx->getWireName(wire);
|
||||||
|
assert(wire == ctx->getWireByName(name));
|
||||||
|
wire_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(wire_count, 124523);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UP5KTest, pip_names)
|
||||||
|
{
|
||||||
|
int pip_count = 0;
|
||||||
|
for (auto pip : ctx->getPips()) {
|
||||||
|
auto name = ctx->getPipName(pip);
|
||||||
|
assert(pip == ctx->getPipByName(name));
|
||||||
|
pip_count++;
|
||||||
|
}
|
||||||
|
ASSERT_EQ(pip_count, 1324704);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UP5KTest, uphill_to_downhill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(dst)) {
|
||||||
|
bool found_downhill = false;
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(ctx->getPipSrcWire(uphill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_downhill);
|
||||||
|
found_downhill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_downhill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UP5KTest, downhill_to_uphill)
|
||||||
|
{
|
||||||
|
for (auto dst : ctx->getWires()) {
|
||||||
|
for (auto downhill_pip : ctx->getPipsDownhill(dst)) {
|
||||||
|
bool found_uphill = false;
|
||||||
|
for (auto uphill_pip : ctx->getPipsUphill(ctx->getPipDstWire(downhill_pip))) {
|
||||||
|
if (uphill_pip == downhill_pip) {
|
||||||
|
ASSERT_FALSE(found_uphill);
|
||||||
|
found_uphill = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(found_uphill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ add_library(nextpnr_json INTERFACE)
|
|||||||
|
|
||||||
target_include_directories(nextpnr_json INTERFACE .)
|
target_include_directories(nextpnr_json INTERFACE .)
|
||||||
|
|
||||||
target_sources(nextpnr_json PUBLIC
|
target_sources(nextpnr_json INTERFACE
|
||||||
jsonwrite.cc
|
jsonwrite.cc
|
||||||
jsonwrite.h
|
jsonwrite.h
|
||||||
)
|
)
|
||||||
|
@ -1,12 +1,31 @@
|
|||||||
include(FindTrellis)
|
include(FindTrellis)
|
||||||
|
|
||||||
add_library(chipdb-${family} OBJECT)
|
set(SOURCES
|
||||||
target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
|
arch.cc
|
||||||
target_include_directories(chipdb-${family} PRIVATE .)
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_place.cc
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
baseconfigs.cc
|
||||||
|
bitstream.cc
|
||||||
|
bitstream.h
|
||||||
|
cells.cc
|
||||||
|
cells.h
|
||||||
|
config.cc
|
||||||
|
config.h
|
||||||
|
constids.inc
|
||||||
|
gfx.cc
|
||||||
|
gfx.h
|
||||||
|
globals.cc
|
||||||
|
lpf.cc
|
||||||
|
pack.cc
|
||||||
|
)
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
add_nextpnr_architecture(${family}
|
||||||
target_link_libraries(${family_target} PRIVATE chipdb-${family})
|
CORE_SOURCES ${SOURCES}
|
||||||
endforeach()
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
# Note that the four *X (MachXO) devices fail to import with prjtrellis commit 14ac883fa.
|
# Note that the four *X (MachXO) devices fail to import with prjtrellis commit 14ac883fa.
|
||||||
set(ALL_MACHXO2_DEVICES 256X 640X 1200X 2280X 256 640 1200 2000 4000 7000 1300 2100 4300 6900 9400 4300D 9400D)
|
set(ALL_MACHXO2_DEVICES 256X 640X 1200X 2280X 256 640 1200 2000 4000 7000 1300 2100 4300 6900 9400 4300D 9400D)
|
||||||
@ -14,9 +33,9 @@ set(MACHXO2_DEVICES 1200 6900 CACHE STRING
|
|||||||
"Include support for these MachXO2/XO3 devices (available: ${ALL_MACHXO2_DEVICES})")
|
"Include support for these MachXO2/XO3 devices (available: ${ALL_MACHXO2_DEVICES})")
|
||||||
message(STATUS "Enabled MachXO2/XO3 devices: ${MACHXO2_DEVICES}")
|
message(STATUS "Enabled MachXO2/XO3 devices: ${MACHXO2_DEVICES}")
|
||||||
|
|
||||||
configure_file(machxo2_available.h.in ${CMAKE_CURRENT_BINARY_DIR}/generated/machxo2_available.h)
|
configure_file(machxo2_available.h.in ${CMAKE_CURRENT_BINARY_DIR}/machxo2_available.h)
|
||||||
target_sources(chipdb-${family} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/generated/machxo2_available.h)
|
target_sources(nextpnr-${family}-core PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/machxo2_available.h)
|
||||||
target_include_directories(chipdb-${family} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/generated)
|
target_include_directories(nextpnr-${family}-core INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
foreach (device ${MACHXO2_DEVICES})
|
foreach (device ${MACHXO2_DEVICES})
|
||||||
if (NOT device IN_LIST ALL_MACHXO2_DEVICES)
|
if (NOT device IN_LIST ALL_MACHXO2_DEVICES)
|
||||||
@ -42,10 +61,9 @@ foreach (device ${MACHXO2_DEVICES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-${family}
|
TARGET nextpnr-${family}-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/${family}/chipdb-${device}.bin
|
OUTPUT ${family}/chipdb-${device}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${device}.bba
|
||||||
IDENT ${family}/chipdb-${device}.bin
|
|
||||||
MODE ${BBASM_MODE}
|
MODE ${BBASM_MODE}
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "bitstream.h"
|
#include "bitstream.h"
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
@ -121,5 +119,3 @@ int main(int argc, char *argv[])
|
|||||||
MachXO2CommandHandler handler(argc, argv);
|
MachXO2CommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,3 +1,27 @@
|
|||||||
|
set(SOURCES
|
||||||
|
arch.cc
|
||||||
|
archdefs.cc
|
||||||
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
bitstream.cc
|
||||||
|
constids.inc
|
||||||
|
delay.cc
|
||||||
|
globals.cc
|
||||||
|
io.cc
|
||||||
|
lab.cc
|
||||||
|
m10k.cc
|
||||||
|
pack.cc
|
||||||
|
pins.cc
|
||||||
|
qsf.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_architecture(${family}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
set(MISTRAL_ROOT "" CACHE STRING "Mistral install path")
|
set(MISTRAL_ROOT "" CACHE STRING "Mistral install path")
|
||||||
set(MISTRAL_DONT_INSTALL ON)
|
set(MISTRAL_DONT_INSTALL ON)
|
||||||
|
|
||||||
@ -7,7 +31,14 @@ add_subdirectory(${MISTRAL_ROOT}/libmistral ${CMAKE_CURRENT_BINARY_DIR}/libmistr
|
|||||||
|
|
||||||
find_package(LibLZMA REQUIRED)
|
find_package(LibLZMA REQUIRED)
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
target_include_directories(nextpnr-${family}-core INTERFACE
|
||||||
target_include_directories(${family_target} PRIVATE ${MISTRAL_ROOT}/libmistral ${CMAKE_CURRENT_BINARY_DIR}/tools ${CMAKE_CURRENT_BINARY_DIR}/libmistral ${LIBLZMA_INCLUDE_DIRS})
|
${MISTRAL_ROOT}/libmistral
|
||||||
target_link_libraries(${family_target} PRIVATE mistral ${LIBLZMA_LIBRARIES})
|
${CMAKE_CURRENT_BINARY_DIR}/tools
|
||||||
endforeach()
|
${CMAKE_CURRENT_BINARY_DIR}/libmistral
|
||||||
|
${LIBLZMA_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(nextpnr-${family}-core INTERFACE
|
||||||
|
mistral
|
||||||
|
${LIBLZMA_LIBRARIES}
|
||||||
|
)
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "design_utils.h"
|
#include "design_utils.h"
|
||||||
@ -99,5 +97,3 @@ int main(int argc, char *argv[])
|
|||||||
MistralCommandHandler handler(argc, argv);
|
MistralCommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -1,19 +1,34 @@
|
|||||||
include(FindOxide)
|
include(FindOxide)
|
||||||
|
|
||||||
|
set(SOURCES
|
||||||
|
arch.cc
|
||||||
|
archdefs.h
|
||||||
|
arch.h
|
||||||
|
arch_place.cc
|
||||||
|
arch_pybindings.cc
|
||||||
|
arch_pybindings.h
|
||||||
|
bba_version.inc
|
||||||
|
constids.inc
|
||||||
|
fasm.cc
|
||||||
|
global.cc
|
||||||
|
io.cc
|
||||||
|
pack.cc
|
||||||
|
pdc.cc
|
||||||
|
pins.cc
|
||||||
|
post_place.cc
|
||||||
|
)
|
||||||
|
|
||||||
|
add_nextpnr_architecture(${family}
|
||||||
|
CORE_SOURCES ${SOURCES}
|
||||||
|
MAIN_SOURCE main.cc
|
||||||
|
)
|
||||||
|
|
||||||
# NOTE: Unlike iCE40 and ECP5; one database can cover all densities of a given family
|
# NOTE: Unlike iCE40 and ECP5; one database can cover all densities of a given family
|
||||||
set(ALL_NEXUS_FAMILIES LIFCL)
|
set(ALL_NEXUS_FAMILIES LIFCL)
|
||||||
set(NEXUS_FAMILIES ${ALL_NEXUS_FAMILIES} CACHE STRING
|
set(NEXUS_FAMILIES ${ALL_NEXUS_FAMILIES} CACHE STRING
|
||||||
"Include support for these Nexus families (available: ${ALL_NEXUS_FAMILIES})")
|
"Include support for these Nexus families (available: ${ALL_NEXUS_FAMILIES})")
|
||||||
message(STATUS "Enabled Nexus families: ${NEXUS_FAMILIES}")
|
message(STATUS "Enabled Nexus families: ${NEXUS_FAMILIES}")
|
||||||
|
|
||||||
add_library(chipdb-${family} OBJECT)
|
|
||||||
target_compile_definitions(chipdb-${family} PRIVATE NEXTPNR_NAMESPACE=nextpnr_${family})
|
|
||||||
target_include_directories(chipdb-${family} PRIVATE .)
|
|
||||||
|
|
||||||
foreach (family_target ${family_targets})
|
|
||||||
target_link_libraries(${family_target} PRIVATE chipdb-${family})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
foreach (subfamily ${NEXUS_FAMILIES})
|
foreach (subfamily ${NEXUS_FAMILIES})
|
||||||
if (NOT subfamily IN_LIST ALL_NEXUS_FAMILIES)
|
if (NOT subfamily IN_LIST ALL_NEXUS_FAMILIES)
|
||||||
message(FATAL_ERROR "${subfamily} is not a supported Nexus family")
|
message(FATAL_ERROR "${subfamily} is not a supported Nexus family")
|
||||||
@ -32,10 +47,9 @@ foreach (subfamily ${NEXUS_FAMILIES})
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_bba_compile_command(
|
add_bba_compile_command(
|
||||||
TARGET chipdb-${family}
|
TARGET nextpnr-${family}-chipdb
|
||||||
OUTPUT ${CMAKE_BINARY_DIR}/share/${family}/chipdb-${subfamily}.bin
|
OUTPUT ${family}/chipdb-${subfamily}.bin
|
||||||
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${subfamily}.bba
|
INPUT ${CMAKE_CURRENT_BINARY_DIR}/chipdb-${subfamily}.bba
|
||||||
IDENT ${family}/chipdb-${subfamily}.bin
|
|
||||||
MODE ${BBASM_MODE}
|
MODE ${BBASM_MODE}
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MAIN_EXECUTABLE
|
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include "command.h"
|
#include "command.h"
|
||||||
#include "design_utils.h"
|
#include "design_utils.h"
|
||||||
@ -115,5 +113,3 @@ int main(int argc, char *argv[])
|
|||||||
NexusCommandHandler handler(argc, argv);
|
NexusCommandHandler handler(argc, argv);
|
||||||
return handler.exec();
|
return handler.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@ -2,9 +2,7 @@ add_library(nextpnr_rust INTERFACE)
|
|||||||
|
|
||||||
target_include_directories(nextpnr_rust INTERFACE .)
|
target_include_directories(nextpnr_rust INTERFACE .)
|
||||||
|
|
||||||
if (USE_RUST)
|
target_sources(nextpnr_rust INTERFACE rust.h)
|
||||||
target_sources(nextpnr_rust PUBLIC
|
if (BUILD_RUST)
|
||||||
rust.cc
|
target_sources(nextpnr_rust INTERFACE rust.cc)
|
||||||
rust.h
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#ifndef RUST_H
|
#ifndef RUST_H
|
||||||
#define RUST_H
|
#define RUST_H
|
||||||
|
|
||||||
#ifdef USE_RUST
|
#ifndef NO_RUST
|
||||||
|
|
||||||
#include "nextpnr.h"
|
#include "nextpnr.h"
|
||||||
NEXTPNR_NAMESPACE_BEGIN
|
NEXTPNR_NAMESPACE_BEGIN
|
||||||
|
2
tests
2
tests
@ -1 +1 @@
|
|||||||
Subproject commit d2d5b69dd34b1a9a1e4e9466599ed18e9254fee9
|
Subproject commit ce154121819a04ec921a4a6f6850c28f33c81b6c
|
Loading…
Reference in New Issue
Block a user