Beispiel #1
0
    def initialize(self):
        self.SOCKET = TechnologyTree()
        self.SOCKET.LENGTH = 50.0
        self.SOCKET.WIDTH = 10.0

        from picazzo3.traces.wire_wg import WireWaveguideTemplate
        wide_trace_template = WireWaveguideTemplate()
        wide_trace_template.Layout(core_width=0.45, cladding_width=15.0)

        self.SOCKET.TRACE_TEMPLATE = wide_trace_template  # Wide trace template.

        # TE Grating
        self.GRATING_TE = TechnologyTree()
        self.GRATING_TE.N_O_LINES = 25  # Default number of lines used.
        self.GRATING_TE.PERIOD = 0.63  # Default period used in the grating.
        self.GRATING_TE.LINE_WIDTH = 0.315  # Default linewidth used in the grating.
        self.GRATING_TE.BOX_WIDTH = 14.0  # Default box width

        # TM Grating
        self.GRATING_TM = TechnologyTree()
        self.GRATING_TM.N_O_LINES = 16  # Default number of lines used.
        self.GRATING_TM.PERIOD = 1.080  # Default period used in the grating.
        self.GRATING_TM.LINE_WIDTH = 0.540  # Default linewidth used in the grating.
        self.GRATING_TM.BOX_WIDTH = 14.0  # Default box width

        # default
        self.GRATING = self.GRATING_TE
Beispiel #2
0
    def initialize(self):
        # Socket
        self.SOCKET = TechnologyTree()
        self.SOCKET.LENGTH = 20.0
        self.SOCKET.STRAIGHT_EXTENSION = (
            0.0, 0.05
        )  # Default straight extentions used for the socket taper.
        self.SOCKET.MARGIN_FROM_GRATING = TECH.WG.SHORT_STRAIGHT  # Distance between the last grating line and the end of the socket by default
        self.SOCKET.START_TRACE_TEMPLATE = TECH.PCELLS.WG.DEFAULT
        self.SOCKET.TRANSITION_LENGTH = 5.0

        from aeponyx.components.waveguides.wire import MSNWireWaveguideTemplate
        wide_trace_template = MSNWireWaveguideTemplate(
            name="LinearTransitionSocket_WGT")
        wide_trace_template.Layout(core_width=17.0,
                                   cladding_width=2 * TECH.WG.TRENCH_WIDTH +
                                   17.0)

        self.SOCKET.WIDE_TRACE_TEMPLATE = wide_trace_template  # Wide trace template.

        # Grating

        self.GRATING = TechnologyTree()
        self.GRATING.PERIOD = 1.0  # Default period used in the grating.
        self.GRATING.FOCAL_DISTANCE = 20 * self.GRATING.PERIOD  # Default focal distance of curved gratings.
        self.GRATING.BOX_WIDTH = 15.5  # Default box width
        self.GRATING.N_O_LINES = int(
            floor(self.GRATING.BOX_WIDTH / self.GRATING.PERIOD))
        self.GRATING.START_RADIUS = self.GRATING.FOCAL_DISTANCE - self.GRATING.BOX_WIDTH / 2.0  # Default first radius of the grating.

        self.GRATING.ANGLE_SPAN = 90  # Default angle span of a curved grating when it is not boxed.
Beispiel #3
0
    def initialize(self):
        from ipkiss.process import PPLayer
        from ipkiss.visualisation.display_style import DisplayStyle, DisplayStyleSet
        from ipkiss.visualisation import color

        self.PREDEFINED_STYLE_SETS = TechnologyTree()

        # colorful purpose map
        DISPLAY_BLACK = DisplayStyle(color=color.COLOR_BLACK, edgewidth=0.0)
        DISPLAY_WHITE = DisplayStyle(color=color.COLOR_WHITE, edgewidth=0.0)
        DISPLAY_INVERSION = DisplayStyle(color=color.COLOR_BLUE,
                                         alpha=0.5,
                                         edgewidth=1.0)
        DISPLAY_DF = DisplayStyle(color=color.COLOR_GREEN,
                                  alpha=0.5,
                                  edgewidth=1.0)
        DISPLAY_LF = DisplayStyle(color=color.COLOR_YELLOW,
                                  alpha=0.5,
                                  edgewidth=1.0)
        DISPLAY_TEXT = DisplayStyle(color=color.COLOR_MAGENTA,
                                    alpha=0.5,
                                    edgewidth=1.0)
        DISPLAY_HOLE = DisplayStyle(color=color.COLOR_RED,
                                    alpha=0.5,
                                    edgewidth=1.0)
        DISPLAY_ALIGNMENT = DisplayStyle(color=color.COLOR_CYAN,
                                         alpha=0.5,
                                         edgewidth=1.0)
        style_set = DisplayStyleSet()
        style_set.background = DISPLAY_WHITE
        process_display_order = [
            TECH.PROCESS.RFC, TECH.PROCESS.FCW, TECH.PROCESS.FC,
            TECH.PROCESS.WG, TECH.PROCESS.NT, TECH.PROCESS.EBW,
            TECH.PROCESS.HFW, TECH.PROCESS.VGW, TECH.PROCESS.CO,
            TECH.PROCESS.NBODY, TECH.PROCESS.PBODY, TECH.PROCESS.P1,
            TECH.PROCESS.PPLUS, TECH.PROCESS.N1, TECH.PROCESS.NPLUS,
            TECH.PROCESS.PP1, TECH.PROCESS.PP2, TECH.PROCESS.SAL,
            TECH.PROCESS.MC1, TECH.PROCESS.MC2, TECH.PROCESS.MH,
            TECH.PROCESS.M1, TECH.PROCESS.V12, TECH.PROCESS.M2,
            TECH.PROCESS.MP1, TECH.PROCESS.MP2, TECH.PROCESS.FC2,
            TECH.PROCESS.WG2, TECH.PROCESS.VO1, TECH.PROCESS.GW1,
            TECH.PROCESS.GW2, TECH.PROCESS.GW3
        ]

        for process in process_display_order:
            style_set += [
                (PPLayer(process, TECH.PURPOSE.LF_AREA), DISPLAY_INVERSION),
                (PPLayer(process, TECH.PURPOSE.DF_AREA), DISPLAY_INVERSION),
                (PPLayer(process, TECH.PURPOSE.DF.MARKER), DISPLAY_ALIGNMENT),
                (PPLayer(process, TECH.PURPOSE.LF.MARKER), DISPLAY_ALIGNMENT),
                (PPLayer(process, TECH.PURPOSE.LF.LINE), DISPLAY_DF),
                (PPLayer(process, TECH.PURPOSE.LF.ISLAND), DISPLAY_DF),
                (PPLayer(process, TECH.PURPOSE.DF.TEXT), DISPLAY_TEXT),
                (PPLayer(process, TECH.PURPOSE.DF.HOLE), DISPLAY_HOLE),
                (PPLayer(process, TECH.PURPOSE.DF.TRENCH), DISPLAY_LF),
                (PPLayer(process, TECH.PURPOSE.DF.SQUARE), DISPLAY_HOLE),
            ]

        self.PREDEFINED_STYLE_SETS.PURPOSE_HIGHLIGHT = style_set
Beispiel #4
0
    def initialize(self):
        self.IOFIBCOUP = TechnologyTree()
        self.IOFIBCOUP.FANOUT_LENGTH = 40.0
        self.IOFIBCOUP.S_BEND_ANGLE = 60.0
        self.IOFIBCOUP.CONNECT_TRANSITION_LENGTH = None  # automatic
        self.IOFIBCOUP.FIBER_COUPLER_TRANSITION_LENGTH = None  # automatic

        self.DEFAULT_ADAPTER = self.IOFIBCOUP
Beispiel #5
0
    def initialize(self):
        from ipkiss.process import PPLayer

        self.PREDEFINED_STYLE_SETS = TechnologyTree()

        style_set = DisplayStyleSet()
        style_set.background = DISPLAY_WHITE

        style_set += [
            # Note: the order in which the layer:color pairs are added here decides the drawing order.
            (TECH.PPLAYER.MSN, DISPLAY_GREEN),
            (TECH.PPLAYER.MSN_TRENCH, DISPLAY_ORANGE),
            (TECH.PPLAYER.CLADDING, DISPLAY_YELLOW),
            (TECH.PPLAYER.SHALLOW, DISPLAY_CYAN_SPARSE),
            (TECH.PPLAYER.SHALLOW_TRENCH, DISPLAY_SCARLET),
            (TECH.PPLAYER.M1, DISPLAY_COPPER),
            (TECH.PPLAYER.V12, DISPLAY_CHAMPAGNE),
            (TECH.PPLAYER.M2, DISPLAY_SILVER),
            (TECH.PPLAYER.HT, DISPLAY_GRAY),
            (TECH.PPLAYER.GE, DISPLAY_YELLOW),
            (TECH.PPLAYER.CON, DISPLAY_TITANIUM_YELLOW),
            (TECH.PPLAYER.SIL, DISPLAY_VIOLET),
            (TECH.PPLAYER.N, DISPLAY_BLUE_SPARSE),
            (TECH.PPLAYER.NPLUS, DISPLAY_BLUE),
            (TECH.PPLAYER.P, DISPLAY_RED_SPARSE),
            (TECH.PPLAYER.PPLUS, DISPLAY_RED),
            (TECH.PPLAYER.PINREC, DISPLAY_ORANGE),
            (TECH.PPLAYER.ERROR.GENERIC, DISPLAY_PURPLE),
            (TECH.PPLAYER.DOC, DISPLAY_CHERRY),
            (TECH.PPLAYER.NONE, DISPLAY_INVISBLE),
            (TECH.PPLAYER.WIRE_TRACE, DISPLAY_MAGENTA_SPARSE),
            (TECH.PPLAYER.RIB_TRACE, DISPLAY_SANGRIA_SPARSE),
        ]

        from ipkiss.visualisation.color import Color
        from numpy import linspace
        style_set += [
            (
                i,
                DisplayStyle(
                    color=Color(
                        name="gray_" + str(
                            i
                        ),  # Visualization for simple Layers which may be present
                        red=c_val,
                        green=c_val,
                        blue=c_val),
                    alpha=.5))
            for i, c_val in enumerate(linspace(.9, 0.0, num=256))
        ]

        self.DEFAULT_DISPLAY_STYLE_SET = style_set  # required
Beispiel #6
0
from ipkiss.technology import get_technology
TECH = get_technology()
from ipkiss.technology.technology import TechnologyTree

TECH.BLOCKS = TechnologyTree()
TECH.BLOCKS.DEFAULT_YSPACING = 25.0
TECH.BLOCKS.DEFAULT_WIDTH = 500.0
Beispiel #7
0
############################################################################################
# pin/port settings:
# 
# Contains the default port settings used by IPKISS and PICAZZO
############################################################################################

from ipkiss.technology import get_technology
from ipkiss.technology.technology import TechnologyTree

TECH = get_technology()

TECH.PORT = TechnologyTree()
TECH.PORT.DEFAULT_LAYER = TECH.PPLAYER.NONE.PIN  # Default layer for drawing pins
TECH.PORT.DEFAULT_LENGTH = 0.1              # Default length of a PIN
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
# i-depot BBIE 7396, 7556, 7748
#
# Contact: [email protected]

from ipkiss.technology import get_technology
from ipkiss.technology.technology import TechnologyTree, DelayedInitTechnologyTree
from ipkiss.log import IPKISS_LOG as LOG
TECH = get_technology()

####################################################################
# DEFAULT FIBER COUPLER
####################################################################

TECH.IO = TechnologyTree()


class TechFibcoupTree(DelayedInitTechnologyTree):
    def initialize(self):

        ## standard gratings 1550nm
        def STANDARD_GRATING_1550_TE():
            from picazzo.fibcoup.uniform import UniformLineGrating as _ULG
            from ipkiss.plugins.photonics.wg.basic import WgElDefinition
            std1550_grating_trench = 0.315
            std1550_grating_period = 0.630
            std1550_grating_n_o_periods = 25
            std_lin_grating_wg_def = WgElDefinition(wg_width=10.0)
            G = _ULG(name="std_grating_1550",
                     origin=(0.0, 0.0),
Beispiel #9
0
###############################################################################################
        
TECH.PROCESS = ProcessTechnologyTree()

# silicon structuring
TECH.PROCESS.FC = ProcessLayer("Fiber Couplers", "FC")
TECH.PROCESS.WG = ProcessLayer("Waveguides", "WG")

# other
TECH.PROCESS.NONE = ProcessLayer("No Specific Process Layer", "NONE")

####################################################################
# MASK
####################################################################
    
TECH.MASK = TechnologyTree()
TECH.MASK.POLARITY_DF = "DF"
TECH.MASK.POLARITY_LF = "LF"

####################################################################
# MASK LAYER RULES
####################################################################

# This should become process layer dependent!
TECH.TECH = TechnologyTree()
TECH.TECH.MINIMUM_LINE = 0.120
TECH.TECH.MINIMUM_SPACE = 0.120

###############################################################################################
# Pattern Purposes
###############################################################################################
Beispiel #10
0
# Settings for metallization
#
# The technology keys below are required keys for Ipkiss
# You can change the values or refer them to your own technology keys, but their name should not be changed

from ipkiss.technology.technology import ProcessTechnologyTree, TechnologyTree, DelayedInitTechnologyTree
from ipkiss.technology import get_technology
from ipkiss.process.layer import ProcessLayer, PatternPurpose, PPLayer
from ipkiss.geometry.shapes.basic import ShapeRectangle

TECH = get_technology()

# Metal Tree

TECH.METAL = TechnologyTree()
TECH.METAL.LINE_WIDTH = 0.5  # Default line width of metal wire
TECH.METAL.DEFAULT_PROCESS = TECH.PROCESS.M1  # Default process for metal wiring

TECH.VIAS = TechnologyTree()
TECH.VIAS.DEFAULT = TechnologyTree()
TECH.VIAS.DEFAULT.TOP_SHAPE = ShapeRectangle(
    box_size=(0.6, 0.6))  # Default bottom shape (M1) for a via
TECH.VIAS.DEFAULT.VIA_SHAPE = ShapeRectangle(
    box_size=(0.5, 0.5))  # Default via shape
TECH.VIAS.DEFAULT.BOTTOM_SHAPE = ShapeRectangle(
    box_size=(0.6, 0.6))  # Default top shape (M2) for a via
Beispiel #11
0
# i-depot BBIE 7396, 7556, 7748
#
# Contact: [email protected]

from ipkiss.technology.technology import TechnologyLibrary, TechnologyTree, DelayedInitTechnologyTree
from ipkiss.technology import get_technology
from ipkiss.io.gds_layer import GdsiiLayerInputMap, GdsiiLayerOutputMap
from ipkiss.process.layer import PPLayer as PPLayer

TECH = get_technology()

####################################################################
# DEFINED PPLayers
####################################################################

TECH.PPLAYER = TechnologyTree()

TECH.PPLAYER.WG = TechnologyTree()
TECH.PPLAYER.FC = TechnologyTree()

### WG ###
TECH.PPLAYER.WG.TRENCH = PPLayer(TECH.PROCESS.WG,
                                 TECH.PURPOSE.DF.TRENCH,
                                 name="WG_TRE")
TECH.PPLAYER.WG.SQUARE = PPLayer(TECH.PROCESS.WG,
                                 TECH.PURPOSE.DF.TRENCH,
                                 name="WG_SQ")
TECH.PPLAYER.WG.HOLE = PPLayer(TECH.PROCESS.WG,
                               TECH.PURPOSE.DF.HOLE,
                               name="WG_HEX")
TECH.PPLAYER.WG.MARKER = PPLayer(TECH.PROCESS.WG,
Beispiel #12
0
    def initialize(self):
        from ipkiss.primitives import name_generator
        self.NAME_GENERATOR = name_generator.CounterNameGenerator(
            prefix_attribute="__name_prefix__",
            counter_zero=0,
            default_prefix="STRUCTURE")


TECH.ADMIN = TechAdminTree()

####################################################################
# Basic Metrics
####################################################################

TECH.METRICS = TechnologyTree()
TECH.METRICS.GRID = 5E-9
TECH.METRICS.UNIT = 1E-6
TECH.METRICS.ANGLE_STEP = 1.0
TECH.METRICS.overwrite_allowed = ["UNIT", "GRID", "ANGLE_STEP"]

####################################################################
# LAYER MAP
####################################################################


class TechGdsiiTree(DelayedInitTechnologyTree):
    """A technology tree with a GDS2 import and export layer map"""

    def initialize(self):
        from ipkiss.io.gds_layer import AutoGdsiiLayerOutputMap, AutoGdsiiLayerInputMap
Beispiel #13
0
####################################################################
# DEFAULT FIBER COUPLER
####################################################################

from ipkiss.technology import get_technology
from ipkiss.technology.technology import TechnologyTree, DelayedInitTechnologyTree
from ipkiss.log import IPKISS_LOG as LOG
from numpy import floor

TECH = get_technology()
TECH.IO = TechnologyTree()
TECH.IO.DEFAULT_FIBCOUP_SPACING = 127.0  # Default spacing between fibercouplers for IOFibCoup

###########################################################
# Straight Gratings
###########################################################


class TechFibCoupTreeStraight(DelayedInitTechnologyTree):
    def initialize(self):
        self.SOCKET = TechnologyTree()
        self.SOCKET.LENGTH = 50.0
        self.SOCKET.WIDTH = 10.0

        from picazzo3.traces.wire_wg import WireWaveguideTemplate
        wide_trace_template = WireWaveguideTemplate()
        wide_trace_template.Layout(core_width=0.45, cladding_width=15.0)

        self.SOCKET.TRACE_TEMPLATE = wide_trace_template  # Wide trace template.

        # TE Grating
Beispiel #14
0
# GDSII layer mapping
# - TECH keys defined here is used by IPKISS
############################################################################################

from ipkiss.technology import get_technology
from ipkiss.technology.technology import TechnologyTree
from ipkiss.process.layer_map import GenericGdsiiPPLayerOutputMap, GenericGdsiiPPLayerInputMap
import string

# Layer mapping
TECH = get_technology()

from ipkiss.technology.technology import DelayedInitTechnologyTree

TECH = get_technology()
TECH.GDSII = TechnologyTree()

##################################
# SETTINGS
##################################
TECH.GDSII.STRNAME_CHARACTER_DICT = {
    " -./": "_"
}  # Mapping for illegal characters in cell names
TECH.GDSII.STRNAME_ALLOWED_CHARACTERS = string.ascii_letters + string.digits + '_$'  # Allowed characters in cell names

TECH.GDSII.MAX_COORDINATES = 200  # Max number of vertices in a path
TECH.GDSII.MAX_PATH_LENGTH = 100  # Max number of control points in a path
TECH.GDSII.MAX_VERTEX_COUNT = 4000  # Max number of vertices in a polygon
TECH.GDSII.MAX_NAME_LENGTH = 255  # Max length of a cell name

##################################
Beispiel #15
0
TECH.PPLAYER.SHALLOW.ALL = TECH.PPLAYER.SHALLOW | (TECH.PPLAYER.SHALLOW_TRENCH
                                                   & TECH.PPLAYER.MSN)
TECH.PPLAYER.SHALLOW.ALL.name = "SHALLOW_ALL"
TECH.PPLAYER.N.ALL = TECH.PPLAYER.N
TECH.PPLAYER.NPLUS.ALL = TECH.PPLAYER.NPLUS
TECH.PPLAYER.P.ALL = TECH.PPLAYER.P
TECH.PPLAYER.PPLUS.ALL = TECH.PPLAYER.PPLUS
TECH.PPLAYER.CON.ALL = TECH.PPLAYER.CON
TECH.PPLAYER.M1.ALL = TECH.PPLAYER.M1

# Virtual fabrication flow using Materials Stacks defined in technology/materials.py
# INVALID is used for the unsupported layers stacks

from ipkiss.plugins.vfabrication.process_flow import VFabricationProcessFlow

TECH.VFABRICATION = TechnologyTree()

# Process in the Silicon layer
TECH.VFABRICATION.PROCESS_FLOW_FEOL = VFabricationProcessFlow(
    active_processes=[
        TECH.PROCESS.MSN,
        TECH.PROCESS.SHALLOW,
        TECH.PROCESS.N,
        TECH.PROCESS.NPLUS,
        TECH.PROCESS.P,
        TECH.PROCESS.PPLUS,
        TECH.PROCESS.CON,
    ],  # DO NOT CHANGE THE SEQUENCE OF THE ELEMENTS ! IT MUST MATCH THE SEQUENCE OF THE COLUMNS IN VFABRICATION PROPERTY process_to_material_stack_map
    process_to_material_stack_map=
    #SI_ALL, SHALLOW_ALL, N, NPLUS, P, PPLUS, CON
    [
Beispiel #16
0
"""Settings for IPKISS.eda
These are required technology keys for exporting to OpenAccess (so they can be used in EDA tools that support it)

"""

try:
    import oatools
    HAVE_OA = True

    from ipkiss.technology import get_technology
    from ipkiss.technology.technology import TechnologyTree, DelayedInitTechnologyTree
    from oatools.to_oa.export_layer_map import AutoOALayerExportMap, AutoOAPurposeExportMap
    TECH = get_technology()

    TECH.OPENACCESS = TechnologyTree()

    process_map = {
        TECH.PROCESS.MSN: 1,
        TECH.PROCESS.SHALLOW: 2,
        TECH.PROCESS.M1: 3,
        TECH.PROCESS.M2: 4,
        TECH.PROCESS.V12: 5,
        TECH.PROCESS.SIL: 10,
        TECH.PROCESS.N: 11,
        TECH.PROCESS.P: 12,
        TECH.PROCESS.NPLUS: 13,
        TECH.PROCESS.PPLUS: 14,
        TECH.PROCESS.CON: 15,
        TECH.PROCESS.GE: 16,
        TECH.PROCESS.NONE: 100
    }
#create a dictionary with all the simulation parameters
params = dict()
#resolution for matrix discretization, used when interfacing the component's virtually fabricated geometry to CAMFR
params[
    "resolution"] = 50  #this generates quite a large number of slabs, but apparently CAMFR behaves stable...

#define a window spanning the section for which we want to create a CAMFR stack
params["window_size_info"] = SizeInfo(west=-62.301,
                                      east=-0.01,
                                      south=-2.8,
                                      north=2.8)
#prepare the CAMFR engine
import camfr
from pysimul.runtime.camfr_engine.camfr_engine import CamfrEngine
engine = CamfrEngine()
camfr_technology = TechnologyTree()
camfr_technology.POLARIZATION = camfr.TM  # use for top-down simulations
camfr_technology.NMODES = 10  #we can see convergence when increasing the number of modes to 20, 30, ... : the result doesn't change
camfr_technology.PML = -0.05
camfr_technology.WAVELENGTH = 1.54735  #wavelength in micrometer
engine.set_camfr_settings(camfr_technology)
params["engine"] = engine
#set up the simulation
simul_camfr = aperture.create_simulation(simul_params=params)
#run the simulation and extract the fields at x = -0.01 (in the coordinate system of the original component, see the GDS)
f = simul_camfr.procedure.run(field_extraction_geometry_x_positions=[-0.01])
#look in trunk/pysimul_camfr_output for plots of the fields
print "Done with CAMFR simulation"

#------------- Simulation with Meep----------------------
from pysimul.runtime.MeepFDTD import *
Beispiel #18
0
TECH.MATERIAL_STACKS.MSTACK_SOI_SI_80nm.effective_index_epsilon = 1.936**2

TECH.MATERIAL_STACKS.MSTACK_SOI_SI_150nm.effective_index_epsilon = 2.539**2

TECH.MATERIAL_STACKS.MSTACK_SOI_SI_220nm.effective_index_epsilon = 2.844**2

TECH.MATERIAL_STACKS.MSTACK_SOI_SI_380nm.effective_index_epsilon = 3.158**2

TECH.MATERIAL_STACKS.MSTACK_SOI_AIR.effective_index_epsilon = 1.0

####################################################################
# VIRTUAL FABRICATION
####################################################################
from ipkiss.plugins.vfabrication.process_flow import VFabricationProcessFlow

TECH.VFABRICATION = TechnologyTree()

TECH.VFABRICATION.PROCESS_FLOW = VFabricationProcessFlow(
    active_processes=[
        TECH.PROCESS.RFC, TECH.PROCESS.FCW, TECH.PROCESS.FC, TECH.PROCESS.WG,
        TECH.PROCESS.SLOT
    ],  # DO NOT CHANGE THE SEQUENCE OF THE ELEMENTS ! IT MUST MATCH THE SEQUENCE OF THE COLUMNS IN VFABRICATION PROPERTY process_to_material_stack_map
    process_to_material_stack_map
    =  #RFC, FCW, FC, WG, SLOT (SLOT process is equivalent to WG.... )
    #SLOT=0
    [
        ((0, 0, 0, 0, 0), TECH.MATERIAL_STACKS.MSTACK_SOI_SI_380nm),
        ((0, 0, 0, 1, 0), TECH.MATERIAL_STACKS.MSTACK_SOI_SI_380nm),
        ((0, 0, 1, 0, 0), TECH.MATERIAL_STACKS.MSTACK_SOI_SI_380nm
         ),  # Only a problem if the hardmask gets etched through
        ((0, 0, 1, 1, 0), TECH.MATERIAL_STACKS.MSTACK_SOI_SI_380nm
Beispiel #19
0
# BEOL
TECH.PROCESS.EXPO = ProcessLayer("BEOL etch for waveguide exposure", "EXPO")
TECH.PROCESS.LPASS = ProcessLayer("BEOL etch for grating couplers and edge couplers", "LPASS")
TECH.PROCESS.PASS2 = ProcessLayer("Open passivation on bond pads", "PASS2")
TECH.PROCESS.TRENCH = ProcessLayer("Deep trench","TRENCH")

# Auxiliary
TECH.PROCESS.NONE = ProcessLayer(name="No specific process", extension="NONE")

###########################
# Drawing pattern purposes
###########################

from ipkiss.process.layer import PatternPurpose
TECH.PURPOSE = TechnologyTree()
# actual mask drawings
TECH.PURPOSE.DRAWING = PatternPurpose(name="Drawing", extension="DRAWING")
TECH.PURPOSE.CORE = PatternPurpose(name="Waveguide core", extension="COR")
TECH.PURPOSE.CLADDING = PatternPurpose(name="Waveguide cladding", extension="CLD")
TECH.PURPOSE.TRENCH = PatternPurpose(name="Etched trench (linear)", extension="TRE")
TECH.PURPOSE.HOLE = PatternPurpose(name="Etched hole (polygon)", extension="HOL")
TECH.PURPOSE.INVERSION = PatternPurpose(name = "Inversion", extension = "INV")
# ipkiss defined keys
TECH.PURPOSE.LF = TechnologyTree()
TECH.PURPOSE.DF = TechnologyTree()
TECH.PURPOSE.LF_AREA = PatternPurpose(name="Light-field area", extension="LFAREA")
TECH.PURPOSE.DF_AREA = PatternPurpose(name="Dark-field area", extension="DFAREA")
TECH.PURPOSE.LF.LINE = PatternPurpose(name="Light-field line", extension="LFLINE")
TECH.PURPOSE.DF.LINE = PatternPurpose(name="Dark-field line", extension="DFLINE")
TECH.PURPOSE.DF.POLYGON = PatternPurpose(name="Dark-field polygon", extension="POLYGON")
Beispiel #20
0
from ipkiss.technology.technology import TechnologyTree

TECH = get_technology()

TECH.PROCESS.HFW = TECH.PROCESS.NONE
TECH.PROCESS.SIL = TECH.PROCESS.SAL
TECH.PROCESS.P = TECH.PROCESS.P1
TECH.PROCESS.N = TECH.PROCESS.N1

############################################################################################
# Modulators
#
# This file contains default settings for modulator devices
############################################################################################

TECH.MODULATORS = TechnologyTree()
TECH.MODULATORS.PHASESHIFTER = TechnologyTree()

# Defaults common to LAT and LONG PN junctions
TECH.MODULATORS.PHASESHIFTER.PN = TechnologyTree()
TECH.MODULATORS.PHASESHIFTER.PN.P_WIDTH = 2.0
TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_OFFSET = 3.0
TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_WIDTH = 2.0
TECH.MODULATORS.PHASESHIFTER.PN.PPLUS_EXTENSION = 0.25
TECH.MODULATORS.PHASESHIFTER.PN.N_WIDTH = 2.0
TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_OFFSET = 3.0
TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_WIDTH = 2.0
TECH.MODULATORS.PHASESHIFTER.PN.NPLUS_EXTENSION = 0.25
TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_OFFSET = 3.2
TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_WIDTH = 1.6
TECH.MODULATORS.PHASESHIFTER.PN.P_SIL_EXTENSION = 0.2
#
# i-depot BBIE 7396, 7556, 7748
#
# Contact: [email protected]

from technologies.si_photonics.picazzo.default import *
from ipkiss.all import *

################# STEP 1 : DEFINE THE NEW PROCESSES ###############################
from ipkiss.technology.technology import TechnologyLibrary, TechnologyTree, DelayedInitTechnologyTree

TECH.PROCESS.ACL = ProcessLayer("Active Cladding", "ACL")
TECH.PROCESS.ACO = ProcessLayer("Active Core", "ACO")
TECH.PURPOSE.ACTIVE = PatternPurpose("Active material", "ACT")

TECH.PPLAYER.ACL = TechnologyTree()
TECH.PPLAYER.ACO = TechnologyTree()

TECH.PPLAYER.ACL.DEFAULT = ProcessPurposeLayer(
    TECH.PROCESS.ACL, TECH.PURPOSE.ACTIVE, name="ACL")
TECH.PPLAYER.ACL.ALL = TECH.PPLAYER.ACL.DEFAULT
TECH.PPLAYER.ACL.ALL.NAME = "ACL_ALL"

TECH.PPLAYER.ACO.DEFAULT = ProcessPurposeLayer(
    TECH.PROCESS.ACO, TECH.PURPOSE.ACTIVE, name="ACO")
TECH.PPLAYER.ACO.ALL = TECH.PPLAYER.ACO.DEFAULT
TECH.PPLAYER.ACO.ALL.NAME = "ACO_ALL"

TECH.GDSII.EXPORT_LAYER_MAP.process_layer_map[TECH.PROCESS.ACL] = 37
TECH.GDSII.EXPORT_LAYER_MAP.process_layer_map[TECH.PROCESS.ACO] = 43
TECH.GDSII.EXPORT_LAYER_MAP.purpose_datatype_map[TECH.PURPOSE.ACTIVE] = 0
Beispiel #22
0
    def initialize(self):

        from ipkiss3.pcell.trace.transitions.auto_transition.auto_transition_db import AutoTransitionDatabase
        db = AutoTransitionDatabase()
        self.AUTO_TRANSITION_DATABASE = db

TECH.PCELLS.TRANSITION = TransitionTree()


# Generic traces - required for Ipkiss.
# ##################################################################################################
# WARNING: The constants below are not used in the imec PDK. They're only required for IPKISS.     #
# ##################################################################################################

TECH.TRACE = TechnologyTree()
TECH.TRACE.DEFAULT_LAYER = TECH.PPLAYER.WG.COR
TECH.TRACE.CONTROL_SHAPE_LAYER = TECH.PPLAYER.WG.TRACE
TECH.TRACE.BEND_RADIUS = 5.0
TECH.TRACE.DRAW_CONTROL_SHAPE = False

TECH.DEFAULT_WAVELENGTH = 1.55

TECH.WG_DEFAULTS = TechnologyTree()
TECH.WG_DEFAULTS.N_EFF = 2.4
TECH.WG_DEFAULTS.N_GROUP = 4.3
TECH.WG_DEFAULTS.LOSS_DB_PERM = 200.0
TECH.WG_DEFAULTS.CORE_LAYER = TECH.PPLAYER.WG.COR

TECH.WG.CORE_WIDTH = 0.4
# TECH.WG.CLADDING_WIDTH = 4.0
Beispiel #23
0
from ipkiss.all import *
from ipkiss.technology.technology import TechnologyTree
import copy
from ipkiss.process import PPLayer
from ipkiss.process.layer import ProcessLayer
from ipkiss.process.layer import PatternPurpose
from ipkiss.plugins.photonics.wg.basic import *    # basic waveguides
from picazzo.io.column import *  # StdIO


DT_LINE = 0
DT_SQUARE = 1
DT_HEX = 2
DT_INV = 3

MY_TECH = TechnologyTree()

MY_TECH.PROCESS = TechnologyTree()
MY_TECH.PROCESS.OL35_1 = ProcessLayer("Overlay With III-V etch 1", "OL35_1")
MY_TECH.PROCESS.OL35_2 = ProcessLayer("Overlay With III-V etch 2", "OL35_2")
MY_TECH.PROCESS.BCB_1 = ProcessLayer("Bcb etch1", "BCB_1")
MY_TECH.PROCESS.BCB_2 = ProcessLayer("Bcb etch2", "BCB_2")
MY_TECH.PROCESS.MET_1 = ProcessLayer("Metalization etch1", "MET_1")
MY_TECH.PROCESS.MET_2 = ProcessLayer("Metalization etch2", "MET_2")
MY_TECH.PROCESS.MET_3 = ProcessLayer("Metalization etch3", "MET_3")
MY_TECH.PROCESS.MET_4 = ProcessLayer("Metalization etch4", "MET_4")

MY_TECH.PURPOSE = TechnologyTree()
MY_TECH.PURPOSE.DEFAULT = PatternPurpose(name = "Default", extension = "00")

MY_OUTPUT_MAP = copy.deepcopy(TECH.GDSII.EXPORT_LAYER_MAP)
Beispiel #24
0
                                     edgewidth=1.0)
DISPLAY_GREEN_SPARSE = DisplayStyle(color=color.COLOR_GREEN,
                                    stipple=stipple.STIPPLE_LINES_DIAGONAL_L,
                                    alpha=0.5,
                                    edgewidth=1.0)
DISPLAY_DARKSEY_GREEN = DisplayStyle(color=color.COLOR_DARKSEA_GREEN,
                                     stipple=stipple.STIPPLE_FILLED,
                                     alpha=0.5,
                                     edgewidth=1.0)
DISPLAY_DARKSEY_GREEN_SPARSE = DisplayStyle(
    color=color.COLOR_DARKSEA_GREEN,
    stipple=stipple.STIPPLE_LINES_DIAGONAL_L,
    alpha=0.5,
    edgewidth=1.0)

TECH.DISPLAY = TechnologyTree()

style_set = DisplayStyleSet()
style_set.background = DISPLAY_WHITE

process_display_order = [
    TECH.PROCESS.WG, TECH.PROCESS.FC, TECH.PROCESS.SKT, TECH.PROCESS.FCW,
    TECH.PROCESS.PBODY, TECH.PROCESS.NBODY, TECH.PROCESS.P1, TECH.PROCESS.N1,
    TECH.PROCESS.P2, TECH.PROCESS.N2, TECH.PROCESS.PPLUS, TECH.PROCESS.NPLUS,
    TECH.PROCESS.SAL, TECH.PROCESS.PCON, TECH.PROCESS.M1, TECH.PROCESS.VIA12,
    TECH.PROCESS.M2, TECH.PROCESS.PASS1, TECH.PROCESS.METPASS,
    TECH.PROCESS.EXPO, TECH.PROCESS.LPASS, TECH.PROCESS.PASS2,
    TECH.PROCESS.TRENCH, TECH.PROCESS.NONE
]

style_set += [
Beispiel #25
0
############################################################################################
# Design rule and dimension settings:
#
# This file contains default settings which are used throughout IPKISS and PICAZZO
# - Some global settings
# - Per process layer settings, like minimum width, default width, default bend radius, ....
############################################################################################

from ipkiss.technology import get_technology
from ipkiss.technology.technology import TechnologyTree
from ipkiss.geometry.shapes.basic import ShapeRectangle
from ipkiss.geometry.coord import Coord2

TECH = get_technology()

TECH.TECH = TechnologyTree()
TECH.TECH.MINIMUM_LINE = 0.130
TECH.TECH.MINIMUM_SPACE = 0.150

############
# WG
############
TECH.WG = TechnologyTree()
TECH.WG.CORE_WIDTH = 0.4  # Default waveguide width on WG layer (core)
TECH.WG.WIRE_WIDTH = TECH.WG.CORE_WIDTH  # ipkiss3 compatibility
TECH.WG.CLADDING_WIDTH = 5.0
TECH.WG.SPACING = 2.0  # Default waveguide spacing (center-to-center)
TECH.WG.SHORT_STRAIGHT = 2.0  # Default length of a short straight waveguide, used in routing algorithms
TECH.WG.SHORT_TRANSITION_LENGTH = 5.0  # Default length of simple transitions (tapers)
TECH.WG.EXPANDED_WIDTH = 0.8  # Default width of expanded waveguides (used in automatically flaring out waveguides)
TECH.WG.EXPANDED_STRAIGHT = 5.0  # Default length of a straight for an expanded waveguide (used in automatically flairing out waveguides)
Beispiel #26
0
TECH.PROCESS.NO_INSP = ProcessLayer(name="", extension="NO_INSP")
TECH.PROCESS.MASKBRD = ProcessLayer(name="", extension="MASKBRD")
TECH.PROCESS.WAFERBRD = ProcessLayer(name="", extension="WAFERBRD")

#Required for IPKISS compatibility
TECH.PROCESS.NONE = ProcessLayer("No specific process", "NONE")
#Required for PICAZZO compatibility
TECH.PROCESS.SK = TECH.PROCESS.FC = TECH.PROCESS.SHALL
TECH.PROCESS.WG = TECH.PROCESS.FULL

###########################
# Drawing pattern purposes
###########################

from ipkiss.process.layer import PatternPurpose
TECH.PURPOSE = TechnologyTree()
# actual mask drawings
TECH.PURPOSE.DRAWETCH = PatternPurpose(name="Waveguide cladding",
                                       extension="DRAWETCH")
TECH.PURPOSE.PERF = PatternPurpose(name="Waveguide core", extension="PERF")
TECH.PURPOSE.PERFSLOT = PatternPurpose(name="Slot etched on waveguide core",
                                       extension="PERFSLOT")
TECH.PURPOSE.DRAWING = PatternPurpose(name="", extension="DRAWING")
# auxiliary data
TECH.PURPOSE.POLTXT = PatternPurpose(name="", extension="POLTXT")
TECH.PURPOSE.TILING = PatternPurpose(name="", extension="TILING")
TECH.PURPOSE.DATAPREP = PatternPurpose(name="", extension="DATAPREP")
TECH.PURPOSE.NOFILL = PatternPurpose(name="", extension="NOFILL")
TECH.PURPOSE.NOSIZE = PatternPurpose(name="", extension="NOSIZE")
TECH.PURPOSE.NODRC = PatternPurpose(name="", extension="NODRC")
# ipkiss defined keys
Beispiel #27
0
# # TECH = get_technology()
#
# import LayerDefinitions

from ipkiss.process import ProcessLayer, ProcessPurposeLayer, PatternPurpose

TECH = i3.TECH

# Create 1 new process and 2 new purposes and add them to the TECH tree
new_process = ProcessLayer(name="NEW_PROCESS", extension="NEWP")
new_purpose_1 = PatternPurpose(name="PATTERN_1", extension="PAT_1")
new_purpose_2 = PatternPurpose(name="PATTERN_2", extension="PAT_2")

TECH.PROCESS.NEW_PROCESS = new_process

TECH.PPLAYER.NEW_PROCESS = TechnologyTree()

# Combine the process and purposes into PPlayers and add them to the TECH tree.
TECH.PPLAYER.NEW_PROCESS.PP1 = ProcessPurposeLayer(process=new_process,
                                                   purpose=new_purpose_1,
                                                   name="PP1")

TECH.PPLAYER.NEW_PROCESS.PP2 = ProcessPurposeLayer(process=new_process,
                                                   purpose=new_purpose_2,
                                                   name="PP2")

# Add the layer to the GDSII import/export rules.
# These are the GDSII process and purpose numbers used in your existing gdsii files.
gdsii_maps = {
    (new_process, new_purpose_1): (99, 1),
    (new_process, new_purpose_2): (99, 2)
Beispiel #28
0
TECH.PROCESS.NONE = ProcessLayer("No specific process", "NONE")

# The following keys are required by ipkiss / picazzo but not used actively by aeponyx
TECH.PROCESS.WG = TECH.PROCESS.MSN  # Required for ipkiss, picazzo
TECH.PROCESS.RWG = TECH.PROCESS.SHALLOW  # Required by picazzo
TECH.PROCESS.FC = TECH.PROCESS.SHALLOW  # Required by picazzo (grating couplers)

# ###############################################################
# TECH.PURPOSE: Layer Purposes
#
# Layer Purposes indicate what the meaning is of a pattern on a
# given process layer. e.g. a Line, a documentation, ...
#
# ###############################################################

TECH.PURPOSE = TechnologyTree()

TECH.PURPOSE.DRAWING = PatternPurpose(name="Drawing", extension="DRW")
TECH.PURPOSE.DRWSUB = PatternPurpose(name="Subtracted drawing",
                                     extension="DRWSUB")

TECH.PURPOSE.BBOX = PatternPurpose(name="Bounding Box", extension="BBOX")
TECH.PURPOSE.ERROR = PatternPurpose(name="Error",
                                    extension="ERR",
                                    doc="Errors")
TECH.PURPOSE.PINREC = PatternPurpose(name="Pin recognition",
                                     extension="PIN",
                                     doc="Pin marker for extraction")
TECH.PURPOSE.TRACE = PatternPurpose(name="Trace",
                                    extension="TRC",
                                    doc="Control shape of trace")