# Architecture: how dau-build composes work from Hydra config This page explains *why* dau-build is built the way it is — declarative specs, typed `ccflow` models, and a Hydra config tree — and what that structure buys you. It is background reading. For the commands themselves, see the [command reference](../reference/commands.md); for step-by-step goals, the [how-to guides](../how-to/run-a-build.md). ## The shape of the tool dau-build turns a declarative description of an FPGA build into concrete artifacts: generated SystemVerilog, artifact bundles, backend handoff manifests, Tcl scripts, and command plans. Everything the tool does is expressed as a typed `ccflow.CallableModel` — a `SimulateTask`, a `SynthesizeTask`, a `BuildVivadoArtifactsTask`, and so on — and every one of those models is *built from configuration*, not hand-constructed in Python. That configuration is a Hydra config tree under `dau_build/config`. Running the tool is therefore always the same two-phase act: **compose** a config from groups and overrides, then **instantiate and run** the model it describes. The CLIs are thin front-ends over that one idea. The reason for this design is that an FPGA build has many axes that vary independently — which task, which board, which backend, which spec — and those axes are reused across dozens of operations. Encoding each axis as a Hydra config group lets any combination compose without a bespoke argument parser per command, and lets a downstream package add new options without editing dau-build. ## Config groups are directories Each subdirectory of `dau_build/config` is a Hydra config group: `task`, `step`, `spec`, `board`, `backend`, `platform`, `design`, `callable`. Selecting an option is an override `=