Skip to the content
PCBKitNew board
2 layers42 × 27 mmLayouts, the printed circuit board in 3D

KiCAD EDA automatic component placement tool

Size
42 × 27 mm
Copper layers
2
Thickness
1.6 mm
Parts
66
Nets
74
Pads
281
Tracks, vias
488, 81
Pours
11
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
11 Jan 2026
Updated
19 Jan 2026

Overview

Layouts is an open-source printed circuit board by glovepost, from the glovepost/atoplace repository on GitHub, published under the MIT licence. It is a 2-layer board of 42 × 27 mm with 66 parts on 74 nets, routed with 488 tracks and 81 vias.

Its parts include 27 capacitors, 21 resistors, 5 diodes, 4 ICs and 2 switches.

README

README.md

atoplace [blocked]


License Python Version Status KiCad Support KiCad 9 Live IPC

The AI Pair Designer for Professional PCB Layout

atoplace is an intelligent orchestration layer for PCB design that bridges the gap between schematic and physical layout. It automates the tedious 80% of design—placement optimization and DFM validation—while strictly adhering to "Manhattan" aesthetics and Signal Integrity (SI) best practices.

Designed to work seamlessly with atopile and KiCad.

atoplace placement visualization

🚀 Why atoplace?

PCB layout automation has historically been "black box" and "messy"—producing organic, unreadable layouts that professional engineers reject. atoplace takes a different approach:

  • Human-Grade Aesthetics: We don't just minimize wirelength. We enforce grids, alignment, and orthogonal routing so the result looks like you designed it.
  • Physics-First: We model high-degree nets (GND/VCC) correctly to prevent component collapse, and prioritize critical signals (USB, RF) before general routing.
  • Transparent & Interactive: No lock-in. The source of truth is always your .kicad_pcb file. You can take over manually at any second.

✨ Key Features

  • 🧩 Manhattan Legalizer: Transforms "organic" force-directed placements into professional, grid-snapped, and row-aligned layouts using PCA axis detection and Abacus-style overlap resolution.
  • 🧠 Intelligent Placement: Force-directed annealing engine with a Star Model for stable high-degree net (GND/VCC) handling and adaptive damping for oscillation control.
  • 🚀 A Routing*: High-performance, deterministic geometric router using a Greedy Multiplier ($w=2-3$) and Spatial Hash Indexing for O(~1) collision detection.
  • 🔍 Confidence Scoring: Automated assessment of your board's routability, signal integrity risks, and DFM compliance.
  • 💬 Natural Language Control: "Move the USB connector to the left edge", "Align these capacitors", "Keep the crystal near the MCU".
  • 🔌 Atopile Native: First-class support for atopile projects with ato-lock.yaml parsing, module-aware grouping, and atoplace.lock sidecar persistence to preserve placements across rebuilds.
  • 📊 Interactive Visualization: Unified SVG delta viewer with real-time playback, layer toggles, grid customization, force vector display, routing trace visualization, and A* debug mode for step-by-step algorithm analysis.

🛠️ Installation

bash
pip install atoplace

Requirements

  • Python 3.10+
  • KiCad 8.0+ (atoplace uses the pcbnew Python API)

Pro Tip: atoplace works best when run using the Python interpreter bundled with KiCad:

macOS:

bash
/Applications/KiCad/KiCad.app/Contents/Frameworks/Python.framework/Versions/Current/bin/python3 -m pip install atoplace

Windows:

powershell
"C:\Program Files\KiCad\8.0\bin\python.exe" -m pip install atoplace

⚡ Quick Start

1. Optimize Placement

Automatically place components with "Manhattan" legalization:

bash
atoplace place board.kicad_pcb --grid 0.5 --constraints "USB on left edge"

2. Route the Board

Route all nets using the internal A* geometric planner:

bash
atoplace route board.kicad_pcb --visualize

3. Validate Layout

Check your board against DFM rules (JLCPCB, OSH Park, etc.):

bash
atoplace validate board.kicad_pcb --dfm jlcpcb_standard

4. Interactive Mode

Refine your design using natural language:

bash
atoplace interactive board.kicad_pcb
# > "Rotate U1 45 degrees"
# > "Move C1 closer to U1"
# > "Save"

5. MCP Server (LLM Integration)

Expose atoplace tools to AI agents via the Model Context Protocol:

bash
atoplace mcp --launch

See MCP Server section below for details.

🗺️ Roadmap

  • Milestone A (Q1 2026): Solid Foundation ✅
    • Manhattan Legalizer (Grid snapping & PCA Alignment).
    • Physics Engine scaling (Star Model & Adaptive Damping).
    • Atopile ato-lock.yaml and module hierarchy integration.
  • Milestone B (Q1-Q2 2026): Routing & Persistence ✅
    • A Geometric Planner* (Greedy Multiplier & Spatial Indexing).
    • MCP Server with 40+ tools for LLM agent integration.
    • Live KiCad IPC via kipy for real-time component manipulation (KiCad 9+).
    • atoplace.lock Sidecar Persistence for atopile projects.
    • Unified Visualization (SVG delta viewer with routing support).
    • BGA/QFN Fanout Generator (dogbone & via-in-pad strategies).
    • Pin Swap Optimization (bipartite matching for crossing reduction).
  • Milestone C (Q2 2026): Professional Agent 🚧
    • Differential Pair Detection (auto-detect from net names).
    • Differential Pair Coupled Routing.
    • Deep Signal Integrity Analysis (Crosstalk/Impedance).
    • Automated Manufacturing Outputs (Gerbers/BOM/PNP).
    • Multi-board design support.

📂 Architecture

text
atoplace/
├── board/          # Board abstraction & KiCad/Atopile adapters
│   ├── abstraction.py      # Board, Component, Net, Pad data models
│   ├── kicad_adapter.py    # KiCad pcbnew integration
│   ├── lock_file.py        # atoplace.lock sidecar persistence
│   └── atopile_adapter.py  # Atopile project loader
├── placement/      # Force-directed physics & Manhattan Legalizer
│   ├── force_directed.py   # Physics Engine (Star Model, adaptive damping)
│   ├── legalizer.py        # Manhattan Pipeline with PCA alignment
│   ├── module_detector.py  # Functional module hierarchy analysis
│   ├── constraints.py      # Placement constraints (Proximity, Edge, Zone, etc.)
│   └── visualizer.py       # SVG delta visualization with frame capture
├── routing/        # A* Geometric Router
│   ├── astar_router.py     # Core A* with Greedy Multiplier (w=2-3)
│   ├── manager.py          # Multi-phase routing pipeline
│   ├── spatial_index.py    # O(~1) collision detection via spatial hashing
│   ├── obstacle_map.py     # Obstacle generation from board
│   ├── diff_pairs.py       # Differential pair detection
│   ├── visualizer.py       # Routing visualization with A* debug
│   └── fanout/             # BGA/QFN escape routing
├── visualization/  # Unified visualization system
│   └── assets/             # External JS/CSS for HTML viewer
│       ├── svg-delta-viewer.js  # Interactive SVG playback engine
│       └── styles.css      # KiCad-inspired dark theme

🤖 MCP Server

atoplace includes a Model Context Protocol (MCP) server that exposes 40+ PCB design tools to LLM agents like Claude. This enables conversational PCB layout design with support for placement, routing, fanout generation, and design validation.

Quick Start

Just run:

bash
python -m atoplace.mcp.launcher

That's it! The launcher:

  • Auto-detects KiCad Python on macOS, Linux, and Windows
  • Starts the KiCad bridge (for pcbnew access)
  • Starts the MCP server (exposes tools to LLM)
  • Manages lifecycle and clean shutdown

Claude Code / Claude Desktop Configuration

Add to your MCP config:

json
{
  "mcpServers": {
    "atoplace": {
      "command": "python",
      "args": ["-m", "atoplace.mcp.launcher"]
    }
  }
}

Note: Replace python with the path to your atoplace virtualenv Python if needed.

🔴 Live KiCad IPC Mode (KiCad 9+)

New! With KiCad 9+, atoplace can manipulate components in real-time without save/reload cycles. Changes appear instantly in your KiCad viewport!

Requirements:

  • KiCad 9.0 or later (with IPC API enabled)
  • kicad-python package: pip install kicad-python

Setup:

bash
# Install the kipy optional dependency
pip install atoplace[kipy]

# Or install directly
pip install kicad-python

Usage:

  1. Open your .kicad_pcb in KiCad 9+ PCB Editor
  2. Start the MCP server with the kipy backend:
    bash
    ATOPLACE_BACKEND=kipy python -m atoplace.mcp.launcher
  3. Components move instantly as you interact with the LLM!

How it works: The kipy backend connects directly to KiCad's IPC socket and uses the official API to update component positions in real-time. Native undo/redo (Cmd/Ctrl+Z) works seamlessly.

Architecture

mermaid
flowchart LR
    subgraph MCP["MCP Server (Python 3.10+)"]
        direction TB
        FastMCP[FastMCP]
        Tools[26 Layout Tools]
        Context[Context Generators]
    end

    subgraph KiPy["KiPy Backend (KiCad 9+)"]
        direction TB
        IPC[KiCad IPC API]
        LiveEdit[Real-time Updates]
        NativeUndo[Native Undo/Redo]
    end

    subgraph Bridge["KiCad Bridge (KiCad 8.x)"]
        direction TB
        pcbnew[pcbnew API]
        BoardIO[Board I/O]
        UndoRedo[Undo/Redo]
    end

    MCP <-->|"KiCad IPC\nSocket"| KiPy
    MCP <-->|"Unix Socket\nJSON-RPC"| Bridge

Backend Modes:

ModeKiCad VersionReal-timeHow it worksStatus
kipy9.0+✅ YesDirect IPC API connectionDefault
ipc8.0+❌ NoFile-based bridge processFallback
direct8.0+❌ NoDirect file manipulationFallback

Note: KIPY mode is the primary backend for bleeding-edge development. It provides instant visual feedback in KiCad's viewport and native undo/redo integration. The server automatically falls back to IPC or direct mode if KIPY is unavailable.

Available Tools (40+ total)

CategoryTools
Board Managementload_board, save_board, undo, redo
Placement Actionsmove_absolute, move_relative, rotate, place_next_to, align_components, distribute_evenly, stack_components, arrange_pattern, cluster_around, lock_components
Discoveryfind_components, get_board_summary, get_unplaced_components
Routingroute_board, route_net, detect_diff_pairs, get_routing_preview, analyze_pin_swaps, optimize_pin_swaps, export_pin_constraints
BGA/Fanoutdetect_bga_components, fanout_component, fanout_all_bgas, get_fanout_preview
Contextinspect_region, get_semantic_grid, get_module_map
Validationcheck_overlaps, validate_placement, run_drc, get_crossing_analysis
Optimizationoptimize_placement, detect_modules, parse_constraint, get_atopile_context

Environment Variables (Optional)

VariableDescriptionDefault
ATOPLACE_BACKENDBackend mode: kipy, ipc, or directkipy (with fallback)
ATOPLACE_USE_KIPYEnable kipy mode (1 or true)Deprecated - use ATOPLACE_BACKEND
KICAD_PYTHONOverride KiCad Python pathAuto-detected
ATOPLACE_LOGLog file location/tmp/atoplace.log

Default behavior: The server attempts KIPY first, then falls back to IPC, then direct mode. For bleeding-edge KiCad 9+ users, no configuration is needed - KIPY mode activates automatically when KiCad is running with IPC enabled.

Example LLM Conversation

text
User: Load the board at examples/dogtracker/layouts/default/default.kicad_pcb

Claude: [Calls load_board tool]
Board loaded successfully:
- 37 components
- 72 nets

User: Find all the capacitors and align them horizontally

Claude: [Calls find_components with query="C", filter_by="ref"]
Found 12 capacitors: C1, C2, C3...

[Calls align_components with refs=["C1","C2",...], axis="y"]
Aligned 12 capacitors along the Y axis.

User: Check if there are any overlaps

Claude: [Calls check_overlaps]
No overlapping components detected. The placement is valid.

User: Save the board

Claude: [Calls save_board]
Board saved to: examples/dogtracker/layouts/default/default.placed.kicad_pcb

🔒 Atopile Lock File Persistence

When working with atopile projects, placement positions can be lost when ato build regenerates the KiCad board. The atoplace.lock sidecar file solves this by persisting component positions between builds.

How it works

After placement, atoplace automatically saves positions to a lock file next to the board:

text
my-project/
├── elec/
│   └── layout/
│       └── default/
│           ├── default.kicad_pcb
│           └── default.atoplace.lock  ← Saved positions
└── ato.yaml

Lock File Format

yaml
version: 1
created: 2026-01-14T10:30:00
build: default
components:
  U1:
    x: 125.5
    y: 80.0
    rotation: 0.0
    locked: true    # User-approved position
    module: mcu
  C1:
    x: 130.0
    y: 85.5
    locked: false   # Auto-placed, can be re-optimized

CLI Options

FlagDescription
--use-lockApply saved positions before placement
--only-lockedOnly restore locked: true positions
--save-lock/--no-save-lockAuto-save after placement (default: on)
--lock-allMark all positions as user-approved

Workflow Example

bash
# First placement - automatically saves lock file
atoplace place my-project/ --use-ato-modules

# After `ato build` regenerates board - restore positions
atoplace place my-project/ --use-lock

# Only restore approved positions, re-optimize others
atoplace place my-project/ --use-lock --only-locked

# Approve all current positions
atoplace place my-project/ --lock-all

Merge Logic

The lock file uses Lock > Physics priority:

  1. locked: true positions always preserved (user-approved)
  2. locked: false positions used as initial hints, can be re-optimized
  3. New components (not in lock file) placed by physics engine

📄 License

MIT License - see LICENSE for details.

🙏 Acknowledgments

  • atopile: The declarative language that makes code-driven hardware possible.
  • KiCad: The open-source EDA standard we build upon.
  • kicad-python: Official Python bindings for KiCad's IPC API.
  • Freerouting: The open-source autorouting engine.

Parts

66
QtyValueFootprintReferences
1210kΩ ±1% 62.5mWUNI_ROYAL_0402WGF1002TCE:R0402R4, R6, R7, R8, R9, R11, R12, R16, R18, R19, R20, R21
101µF ±10% 50V X5RSamsung_Electro_Mechanics_CL10A105KB8NNNC:C0603C2, C5, C6, C7, C8, C9, C10, C11, C12, C13
4100nF ±10% 16V X7RSamsung_Electro_Mechanics_CL05B104KO5NNNC:C0402C14, C15, C17, C24
422µF ±20% 6.3V X5RSamsung_Electro_Mechanics_CL21A226MQQNNNE:C0805C20, C21, C22, C23
3TWGMC_MBR0530:SOD-123_L2.7-W1.6-LS3.7-RD-1D1, D2, D3
31µF ±10% 25V X5RSamsung_Electro_Mechanics_CL05A105KA5NQNC:C0402C18, C25, C27
2ALPSALPINE_SKRPACE010:KEY-SMD_4P-L4.2-W3.2-P2.20-LS4.6SW1, SW2
210µF ±10% 25V X5RSamsung_Electro_Mechanics_CL21A106KAYNNNE:C0805C3, C4
24.7kΩ ±1% 62.5mWUNI_ROYAL_0402WGF4701TCE:R0402R13, R14
1atopile_Logo_4x4mm:atopile_Logo_4x4mmLOGO1
1Hubei_KENTO_Elec_Blue_light_0603:LED0603-RDLED1
1BQ25185DLHR_BQ25185DLHR:WSON-10_L2.2-W2.0-P0.40-BL-EP_TI_DLH0010AU4
1TECH_PUBLIC_SI1308EDL:SOT-323-3_L2.0-W1.3-P1.30-LS2.1-BRQ1
1MOLEX_532610271:CONN-SMD_532610271U1
1EEMB_BATTERY_LP402535:EEMB_BATTERY_LP402535B1
1kinghelm_KH_TYPE_C_16P:USB-C-SMD_KH-TYPE-C-16PUSB1
1Hubei_KENTO_Elec_KT_0603R:LED0603-RDLED2
1Espressif_Systems_ESP32_C3_MINI_1_N4:WIFIM-SMD_ESP32-C3-MINI-1U2
1XUNPU_FPC_05F_24PH20:FPC-SMD_24P-P0.50_FPC-05F-24PH20FPC1
1Texas_Instruments_TPS63020DSJR:VSON-14_L4.0-W3.0-P0.50-BL-EP_TI_DSJU3
11.2MΩ ±1% 62.5mWFOJAN_FRC0402F1204TS:R0402R2
110µF ±20% 6.3V X5RMurata_Electronics_GRM155R60J106ME44D:C0402C26
118kΩ ±1% 62.5mWYAGEO_RC0402FR_0718KL:R0402R17
11MΩ ±1% 62.5mWUNI_ROYAL_0402WGF1004TCE:R0402R5
11µH ±20% 4.7A 18mΩcjiang_FNR4030S1R0MT:IND-SMD_L4.0-W4.0_FNR40XXSL1
1200kΩ ±1% 62.5mWUNI_ROYAL_0402WGF2003TCE:R0402R1
122µF ±20% 6.3V X5RSamsung_Electro_Mechanics_CL10A226MQ8NRNC:C0603C16
12kΩ ±1% 62.5mWUNI_ROYAL_0402WGF2001TCE:R0402R15
13.3Ω ±1% 62.5mWUNI_ROYAL_0402WGF330KTCE:R0402R3
14.7µF ±10% 16V X5RSamsung_Electro_Mechanics_CL10A475KO8NNNC:C0603C19
14.7µF ±20% 10V X5RSamsung_Electro_Mechanics_CL05A475MP5NRNC:C0402C1
1470mΩ ±1%YAGEO_RL0402FR_070R47L:R0402R10
168µH ±20% 50mA 6ΩTaiyo_Yuden_LB2012T680M:L0805L2

Questions

How big is the Layouts PCB?

It measures 42 × 27 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Layouts use?

66 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Layouts KiCad files?

From the glovepost/atoplace repository on GitHub, at the commit this page was made from: the board is examples/hivehaus/src/products/espaper/layouts/default/default.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Layouts design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

More from glovepost/atoplace

12
  • 2 layers24.6 × 8.1 mmDemomatrix, the printed circuit board in 3D

    Demomatrix

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    1,592 parts2MIT
  • 2 layersDemo matrix2, the printed circuit board in 3D

    Demo matrix2

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    496 parts2MIT
  • 4 layers59.3 × 39 mmBadge, the printed circuit board in 3D

    Badge

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    246 parts2MIT
  • 4 layersGrid100x100, the printed circuit board in 3D

    Grid100x100

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    200 parts2MIT
  • 4 layers45 × 167 mmNonos, the printed circuit board in 3D

    Nonos

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    141 parts2MIT
  • 4 layers108 × 115.9 mmHat, the printed circuit board in 3D

    Hat

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    83 parts2MIT
  • 2 layersCluster2x2, the printed circuit board in 3D

    Cluster2x2

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    31 parts2MIT
  • 2 layersStrip10, the printed circuit board in 3D

    Strip10

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    20 parts2MIT
  • 2 layersUsage, the printed circuit board in 3D

    Usage

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    19 parts2MIT
  • 2 layers34.2 × 26.8 mmEsp32 minimal, the printed circuit board in 3D

    Esp32 minimal

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    19 parts2MIT
  • 2 layersRow2, the printed circuit board in 3D

    Row2

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    10 parts2MIT
  • 2 layersPixel15hl5050, the printed circuit board in 3D

    Pixel15hl5050

    glovepost/atoplace

    KiCAD EDA automatic component placement tool

    5 parts2MIT

Similar boards

  • 2 layers126.5 × 83 mmPcb pro controller, the printed circuit board in 3D

    Pcb pro controller

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    66 parts915
  • 2 layers94.6 × 46.1 mmHeaterMeterPI, the printed circuit board in 3D

    HeaterMeterPI

    CapnBry/HeaterMeter

    HeaterMeter and LinkMeter Arduino BBQ Controller

    66 parts557MIT
  • 2 layers56.9 × 35.2 mmAmoeba tp, the printed circuit board in 3D

    Amoeba tp

    mtl/keyboard-pcbs

    Keyboard PCBs

    66 parts485
  • 2 layers82 × 120 mmSample Numeric Keyboard, the printed circuit board in 3D

    Sample Numeric Keyboard

    famichu/MagLev_Switch_MX

    The 3D printable magnetic levitation contactless switch with the linear output hall effect sensor.

    66 parts467
  • 2 layers136.8 × 98.6 mmHillside, the printed circuit board in 3D

    Hillside

    mmccoyd/hillside

    Family of split ergonomic keyboards with three rows of six or five keys and a generous thumb arc

    66 parts448MIT
  • 2 layers115.7 × 95.7 mmFifi split keeb, the printed circuit board in 3D

    Fifi split keeb

    raychengy/fifi_split_keeb

    Fifi Keyboard 🐶 ⌨️

    66 parts334
  • 2 layers95.2 × 57.2 mmDomesdayDuplicator, the printed circuit board in 3D

    DomesdayDuplicator

    Domesday86/DomesdayDuplicator

    High-speed LaserDisc RF sampler

    66 parts325GPL-3.0
  • 2 layers96.5 × 66 mmBumperDuino, the printed circuit board in 3D

    BumperDuino

    Ardumower/ardumower

    Develop an open source robotic lawn mower (HW+SW reference platform)

    66 parts282