# 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

      - 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'
        run: |
          cd docs/_build/html
          touch .nojekyll
          git init
          cp ../../../.git/config ./.git/config
          git add .
          git config --local user.email "BuildTheDocs@GitHubActions"
          git config --local user.name "GitHub Actions"
          git commit -a -m "update ${{ github.sha }}"
          git push -u origin +HEAD:gh-pages


  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
