i3.IoColumn is used to place components on top of each other and connect them to some input/output (I/O) on the side (typically grating couplers or edge couplers). The adapter decides how devices are routed and which I/O to use. The most frequently used adapter is the IoFibcoup adapter.

After instantiating an i3.IoColumn, use the methods add, add_align, add_blocktitle and so on, to add components to the column. Those methods are documented below.

class ipkiss3.all.IoColumn(*args, **kwargs)

PCell used to place devices or circuits on top of each other and connect them to grating couplers on the side.


adapter: IoBlockAdapter, optional

The Adapter PCell class that will be used to generate the blocks when a component is added to the column.

max_n_o_lines: optional

Maximum number of lines that this IoColumn may contain. To check whether ‘quota’ has been exceeded, use is_full()If set to ‘None’, no maximum is set.

blocks: List with type restriction, allowed types: <class ‘ipkiss3.pcell.cell.pcell.PCell’>, optional

The sub-blocks

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell



view_name: str, optional

The name of the view

draw_block_outline: optional

Draw the outline of the block when set to True

outline_layer: __Layer__, optional

Layer on which to draw the block outline

south_east: Coord2, optional

Position of the south east corner of the block

south_west: Coord2, optional

Position of the south west corner of the block

y_spacing: float and number > 0, optional

The spacing between blocks

grids_per_unit: locked

Number of grid cells per design unit

units_per_grid: locked

Ratio of grid cell and design unit

blocks_pos: locked

count_east: locked

count_offset: locked

count_west: locked

south_offset: int, locked

The y-offset between south_west & south_east, measured in units of y_spacing

width: float and Real, number and number >= 0, locked

The width of the block, calculated using south_west & south_east

grid: float and number > 0, locked

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, locked

design unit. Extracted by default from TECH.METRICS.UNIT


"""Simple IoColumn example, demonstrating how to build a small testsite of MultiMode Interferometers (MMI).
from technologies import silicon_photonics
from ipkiss3 import all as i3
from picazzo3.container.iofibcoup import IoFibcoup
from picazzo3.filters import MMI1x2Tapered

my_column = i3.IoColumn(adapter=IoFibcoup)
my_layout = my_column.Layout(south_east=(1200.0, 0.0),


for idx, mmi_length in enumerate([10, 11, 12, 13, 14, 15]):
    mmi = MMI1x2Tapered()

    # add the component to the column. Mirror the odd components.
                  transformation=i3.IdentityTransform() if idx % 2 == 0 else i3.HMirror(),

lay = my_column.Layout()
add(contents, absolute_offset=None, relative_offset=None, adapter=None, transformation=None, **adapter_kwargs)

add will take a PCell object contents, and wrap it in the adapter class to create an IoBlock that will then be added to the IoColumn.


contents: PCell object or PCell View object

The PCell object that will be wrapped by the adapter class to create a block

absolute_offset: Coord2, (x,y) tuple or ‘None’

The absolute offset of the contents relative to the x-center of the column, and the y-position on the West side. If None is specified (default), the contents is aligned such that the ports are centered and the first West port is y-aligned with the current West y-position of the column.

relative_offset: Coord2, (x,y) tuple or ‘None’

The relative offset to the position where the contents were placed with absolute_offset.

adapter: PCell class of the type IoBlockAdapter

This class will be used when creating new blocks and takes care of the routing + I/O. The contents will be passed as a parameter to the adapter. If None is specified, the default adapter class of the IoColumn will be used (which is defined in the technology).

transformation: Transformation object

Transformation that will be applied to the contents when it is added to the adapter. By default, it will not be transformed.


All other keyword arguments will be passed on to the adapter when it is created. This includes PCell parameters such as trace_template, but also Layout parameters such as offset. the actual set of parameters depends on the type of adapter.

add_align(west_east_offset=0.0, trace_template=<WireWaveguideTemplate PCellTemplate 'WIRE_WG_TEMPLATE'>, adapter=None)

Adds an alignment waveguide.

add_blocktitle(text, center_clearout=(0.0, 0.0), edge_clearout=(0.0, 0.0), process=<Process WG>, purpose=<Purpose DFTXT>, name=None)

Periodically places text using the available space (uses PolygonText).

add_emptyline(N_lines=(1, 1))

Adds spacers to the west (N_lines[0]) and to the east (N_lines[1]).


Adds spacers at the east side.


Adds spacers at the west side.


Add spacers to ensure that the block is straight.