HW Design-Space Agent

/adoption

For a hardware team

Would this help a company that develops its own hardware? Where it helps, where it does not, how it would be deployed and what it would need next.

The short answer

As it stands, this is a narrow, verified and budgeted tool for one kind of block, not a general hardware assistant. Its strongest parts for a team are the method around the LLM: numbers that come only from tested code, checks at every level of the ladder, and an evaluation that scores the agent against plain optimisers on the exact answer. The LLM's own measured contribution is modest. A general-purpose coding agent is far more flexible but gives none of those guarantees by itself. The pattern this page recommends is the two together, the general agent as the front end and this graph as a tool it calls: a proposal, not something built.

Where it helps

Where it does not, and its limits

Against a general-purpose agent

It trades flexibility for trust. A general-purpose agent, such as a coding agent working across a repository and a toolchain, can write RTL and drive tools ad hoc on any block; this graph does one job with guarantees. The two are complements, described here by capability, not by benchmark.

AspectThis graphA general-purpose agent aloneBoth together proposal
ScopeOne IP block (CORDIC sin/cos), four architecture families from a fixed registry, two targets (Artix-7, sky130).Any block and any language: it can read a datasheet, write new RTL and drive whatever tools it is given.The general agent writes a new block's golden model, generator and cost model; the graph explores it.
Where numbers come fromTested code, each number labelled exact, estimate, measured or simulated; the LLM's schemas have no field for one.From the tools it chooses to run; its own text can restate, round or misremember them.Numbers about designs only ever come from the graph.
VerificationAt every level: golden model, two RTL simulators, formal proofs, gate-level simulation, measured back-annotation.As good as the tests it writes and runs, run by run.The graph's checks gate whatever the agent generates.
EvaluationA/B against NSGA-II and random search, scored on the exhaustive ground truth, losses published.No built-in ground truth to score it against.The same A/B decides whether the LLM earns its place.
Cost and budgetMeasured per run and per spec; evaluation budgets and round caps enforced in code.Open-ended sessions; cost depends on the task.The agent calls a budgeted tool, not an open loop.
RepeatabilityCheckpointed and replayable: all 60 M2 runs replay identically.A free-form session is hard to replay exactly.Replays and traces stay with the graph.
A new kind of blockReal engineering per block: golden model, generator, cost model, calibration.Can start at once.The agent does the per-block work; people review it.

The recommended pattern proposal: expose the graph as a tool, for example run_dse(spec) over the Model Context Protocol, with its budget, its gates and its labelled report. The general-purpose agent turns an engineer's request into a spec, calls the tool, reads the report, and writes the new families, generators and cost models the graph does not yet have, which the graph's checks then verify.

How it would be deployed proposal

A container next to the company's EDA farm. Jobs go to the farm's existing scheduler (Slurm or LSF) and draw licences from its licence server. The LLM is an open-weights model on an on-prem server (vLLM or Ollama), or an enterprise API under the company's data terms. The step-through below marks what exists today.

Loading the animation…

PartIn the repository todayProposed for a team
Triggeringthe CLI, hw-dse run / hw-dse resumea spec change on a pull request starts a run; the report lands on the PR
Front endnone (the CLI)a general-purpose agent calling run_dse as an MCP tool
LLMproviders for hosted APIs and Ollama; recorded runs via OpenRouteropen weights on an on-prem server (vLLM or Ollama), or an enterprise API
Statea SQLite checkpointer per run; an in-memory LangGraph Store for a fleetPostgres for the checkpointer and a shared Store
Human approvaltwo interrupt() gates, answered in the CLIthe same gates in a web UI or chat
ToolsVerilator, Icarus, SymbiYosys, Yosys, nextpnr, OpenSTA; Vivado on one machinejobs on the farm's scheduler, licences from its licence server; commercial flows behind adapters
Budgets and auditevaluation budgets and round caps in code; the eval harness stops before a spend cap; every LLM call traced, keys redactedsecrets in a vault; trace logs in the company's log store
Driftmeasured, arms compared within a sessionmodel snapshots pinned; a reference set re-run each session

How it could be improved

Done after M4

The local Vivado run: high_precision's m=8 misses 50 MSPS at its own 20 ns clock (49.88 post-synthesis, 48.31 post-route), so m=6 stays; the per-family-class path factor was rejected by its pre-set rule; the first measured FPGA power (vectorless) ranks designs as the index does (Spearman 0.982) but is off by 20.6% RMS. (evidence: results)

Next, in the repository's own words

  1. A routed timing scale and real switching activity on the FPGA. The local Vivado runs are done: high_precision misses 50 MSPS at its own 20 ns clock with m=8 (49.88 MSPS post-synthesis, 48.31 post-route), so the per-family-class path factor, which predicted it feasible (52.5), was rejected by its pre-set rule even though it cut Vivado Fmax leave-one-out from 12.5% to 7.4%. The winner m=6 loses 17% to routing (65.39 → 53.96 MSPS), which no model here sees, and the measured power is vectorless. Next: a post-route timing calibration of its own, and power from simulated switching activity.
  2. Place and route on sky130 (OpenROAD, from its prebuilt release packages pinned by URL and SHA-256, or a container image pinned by digest) for the held-out designs, to see whether the ASIC model's Fmax error is the wire-load model or the structure.
  3. An ASIC measure-and-re-explore loop: synthesise the selected designs, re-select under the measured numbers, as the FPGA path's L5 loop does. Then decide whether to refit with an unrolled_k chain term, disclosed, keeping the held-out points held out.
  4. Multi-lane and polyphase families, so that the 400 MSPS spec has an answer.
  5. Treat provider drift as a first-class measurement: pin model snapshots where the provider allows it, and re-run a fixed reference set each session before comparing arms.

From docs/WRITEUP.md at 80415c6, “What I would do next”. Plans, with no results.

What a hardware team would add proposal

  • A plug-in registry API, so a team can add IP blocks (FIR, FFT, NTT, …) with their golden models, generators and cost models.
  • Adapters for commercial flows behind the same measured-points schema, so their numbers carry the same provenance.
  • Real place and route, and activity-based power from simulated switching (SAIF/VCD) instead of vectorless or toggle-rate power.
  • Composition of several blocks into one system spec, explored together.
  • Multi-fidelity or Bayesian search as a further baseline, so the LLM is measured against a stronger optimiser too.
  • The graph as an MCP tool, run_dse, for a general-purpose agent to call.

Everything above about this agent is true of HW_Design_Space_Agent at 80415c6; the deployment and the improvements are proposals. See the results, the write-up and the project record.