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

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

max_n_o_lines: ( tuple2 and number > 0 ), *None allowed*

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.

adapter: IoBlockAdapter

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

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

The sub-blocks

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell


class Layout
outline_layer: __Layer__

Layer on which to draw the block outline

draw_block_outline: ( bool, bool_ or int )

Draw the outline of the block when set to True

south_east: Coord2

Position of the south east corner of the block

south_west: Coord2

Position of the south west corner of the block

y_spacing: float and number > 0

The spacing between blocks

view_name: String that contains only alphanumeric characters from the ASCII set or contains _$. ASCII set is extended on PY3.

The name of the view

Other Parameters:
blocks_pos: locked
count_offset: locked
count_west: locked
count_east: 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


"""Simple IoColumn example, demonstrating a small testsite of MultiMode Interferometers (MMI)."""
import si_fab.all as pdk  # noqa: F401
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), y_spacing=25.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(),

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_blocktitle(text, center_clearout=(0.0, 0.0), edge_clearout=(0.0, 0.0), process=<Process SI>, purpose=<Purpose TXT>, name=None)

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

add_align(west_east_offset=0.0, trace_template=<SiWireWaveguideTemplate PCellTemplate 'SI_FAB_WIRE_WGTEMPLATE_1'>, adapter=None)

Adds an alignment waveguide.


Adds spacers at the east side.


Adds spacers at the west side.

add_emptyline(N_lines=(1, 1))

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


Add spacers to ensure that the block is straight.