# 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:
- template: ci/vars.yml

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-18.04"
  steps:
  - bash: |
      ci/install-build-deps.sh
    displayName: Install build dependencies

  - 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:
        # Note: Try to keep the list of configurations in sync with the one used
        # in Private CI.
        - small
        - experimental-maxperf-pmp
        - experimental-maxperf-pmp-bmfull
        - experimental-maxperf-pmp-bmfull-icache
        - experimental-branch-predictor

  # 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
