#!/bin/sh # Add or remove cores here. Each entry should be a full FuseSoC VLNV. CORES=" joppeb:wb:wb_mem32 joppeb:wb:wb_gpio joppeb:wb:wb_gpio_banks joppeb:wb:jtag_wb_bridge joppeb:wb:wb_timer " # Add or remove formal tasks here. TASKS=" bmc cover prove " total=0 passed=0 failed=0 passed_runs="" failed_runs="" run_task() { core="$1" task="$2" label="$core [$task]" log_file="" total=$((total + 1)) printf '\n[%d] Running formal %s for %s\n' "$total" "$task" "$core" log_file=$(mktemp /tmp/check_formal.XXXXXX) || exit 2 if \ FUSESOC_CORE="$core" \ FUSESOC_TASK="$task" \ script -qefc 'fusesoc run --target formal "$FUSESOC_CORE" --taskname "$FUSESOC_TASK"' "$log_file" \ >/dev/null 2>&1 then passed=$((passed + 1)) passed_runs="$passed_runs $label" printf 'Result: PASS (%s)\n' "$label" rm -f "$log_file" return 0 else failed=$((failed + 1)) failed_runs="$failed_runs $label" printf 'Result: FAIL (%s)\n' "$label" printf 'Captured log for %s:\n' "$label" cat "$log_file" | grep summary rm -f "$log_file" return 1 fi } for core in $CORES; do for task in $TASKS; do run_task "$core" "$task" done done printf '\nFormal run summary\n' printf ' Total: %d\n' "$total" printf ' Passed: %d\n' "$passed" printf ' Failed: %d\n' "$failed" if [ -n "$passed_runs" ]; then printf '\nPassed runs:\n' printf '%s\n' "$passed_runs" | while IFS= read -r run; do if [ -n "$run" ]; then printf ' - %s\n' "$run" fi done fi if [ -n "$failed_runs" ]; then printf '\nFailed runs:\n' printf '%s\n' "$failed_runs" | while IFS= read -r run; do if [ -n "$run" ]; then printf ' - %s\n' "$run" fi done fi if [ "$failed" -ne 0 ]; then exit 1 fi