@hybridlabor-api/bdb-hardware-pcb 0.1.0
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.
- package/README.md +116 -0
- package/config/mcp/antigravity.json +22 -0
- package/config/mcp/claude.json +22 -0
- package/config/mcp/codex.toml +25 -0
- package/docs/adr/ADR-001-KICAD-OPENSCAD-MCP-STRATEGY.md +334 -0
- package/docs/review_documentation.md +121 -0
- package/installer.js +358 -0
- package/mcp_servers/kicad-mcp-server/.env.example +22 -0
- package/mcp_servers/kicad-mcp-server/.github/workflows/ci.yml +36 -0
- package/mcp_servers/kicad-mcp-server/CLAUDE.md +487 -0
- package/mcp_servers/kicad-mcp-server/README.md +316 -0
- package/mcp_servers/kicad-mcp-server/docs/DEVICE_TREE.md +416 -0
- package/mcp_servers/kicad-mcp-server/docs/INSTALLATION.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/PIN_ANALYSIS.md +332 -0
- package/mcp_servers/kicad-mcp-server/docs/README.md +240 -0
- package/mcp_servers/kicad-mcp-server/docs/TESTING.md +613 -0
- package/mcp_servers/kicad-mcp-server/docs/VALIDATION.md +268 -0
- package/mcp_servers/kicad-mcp-server/pyproject.toml +96 -0
- package/mcp_servers/kicad-mcp-server/requirements-dev.txt +16 -0
- package/mcp_servers/kicad-mcp-server/requirements-test.txt +24 -0
- package/mcp_servers/kicad-mcp-server/requirements.txt +13 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__init__.py +3 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/__main__.py +17 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/config.py +46 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/models/types.py +87 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/netlist_parser.py +234 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser.py +375 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/pcb_parser_kicad.py +327 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/parsers/schematic_parser.py +902 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/server.py +71 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/arduino/connectivity_test.cpp.j2 +189 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/atmega.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/esp32.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/nrf52.dts.j2 +77 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/device_tree/stm32f4.dts.j2 +89 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/esp_idf/test_suite.c.j2 +340 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/pytest/test_connectivity.py.j2 +147 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/st_hal/hal_test.c.j2 +313 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_gpio_test.py.j2 +99 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_i2c_test.py.j2 +117 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_pinmux_test.py.j2 +43 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/pytest_spi_test.py.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2 +113 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_i2c_test.c.j2 +101 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_spi_test.c.j2 +94 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2 +172 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/__init__.py +36 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/device_tree.py +1187 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/hierarchical_analysis.py +211 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/netlist.py +320 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/parts_registry.py +142 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb.py +955 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pcb_layout.py +308 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/pin_analysis.py +765 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/project.py +196 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic.py +319 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_editor.py +674 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/schematic_search.py +158 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/validation.py +866 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/tools/visualization.py +225 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/file_handlers.py +65 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_cli.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/kicad_version.py +103 -0
- package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/utils/parts_registry.py +197 -0
- package/mcp_servers/kicad-mcp-server/tests/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/examples/ESP32S3_TEST.md +219 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/README.md +65 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_pcb.kicad_pcb +177 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/example_schematic.kicad_sch +145 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/child.kicad_sch +24 -0
- package/mcp_servers/kicad-mcp-server/tests/fixtures/hier/root.kicad_sch +38 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/__init__.py +1 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_hierarchical_labels.py +195 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_kicad_cli.py +116 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_netlist_cache_path.py +29 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic.py +189 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_schematic_hierarchy.py +69 -0
- package/mcp_servers/kicad-mcp-server/tests/test_tools/test_visualization.py +136 -0
- package/mcp_servers/kicad-mcp-server/uv.lock +2873 -0
- package/mcp_servers/openscad-mcp-server/.dockerignore +9 -0
- package/mcp_servers/openscad-mcp-server/.github/workflows/test.yml +40 -0
- package/mcp_servers/openscad-mcp-server/Dockerfile +29 -0
- package/mcp_servers/openscad-mcp-server/LICENSE +21 -0
- package/mcp_servers/openscad-mcp-server/README.md +154 -0
- package/mcp_servers/openscad-mcp-server/docs/audit.md +56 -0
- package/mcp_servers/openscad-mcp-server/docs/docker.md +66 -0
- package/mcp_servers/openscad-mcp-server/docs/issue-followup.md +19 -0
- package/mcp_servers/openscad-mcp-server/docs/jetson.md +17 -0
- package/mcp_servers/openscad-mcp-server/glama.json +4 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.md +15 -0
- package/mcp_servers/openscad-mcp-server/legacy/README.original.md +294 -0
- package/mcp_servers/openscad-mcp-server/legacy/implementation_plan.md +100 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/download_sam2_checkpoint.py +115 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/ai/sam_segmentation.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/models/threestudio_generator.py +231 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/src/workflow/image_to_model_pipeline.py +260 -0
- package/mcp_servers/openscad-mcp-server/legacy/old/test_sam2_segmentation.py +96 -0
- package/mcp_servers/openscad-mcp-server/legacy/requirements.txt +57 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/README.md +39 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/ai-driven-code-generation.md +122 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/decisions/export-formats.md +76 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/ai/ai_service.py.md +51 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/main.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/models/code_generator.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/files/src/nlp/parameter_extractor.py.md +63 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/ai/natural-language-processing.md +78 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/nlp/parameter-extraction.md +173 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/export-formats.md +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/openscad-basics.md +66 -0
- package/mcp_servers/openscad-mcp-server/legacy/rtfmd/knowledge/openscad/primitive-testing.md +79 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/ai_service.py +257 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/gemini_api.py +161 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/ai/venice_api.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/config.py +121 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py +1456 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main.py.new +404 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/main_remote.py +401 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/code_generator.py +321 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/cuda_mvs.py +209 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/models/scad_templates/basic_shapes.scad +144 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/nlp/parameter_extractor.py +388 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/openscad_wrapper/wrapper.py +418 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/printer_discovery/printer_discovery.py +471 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/connection_manager.py +537 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_client.py +435 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/cuda_mvs_server.py +787 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/remote/error_handling.py +415 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/primitive_tester.py +203 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/testing/test_primitives.py +98 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/__init__.py +1 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/cad_exporter.py +241 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/format_validator.py +206 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_exporter.py +140 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_repair.py +91 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/utils/stl_validator.py +123 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/__init__.py +0 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/headless_renderer.py +52 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/renderer.py +177 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/visualization/web_interface.py +639 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/image_approval.py +148 -0
- package/mcp_servers/openscad-mcp-server/legacy/src/workflow/multi_view_to_model_pipeline.py +338 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_complete_workflow.py +374 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_cuda_mvs.py +191 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_gemini_api.py +168 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval.py +192 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_approval_workflow.py +251 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_image_to_model_pipeline.py +145 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_model_selection.py +41 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_multi_view_pipeline.py +290 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_primitives.sh +13 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_rabbit_direct.py +71 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_remote_cuda_mvs.py +283 -0
- package/mcp_servers/openscad-mcp-server/legacy/test_venice_example.py +69 -0
- package/mcp_servers/openscad-mcp-server/pyproject.toml +33 -0
- package/mcp_servers/openscad-mcp-server/requirements.txt +2 -0
- package/mcp_servers/openscad-mcp-server/scad/simple_cube.scad +2 -0
- package/mcp_servers/openscad-mcp-server/scripts/test_docker.py +220 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__init__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/__main__.py +3 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/engine.py +94 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/geometry.py +242 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/server.py +245 -0
- package/mcp_servers/openscad-mcp-server/src/openscad_mcp/service.py +190 -0
- package/mcp_servers/openscad-mcp-server/tests/conftest.py +17 -0
- package/mcp_servers/openscad-mcp-server/tests/test_engine.py +37 -0
- package/mcp_servers/openscad-mcp-server/tests/test_geometry.py +106 -0
- package/mcp_servers/openscad-mcp-server/tests/test_integration.py +172 -0
- package/mcp_servers/openscad-mcp-server/tests/test_transports.py +314 -0
- package/mcp_servers/openscad-mcp-server/uv.lock +1123 -0
- package/package.json +44 -0
- package/scripts/install_mcps.sh +86 -0
- package/scripts/openscad_wrapper.sh +62 -0
- package/scripts/run_kicad_mcp.sh +25 -0
- package/scripts/run_openscad_mcp.sh +41 -0
- package/scripts/test_mcp_connection.py +626 -0
- package/scripts/test_mcp_connection.sh +168 -0
- package/skills/code-first-hardware-design/SKILL.md +260 -0
- package/skills/pcb-constraint-definition/SKILL.md +236 -0
- package/skills/pcb-layout-routing-automation/SKILL.md +153 -0
- package/skills/pcb-validation-dfm-signoff/SKILL.md +194 -0
- package/skills/schematic-datasheet-analysis/SKILL.md +202 -0
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/tests/unity_gpio_test.c.j2
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* GPIO Pin Tests - Auto-generated from KiCad schematic
|
|
3
|
+
* Generated by: kicad-mcp-server
|
|
4
|
+
* Framework: Unity Test Framework
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include "unity.h"
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
|
|
10
|
+
/* Mock hardware definitions */
|
|
11
|
+
#define GPIO_PIN_HIGH 1
|
|
12
|
+
#define GPIO_PIN_LOW 0
|
|
13
|
+
#define GPIO_OUTPUT 1
|
|
14
|
+
#define GPIO_INPUT 0
|
|
15
|
+
#define GPIO_BIDIR 2
|
|
16
|
+
|
|
17
|
+
/* Hardware abstraction layer */
|
|
18
|
+
extern void gpio_init(uint32_t pin, uint32_t direction);
|
|
19
|
+
extern void gpio_write(uint32_t pin, uint32_t state);
|
|
20
|
+
extern uint32_t gpio_read(uint32_t pin);
|
|
21
|
+
|
|
22
|
+
{% for pin in gpio_pins %}
|
|
23
|
+
/* Test GPIO pin {{ pin.number }} - {{ pin.net }} */
|
|
24
|
+
void test_gpio_{{ pin.number }}_init(void) {
|
|
25
|
+
/* Test GPIO {{ pin.number }} initialization */
|
|
26
|
+
gpio_init({{ pin.number }}, {{ pin.direction }});
|
|
27
|
+
|
|
28
|
+
/* Verify pin direction */
|
|
29
|
+
TEST_ASSERT_MESSAGE(1, "GPIO {{ pin.number }} initialization failed");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
{% if pin.direction == 'output' %}
|
|
33
|
+
void test_gpio_{{ pin.number }}_output_high(void) {
|
|
34
|
+
/* Test GPIO {{ pin.number }} output high */
|
|
35
|
+
gpio_init({{ pin.number }}, GPIO_OUTPUT);
|
|
36
|
+
gpio_write({{ pin.number }}, GPIO_PIN_HIGH);
|
|
37
|
+
|
|
38
|
+
uint32_t state = gpio_read({{ pin.number }});
|
|
39
|
+
TEST_ASSERT_EQUAL_UINT32(GPIO_PIN_HIGH, state);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
void test_gpio_{{ pin.number }}_output_low(void) {
|
|
43
|
+
/* Test GPIO {{ pin.number }} output low */
|
|
44
|
+
gpio_init({{ pin.number }}, GPIO_OUTPUT);
|
|
45
|
+
gpio_write({{ pin.number }}, GPIO_PIN_LOW);
|
|
46
|
+
|
|
47
|
+
uint32_t state = gpio_read({{ pin.number }});
|
|
48
|
+
TEST_ASSERT_EQUAL_UINT32(GPIO_PIN_LOW, state);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
{% elif pin.direction == 'input' %}
|
|
52
|
+
void test_gpio_{{ pin.number }}_input(void) {
|
|
53
|
+
/* Test GPIO {{ pin.number }} input */
|
|
54
|
+
gpio_init({{ pin.number }}, GPIO_INPUT);
|
|
55
|
+
|
|
56
|
+
uint32_t state = gpio_read({{ pin.number }});
|
|
57
|
+
TEST_ASSERT(state == GPIO_PIN_LOW || state == GPIO_PIN_HIGH);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
{% endif %}
|
|
61
|
+
void test_gpio_{{ pin.number }}_continuity(void) {
|
|
62
|
+
/* Test continuity for GPIO pin {{ pin.number }} */
|
|
63
|
+
/* Expected net: {{ pin.net }} */
|
|
64
|
+
|
|
65
|
+
/* TODO: Implement continuity test */
|
|
66
|
+
TEST_ASSERT_MESSAGE(1, "Continuity test not implemented");
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
{% endfor %}
|
|
70
|
+
|
|
71
|
+
/* Test interactions */
|
|
72
|
+
void test_multiple_gpio_outputs(void) {
|
|
73
|
+
/* Test multiple GPIO outputs */
|
|
74
|
+
{% for pin in gpio_pins[:4] %}
|
|
75
|
+
{% if pin.direction == 'output' %}
|
|
76
|
+
gpio_init({{ pin.number }}, GPIO_OUTPUT);
|
|
77
|
+
gpio_write({{ pin.number }}, GPIO_PIN_HIGH);
|
|
78
|
+
{% endif %}
|
|
79
|
+
{% endfor %}
|
|
80
|
+
|
|
81
|
+
/* Verify all outputs */
|
|
82
|
+
{% for pin in gpio_pins[:4] %}
|
|
83
|
+
{% if pin.direction == 'output' %}
|
|
84
|
+
uint32_t state_{{ pin.number }} = gpio_read({{ pin.number }});
|
|
85
|
+
TEST_ASSERT_EQUAL_UINT32(GPIO_PIN_HIGH, state_{{ pin.number }});
|
|
86
|
+
{% endif %}
|
|
87
|
+
{% endfor %}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
void test_gpio_pin_conflicts(void) {
|
|
91
|
+
/* Test for GPIO pin conflicts */
|
|
92
|
+
uint32_t pins_tested = {{ gpio_pins|length }};
|
|
93
|
+
TEST_ASSERT(pins_tested > 0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
int main(void) {
|
|
97
|
+
UNITY_BEGIN();
|
|
98
|
+
|
|
99
|
+
{% for pin in gpio_pins %}
|
|
100
|
+
RUN_TEST(test_gpio_{{ pin.number }}_init);
|
|
101
|
+
{% if pin.direction == 'output' %}
|
|
102
|
+
RUN_TEST(test_gpio_{{ pin.number }}_output_high);
|
|
103
|
+
RUN_TEST(test_gpio_{{ pin.number }}_output_low);
|
|
104
|
+
{% elif pin.direction == 'input' %}
|
|
105
|
+
RUN_TEST(test_gpio_{{ pin.number }}_input);
|
|
106
|
+
{% endif %}
|
|
107
|
+
RUN_TEST(test_gpio_{{ pin.number }}_continuity);
|
|
108
|
+
{% endfor %}
|
|
109
|
+
RUN_TEST(test_multiple_gpio_outputs);
|
|
110
|
+
RUN_TEST(test_gpio_pin_conflicts);
|
|
111
|
+
|
|
112
|
+
return UNITY_END();
|
|
113
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* I2C Device Tests - Auto-generated from KiCad schematic
|
|
3
|
+
* Generated by: kicad-mcp-server
|
|
4
|
+
* Framework: Unity Test Framework
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include "unity.h"
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
|
|
10
|
+
/* I2C hardware abstraction */
|
|
11
|
+
extern void i2c_init(uint32_t bus);
|
|
12
|
+
extern uint8_t i2c_read_byte(uint32_t bus, uint8_t address, uint8_t reg);
|
|
13
|
+
extern void i2c_write_byte(uint32_t bus, uint8_t address, uint8_t reg, uint8_t data);
|
|
14
|
+
|
|
15
|
+
{% for device in i2c_devices %}
|
|
16
|
+
/* Test I2C device {{ device.reference }} - {{ device.value }} */
|
|
17
|
+
void test_i2c_device_{{ loop.index }}_detection(void) {
|
|
18
|
+
/* Test I2C device detection at address 0x{{ "%02X"|format(device.address) }} */
|
|
19
|
+
uint8_t expected_address = 0x{{ "%02X"|format(device.address) }};
|
|
20
|
+
|
|
21
|
+
/* Attempt to read from device */
|
|
22
|
+
i2c_init(1);
|
|
23
|
+
uint8_t data = i2c_read_byte(1, expected_address, 0x00);
|
|
24
|
+
|
|
25
|
+
/* If we get here without timeout, device was detected */
|
|
26
|
+
TEST_ASSERT_MESSAGE(1, "I2C device detection test passed");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void test_i2c_device_{{ loop.index }}_communication(void) {
|
|
30
|
+
/* Test I2C communication with {{ device.value }} */
|
|
31
|
+
uint8_t expected_address = 0x{{ "%02X"|format(device.address) }};
|
|
32
|
+
|
|
33
|
+
/* Test read operation */
|
|
34
|
+
uint8_t chip_id = i2c_read_byte(1, expected_address, 0x00);
|
|
35
|
+
|
|
36
|
+
/* Verify we can read from device */
|
|
37
|
+
TEST_ASSERT(chip_id != 0xFF || chip_id != 0x00, "Failed to communicate with device");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void test_i2c_device_{{ loop.index }}_specific(void) {
|
|
41
|
+
/* Test {{ device.value }} specific functionality */
|
|
42
|
+
/* Compatible: {{ device.compatible }} */
|
|
43
|
+
|
|
44
|
+
/* TODO: Add device-specific tests */
|
|
45
|
+
/* Examples: */
|
|
46
|
+
/* - Read chip ID register */
|
|
47
|
+
/* - Verify sensor readings */
|
|
48
|
+
/* - Test configuration registers */
|
|
49
|
+
TEST_ASSERT_MESSAGE(1, "Device-specific tests not implemented");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
{% endfor %}
|
|
53
|
+
|
|
54
|
+
/* Test I2C bus */
|
|
55
|
+
void test_i2c_bus_scan(void) {
|
|
56
|
+
/* Test I2C bus scan functionality */
|
|
57
|
+
|
|
58
|
+
/* Expected devices */
|
|
59
|
+
const uint8_t expected_addresses[] = {
|
|
60
|
+
{% for device in i2c_devices %}
|
|
61
|
+
0x{{ "%02X"|format(device.address) }},
|
|
62
|
+
{% endfor %}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/* Scan I2C bus */
|
|
66
|
+
uint8_t found_count = 0;
|
|
67
|
+
for (uint8_t i = 0; i < sizeof(expected_addresses); i++) {
|
|
68
|
+
uint8_t address = expected_addresses[i];
|
|
69
|
+
uint8_t data = i2c_read_byte(1, address, 0x00);
|
|
70
|
+
if (data != 0xFF && data != 0x00) {
|
|
71
|
+
found_count++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Verify at least some devices were found */
|
|
76
|
+
TEST_ASSERT(found_count > 0, "No I2C devices found on bus");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
void test_i2c_bus_voltage_levels(void) {
|
|
80
|
+
/* Test I2C bus voltage levels */
|
|
81
|
+
|
|
82
|
+
/* TODO: Implement voltage level testing */
|
|
83
|
+
/* - Verify pull-up resistors are present */
|
|
84
|
+
/* - Check bus idle state (high) */
|
|
85
|
+
/* - Measure voltage levels */
|
|
86
|
+
TEST_ASSERT_MESSAGE(1, "Voltage level test not implemented");
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
int main(void) {
|
|
90
|
+
UNITY_BEGIN();
|
|
91
|
+
|
|
92
|
+
{% for device in i2c_devices %}
|
|
93
|
+
RUN_TEST(test_i2c_device_{{ loop.index }}_detection);
|
|
94
|
+
RUN_TEST(test_i2c_device_{{ loop.index }}_communication);
|
|
95
|
+
RUN_TEST(test_i2c_device_{{ loop.index }}_specific);
|
|
96
|
+
{% endfor %}
|
|
97
|
+
RUN_TEST(test_i2c_bus_scan);
|
|
98
|
+
RUN_TEST(test_i2c_bus_voltage_levels);
|
|
99
|
+
|
|
100
|
+
return UNITY_END();
|
|
101
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SPI Device Tests - Auto-generated from KiCad schematic
|
|
3
|
+
* Generated by: kicad-mcp-server
|
|
4
|
+
* Framework: Unity Test Framework
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
#include "unity.h"
|
|
8
|
+
#include <stdint.h>
|
|
9
|
+
|
|
10
|
+
/* SPI hardware abstraction */
|
|
11
|
+
extern void spi_init(uint32_t bus, uint32_t cs);
|
|
12
|
+
extern uint8_t spi_transfer_byte(uint32_t bus, uint32_t cs, uint8_t data);
|
|
13
|
+
|
|
14
|
+
{% for device in spi_devices %}
|
|
15
|
+
/* Test SPI device {{ device.reference }} - {{ device.value }} */
|
|
16
|
+
void test_spi_device_{{ loop.index }}_detection(void) {
|
|
17
|
+
/* Test SPI device detection on CS {{ device.cs }} */
|
|
18
|
+
uint32_t cs_pin = {{ device.cs }};
|
|
19
|
+
uint32_t frequency = {{ device.frequency }};
|
|
20
|
+
|
|
21
|
+
/* Initialize SPI */
|
|
22
|
+
spi_init(0, cs_pin);
|
|
23
|
+
|
|
24
|
+
/* Test basic communication */
|
|
25
|
+
uint8_t response = spi_transfer_byte(0, cs_pin, 0x9F); /* JEDEC ID command */
|
|
26
|
+
|
|
27
|
+
/* Verify we got a response */
|
|
28
|
+
TEST_ASSERT(response != 0xFF || response != 0x00, "No response from device");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void test_spi_device_{{ loop.index }}_communication(void) {
|
|
32
|
+
/* Test SPI communication with {{ device.value }} */
|
|
33
|
+
uint32_t cs_pin = {{ device.cs }};
|
|
34
|
+
|
|
35
|
+
/* Test data transfer */
|
|
36
|
+
uint8_t test_data = 0xAA;
|
|
37
|
+
uint8_t response = spi_transfer_byte(0, cs_pin, test_data);
|
|
38
|
+
|
|
39
|
+
/* Verify communication */
|
|
40
|
+
TEST_ASSERT_MESSAGE(1, "SPI communication test passed");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
void test_spi_device_{{ loop.index }}_specific(void) {
|
|
44
|
+
/* Test {{ device.value }} specific functionality */
|
|
45
|
+
/* Compatible: {{ device.compatible }} */
|
|
46
|
+
|
|
47
|
+
/* TODO: Add device-specific tests */
|
|
48
|
+
/* Examples: */
|
|
49
|
+
/* - Read JEDEC ID */
|
|
50
|
+
/* - Verify register access */
|
|
51
|
+
/* - Test data transfer */
|
|
52
|
+
TEST_ASSERT_MESSAGE(1, "Device-specific tests not implemented");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
{% endfor %}
|
|
56
|
+
|
|
57
|
+
/* Test SPI bus */
|
|
58
|
+
void test_spi_bus_configuration(void) {
|
|
59
|
+
/* Test SPI bus configuration */
|
|
60
|
+
|
|
61
|
+
/* TODO: Implement bus configuration tests */
|
|
62
|
+
/* - Verify clock polarity and phase */
|
|
63
|
+
/* - Check appropriate clock frequency */
|
|
64
|
+
/* - Test proper chip select handling */
|
|
65
|
+
TEST_ASSERT_MESSAGE(1, "SPI bus configuration test not implemented");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void test_spi_data_transfer(void) {
|
|
69
|
+
/* Test SPI data transfer */
|
|
70
|
+
|
|
71
|
+
/* Test multiple bytes */
|
|
72
|
+
uint8_t test_data[] = {0xAA, 0x55, 0xFF, 0x00};
|
|
73
|
+
|
|
74
|
+
for (uint8_t i = 0; i < sizeof(test_data); i++) {
|
|
75
|
+
uint8_t response = spi_transfer_byte(0, 0, test_data[i]);
|
|
76
|
+
/* Verify response */
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
TEST_ASSERT_MESSAGE(1, "SPI data transfer test passed");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
int main(void) {
|
|
83
|
+
UNITY_BEGIN();
|
|
84
|
+
|
|
85
|
+
{% for device in spi_devices %}
|
|
86
|
+
RUN_TEST(test_spi_device_{{ loop.index }}_detection);
|
|
87
|
+
RUN_TEST(test_spi_device_{{ loop.index }}_communication);
|
|
88
|
+
RUN_TEST(test_spi_device_{{ loop.index }}_specific);
|
|
89
|
+
{% endfor %}
|
|
90
|
+
RUN_TEST(test_spi_bus_configuration);
|
|
91
|
+
RUN_TEST(test_spi_data_transfer);
|
|
92
|
+
|
|
93
|
+
return UNITY_END();
|
|
94
|
+
}
|
package/mcp_servers/kicad-mcp-server/src/kicad_mcp_server/templates/unittest/test_schematic.py.j2
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unit test suite for {{ project_name }}
|
|
3
|
+
Generated from {{ schematic_path }}
|
|
4
|
+
|
|
5
|
+
This test suite provides connectivity and functional verification
|
|
6
|
+
using Python's unittest framework.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import unittest
|
|
10
|
+
from typing import Dict, List, Any
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# Netlist derived from schematic
|
|
14
|
+
NETLIST = {
|
|
15
|
+
{% for net in nets %}
|
|
16
|
+
"{{ net.name }}": {
|
|
17
|
+
"code": {{ net.code }},
|
|
18
|
+
"pins": {{ net.pins | tojson }},
|
|
19
|
+
},
|
|
20
|
+
{% endfor %}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
# Component information
|
|
24
|
+
COMPONENTS = {
|
|
25
|
+
{% for comp in components %}
|
|
26
|
+
"{{ comp.reference }}": {
|
|
27
|
+
"value": "{{ comp.value }}",
|
|
28
|
+
"footprint": "{{ comp.footprint or 'N/A' }}",
|
|
29
|
+
},
|
|
30
|
+
{% endfor %}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TestSchematicConnectivity(unittest.TestCase):
|
|
35
|
+
"""Test cases for schematic connectivity."""
|
|
36
|
+
|
|
37
|
+
def test_power_nets_exist(self):
|
|
38
|
+
"""Verify power nets are present."""
|
|
39
|
+
net_names = list(NETLIST.keys())
|
|
40
|
+
power_keywords = ["GND", "VCC", "VDD", "+3V3", "+5V"]
|
|
41
|
+
|
|
42
|
+
power_nets = [
|
|
43
|
+
name for name in net_names
|
|
44
|
+
if any(pw in name.upper() for pw in power_keywords)
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
self.assertGreater(len(power_nets), 0, "No power nets found")
|
|
48
|
+
print(f"Power nets: {power_nets}")
|
|
49
|
+
|
|
50
|
+
def test_component_references_unique(self):
|
|
51
|
+
"""Verify all component references are unique."""
|
|
52
|
+
refs = list(COMPONENTS.keys())
|
|
53
|
+
unique_refs = set(refs)
|
|
54
|
+
|
|
55
|
+
self.assertEqual(len(refs), len(unique_refs), "Duplicate references found")
|
|
56
|
+
|
|
57
|
+
def test_components_have_values(self):
|
|
58
|
+
"""Verify components have valid values."""
|
|
59
|
+
missing_values = []
|
|
60
|
+
|
|
61
|
+
for ref, data in COMPONENTS.items():
|
|
62
|
+
if not data["value"] or data["value"] in ["", "?"]:
|
|
63
|
+
missing_values.append(ref)
|
|
64
|
+
|
|
65
|
+
self.assertEqual(len(missing_values), 1, f"Missing values: {missing_values}")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class TestFunctionalVerification(unittest.TestCase):
|
|
69
|
+
"""Test cases for functional verification."""
|
|
70
|
+
|
|
71
|
+
def test_mcu_power_supply(self):
|
|
72
|
+
"""Verify MCU has proper power connections."""
|
|
73
|
+
# Find MCU components
|
|
74
|
+
mcu_refs = [
|
|
75
|
+
ref for ref, data in COMPONENTS.items()
|
|
76
|
+
if any(mcu in data["value"].lower() for mcu in ["mcu", "micro", "atmega", "stm32", "esp"])
|
|
77
|
+
]
|
|
78
|
+
|
|
79
|
+
if not mcu_refs:
|
|
80
|
+
self.skipTest("No MCU found in schematic")
|
|
81
|
+
|
|
82
|
+
# Check for VCC and GND connections to MCU
|
|
83
|
+
mcu_ref = mcu_refs[0]
|
|
84
|
+
vcc_connected = any(
|
|
85
|
+
f"{mcu_ref}:" in pin
|
|
86
|
+
for net in NETLIST.values()
|
|
87
|
+
for pin in net["pins"]
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
self.assertTrue(vcc_connected, f"{mcu_ref} may not be properly powered")
|
|
91
|
+
|
|
92
|
+
def test_communication_interfaces(self):
|
|
93
|
+
"""Verify communication interface signals."""
|
|
94
|
+
interface_nets = {
|
|
95
|
+
"UART": ["tx", "rx"],
|
|
96
|
+
"I2C": ["sda", "scl"],
|
|
97
|
+
"SPI": ["mosi", "miso", "sck"],
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
detected_interfaces = []
|
|
101
|
+
|
|
102
|
+
for interface, signals in interface_nets.items():
|
|
103
|
+
net_names = list(NETLIST.keys())
|
|
104
|
+
if any(
|
|
105
|
+
any(sig in name.lower() for sig in signals)
|
|
106
|
+
for name in net_names
|
|
107
|
+
):
|
|
108
|
+
detected_interfaces.append(interface)
|
|
109
|
+
|
|
110
|
+
print(f"Detected interfaces: {detected_interfaces}")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
{% if test_type == "production" %}
|
|
114
|
+
class TestProductionReadiness(unittest.TestCase):
|
|
115
|
+
"""Test cases for production readiness."""
|
|
116
|
+
|
|
117
|
+
def test_footprint_completeness(self):
|
|
118
|
+
"""Verify all components have footprints."""
|
|
119
|
+
missing_footprints = []
|
|
120
|
+
|
|
121
|
+
for ref, data in COMPONENTS.items():
|
|
122
|
+
if data["footprint"] in ["N/A", "", None]:
|
|
123
|
+
missing_footprints.append(ref)
|
|
124
|
+
|
|
125
|
+
self.assertEqual(
|
|
126
|
+
len(missing_footprints), 0,
|
|
127
|
+
f"Components without footprints: {missing_footprints}"
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def test_net_connectivity(self):
|
|
131
|
+
"""Verify critical nets have proper connections."""
|
|
132
|
+
# Find nets with only one pin (possible unconnected pins)
|
|
133
|
+
single_pin_nets = [
|
|
134
|
+
name for name, data in NETLIST.items()
|
|
135
|
+
if len(data["pins"]) <= 1
|
|
136
|
+
]
|
|
137
|
+
|
|
138
|
+
# Allow some single-pin nets (e.g., test points, no-connects)
|
|
139
|
+
self.assertLess(
|
|
140
|
+
len(single_pin_nets), 20,
|
|
141
|
+
f"Too many single-pin nets: {single_pin_nets[:10]}"
|
|
142
|
+
)
|
|
143
|
+
{% endif %}
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def run_tests() -> None:
|
|
147
|
+
"""Run all tests and print results."""
|
|
148
|
+
# Create test suite
|
|
149
|
+
loader = unittest.TestLoader()
|
|
150
|
+
suite = unittest.TestSuite()
|
|
151
|
+
|
|
152
|
+
# Add all test cases
|
|
153
|
+
suite.addTests(loader.loadTestsFromTestCase(TestSchematicConnectivity))
|
|
154
|
+
suite.addTests(loader.loadTestsFromTestCase(TestFunctionalVerification))
|
|
155
|
+
{% if test_type == "production" %}
|
|
156
|
+
suite.addTests(loader.loadTestsFromTestCase(TestProductionReadiness))
|
|
157
|
+
{% endif %}
|
|
158
|
+
|
|
159
|
+
# Run tests
|
|
160
|
+
runner = unittest.TextTestRunner(verbosity=2)
|
|
161
|
+
result = runner.run(suite)
|
|
162
|
+
|
|
163
|
+
# Print summary
|
|
164
|
+
print("\n" + "=" * 70)
|
|
165
|
+
print(f"Tests run: {result.testsRun}")
|
|
166
|
+
print(f"Failures: {len(result.failures)}")
|
|
167
|
+
print(f"Errors: {len(result.errors)}")
|
|
168
|
+
print("=" * 70)
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
if __name__ == "__main__":
|
|
172
|
+
run_tests()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""KiCad MCP Server Tools
|
|
2
|
+
|
|
3
|
+
Core KiCad operations - simplified and focused.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from . import (
|
|
7
|
+
device_tree,
|
|
8
|
+
hierarchical_analysis,
|
|
9
|
+
netlist,
|
|
10
|
+
parts_registry,
|
|
11
|
+
pcb,
|
|
12
|
+
pcb_layout,
|
|
13
|
+
pin_analysis,
|
|
14
|
+
project,
|
|
15
|
+
schematic,
|
|
16
|
+
schematic_editor,
|
|
17
|
+
schematic_search,
|
|
18
|
+
validation,
|
|
19
|
+
visualization,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
__all__ = [
|
|
23
|
+
"project",
|
|
24
|
+
"schematic",
|
|
25
|
+
"schematic_editor",
|
|
26
|
+
"pcb",
|
|
27
|
+
"pcb_layout",
|
|
28
|
+
"netlist",
|
|
29
|
+
"device_tree",
|
|
30
|
+
"hierarchical_analysis",
|
|
31
|
+
"pin_analysis",
|
|
32
|
+
"schematic_search",
|
|
33
|
+
"validation",
|
|
34
|
+
"parts_registry",
|
|
35
|
+
"visualization",
|
|
36
|
+
]
|