# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Azure Pipelines CI build configuration
# Documentation at https://aka.ms/yaml

variables:
  VERILATOR_VERSION: 4.016
  VERILATOR_PATH: /opt/buildcache/verilator/$(VERILATOR_VERSION)
  RISCV_TOOLCHAIN_TAR_VERSION: 20190807-1

trigger:
  batch: true
  branches:
# Combine builds on master as long as another build is running
    include:
    - master

# Note: All tests run as part of one job to avoid copying intermediate build
# artifacts around (e.g. Verilator and toolchain builds). Once more builds/tests
# are added, we need to re-evaluate this decision to parallelize jobs and
# improve end-to-end CI times.

jobs:
- job: lint_dv
  displayName: Run quality checks (Lint and DV)
  pool:
    vmImage: "ubuntu-16.04"
  steps:
  # Installing six is a workaround for pip dependency resolution: six is already
  # installed as system package with a version below the required one.
  # Explicitly installing six through pip gets us a supported version.
  - bash: |
      sudo apt-get install -y \
          python3 \
          python3-pip \
          python3-setuptools \
          srecord \
          zlib1g-dev \
          git \
          make \
          autoconf \
          g++ \
          flex \
          bison \
          curl \
          libelf-dev \
          clang-format \
        && sudo pip3 install -U six fusesoc
    displayName: Install dependencies

  - bash: |
      set -e
      if [ ! -d $(VERILATOR_PATH) ]; then
        echo "Building verilator (no cached build found)"
        mkdir -p build/verilator
        cd build/verilator
        curl -Ls -o verilator.tgz https://www.veripool.org/ftp/verilator-$(VERILATOR_VERSION).tgz
        tar -xf verilator.tgz
        cd verilator-$(VERILATOR_VERSION)
        ./configure --prefix=$(VERILATOR_PATH)
        make -j$(nproc)
        mkdir -p $VERILATOR_PATH
        make install
      else
        echo "Re-using cached verilator build"
      fi
      echo "##vso[task.setvariable variable=PATH]$VERILATOR_PATH/bin:$PATH"
    displayName: Build and install Verilator

  - bash: |
      export TOOLCHAIN_URL=https://github.com/lowRISC/lowrisc-toolchains/releases/download/${RISCV_TOOLCHAIN_TAR_VERSION}/lowrisc-toolchain-gcc-rv32imc-${RISCV_TOOLCHAIN_TAR_VERSION}.tar.xz
      mkdir -p build/toolchain
      curl -Ls -o build/toolchain/rv32-toolchain.tar.xz $TOOLCHAIN_URL
      sudo mkdir -p /tools/riscv && sudo chmod 777 /tools/riscv
      tar -C /tools/riscv -xf build/toolchain/rv32-toolchain.tar.xz --strip-components=1
      echo "##vso[task.setvariable variable=PATH]/tools/riscv/bin:$PATH"
    displayName: Get precompiled RISC-V toolchain

  - bash: |
      echo $PATH
      python3 --version
      echo -n "fusesoc "
      fusesoc --version
      verilator --version
      riscv32-unknown-elf-gcc --version
    displayName: Display environment

  - bash: |
      fusesoc --cores-root . run --target=lint lowrisc:ibex:ibex_core_tracing
      if [ $? != 0 ]; then
        echo -n "##vso[task.logissue type=error]"
        echo "Verilog lint failed. Run 'fusesoc --cores-root . run --target=lint lowrisc:ibex:ibex_core_tracing' to check and fix all errors."
        exit 1
      fi
    displayName: Lint Verilog source files with Verilator

  - bash: |
      fork_origin=$(git merge-base --fork-point origin/master)
      changed_files=$(git diff --name-only $fork_origin | grep -v /vendor/ | grep -E '\.(cpp|cc|c|h)$')
      test -z "$changed_files" || git diff -U0 $fork_origin $changed_files | clang-format-diff -p1 | tee clang-format-output
      if [ -s clang-format-output ]; then
        echo -n "##vso[task.logissue type=error]"
        echo "C/C++ lint failed. Use 'git clang-format' with appropriate options to reformat the changed code."
        exit 1
      fi
    # This check is not idempotent, but checks changes to a base branch.
    # Run it only on pull requests.
    condition: eq(variables['Build.Reason'], 'PullRequest')
    displayName: 'Use clang-format to check C/C++ coding style'

  - bash: |
      # Build and run CSR testbench
      fusesoc --cores-root=. run --target=sim --tool=verilator lowrisc:ibex:tb_cs_registers
    displayName: Build and run CSR testbench with Verilator

  - bash: |
      cd build
      git clone https://github.com/riscv/riscv-compliance.git
    displayName: Get RISC-V Compliance test suite

  - bash: |
      # Build simulation model of Ibex
      fusesoc --cores-root=. run --target=sim --setup --build lowrisc:ibex:ibex_riscv_compliance --RV32M=1 --RV32E=0
      if [ $? != 0 ]; then
        echo -n "##vso[task.logissue type=error]"
        echo "Unable to build Verilator model of Ibex for compliance testing."
        exit 1
      fi

      # Run compliance test suite
      export TARGET_SIM=$PWD/build/lowrisc_ibex_ibex_riscv_compliance_0.1/sim-verilator/Vibex_riscv_compliance
      export RISCV_PREFIX=riscv32-unknown-elf-
      export RISCV_TARGET=ibex
      export RISCV_DEVICE=rv32imc
      fail=0
      for isa in rv32i rv32im rv32imc rv32Zicsr rv32Zifencei; do
        make -C build/riscv-compliance RISCV_ISA=$isa 2>&1 | tee run.log
        if [ ${PIPESTATUS[0]} != 0 ]; then
          echo -n "##vso[task.logissue type=error]"
          echo "The RISC-V compliance test suite failed for $isa"

          # There's no easy way to get the test results in machine-readable
          # form to properly exclude known-failing tests. Going with an
          # approximate solution for now.
          if [ $isa == rv32i ] && grep -q 'FAIL: 4/48' run.log; then
            echo -n "##vso[task.logissue type=error]"
            echo "Expected failure for rv32i, see lowrisc/ibex#100 more more information."
          else
            fail=1
          fi
        fi
      done
      exit $fail
    displayName: "Run RISC-V Compliance test for Ibex RV32IMC"
