fpga-mcp 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fpga_mcp-0.1.0/.dockerignore +80 -0
- fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +46 -0
- fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
- fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
- fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/new_vendor.md +39 -0
- fpga_mcp-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +41 -0
- fpga_mcp-0.1.0/.github/workflows/ci.yml +164 -0
- fpga_mcp-0.1.0/.gitignore +72 -0
- fpga_mcp-0.1.0/CHANGELOG.md +57 -0
- fpga_mcp-0.1.0/CONTRIBUTING.md +332 -0
- fpga_mcp-0.1.0/Dockerfile +94 -0
- fpga_mcp-0.1.0/LICENSE +21 -0
- fpga_mcp-0.1.0/PKG-INFO +1378 -0
- fpga_mcp-0.1.0/README.md +1342 -0
- fpga_mcp-0.1.0/SECURITY.md +134 -0
- fpga_mcp-0.1.0/docker-compose.yml +107 -0
- fpga_mcp-0.1.0/examples/README.md +87 -0
- fpga_mcp-0.1.0/examples/blink/README.md +85 -0
- fpga_mcp-0.1.0/examples/blink/blink.v +41 -0
- fpga_mcp-0.1.0/examples/blink/blink.xdc +12 -0
- fpga_mcp-0.1.0/examples/blink/blink_tb.sv +43 -0
- fpga_mcp-0.1.0/examples/core_features_demo/README.md +95 -0
- fpga_mcp-0.1.0/examples/core_features_demo/verify_core_features.py +587 -0
- fpga_mcp-0.1.0/examples/timing_closure_demo/README.md +137 -0
- fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path.v +53 -0
- fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path.xdc +15 -0
- fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path_fixed.v +74 -0
- fpga_mcp-0.1.0/examples/timing_closure_demo/verify_timing_closure.py +296 -0
- fpga_mcp-0.1.0/methodology/bitstream_handoff.md +78 -0
- fpga_mcp-0.1.0/methodology/cdc_audit.md +74 -0
- fpga_mcp-0.1.0/methodology/full_flow.md +67 -0
- fpga_mcp-0.1.0/methodology/resource_budgeting.md +64 -0
- fpga_mcp-0.1.0/methodology/sim_signoff.md +88 -0
- fpga_mcp-0.1.0/methodology/soc_bringup.md +104 -0
- fpga_mcp-0.1.0/methodology/timing_closure.md +67 -0
- fpga_mcp-0.1.0/pyproject.toml +67 -0
- fpga_mcp-0.1.0/scripts/gen_tool_index.py +107 -0
- fpga_mcp-0.1.0/scripts/smoke_e2e.py +224 -0
- fpga_mcp-0.1.0/src/fpga_mcp/__init__.py +13 -0
- fpga_mcp-0.1.0/src/fpga_mcp/__main__.py +13 -0
- fpga_mcp-0.1.0/src/fpga_mcp/_client_registry.py +117 -0
- fpga_mcp-0.1.0/src/fpga_mcp/cli.py +306 -0
- fpga_mcp-0.1.0/src/fpga_mcp/config.py +106 -0
- fpga_mcp-0.1.0/src/fpga_mcp/detect.py +111 -0
- fpga_mcp-0.1.0/src/fpga_mcp/prompts.py +92 -0
- fpga_mcp-0.1.0/src/fpga_mcp/server.py +84 -0
- fpga_mcp-0.1.0/src/fpga_mcp/session.py +126 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/__init__.py +291 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/_handlers.py +250 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/anlogic.py +860 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/common.py +272 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/quartus.py +1073 -0
- fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/vivado.py +2103 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/__init__.py +32 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/_base_tcp.py +99 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/_tcl_client.py +176 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/_tcl_helpers.py +49 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/anlogic.py +424 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/base.py +253 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/factory.py +39 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/quartus.py +486 -0
- fpga_mcp-0.1.0/src/fpga_mcp/transports/vivado.py +604 -0
- fpga_mcp-0.1.0/tcl/_omni_protocol.tcl +188 -0
- fpga_mcp-0.1.0/tcl/anlogic_server.tcl +21 -0
- fpga_mcp-0.1.0/tcl/quartus_server.tcl +32 -0
- fpga_mcp-0.1.0/tcl/vivado_server.tcl +19 -0
- fpga_mcp-0.1.0/tests/__init__.py +0 -0
- fpga_mcp-0.1.0/tests/_mock_tcl_server.py +103 -0
- fpga_mcp-0.1.0/tests/test_anlogic_backend.py +159 -0
- fpga_mcp-0.1.0/tests/test_cli.py +98 -0
- fpga_mcp-0.1.0/tests/test_config.py +42 -0
- fpga_mcp-0.1.0/tests/test_package.py +14 -0
- fpga_mcp-0.1.0/tests/test_quartus_backend.py +152 -0
- fpga_mcp-0.1.0/tests/test_server.py +84 -0
- fpga_mcp-0.1.0/tests/test_tcl_helpers.py +42 -0
- fpga_mcp-0.1.0/tests/test_tool_defs.py +352 -0
- fpga_mcp-0.1.0/tests/test_vivado_backend.py +172 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Version control
|
|
2
|
+
.git
|
|
3
|
+
.gitignore
|
|
4
|
+
.github/
|
|
5
|
+
|
|
6
|
+
# Python build artifacts
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.py[cod]
|
|
9
|
+
*.egg-info/
|
|
10
|
+
*.egg
|
|
11
|
+
build/
|
|
12
|
+
dist/
|
|
13
|
+
.eggs/
|
|
14
|
+
pip-wheel-metadata/
|
|
15
|
+
|
|
16
|
+
# Test caches
|
|
17
|
+
.pytest_cache/
|
|
18
|
+
.ruff_cache/
|
|
19
|
+
.mypy_cache/
|
|
20
|
+
.tox/
|
|
21
|
+
.coverage
|
|
22
|
+
.coverage.*
|
|
23
|
+
htmlcov/
|
|
24
|
+
|
|
25
|
+
# Virtualenvs
|
|
26
|
+
.venv/
|
|
27
|
+
venv/
|
|
28
|
+
env/
|
|
29
|
+
ENV/
|
|
30
|
+
|
|
31
|
+
# Editor / IDE
|
|
32
|
+
.vscode/
|
|
33
|
+
.idea/
|
|
34
|
+
*.swp
|
|
35
|
+
*.swo
|
|
36
|
+
.DS_Store
|
|
37
|
+
|
|
38
|
+
# CI / local state
|
|
39
|
+
*.log
|
|
40
|
+
*.tmp
|
|
41
|
+
*.bak
|
|
42
|
+
.cache/
|
|
43
|
+
node_modules/
|
|
44
|
+
|
|
45
|
+
# Local config that might leak secrets / paths
|
|
46
|
+
*.env
|
|
47
|
+
.env
|
|
48
|
+
config.local.json
|
|
49
|
+
fpga-mcp-config.local.json
|
|
50
|
+
|
|
51
|
+
# Local project outputs — should not bake into the image
|
|
52
|
+
out/
|
|
53
|
+
*.xpr
|
|
54
|
+
*.qpf
|
|
55
|
+
*.qsf
|
|
56
|
+
*.al
|
|
57
|
+
*.bit
|
|
58
|
+
*.ltx
|
|
59
|
+
*.sof
|
|
60
|
+
*.rpt
|
|
61
|
+
*.log.*
|
|
62
|
+
|
|
63
|
+
# Examples are useful for documentation but add weight; keep them out
|
|
64
|
+
# of the runtime image (the README links to the repo for browsing).
|
|
65
|
+
examples/
|
|
66
|
+
|
|
67
|
+
# Docs are baked into the wheel via the README; no need for source.
|
|
68
|
+
docs/
|
|
69
|
+
*.md
|
|
70
|
+
!README.md
|
|
71
|
+
|
|
72
|
+
# Scripts are dev-only.
|
|
73
|
+
scripts/
|
|
74
|
+
|
|
75
|
+
# Tests are dev-only — wheel doesn't ship them.
|
|
76
|
+
tests/
|
|
77
|
+
|
|
78
|
+
# The Tcl + methodology directories ARE included because they're needed
|
|
79
|
+
# at runtime by the MCP server (see pyproject.toml force-include). Keep
|
|
80
|
+
# them — do NOT add `tcl/` or `methodology/` here.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Something is broken or behaves unexpectedly
|
|
4
|
+
title: "[bug] "
|
|
5
|
+
labels: bug
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What happened?
|
|
9
|
+
|
|
10
|
+
<!-- Short description of the problem. -->
|
|
11
|
+
|
|
12
|
+
## What did you expect?
|
|
13
|
+
|
|
14
|
+
<!-- What you thought would happen. -->
|
|
15
|
+
|
|
16
|
+
## How to reproduce
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Exact commands / MCP tool calls that trigger the bug.
|
|
20
|
+
fpga-mcp version
|
|
21
|
+
fpga-mcp ...
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Steps:
|
|
25
|
+
|
|
26
|
+
1.
|
|
27
|
+
2.
|
|
28
|
+
3.
|
|
29
|
+
|
|
30
|
+
## Environment
|
|
31
|
+
|
|
32
|
+
- `fpga-mcp` version: <!-- run `fpga-mcp version` and paste the line -->
|
|
33
|
+
- Python:
|
|
34
|
+
- OS (Windows / Linux / macOS + version):
|
|
35
|
+
- EDA tool + version (Vivado / Quartus / TangDynasty, if relevant):
|
|
36
|
+
- Tcl server started? (yes / no / n/a)
|
|
37
|
+
|
|
38
|
+
## Logs / output
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
Paste the relevant traceback, log snippet, or MCP tool output here.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Anything else?
|
|
45
|
+
|
|
46
|
+
<!-- Workarounds you tried, related issues, etc. -->
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Discussions
|
|
4
|
+
url: https://github.com/wmm246/fpga-mcp/discussions
|
|
5
|
+
about: Ask questions, share flows, or discuss methodology patterns here.
|
|
6
|
+
- name: MCP specification
|
|
7
|
+
url: https://modelcontextprotocol.io
|
|
8
|
+
about: Read the Model Context Protocol spec when in doubt about MCP semantics.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Suggest a new tool, vendor, prompt or behaviour
|
|
4
|
+
title: "[feature] "
|
|
5
|
+
labels: enhancement
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## What's missing?
|
|
9
|
+
|
|
10
|
+
<!-- What can't you do today that you wish you could? -->
|
|
11
|
+
|
|
12
|
+
## Proposed solution
|
|
13
|
+
|
|
14
|
+
<!-- Sketch the API / tool name / prompt behaviour you'd like. -->
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
# Example: a new tool
|
|
18
|
+
create_ip_xxx(name="clk_wiz", ...)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Which vendor(s)?
|
|
22
|
+
|
|
23
|
+
- [ ] Vivado
|
|
24
|
+
- [ ] Quartus
|
|
25
|
+
- [ ] Anlogic
|
|
26
|
+
- [ ] Common (vendor-agnostic)
|
|
27
|
+
|
|
28
|
+
## Alternatives you considered
|
|
29
|
+
|
|
30
|
+
<!-- Are you using `exec_tcl` today as a workaround? Any other toolchain? -->
|
|
31
|
+
|
|
32
|
+
## Anything else?
|
|
33
|
+
|
|
34
|
+
<!-- Related issues, prior art, links to vendor docs, etc. -->
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: New vendor support
|
|
3
|
+
about: Request support for a new FPGA vendor / toolchain
|
|
4
|
+
title: "[vendor] "
|
|
5
|
+
labels: enhancement, vendor
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Vendor
|
|
9
|
+
|
|
10
|
+
- Name: <!-- e.g. Gowin / Lattice Diamond / Microsemi Libero -->
|
|
11
|
+
- Tool binary: <!-- e.g. `gowin` / `diamond` / `libero` -->
|
|
12
|
+
- Tcl scripting entry point: <!-- how do you open a Tcl shell? -->
|
|
13
|
+
|
|
14
|
+
## Tool list you'd like covered
|
|
15
|
+
|
|
16
|
+
<!-- Approximate tool count + which categories. The existing catalogues are
|
|
17
|
+
~150-350 specs per vendor; you don't need to enumerate every command,
|
|
18
|
+
but the categories help us scope the work. -->
|
|
19
|
+
|
|
20
|
+
- [ ] Project lifecycle (create/open/close, add sources, set top)
|
|
21
|
+
- [ ] Synthesis & implementation runs
|
|
22
|
+
- [ ] IP / block design
|
|
23
|
+
- [ ] Constraints (timing / physical)
|
|
24
|
+
- [ ] Reports (timing / utilization / DRC)
|
|
25
|
+
- [ ] Simulation
|
|
26
|
+
- [ ] Hardware manager / programmer
|
|
27
|
+
- [ ] Netlist queries
|
|
28
|
+
- [ ] Other: <!-- describe -->
|
|
29
|
+
|
|
30
|
+
## Tcl command samples
|
|
31
|
+
|
|
32
|
+
```tcl
|
|
33
|
+
# 3-5 representative Tcl commands from this vendor's documentation.
|
|
34
|
+
# e.g. how do you create a project, run synthesis, generate a bitstream.
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Anything else?
|
|
38
|
+
|
|
39
|
+
<!-- Link to vendor docs, sample Tcl scripts, etc. -->
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- One or two sentences: what does this PR change? -->
|
|
4
|
+
|
|
5
|
+
## Motivation
|
|
6
|
+
|
|
7
|
+
<!-- Why is this needed? Link issues with "Fixes #123" / "Closes #123". -->
|
|
8
|
+
|
|
9
|
+
## What changed
|
|
10
|
+
|
|
11
|
+
<!-- Bullet list of the main changes. -->
|
|
12
|
+
|
|
13
|
+
-
|
|
14
|
+
-
|
|
15
|
+
-
|
|
16
|
+
|
|
17
|
+
## Checklist
|
|
18
|
+
|
|
19
|
+
- [ ] `pytest` passes locally (`pip install -e '.[dev]' && pytest`)
|
|
20
|
+
- [ ] `ruff check src tests` is clean
|
|
21
|
+
- [ ] If new tool(s) added: spec lives in `src/fpga_mcp/tool_defs/<vendor>.py`
|
|
22
|
+
and follows the naming convention (`viv_` / `q_` / `a_` prefix, or no
|
|
23
|
+
prefix for common)
|
|
24
|
+
- [ ] If new tool(s) added: `tests/test_tool_defs.py` catalogue invariants
|
|
25
|
+
still pass (no duplicate names, every spec has summary + category)
|
|
26
|
+
- [ ] README / CHANGELOG updated if user-visible
|
|
27
|
+
- [ ] No new dependencies unless discussed in the PR description
|
|
28
|
+
|
|
29
|
+
## Test plan
|
|
30
|
+
|
|
31
|
+
<!-- How did you verify this works? -->
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Commands you ran.
|
|
35
|
+
pytest -k <pattern>
|
|
36
|
+
ruff check src tests
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Screenshots / logs
|
|
40
|
+
|
|
41
|
+
<!-- Optional. For UI or large output changes. -->
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, master]
|
|
6
|
+
tags: ["v*"]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [main, master]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
test:
|
|
12
|
+
runs-on: ${{ matrix.os }}
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: false
|
|
15
|
+
matrix:
|
|
16
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
17
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
18
|
+
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: ${{ matrix.python-version }}
|
|
26
|
+
|
|
27
|
+
- name: Install
|
|
28
|
+
run: |
|
|
29
|
+
python -m pip install --upgrade pip
|
|
30
|
+
pip install -e '.[dev]'
|
|
31
|
+
|
|
32
|
+
- name: Lint (ruff)
|
|
33
|
+
run: ruff check src tests
|
|
34
|
+
|
|
35
|
+
- name: Test (pytest)
|
|
36
|
+
run: pytest -ra
|
|
37
|
+
|
|
38
|
+
build:
|
|
39
|
+
needs: test
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
# Build dist artifacts on every CI run so we catch packaging regressions
|
|
42
|
+
# early. The actual PyPI upload only happens on tag pushes (see `release`).
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
- uses: actions/setup-python@v5
|
|
46
|
+
with:
|
|
47
|
+
python-version: "3.12"
|
|
48
|
+
- run: |
|
|
49
|
+
python -m pip install --upgrade pip
|
|
50
|
+
pip install build
|
|
51
|
+
- name: Build sdist + wheel
|
|
52
|
+
run: python -m build
|
|
53
|
+
- uses: actions/upload-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: dist
|
|
56
|
+
path: dist/*
|
|
57
|
+
|
|
58
|
+
smoke:
|
|
59
|
+
# Cross-platform end-to-end smoke test: spin up the mock Tcl server
|
|
60
|
+
# three times (once per vendor) and drive each backend through a full
|
|
61
|
+
# create_project → add_sources → run_synthesis → report_timing flow.
|
|
62
|
+
# Catches OS-specific socket / encoding regressions that unit tests
|
|
63
|
+
# might miss.
|
|
64
|
+
needs: test
|
|
65
|
+
runs-on: ${{ matrix.os }}
|
|
66
|
+
strategy:
|
|
67
|
+
fail-fast: false
|
|
68
|
+
matrix:
|
|
69
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
- uses: actions/setup-python@v5
|
|
73
|
+
with:
|
|
74
|
+
python-version: "3.12"
|
|
75
|
+
- name: Install
|
|
76
|
+
run: |
|
|
77
|
+
python -m pip install --upgrade pip
|
|
78
|
+
pip install -e '.[dev]'
|
|
79
|
+
- name: Run e2e smoke script
|
|
80
|
+
run: python scripts/smoke_e2e.py
|
|
81
|
+
|
|
82
|
+
examples:
|
|
83
|
+
# Run the verifiable example scripts end-to-end.
|
|
84
|
+
# - timing_closure_demo: drives the broken → fix → re-verify loop,
|
|
85
|
+
# asserts WNS_final >= 0.
|
|
86
|
+
# - core_features_demo: drives every category of the EDABackend
|
|
87
|
+
# contract (lifecycle, project, sources, synth, impl, IP, reports,
|
|
88
|
+
# simulation, bitstream, programming, exec_tcl, session) through
|
|
89
|
+
# the typed Python tools and asserts each one returns a
|
|
90
|
+
# well-formed result. 14 phases; exits 0 only if all pass.
|
|
91
|
+
needs: test
|
|
92
|
+
runs-on: ubuntu-latest
|
|
93
|
+
steps:
|
|
94
|
+
- uses: actions/checkout@v4
|
|
95
|
+
- uses: actions/setup-python@v5
|
|
96
|
+
with:
|
|
97
|
+
python-version: "3.12"
|
|
98
|
+
- name: Install
|
|
99
|
+
run: |
|
|
100
|
+
python -m pip install --upgrade pip
|
|
101
|
+
pip install -e '.[dev]'
|
|
102
|
+
- name: Run timing_closure_demo
|
|
103
|
+
run: python examples/timing_closure_demo/verify_timing_closure.py
|
|
104
|
+
- name: Run core_features_demo
|
|
105
|
+
run: python examples/core_features_demo/verify_core_features.py
|
|
106
|
+
|
|
107
|
+
docker:
|
|
108
|
+
# Build the Docker image. Doesn't push — push is handled by a
|
|
109
|
+
# separate workflow triggered on tag, or by maintainers manually.
|
|
110
|
+
needs: test
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v4
|
|
114
|
+
- name: Set up Docker Buildx
|
|
115
|
+
uses: docker/setup-buildx-action@v3
|
|
116
|
+
- name: Build image
|
|
117
|
+
uses: docker/build-push-action@v6
|
|
118
|
+
with:
|
|
119
|
+
context: .
|
|
120
|
+
file: ./Dockerfile
|
|
121
|
+
push: false
|
|
122
|
+
load: true
|
|
123
|
+
tags: fpga-mcp:ci
|
|
124
|
+
cache-from: type=gha
|
|
125
|
+
cache-to: type=gha,mode=max
|
|
126
|
+
- name: Smoke check the image
|
|
127
|
+
run: |
|
|
128
|
+
docker run --rm fpga-mcp:ci version
|
|
129
|
+
docker run --rm fpga-mcp:ci backends
|
|
130
|
+
|
|
131
|
+
release:
|
|
132
|
+
# Publish to PyPI when a `v*` tag is pushed. Requires two repo secrets:
|
|
133
|
+
# PYPI_API_TOKEN — a scoped PyPI upload token.
|
|
134
|
+
# Without these secrets the job is skipped silently (CI still passes).
|
|
135
|
+
needs: [build, smoke, examples, docker]
|
|
136
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
137
|
+
runs-on: ubuntu-latest
|
|
138
|
+
environment: pypi
|
|
139
|
+
steps:
|
|
140
|
+
- uses: actions/checkout@v4
|
|
141
|
+
- uses: actions/setup-python@v5
|
|
142
|
+
with:
|
|
143
|
+
python-version: "3.12"
|
|
144
|
+
- name: Download dist artifacts
|
|
145
|
+
uses: actions/download-artifact@v4
|
|
146
|
+
with:
|
|
147
|
+
name: dist
|
|
148
|
+
path: dist
|
|
149
|
+
- name: Publish to PyPI
|
|
150
|
+
env:
|
|
151
|
+
TWINE_USERNAME: __token__
|
|
152
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
153
|
+
run: |
|
|
154
|
+
python -m pip install --upgrade pip
|
|
155
|
+
pip install twine
|
|
156
|
+
twine upload --skip-existing dist/*
|
|
157
|
+
- name: Create GitHub Release
|
|
158
|
+
uses: softprops/action-gh-release@v2
|
|
159
|
+
with:
|
|
160
|
+
files: dist/*
|
|
161
|
+
generate_release_notes: true
|
|
162
|
+
draft: false
|
|
163
|
+
prerelease: ${{ contains(github.ref_name, 'rc') || contains(github.ref_name, 'beta') }}
|
|
164
|
+
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.egg-info/
|
|
6
|
+
*.egg
|
|
7
|
+
.eggs/
|
|
8
|
+
build/
|
|
9
|
+
dist/
|
|
10
|
+
wheelhouse/
|
|
11
|
+
|
|
12
|
+
# Virtual envs
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
env/
|
|
16
|
+
ENV/
|
|
17
|
+
|
|
18
|
+
# uv
|
|
19
|
+
.uv/
|
|
20
|
+
|
|
21
|
+
# IDE
|
|
22
|
+
.vscode/
|
|
23
|
+
.idea/
|
|
24
|
+
*.swp
|
|
25
|
+
*.swo
|
|
26
|
+
|
|
27
|
+
# Test / coverage
|
|
28
|
+
.pytest_cache/
|
|
29
|
+
.coverage
|
|
30
|
+
.coverage.*
|
|
31
|
+
htmlcov/
|
|
32
|
+
.tox/
|
|
33
|
+
.mypy_cache/
|
|
34
|
+
.ruff_cache/
|
|
35
|
+
|
|
36
|
+
# OS
|
|
37
|
+
.DS_Store
|
|
38
|
+
Thumbs.db
|
|
39
|
+
|
|
40
|
+
# FPGA project artifacts
|
|
41
|
+
*.xpr
|
|
42
|
+
*.qpf
|
|
43
|
+
*.qsf
|
|
44
|
+
*.qar
|
|
45
|
+
*.al
|
|
46
|
+
*.alp
|
|
47
|
+
*.bit
|
|
48
|
+
*.bin
|
|
49
|
+
*.ltx
|
|
50
|
+
*.rpt
|
|
51
|
+
*.log
|
|
52
|
+
*.jou
|
|
53
|
+
*.str
|
|
54
|
+
*.summary
|
|
55
|
+
*.pb
|
|
56
|
+
*.bak
|
|
57
|
+
Xilinx*/
|
|
58
|
+
vivado_*/
|
|
59
|
+
*.restore
|
|
60
|
+
*_sim/
|
|
61
|
+
*.wdb
|
|
62
|
+
*.wcfg
|
|
63
|
+
*.so
|
|
64
|
+
*.so.*
|
|
65
|
+
*.o
|
|
66
|
+
*.obj
|
|
67
|
+
*.tmp
|
|
68
|
+
*.out
|
|
69
|
+
|
|
70
|
+
# Project-local editor configs
|
|
71
|
+
.claude/
|
|
72
|
+
.cursor/
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Initial public release of `fpga-mcp`.
|
|
12
|
+
- Multi-vendor EDA backend abstraction: Xilinx Vivado, Intel Quartus, Anlogic.
|
|
13
|
+
- Vivado backend driven by a bundled Tcl TCP server (port 9999), similar in
|
|
14
|
+
spirit to SynthPilot but reimplemented from scratch and MIT-licensed.
|
|
15
|
+
- Quartus backend driven by `quartus_sh -t` over a Tcl session.
|
|
16
|
+
- Anlogic backend driven by the TangDynasty / TD CLI flow.
|
|
17
|
+
- MCP server exposing project / synth / impl / IP / sim / bitstream / reports
|
|
18
|
+
tool groups, all parameterized by the active backend.
|
|
19
|
+
- **689 declarative MCP tools** (vs. the original 22 hand-written tools):
|
|
20
|
+
- 22 high-level vendor-agnostic tools (`create_project`, `run_synthesis`,
|
|
21
|
+
`report_timing`, `exec_tcl`, …) routed to backend Python methods.
|
|
22
|
+
- 343 Vivado tools (`viv_*`) covering project/fileset, synth/impl runs,
|
|
23
|
+
IP/BD, constraints, timing reports, utilization/DRC, simulation,
|
|
24
|
+
hardware manager, debug cores, netlist queries and parts.
|
|
25
|
+
- 167 Quartus tools (`q_*`) covering project/flow, SDC/STA timing,
|
|
26
|
+
reports, IP/Qsys, power and EDA.
|
|
27
|
+
- 157 Anlogic TangDynasty tools (`a_*`) covering project/files, synth/impl,
|
|
28
|
+
IP, constraints, reports, netlist, simulation and programming.
|
|
29
|
+
- Declarative `ToolSpec` catalogue + factory pattern: adding a tool = one
|
|
30
|
+
line in the right `tool_defs/<vendor>.py`. The factory builds the runtime
|
|
31
|
+
callable automatically, validates required args, and dispatches to either
|
|
32
|
+
a Python handler or a rendered Tcl command.
|
|
33
|
+
- Methodology layer (`methodology/*.md`) exposing named expert workflows as
|
|
34
|
+
MCP prompts: full-flow, timing-closure, cdc-audit, resource-budgeting,
|
|
35
|
+
soc-bringup, sim-signoff, bitstream-handoff.
|
|
36
|
+
- CLI: `fpga-mcp setup`, `fpga-mcp doctor [--fix]`, `fpga-mcp run`,
|
|
37
|
+
`fpga-mcp backends`, `fpga-mcp tcl-server-path <backend>`,
|
|
38
|
+
`fpga-mcp version`.
|
|
39
|
+
- `pyproject.toml` packaging with `fpga-mcp` / `fpga` console scripts.
|
|
40
|
+
- 69-test suite covering: Tcl helpers, config + env overrides, package
|
|
41
|
+
surface, FastMCP server (tool count ≥ 500, vendor coverage, prompt list,
|
|
42
|
+
non-empty descriptions), tool factory (spec parsing, arg inference,
|
|
43
|
+
template rendering, handler dispatch, catalogue invariants), all three
|
|
44
|
+
backends via in-process mock Tcl servers, and the CLI.
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
- Renamed the project from `omni-fpga-mcp` to `fpga-mcp`. Package name,
|
|
48
|
+
import path, console scripts, env vars (`FPGA_MCP_*`), config paths and
|
|
49
|
+
CI all use the new name.
|
|
50
|
+
- Switched the server from the hand-written `fpga_mcp.tools` module (8
|
|
51
|
+
domain modules, 22 functions) to the declarative
|
|
52
|
+
`fpga_mcp.tool_defs` factory. The old `tools/` directory has been
|
|
53
|
+
removed; the 22 high-level tools remain available via
|
|
54
|
+
`tool_defs/common.py` + `_handlers.py` with identical behaviour.
|
|
55
|
+
|
|
56
|
+
### Removed
|
|
57
|
+
- `fpga_mcp/tools/` — superseded by `fpga_mcp/tool_defs/` + `_handlers.py`.
|