abc-flow replaces hand-managed Vivado projects with small .abc text
files: each module declares its dependencies next to its source, and the
abc launcher resolves the graph and feeds it to a backend.
- Plain text, git-friendly — the whole build is versionable text;
Vivado's binary, un-diffable
.xpris regenerated on demand, not committed. - Dependency-driven
.abcfiles —importbetween modules;@-anchored, repo-root-relative paths; files colocated with the HDL they describe, so a module and its.abcmove and reuse together. - One CLI, multiple backends — automated Vivado project generation and
headless
synth/impl/bitgen, plus experimental Vivado-free sim via XSim and Verilator. - Hierarchical XDC — board/timing constraints scoped per module.
- Xilinx IP — IP-core support and interop on the Vivado / XSim paths.
- Tcl underneath —
.abcfiles are Tcl, so the flow stays flexible and scriptable.
# foo/foo.abc — describes one module
import ../core/cross_reset # an instantiated submodule
import ../packages : wb_package math_pkg # packages this module uses
read_sv foo.sv # this module's sourceabc -gui foo/test/foo_tb.abc # generate + open the Vivado project
abc -sim foo/test/foo_tb.abc # or run the testbench headlessPaths are relative to the .abc file's directory. A : after a path uses
it as a shared prefix for the rest of the list (../packages : wb_package math_pkg → ../packages/wb_package + ../packages/math_pkg). A leading @
anchors at your git repo root.
- Python 3 — runs the
abclauncher. - Git —
.abcfiles must live in a git repo (enables@-anchored, repo-root-relative imports). - At least one backend:
- Vivado / XSim flows: Vivado on
$PATH(or discoverable viaABC_VIVADO_ROOTS). The examples here use 2024.1. - Verilator flow:
verilator≥ 4.220 on$PATH. Vivado not required.
- Vivado / XSim flows: Vivado on
Both paths leave abc on your PATH.
Release tarball (no git required):
# Linux / macOS — replace v0.1.0 with the latest tag from the Releases page
curl -fsSL https://github.com/accemic/abc-flow/releases/download/v0.1.0/abc-flow-v0.1.0.tar.gz \
| tar xz -C ~/.local/share
echo 'export PATH="$HOME/.local/share/abc-flow/abc:$PATH"' >> ~/.bashrc
source ~/.bashrcGit clone (best if you want to follow master):
git clone https://github.com/accemic/abc-flow.git ~/abc-flow
echo 'export PATH="$HOME/abc-flow/abc:$PATH"' >> ~/.bashrc
source ~/.bashrcWindows: download the .zip from the same release (or clone), extract, and
add the extracted abc\ directory to your PATH. Confirm with abc -h.
The example/ directory holds a complete ALU + testbench. The
implementation alu_top.abc is just its source:
read_sv alu_top.svThe testbench alu_tb.abc pulls it in as a dependency:
import alu_top
read_sim alu_tb.sv
simulate alu_tbGenerate and open the Vivado project:
abc -gui example/alu_tb.abcOr run the testbench headless under any backend:
abc -sim example/alu_tb.abc # Vivado (default)
abc --sim-backend xsim -sim example/alu_tb.abc # direct XSim
abc --sim-backend verilator -sim example/alu_tb.abc # Verilator (no Vivado)The full .abc command reference lives in doc/abc.md.
Set project-wide defaults in a .abc.config file at your git repo root:
vivado_sim=2024.1
vivado_impl=2024.1
# Additional Vivado install roots (same semantics as $ABC_VIVADO_ROOTS)
vivado_roots=/opt/Xilinx/Vivado:/tools/Xilinx/Vivado
# Default sim backend (vivado | xsim | verilator); --sim-backend overrides it.
# Applies only to -sim; -synth/-impl/-bitgen/-gui always use Vivado.
sim_backend=vivadoTo add machine-local Vivado search roots without touching the repo:
export ABC_VIVADO_ROOTS=/opt/Xilinx/Vivado:/tools/Xilinx/VivadoTo force a specific version for a single invocation — useful with -gui,
which on its own doesn't indicate a sim or implementation flow:
abc --vivado-version 2024.1 -gui myproj.abc- XSim and Verilator backends are experimental. Vivado is the default and most complete path.
- Git is required —
.abcfiles must live in a git repository for@-anchored imports to resolve. (This may relax in the future.) .abcfiles are executable Tcl.abcsources them to resolve dependencies, so running it executes the project's.abcfiles as code — treat them like any build script and don't runabcinside a repository you don't trust.- The FPGA part shortcuts (
-11eg,-7ev, …) and the default part are convenience aliases for the authors' boards; any part can be set per project. Seeabc -h.
ISC — see LICENSE. © 2023-2026 Accemic Technologies GmbH.
Authors: Accemic Technologies GmbH — Thomas Preußer, Albert Schulz.
Vivado, Xilinx, and the Xilinx Vivado Simulator (XSim) are trademarks of Advanced Micro Devices, Inc. Python is a registered trademark of the Python Software Foundation. Git is a registered trademark of Software Freedom Conservancy. All other product and company names are the trademarks or registered trademarks of their respective owners. Their use here is for identification only and does not imply any affiliation with or endorsement by them.
