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:
| Syntax | Expansion |
|---|---|
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 |