Routing

The RoutingOperations module handles track and via creation.

board = kicad.get_board()
routing = board.routing

Creating Tracks

add_track(points, width, layer, net=None)

Creates a track along points.

from kipy.geometry import Vector2
from kipy.board import BoardLayer

start = Vector2.from_xy_mm(100, 50)
end = Vector2.from_xy_mm(150, 50)

track_id = board.routing.add_track(
    points=[start, end],
    width=250000,  # 0.25mm in nanometers
    layer=BoardLayer.BL_F_Cu
)

add_track_mm(points, width_mm, layer, net=None)

Creates a track with width specified in millimeters.

board.routing.add_track_mm(
    points=[start, mid, end],
    width_mm=0.25,
    layer=BoardLayer.BL_F_Cu
)

route(start_pad, end_pad, ...)

Auto-routes between two pads.

# Route between pads
board.routing.route(
    start_pad=pad1_id,
    end_pad=pad2_id,
    width_mm=0.25,
    layer=BoardLayer.BL_F_Cu
)

Creating Vias

add_via(position, ...)

Adds a via.

pos = Vector2.from_xy_mm(125, 50)

via_id = board.routing.add_via(
    position=pos,
    size_mm=0.8,
    drill_mm=0.4
)

add_via_full(position, net, layers, ...)

Adds a via with full configuration.

board.routing.add_via_full(
    position=pos,
    net="GND",
    start_layer=BoardLayer.BL_F_Cu,
    end_layer=BoardLayer.BL_B_Cu,
    size_mm=0.8,
    drill_mm=0.4
)

Arc Tracks

add_arc_track(start, mid, end, width, layer)

Creates an arc track.

start = Vector2.from_xy_mm(100, 50)
mid = Vector2.from_xy_mm(110, 55)
end = Vector2.from_xy_mm(120, 50)

board.routing.add_arc_track(
    start=start,
    mid=mid,
    end=end,
    width_mm=0.25,
    layer=BoardLayer.BL_F_Cu
)

Deleting Tracks

delete_track(track_id)

Deletes a track segment.

board.routing.delete_track(track_id)

delete_tracks_on_net(net_name)

Deletes all tracks on a net.

board.routing.delete_tracks_on_net("GND")

Getting Track Info

get_tracks()

Gets all tracks on the board.

tracks = board.routing.get_tracks()

for track in tracks:
    print(f"Track on {track.layer}: {track.start} to {track.end}")

get_tracks_on_net(net_name)

Gets tracks on a specific net.

gnd_tracks = board.routing.get_tracks_on_net("GND")

Example: Route Power Rails

from kipy import KiCad
from kipy.geometry import Vector2
from kipy.board import BoardLayer

kicad = KiCad()
board = kicad.get_board()

# Create horizontal VCC rail
vcc_y = 10
vcc_points = [
    Vector2.from_xy_mm(10, vcc_y),
    Vector2.from_xy_mm(190, vcc_y),
]

board.routing.add_track_mm(
    points=vcc_points,
    width_mm=0.5,  # Wide power trace
    layer=BoardLayer.BL_F_Cu,
    net="VCC"
)

# Create horizontal GND rail
gnd_y = 90
gnd_points = [
    Vector2.from_xy_mm(10, gnd_y),
    Vector2.from_xy_mm(190, gnd_y),
]

board.routing.add_track_mm(
    points=gnd_points,
    width_mm=0.5,
    layer=BoardLayer.BL_F_Cu,
    net="GND"
)

print("Power rails created")

Example: Create Via Fence

# Create a via fence around a sensitive area
center = Vector2.from_xy_mm(100, 50)
radius = 10
num_vias = 12

import math

for i in range(num_vias):
    angle = 2 * math.pi * i / num_vias
    x = center.x_mm + radius * math.cos(angle)
    y = center.y_mm + radius * math.sin(angle)

    board.routing.add_via(
        position=Vector2.from_xy_mm(x, y),
        size_mm=0.6,
        drill_mm=0.3,
        net="GND"
    )

print(f"Created {num_vias} vias")

Example: Layer Change with Via

# Route from front to back with via
start = Vector2.from_xy_mm(50, 50)
via_pos = Vector2.from_xy_mm(75, 50)
end = Vector2.from_xy_mm(100, 50)

# Track on front copper
board.routing.add_track_mm(
    points=[start, via_pos],
    width_mm=0.25,
    layer=BoardLayer.BL_F_Cu
)

# Via
board.routing.add_via(
    position=via_pos,
    size_mm=0.8,
    drill_mm=0.4
)

# Track on back copper
board.routing.add_track_mm(
    points=[via_pos, end],
    width_mm=0.25,
    layer=BoardLayer.BL_B_Cu
)

Track Width Reference

Common track widths:

  • Signal traces: 0.15-0.25mm
  • Power traces: 0.3-0.5mm
  • High current: 0.5-2.0mm
  • Impedance controlled: calculated per stackup

Via sizes:

  • Standard: 0.8mm pad, 0.4mm drill
  • Small: 0.6mm pad, 0.3mm drill
  • Micro: 0.4mm pad, 0.2mm drill