Open Platform · vibe-ic v1.4.67 + mcp-eda v1.0.0
Manifest-driven auto-registration. Drop a folder, edit a manifest, restart the server — no core code changes. Five extension surfaces, one open contract.
Plugin-centric: one install of the vibe-ic plugin (v1.4.67) brings the whole flow — it bundles and auto-registers the MCP server (48 EDA + 7 device + 1 health tools) alongside 60 skills + 918 deterministic programs, the IP catalog, and the benchmark harness. The marketplace is the open-platform layer around it: partners add sibling plugins, devices, IP, and community backlog through five manifest-driven surfaces.
Lab instruments — scopes, FPGAs, testers, cameras, logic analyzers, signal generators, power supplies, DMMs. Drop a folder, the server auto-registers every tool you declare.
mcp/src/devices/
└── <category>/
└── <vendor-device>/
├── manifest.json # required
├── driver.py # required (stdin JSON / stdout JSON)
├── README.md # required
├── udev/*.rules # optional
└── tests/ # recommended
# 13 canonical categories:
fpga · scope · tester · camera ·
logic-analyzer · fgen · dcpwr ·
acpwr · dmm · specan · rfsiggen ·
swtch · pwrmeter · counter
{
"vendor": "keysight",
"device_class": "oscilloscope",
"ivi_class": "IviScope",
"supported_platforms": ["linux"],
"permissions": ["require_group:plugdev"],
"tools": [{
"name": "device_scope_capture",
"description": "Capture a window from the scope.",
"driver": "driver.py",
"tool_mode": "capture",
"mode": "hw",
"timeout_sec": 60,
"schema": {
"channel": {"type":"integer","default":4},
"span_ms": {"type":"number","default":50},
"trigger": {"type":"string","enum":["rising","falling"]}
}
}],
"resources": [/* optional MCP resources */]
}
mcp/src/devices/_registry.js at server start.Software tools — Yosys, OpenROAD, KLayout, SymbiYosys, OpenSTA, ngspice, Magic, Verilator, iverilog, xschem, Xyce, cocotb, Fault, Netgen. Core tools execute inside the IIC-OSIC-TOOLS Docker image (TU Wien).
mcp/src/index.js
├── server.tool("eda_lint", ...)
├── server.tool("eda_synth", ...)
├── server.tool("eda_simulate", ...)
├── server.tool("eda_formal", ...)
├── server.tool("eda_pnr", ...)
├── server.tool("eda_gds", ...)
├── server.tool("eda_sta", ...)
├── server.tool("eda_drc_klayout", ...)
├── server.tool("eda_lvs", ...)
├── server.tool("eda_ir_drop", ...)
├── server.tool("eda_spice", ...)
├── server.tool("eda_fpga_compile", ...)
└── ... (48 total)
# Single Docker image
hpretl/iic-osic-tools:latest
# Don't fork core. Use the same manifest
# contract as a device — but pointing at
# your own EDA binary or shell script.
partner-acme-synth/
└── mcp/src/devices/
└── synth/acme-syn-pro/
├── manifest.json
├── driver.py # invokes your tool
└── README.md
# manifest.json declares tools[] just like
# any device — auto-registered at startup.
# Core src/index.js never changes.
input/pdk/ or pdk_local/<vendor>/ — never rebuilt into the image.Reusable verified IP blocks — UART, SPI, I2C, CRC engines, FIFO, arbiters, FSMs. Each contribution carries metadata + RTL/macro deliverable + a list of historical bug classes the IP has seen, so future agents borrow the lesson.
vibe-ic-marketplace/
└── reference-plugins/
└── <your-ip>/
├── ip_metadata.yaml # required
├── plugin.yaml # plugin manifest
└── files/ # RTL · macro · netlist
├── rtl/
├── lef/
├── gds/
└── lib/
# Reference (already shipped):
reference-plugins/example-ip/
└── tiny-uart (8-N-1, MIT)
ip_id: tiny-uart
vendor: example-org
license_tag: open-source-mit
deliverable_kind: soft-ip # or hard-ip
interface:
bus: APB-like
data_width: 8
clock_domain_required: single
reset_polarity: active-low
constraints:
max_freq_mhz: 50
pdk: any # any | sky130 | gf180mcu | ihp-sg13g2 | nangate45 | ...
known_issues: []
historical_failure_modes:
# bug classes this IP has seen — for
# future agents to borrow the lesson
- "Baud divider must be set before TX"
integration_notes:
- "Simple 8-N-1 UART; no flow control."
One bundle for vendors who want to ship the full stack: slash commands, NL skills, deterministic gates, MCP device drivers, and foundry-specific PDK files — all in a single plugin folder.
vibe-ic-marketplace/templates/
└── partner-plugin-skeleton/
├── .claude-plugin/
│ └── plugin.json # name · version · author
├── commands/ # slash commands (optional)
│ └── <your-command>.md
├── skills/ # NL skills (optional)
│ └── <your-skill>/SKILL.md
├── programs/ # deterministic Py (optional)
│ └── <your-class>_check.py
├── mcp/ # device drivers (optional)
│ └── src/devices/<class>/<vendor>/
│ ├── manifest.json
│ └── driver.py
├── pdk_local/<vendor>/ # foundry PDK (optional)
│ ├── liberty/
│ ├── lef/
│ ├── gds/
│ ├── drc/
│ └── lvs/
└── README.md
# 1. Copy the skeleton
cp -r vibe-ic-marketplace/templates/\
partner-plugin-skeleton \
vibe-ic-marketplace/plugins/\
partner-<vendor>-<topic>
# 2. Edit .claude-plugin/plugin.json
{
"name": "partner-acme-i2c-ip",
"version": "0.1.0",
"author": "ACME Semiconductor",
"description": "I2C master/slave IP + ..."
}
# 3. Add one entry to root marketplace.json
{
"plugins": [
...,
{ "name": "partner-acme-i2c-ip",
"path": "plugins/partner-acme-i2c-ip" }
]
}
# 4. Open a PR
git push origin partner-acme-i2c-ip
gh pr create
When an agent finds a bug in real silicon, it must NOT just patch the bug. It must look back at the plugin and ask: What general gate would catch this whole class of bugs? That answer — the enhancement opportunity, IC-AGNOSTIC — gets recorded back to the community. The plugin gets professional with every contribution.
There are two ways to contribute back — and they are not either/or: file a backlog (a report of the gap, no code) or open a PR (the same report with your proposed fix). Both must be IC-AGNOSTIC and are auto-sanitized; the maintainer (repo-gatekeeper) triages backlogs and reviews & lands PRs into the next version.
| ✅ Record (enhancement) | ❌ Skip (specific bug) |
|---|---|
| "Plugin lacks a gate for protocols where CRC init / update happen on the same cycle" | "Our IC's CRC output is wrong because crc_init and crc_update overlap" |
| "No program checks that wake signals have ≥2 clear paths" | "Wake register only clears on rst_n, missing soft-reset" |
Sanitize automatically: chip names → "a cable-side ID IC"; vendor names → "the vendor"; OTP hex dumps → "OTP content".
# ── A. BACKLOG — a report, no code ──
# Inside a design session, invoke the skill:
claude "use community-backlog-submit
skill to record this gap"
# writes community/backlogs/<class-tag>.yaml
# backlog_sanitize_check.py auto-strips:
# chip / vendor names, OTP hex, PDF names
# ── B. PR — a report WITH your fix ──
# the skill also emits a PR-ready diff;
# open a PR carrying the gate/program change
# (the actual code), not just the report.
# EITHER path: a passing sanitize-check is
# REQUIRED to merge — chip-AGNOSTIC enforced
# by code, not honor system. The maintainer
# (repo-gatekeeper) triages backlogs + lands
# PRs into the next version.
Pick a surface, follow the manifest contract, then file a backlog or open a pull request.
Apache License 2.0 — Free and open source