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
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.
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
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
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
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
############################################################################################ # 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),
############################################################################################### 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 ###############################################################################################
# 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
# 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,
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
#################################################################### # 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
# 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 ##################################
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 [
"""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 *
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
# 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")
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
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
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)
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 += [
############################################################################################ # 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)
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
# # 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)
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")