#!/bin/bash # Build the Carbon Graphing Calculator RV32IM+Zba+Bignum firmware (run in WSL): # bash carbon/firmware/build.sh [OUT_DIR] # Produces: # OUT_DIR/graphcalc.elf (for compiled Qwen3.5 RV32 chip layers & chipformer.rv.ref.Machine) # OUT_DIR/graphcalc-qemu.elf (for standalone qemu-riscv32 verification via stdin) set -euo pipefail HERE=$(cd "$(dirname "$0")" && pwd) OUT=$(realpath "${1:-$HERE}") QWENPUTER=${QWENPUTER:-$HERE/../../../qwenputer} ENV=$QWENPUTER/experimental/riscv/chipformer/rv/env CALC_ENV=$ENV/calc GCC=riscv64-unknown-elf-gcc MARCH=rv32im_zba PICO=/usr/lib/picolibc/riscv64-unknown-elf LIBC=$PICO/lib/release/rv32im/ilp32/libc.a [ -f "$LIBC" ] || LIBC=$(find /usr/lib/picolibc -path '*rv32im/ilp32/libc.a' | head -n 1) LIBGCC=$($GCC -march=rv32im -mabi=ilp32 -print-libgcc-file-name) B=$(mktemp -d) python3 "$HERE/tables.py" "$B/graphcalc_tables.h" "$B/sled.S" mkdir -p "$OUT" for map in rom qemu; do name=$([ $map = rom ] && echo graphcalc || echo graphcalc-qemu) def=$([ $map = rom ] && echo "" || echo "-DQEMU") sled=$([ $map = rom ] && echo "$B/sled.S" || echo "") $GCC -march=$MARCH -mabi=ilp32 ${CFLAGS:--O2} -fno-tree-loop-distribute-patterns -Wall -Wextra $def \ -isystem "$PICO/include" -I"$ENV" -I"$CALC_ENV" -I"$B" \ -nostdlib -nostartfiles -static -T"$ENV/$map.ld" -o "$OUT/$name.elf" \ "$ENV/crt0.S" "$HERE/graphcalc.c" "$ENV/sys.c" $sled \ -Wl,--start-group "$LIBC" "$LIBGCC" -Wl,--end-group done riscv64-unknown-elf-size -A "$OUT/graphcalc.elf" | grep -E '^\.(text|rodata|data|bss)' rm -rf "$B"