Cell
A cell containing geometry and references to other cells.
Cells are the primary container for layout geometry. Each cell has a unique
name and holds polygons, paths, text labels, ports, and references to other
cells. Use cell.at(x, y) to create positioned instances for ergonomic
placement and port queries.
cell = Cell("my_design")
cell.add_polygon(Polygon.rect(Point.origin(), 10, 5), Layer(1, 0))
cell.add_port(Port("in", Point(0, 2.5), Vector2(-1, 0), width=0.5))
# Position and add to a parent cell
top = Cell("top")
top.add_ref(cell.at(100, 50))Attributes
attributenamestrCell name (unique within a design).
attributepath_lengthfloat | NonePath length metadata. Automatically set when a cell is created from a Route
via to_cell(). Can also be set manually for component cells.
Methods
func__init__(name) -> NoneCreate a new empty cell.
paramnamestrName of the cell. Must be unique within a design, non-empty, at most 32 characters, and contain only printable ASCII (no spaces or Unicode).
Returns
NoneGeometry
funcadd_polygon(polygon, layer) -> NoneAdd a polygon to the cell.
parampolygonPolygonThe polygon to add.
paramlayerLayer | int | tuple[int, int]Target layer. Accepts a Layer object, a single int (datatype defaults to 0),
or a (number, datatype) tuple.
Returns
Nonefuncadd_path(points, width, layer, end_type=None) -> NoneAdd a path (centerline with width) to the cell.
Paths are an alternative to polygons for representing waveguides and similar structures. They store a centerline and width, which can be more compact than storing the full polygon outline.
Example
cell.add_path(
[Point(0, 0), Point(100, 0), Point(100, 50)],
width=0.5,
layer=1,
end_type=PathEndType.ROUND
)parampointslist[Point]List of Point objects along the path centerline.
paramwidthfloatWidth of the path.
paramlayerLayer | int | tuple[int, int]Target layer.
paramend_typePathEndType | None= NonePath end type. Defaults to PathEndType.FLUSH.
Returns
Nonefuncadd_text(text, position, layer, height=1.0) -> NoneAdd a text label to the cell.
Text labels are useful for debugging and documentation but are typically not fabricated.
Example
cell.add_text("Input", Point(0, 5), layer=10)
cell.add_text("Big Label", Point(0, 10), layer=10, height=5.0)paramtextstrThe text string.
parampositionPointPosition of the text.
paramlayerLayer | int | tuple[int, int]Target layer.
paramheightfloat= 1.0Text height in user units.
Returns
NonePorts
funcadd_port(port) -> NoneAdd a port to the cell.
paramportPortThe port to add.
Returns
Nonefuncport(name) -> PortGet a port by name.
paramnamestrName of the port to retrieve.
Returns
PortThe port object.
funcports() -> list[Port]Get all ports defined on this cell.
Returns
list[Port]List of all ports.
Counts
funcpolygon_count() -> intNumber of polygons in the cell (not counting child cells).
Returns
intfuncpath_count() -> intNumber of paths in the cell.
Returns
intfunctext_count() -> intNumber of text labels in the cell.
Returns
intfuncref_count() -> intNumber of cell references.
Returns
intBounding box
funcbbox() -> BBox | NoneCalculate the bounding box of all polygons in the cell.
Returns None if the cell contains no polygons.
Returns
BBox | NonePlacement
funcat(x, y) -> InstanceCreate a positioned instance of this cell.
This is the recommended way to place cells in a design. The returned Instance tracks the cell reference, allowing port queries without redundantly passing the cell.
Example
gc_cell = grating_coupler(layer=layers.silicon.layer)
gc_in = gc_cell.at(0, 0)
gc_out = gc_cell.at(0, 127)
# Get ports directly from instances
port_in = gc_in.port("opt")
port_out = gc_out.port("opt")paramxfloatX coordinate.
paramyfloatY coordinate.
Returns
InstanceAn Instance positioned at (x, y).
funcadd_ref(ref) -> NoneAdd a cell, cell reference, or instance to this cell.
When adding a Cell or Instance, the child cell is automatically
tracked so that write_gds() can collect the full hierarchy without
a manual cell list.
Example
top.add_ref(gc_cell.at(0, 0)) # Instance at position
top.add_ref(route.to_cell("wg")) # Cell at originparamrefCell | CellRef | InstanceA Cell (placed at origin), Instance, or CellRef to add.
Returns
Nonefuncplace_at_port(cell_ref, cell_port, target_port) -> CellRefPlace a cell reference by aligning its port to a target port.
paramcell_refCellRefThe cell reference to place.
paramcell_portPortPort on the referenced cell to align.
paramtarget_portPortTarget port to align to.
Returns
CellRefThe transformed cell reference.
funcget_child_cells() -> set[Cell]Get all tracked child cells (for write_gds() auto-collection).
Returns
set[Cell]Set of child cells that have been added via add_ref().
Metadata
funcadd_bend(radius, x, y, requested_radius=None) -> NoneAdd a bend info entry to the cell metadata.
This is used by component authors to record bend locations for
design checks (run_checks). The bend radius and location are
stored so that minimum bend radius violations can be detected.
paramradiusfloatEffective bend radius in um.
paramxfloatX coordinate of bend location.
paramyfloatY coordinate of bend location.
paramrequested_radiusfloat | None= NoneOriginal requested radius, if the router auto-reduced it.
Returns
Noneattributebendslist[dict]Bend info entries as list of dicts with keys: radius, x, y,
and optionally requested_radius.
funcadd_warning(warning) -> NoneAdd a warning to the cell metadata.
paramwarningstrWarning message string.
Returns
Noneattributecell_warningslist[str]Warnings from cell construction (e.g., auto-reduced bend radii).