siliconsmith-mcp
Runs every simulator and Python tool inside a single pinned Docker toolchain image (Icarus Verilog, Verilator, Yosys, cocotb, Amaranth, MyHDL, a waveform reader) with no network access, and exposes a toolchain_info tool that verifies Docker and the image work and reports each tool's version.
Drives the Magic/KLayout VLSI layout editor as an external process for the analog/RF track, alongside Xschem, ngspice, netgen and openEMS, for physical design of circuits such as an oscillator/VCO or LNA.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@siliconsmith-mcp create a verilog project called adder and show me its files"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Siliconsmith
Let your AI coding agent design a small chip, with open-source tools only.
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, R4It 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, R4Excerpt 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 |
| 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 --> laterWhen 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 theexplaintool, 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.
statusturns that into a 12-row table (pass, fail, stale, not run, not available) and writes it to the project'sdocs/verification.md. When a file changes, the checks that depend on it turn stale.An owner step. Only you approve the spec, with
siliconsmith approvein 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 |
| Converted to Verilog inside the container. Amaranth cannot infer a latch: an unassigned signal keeps its default. |
MyHDL 0.11 |
| Converted inside the container. Lint and synthesis findings point back to your |
Verilog |
| Used as written. Yosys reads it with |
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, | Done |
Digital | M1: synthesis (M1-0 to M1-2) | sky130 files in the image and | Done |
Digital | M1: equivalence (M1-3) |
| In progress |
Digital | LibreLane layout on sky130 at Tiny Tapeout tile size: GDS, DRC, LVS, timing, reports, layout pictures | Next | |
Digital | Export a submission-ready repo, run Tiny Tapeout's checks, bring-up and shuttle guide, Claude Code plugin | Later | |
Digital | UART, SPI, PWM and NCO/DDS, a tiny CPU, an agent benchmark, a weak-test (mutation) check | Later | |
Digital | GF180 and IHP processes, streamable HTTP transport, arm64 image | Later | |
Analog/RF | 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 | 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 withdocker 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/siliconsmithThis 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-394870a8f4ffIt 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-chipsClaude 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-mcpThen 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 = 1800These 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 |
| 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. |
| Creates a project shaped like a Tiny Tapeout Verilog project: a working starter design, the |
| Lists a project's files and sizes (build output hidden by default). |
| Reads a text file in a project, whole or by line range. |
| Validates |
| Writes a whole cocotb 2.x test file and syntax-checks it. Each test says which requirements it covers ( |
| Writes a whole design file. A Python design is syntax-checked here but only ever run in the container. |
| Turns the design into Verilog, checks its ports against the Tiny Tapeout pins, regenerates the wrapper, and lints with Verilator |
| 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. |
| Shows how chosen signals changed in a kept wave file, as a short table (RTL or gate-level). |
| 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. |
| Shows the validation table and writes it to |
| Answers in plain English from the skills and the glossary. Try |
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 |
| Runs the MCP server over stdio. |
| Prints the validation table and writes |
| You approve |
| 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.
statusshows 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-394870a8f4ffSize (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 |
Start here if you are new to digital design: the loop, what each check proves, approving a spec. | |
42 terms (RTL, latch, netlist, utilization, DRC, ...) in plain English, with RF comparisons. | |
The recorded agent sessions, how they are isolated and verified, and every attempt. | |
Index of all the documentation, with a suggested reading order. | |
Architecture, threat model, validation sequence, and every milestone with its acceptance criteria. | |
Every issue with its acceptance boxes, ticked as they are met. | |
Dev setup, the checks CI runs, license rules and the CLA. | |
How to report a vulnerability privately, and what the sandbox does and does not cover. | |
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 toolscreate_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_verilogADestructive
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
explainARead-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_wavesARead-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_filesARead-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_fileARead-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_testsADestructive
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
synthesizeADestructive
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_rtlADestructive
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_specADestructive
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_testADestructive
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
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Design circuits, simulate and verify embedded firmware, and lay out PCBs with AI agents.
A public board where AI agents design pieces of an open AI inference accelerator on sky130. Submit Verilog and it is linted, synthesised, simulated against hidden vectors, mapped to real standard cells for area, timed for critical path and power, and proven equivalent to a reference. No key, no account, one call. The best verified design gets fabricated.
AI-native programming language and toolchain for accountable, verifiable agent-driven development.
Persistent cloud workspaces for AI agents: run commands, edit files, use git and a browser.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables 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.421 npmApache 2.0
- AlicenseAqualityBmaintenanceEnables 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.615 npmApache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables 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.1MIT
- FlicenseNot gradedqualityAmaintenanceEnables 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.-