Skip to main content
Glama
siliconsmith-mcp

siliconsmith-mcp

by RFingAdam

Siliconsmith

Let your AI coding agent design a small chip, with open-source tools only.

ci image License: AGPL-3.0-or-later Python 3.11+

See it work · How it works · Status · Quick start · Tools · Honest limits · Docs

Describe a small chip in one sentence. Your agent writes a spec, tests and the design, runs the tests on two simulators, maps the design to sky130 standard cells (a gate netlist) and runs the same tests on those gates. You read the spec and approve it.

Status (0.1.0.dev0, early): today a design goes from a one-line idea to a tested sky130 gate netlist. It cannot make a chip yet: layout (M2) and the Tiny Tapeout export (M3) are not built, so there is nothing to submit. When they land, you will submit and pay on the Tiny Tapeout site yourself; Siliconsmith never does. Full status.

What is this?

Siliconsmith is an MCP server: a small program that an AI coding agent (Claude Code, Cursor, Codex) starts on your machine and talks to, which gives the agent new tools. Here, those tools design digital chips. The agent writes the design (the RTL, a description of the chip's logic) in Amaranth, MyHDL or Verilog, tests it with cocotb (testbenches written in Python), and checks it on the Icarus and Verilator simulators. Then synthesis maps it onto standard cells (ready-made gates and flip-flops) from the open SkyWater 130 nm process (sky130).

The target is Tiny Tapeout, an educational project that makes it cheaper and easier to get a small design made on a real chip. Many projects share one chip, and each project gets a tile: a small slice of the chip (a 1x1 tile holds roughly a thousand logic gates) with 8 inputs (ui_in), 8 outputs (uo_out) and 8 bidirectional pins (uio), plus a clock and a reset.

Every chip tool runs inside one pinned Docker image, so you install only Python and Docker.

New to digital design? Start with the beginner guide. It is written for engineers who know RF and analog hardware and are new to digital design. Unfamiliar word (RTL, lint, netlist, DRC, LVS)? The glossary explains 42 terms in plain English.

Related MCP server: @zesun33/mcp-openroad

See it work

This is a recorded headless Claude Code session from 2026-11-12. It was made before synthesis landed, so it stops at simulation. It starts in an empty folder with exactly one prompt and only Siliconsmith's tools: no shell, no file editor, no web.

8-bit counter on uo_out, count enable on ui_in[0]

The agent wrote a spec, tests and a Verilog design, then ran the tests. The first run failed:

run_tests failed on icarus: 1 passed, 2 failed, 0 skipped (3 tests).
First failure: test_count_and_hold (test/test.py:36)
  assertion: assert v == 5, f"expected 5 got {v}"
  expected: 5
  actual:   4
  message: AssertionError: expected 5 got 4
Other failing tests: test_wrap
Requirements covered by passing tests: R1
Not covered yet: R2, R3, R4

It found the cause, fixed it, and ran the tests again:

run_tests ok on icarus: 3 passed, 0 failed, 0 skipped (3 tests).
Passed: test_reset, test_count_and_hold, test_wrap
Requirements covered by passing tests: R1, R2, R3, R4

Excerpt from docs/demos/verilog-20261112-1.md, lines 220-234 and 328-336. The same failure and fix show up on Verilator.

Notice what the fix was. The bug was in the agent's own test: it read uo_out on the clock edge, before the register had updated. The agent moved the read to 1 ns after each edge and left the design alone. An agent can always write a test that agrees with its own mistake. That is why every demo is also checked with a frozen reference test (tests/reference/test_counter_reference.py) that the agent never saw. It passed on both simulators for all three design languages:

Design language

Turns

run_tests calls

Cost (USD)

Minutes

Agent's tests (Icarus, Verilator)

Reference test (Icarus, Verilator)

Verilog

14

4

0.14

1.0

pass, pass

pass, pass

MyHDL

12

2

0.12

0.8

pass, pass

pass, pass

Amaranth

12

2

0.12

0.8

pass, pass

pass, pass

Recorded with claude-sonnet-5-5 and Claude Code 2.1.322 at commit ec7ed2d (branch m0-6-skills-demo, squash-merged as d52be04 in #60). The MyHDL and Amaranth rows are marked +dirty: the recorder saw uncommitted or untracked files in the checkout (git status --porcelain) and does not record which. It is one counter, one model and one day. Every attempt is listed, and a transcript is never edited. Read the transcripts and how they are verified.

How it works

flowchart TB
    subgraph write ["Step 1: the agent writes"]
        direction LR
        spec["write_spec<br/>pins, clock,<br/>requirements"] --> tests["write_test<br/>cocotb tests,<br/>before the design"] --> rtl["write_rtl<br/>Amaranth, MyHDL<br/>or Verilog"]
    end
    subgraph check ["Step 2: the tools check"]
        direction LR
        sim["run_tests<br/>lint, then Icarus<br/>and Verilator"] --> synth["synthesize<br/>sky130 gates,<br/>area, size"] --> gl["run_tests gl=true<br/>same tests<br/>on the gates"] --> status["status<br/>validation table;<br/>you approve the spec"]
    end
    subgraph later ["Not built yet"]
        direction LR
        equiv["check_equivalence<br/>(M1-3, in progress)"] --> layout["layout, DRC, LVS,<br/>timing (M2)"] --> tt["Tiny Tapeout export;<br/>you submit (M3)"]
    end
    write --> check --> later

When a check fails, the agent gets the expected and actual values (and a waveform when it asks for one) and goes back to step 1. The parts:

  • An MCP server that runs on your machine and talks to the agent over stdin and stdout, so nothing listens on the network. Every tool answers with a short plain-English summary, structured details (lint findings with file and line, expected and actual values) and hints for the next step. A bad argument comes back as a tool error that says what to do.

  • Skills: five playbooks (chip-design-loop, tt-rules, amaranth-style, myhdl-style, cocotb2-tests) and a 42-term plain-English glossary. The agent reads them through the explain tool, so the guidance travels with the server.

  • A pinned toolchain image with Icarus Verilog, Verilator, Yosys, cocotb, Amaranth, MyHDL and the sky130 cell library files. Same versions on every machine and in CI. See Toolchain image.

  • A hardened container runner. Code the agent writes (Amaranth or MyHDL designs, cocotb tests) never runs on your machine directly, and the server never imports it. Each call gets a fresh container with no network, a read-only root filesystem, all Linux capabilities dropped, and limits on memory (4 GB), CPUs (2) and processes (512). Your design and tests are mounted read-only; only the project's build/ folder is writable.

  • A validation ledger. Each check records what it ran against. status turns that into a 12-row table (pass, fail, stale, not run, not available) and writes it to the project's docs/verification.md. When a file changes, the checks that depend on it turn stale.

  • An owner step. Only you approve the spec, with siliconsmith approve in a terminal. No tool can do it.

The design is always a core module on the Tiny Tapeout pins (clk, rst_n, ena, ui_in[7:0], uio_in[7:0] in; uo_out[7:0], uio_out[7:0], uio_oe[7:0] out). Siliconsmith generates the tt_um_<name> wrapper around it. Pick one front-end per project. Here that means the language the design is written in, not an RF front end:

Front-end

You (or the agent) write

Notes

Amaranth 0.5

hdl/<name>.py

Converted to Verilog inside the container. Amaranth cannot infer a latch: an unassigned signal keeps its default.

MyHDL 0.11

hdl/<name>.py

Converted inside the container. Lint and synthesis findings point back to your hdl/ function and line.

Verilog

src/<name>.v

Used as written. Yosys reads it with read_verilog -sv.

Status

Version 0.1.0.dev0: early, with no releases yet.

Track

Milestone

What it brings

State

Digital

M0: simulation

Projects, spec, tests, design, Verilog emit and lint, cocotb on Icarus and Verilator, waveforms, validation ledger, explain, owner approval, three recorded demos

Done

Digital

M1: synthesis (M1-0 to M1-2)

sky130 files in the image and tt.lock (M1-0), synthesize (M1-1), gate-level simulation (M1-2)

Done

Digital

M1: equivalence (M1-3)

check_equivalence: prove the gate netlist matches the RTL as Yosys reads it

In progress

Digital

M2: layout

LibreLane layout on sky130 at Tiny Tapeout tile size: GDS, DRC, LVS, timing, reports, layout pictures

Next

Digital

M3: Tiny Tapeout ready

Export a submission-ready repo, run Tiny Tapeout's checks, bring-up and shuttle guide, Claude Code plugin

Later

Digital

M4: examples

UART, SPI, PWM and NCO/DDS, a tiny CPU, an agent benchmark, a weak-test (mutation) check

Later

Digital

M5: optional

GF180 and IHP processes, streamable HTTP transport, arm64 image

Later

Analog/RF

A0 to A4

Xschem and ngspice first, then layout and LVS, then an oscillator, a VCO and an LNA, openEMS for passives, Tiny Tapeout analog export

Later

Acoustic

S0 to S2

SAW/BAW resonator and filter models (BVD, Mason), FEM experiments. Simulation only.

Later, research

None of the analog or acoustic tools are in the image yet. There are no dates. The milestone details and acceptance criteria are in PLAN.md and ISSUES.md, and the GitHub issues track what has landed.

Quick start

You need:

  • Linux on x86-64, the only platform CI and the demos have used. Native Windows does not work (the server uses POSIX-only file calls); macOS, WSL2 and arm64 are untested, and the image is amd64-only until M5-3.

  • Docker that your own user can run without sudo (check with docker run --rm hello-world).

  • Python 3.11 or newer, and uv (or pip).

  • An MCP-capable agent: Claude Code, Cursor or Codex. The recorded demos use Claude Code; the Cursor and Codex snippets below are checked by tests, but no recorded session uses them yet.

1. Install

Siliconsmith is not on PyPI yet. Install it from GitHub:

uv tool install git+https://github.com/RFingAdam/siliconsmith

This puts siliconsmith and siliconsmith-mcp on your PATH (uv usually uses ~/.local/bin). From a clone, uv tool install . does the same. With plain pip, run pip install -e . inside a virtual environment, and either activate it before you start the agent or put the full path to siliconsmith-mcp in the command field below.

2. Pull the toolchain image

docker pull ghcr.io/rfingadam/siliconsmith-toolchain:ctx-394870a8f4ff

It is about 258 MB to download. The server never pulls the image by itself. If the image is missing, each tool that needs it stops and prints the exact docker pull command for the image it expects.

3. Connect your agent

Make an empty folder for your chip projects. The steps below point your agent at it:

mkdir my-chips && cd my-chips

Claude Code sets CLAUDE_PROJECT_DIR to your project folder (here my-chips) when it starts the server, so that folder becomes the root. Put this in a .mcp.json file in my-chips:

{
  "mcpServers": {
    "siliconsmith": {
      "command": "siliconsmith-mcp",
      "args": []
    }
  }
}

Or add the same thing with one command:

claude mcp add --scope project siliconsmith -- siliconsmith-mcp

Then run claude in my-chips. It asks you to approve the project-scoped server the first time. Run /mcp to check that siliconsmith is connected.

Create .cursor/mcp.json in my-chips and open that folder in Cursor. Cursor replaces ${workspaceFolder} with the folder that holds .cursor/mcp.json:

{
  "mcpServers": {
    "siliconsmith": {
      "command": "siliconsmith-mcp",
      "args": ["--root", "${workspaceFolder}"]
    }
  }
}

Add this to ~/.codex/config.toml, and change the path to your my-chips folder. Codex's default per-call time limit is shorter than synthesize's 15-minute limit and the 25-minute worst case for a gate-level run, so the snippet raises tool_timeout_sec. It also gives the server 30 seconds to start:

[mcp_servers.siliconsmith]
command = "siliconsmith-mcp"
args = ["--root", "/path/to/your/chip-projects"]
startup_timeout_sec = 30
tool_timeout_sec = 1800

These snippets are tested: tests/test_readme_snippets.py launches the Claude Code and Cursor configurations over stdio, checks the tool list, and parses the Codex one.

Where your projects go. The server keeps all projects in one root folder, one subfolder per project. It takes the root from --root, then the SILICONSMITH_ROOT environment variable, then CLAUDE_PROJECT_DIR, then the folder it was started in. It refuses / and your home folder unless you pass them with --root on purpose. --default-frontend amaranth|myhdl|verilog lets create_project skip the frontend argument.

4. Try it

Check the setup first: ask the agent to "call Siliconsmith's toolchain_info". It reports Docker, the image and every tool's version.

Then ask for a chip:

Use Siliconsmith to design an 8-bit counter on uo_out with a count enable on ui_in[0]. Use Verilog.

The agent should start with explain('chip-design-loop'), write the spec and tests before the design, and finish with status. Then it is your turn: read the project's spec.yaml, and if it says what you want, run siliconsmith approve <project folder>.

Tools

The server offers 13 tools today.

Tool

What it does

toolchain_info

Checks that Docker and the toolchain image work, and reports every tool's version and the sky130 files. Call it first when anything fails with a toolchain error.

create_project

Creates a project shaped like a Tiny Tapeout Verilog project: a working starter design, the tt_um_<name> wrapper, spec.yaml, info.yaml, a cocotb test and its Makefile.

list_files

Lists a project's files and sizes (build output hidden by default).

read_file

Reads a text file in a project, whole or by line range.

write_spec

Validates spec.yaml (clock, tiles, reset, pins, requirements R1, R2, ..., open questions) and saves it only if it is valid. Copies the clock and tile size into Tiny Tapeout's config files.

write_test

Writes a whole cocotb 2.x test file and syntax-checks it. Each test says which requirements it covers (Covers: R1).

write_rtl

Writes a whole design file. A Python design is syntax-checked here but only ever run in the container.

emit_verilog

Turns the design into Verilog, checks its ports against the Tiny Tapeout pins, regenerates the wrapper, and lints with Verilator -Wall and Yosys (latches, multiple drivers and logic loops are errors).

run_tests

Emits, lints, then runs the cocotb tests on Icarus or Verilator. A failure gives the test, file and line, the assertion, and expected vs actual. waves=true keeps a wave file. gl=true (Icarus) runs the same tests on the sky130 gates and, when one fails, names the first clock cycle where the pins differ from the RTL run.

inspect_waves

Shows how chosen signals changed in a kept wave file, as a short table (RTL or gate-level).

synthesize

Builds the design from sky130 standard cells with Yosys, following the LibreLane 3.0.14 recipe that Tiny Tapeout uses. Reports cells (flip-flops vs logic), area, top cell types and an estimated tile utilization. Catches loops, double drivers, undriven outputs, cells Tiny Tapeout forbids, and designs far too big for the tile.

status

Shows the validation table and writes it to docs/verification.md. It only reads the ledger; it never runs a simulation.

explain

Answers in plain English from the skills and the glossary. Try explain('chip-design-loop'), explain('latch') or explain('list').

Coming next: check_equivalence (M1-3, in progress). It will prove that the gate netlist does what the RTL does as Yosys reads it, and refuse the common constructs that a simulator and synthesis read differently. Gate-level simulation stays the check against simulation behaviour.

Command line. Two commands come with the install:

Command

What it does

siliconsmith-mcp [--root DIR] [--default-frontend FE]

Runs the MCP server over stdio. siliconsmith server is the same thing.

siliconsmith status <project folder>

Prints the validation table and writes docs/verification.md.

siliconsmith approve <project folder>

You approve spec.yaml. It shows the requirements, asks you to type approve, and records your git user.name and the spec's hash in the ledger. It needs a terminal.

siliconsmith --version

Prints the version.

Environment variables: SILICONSMITH_IMAGE (use a different toolchain image), SILICONSMITH_ROOT and CLAUDE_PROJECT_DIR (the project root, see above).

Honest limits

Siliconsmith is built to tell you what has been checked and what has not.

  • Siliconsmith never reports a check it did not run. status shows only what the ledger recorded for the current files. A test run with a filter never counts as a full run, and a changed file turns its checks stale.

  • A green table means the agent's own tests pass. It does not mean the tests are strong. The demos use a held-out reference test for exactly that reason, and a weak-test (mutation) check is planned for M4.

  • Passing simulation is not working silicon. Utilization is an estimate until layout (M2), and nothing checks timing before then.

  • Approval is an honest-use convention, not a security boundary. It stops an honest agent from approving its own work, and the ledger shows who approved which version of the spec. An agent with its own shell could still run the command.

  • The checks catch honest mistakes, not a hostile design. The container protects your machine from the code it runs. It does not stop a design written to cheat from faking its own test result. See SECURITY.md.

  • Nothing is ever ordered, submitted or paid for automatically. When M3 lands, Siliconsmith will export a submission-ready repository. You submit it and pay for it on the Tiny Tapeout website yourself.

  • No 2.4 GHz radio. A working 2.4 GHz Bluetooth radio is not realistic on a Tiny Tapeout analog tile (a judgement from the specs, not a measurement). The analog track aims at small blocks: an oscillator through layout, and a VCO and an LNA at least in simulation.

  • No SAW/BAW fab. The acoustic track is design and simulation only. There is no open fab path for these devices in this project.

  • Open-source tools only. No commercial EDA, not even as an option.

Toolchain image

Every simulator and chip tool runs inside one Docker image. It has no network access when Siliconsmith runs it.

ghcr.io/rfingadam/siliconsmith-toolchain:ctx-394870a8f4ff

Size (linux/amd64 only): about 816 MB unpacked, and about 258 MB to download. An arm64 image is planned (M5-3).

The unpacked figure is the sum of the layer sizes that docker history --human=false lists. docker images can show more (about 1.07 GB on a Docker that uses the containerd image store), because it counts disk use.

What is inside: Icarus Verilog 12, Verilator 5.046, Yosys 0.62 (the YoWASP build, the same Yosys version as LibreLane 3.0.14), cocotb 2.1.0, pytest, Amaranth 0.5.10, MyHDL 0.11.52, a waveform reader (pywellen), and ten sky130 files, about 17 MB: the typical-corner cell library, the sky130_fd_sc_hd cell models and LibreLane's synthesis maps. They come from the open_pdks release that Tiny Tapeout uses (pinned in tt.lock) and are checked against a pinned sha256 at build time. toolchain_info reports them as pdk. The full PDK and the layout tools are not in the image yet; they come with M2.

The tag is a hash of the docker/ folder, so it changes whenever anything in docker/ changes. Each Siliconsmith version asks for exactly the image built from its own docker/ folder (a test keeps the two in sync), so after you update Siliconsmith you may need to pull a new tag. To use a different image, set SILICONSMITH_IMAGE for the server, and pass the same name to siliconsmith status --image, because the image is part of what makes a result stale.

To build it yourself instead: docker build -t ghcr.io/rfingadam/siliconsmith-toolchain:ctx-394870a8f4ff docker/

Documentation

Document

What it is for

docs/beginner-guide.md

Start here if you are new to digital design: the loop, what each check proves, approving a spec.

docs/glossary.md

42 terms (RTL, latch, netlist, utilization, DRC, ...) in plain English, with RF comparisons.

docs/demos/README.md

The recorded agent sessions, how they are isolated and verified, and every attempt.

docs/README.md

Index of all the documentation, with a suggested reading order.

PLAN.md

Architecture, threat model, validation sequence, and every milestone with its acceptance criteria.

ISSUES.md

Every issue with its acceptance boxes, ticked as they are met.

CONTRIBUTING.md

Dev setup, the checks CI runs, license rules and the CLA.

SECURITY.md

How to report a vulnerability privately, and what the sandbox does and does not cover.

THIRD_PARTY_LICENSES.md

Every open-source tool used or planned, with its verified license.

Contributing

Issues and pull requests are welcome. Read CONTRIBUTING.md first: one issue per pull request, CI green before merge, and outside contributors agree to the CLA. If you are an AI agent, or you are implementing a milestone, also read CLAUDE.md and PLAN.md.

License

Siliconsmith's code is licensed under AGPL-3.0-or-later. Your chip design stays yours: what you and your agent write belongs to you, and the templates, the skills and every file Siliconsmith generates in your project (starter files, the wrapper, emitted Verilog, reports) are Apache-2.0. The extra permission that grants this is in OUTPUT-EXCEPTION.md. Versions up to commit f752b50 were published under Apache-2.0, and those copies stay under Apache-2.0. AGPL-3.0-or-later applies from the relicense commit on. A commercial license is available from the maintainer for uses the AGPL does not fit; open an issue to ask. See NOTICE for attributions.

The chip tools have their own licenses, some of them GPL or LGPL. GPL tools (such as Icarus Verilog) only ever run as separate processes; Siliconsmith never imports or links them. That keeps the sandbox model and the option of a commercial license. Amaranth, MyHDL (LGPL-2.1) and cocotb are used as unmodified Python libraries inside the toolchain container. No tool's source or binaries are in this repository. synthesize follows LibreLane's Apache-2.0 synthesis recipe, credited in NOTICE. THIRD_PARTY_LICENSES.md lists each tool, and the toolchain image carries their license texts.

Acknowledgements

Siliconsmith stands on the work of these open-source projects: Tiny Tapeout; the SkyWater sky130 open PDK from SkyWater and Google; open_pdks and ciel; Yosys and its YoWASP build; Icarus Verilog; Verilator; cocotb; Amaranth; MyHDL; LibreLane, whose synthesis recipe synthesize follows; wellen, the waveform reader; and the MCP Python SDK. Later milestones plan to use OpenROAD, Magic, KLayout, netgen, Xschem, ngspice, openEMS and Elmer FEM.

Available Tools

13 tools
create_projectA

Create a new chip project folder // shaped like a Tiny Tapeout Verilog project, with a working starter design, a Tiny Tapeout wrapper (tt_um_) and a cocotb test stub.

Arguments: name (lowercase letters, digits and underscores, starting with a letter, at most 31 characters; it becomes the Verilog module name), frontend ('amaranth', 'myhdl' or 'verilog'; optional when the server has a default), author (goes into file headers and info.yaml), description (one line), title (optional, defaults to the name).

The design you write is the 'core' module named . Its ports use the Tiny Tapeout pin names: clk, rst_n (active low), ena, ui_in[7:0], uio_in[7:0] in; uo_out[7:0], uio_out[7:0], uio_oe[7:0] out. Amaranth and MyHDL projects keep their source in hdl/.py; Verilog projects keep it in src/.v. Every other tool takes the project name as its first argument.

Inputs: name (required), author (required), description (required), title, +1 more. Returns: ok, details, summary, artifacts, +1 more

emit_verilogA
Destructive

Turn the project's design into Verilog and check it. For Amaranth and MyHDL this runs your hdl/.py in a container and writes the generated core to src/.v; a Verilog project's src/.v is used as it is. The tool then checks the core's ports against the Tiny Tapeout pins (names, directions, widths), regenerates the tt_um_ wrapper in src/project.v, and lints everything with Verilator (-Wall; latches are errors) and Yosys check -assert (multiple drivers and logic loops are errors). ok is false for a Python error (with file and line), bad ports, or any lint finding; details.lint lists {severity, code, file, line, col, msg}. Takes a few seconds to a minute; the first call is the slowest.

Inputs: project (required). Returns: ok, details, summary, artifacts, +1 more

explainA
Read-only

Explain a topic in plain English from the packaged skills and glossary. topic can be a skill name ('chip-design-loop', 'tt-rules', 'amaranth-style', 'myhdl-style', 'cocotb2-tests': you get the overview and the list of sections), a section heading, a glossary term ('latch', 'slack', 'GDS'), or a few keywords. The best match comes back with up to 4 other suggestions. 'list' or an empty topic returns the catalogue. An unknown topic is not an error; it returns suggestions. The summary is the start of the text; details.text has all of it and details.source says where it came from. Start with explain('chip-design-loop').

Inputs: topic. Returns: ok, details, summary, artifacts, +1 more

inspect_wavesA
Read-only

Show how signals changed in a wave file that run_tests kept (run it with waves=True; the result gives the path, build/waves//tb.fst; a gate-level run, gl=True, keeps its own in build/waves/icarus-gl/tb.fst, where the signal names are those of the sky130 netlist). signals are names like 'uo_out' or 'user_project.uo_out' (a suffix of the full hierarchical name; the match nearest the top wins). start_ns and end_ns limit the time range. The table has one row per time where a requested signal changed: hex for buses, 0/1 for bits, x/z kept. At most max_rows rows come back (default 50, hard limit 1000); a note says how many more there are. details.rows has every returned row as strings.

Inputs: path (required), project (required), signals (required), end_ns, +2 more. Returns: ok, details, summary, artifacts, +1 more

list_filesA
Read-only

List the files in a project (paths relative to the project folder, with sizes in bytes). Symlinks and dotfiles are never listed. Build output (build/, sim_build/) is hidden unless include_build is true. At most 500 files are returned.

Inputs: project (required), include_build. Returns: ok, details, summary, artifacts, +1 more

read_fileA
Read-only

Read a text file from a project. path is relative to the project folder, for example 'test/test.py' or 'hdl/counter.py'. The text is returned in details.content. Give start_line and end_line (1-based, inclusive) to read part of a file. At most 64 KiB of text is returned per call; when a file is longer the result is cut and next_hints says which lines to ask for next. Binary files are refused.

Inputs: path (required), project (required), end_line, start_line. Returns: ok, details, summary, artifacts, +1 more

run_testsA
Destructive

Run the project's cocotb tests (every test/test*.py) against the design on Icarus Verilog or Verilator. It first does what emit_verilog does (elaborate, check ports, regenerate the wrapper, lint); only if that is ok does it simulate the Tiny Tapeout testbench test/tb.v. ok is true only if at least one test ran (skipped tests do not count) and none failed. The summary names the first failing test, its file:line, the assertion, and expected vs actual. test_filter is a regex that cocotb searches in '.' (for example 'test.test_wraps_at_255$'); a filtered run never counts as a full run. waves=True keeps a wave file under build/waves/ for inspect_waves. details.tests lists every test with outcome and the requirement ids it covers; details.coverage says which spec.yaml requirements have a passing test. The first Verilator run takes about half a minute; later runs reuse the build.

gl=True runs the tests at gate level (Icarus only; with Verilator it is an error). The tool first does what synthesize does, with the same checks and the same time limits (a design that fails stops there, and so does one far over the size budget; the summary says gate-level simulation could not run. A design only slightly too big is simulated, with a note), then runs the SAME test files on the resulting sky130 netlist, with the cell models of the chip library (a netlist has no RTL names: a test may only use the pins of tb, such as uo_out, and not internal signals). This catches what RTL simulation cannot: logic that behaves differently once it is real gates, such as a missing reset or an uninitialized flip-flop. The summary's first line says "Gate-level simulation" so it is never mistaken for an RTL run. A gate-level run never changes the RTL results or the RTL wave files: its waves are kept apart in build/waves/icarus-gl/ (inspect_waves reads them). It can take up to 25 minutes in the worst case; a small design takes seconds to a minute. details.gl holds the netlist hash.

Inputs: project (required), simulator (required), gl, waves, +1 more. Returns: ok, details, summary, artifacts, +1 more

statusA

Show the validation sequence for the project: for each step (spec valid, spec approved, Verilog check, simulation on Icarus and on Verilator, requirement coverage, synthesis, and the later milestones) whether it is pass, fail, stale (a file it depends on changed since it ran), not run, or not available. It also writes the same table to docs/verification.md. It reads the ledger that emit_verilog, run_tests and synthesize keep; it never runs a simulation. Approving the spec is the owner's step on the command line; no tool can do it, so do not try.

Inputs: project (required). Returns: ok, details, summary, artifacts, +1 more

synthesizeA
Destructive

Turn the design into real chip gates and say how big it is. Synthesis is the step where a program (Yosys) replaces your RTL with the small ready-made logic gates and flip-flops of the sky130 chip library, the same way Tiny Tapeout's own flow does. The tool first runs the same checks as emit_verilog (a lint problem stops it, with file and line), then synthesizes with the clock from spec.yaml recorded as Tiny Tapeout does (this recipe optimizes for small area, so the clock does not change the gates; timing is checked at layout). The summary gives the number of cells (flip-flops, which store bits, and logic gates), the total cell area in um^2, the most used cell types, and the estimated utilization: how much of your tile's usable area the cells would fill. Utilization is an ESTIMATE; real placement (layout, milestone M2) gives the real number, and it needs headroom (above 90% is risky, above 100% will not fit). The tile size comes from tiles in spec.yaml (default 1x1); a design far too big for it is stopped early with a "too big" message and what to do: make the design smaller, or ask the owner about a bigger tile (it costs money, so the owner decides). ok is false for a lint or Yosys error, a combinational loop, a signal driven twice, an undriven output, a cell that Tiny Tapeout does not allow, a design that is too big, or a time-out (900 s). A latch you wrote on purpose (always_latch) is reported as a warning with file and line. A clock above 66 MHz also warns: Tiny Tapeout's pins cannot go that fast. The netlist is saved in build/synth/ (a convenience copy of the latest run that wrote one; the ledger's netlist_sha256 records what was synthesized). Usually takes seconds to a minute.

Inputs: project (required). Returns: ok, details, summary, artifacts, +1 more

toolchain_infoA

Check that Docker and the toolchain image work, and report the version of every tool.

Call this first if anything else fails with a toolchain error.

Inputs: no named parameters. Returns: ok, details, summary, artifacts, +1 more

write_rtlA
Destructive

Write a design source file or a doc, replacing the whole file. Always send the full new content: diffs and patches are not accepted. Allowed paths: hdl//*.py for Amaranth and MyHDL projects (the entry file is hdl/.py); src/.v for Verilog projects; docs//*.md (except the generated docs/verification.md). Tests go through write_test instead. Content must be UTF-8 text of at most 256 KiB. A .py file gets a syntax check (it is never run); the file is saved even when the check fails, and then ok is false with file:line:col and the message.

Inputs: path (required), content (required), project (required). Returns: ok, details, summary, artifacts, +1 more

write_specA
Destructive

Check and save spec.yaml, the short spec of the chip. It is the only source of the clock, the pin meanings and the requirements, and the owner reads it to judge what you plan to build. Send the full file as YAML text in content; it is saved exactly as you wrote it (comments are kept) only if it is valid, and an invalid file is not saved.

Format (version 1; unknown keys are rejected): version: 1 # optional, must be 1 title: "One line name" summary: "What the chip does and why, in plain English." clock_hz: 10000000 # required, integer > 0 (Tiny Tapeout pins manage up to ~66 MHz) tiles: "1x1" # optional, default "1x1"; allowed: 1x1, 1x2, 2x2, 3x2, 3x4, 4x2, 4x4, 5x4, 6x2, 6x4, 8x2, 8x4 reset: "rst_n, active-low, synchronous" # plain English; write 'none' if there is no reset pins: # optional; bit numbers 0-7 as integer keys ui: {0: "enable", 1: "mode"} # inputs ui_in[bit] uo: {0: "count bit 0"} # outputs uo_out[bit] uio: {} # bidirectional uio[bit] requirements: # at least one - id: R1 # R followed by a number, unique: R1, R2, R10 text: "The counter adds 1 each clock while enable is high." limit: {min: 0, typ: 1, max: 2, unit: "V"} # optional; at least one of min/typ/max open_questions: # optional; write your assumptions here - "Assumed 10 MHz; please confirm."

Tiles are the chip area rented on Tiny Tapeout, and bigger tiles cost the owner money: keep "1x1" unless the design cannot fit. Never change tiles yourself: ask the owner, or in a headless run with nobody to ask, keep the current tile and write the assumption to open_questions. A bad tiles value lists the allowed ones.

After a valid save the tool copies the clock and tiles into src/config.json and info.yaml for you (you cannot edit those files); a clock above 66 MHz is saved with a warning.

On errors ok is false and details.errors lists {path, message} (for example pins.ui.8 or requirements[1].id). Fix them and call again. Then write tests whose docstrings say 'Covers: R1' for the requirement ids.

Inputs: content (required), project (required). Returns: ok, details, summary, artifacts, +1 more

write_testA
Destructive

Write a cocotb 2.x test file under test/ (test/**/*.py, but not conftest.py), replacing the whole file. Always send the full new content. The starter test is test/test.py. cocotb 2.x idioms: Clock(dut.clk, 10, unit="ns"), int(dut.x.value), cocotb.start_soon. Give each test a docstring line such as 'Covers: R1' naming the requirement ids from spec.yaml. Content must be UTF-8 text of at most 256 KiB. The file gets a syntax check (it is never run here); it is saved even when the check fails, and then ok is false with file:line:col and the message.

Inputs: path (required), content (required), project (required). Returns: ok, details, summary, artifacts, +1 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 13 tools

    Disambiguation4/5

    Most tools target a clearly distinct stage of the chip design loop (spec, RTL, emit, sim, synth, waves, status) and the write_* family is separated by file kind. The main soft spots are emit_verilog vs. synthesize (both run the same lint/check pass) and run_tests(gl=True) vs. synthesize (the gate-level path re-runs synthesis), though the descriptions explicitly clarify the boundaries.

    Naming Consistency4/5

    The dominant pattern is verb_noun (create_project, list_files, read_file, write_rtl, write_test, write_spec, emit_verilog, run_tests, inspect_waves), which is predictable. The deviations are bare single words (synthesize, status, explain, toolchain_info) — still unambiguous but not a uniform pattern.

    Tool Count5/5

    13 tools is comfortably in the well-scoped range, and each maps to a real step (scaffold, edit, verify, synthesize, simulate, inspect, report). No obvious filler or redundant duplicates.

    Completeness4/5

    The full design loop is covered: project creation, file read/write, spec validation, Verilog emission and lint, RTL and gate-level simulation, synthesis sizing, wave inspection, and a status/coverage ledger. Minor gaps exist — no delete/rename/move file operation, no build-artifact listing without a flag, and spec approval and layout/PnR are intentionally outside the tool surface.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables AI coding agents and IDEs to lint, compile, syntax-check, and simulate Verilog/SystemVerilog designs through structured, token-efficient MCP tools with isolated containerized toolchains.
      4
      21 npm
      Apache 2.0
    • A
      license
      A
      quality
      B
      maintenance
      Enables AI coding agents and IDEs to execute ASIC physical design flows including floorplanning, placement, clock tree synthesis, routing, and static timing analysis through the OpenROAD engine, returning concise low-token JSON metrics.
      6
      15 npm
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables local AI coding assistants to operate remote Linux EDA clusters over persistent SSH/SCP for digital IC design, simulation, formal property verification, UVM testbench generation, static linting, and Git-backed workspace synchronization.
      1
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables AI agents such as Claude Code, Cursor, and Codex to safely drive a locally installed Xilinx Vivado through 32 tools covering sessions, synthesis, implementation, timing, CDC, XDC, IP, waveforms, and device programming. Includes structured timing evidence with baseline comparison, offline VCD queries, evidence-driven workflow prompts, and one-command environment self-checks.
      -