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.
Files changed (77) hide show
  1. fpga_mcp-0.1.0/.dockerignore +80 -0
  2. fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/bug_report.md +46 -0
  3. fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/config.yml +8 -0
  4. fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/feature_request.md +34 -0
  5. fpga_mcp-0.1.0/.github/ISSUE_TEMPLATE/new_vendor.md +39 -0
  6. fpga_mcp-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +41 -0
  7. fpga_mcp-0.1.0/.github/workflows/ci.yml +164 -0
  8. fpga_mcp-0.1.0/.gitignore +72 -0
  9. fpga_mcp-0.1.0/CHANGELOG.md +57 -0
  10. fpga_mcp-0.1.0/CONTRIBUTING.md +332 -0
  11. fpga_mcp-0.1.0/Dockerfile +94 -0
  12. fpga_mcp-0.1.0/LICENSE +21 -0
  13. fpga_mcp-0.1.0/PKG-INFO +1378 -0
  14. fpga_mcp-0.1.0/README.md +1342 -0
  15. fpga_mcp-0.1.0/SECURITY.md +134 -0
  16. fpga_mcp-0.1.0/docker-compose.yml +107 -0
  17. fpga_mcp-0.1.0/examples/README.md +87 -0
  18. fpga_mcp-0.1.0/examples/blink/README.md +85 -0
  19. fpga_mcp-0.1.0/examples/blink/blink.v +41 -0
  20. fpga_mcp-0.1.0/examples/blink/blink.xdc +12 -0
  21. fpga_mcp-0.1.0/examples/blink/blink_tb.sv +43 -0
  22. fpga_mcp-0.1.0/examples/core_features_demo/README.md +95 -0
  23. fpga_mcp-0.1.0/examples/core_features_demo/verify_core_features.py +587 -0
  24. fpga_mcp-0.1.0/examples/timing_closure_demo/README.md +137 -0
  25. fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path.v +53 -0
  26. fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path.xdc +15 -0
  27. fpga_mcp-0.1.0/examples/timing_closure_demo/critical_path_fixed.v +74 -0
  28. fpga_mcp-0.1.0/examples/timing_closure_demo/verify_timing_closure.py +296 -0
  29. fpga_mcp-0.1.0/methodology/bitstream_handoff.md +78 -0
  30. fpga_mcp-0.1.0/methodology/cdc_audit.md +74 -0
  31. fpga_mcp-0.1.0/methodology/full_flow.md +67 -0
  32. fpga_mcp-0.1.0/methodology/resource_budgeting.md +64 -0
  33. fpga_mcp-0.1.0/methodology/sim_signoff.md +88 -0
  34. fpga_mcp-0.1.0/methodology/soc_bringup.md +104 -0
  35. fpga_mcp-0.1.0/methodology/timing_closure.md +67 -0
  36. fpga_mcp-0.1.0/pyproject.toml +67 -0
  37. fpga_mcp-0.1.0/scripts/gen_tool_index.py +107 -0
  38. fpga_mcp-0.1.0/scripts/smoke_e2e.py +224 -0
  39. fpga_mcp-0.1.0/src/fpga_mcp/__init__.py +13 -0
  40. fpga_mcp-0.1.0/src/fpga_mcp/__main__.py +13 -0
  41. fpga_mcp-0.1.0/src/fpga_mcp/_client_registry.py +117 -0
  42. fpga_mcp-0.1.0/src/fpga_mcp/cli.py +306 -0
  43. fpga_mcp-0.1.0/src/fpga_mcp/config.py +106 -0
  44. fpga_mcp-0.1.0/src/fpga_mcp/detect.py +111 -0
  45. fpga_mcp-0.1.0/src/fpga_mcp/prompts.py +92 -0
  46. fpga_mcp-0.1.0/src/fpga_mcp/server.py +84 -0
  47. fpga_mcp-0.1.0/src/fpga_mcp/session.py +126 -0
  48. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/__init__.py +291 -0
  49. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/_handlers.py +250 -0
  50. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/anlogic.py +860 -0
  51. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/common.py +272 -0
  52. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/quartus.py +1073 -0
  53. fpga_mcp-0.1.0/src/fpga_mcp/tool_defs/vivado.py +2103 -0
  54. fpga_mcp-0.1.0/src/fpga_mcp/transports/__init__.py +32 -0
  55. fpga_mcp-0.1.0/src/fpga_mcp/transports/_base_tcp.py +99 -0
  56. fpga_mcp-0.1.0/src/fpga_mcp/transports/_tcl_client.py +176 -0
  57. fpga_mcp-0.1.0/src/fpga_mcp/transports/_tcl_helpers.py +49 -0
  58. fpga_mcp-0.1.0/src/fpga_mcp/transports/anlogic.py +424 -0
  59. fpga_mcp-0.1.0/src/fpga_mcp/transports/base.py +253 -0
  60. fpga_mcp-0.1.0/src/fpga_mcp/transports/factory.py +39 -0
  61. fpga_mcp-0.1.0/src/fpga_mcp/transports/quartus.py +486 -0
  62. fpga_mcp-0.1.0/src/fpga_mcp/transports/vivado.py +604 -0
  63. fpga_mcp-0.1.0/tcl/_omni_protocol.tcl +188 -0
  64. fpga_mcp-0.1.0/tcl/anlogic_server.tcl +21 -0
  65. fpga_mcp-0.1.0/tcl/quartus_server.tcl +32 -0
  66. fpga_mcp-0.1.0/tcl/vivado_server.tcl +19 -0
  67. fpga_mcp-0.1.0/tests/__init__.py +0 -0
  68. fpga_mcp-0.1.0/tests/_mock_tcl_server.py +103 -0
  69. fpga_mcp-0.1.0/tests/test_anlogic_backend.py +159 -0
  70. fpga_mcp-0.1.0/tests/test_cli.py +98 -0
  71. fpga_mcp-0.1.0/tests/test_config.py +42 -0
  72. fpga_mcp-0.1.0/tests/test_package.py +14 -0
  73. fpga_mcp-0.1.0/tests/test_quartus_backend.py +152 -0
  74. fpga_mcp-0.1.0/tests/test_server.py +84 -0
  75. fpga_mcp-0.1.0/tests/test_tcl_helpers.py +42 -0
  76. fpga_mcp-0.1.0/tests/test_tool_defs.py +352 -0
  77. 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`.