calyx 0.7.1

Compiler Infrastructure for Hardware Accelerator Generation
name: Test

on: [push]

# Ensures that only the latest commit of a PR can execute the actions.
# Useful for cancelling job when a sequence of commits are quickly added.
concurrency:
  group: ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  # Get the hash of the Dockerfile
  hash:
    name: Get Docker Hash
    runs-on: ubuntu-latest
    outputs:
      hash: ${{ steps.hash.outputs.hash }}
      exists: ${{ steps.exists.outputs.exists }}
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          repository: calyxir/calyx
          ref: ${{ github.sha }}
          fetch-depth: 0
      - name: Get hash
        id: hash
        run: git log -s -n 1 --pretty=format:"%H" -- Dockerfile | echo "hash=$(cat)" >> "$GITHUB_OUTPUT"
      - name: Check if image exists
        id: exists
        run: (docker buildx imagetools inspect ghcr.io/calyxir/calyx:${{ steps.hash.outputs.hash }} &> /dev/null && echo "exists=true" || echo "exists=false") >> "$GITHUB_OUTPUT"

  # Build a docker image for this commit if needed
  docker:
    name: Build and push docker image
    needs: hash
    if: ${{ needs.hash.outputs.exists == 'false' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
      id-token: write
      packages: write
    steps:
      - name: Login to GHCR
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Docker metadata
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ghcr.io/calyxir/calyx
          tags: |
            type=raw,value=${{ needs.hash.outputs.hash }},enable=true
            type=raw,value=latest,enable={{is_default_branch}}
          flavor: latest=false
      - uses: depot/setup-action@v1
      - uses: depot/build-push-action@v1
        with:
          project: zmf9xmg5nl
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

  interpreter:
    name: Test Interpreter
    needs: [docker, hash]
    if: always() && !failure() && !cancelled()
    runs-on: ubuntu-latest
    permissions:
      packages: read
    container: ghcr.io/calyxir/calyx:${{ needs.hash.outputs.hash }}
    steps:
    - name: Copy fud configuration
      run: |
        mkdir -p $HOME/.config
        cp -r /root/.config/* $HOME/.config

    - name: Checkout commit that triggered run
      working-directory: /home/calyx
      run: |
        git init
        git remote add origin https://github.com/calyxir/calyx.git
        git fetch --all
        git checkout -f $GITHUB_SHA
        git clean -fd

    - name: Build
      uses: actions-rs/cargo@v1
      with:
        command: build
        args: --all --manifest-path /home/calyx/interp/Cargo.toml

    - name: Set location of cider binary
      run: |
        fud c stages.interpreter.exec /home/calyx/target/debug/cider

    - name: Runt tests
      working-directory: /home/calyx
      run: |
        # Run the remaining tests
        runt interp -x 'relay' -d -o fail

    - name: Source code tests
      uses: actions-rs/cargo@v1
      with:
        command: test
        args: --manifest-path /home/calyx/interp/Cargo.toml

    - name: Source code doc tests
      uses: actions-rs/cargo@v1
      with:
        command: test
        args: --manifest-path /home/calyx/interp/Cargo.toml --doc

  compiler:
    name: Test Compiler
    needs: [docker, hash]
    if: always() && !failure() && !cancelled()
    runs-on: ubuntu-latest
    permissions:
      packages: read
    container: ghcr.io/calyxir/calyx:${{ needs.hash.outputs.hash }}
    steps:
    - name: Copy fud configuration
      run: |
        mkdir -p $HOME/.config
        cp -r /root/.config/* $HOME/.config

    - name: Checkout commit that triggered run
      working-directory: /home/calyx
      run: |
        git init
        git remote add origin https://github.com/calyxir/calyx.git
        git fetch --all
        git checkout -f $GITHUB_SHA
        git clean -fd

    - name: Install calyx-py & MrXL
      working-directory: /home/calyx
      run: |
        cd calyx-py
        FLIT_ROOT_INSTALL=1 flit install --symlink
        cd -
        cd frontends/mrxl
        FLIT_ROOT_INSTALL=1 flit install --symlink

    - name: Build
      uses: actions-rs/cargo@v1
      with:
        command: build
        args: --manifest-path /home/calyx/Cargo.toml

#    - name: Source code doc tests
#      uses: actions-rs/cargo@v1
#      with:
#        command: test
#        args: --manifest-path /home/calyx/calyx/Cargo.toml --doc lib

    - name: Runt tests
      working-directory: /home/calyx
      run: |
        runt -x 'cocotb' -d -o fail -j 1 --max-futures 5

    # Run these sequentially because they might fail intermittently
    - name: Cocotb tests
      working-directory: /home/calyx
      run: |
        runt -i 'cocotb' -d -o fail -j 1 --max-futures 1

    - name: Run Python Tests
      working-directory: /home/calyx
      run: pytest calyx-py/test/numeric_types.py

  evaluation:
    name: Polybench Integration
    needs: [docker, hash]
    if: always() && !failure() && !cancelled()
    runs-on: ubuntu-latest
    permissions:
      packages: read
    container: ghcr.io/calyxir/calyx:${{ needs.hash.outputs.hash }}
    steps:
    - name: Copy and clean up fud configuration
      run: |
        mkdir -p $HOME/.config
        cp -r /root/.config/* $HOME/.config

    - name: Checkout commit that triggered run
      working-directory: /home/calyx
      run: |
        git init
        git remote add origin https://github.com/calyxir/calyx.git
        git fetch --all
        git checkout -f $GITHUB_SHA
        git clean -fd

    - name: Build
      uses: actions-rs/cargo@v1
      with:
        command: build
        args: --manifest-path /home/calyx/Cargo.toml

    - name: Checkout calyx-evaluation
      working-directory: /home
      run: |
        git clone https://github.com/cucapra/calyx-evaluation.git calyx-evaluation

    - name: Run benchmarks
      working-directory: /home/calyx-evaluation/benchmarks
      run: |
        unset JAVA_TOOL_OPTIONS
        # Run the main benchmarks
        runt -i Correctness -d
        # Run the unrolled benchmarks
        runt -i Unrolled -d
        # Run the interpreter benchmarks
        # runt -i Interpreter -d