# Why Use kicad-sch-api? ## The Problem: Manual Circuit Design Doesn't Scale Imagine these scenarios: ### Scenario 1: Repetitive Design Work You need to create 20 voltage regulator circuits, each with slightly different input/output voltages. In KiCAD's GUI, this means: - Creating 20 separate schematics - Placing the same components 20 times - Wiring them the same way 20 times - Changing values manually for each one - High risk of copy-paste errors **With kicad-sch-api:** ```python for v_in, v_out in [(5, 3.3), (12, 5), (24, 12), ...]: create_regulator_circuit(f"reg_{v_in}v_to_{v_out}v", v_in, v_out) ``` Done in seconds, zero errors, fully automated. ### Scenario 2: Design Space Exploration You want to try every combination of component values to find the optimal design: - 5 resistor values × 5 capacitor values = 25 circuits - Manual creation: 25 × 5 minutes = **2+ hours** - Testing each one in simulation **With kicad-sch-api:** ```python for r_val in [1000, 2200, 4700, 10000, 22000]: for c_val in [10e-9, 22e-9, 47e-9, 100e-9, 220e-9]: sch = create_rc_filter(r_val, c_val) sch.save(f"filter_R{r_val}_C{int(c_val*1e9)}nF.kicad_sch") ``` 25 circuits generated in under a second. ### Scenario 3: Automated Testing You need to generate test circuits for every pin combination on a 64-pin IC: - Manual creation: days of tedious work - High error rate - Difficult to maintain **With kicad-sch-api:** ```python for pin_num in range(1, 65): create_pin_test_circuit(ic_part_number, pin_num) ``` Automated, repeatable, maintainable. ## What Makes This Library Different? ### 1. **Exact Format Preservation** Other tools approximate KiCAD's format. This library guarantees **byte-perfect output**. **Why this matters:** - Your generated files are indistinguishable from hand-drawn schematics - KiCAD opens them without warnings or errors - Version control diffs are clean and meaningful - No "generated file" stigma **Example comparison:** ``` ❌ Other libraries: - Approximate spacing: components might overlap - Missing properties: KiCAD shows warnings - Wrong formatting: looks "computer generated" - Manual cleanup required ✅ kicad-sch-api: - Perfect spacing: uses KiCAD's grid system - Complete properties: all fields properly set - Native formatting: looks hand-drawn - Zero cleanup needed ``` ### 2. **Real KiCAD Library Integration** The library reads actual KiCAD symbol libraries and validates components. ```python # This will fail if "Device:R" doesn't exist in your KiCAD installation sch.components.add("Device:R", "R1", "10k", (100, 100)) ``` **Benefits:** - No guessing at component pin layouts - Automatic pin position calculation - Real footprint validation - Matches your KiCAD installation exactly ### 3. **Professional Object-Oriented API** Built with modern Python practices: ```python # Clean, intuitive API resistors = sch.components.filter(lib_id="Device:R") for r in resistors: if float(r.value.replace("k", "000")) > 100000: r.set_property("Power", "0.25W") # Upgrade high-value resistors # Type hints and validation everywhere sch.components.add( lib_id="Device:R", # Validated against KiCAD libraries reference="R1", # Validated format (letter + number) value="10k", # String, any format position=(100, 100), # Tuple or Point object footprint="Resistor_SMD:R_0805_2012Metric" # Validated ) ``` ### 4. **Performance Optimized** Designed for large schematics with hundreds of components: ```python # O(1) lookups with indexed collections resistor = sch.components.get("R1") # Instant, not O(n) search # Bulk operations sch.components.bulk_update( criteria={'lib_id': 'Device:R'}, updates={'properties': {'Tolerance': '1%'}} ) # Updates 100 resistors faster than individual updates # Lazy symbol loading # Symbols only loaded when needed, cached automatically ``` ### 5. **AI Agent Ready** Purpose-built for AI integration with MCP (Model Context Protocol): ```python # From AI agent (Claude, GPT, etc.): # "Create a voltage divider with 5V input, 3.3V output" # MCP server translates this to: sch = ksa.create_schematic("voltage_divider") r1, r2 = calculate_divider_values(5.0, 3.3) create_voltage_divider(sch, "DIV1", r1, r2, (100, 100)) sch.save("voltage_divider.kicad_sch") # Result: AI can design circuits through natural language ``` ## Use Cases ### 1. **Circuit Generation from Specifications** Input: JSON specification Output: Complete KiCAD schematic ```python spec = { "type": "power_supply", "input_voltage": 12, "output_voltage": 5, "max_current": 2, "topology": "buck" } sch = generate_power_supply(spec) sch.save("power_supply_12v_to_5v_2a.kicad_sch") ``` ### 2. **Automated Test Circuit Generation** ```python # Generate test circuits for every component in your library for part in component_database: test_sch = create_component_test_circuit(part) test_sch.save(f"test_{part.mpn}.kicad_sch") ``` ### 3. **Schematic Validation and Analysis** ```python sch = ksa.load_schematic("production_design.kicad_sch") # Check for design rules issues = [] # Missing decoupling capacitors? ics = sch.components.filter(reference_pattern=r"U\d+") for ic in ics: nearby_caps = find_nearby_capacitors(sch, ic, radius=20) # 20mm if len(nearby_caps) < 2: issues.append(f"{ic.reference} may need more decoupling caps") # Resistor power ratings? for r in sch.components.filter(lib_id="Device:R"): if "Power" not in r.properties: issues.append(f"{r.reference} missing power rating") # Generate report print(f"Found {len(issues)} potential issues") ``` ### 4. **BOM Management and Cost Optimization** ```python sch = ksa.load_schematic("product.kicad_sch") # Extract BOM bom = extract_bom(sch) # Check component availability and pricing for item in bom: alternatives = find_cheaper_alternatives(item) if alternatives: print(f"Could save money on {item.reference}: {alternatives[0].price}") ``` ### 5. **Circuit Template Libraries** ```python # Build reusable templates templates = { "voltage_regulator": create_regulator_template, "rc_filter": create_rc_filter_template, "op_amp_buffer": create_buffer_template, } # Use them sch = ksa.create_schematic("my_design") templates["voltage_regulator"](sch, "REG1", v_in=12, v_out=5, position=(100, 100)) templates["rc_filter"](sch, "FILT1", cutoff_freq=1000, position=(200, 100)) sch.save("my_design.kicad_sch") ``` ### 6. **Educational Tools** Generate teaching materials: ```python # Create a series of circuits showing progression circuits = [ ("01_basic_resistor", create_simple_resistor), ("02_resistor_divider", create_voltage_divider), ("03_rc_filter", create_rc_filter), ("04_active_filter", create_active_filter), ] for name, generator in circuits: sch = generator() sch.save(f"lesson_{name}.kicad_sch") ``` ## Comparison to Alternatives ### vs. Manual KiCAD GUI Design | Feature | Manual GUI | kicad-sch-api | |---------|-----------|---------------| | Create 1 circuit | ⭐⭐⭐⭐⭐ Fast | ⭐⭐⭐ Slower (coding overhead) | | Create 100 similar circuits | ⭐ Very slow, error-prone | ⭐⭐⭐⭐⭐ Fast, automated | | Parametric design | ❌ Not possible | ⭐⭐⭐⭐⭐ Easy | | Version control | ⭐⭐⭐ Possible but messy | ⭐⭐⭐⭐⭐ Clean diffs | | Automation | ❌ Not possible | ⭐⭐⭐⭐⭐ Full automation | | Learning curve | ⭐⭐⭐⭐⭐ Visual, intuitive | ⭐⭐⭐ Requires programming | **When to use GUI:** Single, unique designs that don't need to be repeated **When to use kicad-sch-api:** Repetitive work, parametric design, automation, testing ### vs. Other Python KiCAD Libraries | Feature | Other Libraries | kicad-sch-api | |---------|----------------|---------------| | Format preservation | ❌ Approximate | ✅ Byte-perfect | | KiCAD library integration | ❌ Limited or none | ✅ Full integration | | Component validation | ❌ Manual | ✅ Automatic | | Pin-to-pin wiring | ❌ Manual calculations | ✅ Automatic | | Performance | ⭐⭐⭐ Decent | ⭐⭐⭐⭐⭐ Optimized | | Type hints | ❌ Limited | ✅ Full typing | | AI integration | ❌ Not designed for it | ✅ MCP server available | | Active maintenance | ⭐⭐ Varies | ⭐⭐⭐⭐⭐ Active | ### vs. Direct S-Expression Manipulation Writing KiCAD's S-expression format directly: ```python # ❌ Direct S-expression (painful!) file.write('(symbol (lib_id "Device:R") (at 100 100 0) (unit 1)\n') file.write(' (property "Reference" "R1" (at 100 98 0)\n') file.write(' (effects (font (size 1.27 1.27)))\n') file.write(' )\n') # ... 50 more lines of formatting ... # ✅ kicad-sch-api (simple!) sch.components.add("Device:R", "R1", "10k", (100, 100)) ``` **S-expression issues:** - Easy to make formatting errors - No validation - Verbose and repetitive - Hard to maintain - Pin positions must be calculated manually ## Real-World Success Stories ### Story 1: Automated Test Suite Generation **Problem:** Hardware team needed test circuits for 200 different ICs **Solution:** Script generated all 200 test schematics in 5 minutes **Result:** Saved 40 hours of manual work, zero errors ### Story 2: Design Space Exploration **Problem:** Finding optimal component values for a filter **Solution:** Generated 100 variations, simulated all, found optimum **Result:** Better performing design found in hours instead of weeks ### Story 3: AI-Powered Circuit Design **Problem:** Non-engineers needed to generate simple circuits **Solution:** AI agent with MCP server generates circuits from natural language **Result:** Anyone can now create valid KiCAD schematics ## When NOT to Use This Library Be honest about limitations: ### ❌ Don't use for: 1. **One-off custom designs** - GUI is faster 2. **Complex analog layouts** - GUI placement is better 3. **Learning KiCAD** - Learn the GUI first 4. **PCB layout** - This is schematic-only (PCB coming later) ### ✅ Do use for: 1. **Repetitive designs** 2. **Parametric circuits** 3. **Automated testing** 4. **Design space exploration** 5. **AI-powered design** 6. **Circuit generation from specs** 7. **BOM management and analysis** ## Getting Started Ready to try it? 1. **Install:** `pip install kicad-sch-api` 2. **Quick start:** See [GETTING_STARTED.md](GETTING_STARTED.md) 3. **Examples:** Check `examples/` directory 4. **API Reference:** See [API_REFERENCE.md](API_REFERENCE.md) ## FAQ **Q: Will this work with my KiCAD installation?** A: Yes, works with KiCAD 7 and 8. Reads your actual KiCAD library files. **Q: Can I edit schematics I created in KiCAD's GUI?** A: Yes! Load with `ksa.load_schematic()`, modify, and save. **Q: Does this replace KiCAD?** A: No - it generates files that you open in KiCAD. Complementary tools. **Q: How steep is the learning curve?** A: If you know Python and basic circuits: 1-2 hours to be productive. **Q: Can I integrate with manufacturing tools?** A: Yes - netlist generation and BOM export are supported. **Q: What about AI integration?** A: Full MCP server available: [mcp-kicad-sch-api](https://github.com/circuit-synth/mcp-kicad-sch-api) --- **Bottom line:** If you're doing repetitive circuit design, parametric generation, or automation, this library will save you massive amounts of time while producing perfect KiCAD schematics. 🚀