# 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.032
  RISCV_TOOLCHAIN_TAR_VERSION: 20200323-1
  RISCV_COMPLIANCE_GIT_VERSION: 844c6660ef3f0d9b96957991109dfd80cc4938e2
  VERIBLE_VERSION: v0.0-459-g4d6929e

trigger:
  batch: true
  branches:
    include:
    - '*'
  tags:
    include:
    - '*'
pr:
  branches:
    include:
      - '*'

# 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.
  #
  # Updating pip and setuptools is required to have these tools properly parse
  # Python-version metadata, which some packages uses to specify that an older
  # version of a package must be used for a certain Python version. If that
  # information is not read, pip installs the latest version, which then fails
  # to run.
  - bash: |
      curl -L https://download.opensuse.org/repositories/home:phiwag:edatools/xUbuntu_16.04/Release.key | sudo apt-key add -
      sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/phiwag:/edatools/xUbuntu_16.04/ /' > /etc/apt/sources.list.d/edatools.list"
      # Uninstall distribution-provided version to get a newer version through pip
      sudo apt-get remove -y python3-yaml
      sudo apt-get update
      sudo apt-get install -y \
          python3 \
          python3-pip \
          python3-setuptools \
          python3-wheel \
          srecord \
          zlib1g-dev \
          git \
          make \
          autoconf \
          g++ \
          flex \
          bison \
          curl \
          libelf-dev \
          clang-format \
          verilator-$(VERILATOR_VERSION) \
        && sudo pip3 install -U setuptools pip six \
        && sudo pip3 install -U -r python-requirements.txt
    displayName: Install dependencies

  - bash: |
      set -e
      mkdir -p build/verible
      cd build/verible
      curl -Ls -o verible.tar.gz https://github.com/google/verible/releases/download/$(VERIBLE_VERSION)/verible-$(VERIBLE_VERSION)-Ubuntu-16.04-xenial-x86_64.tar.gz
      sudo mkdir -p /tools/verible && sudo chmod 777 /tools/verible
      tar -C /tools/verible -xf verible.tar.gz --strip-components=1
      echo "##vso[task.setvariable variable=PATH]/tools/verible/bin:$PATH"
    displayName: Install Verible

  - 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
      verible-verilog-lint --version
    displayName: Display environment

  # Verible format is experimental so only run on default config for now,
  # will eventually become part of the per-config CI
  - bash: |
      fusesoc --cores-root . run --no-export --target=format --tool=veribleformat lowrisc:ibex:ibex_core_tracing
      if [ $? != 0 ]; then
        echo -n "##vso[task.logissue type=error]"
        echo "Verilog format with Verible failed. Run 'fusesoc --cores-root . run --no-export --target=format --tool=veribleformat lowrisc:ibex:ibex_core_tracing' to check and fix all errors."
        echo "This flow is currently experimental and failures can be ignored."
      fi
      # Show diff of what verilog_format would have changed, and then revert.
      git diff
      git reset --hard HEAD
    continueOnError: true
    displayName: Format all source code with Verible format (experimental)

  - 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, chosen Ibex configuration does not effect
      # this so doesn't need to be part of per-config CI
      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
      cd riscv-compliance
      git checkout "$(RISCV_COMPLIANCE_GIT_VERSION)"
    displayName: Get RISC-V Compliance test suite

  # Run Ibex RTL CI per supported configuration
  - template : ci/ibex-rtl-ci-steps.yml
    parameters:
      ibex_configs:
        - small
        - experimental-maxperf-pmp
        - experimental-maxperf-pmp-bmfull

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

  - bash: |
      fusesoc --cores-root . run --target=lint --tool=veriblelint lowrisc:ibex:ibex_simple_system
      if [ $? != 0 ]; then
        echo -n "##vso[task.logissue type=error]"
        echo "Verilog lint with Verible failed. Run 'fusesoc --cores-root . run --target=lint --tool=veriblelint lowrisc:ibex:ibex_simple_system' to check and fix all errors."
        exit 1
      fi
    displayName: Run Verible lint on simple system
