diff --git a/.travis.yml b/.travis.yml index d09aceee3..732bc35c0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,272 +8,107 @@ version: ~> 1.0 -os: linux language: cpp -cache: ccache - -env: - global: - - VERILATOR_CACHE=$HOME/verilator_cache - - VERILATOR_ROOT=$PWD - - VERILATOR_NUM_JOBS=$(echo `nproc` + 1 | bc) - - VERILATOR_CONFIG_FLAGS="--enable-maintainer-mode --enable-longtests" - - VERILATOR_AUTHOR_SITE=1 cache: directories: - - $VERILATOR_CACHE + - $HOME/.ccache +env: + global: + - VERILATOR_ROOT=$TRAVIS_BUILD_DIR + +# The list and order of build stages +stages: + - build # Build Verilator + - test # Run tests + +# Dump info about the environment for debugging before_install: -# Perl modules needed for testing -# Not listing Bit::Vector as slow to install, and only skips one test - - touch temp.cpp ; g++ -E -dM -c temp.cpp | sort ; rm -rf temp.cpp - - yes yes | sudo cpan -fi Unix::Processors Parallel::Forker - - sudo apt-get install gdb gtkwave lcov - - sudo apt-get install libfl-dev || true - - sudo apt-get install libgoogle-perftools-dev -# Only works on 20.04 - - sudo apt-get install libsystemc-dev || true + # To dump the script that Travis itself is executing, add 'cat $0' here + - cd "$TRAVIS_BUILD_DIR" # Skipping the git clone in later stages requires this + - export CCACHE_MAXSIZE=$(ci/travis-ccache-size.bash) # Set here after the 'cd' + - env | sort + - ls -lA . + - ls -lA bin + - g++ -E -dM -c -x c++ /dev/null | sort + - clang++ -E -dM -c -x c++ /dev/null | sort + +# Install all dependencies +install: + - ./ci/travis-install.bash before_script: - - bash -x ci/build_vcddiff.sh - - bash -x ci/build_verilator.sh - - bin/verilator -V || true + # ccache maintenance + - ./ci/travis-ccache-maint.bash + # On Focal, set the SystemC installation location + - | + if [ "$TRAVIS_DIST" = "focal" ]; then + export SYSTEMC_INCLUDE=/usr/include + export SYSTEMC_LIBDIR=/usr/lib/x86_64-linux-gnu + fi -after_script: - - ccache -s +before_cache: + - ccache -s -z -stages: - - vbuild - - test +# All jobs run the same script +script: ./ci/travis-script.bash +# Enumerate all the jobs jobs: -# compiler: gcc clang -# 12.04 dist: precise perl problem -# 14.04 dist: trusty cron -# 16.04 dist: xenial cron cron -# 18.04 dist: bionic cron -# 20.04 dist: focal !cron cron -# 20.04 coverage cron include: - - if: type != cron - stage: vbuild - name: "Build Verilator" - dist: focal - compiler: gcc - script: echo "Done building Verilator" -# Non-cron build will just run on whatever linux flavor we get - - if: type != cron - stage: test - name: "Test Dist" - dist: focal - compiler: gcc - script: ci/test.sh dist - - if: type != cron - stage: test - name: "Test Vlt" - dist: focal - compiler: gcc - script: ci/test.sh vlt - - if: type != cron - stage: test - name: "Test Vltmt set 0" - dist: focal - compiler: gcc - script: ci/test.sh vltmt0 - - if: type != cron - stage: test - name: "Test Vltmt set 1" - dist: focal - compiler: gcc - script: ci/test.sh vltmt1 -# Cron builds try different OS/compiler combinations - - if: type = cron - dist: trusty - compiler: gcc - stage: vbuild - name: "14.04 gcc build" - script: echo - - if: type = cron - dist: trusty - compiler: gcc - stage: test - name: "14.04 gcc distvlt" - script: ci/test.sh distvlt - - if: type = cron - dist: trusty - compiler: gcc - stage: test - name: "14.04 gcc vltmt0" - script: ci/test.sh vltmt0 - - if: type = cron - dist: trusty - compiler: gcc - stage: test - name: "14.04 gcc vltmt1" - script: ci/test.sh vltmt1 -# - - if: type = cron - dist: xenial - compiler: gcc - stage: vbuild - name: "16.04 gcc build" - script: echo - - if: type = cron - dist: xenial - compiler: gcc - stage: test - name: "16.04 gcc distvlt" - script: ci/test.sh distvlt - - if: type = cron - dist: xenial - compiler: gcc - stage: test - name: "16.04 gcc vltmt0" - script: ci/test.sh vltmt0 - - if: type = cron - dist: xenial - compiler: gcc - stage: test - name: "16.04 gcc vltmt1" - script: ci/test.sh vltmt1 -# - - if: type = cron - dist: bionic - compiler: gcc - stage: vbuild - name: "18.04 gcc build" - script: echo - - if: type = cron - dist: bionic - compiler: gcc - stage: test - name: "18.04 gcc distvlt" - script: ci/test.sh distvlt - - if: type = cron - dist: bionic - compiler: gcc - stage: test - name: "18.04 gcc vltmt0" - script: ci/test.sh vltmt0 - - if: type = cron - dist: bionic - compiler: gcc - stage: test - name: "18.04 gcc vltmt1" - script: ci/test.sh vltmt1 -# - - if: type = cron - dist: xenial - compiler: clang - stage: vbuild - name: "16.04 clang build" - script: echo - - if: type = cron - dist: xenial - compiler: clang - stage: test - name: "16.04 clang distvlt" - script: ci/test.sh distvlt - - if: type = cron - dist: xenial - compiler: clang - stage: test - name: "16.04 clang vltmt0" - script: ci/test.sh vltmt0 - - if: type = cron - dist: xenial - compiler: clang - stage: test - name: "16.04 clang vltmt1" - script: ci/test.sh vltmt1 -# - - if: type = cron - dist: focal - compiler: clang - stage: vbuild - name: "20.04 clang build" - script: echo - - if: type = cron - dist: focal - compiler: clang - stage: test - name: "20.04 clang distvlt" - script: ci/test.sh distvlt - - if: type = cron - dist: focal - compiler: clang - stage: test - name: "20.04 clang vltmt0" - script: ci/test.sh vltmt0 - - if: type = cron - dist: focal - compiler: clang - stage: test - name: "20.04 clang vltmt1" - script: ci/test.sh vltmt1 -# -# Cron coverage runs (two parts to avoid 50min timeout) - - if: type = cron - dist: focal - compiler: gcc - stage: vbuild - name: "Coverage Build" - script: ci/test.sh coverage-build - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage dist" - script: ci/test.sh coverage-dist - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vlt set 0" - script: ci/test.sh coverage-vlt0 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vltmt set 0" - script: ci/test.sh coverage-vltmt0 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vlt set 1" - script: ci/test.sh coverage-vlt1 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vltmt set 1" - script: ci/test.sh coverage-vltmt1 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vlt set 2" - script: ci/test.sh coverage-vlt2 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vltmt set 2" - script: ci/test.sh coverage-vltmt2 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vlt set 3" - script: ci/test.sh coverage-vlt3 - - if: type = cron - dist: focal - compiler: gcc - stage: test - name: "Coverage vltmt set 3" - script: ci/test.sh coverage-vltmt3 + ############################################################################ + # Jobs in the 'build' stage + ############################################################################ + # GCC builds + - {stage: build, if: type = cron, os: linux, dist: trusty, compiler: gcc, workspaces: {create: {name: trusty-gcc, paths: .}}} + - {stage: build, if: type = cron, os: linux, dist: xenial, compiler: gcc, workspaces: {create: {name: xenial-gcc, paths: .}}} + - {stage: build, if: type = cron, os: linux, dist: bionic, compiler: gcc, workspaces: {create: {name: bionic-gcc, paths: .}}} + - {stage: build, if: type != cron, os: linux, dist: focal, compiler: gcc, workspaces: {create: {name: focal-gcc, paths: .}}} + # Clang builds + - {stage: build, if: type = cron, os: linux, dist: xenial, compiler: clang, workspaces: {create: {name: xenial-clang, paths: .}}} + - {stage: build, if: type != cron, os: linux, dist: focal, compiler: clang, workspaces: {create: {name: focal-clang, paths: .}}} + # Coverage build + - {stage: build, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {create: {name: coverage, paths: .}}, env: COVERAGE=1} + ############################################################################ + # Jobs in the 'test' stage + ############################################################################ + # GCC tests + - {stage: test, if: type = cron, os: linux, dist: trusty, compiler: gcc, workspaces: {use: trusty-gcc}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: trusty, compiler: gcc, workspaces: {use: trusty-gcc}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: trusty, compiler: gcc, workspaces: {use: trusty-gcc}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: trusty, compiler: gcc, workspaces: {use: trusty-gcc}, git: {clone: false}, env: TESTS=vltmt-1} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: gcc, workspaces: {use: xenial-gcc}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: gcc, workspaces: {use: xenial-gcc}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: gcc, workspaces: {use: xenial-gcc}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: gcc, workspaces: {use: xenial-gcc}, git: {clone: false}, env: TESTS=vltmt-1} + - {stage: test, if: type = cron, os: linux, dist: bionic, compiler: gcc, workspaces: {use: bionic-gcc}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: bionic, compiler: gcc, workspaces: {use: bionic-gcc}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: bionic, compiler: gcc, workspaces: {use: bionic-gcc}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: bionic, compiler: gcc, workspaces: {use: bionic-gcc}, git: {clone: false}, env: TESTS=vltmt-1} + - {stage: test, if: type != cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: focal-gcc}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type != cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: focal-gcc}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: focal-gcc}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: focal-gcc}, git: {clone: false}, env: TESTS=vltmt-1} + # Clang tests + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: clang, workspaces: {use: xenial-clang}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: clang, workspaces: {use: xenial-clang}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: clang, workspaces: {use: xenial-clang}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: xenial, compiler: clang, workspaces: {use: xenial-clang}, git: {clone: false}, env: TESTS=vltmt-1} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: clang, workspaces: {use: focal-clang}, git: {clone: false}, env: TESTS=dist-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: clang, workspaces: {use: focal-clang}, git: {clone: false}, env: TESTS=dist-vlt-1} + - {stage: test, if: type != cron, os: linux, dist: focal, compiler: clang, workspaces: {use: focal-clang}, git: {clone: false}, env: TESTS=vltmt-0} + - {stage: test, if: type != cron, os: linux, dist: focal, compiler: clang, workspaces: {use: focal-clang}, git: {clone: false}, env: TESTS=vltmt-1} + # Coverage tests + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-dist} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vlt-0} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vlt-1} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vlt-2} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vlt-3} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vltmt-0} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vltmt-1} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vltmt-2} + - {stage: test, if: type = cron, os: linux, dist: focal, compiler: gcc, workspaces: {use: coverage}, git: {clone: false}, env: TESTS=coverage-vltmt-3} notifications: email: diff --git a/ci/build_vcddiff.sh b/ci/build_vcddiff.sh deleted file mode 100755 index f4eca15fd..000000000 --- a/ci/build_vcddiff.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# DESCRIPTION: Verilator: Build script for vcddiff -# -# Copyright 2019 by Todd Strader. This program is free software; you -# can redistribute it and/or modify it under the terms of either the GNU -# Lesser General Public License Version 3 or the Perl Artistic License -# Version 2.0. -# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 -set -e - -# NB: it would be better to add this via a PPA - -TMP_DIR=$(mktemp -d) - -git -C "${TMP_DIR}" clone https://github.com/veripool/vcddiff -VCDDIFF_DIR=${TMP_DIR}/vcddiff -git -C "${VCDDIFF_DIR}" checkout 5112f88b7ba8818dce9dfb72619e64a1fc19542c -make -C "${VCDDIFF_DIR}" -sudo cp "${VCDDIFF_DIR}/vcddiff" /usr/local/bin diff --git a/ci/build_verilator.sh b/ci/build_verilator.sh deleted file mode 100755 index 3ae363bf7..000000000 --- a/ci/build_verilator.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -# DESCRIPTION: Verilator: Travis CI build script -# -# Copyright 2019 by Todd Strader. This program is free software; you -# can redistribute it and/or modify it under the terms of either the GNU -# Lesser General Public License Version 3 or the Perl Artistic License -# Version 2.0. -# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 -# -# This script builds and caches the Verilator binaries for Travis CI -# (and possibly other CI platforms). The Verilator CI system uses this -# script, but other CI systems that depend on Verilator may also use -# the script. -# see: https://github.com/verilator/verilator_ext_tests/blob/master/.travis.yml -# To use this script, either checkout Verilator as part of the CI build -# process or add Verilator as a Git submodule. Verilator tarballs can -# not be used as the script relies on Git revisions for caching. -set -e - -if [ -z "${VERILATOR_NUM_JOBS}" ]; then - VERILATOR_NUM_JOBS=$(nproc) -fi - -# Caching would be simpler if we installed without VERILATOR_ROOT, but -# it's needed for driver.pl outside of the repo -if [ -z "${VERILATOR_ROOT}" ]; then - echo "VERILATOR_ROOT not set" - exit -1 -fi - -if [ -z "${VERILATOR_CACHE}" ]; then - echo "VERILATOR_CACHE not set" - exit -1 -fi - -VERILATOR_REV=$(cd "${VERILATOR_ROOT}" && git rev-parse HEAD) -echo "Found Verilator rev ${VERILATOR_REV}" - -CACHED_REV_FILE=${VERILATOR_CACHE}/.rev.txt - -if [[ ! -f "${CACHED_REV_FILE}" || \ - $(< "${CACHED_REV_FILE}") != "${VERILATOR_REV}" ]]; then - echo "Building Verilator" - - # Unsure why Travis monkies with the capitalization of the stage name, but it does - if [[ -n ${TRAVIS_BUILD_STAGE_NAME} && \ - ${TRAVIS_BUILD_STAGE_NAME} != "Build verilator" ]]; then - echo "WARNING: Building Verilator in Travis build stage other than \"Build verilator\": ${TRAVIS_BUILD_STAGE_NAME}" - fi - - cd "${VERILATOR_ROOT}" - autoconf && ./configure ${VERILATOR_CONFIG_FLAGS} && make -j ${VERILATOR_NUM_JOBS} - # Copy the Verilator build artifacts - mkdir -p "${VERILATOR_CACHE}" - rm -rf ${VERILATOR_CACHE}/* - cp bin/*bin* "${VERILATOR_CACHE}" - # Remember the Git revision - echo "${VERILATOR_REV}" > "${CACHED_REV_FILE}" -else - echo "Using cached Verilator" - cd "${VERILATOR_ROOT}" - # Create include/verilated_config.h and maybe other things - autoconf && ./configure ${VERILATOR_CONFIG_FLAGS} - cp ${VERILATOR_CACHE}/* bin -fi diff --git a/ci/test.sh b/ci/test.sh deleted file mode 100755 index e5667a527..000000000 --- a/ci/test.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -# DESCRIPTION: Verilator: Travis CI test script -# -# Copyright 2019 by Todd Strader. This program is free software; you -# can redistribute it and/or modify it under the terms of either the GNU -# Lesser General Public License Version 3 or the Perl Artistic License -# Version 2.0. -# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 - -set -e - -export DRIVER_FLAGS='-j 0 --quiet --rerun' - -case $1 in - dist) - make -C test_regress SCENARIOS=--dist - ;; - vlt) - make -C test_regress SCENARIOS=--vlt - ;; - distvlt) - make -C test_regress SCENARIOS="--dist --vlt" - ;; - vltmt) - make -C test_regress SCENARIOS=--vltmt - ;; - vltmt0) - make -C test_regress SCENARIOS=--vltmt DRIVER_HASHSET=--hashset=0/2 - ;; - vltmt1) - make -C test_regress SCENARIOS=--vltmt DRIVER_HASHSET=--hashset=1/2 - ;; - coverage-build) - nodist/code_coverage --stages 1-2 - ;; - coverage-dist) - nodist/code_coverage --scenarios=--dist - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vlt0) - nodist/code_coverage --scenarios=--vlt --hashset=0/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vlt1) - nodist/code_coverage --scenarios=--vlt --hashset=1/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vlt2) - nodist/code_coverage --scenarios=--vlt --hashset=2/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vlt3) - nodist/code_coverage --scenarios=--vlt --hashset=3/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vltmt0) - nodist/code_coverage --scenarios=--vltmt --hashset=0/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vltmt1) - nodist/code_coverage --scenarios=--vltmt --hashset=1/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vltmt2) - nodist/code_coverage --scenarios=--vltmt --hashset=3/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - coverage-vltmt3) - nodist/code_coverage --scenarios=--vltmt --hashset=4/4 - bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info - ;; - *) - echo "Usage: test.sh (dist|vlt|vltmt)" - exit -1 - ;; -esac diff --git a/ci/travis-ccache-maint.bash b/ci/travis-ccache-maint.bash new file mode 100755 index 000000000..a8f2ddfc0 --- /dev/null +++ b/ci/travis-ccache-maint.bash @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +# DESCRIPTION: Verilator: Travis CI ccache maintenance +# +# Copyright 2020 by Geza Lore. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +################################################################################ +# This script is run in 'before_script', once ccache has been set up. +################################################################################ + +set -e +set -x + +# Show version +ccache --version + +# Flush ccache if requested in commit message +COMMIT="${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT}" +if git log --format=%B -n 1 "$COMMIT" | grep -q -i '\[travis\s\+ccache\s\+clear\]'; then + echo "Flushing ccache due to commit message" + ccache -C +fi + +# Dump stats, then zero stats +ccache -s -z diff --git a/ci/travis-ccache-size.bash b/ci/travis-ccache-size.bash new file mode 100755 index 000000000..60a5b412d --- /dev/null +++ b/ci/travis-ccache-size.bash @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +# DESCRIPTION: Verilator: Travis CI ccache sizer +# +# Copyright 2020 by Geza Lore. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +################################################################################ +# This script computes the size of the ccache to be used for a job. We want the +# ccache to be just big enough to be able to hold a whole build so a re-build +# of the same does not miss in the cache due to capacity, but we don't want the +# ccache too big as pulling it down from the network takes time, and it is +# unlikely objects from much earlier builds would be useful. +################################################################################ + +fatal() { + echo "ERROR: $(basename "$0"): $1" >&2; exit 1; +} + +if [ "$TRAVIS_BUILD_STAGE_NAME" = "build" ]; then + if [ "$COVERAGE" == 1 ]; then + echo "1024M" + else + echo "768M" + fi +elif [ "$TRAVIS_BUILD_STAGE_NAME" = "test" ]; then + if [[ $TESTS == coverage-* ]]; then + echo "1536M" + else + echo "256M" + fi +else + fatal "Unknown build stage: '$TRAVIS_BUILD_STAGE_NAME'" +fi diff --git a/ci/travis-install.bash b/ci/travis-install.bash new file mode 100755 index 000000000..6fb552ca5 --- /dev/null +++ b/ci/travis-install.bash @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# DESCRIPTION: Verilator: Travis CI dependency install script +# +# Copyright 2020 by Geza Lore. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +################################################################################ +# This script runs in the 'install' phase of all jobs, in all stages. We try to +# minimize the time spent in this by selectively installing only the components +# required by the particular build stage. +################################################################################ + +# Note that Travis runs "apt-get update" when "apt-get install" is used in the +# .travis.yml file directly, but since we invoke it via this script, we need to +# run it manually where requried, otherwise some packages cannot be found. + +set -e +set -x + +fatal() { + echo "ERROR: $(basename "$0"): $1" >&2; exit 1; +} + +install-vcddiff() { + TMP_DIR="$(mktemp -d)" + git clone https://github.com/veripool/vcddiff "$TMP_DIR" + git -C "${TMP_DIR}" checkout 5112f88b7ba8818dce9dfb72619e64a1fc19542c + make -C "${TMP_DIR}" + sudo cp "${TMP_DIR}/vcddiff" /usr/local/bin +} + +if [ "$TRAVIS_BUILD_STAGE_NAME" = "build" ]; then + ############################################################################## + # Dependencies of jobs in the 'build' stage, i.e.: packages required to + # build Verilator + + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + time sudo apt-get update + sudo apt-get install libfl-dev + sudo apt-get install libgoogle-perftools-dev + if [ "$COVERAGE" = 1 ]; then + yes yes | sudo cpan -fi Unix::Processors Parallel::Forker + fi + else + fatal "Unknown os: '$TRAVIS_OS_NAME'" + fi +elif [ "$TRAVIS_BUILD_STAGE_NAME" = "test" ]; then + ############################################################################## + # Dependencies of jobs in the 'test' stage, i.e.: packages required to + # run the tests + + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + sudo apt-get update + sudo apt-get install gdb gtkwave lcov + if [ "$TRAVIS_DIST" = "focal" ]; then + sudo apt-get install libsystemc-dev + fi + yes yes | sudo cpan -fi Unix::Processors Parallel::Forker + # Not listing Bit::Vector as slow to install, and only skips one test + install-vcddiff + else + fatal "Unknown os: '$TRAVIS_OS_NAME'" + fi +else + ############################################################################## + # Unknown build stage + fatal "Unknown build stage: '$TRAVIS_BUILD_STAGE_NAME'" +fi diff --git a/ci/travis-script.bash b/ci/travis-script.bash new file mode 100755 index 000000000..e87e62429 --- /dev/null +++ b/ci/travis-script.bash @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# DESCRIPTION: Verilator: Travis CI main job script +# +# Copyright 2020 by Geza Lore. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +################################################################################ +# This is the main script executed in the 'script' phase by all jobs. We use a +# single script to keep the .travis.yml spec simple. We pass job parameters via +# environment variables using 'env' keys. Having different 'env' keys in jobs +# ensures they use different Travis build caches. +################################################################################ + +set -e +set -x + +fatal() { + echo "ERROR: $(basename "$0"): $1" >&2; exit 1; +} + +if [ "$TRAVIS_BUILD_STAGE_NAME" = "build" ]; then + ############################################################################## + # Build verilator + + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + if [ "$COVERAGE" != 1 ]; then + autoconf + ./configure --enable-longtests --enable-ccwarn + make -j $(nproc) + else + nodist/code_coverage --stages 1-2 + fi + else + fatal "Unknown os: '$TRAVIS_OS_NAME'" + fi +elif [ "$TRAVIS_BUILD_STAGE_NAME" = "test" ]; then + ############################################################################## + # Run tests + + if [ "$TRAVIS_OS_NAME" = "linux" ]; then + # Run the specified test + case $TESTS in + dist-vlt-0) + make -C test_regress SCENARIOS="--dist --vlt" DRIVER_HASHSET=--hashset=0/2 + ;; + dist-vlt-1) + make -C test_regress SCENARIOS="--dist --vlt" DRIVER_HASHSET=--hashset=1/2 + ;; + vltmt-0) + make -C test_regress SCENARIOS=--vltmt DRIVER_HASHSET=--hashset=0/2 + ;; + vltmt-1) + make -C test_regress SCENARIOS=--vltmt DRIVER_HASHSET=--hashset=1/2 + ;; + coverage-dist) + nodist/code_coverage --stages 3- --scenarios=--dist + ;; + coverage-vlt-0) + nodist/code_coverage --stages 3- --scenarios=--vlt --hashset=0/4 + ;; + coverage-vlt-1) + nodist/code_coverage --stages 3- --scenarios=--vlt --hashset=1/4 + ;; + coverage-vlt-2) + nodist/code_coverage --stages 3- --scenarios=--vlt --hashset=2/4 + ;; + coverage-vlt-3) + nodist/code_coverage --stages 3- --scenarios=--vlt --hashset=3/4 + ;; + coverage-vltmt-0) + nodist/code_coverage --stages 3- --scenarios=--vltmt --hashset=0/4 + ;; + coverage-vltmt-1) + nodist/code_coverage --stages 3- --scenarios=--vltmt --hashset=1/4 + ;; + coverage-vltmt-2) + nodist/code_coverage --stages 3- --scenarios=--vltmt --hashset=2/4 + ;; + coverage-vltmt-3) + nodist/code_coverage --stages 3- --scenarios=--vltmt --hashset=3/4 + ;; + *) + fatal "Unknown test: $TESTS" + ;; + esac + # Upload coverage data to codecov.io + if [[ $TESTS == coverage-* ]]; then + bash <(curl -s https://codecov.io/bash) -f nodist/obj_dir/coverage/app_total.info + fi + else + fatal "Unknown os: '$TRAVIS_OS_NAME'" + fi +else + ############################################################################## + # Unknown build stage + fatal "Unknown build stage: '$TRAVIS_BUILD_STAGE_NAME'" +fi diff --git a/nodist/code_coverage b/nodist/code_coverage index f704c8888..07cc22628 100755 --- a/nodist/code_coverage +++ b/nodist/code_coverage @@ -89,7 +89,8 @@ sub test { if ($Opt_Stages{2}) { travis_fold_start("build"); print "Stage 2: build\n"; - run("make -k"); + my $nproc = Unix::Processors->new->max_online; + run("make -k -j $nproc"); # The optimized versions will not collect good coverage, overwrite them run("cp bin/verilator_bin_dbg bin/verilator_bin"); run("cp bin/verilator_coverage_bin_dbg bin/verilator_coverage_bin"); diff --git a/test_regress/driver.pl b/test_regress/driver.pl index 68f138d79..2789f92c5 100755 --- a/test_regress/driver.pl +++ b/test_regress/driver.pl @@ -23,6 +23,7 @@ use version; use POSIX qw(strftime); use lib "."; use Time::HiRes qw(usleep); +use Digest::MD5 qw(md5); $::Driver = 1; $::Have_Forker = 0; @@ -275,10 +276,7 @@ sub _calc_hashset { my ($set, $nsets) = ($1, $2); my @new; foreach my $t (@opt_tests) { - my $checksum = do { - local $/; - unpack("%32W*", $t); - }; + my $checksum = unpack('L', substr(md5($t), 0, 4)); if (($set % $nsets) == ($checksum % $nsets)) { push @new, $t; }