# 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 \
        && 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: |
      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; 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: 5/55' 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"
