# OpenADA

Watch the 48-second OpenADA introduction: OpenADA is the open interface contract between agent harnesses and EDA tools

▶ Watch the 48-second introduction on YouTube
The open interface between agents and EDA.

### Open Agentic Design Automation **Versioned engineering intent in. Auditable engineering evidence out.** OpenADA is building the open semantic boundary between design agents and deterministic EDA tools. An agent states an engineering intent—netlist a schematic, run a simulation, check DRC, compare LVS—and a driver translates it into the native tool's CLI, API, files, environment, and run policy. OpenADA returns compact evidence for the agent's next decision while the native design files and EDA artifacts remain authoritative. The goal is one reusable contract across open-source EDA backends, not one replacement for them. The same simulation intent can run through ngspice or Xyce; the agent should not have to relearn every command surface and log grammar to understand whether valid evidence was produced. The `0.4.0` preview provides eighteen CLI command families, eight open-source EDA drivers, the versioned `openada.result/v0alpha1` evidence envelope, and nine agent skills. It closes the first native-artifact-to-specification chain with verified ngspice/Xyce series extraction and deterministic coherent single-tone SNR, SINAD, THD, and SFDR measurements, plus closed AC gain, bandwidth, unity-frequency, and phase-margin evidence. An experimental dispatchable `openada.operation/result.osc.measure/v1alpha1` family adds typed oscillator startup/hold verdicts and same-window frequency, amplitude, and power evidence, plus provenance-bound tuning-gain curves, span, and perturbation shift; phase noise remains outside that profile. Packaged profiles are inspectable through the CLI. It also adds a hardened explicit-manifest, local JSON-stdio external-provider runtime for the active circuit-simulation profile. That runtime is intentionally not automatic discovery, a marketplace, or an MCP binding. The experimental testbench-plan family adds a closed, typed measurement graph, deterministic ngspice deck compilation, receipt-bound execution, and a pure oracle comparator for grading measurement accuracy and validity honesty. See [Closed testbench plans](docs/TESTBENCH_PLANS.md) for the implemented subset and the explicit production-PDK limitations. > **Early preview** > > Interfaces and result schemas may change, and driver maturity varies by tool. > OpenADA results are engineering evidence, not a substitute for reviewing the > active PDK, model library, rule deck, tool configuration, or signoff requirements. ## The missing layer Agents can already invoke raw binaries. The hard part is everything around the invocation: discovering installations and PDKs, selecting a deterministic headless mode, preparing tool-specific inputs, interpreting exhaustive logs and exit codes, finding the current-run artifacts, and retaining enough provenance to justify the next engineering decision. OpenADA standardizes that control and evidence boundary. It does **not** introduce a universal circuit format, replace a PDK, or hide native artifacts. Data-layer projects may translate design representations; OpenADA defines how an agent asks for an operation and how a driver reports what actually happened. ## The narrow waist ```text Codex · Claude Code · research agents · design automation │ tool-independent engineering skills │ versioned engineering intent ▼ ┌─────────────────────────────────────┐ │ OpenADA semantic contract │ │ operation · assertion · capability │ │ status · evidence · provenance │ └─────────────────────────────────────┘ │ deterministic, tool-native drivers ┌────────────────┼────────────────┐ ▼ ▼ ▼ circuit EDA layout EDA digital EDA │ │ │ └────────────────┼────────────────┘ ▼ native files, reports, waveforms │ auditable evidence returned ``` The narrow waist is deliberately smaller than any tool CLI. An ngspice, Xyce, KLayout, Netgen, Yosys, OpenROAD, or LibreLane driver may use many native primitives to implement one stable engineering operation. Agent harnesses provide connectivity; OpenADA defines the domain meaning and the evidence threshold. Local CLI is the implemented connection today; MCP, live sessions, and remote jobs are future adapter choices below that meaning. The v0alpha1 driver manifest now supports explicit validated local invocation, but it does not define automatic discovery, a normative MCP binding, or per-feature capability maturity. A future EDA marketplace should catalog providers of exact, conformance-backed capabilities—not raw binaries or prompt bundles. See [Providers, marketplaces, and MCP](docs/PROVIDERS_AND_MCP.md). The [semantic model](docs/SEMANTIC_MODEL.md) specifies this proposed ABI in more detail: operation and assertion profiles, requests, driver capabilities, normalized evidence, artifact lineage, and transactional mutation. OpenADA is not another EDA, an agent harness, or a required container. Local installations on `PATH` are first-class. Reproducible environments such as [IIC-OSIC-TOOLS](https://github.com/iic-jku/IIC-OSIC-TOOLS) can be selected as runtime profiles for demos and conformance testing. ## One intent, different backends The target contract lets a driver compile one operation profile to different native mechanisms: ```text openada.operation/circuit.simulate/v1alpha2 │ ┌────────┴─────────┐ ▼ ▼ ngspice Xyce └────────┬─────────┘ ▼ one normalized evidence contract ``` `circuit.simulate` is the **one** simulation operation, and `openada simulate` the one verb. Its target is a SPICE deck or a published Simra `schematic.artifact.json`, detected by reading the file. Its model source is nothing, a flattened `--models` card file, or an installed PDK bound by name with `--pdk` - and naming the PDK is all a caller ever does about a technology: the model vocabulary, instance prefix, parameter spelling, geometry unit convention, ordered library prelude, corner and any Verilog-A preload come from a reviewed profile. A deck that binds any of that by hand is refused. An artifact declaring several analyses is split into one single-analysis deck per declaration and every one is run. A caller may either let OpenADA inspect the deck's one supported top-level analysis or supply the closed typed flags explicitly: ```bash ./bin/openada simulate conformance/circuit-simulate-v0alpha2/fixtures/rc-transient.cir \ --backend ngspice \ --output-dir /tmp/ngspice-evidence ./bin/openada simulate conformance/circuit-simulate-v0alpha2/fixtures/rc-transient.cir \ --backend xyce \ --output-dir /tmp/xyce-evidence ./bin/openada simulate conformance/circuit-simulate-v0alpha2/fixtures/resistor-divider-dc.cir \ --backend ngspice --analysis dc \ --source-name VSWEEP --source-unit V --start 0 --stop 1 --step 0.25 \ --output-dir /tmp/ngspice-dc-evidence # the same operation, given a published Simra artifact and a technology by name ./bin/openada simulate path/to/schematic.artifact.json \ --backend ngspice --pdk ihp-sg13g2 --pdk-root /foss/pdks \ --output-dir /tmp/pdk-bound-evidence ``` The shared subset remains intentionally small: one self-contained OP, DC, AC, or transient analysis, with no includes, control-language blocks, `.measure`, `.print`, FFT, noise, Monte Carlo, or mixed-analysis deck. The ngspice mapping is structured for OP/DC/AC and workflow-validated for TRAN; Xyce is structured for DC/AC, workflow-validated for TRAN, and explicitly rejects OP as unsupported. The independent verifier parses each backend's native raw evidence and checks analysis-specific facts without requiring identical point counts or native files. Each result still identifies the selected backend and version, native inputs and artifacts, working directory, diagnostics, hashes, and provenance. A passing shared-profile result can now continue without copying waveform numbers out of a log: ```text circuit.simulate/v1alpha2 -> result.series.extract/v1alpha1 -> result.measure/v1alpha2 or result.spectral.measure/v1alpha1 or result.transfer.measure/v1alpha2 -> specification.evaluate/v1alpha1 circuit.simulate/v1alpha2 -> result.series.extract/v1alpha1 -> result.osc.measure/v1alpha1 ``` `openada extract` requires the complete simulation result plus the exact raw artifact path and explicit native-name/output-name/unit/Cartesian-component selectors. The simulation result is passed whole, exactly as `simulate` wrote it; no field is ever stripped to get it accepted. Selectors name *signals* - the sweep axis is always returned as `series.axis` and must not also be selected. The four waveform measurement commands accept the complete passing extraction envelope directly. `openada spectral` implements one deliberately narrow coherent single-tone method; `openada transfer` implements an explicit same-unit Cartesian output-over-input trace with closed crossing semantics; and experimental `openada oscillator` binds differential crossing frequency, peak-to-peak amplitude, and average supply power to one declared late window. It returns typed `sustained`, `never_started`, `collapsed`, `not_sustained`, `multimode`, or `unknown` evidence under `openada.assertion/oscillator.measurement.valid/v1alpha1`, never a fabricated frequency for startup ringing, collapse, or beating. The current `specification.evaluate/v1alpha1` bridge accepts ordinary, spectral, and transfer scalars, not oscillator receipts. See [Measurement methods and standards context](docs/MEASUREMENT_METHODS.md) for their methods, IEEE scope map, and non-conformance boundary. The contract also keeps distinct questions distinct: - `execution.status: completed` means the native process ran. - `engineering.status: pass` means the operation's fixed assertion passed. - A successful simulation establishes valid analysis evidence; it does not by itself establish that the circuit meets its specification. - DRC clean and LVS match do not establish circuit performance or foundry signoff. That shared boundary creates leverage for the whole ecosystem: - Agent and harness authors integrate once instead of teaching every model every EDA command surface. - EDA maintainers contribute one conforming driver instead of separate plugins for every agent framework. - Researchers can swap engines or publish reusable workflows without rewriting invocation, parsing, and evidence plumbing. - Design teams receive reviewable native artifacts and provenance instead of an agent's unbounded log summary. ## Engineering skills above the contract Standardizing EDA semantics removes much of the value from teaching an agent a separate skill for every supported tool. It creates a better place for skills: reusable engineering workflows that sit above the contract and work across backends. The plugin has two deliberately separate layers: - `skills/openada` is the thin execution and evidence adapter. It selects a semantic operation, invokes OpenADA, and interprets the versioned result. - Nine experimental engineering skills sit above it: `review-circuit-simulation`, `characterize-analog-block`, `analyze-feedback-stability`, `analyze-spectral-linearity`, and `assess-pvt-and-yield`, plus `review-rtl-architecture`, `assess-synthesis-and-inference`, `assess-asic-timing`, and `close-layout-incrementally`. They preserve the execution/evidence/measurement/specification boundary, use visual review as a layout diagnostic rather than proof, and inspect advertised operations and feature IDs before planning work. - One separate experimental onboarding coordinator, `bootstrap-asic-project`, freezes PDK, runtime, flow, project intent, and full-chip collateral. An unavailable primitive is reported as not evaluated by default; exploratory native gap work requires explicit authorization and remains labeled outside OpenADA result envelopes. Skills are plugin content, not protocol objects. They may compose several OpenADA operations and evolve faster than the semantic ABI, but they cannot redefine an assertion, promote driver maturity, or turn a native log heuristic into a portable contract. Installing the plugin discovers all shipped skills; the CLI and JSON contracts remain usable by harnesses that do not support skills. See [Engineering skills above OpenADA](docs/ENGINEERING_SKILLS.md) for the layering rule, plugin structure, initial catalog, maturity model, and contribution gate. ## Evidence-backed semantic release Every active semantic command, feature, provider mapping, and preflight route is derived into a closed coverage row. The current catalog contains 16 profiles, 65 features, 33 surfaces, 33 CLI leaves, 14 built-in provider mappings, and 15 provider mappings in total. Audit expansion produces 279 semantic rows: all 159 active rows are `agent-ready`, while 120 historical or experimental rows remain visibly `unverified`. Release CI requires every active row to reach `agent-ready` through one of seven pinned public-design chains: physical DRC/LVS, analog measurements, the full inverter agent workflow, all four ngspice-provider analyses, SAR RTL, and ngspice/Xyce portability, plus ORFS Ibex synthesis and timing. The dispatchable experimental oscillator rows do not borrow that release maturity from adjacent scalar-measurement rows. A release row needs a real native run, independently parsed native artifacts, normalized evidence, an engineering decision, a trustworthy negative, a tamper rejection, and an agent-visible result. Every receipt also binds the exact semantic source and the clean Git tree used during replay. The generated seven-record index is therefore a release ledger, not a maturity label or a list of demonstrations. Run the offline release checks with: ```bash python tools/semantic_refresh_manifests.py python tools/semantic_publish_index.py python tools/verify_semantic_coverage.py --mode release ``` See [Semantic coverage and release gating](docs/SEMANTIC_COVERAGE.md) for the receipt model and the exact contribution sequence. A newly exposed row blocks release until its complete chain exists; it cannot borrow evidence from an adjacent command or be waived through prose. ## What exists and what comes next | Contract layer | Current checkout | Protocol target | |---|---|---| | Agent intent | Eighteen CLI command families and 33 cataloged leaves; eight fixed scoped-preflight assertions; 16 packaged profiles (nine active, three dispatchable experimental, and four historical/retired); validated explicit `openada.request/v0alpha1` circuit-simulation dispatch | Remaining immutable profiles plus catalog/session/remote transport revisions | | Result | Closed `openada.result/v0alpha1` envelope; open operation data | Typed per-operation evidence inside a versioned common envelope | | Drivers | Eight open-source EDA drivers; circuit simulation, strict RTL lint, mapped synthesis, and synthesis-stage timing expose typed evidence at feature-specific maturity | Capability manifests and independently installable drivers | | Portability proof | Analysis-specific `circuit.simulate` requests have pinned native ngspice/Xyce success replay with independently parsed artifacts; the expanded replay does not yet cover every maturity outcome | More operations, open-source backends, runtime environments, and complete outcome corpora | | Engineering skills | One execution skill plus eight experimental capability-gated engineering skills across analog and digital review; one separate experimental ASIC onboarding coordinator | Contributed workflows that compose stable operations across backends | | Workflow composition | Simulation → verified native series extraction → scalar, coherent spectral, closed AC transfer, or experimental typed oscillator measurement → explicit specification evaluation where supported, with digest lineage and the verified extraction envelope retained separately | Integrated noise, corners, statistical campaigns, and richer standard-reviewed methods | | Design mutation | Deliberately outside the current preview | Preconditioned, transactional change sets with declared writes, native diffs, rollback evidence, and source-revision identity | Mutation is part of the long-term design because chip projects need safer change history and collaboration. It must be a stronger contract than “the tool edited a file”: a mutation should name the expected input revision, declare its write set, preserve before/after native evidence, and report commit or rollback separately from engineering validation. The [mutation and versioning proposal](docs/MUTATION_AND_VERSIONING.md) defines a semantic, append-only design-change history with `preview`, `apply`, and `revert`; the write-capable runtime is planned and is not shipped in `0.4.0`. ## Quickstart Prerequisites: Linux or another POSIX environment, Python 3.10+, and at least one supported EDA binary. ```bash git clone https://github.com/simra-tech/OpenADA.git cd OpenADA ./bin/openada doctor ``` Require the tool needed for a task: ```bash ./bin/openada doctor --tool ngspice --require ngspice ``` For a project-scoped first run, state the project root and one intended engineering assertion instead of inventorying every tool or project file: ```bash ./bin/openada doctor --project-root . \ --assertion spice-analysis-evidence-valid ``` Scoped preflight accepts one of eight fixed assertion IDs and selects exactly one smallest semantic operation: | Assertion | Tool inspected | Next operation | |---|---|---| | `schematic-netlist-generated` | Xschem | `netlist` | | `spice-analysis-evidence-valid` | ngspice | `simulate` | | `drc-clean` | KLayout | `drc` | | `lvs-match` | Netgen | `lvs` | | `rtl-structural-check-passes` | Yosys | `rtl-check` | | `rtl-lint-clean` | Verilator | `rtl-lint` | | `asic-netlist-synthesized` | Yosys | `synthesize` | | `timing-constraints-satisfied` | OpenSTA | `timing-analyze` | The result records the canonical root, exact binary/version observation, runtime profile, configured PDK roots, connector startup policy, and one singular target. It does not walk the project or PDK catalogs, evaluate the design assertion, or guess a PDK, rule deck, setup, model library, startup file, or top cell. Those remain explicit inputs to the recommended operation. An empty scoped-preflight `data.pdks` means the catalog was not enumerated; it does not mean that no PDK is installed. Run the included ngspice fixture when ngspice is installed: ```bash ./bin/openada simulate fixtures/smoke/smoke_ngspice.cir \ --output-dir /tmp/openada-smoke ``` For control-mode ngspice decks, explicit startup policy, fresh KLayout report handling, Netgen's report/JSON agreement checks, and the Yosys and Xschem commands, see the [current driver reference](docs/CURRENT_DRIVERS.md). The driver-specific safety rules are part of the preview contract; do not infer them from a raw tool's exit code. After adding the plugin to an agent, a useful execution-layer first-run prompt is: > Use the OpenADA skill in this project. Treat source files and PDKs as > read-only. Choose one intended engineering assertion and run scoped OpenADA > preflight for this project root. If the exact required project collateral is > known, run the one recommended semantic operation into > a task-local evidence directory. Report execution status separately from the > engineering status, then list the selected tool/version, diagnostics, > artifact paths and hashes, and any provenance limitation. Do not substitute > a generic PDK, model library, DRC deck, LVS setup, or top cell to get a pass. For a blank ASIC workspace where the PDK or compatible runtime is not already frozen, start with the dedicated coordinator instead: > Use `$openada:bootstrap-asic-project` to define whether this is a core or a > full-chip candidate, inspect bounded configured resources, choose one coherent > open-PDK/toolchain stack, and freeze `.openada/bootstrap-manifest.json` before > an expensive run. Prefer an already-present pinned runtime over downloading > unrelated tools. Stage-gate RTL, function, synthesis, implementation, timing, > padframe, DRC, LVS, and handoff; keep unsupported native work and foundry > acceptance outside OpenADA claims. To install the Python entry point from the current checkout: ```bash python -m pip install . openada doctor ``` Until the `v0.4.0` release tag is published, a remote source install can track the reviewed default branch with `python -m pip install 'git+https://github.com/simra-tech/OpenADA.git@main'`. For a reproducible deployment, replace `main` with a reviewed 40-character commit and use the matching plugin ref. Do not request the not-yet-published `v0.4.0` tag. ## Add the agent skills The plugin ships every directory under `skills/`: the OpenADA execution skill and focused engineering skills above it. The same packages are shared across harnesses. Agent marketplaces install those skill files, but do not install the Python package or its `jsonschema>=4.18` runtime dependency. Install the Python entry point from the same OpenADA release using the command above before asking the plugin to execute or inspect semantic profiles. The bundled `bin/openada` launcher remains useful from a source/plugin checkout whose Python dependencies are already available; schema-backed commands otherwise return a structured missing-dependency diagnostic instead of a traceback (profile/provider validation uses `provider.validation.unavailable`). ### Claude Code Inside Claude Code: ```text /plugin marketplace add https://github.com/simra-tech/OpenADA.git /plugin install openada@openada /reload-plugins ``` While `v0.4.0` is unreleased, the command above follows the repository's default branch; replace it with a reviewed commit when the client supports a Git ref suffix. Start a new conversation after installation so the bundled skills are loaded. Restart Claude Code instead if the plugin is not visible after reloading. Invoke the plugin skills as `/openada:openada`, `/openada:bootstrap-asic-project`, `/openada:characterize-analog-block`, or another shipped `/openada:` command. For local development without installation: ```bash claude --plugin-dir . ``` ### Codex Add the Git marketplace: ```bash codex plugin marketplace add simra-tech/OpenADA --ref main codex plugin add openada@openada ``` Replace `main` with a reviewed commit or published release tag when pinning a deployment, then start a new Codex session. `/plugins` shows the configured marketplace and installed plugin in the CLI. Invoke the plugin skills as `$openada:openada`, `$openada:bootstrap-asic-project`, `$openada:characterize-analog-block`, or another shipped `$openada:` skill. For a skill-only Codex CLI setup, first install the `openada` Python entry point as shown above. Then install every shipped skill directory into the user skill directory: ```bash mkdir -p ~/.agents/skills for skill in skills/*; do cp -R "$skill" ~/.agents/skills/ done ``` ### Agent Plugins standard clients The repository root is a conformant [Agent Plugins](https://agent-plugins.org/) 1.0.0 package: `plugin.json` is the manifest and `skills/` holds the Agent Skills. Any client that implements the standard can install OpenADA directly from this repository with its own plugin mechanism — no OpenADA-specific adapter is involved. The `.claude-plugin/`, `.codex-plugin/`, and `.agents/` directories remain for clients with their own pre-standard discovery and carry the same skill tree and metadata. ### Other harnesses Make `bin/openada` available to the agent's terminal and register the desired `skills/*/SKILL.md` packages using the harness's Agent Skills mechanism. Start with `skills/openada`, then add the engineering workflows relevant to the project. The CLI is the portable contract; the harness adapter should stay thin. ### Hermes An OpenADA release produces two Python wheels from one immutable repository revision: the evidence-attested `openada` runtime and the separate `openada-hermes-plugin` adapter under `integrations/hermes`. Install both at the same version. The adapter depends on that exact `openada` version and exposes a thin `hermes_agent.plugins` entry point named `openada`. Hermes discovers the adapter on its next startup and registers every shipped skill as an advertised, read-only `openada:` skill. Add `openada` to `plugins.enabled` when the host uses an explicit plugin allowlist, then start a new conversation so its stable skill index includes the plugin. The adapter wheel copies the canonical root `skills/` tree at build time. It does not register model tools, wrap native EDA executables, or change the OpenADA CLI contract. Production must build and install both wheels from the same reviewed commit rather than mixing runtime and skill revisions. ## Preview operations | Operation | Native tool | Maturity | Preview behavior | |---|---|---|---| | `doctor` | runtime | preview | Discover capabilities, or preflight one project assertion without catalog inventory | | `netlist` | Xschem | workflow-validated | Produce a SPICE netlist and fail on recognized unresolved symbols | | `simulate` (legacy default) | ngspice | workflow-validated | Stream wrapper raw files in batch mode, or validate declared deck-owned raw/`wrdata` outputs in control mode | | `simulate --backend ngspice` | ngspice | structured OP/DC/AC; workflow-validated TRAN | Run one self-contained OP, DC, AC, or transient analysis and emit typed `circuit.simulate` facts | | `simulate --backend xyce` | Xyce | structured DC/AC; workflow-validated TRAN | Run one self-contained DC, AC, or transient analysis; OP is explicitly unsupported | | `extract` | deterministic Spice3 kernel | structured alpha | Verify one exact passing shared-simulation artifact and project explicit real/imaginary native vector components into a canonical real series | | `measure` | deterministic OpenADA kernel | structured alpha | Derive one typed scalar (including a least-squares signal-versus-axis slope) from a canonical-digest-bound normalized real inline series using a closed algorithm kind | | `spectral` | deterministic OpenADA kernel | structured alpha | Derive coherent single-tone SNR, SINAD, signed-dB THD, or SFDR from one fully declared hashed bin partition | | `transfer` | deterministic OpenADA kernel | structured alpha | Derive first-positive-frequency gain, dB magnitude at one declared in-domain frequency, unique falling −3 dB bandwidth, unity-gain frequency, or explicitly declared negative-feedback phase margin; retain the complete magnitude/phase trace | | `oscillator` | deterministic OpenADA kernel | experimental structured alpha | Return a typed startup/hold/QC verdict and same-window differential frequency, amplitude, and supply power, or compose receipt-bound local nonuniform-central-difference Kvco, span, and perturbation-shift results; phase noise is excluded | | `evaluate` | deterministic OpenADA kernel | structured alpha | Read a complete ordinary, spectral, or transfer measurement envelope, then compare its typed scalar with exact-unit bounds and explicit condition bindings | | `testbench-plan validate/compile/run/compare` | deterministic OpenADA kernels + ngspice | experimental | Validate a closed measurement graph, compile supported typed analyses, execute exhaustive receipt-bound conditions, or score emitted observables against an oracle without simulation inside the comparator | | `profile list/show` | installed contracts | preview | List packaged operation/assertion/feature IDs or emit one complete schema-bearing operation profile from any working directory | | `provider validate/list/invoke` | external local CLI | structured runtime boundary | Validate one explicit v0alpha1 manifest/request and invoke one active `circuit.simulate/v1alpha2` JSON-stdio wait capability; snapshot canonical request inputs within fixed target/configuration/aggregate bounds, and enforce status/evidence truth, artifact identity, zero transport exit, and descendant cleanup | | `drc` | KLayout | workflow-validated | Validate one exact fresh deck-owned `.lyrdb`, weighted violations, and bounded transcript evidence | | `drc-compare` | retained KLayout evidence | diagnostic preview | Compare bounded markers across distinct layout revisions or correlate differently named rules from different decks on hash-identical GDS content | | `drc-review` | KLayout | diagnostic preview | Render hashed full-layout and ranked hierarchical cluster PNGs from one validated existing `.lyrdb` and its exact GDS; does not re-run or replace DRC | | `lvs` | Netgen | workflow-validated | Validate agreeing fresh native report/JSON plus a clean bounded setup transcript | | `rtl-check` | Yosys | structured alpha | Elaborate SystemVerilog/Verilog and run structural checks | | `rtl-lint` | Verilator | workflow-validated | Apply a strict no-warning/no-error SystemVerilog lint assertion with hashed source/include evidence | | `rtl-test` | Icarus Verilog or Verilator | structured alpha | Compile, elaborate, and run one declared self-checking HDL top with bounded stage and artifact evidence | | `synthesize` | Yosys + ABC | workflow-validated | Bind the external ABC executable by version and digest, retain generic inference facts, and validate a complete flattened Liberty-mapped ASIC netlist | | `timing-analyze` | OpenSTA | workflow-validated | Validate constraints and report one-corner setup/hold WNS, TNS, and bounded critical paths in seconds | Magic, OpenROAD, Surelog, standalone slang, OpenVAF, Qucs-S, GTKWave, and LibreLane are currently discoverable but do not yet have a stable structured operation in the preview contract. Xschem-to-ngspice simulation, KLayout DRC, and Netgen LVS pass pinned public IHP inverter conformance cases. Strict Verilator lint passes the public IHP SAR RTL, and Yosys/Slang synthesis plus OpenSTA timing are replayed on pinned ORFS Ibex RTL and Nangate45 collateral. The roadmap preserves the boundary between this synthesis-stage evidence and physical or signoff closure. See [the current result contract](docs/CONTRACT.md), [semantic model](docs/SEMANTIC_MODEL.md), [engineering skills](docs/ENGINEERING_SKILLS.md), [request and driver protocol](docs/DRIVER_PROTOCOL.md), [providers, marketplaces, and MCP](docs/PROVIDERS_AND_MCP.md), [measurement methods and standards](docs/MEASUREMENT_METHODS.md), [closed testbench plans](docs/TESTBENCH_PLANS.md), [compatibility policy](docs/COMPATIBILITY.md), [release history](CHANGELOG.md), [driver status and roadmap](docs/ROADMAP.md), and [contribution guide](CONTRIBUTING.md). Driver contributors can check captured results with the [small conformance kit](conformance/driver-kit/README.md). ## Reproduce the native ngspice + Xyce proof The smallest portability replay uses the model-free RC fixture already in this repository and the pinned linux/amd64 IIC-OSIC-TOOLS `2026.06` image. Both EDA runs are network-disabled with a read-only repository mount and fresh evidence directory: ```bash python3 conformance/circuit-simulate-v0alpha2/run.py \ --evidence-dir /tmp/openada-circuit-simulate-evidence python3 conformance/circuit-simulate-v0alpha2/verify.py \ /tmp/openada-circuit-simulate-evidence ``` The replay requires the exact pinned image to exist locally and never pulls it during EDA execution. See the [circuit-simulation conformance guide](conformance/circuit-simulate-v0alpha2/README.md) for the image identity, assertion boundary, and independent checks. ## Reproduce the pinned DRC + LVS case The first public conformance workflow fetches an exact Apache-2.0 IHP AnalogAcademy revision and runs KLayout DRC plus Netgen LVS in the pinned linux/amd64 IIC-OSIC-TOOLS image. Setup may use the network; both EDA operations run with networking disabled, read-only source/design mounts, and a fresh writable evidence directory. ```bash python3 -m venv .venv . .venv/bin/activate python -m pip install -e '.[conformance]' python3 conformance/ihp-inverter/setup.py python3 conformance/ihp-inverter/run.py \ --evidence-dir /tmp/openada-ihp-inverter-evidence python3 conformance/ihp-inverter/verify.py \ /tmp/openada-ihp-inverter-evidence ``` See the [IHP inverter conformance guide](conformance/ihp-inverter/README.md) for the pinned image/design identities, expected assertions, and storage needs. No PDK, third-party design, or generated evidence is vendored into OpenADA. The separate [IHP Xschem-to-ngspice guide](conformance/ihp-inverter-ngspice/README.md) replays schematic netlisting and the explicit deck-owned raw contract, then independently checks finite transient waveforms, supply bounds, and inverter logic behavior: ```bash python3 conformance/ihp-inverter-ngspice/setup.py python3 conformance/ihp-inverter-ngspice/run.py \ --evidence-dir /tmp/openada-ihp-ngspice-evidence python3 conformance/ihp-inverter-ngspice/verify.py \ /tmp/openada-ihp-ngspice-evidence ``` ## Evaluate the agent contract without inventing a benchmark The [paired agent evaluation kit](evaluation/paired-agent/README.md) freezes an identical IHP inverter task for a raw terminal condition and an OpenADA condition. It preassigns interleaved pairs, reduces agent events to content-free action/status buckets, independently parses the native netlist, log, and binary waveform, seals assembled rows with a campaign Ed25519 key, accounts for every planned outcome, and reports metric-specific eligibility. The campaign binds the exact harness, adapter, runtime binaries, canonical task bytes, and a per-file treatment-bundle manifest. Both conditions may receive the neutral evaluation task and submission schema; the raw condition excludes the OpenADA distribution, CLI, package, result schema, skill, repository, prior output, and injected context. The kit contains no trial results and makes no claim that OpenADA is faster or more reliable. Its primary outcome is verified artifact completeness, not a claim that a trusted observer saw the native processes generate those bytes. The first version is offline and bring-your-own-trace. It does not launch a model or handle credentials. A claim-eligible live adapter must keep provider credentials in an API-connected supervisor while brokering EDA actions into a separate network-disabled executor; running an agent on this development host cannot prove that the raw condition lacks access to OpenADA. The offline contract requires one attempt per assignment plus explicit dispatch, shared monotonic-clock, complete-pair, condition-presence, and isolation observations; missing or conflicting rows refuse comparison but remain in condition-level intention-to-treat accounting. Missing provider request telemetry remains unknown and cannot be repurposed as a latency or API retry measurement, while independently verified engineering outcomes retain their own evidence status. Plans declare the fixed `hmac-sha256-fisher-yates-v1` randomization algorithm. The publisher signs both sanitized trial rows and the final summary; the summary contains deterministic plan-ordered commitments to every supplied plan-bound row. The public verifier's summary-only mode authenticates that publisher output but cannot recompute its claims. Full verification requires the exact campaign, plan, and every sealed sanitized row and recomputes the summary semantics. Public comparison claims should publish that complete sanitized bundle despite its residual pair/condition linkability; raw event captures and supervisor records remain restricted. Each campaign also freezes a fresh random clock-domain nonce and requires first-dispatch-zero, campaign-relative monotonic values; public rows must never carry host-boot or reusable machine clock identities. Sanitized rows still carry residual fingerprints such as native artifact hashes, relative timing, usage totals, and pair membership. ## Engineering invariants - Native EDA files remain authoritative. - Commands execute as argv vectors without a shell. - Process completion never implies DRC clean, LVS match, or simulation convergence. - Returned text and violation lists are bounded; full artifacts remain on disk. - Inputs and generated artifacts carry SHA-256 hashes. - A container profile may improve reproducibility, but it is not the architecture. ## Project status The initial implementation consolidates reusable open-source EDA integration work. OpenADA remains harness-neutral and open source. No institutional collaboration or endorsement is implied by support for a tool, PDK, design, or runtime profile. ## License MIT. See [LICENSE](LICENSE)