Technology Reference

Every IPKISS script starts with the import of a TECHNOLOGY file. The goal of the technology file is to describe a variety of settings that are necessary to design for a specific fabrication technology, and will be shared by the designs that use the same fabrication technology.

In this reference guide you will find the relevant API functions.

Technology

Properties to store a variety of numbers.

ipkiss.technology.get_technology()
ipkiss.technology.technology.TechnologyTree([…]) A hierarchical tree for storing technology settings.
ipkiss.technology.technology.DelayedInitTechnologyTree(…) A hierarchical tree for storing technology settings, but with delayed initialisation : the initialize-function is called only at the moment a value is actually retrieved.

Process

ipkiss.process.layer.ProcessLayer(name, …) ProcessLayer represents a specific process step which requires a defined mask pattern.
ipkiss.process.layer.PatternPurpose(name, …) PatternPurpose represents the usage of geometric patterns for layout
ipkiss.process.layer.ProcessPurposeLayer(…) Combination of a ProcessLayer and a PatternPurpose, defining together a unique i3.Layer.
ipkiss.process.layer.PPLayer alias of ipkiss.process.layer.ProcessPurposeLayer
ipkiss.primitives.layer.Layer([number, …]) Layout layer.

GDSII

ipkiss.process.layer_map.GenericGdsiiPPLayerInputMap(…) Map between GDSII Layers and PPLayers
ipkiss.process.layer_map.GenericGdsiiPPLayerOutputMap(…) Most generic map between ProcessPurposeLayers and GDSII.
ipkiss.io.gds_layer.AutoGdsiiLayerInputMap(…) Maps GDSII layers to Ipkiss Layers with an automatic conversion
ipkiss.io.gds_layer.AutoGdsiiLayerOutputMap(…) Maps Ipkiss Layers to GDSII Layers with an automatic conversion
ipkiss.process.layer_map.UnconstrainedGdsiiPPLayerInputMap(…) Map of GDSII layer/datatype combinations onto ProcessPurposeLayers.
ipkiss.process.layer_map.UnconstrainedGdsiiPPLayerOutputMap(…) Map of ProcessPurposeLayer onto GDSII layer/datatype combinations.

Display

ipkiss.visualisation.display_style.DisplayStyle(…) Display style for a visualization
ipkiss.visualisation.display_style.DisplayStyleSet([…]) Set of display styles.
ipkiss.visualisation.display_style.CyclicDisplayStyleSet(…) Set of display styles.

Materials

pysics.basics.material.material.Material(…) Base material.
pysics.basics.material.material.MaterialFactory Factory of materials.
pysics.basics.material.material_stack.MaterialStack(…) A MaterialStack describes a series of materials stacked on top of each other, each with a given height.
pysics.basics.material.material_stack.MaterialStackFactory([…])

Virtual Fabrication

ipkiss.plugins.vfabrication.process_flow.VFabricationProcessFlow(…) Virtual fabrication process flow.
ipkiss3.pcell.layout.view.LayoutView.visualize_2d([…]) Visualize a top-down view of the virtually fabricated layout.
ipkiss3.pcell.layout.view.LayoutView.cross_section(…) Generate a cross section of the structure along a path

Example

Here is simple example of the definition of a virtual fabrication process and its application to a layout.

import ipkiss3.all as i3

# Define a Donut pcell

class Donut(i3.PCell):
    radius = i3.PositiveNumberProperty(default=10.0)
    inner_radius = i3.PositiveNumberProperty(default=5.0)

    class Layout(i3.LayoutView):
        def _generate_elements(self, elems):
            elems += i3.Circle(layer=i3.Layer(0), radius=self.radius)
            elems += i3.Circle(layer=i3.Layer(1), radius=self.inner_radius)
            return elems

# instantiate the cell and visualize its layout
donut = Donut(radius=15.0, inner_radius=5.0)
donut_lo = donut.Layout()
donut_lo.visualize()


# Define materials, material stacks and virtual fabrication

from pysics.basics.material.material import Material
from pysics.basics.material.material_stack import MaterialStack
from ipkiss.visualisation.display_style import DisplayStyle
from ipkiss.visualisation.color import COLOR_SCARLET, COLOR_BLUE
from ipkiss.plugins.vfabrication.process_flow import VFabricationProcessFlow

oxide = Material(name="oxide", display_style=DisplayStyle(color=COLOR_SCARLET))
air = Material(name="air", display_style=DisplayStyle(color=COLOR_BLUE))

stack_oxide = MaterialStack(name="oxide slab",
                            materials_heights=[
                                (air, 1.0),
                                (oxide, 0.5),
                                (air, 1.0)
                            ],
                            display_style=DisplayStyle(color=COLOR_SCARLET)
                            )

stack_air = MaterialStack(name="all air",
                            materials_heights=[
                                (air, 1.0),
                                (air, 0.5),
                                (air, 1.0)
                            ],
                            display_style=DisplayStyle(color=COLOR_BLUE)
                            )

oxide_dep = i3.ProcessLayer(name="oxide", extension="OX")
oxide_etch = i3.ProcessLayer(name="oxide etch", extension="NOX")

vfab = VFabricationProcessFlow(
    active_processes=[oxide_dep, oxide_etch],
    process_layer_map={
        oxide_dep: i3.Layer(0),
        oxide_etch: i3.Layer(1)
    },
    is_lf_fabrication={
        oxide_dep: False,
        oxide_etch: False
    },
    process_to_material_stack_map=[
        ((0, 0), stack_air),
        ((0, 1), stack_air),
        ((1, 0), stack_oxide),
        ((1, 1), stack_air)
    ]
)

# visualize virtual fabrication of the layout: top-down and cross-section

donut_lo.visualize_2d(process_flow=vfab)
xs = donut_lo.cross_section(cross_section_path=i3.Shape([(0.0, 20.0), (0.0, -20.0)]),
                            process_flow=vfab)
xs.visualize()
../../_images/index-1_00.png
../../_images/index-1_01.png
../../_images/index-1_02.png