Installation
MACE needs a Python 3.10 environment with CHIA installed, Verilator, a RISC-V GCC toolchain, and a patched OpenPiton checkout. The Nix flake provides all of it except OpenPiton, CHIA and MACE included. The conda route uses tools you install yourself. Both routes finish with the OpenPiton checkout and patch steps at the end of this page.
Option 1: Nix flake
Clone MACE and enter the development shell. This needs Nix with flakes enabled.
git clone https://github.com/ranaumarnadeem/MACE.git
cd MACE
nix develop
The shell provides:
Python 3.10 with
pipandvirtualenv.Verilator 5.052, taken from its own nixpkgs pin.
The prebuilt
riscv64-unknown-elfGCC toolchain, release 2026.08.27, exported asRISCVand added toPATH.The system packages OpenPiton’s scripts expect, including
tcsh,dtc,perl,bison,flex, andgnumake.
The host needs one more program the shell cannot provide: csh at /bin/csh.
OpenPiton’s bw_cpp, which sims runs to read its configuration, starts with #!/bin/csh.
On Ubuntu or Debian, sudo apt install tcsh installs it, and the shell warns on entry when it is missing.
OpenSPARC T1 also needs the host’s 32-bit loader: OpenPiton’s SPARC assembler, piton/tools/Linux/x86_64/g_as,2.13.5, is a 32-bit x86 program, and without /lib/ld-linux.so.2 every T1 diag fails with midas compilation error.
On Ubuntu or Debian, sudo apt install libc6-i386 installs the loader.
On first entry the shell creates and activates .venv, then installs CHIA’s v1.0.1 release from PyPI and MACE, editable with its test and eval extras. The eval extra adds Optuna, which the co-design Bayesian search uses.
This needs network access and takes a few minutes.
Later entries reuse .venv and install only a package it lacks, so a first entry interrupted by the network finishes on the next one.
To install CHIA from another source, such as a local checkout, set MACE_CHIA_SOURCE to anything pip install accepts before the first entry:
MACE_CHIA_SOURCE=/path/to/chia nix develop
That copies the checkout into .venv. To edit CHIA while you work, run pip install -e /path/to/chia inside the shell instead.
When PITON_ROOT names a checkout, the shell also checks it for fix 5 of scripts/patch_openpiton.sh and reports whether the checkout is patched.
The nix shell workflow in .github/workflows/nix.yml enters the shell on a clean GitHub runner whenever flake.nix, flake.lock, or pyproject.toml changes.
It checks that the second entry installs nothing, builds and runs a small Verilator model, compiles for Ariane and PicoRV32 with the RISC-V GCC, and runs the tier-0 tests.
To use only the pinned Verilator in another environment, build the flake’s verilator package and put it first on PATH:
VERILATOR_STORE=$(nix build --no-link --print-out-paths .#verilator)
export VERILATOR_ROOT="$VERILATOR_STORE/share/verilator"
export PATH="$VERILATOR_STORE/bin:$PATH"
Option 2: conda and pip
git clone https://github.com/ranaumarnadeem/MACE.git
cd MACE
conda create -n chia_env -c conda-forge --override-channels python=3.10.19
conda activate chia_env
pip install chialoops==1.0.1
pip install -e ".[test]"
MACE requires Python >=3.10,<3.11.
CHIA’s PyPI distribution is named chialoops, and its 1.0.1 wheel holds the same Python files as CHIA’s v1.0.1 git tag, which every result used.
To edit CHIA, clone that tag with git clone --branch v1.0.1 https://github.com/ucb-bar/chia.git and install the clone with pip install -e /path/to/chia in place of the chialoops line.
To run the co-design Bayesian search, install the eval extra as well: pip install -e ".[test,eval]".
Install the toolchain yourself: Verilator, a riscv64-unknown-elf GCC that covers rv64imafdc/lp64d, dtc and python3 for the RV64 boot ROM, and csh at /bin/csh for OpenPiton’s bw_cpp, and for OpenSPARC T1 the 32-bit loader described above.
Set RISCV to the toolchain’s install directory.
For Ariane builds the adapter puts $RISCV/bin first on PATH, and uses $HOME/scratch/riscv_install when RISCV is unset.
PicoRV32 builds get no such PATH entry: they assemble for rv32ima/ilp32 with the riscv64-unknown-elf-gcc that PATH finds after piton_settings.bash puts /usr/bin first.
On Ubuntu 24.04 that compiler comes from the gcc-riscv64-unknown-elf, binutils-riscv64-unknown-elf, and picolibc-riscv64-unknown-elf packages (GCC 13.2), which every PicoRV32 result used; without a compiler on PATH, a PicoRV32 run times out.
Troubleshooting lists Verilator versions that fail with this RTL.
Check the Python install
pytest chia_openpiton/test mace/test -q \
--ignore=chia_openpiton/test/cluster --ignore=mace/test/cluster
These tests need no Ray cluster and no OpenPiton checkout.
mace init checks the toolchain on PATH; see Interactive Shell.
Clone OpenPiton
git clone https://github.com/PrincetonUniversity/openpiton.git ~/openpiton
cd ~/openpiton
git checkout 1c6bfd2
git submodule update --init --recursive piton/design/chip/tile/ariane
Keep the checkout on native Linux storage, such as ~/openpiton inside WSL.
Builds on a Windows-mounted path such as /mnt/c are slow and have shown read-after-write coherency gaps during the boot ROM step.
A checkout holds one build at a time, because OpenPiton writes generated .tmp.v files into its source tree while it builds.
For parallel runs with --piton-root-2, clone a second checkout.
Patch the checkout
bash scripts/patch_openpiton.sh ~/openpiton
With no argument, the script uses PITON_ROOT.
Running it again is safe.
It applies nineteen fixes:
Fix |
File |
Change |
|---|---|---|
1 |
boot ROM |
Adds |
2 |
boot ROM |
Pins |
3 |
git checkout |
Restores git symlinks that a Windows-mounted checkout stored as plain files. |
4 |
|
Converts scripts whose shebang line ends in CRLF to LF line endings. |
5 |
|
Writes |
6 |
|
Lets PicoRV32 boot out of reset without an L15 interrupt. |
7 |
|
Marks the PicoRV32 thread active in the manycore monitor. |
8 |
|
Honors |
9 |
|
Removes a bare |
10 |
|
Widens |
11 |
Ariane |
Polls the multi-hart exit barrier with atomic reads. |
12 |
CVA6 |
Writes one |
13 |
CVA6 |
Stops the L1.5 adapter from dropping cache invalidations under Verilator 5, as upstream cva6#2809 does. |
14 |
|
Installs the Generic Tile from |
15 |
tile and chip templates |
Adds the generic tile as tile type 3. |
16 |
|
Reads the generic tile’s finish register as the good or bad trap. |
17 |
|
Adds |
18 |
|
Adds |
19 |
|
Builds C programs for the generic tile with its runtime. |
The script also adds pico_reset_ut, a standalone unit-test environment for PicoRV32’s reset behavior.
A model built before a fix rebuilds on its next build; Troubleshooting explains when.
Environment Patches describes each fix in detail.