Buses

The BusOperations module handles bus definition, routing, and analysis in schematics.

sch = kicad.get_schematic()
buses = sch.buses

Bus Definitions

create_bus(name, members)

Creates a bus definition.

# Create a simple bus
sch.buses.create_bus("DATA", ["D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7"])

# Create an address bus with range notation
sch.buses.create_bus("ADDR", ["A[0..15]"])

get_bus(name)

Gets a bus definition.

bus = sch.buses.get_bus("DATA")
print(f"Bus {bus.name} has {len(bus.members)} members")
for member in bus.members:
    print(f"  {member}")

get_all_buses()

Gets all bus definitions.

buses = sch.buses.get_all_buses()
for bus in buses:
    print(f"{bus.name}: {bus.members}")

delete_bus(name)

Deletes a bus definition.

sch.buses.delete_bus("ADDR")

Bus Aliases

create_alias(name, members)

Creates a bus alias (reusable bus definition).

# Create an I2C bus alias
sch.buses.create_alias("I2C", ["SDA", "SCL"])

# Create an SPI bus alias
sch.buses.create_alias("SPI", ["MOSI", "MISO", "SCK", "CS"])

get_alias(name)

Gets a bus alias definition.

alias = sch.buses.get_alias("I2C")

Drawing Buses

add_bus_wire(points)

Draws a bus wire.

from kipy.geometry import Vector2

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

sch.buses.add_bus_wire([start, end])

add_bus_label(name, position, orientation)

Adds a bus label.

sch.buses.add_bus_label("DATA[0..7]", position, orientation="right")

add_bus_entry(position, direction)

Adds a bus entry point (wire-to-bus connection).

sch.buses.add_bus_entry(position, direction="left")

Bus Analysis

get_bus_members(bus_label_id)

Gets the expanded member signals of a bus.

members = sch.buses.get_bus_members(bus_label_id)
# ["D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7"]

get_connected_signals(bus_id)

Gets all signals connected to a bus.

signals = sch.buses.get_connected_signals(bus_id)

Example: Create Data Bus

from kipy import KiCad
from kipy.geometry import Vector2

kicad = KiCad()
sch = kicad.get_schematic()

# Define the bus
sch.buses.create_bus("DATA", [f"D{i}" for i in range(8)])

# Draw vertical bus
bus_x = 150
bus_start = Vector2.from_xy_mm(bus_x, 30)
bus_end = Vector2.from_xy_mm(bus_x, 110)
sch.buses.add_bus_wire([bus_start, bus_end])

# Add bus label
sch.buses.add_bus_label("DATA[0..7]", Vector2.from_xy_mm(bus_x + 2, 25), "down")

# Add bus entries and signal labels
for i in range(8):
    y = 35 + i * 10

    # Bus entry
    entry_pos = Vector2.from_xy_mm(bus_x, y)
    sch.buses.add_bus_entry(entry_pos, direction="left")

    # Signal label
    label_pos = Vector2.from_xy_mm(bus_x - 5, y)
    sch.labels.add_label(f"D{i}", label_pos, orientation="left")

Example: Use Bus Alias

# Define reusable bus aliases
sch.buses.create_alias("I2C", ["SDA", "SCL"])
sch.buses.create_alias("SPI", ["MOSI", "MISO", "SCK", "CS"])

# Use in bus label
sch.buses.add_bus_label("{I2C}", Vector2.from_xy_mm(100, 50), "right")

Bus Definition Object

class BusDefinition:
    name: str           # Bus name
    members: List[str]  # Member signals (expanded)
    is_alias: bool      # True if this is a bus alias

Syntax Reference

Bus labels support various syntax:

SyntaxExpansion
DATA[0..7]D0, D1, D2, D3, D4, D5, D6, D7
A[15..0]A15, A14, ... A1, A0
{I2C}Uses bus alias "I2C"
{SPI} {I2C}Combined buses