Step 3: Technology

Result

In this example we introduce the TECH tree. A TECH trees is a storage space for default settings associated with a particular fabrication technology of a fab. The example builds on the same code ‘ring.py’, which we’ve used in the previous steps, but adds default values derived from the TECH Tree.

Illustrates

  1. the use of the TECH object to set default values.

  2. the selection of the technology.

  3. the fact that technology should be loaded as the first line of the executable.

How to run this example

To run the example, run ‘execute.py’.

Files (see: tutorials/pcell_basic/03-technology)

There are two files contained in this step.

  • ring.py : which is a self-contained python file that contains a description of our ringresonator. It is imported in execute.py

  • execute.py : which is the file that is ultimately executed by python. It imports the description of the ringresonator from ring.py and performs operations on it.

Using technology

Before you can start using a TECH tree, each python file that uses one must load it.

import si_fab.all as pdk  # noqa

# 2. load the file with our RingResonator and instantiate the layoutview
from ring import RingResonator

my_ring = RingResonator(name="my_unique_ring_name")
my_ring_layout = my_ring.Layout()

We now use the same definition of the ring but use default values contained in the TECH three.

class RingResonator(i3.PCell):

     #....Pcell definition omitted

    class Layout(i3.LayoutView):

        # In this example we use the technology
        ring_radius = i3.PositiveNumberProperty(default=i3.TECH.WG.BEND_RADIUS, doc="radius of the ring in micrometers")
        ring_wg_width = i3.PositiveNumberProperty(default=i3.TECH.WG.WIRE_WIDTH,  doc="width of the ring waveguide in micrometers")
        bus_wg_width = i3.PositiveNumberProperty(default=i3.TECH.WG.WIRE_WIDTH, doc="width of the bus waveguide in micrometers")
        coupler_spacing = i3.PositiveNumberProperty(default=i3.TECH.WG.DC_SPACING,
                                                    doc = "spacing between centerline of bus waveguide and ring waveguide")

        def validate_properties(self):

            #... validation rules omitted....

            return True

In this code extract we used the default values contained in the TECH.WG which refers to default values that have something to do with waveguides. See Technology for in-depth documentation on the default TECH files.

Selecting a technology

Selecting a technology is the first operation of any ipkiss script that uses technologies.

# When executing a script, the first line should load the technology
# This is a set of default settings associated with a specific
# fabrication technology.

# IPKISS provides a default technology for silicon photonics as an example

# 1. Loading the default ipkiss techonology
import si_fab.all as pdk  # noqa

# 2. load the file with our RingResonator and instantiate the layoutview
from ring import RingResonator

my_ring = RingResonator(name="my_unique_ring_name")
my_ring_layout = my_ring.Layout()

# 3. The default values from the TECH file are now used.
print(my_ring_layout.ring_radius)
  1. The first line of code should load the technology. This must be done before loading ipkiss libraries. IPKISS provides a default technology for silicon photonics as an example. If you work with a fab, the fab should supply you with technology file specific to their fabrication process.

  2. Instantiate the layout view

  3. Print the default value that is defined in the tech three.

Note

Default values that are defined from the tech three can still be overruled just like any other default value of a property

Recap

The use of technologies is a very important when making real layouts that have to go to the fab. The reason is that fab’s impose standards that need to be set on a global level and not on the component level. Now that you have learned about technologies we can move on to create our first layout in the next step.