#!/usr/bin/env bash
set -euo pipefail
# Generated, non-authoritative build driver. Never edits BOARD_ROOT.
# Required: BOARD_ROOT, RTL_FILELIST, WRAPPER, CHECKER. Paths may be absolute or BOARD_ROOT-relative.
: "${BOARD_ROOT:?}"; : "${RTL_FILELIST:?}"; : "${WRAPPER:?}"; : "${CHECKER:?}"
TOP="${TOP:-bind_8c_board_top}"; LPF="${LPF:-constraints/bind_8c_board.lpf}"
OUT_DIR="${OUT_DIR:-generated/bind_8c_board_build}"; SEED="${SEED:-1}"; FREQ_MHZ="${FREQ_MHZ:-25}"
for t in python3 yosys nextpnr-ecp5 ecppack sha256sum; do command -v "$t" >/dev/null || { echo "ERROR missing tool: $t" >&2; exit 127; }; done
ROOT="$(cd "$BOARD_ROOT" && pwd -P)"; mkdir -p "$OUT_DIR"; OUT="$(cd "$OUT_DIR" && pwd -P)"
abs(){ [[ "$1" = /* ]] && printf '%s\n' "$1" || printf '%s/%s\n' "$ROOT" "$1"; }
FILELIST="$(abs "$RTL_FILELIST")"; LPF_ABS="$(abs "$LPF")"; WRAPPER_ABS="$(abs "$WRAPPER")"; CHECKER_ABS="$(abs "$CHECKER")"
for f in "$FILELIST" "$LPF_ABS" "$WRAPPER_ABS" "$CHECKER_ABS" "$ROOT/locks/BOARD_LOCK.md" "$ROOT/locks/PINMAP.csv" "$ROOT/locks/SYSCONFIG.md"; do [[ -f "$f" ]] || { echo "ERROR missing input: $f" >&2; exit 2; }; done
mapfile -t RTL < <(sed -e 's/#.*$//' -e '/^[[:space:]]*$/d' "$FILELIST"); ((${#RTL[@]})) || { echo 'ERROR empty RTL file list' >&2; exit 2; }
RTL_ABS=(); for f in "${RTL[@]}"; do p="$(abs "$f")"; [[ -f "$p" ]] || { echo "ERROR missing RTL: $p" >&2; exit 2; }; RTL_ABS+=("$p"); done
{
 echo "date_utc=$(date -u +%FT%TZ)"; echo "top=$TOP"; echo 'device=LFE5U-85F'; echo 'package=CABGA381'; echo 'speed=6'; echo "freq_mhz=$FREQ_MHZ"; echo "seed=$SEED"
 yosys -V; nextpnr-ecp5 --version; echo '-- input hashes --'
 sha256sum "$ROOT/locks/BOARD_LOCK.md" "$ROOT/locks/PINMAP.csv" "$ROOT/locks/SYSCONFIG.md" "$LPF_ABS" "$FILELIST" "$WRAPPER_ABS" "$CHECKER_ABS" "${RTL_ABS[@]}"
} | tee "$OUT/tool-and-input-manifest.txt"
PINOUT_ARGS=(); [[ -n "${OFFICIAL_PINOUT_CSV:-}" ]] && PINOUT_ARGS=(--official-pinout "$(abs "$OFFICIAL_PINOUT_CSV")")
python3 "$CHECKER_ABS" --wrapper "$WRAPPER_ABS" --lpf "$LPF_ABS" --pinmap "$ROOT/locks/PINMAP.csv" "${PINOUT_ARGS[@]}" --top "$TOP" | tee "$OUT/static-constraints-check.log"
YS="$OUT/synth.ys"; : > "$YS"; for f in "${RTL_ABS[@]}"; do printf 'read_verilog -sv %s\n' "$f" >> "$YS"; done
printf 'hierarchy -check -top %s\nsynth_ecp5 -top %s -json %s\nstat -top %s\ncheck -assert\n' "$TOP" "$TOP" "$OUT/bind_8c_board.json" "$TOP" >> "$YS"
yosys -l "$OUT/yosys-synthesis.log" "$YS"
nextpnr-ecp5 --85k --package CABGA381 --speed 6 --json "$OUT/bind_8c_board.json" --lpf "$LPF_ABS" --freq "$FREQ_MHZ" --seed "$SEED" --textcfg "$OUT/bind_8c_board.config" --report "$OUT/nextpnr-report.json" 2>&1 | tee "$OUT/nextpnr-place-route.log"
ecppack "$OUT/bind_8c_board.config" "$OUT/bind_8c_board.bit" 2>&1 | tee "$OUT/ecppack.log"
cp -f "$OUT/bind_8c_board.bit" "$OUT/bind_8c_board.bin"; sha256sum "$OUT/bind_8c_board.bit" "$OUT/bind_8c_board.bin" | tee "$OUT/bitstream-sha256.txt"
echo "SUCCESS: $OUT"
