Skip to content

Circuit builder API Documentation

Overview

The CircuitBuilder class represents an automatic placer/optimizer for circuit schematics. The solver keeps the original public API but internally uses a much leaner CP‑SAT model that focuses on the essentials:

  • bounding‑box packing with optional spacing / relative rules
  • optional H/V flips for every device
  • Manhattan length minimisation for all nets
  • canvas area minimisation (maxX·maxY surrogate)

The more exotic cost tweaks (alignment bonuses, bend penalties, pin‑side heuristics …) have been removed – the same effects now emerge naturally from the primary length objective which is simpler and easier to reason about.

Members


Align

Type: Enum

Values: SameRow, SameColumn

Description:
Alignment rules for a group of devices.

Usage Example:

1
2
3
4
5
6
7
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor");  
# Add the constrain
builder.Constrain([Vin, C1], CircuitBuilder.Align.SameRow);

DeviceOrientation

Type: Enum

Values: Horizontal, Vertical

Description:
Orientation preference for a device.

Usage Example:

1
2
3
4
5
6
7
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor");  
# Add the constrain
builder.Constrain([Vin, C1], CircuitBuilder.DeviceOrientation.Vertical);

LayoutDirection

Type: Enum

Values: LeftToRight, RightToLeft, TopToBottom, BottomToTop

Description:
Direction of layout for multiple devices.

Usage Example:

1
2
3
4
5
6
7
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor");  
# Add the constrain
builder.Constrain([Vin, C1], CircuitBuilder.LayoutDirection.LeftToRight);

Side

Type: Enum

Values: North, South, East, West

Description:
Orientation preference for a pin.

Usage Example:

1
2
3
4
5
6
7
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor");  
# Add the constrain
builder.ConstrainPinSide([Vin.P], CircuitBuilder.Side.North);

Methods


Device AddDevice(string libraryName)

Arguments: string libraryName Library item name of the device to add.

Description:
Add a device to the circuit builder.

Usage Example:

1
2
3
4
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");

void AddConnection(IEnumerable<DevicePin> Pins)

Arguments: IEnumerable<DevicePin> Pins List of pins to consider.

Description:
Create a connection between the pins.

Usage Example:

1
2
3
4
5
6
7
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor");  
# Add the connections
builder.AddConnection(Vin.P, C1.P);

void Constrain(IEnumerable<Device> devices, <T> rule)

Arguments: IEnumerable<Device> devices List of devices to consider. <T> rule The rule to apply. Can be a Align, DeviceOrientation or LayoutDirection.

Description:
Add a constrain to a list of devices

Usage Example:

1
2
3
4
5
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
builder.Constrain([Vin], CircuitBuilder.DeviceOrientation.Vertical);

void ConstrainPinSide(IEnumerable<DevicePin> pins, Side side)

Arguments: IEnumerable<DevicePin> pins List of pins to consider. Side side The side to apply.

Description:
Add a constrain to a list of devices

Usage Example:

1
2
3
4
5
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
builder.ConstrainPinSide([Vin.P], CircuitBuilder.Side.North);

void DefineZone(string name, IEnumerable<Device> devices)

Arguments: string name Name of the zone. IEnumerable<Device> devices List of devices to consider.

Description:
Defines or augments a layout zone by name and assigns the given devices to it. Zones are optional. When present, the solver enforces that the bounding rectangles of different zones do not overlap. A device can belong to at most one zone.

Usage Example:

1
2
3
4
5
6
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
Vin = builder.AddDevice("DC Voltage Source");
C1 = builder.AddDevice("Capacitor"); 
builder.DefineZone("zone1", [Vin, C1]);

void StartZone(string name) / void EndZone()

Arguments: string name Name of the zone.

Description:
Begin assigning subsequently added devices to the named zone until EndZone() is called.

Usage Example:

1
2
3
4
5
6
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
builder.StartZone("zone1");
Vin = builder.AddDevice("DC Voltage Source");
builder.EndZone();

Circuit Build()

Arguments:

Description:
Starts building the circuit defined in the builder.

Usage Example:

1
2
3
4
5
6
7
8
# Create the circuit builder
builder = CircuitBuilder(design.Circuit)
# Create the devices
builder.StartZone("zone1");
Vin = builder.AddDevice("DC Voltage Source");
builder.EndZone();

builder.Build();

Example Usage

Here's a typical example of how to use the CircuitBuilder API in a Python project.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#%%  Load required module
from aesim.simba import Design, CircuitBuilder

#%%  Create Design
design = Design()
design.Name = "DC/DC - Buck Converter"
design.TransientAnalysis.TimeStep = 1e-6
design.TransientAnalysis.EndTime = 10e-3

#%% Create Circuit using CircuitBuilder
builder = CircuitBuilder(design.Circuit)
Vin = builder.AddDevice("DC Voltage Source");
Vin.Name= "Vin"
Vin.Voltage = "12"
Q1  = builder.AddDevice("Ideal MOSFET with Diode");
Q1.Name = "Q1"
D1  = builder.AddDevice("Ideal Diode");    
D1.Name = "D1"
PWM = builder.AddDevice("Square Wave");    
PWM.Name = "PWM"
PWM.Frequency = 5000
PWM.DutyCycle = 0.5
PWM.Amplitude = 1
L1 = builder.AddDevice("Inductor");       
L1.Name = "L1"
L1.Value = "1m"
C1 = builder.AddDevice("Capacitor");      
C1.Name = "C1"
C1.Value = "100u"
Rload = builder.AddDevice("Resistor");     
Rload.Name = "Rload"
Rload.Value = 5
for scope in Rload.Scopes:
    scope.Enabled = True
G = builder.AddDevice("Ground")

# Netlist
builder.AddConnection(Vin.P, Q1.Drain)
builder.AddConnection([Q1.Source, D1.Cathode, L1.P])
builder.AddConnection([G.Pin, Vin.N, D1.Anode,C1.N,Rload.N] )
builder.AddConnection([L1.N, C1.P, Rload.P])
builder.AddConnection(PWM.Out, Q1.Gate)

# Layout constraints
builder.Constrain([Vin, C1, Rload, D1], CircuitBuilder.DeviceOrientation.Vertical)
builder.Constrain([Q1, L1], CircuitBuilder.DeviceOrientation.Horizontal)

builder.Constrain([Vin, Q1, D1, L1, C1, Rload], CircuitBuilder.LayoutDirection.LeftToRight)
builder.Constrain([Q1, Vin,G], CircuitBuilder.LayoutDirection.TopToBottom)

builder.Constrain([Vin, C1, Rload], CircuitBuilder.Align.SameRow)
builder.Constrain([Q1,  L1], CircuitBuilder.Align.SameRow)

# Build the circuit
builder.Build()

design.Circuit.SaveAsSvg("1.svg")