Merge remote-tracking branch 'origin/master' into facade
diff --git a/.github/archlinux/PKGBUILD b/.github/archlinux/PKGBUILD new file mode 100644 index 0000000..d55c6f0 --- /dev/null +++ b/.github/archlinux/PKGBUILD
@@ -0,0 +1,61 @@ +# Maintainer: Filipe Laíns (FFY00) <lains@archlinux.org> + +_prj=trellis +_pkgname=prj$_prj +pkgname=$_pkgname-git +_commit=%COMMIT% +pkgver=dummy +pkgrel=1 +pkgdesc='Documentation and definitions for the Lattice ECP5 bit-stream format' +arch=('x86_64') +url='https://github.com/SymbiFlow/prjtrellis' +license=('custom:ISC' 'MIT') +depends=('boost-libs' "$_pkgname-db") +makedepends=('git' 'cmake' 'boost' 'python-sphinx' 'python-sphinx_rtd_theme' 'python-recommonmark') +optdepends=('python: Python support') +provides=("$_pkgname") +conflicts=("$_pkgname") +source=("git+$url.git#commit=$_commit") +sha512sums=('SKIP') + +pkgver() { + cd $_pkgname + + printf "%s.r%s.%s" \ + $(git tag | tail -n1) \ + $(git rev-list --count HEAD) \ + $(git rev-parse --short HEAD) +} + +build() { + mkdir $_pkgname/libtrellis/build + cd $_pkgname/libtrellis/build + + cmake .. \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=/usr/lib \ + -DCMAKE_BUILD_TYPE=Release + + make + +# cd ../../docs +# +# make html +} + +package() { + cd $_pkgname + +# install -dm 755 "$pkgdir"/usr/share/doc/$pkgname +# cp -r --no-preserve=ownership docs/_build/* "$pkgdir"/usr/share/doc/$pkgname/ + + install -Dm 644 COPYING "$pkgdir"/usr/share/licenses/$pkgname/LICENSE + + cd libtrellis/build + + make DESTDIR="$pkgdir" install + + # The database is provided in a separate package + rmdir "$pkgdir"/usr/share/$_prj/database +} +
diff --git a/.github/workflows/arch-pkg.yml b/.github/workflows/arch-pkg.yml new file mode 100644 index 0000000..5b24d8b --- /dev/null +++ b/.github/workflows/arch-pkg.yml
@@ -0,0 +1,19 @@ +name: arch-pkg +on: [push, pull_request] + +jobs: + arch-pkg: + runs-on: ubuntu-latest + container: + image: archlinux + options: --privileged + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup + steps: + - uses: actions/checkout@v2 + - name: Build Arch Linux package + uses: FFY00/build-arch-package@master + with: + PKGBUILD: $GITHUB_WORKSPACE/.github/archlinux/PKGBUILD + +
diff --git a/database b/database index e9b5acf..13da868 160000 --- a/database +++ b/database
@@ -1 +1 @@ -Subproject commit e9b5acfd93be17beed595b1ddfa689ccdf4f91a2 +Subproject commit 13da86838ba39f882a81a9fabe030b4c653854c9
diff --git a/devices.json b/devices.json index 4d79d6e..68df05f 100644 --- a/devices.json +++ b/devices.json
@@ -2,6 +2,18 @@ "families": { "ECP5": { "devices": { + "LFE5U-12F": { + "packages": ["csfBGA285", "caBGA256", "caBGA381", "caBGA554", "caBGA756"], + "idcode": "0x21111043", + "frames": 7562, + "bits_per_frame": 592, + "pad_bits_after_frame": 0, + "pad_bits_before_frame": 0, + "max_row" : 50, + "max_col" : 72, + "col_bias" : 0, + "fuzz": 1 + }, "LFE5U-25F": { "packages": ["csfBGA285", "caBGA256", "caBGA381", "caBGA554", "caBGA756"], "idcode": "0x41111043",
diff --git a/libtrellis/CMakeLists.txt b/libtrellis/CMakeLists.txt index 10fd498..c519daf 100644 --- a/libtrellis/CMakeLists.txt +++ b/libtrellis/CMakeLists.txt
@@ -5,6 +5,8 @@ option(BUILD_SHARED "Build shared Trellis library" ON) option(STATIC_BUILD "Create static build of Trellis tools" OFF) +set(PROGRAM_PREFIX "" CACHE STRING "Name prefix for executables") + set(CMAKE_CXX_STANDARD 14) if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -bigobj -EHsc") @@ -116,12 +118,12 @@ if(APPLE) set_target_properties(${name} PROPERTIES BUILD_WITH_INSTALL_RPATH ON - INSTALL_RPATH "@loader_path/${TRELLIS_RPATH_LIBDIR}/trellis" + INSTALL_RPATH "@loader_path/${TRELLIS_RPATH_LIBDIR}/${PROGRAM_PREFIX}trellis" INSTALL_NAME_DIR "@rpath") elseif(UNIX) set_target_properties(${name} PROPERTIES BUILD_WITH_INSTALL_RPATH ON - INSTALL_RPATH "\$ORIGIN/${TRELLIS_RPATH_LIBDIR}/trellis") + INSTALL_RPATH "\$ORIGIN/${TRELLIS_RPATH_LIBDIR}/${PROGRAM_PREFIX}trellis") endif() endfunction() @@ -144,45 +146,45 @@ endif() file(WRITE "${CMAKE_BINARY_DIR}/generated/last_git_version" CURRENT_GIT_VERSION) -add_executable(ecpbram ${INCLUDE_FILES} tools/ecpbram.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") -target_include_directories(ecpbram PRIVATE tools) -target_compile_definitions(ecpbram PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}") -target_link_libraries(ecpbram trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) -setup_rpath(ecpbram) +add_executable(${PROGRAM_PREFIX}ecpbram ${INCLUDE_FILES} tools/ecpbram.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") +target_include_directories(${PROGRAM_PREFIX}ecpbram PRIVATE tools) +target_compile_definitions(${PROGRAM_PREFIX}ecpbram PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}") +target_link_libraries(${PROGRAM_PREFIX}ecpbram trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) +setup_rpath(${PROGRAM_PREFIX}ecpbram) -add_executable(ecppack ${INCLUDE_FILES} tools/ecppack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") -target_include_directories(ecppack PRIVATE tools) -target_compile_definitions(ecppack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}") -target_link_libraries(ecppack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) -setup_rpath(ecppack) +add_executable(${PROGRAM_PREFIX}ecppack ${INCLUDE_FILES} tools/ecppack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") +target_include_directories(${PROGRAM_PREFIX}ecppack PRIVATE tools) +target_compile_definitions(${PROGRAM_PREFIX}ecppack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}") +target_link_libraries(${PROGRAM_PREFIX}ecppack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) +setup_rpath(${PROGRAM_PREFIX}ecppack) -add_executable(ecpunpack ${INCLUDE_FILES} tools/ecpunpack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") -target_include_directories(ecpunpack PRIVATE tools) -target_compile_definitions(ecpunpack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}") -target_link_libraries(ecpunpack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) -setup_rpath(ecpunpack) +add_executable(${PROGRAM_PREFIX}ecpunpack ${INCLUDE_FILES} tools/ecpunpack.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") +target_include_directories(${PROGRAM_PREFIX}ecpunpack PRIVATE tools) +target_compile_definitions(${PROGRAM_PREFIX}ecpunpack PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}") +target_link_libraries(${PROGRAM_PREFIX}ecpunpack trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) +setup_rpath(${PROGRAM_PREFIX}ecpunpack) -add_executable(ecppll ${INCLUDE_FILES} tools/ecppll.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") -target_include_directories(ecppll PRIVATE tools) -target_compile_definitions(ecppll PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}") -target_link_libraries(ecppll trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) -setup_rpath(ecppll) +add_executable(${PROGRAM_PREFIX}ecppll ${INCLUDE_FILES} tools/ecppll.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") +target_include_directories(${PROGRAM_PREFIX}ecppll PRIVATE tools) +target_compile_definitions(${PROGRAM_PREFIX}ecppll PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}") +target_link_libraries(${PROGRAM_PREFIX}ecppll trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) +setup_rpath(${PROGRAM_PREFIX}ecppll) -add_executable(ecpmulti ${INCLUDE_FILES} tools/ecpmulti.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") -target_include_directories(ecpmulti PRIVATE tools) -target_compile_definitions(ecpmulti PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}") -target_link_libraries(ecpmulti trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) -setup_rpath(ecpmulti) +add_executable(${PROGRAM_PREFIX}ecpmulti ${INCLUDE_FILES} tools/ecpmulti.cpp "${CMAKE_BINARY_DIR}/generated/version.cpp") +target_include_directories(${PROGRAM_PREFIX}ecpmulti PRIVATE tools) +target_compile_definitions(${PROGRAM_PREFIX}ecpmulti PRIVATE TRELLIS_RPATH_DATADIR="${TRELLIS_RPATH_DATADIR}" TRELLIS_PREFIX="${CMAKE_INSTALL_PREFIX}" TRELLIS_PROGRAM_PREFIX="${PROGRAM_PREFIX}") +target_link_libraries(${PROGRAM_PREFIX}ecpmulti trellis ${Boost_LIBRARIES} ${CMAKE_DL_LIBS} ${link_param}) +setup_rpath(${PROGRAM_PREFIX}ecpmulti) if (BUILD_SHARED) - install(TARGETS trellis ecpbram ecppack ecppll ecpunpack ecpmulti ${PythonInstallTarget} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/trellis + install(TARGETS trellis ${PROGRAM_PREFIX}ecpbram ${PROGRAM_PREFIX}ecppack ${PROGRAM_PREFIX}ecppll ${PROGRAM_PREFIX}ecpunpack ${PROGRAM_PREFIX}ecpmulti ${PythonInstallTarget} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROGRAM_PREFIX}trellis RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) else() - install(TARGETS ecpbram ecppack ecpunpack ecppll ecpmulti + install(TARGETS ${PROGRAM_PREFIX}ecpbram ${PROGRAM_PREFIX}ecppack ${PROGRAM_PREFIX}ecpunpack ${PROGRAM_PREFIX}ecppll ${PROGRAM_PREFIX}ecpmulti RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) endif() -install(DIRECTORY ../database DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis PATTERN ".git" EXCLUDE) -install(DIRECTORY ../misc DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis) -install(DIRECTORY ../util/common DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis/util) -install(DIRECTORY ../timing/util DESTINATION ${CMAKE_INSTALL_DATADIR}/trellis/timing USE_SOURCE_PERMISSIONS) +install(DIRECTORY ../database DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis PATTERN ".git" EXCLUDE) +install(DIRECTORY ../misc DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis) +install(DIRECTORY ../util/common DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis/util) +install(DIRECTORY ../timing/util DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROGRAM_PREFIX}trellis/timing USE_SOURCE_PERMISSIONS)
diff --git a/libtrellis/include/DatabasePath.hpp b/libtrellis/include/DatabasePath.hpp index 4063802..cab8a29 100644 --- a/libtrellis/include/DatabasePath.hpp +++ b/libtrellis/include/DatabasePath.hpp
@@ -11,7 +11,7 @@ std::string get_database_path() { boost::filesystem::path executable_path = boost::dll::program_location().parent_path(); - boost::filesystem::path database_datadir_relative(TRELLIS_RPATH_DATADIR "/trellis/database"); + boost::filesystem::path database_datadir_relative(TRELLIS_RPATH_DATADIR "/" TRELLIS_PROGRAM_PREFIX "trellis/database"); std::string database_folder = (executable_path /= database_datadir_relative).string(); return database_folder; }
diff --git a/libtrellis/tools/ecpbram.cpp b/libtrellis/tools/ecpbram.cpp index 4c872fb..a1bc205 100644 --- a/libtrellis/tools/ecpbram.cpp +++ b/libtrellis/tools/ecpbram.cpp
@@ -69,10 +69,11 @@ hexfile.back().at(i) = true; } -void parse_hexfile_line(const char *filename, int linenr, vector<vector<bool>> &hexfile, string &line) +void parse_hexfile_line(const char *filename, int linenr, vector<vector<bool>> &hexfile, string &line, int &address) { vector<int> digits; - + bool reading_address = false; + for (char c : line) { if ('0' <= c && c <= '9') digits.push_back(c - '0'); @@ -85,9 +86,29 @@ digits.push_back(0); else if ('_' == c) ; - else if (' ' == c || '\t' == c || '\r' == c) { - push_back_bitvector(hexfile, digits); - digits.clear(); + else if ('@' == c) { + if (reading_address || !digits.empty()) + goto error; + else + reading_address = true; + } else if (' ' == c || '\t' == c || '\r' == c) { + if (reading_address) { + int file_address = 0; + for (int i = 0; i < int(digits.size()); i++ ) { + file_address <<= 4; + file_address |= digits.at(i); + } + if (file_address != address) { + fprintf(stderr, "Non-contiguous address (expected @%X) at line %d of %s: %s\n", address, linenr, filename, line.c_str()); + exit(1); + } + } else { + push_back_bitvector(hexfile, digits); + if( !digits.empty() ) + address++; + } + digits.clear(); + reading_address = false; } else goto error; } @@ -146,7 +167,7 @@ if (vm.count("help")) { help: cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl; - cerr << "ecpbram: ECP5 BRAM content initialization tool" << endl; + cerr << argv[0] << ": ECP5 BRAM content initialization tool" << endl; cerr << endl; cerr << "Copyright (C) 2019 Sylvain Munaut <tnt@246tNt.com>" << endl; cerr << "Copyright (C) 2016 Clifford Wolf <clifford@clifford.at>" << endl; @@ -243,12 +264,12 @@ vector<vector<bool>> to_hexfile; string line; + + for (int i = 1, address = 0; getline(from_hexfile_f, line); i++) + parse_hexfile_line(from_hexfile_n, i, from_hexfile, line, address); - for (int i = 1; getline(from_hexfile_f, line); i++) - parse_hexfile_line(from_hexfile_n, i, from_hexfile, line); - - for (int i = 1; getline(to_hexfile_f, line); i++) - parse_hexfile_line(to_hexfile_n, i, to_hexfile, line); + for (int i = 1, address = 0; getline(to_hexfile_f, line); i++) + parse_hexfile_line(to_hexfile_n, i, to_hexfile, line, address); if (to_hexfile.size() > 0 && from_hexfile.size() > to_hexfile.size()) { if (verbose)
diff --git a/libtrellis/tools/ecpmulti.cpp b/libtrellis/tools/ecpmulti.cpp index 16d6675..83232e1 100644 --- a/libtrellis/tools/ecpmulti.cpp +++ b/libtrellis/tools/ecpmulti.cpp
@@ -82,7 +82,7 @@ help: cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl; cerr << "Version " << git_describe_str << endl; - cerr << "ecpmulti: ECP5 multiboot bitstream assembler" << endl; + cerr << argv[0] << ": ECP5 multiboot bitstream assembler" << endl; cerr << endl; cerr << "Copyright (C) 2019 Jens Andersen <jens.andersen@gmail.com>" << endl; cerr << endl;
diff --git a/libtrellis/tools/ecppack.cpp b/libtrellis/tools/ecppack.cpp index f060468..d6aea40 100644 --- a/libtrellis/tools/ecppack.cpp +++ b/libtrellis/tools/ecppack.cpp
@@ -75,11 +75,11 @@ help: cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl; cerr << "Version " << git_describe_str << endl; - cerr << "ecppack: ECP5 bitstream packer" << endl; + cerr << argv[0] << ": ECP5 bitstream packer" << endl; cerr << endl; cerr << "Copyright (C) 2018 David Shah <david@symbioticeda.com>" << endl; cerr << endl; - cerr << "Usage: ecppack input.config [output.bit] [options]" << endl; + cerr << "Usage: " << argv[0] << " input.config [output.bit] [options]" << endl; cerr << options << endl; return vm.count("help") ? 0 : 1; }
diff --git a/libtrellis/tools/ecppll.cpp b/libtrellis/tools/ecppll.cpp index f7b01d3..13e6b26 100644 --- a/libtrellis/tools/ecppll.cpp +++ b/libtrellis/tools/ecppll.cpp
@@ -124,7 +124,7 @@ if(vm.count("help")){ cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl; - cerr << "ecppll: ECP5 PLL Configuration Calculator" << endl; + cerr << argv[0] << ": ECP5 PLL Configuration Calculator" << endl; cerr << "Version " << git_describe_str << endl; cerr << endl; cerr << "This tool is experimental! Use at your own risk!" << endl;
diff --git a/libtrellis/tools/ecpunpack.cpp b/libtrellis/tools/ecpunpack.cpp index 77e2276..a5752a8 100644 --- a/libtrellis/tools/ecpunpack.cpp +++ b/libtrellis/tools/ecpunpack.cpp
@@ -51,11 +51,11 @@ help: cerr << "Project Trellis - Open Source Tools for ECP5 FPGAs" << endl; cerr << "Version " << git_describe_str << endl; - cerr << "ecpunpack: ECP5 bitstream to text config converter" << endl; + cerr << argv[0] << ": ECP5 bitstream to text config converter" << endl; cerr << endl; cerr << "Copyright (C) 2018 David Shah <david@symbioticeda.com>" << endl; cerr << endl; - cerr << "Usage: ecpunpack input.bit [output.config] [options]" << endl; + cerr << "Usage: " << argv[0] << " input.bit [output.config] [options]" << endl; cerr << options << endl; return vm.count("help") ? 0 : 1; }