# Copyright (C) 2020-2022 F4PGA Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0

name: Pipeline

on:
  workflow_call:

jobs:


  License-check:
    name: Check license headers
    runs-on: ubuntu-latest

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Check Licenses
        uses: SymbiFlow/actions/checks@main


  Format:
    name: '🐍 Format'
    runs-on: ubuntu-latest

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: 🐍 Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      - name: 🔧 Install dependencies
        run: python -m pip install -r test/requirements.txt

      - name: 🚦 Check if Python sources follow code formatting standards
        run: python -m black --check f4pga


  Docs:
    runs-on: ubuntu-latest
    name: '📓 Docs'
    permissions:
      contents: write
    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: 🛠️ Setup environment
        run: |
          sudo apt update -qq
          sudo apt install -y make
          make -C docs env

      - name: 📓 Build the documentation
        run: |
          . ./docs/env/conda/bin/activate f4pga-docs
          make -C docs html
          cd docs/_build/html
          touch .nojekyll

      - name: '📤 Upload artifact: Sphinx HTML'
        uses: actions/upload-artifact@v3
        with:
          name: Documentation-HTML
          path: docs/_build/html

      - name: 🚀 Publish site to GitHub Pages
        if: github.event_name != 'pull_request'
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: docs/_build/html

  Install:
    runs-on: ubuntu-latest
    steps:

    - name: 🐍 Install f4pga (pip zipfile)
      run: pip3 install https://github.com/"$GITHUB_REPOSITORY"/archive/"$GITHUB_REF".zip#subdirectory=f4pga


  Builds:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        flow:
          - SymbiFlow
          - F4PGA
        fam:
          - xc7
          - eos-s3
    name: '🚦 ${{ matrix.flow }} | ${{ matrix.fam }}'
    env:
      F4PGA_INSTALL_DIR: /opt/f4pga
      FPGA_FAM: ${{ matrix.fam }}

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3

      - name: 🔧 Prepare environment
        run: ./scripts/prepare_environment.sh

      - name: 🐍 Install f4pga (pip)
        run: |
          . ./scripts/activate.sh
          cd f4pga
          pip install .
          cd ..

      - name: 🛠️ Clone f4pga-examples
        run: git clone --recurse-submodules https://github.com/chipsalliance/f4pga-examples

      # F4PGA

      - name: 🚧 [F4PGA] Test f4pga build
        if: matrix.flow == 'F4PGA'
        run: |
          . ./scripts/activate.sh
          cd f4pga-examples/${{ matrix.fam }}
          f4pga -vv build --flow ../../.github/${{ matrix.fam }}_test.json

      - name: '📤 Upload artifact: ${{ matrix.fam }} bitstream'
        if: matrix.flow == 'F4PGA'
        uses: actions/upload-artifact@v3
        with:
          name: ${{ matrix.flow }}-${{ matrix.fam }}-Bitstream
          path: f4pga-examples/${{ matrix.fam }}/build/top.bit
          if-no-files-found: error

      # SymbiFlow

      - name: 🚧 [SymbiFlow] Test make example
        if: matrix.flow == 'SymbiFlow'
        run: |
          . ./scripts/activate.sh
          cd f4pga-examples/${{ matrix.fam }}
          export F4PGA_USE_DEPRECATED=true
          case '${{ matrix.fam }}' in
            xc7) TARGET="arty_35" make -C counter_test;;
            eos-s3) make -C btn_counter;;
          esac

      - name: '📤 Upload artifact: Arty 35 bitstream'
        if: matrix.flow == 'SymbiFlow' && matrix.fam == 'xc7'
        uses: actions/upload-artifact@v3
        with:
          name: ${{ matrix.flow }}-${{ matrix.fam }}-Bitstream
          path: f4pga-examples/${{ matrix.fam }}/counter_test/build/arty_35/top.bit
          if-no-files-found: error

      - name: '📤 Upload artifact: QuickLogic bitstream'
        if: matrix.flow == 'SymbiFlow' && matrix.fam == 'eos-s3'
        uses: actions/upload-artifact@v3
        with:
          name: ${{ matrix.flow }}-${{ matrix.fam }}-Bitstream
          path: f4pga-examples/${{ matrix.fam }}/btn_counter/build/top.bit
          if-no-files-found: error

  Lattice:
    runs-on: ubuntu-latest
    name: '🚦 Lattice | ice40'
    env:
      F4PGA_INSTALL_DIR: /usr/local
      FPGA_FAM: ice40

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3

      - name: 🛠️ Clone fomu-workshop
        run: git clone https://github.com/im-tomu/fomu-workshop

      - name: 🚧 [F4PGA] Test f4pga build
        run: |
          cat > ice40-test.sh <<'EOF'
          set -e
          apt-get update -qq
          DEBIAN_FRONTEND=noninteractive apt-get -y install --no-install-recommends python3-pip git

          pip install ./f4pga

          cd fomu-workshop/hdl/verilog/blink
          f4pga -vv build --flow ../../../../.github/ice40_test.json
          EOF

          docker run --rm -i \
          -v $(pwd):/wrk -w /wrk \
          -e FPGA_FAM=ice40 \
          gcr.io/hdl-containers/impl/icestorm \
          bash -le /wrk/ice40-test.sh

      - name: '📤 Upload artifact: ice40 bitstream'
        uses: actions/upload-artifact@v3
        with:
          name: Lattice-ice40-Bitstream
          path: fomu-workshop/hdl/verilog/blink/build/top.bit
          if-no-files-found: error


  Python-Tests:
    runs-on: ubuntu-latest
    name: '🐍 Python Tests'
    env:
      F4PGA_INSTALL_DIR: /opt/f4pga
      FPGA_FAM: xc7

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3

      - name: 🔧 Prepare environment
        run: ./scripts/prepare_environment.sh

      - name: 🐍 Install f4pga (pip)
        run: |
          . ./scripts/activate.sh
          cd f4pga
          pip install .
          cd ..

      - name: 🚦 Test Python wrappers
        run: |
          . ./scripts/activate.sh
          pip3 install -r ./test/requirements.txt
          pytest --verbose --capture=no -rA --color=yes test/


  PYTHONPATH:
    runs-on: ubuntu-latest
    name: '🐍 PYTHONPATH'
    env:
      F4PGA_INSTALL_DIR: /opt/f4pga
      FPGA_FAM: xc7

    steps:

      - name: 🧰 Checkout
        uses: actions/checkout@v3

      - name: 🚧 Test pyF4PGA (PYTHONPATH)
        run: |
          PYTHONPATH=$(pwd) python3 -m f4pga
          PYTHONPATH=$(pwd) python3 -m f4pga -h
