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