diff --git a/.dockerignore b/.dockerignore index 2e0e43deb..d6bfe66a2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,20 @@ -# Ignore everything -* \ No newline at end of file +abc +ace2 +build +cmake +CMakeLists.txt +deploy_key.enc +docker +Dockerfile +docs +libopenfpga +libs +LICENSE +openfpga +openfpga_flow +openfpga.sh +README.md +run_local.bat +run_local.sh +vpr +yosys diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2a698695e..f4878b9eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,118 +21,52 @@ jobs: # Test the compilation compatibility linux_build: name: ${{ matrix.config.name }} - runs-on: ${{ matrix.config.os }} - + runs-on: ubuntu-18.04 + container: ghcr.io/lnis-uofu/openfpga-buildenv-${{ matrix.config.cc}} # Branch on different OS and settings strategy: fail-fast: false matrix: config: - - { - name: "Build Compatibility: GCC-5 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-gcc5-build.7z", - os: ubuntu-18.04, - cc: "gcc-5", cxx: "g++-5" - } - - - { - name: "Build Compatibility: GCC-6 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-gcc6-build.7z", - os: ubuntu-18.04, - cc: "gcc-6", cxx: "g++-6" - } - - - { - name: "Build Compatibility: GCC-7 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-gcc7-build.7z", - os: ubuntu-18.04, - cc: "gcc-7", cxx: "g++-7" - } - - - { - name: "Build Compatibility: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8" - } - - - { - name: "Build Compatibility: GCC-9 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-gcc9-build.7z", - os: ubuntu-18.04, - cc: "gcc-9", cxx: "g++-9" - } - - - { - name: "Build Compatibility: Clang-6 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-clang6-build.7z", - os: ubuntu-18.04, - cc: "clang-6.0", cxx: "clang++-6.0" - } - - - { - name: "Build Compatibility: Clang-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-ubuntu-18.04-clang8-build.7z", - os: ubuntu-18.04, - cc: "clang-8", cxx: "clang++-8" - } - - - { - name: "Basic Regression Tests: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-basic-tests-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8", - reg_script: "basic_reg_test.sh" - } - - - { - name: "FPGA-Verilog Regression Tests: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-fpga-verilog-tests-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8", - reg_script: "fpga_verilog_reg_test.sh" - } - - - { - name: "FPGA-Bitstream Regression Tests: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-fpga-bitstream-tests-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8", - reg_script: "fpga_bitstream_reg_test.sh" - } - - - { - name: "FPGA-SDC Regression Tests: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-fpga-sdc-tests-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8", - reg_script: "fpga_sdc_reg_test.sh" - } - - - { - name: "FPGA-SPICE Regression Tests: GCC-8 (Ubuntu 18.04)", - artifact: "OpenFPGA-fpga-spice-tests-ubuntu-18.04-gcc8-build.7z", - os: ubuntu-18.04, - cc: "gcc-8", cxx: "g++-8", - reg_script: "fpga_spice_reg_test.sh" - } - - + - name: "Build Compatibility: GCC-5 (Ubuntu 18.04)" + cc: gcc-5 + cxx: g++-5 + - name: "Build Compatibility: GCC-6 (Ubuntu 18.04)" + cc: gcc-6 + cxx: g++-6 + - name: "Build Compatibility: GCC-7 (Ubuntu 18.04)" + cc: gcc-7 + cxx: g++-7 + - name: "Build Compatibility: GCC-8 (Ubuntu 18.04)" + cc: gcc-8 + cxx: g++-8 + - name: "Build Compatibility: GCC-9 (Ubuntu 18.04)" + cc: gcc-9 + cxx: g++-9 + - name: "Build Compatibility: Clang-6 (Ubuntu 18.04)" + cc: clang-6.0 + cxx: clang++-6.0 + - name: "Build Compatibility: Clang-8 (Ubuntu 18.04)" + cc: clang-8 + cxx: clang++-8 # Define the steps to run the build job + env: + CC: ${{ matrix.config.cc }} + CXX: ${{ matrix.config.cxx }} + CCACHE_COMPRESS: "true" + CCACHE_COMPRESSLEVEL: "6" + CCACHE_MAXSIZE: "400M" + CCACHE_LOGFILE: ccache_log + CCACHE_DIR: /__w/OpenFPGA/.ccache steps: - name: Checkout OpenFPGA repo uses: actions/checkout@v2 - - name: Install dependency - run: source ./.github/workflows/install_dependency.sh - - - name: Checkout CMake version - run: cmake --version - - - name: Checkout iVerilog version + - name: Dump tool versions run: | - iverilog -V - vvp -V + cmake --version + iverilog -V + vvp -V - name: Prepare ccache timestamp id: ccache_cache_timestamp @@ -144,58 +78,94 @@ jobs: - name: Create CMake build environment # Some projects don't allow in-source building, so create a separate build directory # We'll use this as our working directory for all subsequent commands - run: cmake -E make_directory ${{runner.workspace}}/build - - - name: ccache cache files + run: cmake -E make_directory build + + - name: Setup ccache uses: actions/cache@v2 with: - path: ${{runner.workspace}}/.ccache - key: ${{ matrix.config.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + path: | + /__w/OpenFPGA/.ccache + key: ${{ matrix.config.cc }}-ccache-${{ github.ref}} restore-keys: | - ${{ matrix.config.name }}-ccache- - - # Set up the paths for ccache and control the size under 400MB - - name: Configure ccache - shell: cmake -P {0} - run: | - file(TO_CMAKE_PATH ${{runner.workspace}} ccache_basedir) - set(ENV{CCACHE_BASEDIR} "${ccache_basedir}") - set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache") - set(ENV{CCACHE_COMPRESS} "true") - set(ENV{CCACHE_COMPRESSLEVEL} "6") - set(ENV{CCACHE_MAXSIZE} "400M") - - execute_process(COMMAND ccache -p) - execute_process(COMMAND ccache -z) + ${{ matrix.config.cc }}-ccache- - name: Configure CMake # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash - working-directory: ${{runner.workspace}}/build - # Note the current convention is to use the -S and -B options here to specify source - # and build directories, but this is only available with CMake 3.13 and higher. + working-directory: build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + # run: | - export CC=${{ matrix.config.cc }} - export CXX=${{ matrix.config.cxx }} - cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache + ccache -p + ccache -z + cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE - name: Build - working-directory: ${{runner.workspace}}/build + working-directory: build shell: bash # Execute the build. You can specify a specific target with "--target " run: | - cmake --build . --config $BUILD_TYPE + cmake --build . --config $BUILD_TYPE # Check the cache size and see if it is over the limit - name: Check ccache size - shell: cmake -P {0} - run: | - execute_process(COMMAND ccache -s) - - - name: ${{matrix.config.name}} - if: contains(matrix.config.name, 'Regression Test') + run: ccache -s + - name: Upload artifact + uses: actions/upload-artifact@v2 + if: ${{ matrix.config.cc == 'gcc-8'}} + with: + name: openfpga + path: | + abc/abc + abc/libabc.a + ace2/ace + ace2/libace.a + openfpga/libopenfpga.a + openfpga/openfpga + vpr/libvpr.a + vpr/vpr + yosys/share/ + yosys/yosys + yosys/yosys-abc + yosys/yosys-config + yosys/yosys-filterlib + yosys/yosys-smtbmc + regression_tests: + name: Regression tests + runs-on: ubuntu-18.04 + container: ghcr.io/lnis-uofu/openfpga-buildenv-test + needs: linux_build + defaults: + run: shell: bash - # Execute the test. - run: source ./.github/workflows/${{matrix.config.reg_script}} + steps: + - name: Checkout OpenFPGA repo + uses: actions/checkout@v2 + - name: Download a built artifacts + uses: actions/download-artifact@v2 + with: + name: openfpga + - name: chmod + run: | + chmod +x abc/abc + chmod +x ace2/ace + chmod +x openfpga/openfpga + chmod +x vpr/vpr + chmod +x yosys/yosys + chmod +x yosys/yosys-abc + chmod +x yosys/yosys-config + chmod +x yosys/yosys-filterlib + chmod +x yosys/yosys-smtbmc + - name: "Basic Regression Tests: GCC-8 (Ubuntu 18.04)" + run: source .github/workflows/basic_reg_test.sh + - name: "FPGA-Verilog Regression Tests: GCC-8 (Ubuntu 18.04)" + run: source .github/workflows/fpga_verilog_reg_test.sh + - name: "FPGA-Bitstream Regression Tests: GCC-8 (Ubuntu 18.04)" + run: source .github/workflows/fpga_bitstream_reg_test.sh + - name: "FPGA-SDC Regression Tests: GCC-8 (Ubuntu 18.04)" + run: source .github/workflows/fpga_sdc_reg_test.sh + - name: "FPGA-SPICE Regression Tests: GCC-8 (Ubuntu 18.04)" + run: source .github/workflows/fpga_spice_reg_test.sh diff --git a/.github/workflows/install_dependency.sh b/.github/workflows/install_dependency.sh deleted file mode 100644 index c4f70c29f..000000000 --- a/.github/workflows/install_dependency.sh +++ /dev/null @@ -1,51 +0,0 @@ -# Install all the dependency for OpenFPGA in Ubuntu-18.04 -sudo apt-get update -sudo apt-get install autoconf -sudo apt-get install automake -sudo apt-get install bash -sudo apt-get install bison -sudo apt-get install build-essential -sudo apt-get install cmake -sudo apt-get install ccache -sudo apt-get install ctags -sudo apt-get install curl -sudo apt-get install doxygen -sudo apt-get install flex -sudo apt-get install fontconfig -sudo apt-get install gdb -sudo apt-get install git -sudo apt-get install gperf -sudo apt-get install iverilog -sudo apt-get install libcairo2-dev -sudo apt-get install libevent-dev -sudo apt-get install libfontconfig1-dev -sudo apt-get install liblist-moreutils-perl -sudo apt-get install libncurses5-dev -sudo apt-get install libx11-dev -sudo apt-get install libxft-dev -sudo apt-get install libxml++2.6-dev -sudo apt-get install perl -sudo apt-get install python -sudo apt-get install python3-setuptools -sudo apt-get install python-lxml -sudo apt-get install texinfo -sudo apt-get install time -sudo apt-get install valgrind -sudo apt-get install zip -sudo apt-get install qt5-default -sudo apt-get install clang-format-7 -# Add all the supported compilers -sudo apt-get install g++-5 -sudo apt-get install gcc-5 -sudo apt-get install g++-6 -sudo apt-get install gcc-6 -sudo apt-get install g++-7 -sudo apt-get install gcc-7 -sudo apt-get install g++-8 -sudo apt-get install gcc-8 -sudo apt-get install g++-9 -sudo apt-get install gcc-9 -sudo apt-get install clang-6.0 -sudo apt-get install clang-8 -# Python dependencies -python3 -m pip install -r /home/runner/work/OpenFPGA/OpenFPGA/requirements.txt diff --git a/.gitignore b/.gitignore index 830a45dd3..4fdc97134 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ build/ message.txt deploy_key +openfpga/openfpga +vpr/vpr diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base new file mode 100755 index 000000000..10af574f9 --- /dev/null +++ b/docker/Dockerfile.base @@ -0,0 +1,42 @@ +FROM ubuntu:18.04 +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y \ + autoconf \ + automake \ + bison \ + ccache \ + cmake \ + ctags \ + curl \ + doxygen \ + flex \ + fontconfig \ + gdb \ + git \ + gperf \ + iverilog \ + libc6-dev \ + libcairo2-dev \ + libevent-dev \ + libffi-dev \ + libfontconfig1-dev \ + liblist-moreutils-perl \ + libncurses5-dev \ + libreadline-dev \ + libx11-dev \ + libxft-dev \ + libxml++2.6-dev \ + make \ + perl \ + pkg-config \ + python3 \ + python3-setuptools \ + python3-lxml \ + python3-pip \ + qt5-default \ + texinfo \ + time \ + valgrind \ + zip +ADD requirements.txt requirements.txt +RUN python3 -m pip install -r requirements.txt diff --git a/docker/Dockerfile.clang-6 b/docker/Dockerfile.clang-6 new file mode 100644 index 000000000..06d8de846 --- /dev/null +++ b/docker/Dockerfile.clang-6 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y clang-format-7 clang-6.0 diff --git a/docker/Dockerfile.clang-8 b/docker/Dockerfile.clang-8 new file mode 100644 index 000000000..af7bb08b8 --- /dev/null +++ b/docker/Dockerfile.clang-8 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y clang-format-7 clang-8 diff --git a/docker/Dockerfile.gcc-5 b/docker/Dockerfile.gcc-5 new file mode 100644 index 000000000..84790fd6c --- /dev/null +++ b/docker/Dockerfile.gcc-5 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y gcc-5 g++-5 diff --git a/docker/Dockerfile.gcc-6 b/docker/Dockerfile.gcc-6 new file mode 100644 index 000000000..3b8ae6894 --- /dev/null +++ b/docker/Dockerfile.gcc-6 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y gcc-6 g++-6 diff --git a/docker/Dockerfile.gcc-7 b/docker/Dockerfile.gcc-7 new file mode 100644 index 000000000..7c86b9857 --- /dev/null +++ b/docker/Dockerfile.gcc-7 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y gcc-7 g++-7 diff --git a/docker/Dockerfile.gcc-8 b/docker/Dockerfile.gcc-8 new file mode 100644 index 000000000..58ea8c928 --- /dev/null +++ b/docker/Dockerfile.gcc-8 @@ -0,0 +1,2 @@ +FROM openfpga-buildenv-base +RUN apt-get update && apt-get install -y gcc-8 g++-8 diff --git a/docker/Dockerfile.gcc-9 b/docker/Dockerfile.gcc-9 new file mode 100644 index 000000000..a8822a993 --- /dev/null +++ b/docker/Dockerfile.gcc-9 @@ -0,0 +1,4 @@ +FROM openfpga-buildenv-base +RUN apt-get install -y software-properties-common +RUN add-apt-repository ppa:ubuntu-toolchain-r/test +RUN apt-get update && apt-get install -y gcc-9 g++-9 diff --git a/docker/Dockerfile.run b/docker/Dockerfile.run new file mode 100644 index 000000000..4f0fd646d --- /dev/null +++ b/docker/Dockerfile.run @@ -0,0 +1,4 @@ +FROM ubuntu:18.04 +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y \ + libc6 libffi6 libgcc1 libreadline7 libstdc++6 libtcl8.6 python3 zlib1g libbz2-1.0 diff --git a/docker/Dockerfile.test b/docker/Dockerfile.test new file mode 100644 index 000000000..23845714b --- /dev/null +++ b/docker/Dockerfile.test @@ -0,0 +1,5 @@ +FROM ubuntu:18.04 +ENV DEBIAN_FRONTEND=noninteractive +RUN apt-get update && apt-get install -y \ + libc6 libffi6 libgcc1 libreadline7 libstdc++6 libtcl8.6 python3 zlib1g libbz2-1.0 +RUN apt-get install -y libdatetime-perl iverilog