Beispiel #1
0
    def define_elements(self, elems):
        # draw tip

        ## Warning: end-waveguide definition is calculated using y_spacing and tip_width, only wg-width is extracted from wg_def
        
        wg_def_stop = WgElDefinition(wg_width = self.wg_def_end.wg_width, trench_width = 0.5*(self.y_spacing-self.wg_def_end.wg_width)-1.0)
        
        elems += WgElTaperLinear(start_position = (self.tip_length + self.tip_offset, 0.0), 
                           end_position = (self.tip_offset, 0.0), 
                            start_wg_def = self.wg_def_start, 
                            end_wg_def = wg_def_stop)
        if self.extension > 0:
            wg_def = WgElDefinition(wg_width = self.wg_def_end.wg_width, trench_width = 0.5*(self.y_spacing-self.wg_def_end.wg_width)-1.0, process = self.process)
            elems += wg_def([(self.tip_offset - self.extension , 0.0), (self.tip_offset, 0.0)])
        
        #assist lines for tip
        for i in range(self.assist_lines):
            elems += Path(PPLayer(self.process, TECH.PURPOSE.LF.LINE), 
                            [(self.tip_length + self.tip_offset, 0.0 + (0.5*self.tip_start_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)), 
                             (self.tip_offset, 0.0 + (0.5*self.tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                             (self.tip_offset - self.extension, 0.0 + (0.5*self.tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                             ], self.assist_width)
            elems += Path(PPLayer(self.process, TECH.PURPOSE.LF.LINE), 
                            [(self.tip_length +  self.tip_offset, 0.0 - (0.5*self.tip_start_width+ (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)), 
                            (self.tip_offset, 0.0 - (0.5*self.tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                            (self.tip_offset- self.extension, 0.0 - (0.5*self.tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                            ], self.assist_width)
        return elems
Beispiel #2
0
    def define_elements(self, elems):
        elems = ElementList()
        if self.overlay_process != TECH.PROCESS.NONE:
            VI1 = VernierMarkVI(layer=PPLayer(self.overlay_process,
                                              self.overlay_purpose),
                                marks_width=self.inner_marks_width,
                                marks_length=self.marks_length)
            elems += ARefY(VI1,
                           (0.0, self.outer_pitch + self.outer_marks_width -
                            self.inner_marks_width), self.inner_pitch,
                           self.n_o_lines)

        if self.master_process != TECH.PROCESS.NONE:
            VO1 = VernierMarkVO(layer=PPLayer(self.master_process,
                                              self.master_purpose),
                                marks_width=self.outer_marks_width,
                                marks_length=self.marks_length)
            elems += ARefY(VO1, (0.0, self.outer_pitch), self.outer_pitch,
                           self.n_o_lines)
        si = elems.size_info()
        elems += Rectangle(layer=PPLayer(TECH.PROCESS.NONE,
                                         TECH.PURPOSE.NO_FILL),
                           center=si.center,
                           box_size=(si.width + 2 * self.no_fill_clearing,
                                     si.height + 2 * self.no_fill_clearing))
        elems += Rectangle(layer=PPLayer(TECH.PROCESS.NONE,
                                         TECH.PURPOSE.NO_FILL),
                           center=si.center,
                           box_size=(si.width + 2 * self.no_fill_clearing,
                                     si.height + 2 * self.no_fill_clearing))
        return elems
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 define_elements(self, elems):
     # add shape elements and stuff that should only be on the waveguide layer
     elems += Rectangle(PPLayer(self.process, TECH.PURPOSE.LF.LINE),
                        (0.0, 0.0), (self.width, self.height))
     elems += Rectangle(PPLayer(self.process, TECH.PURPOSE.LF_AREA),
                        (0.0, 0.0), (self.width + 2 * self.trench_width,
                                     self.height + 2 * self.trench_width))
     return elems
Beispiel #5
0
 def define_elements(self, elems):
     elems += super(NitrideInvertedTaper,self).define_elements(elems)
     # WG
     elems += Line(PPLayer(self.process,TECH.PURPOSE.LF_AREA), 
                     (0.0, 0.0), (self.nitride_only_length - self.extension , 0.0), 
                     self.y_spacing)
     # NT
     elems += Line(PPLayer(self.nt_process, TECH.PURPOSE.LF.LINE), 
                     (0.0, 0.0), (self.nitride_only_length + self.tip_length + 100.0 , 0.0), 
                     self.nitride_width )
     return elems
Beispiel #6
0
    def define_elements(self, elems):
        # WG
        elems += Line(PPLayer(self.deep_process,TECH.PURPOSE.LF_AREA), 
                        (0.0, 0.0), (self.nitride_only_length - self.extension , 0.0), 
                        self.y_spacing)
        # FC
        s_o_length = self.tip_offset + self.tip_length
        elems += Line(PPLayer(self.shallow_process, TECH.PURPOSE.LF_AREA), 
                        (0.0, 0.0), (s_o_length- self.extension , 0.0), 
                        self.y_spacing)

        # NT
        elems += Line(PPLayer(self.nt_process, TECH.PURPOSE.LF.LINE), 
                        (0.0, 0.0), (self.nitride_only_length + self.tip_length + self.shallow_tip_length + 50.0 , 0.0), 
                        self.nitride_width )
        return elems
Beispiel #7
0
 def define_unit_cell(self):
     s = ShapeRectangle(center=(0.0, 0.0),
                        box_size=(self.hole_diameters[0],
                                  self.hole_diameters[1]))
     s.transform(Rotation(rotation=45.0))
     return Structure(
         self.name + "_hpr",
         Boundary(PPLayer(self.process, TECH.PURPOSE.DF.SQUARE), s))
Beispiel #8
0
def GratingUniformLine(line_width,
                       line_length,
                       period,
                       n_o_periods,
                       purpose=TECH.PURPOSE.DF.TRENCH,
                       process=TECH.PROCESS.FC):
    """ 1-D grating (X-direction) with uniform lines"""
    unit_cell = Structure(
        "line" + str(int(line_width * 1000)) + "_" +
        str(int(line_length * 1000)) + "_" +
        str(PPLayer(process, purpose)).replace(" ", "_").replace("-", "_"),
        Rectangle(PPLayer(process, purpose), (-0.5 * line_width, 0.0),
                  (line_width, line_length)))
    origin = (-0.5 * (n_o_periods - 1) * period, 0.0)
    return GratingUniform(unit_cell=unit_cell,
                          origin=origin,
                          period=(period, 1.0),
                          n_o_periods=(n_o_periods, 1))
Beispiel #9
0
 def define_elements(self, elems):
     # FCW
     sqrt2_2 = 0.5 * sqrt(2)
     side = self.period * self.n_o_periods
     my_shape = Shape([(0.0, side * sqrt2_2), (side * sqrt2_2, 0.0),
                       (0.0, -side * sqrt2_2), (-side * sqrt2_2, 0.0)])
     elems += Boundary(PPLayer(self.process, TECH.PURPOSE.DF.TRENCH),
                       coordinates=my_shape)
     return elems
Beispiel #10
0
    def define_elements(self, elems):        
        layout = IoColumnGroup(y_spacing=25.0, south_east=(6000.0,0.0))

        #we first create a regular waveguide element 
        wg_def = WgElDefinition(wg_width = TECH.WG.WIRE_WIDTH, trench_width = TECH.WG.TRENCH_WIDTH, process = TECH.PROCESS.WG)
        wg = wg_def(shape = [(0.0,0.0), (500.0,0.0)])
        #on top of it, we add a rectangle element with III-V
        rectangle_III_V = Rectangle(PPLayer(MY_TECH.PROCESS.OL35_1, MY_TECH.PURPOSE.DEFAULT), center = (250.0, 0.0),box_size = (500.0, 20.0))
        
        #assemble both elemeents in a structure
        layout += Structure(name= "wg_with_III_V", elements = [wg, rectangle_III_V], ports = wg.ports)
        
        elems += layout
        return elems
Beispiel #11
0
    def define_elements(self, elems):
        # WG
        wg_def_stop = WgElDefinition(wg_width = self.wg_def_end.wg_width,trench_width =  self.wg_def_start.trench_width)

        shallow_tip_width = self.wg_def_sh_end.wg_width
        shallow_tip_start_width = self.wg_def_sh_start.wg_width
        elems += WgElTaperLinear(start_position = (self.shallow_tip_length + self.tip_offset + self.tip_length, 0.0), 
                            end_position = (self.tip_offset + self.tip_length, 0.0), 
                            start_wg_def = self.wg_def_start, 
                            end_wg_def = self.wg_def_end)

        # FC
        s_o_length = self.tip_offset + self.tip_length
        # draw taper to tip
        wg_def_sh_start = WgElDefinition(wg_width = self.wg_def_sh_start.wg_width+1.0, trench_width = self.wg_def_start.trench_width)
        wg_def_sh_end = WgElDefinition(wg_width = self.wg_def_sh_end.wg_width, trench_width = 0.5*(self.y_spacing-self.wg_def_sh_end.wg_width)-1.0)
        elems += WgElTaperLinear( start_position = (self.shallow_tip_length + s_o_length, 0.0),
                            end_position =  (s_o_length, 0.0), 
                            start_wg_def = wg_def_sh_start, 
                            end_wg_def = wg_def_sh_end, 
                            process = self.shallow_process)
        if self.extension > 0:
            wg_def = WgElDefinition(wg_width = self.shallow_tip_width, trench_width = 0.5*(self.y_spacing-shallow_tip_width)-1.0, process = self.shallow_process)
            elems += wg_def([(s_o_length - self.extension , 0.0), (s_o_length, 0.0)])
        #assist lines for tip
        for i in range(self.assist_lines):
            elems += Path(PPLayer(self.shallow_process, TECH.PURPOSE.LF.LINE), 
                            [(self.shallow_tip_length + s_o_length, (0.5*shallow_tip_start_width +0.5 + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)), 
                             (s_o_length, + (0.5*shallow_tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                             (s_o_length- self.extension , + (0.5*shallow_tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width))
                            ], self.assist_width)
            elems += Path(PPLayer(self.shallow_process, TECH.PURPOSE.LF.LINE), 
                            [(self.shallow_tip_length + s_o_length, - (0.5*shallow_tip_start_width+0.5+ (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)), 
                             (s_o_length,  - (0.5*shallow_tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width)),
                             (s_o_length- self.extension ,  - (0.5*shallow_tip_width + (i+1)*(self.assist_width+ self.assist_spacing) - 0.5*self.assist_width))
                            ], self.assist_width)
        return elems
Beispiel #12
0
 def define_unit_cell(self):
     stub = 0.08
     s = Shape()
     d0 = 0.5 * self.hole_diameters[0]
     d1 = 0.5 * self.hole_diameters[1]
     s += (-d0 + stub, d1)
     s += (d0 - stub, d1)
     s += (d0, d1 - stub)
     s += (d0, -d1 + stub)
     s += (d0 - stub, -d1)
     s += (-d0 + stub, -d1)
     s += (-d0, -d1 + stub)
     s += (-d0, d1 - stub)
     s.transform(Rotation(rotation=-45.0))
     return Structure(
         self.name + "_hpr",
         Boundary(PPLayer(self.process, TECH.PURPOSE.DF.SQUARE), s))
Beispiel #13
0
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)
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.OL35_1, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 101, datatype = DT_LINE) # disk
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.OL35_2, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 102, datatype = DT_LINE) # island
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.BCB_1, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 104, datatype = DT_LINE)  # botvia
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.BCB_2, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 105, datatype = DT_LINE)  # topvia
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.MET_1, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 103, datatype = DT_LINE)  # botcont
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.MET_2, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 106, datatype = DT_LINE)  # topcont
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.MET_3, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 107, datatype = DT_LINE)  # pads
MY_OUTPUT_MAP.layer_map[PPLayer(process = MY_TECH.PROCESS.MET_4, purpose = MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(number = 108, datatype = DT_LINE)  # plating



class Layout(Structure):
    
    def define_elements(self, elems):        
        layout = IoColumnGroup(y_spacing=25.0, south_east=(6000.0,0.0))
Beispiel #14
0
    def define_elements(self, elems):
        ww0 = self.wg_definitions[0].wg_width
        ww1 = self.wg_definitions[1].wg_width

        # path shape from center to OpticalPort
        L_tr = ShapePath(original_shape=[(0.0, 0.0), self.p_tr],
                         path_width=ww0)
        L_br = ShapePath(original_shape=[(0.0, 0.0), self.p_br],
                         path_width=ww0)
        L_l = ShapePath(original_shape=[(0.0, 0.0), self.p_l], path_width=ww1)

        # indices for positions in the path (start_east, end_east, ...)
        i_sl = 0
        i_el = 1
        i_sr = 3
        i_er = 2

        sh_wg = (ShapeStub(original_shape=[
            L_tr[i_er],
            intersection(L_tr[i_sr], L_tr[i_er], L_br[i_sl], L_br[i_el]),
            L_br[i_el]
        ],
                           stub_width=TECH.TECH.MINIMUM_LINE) +
                 ShapeStub(original_shape=[
                     L_br[i_er],
                     intersection(L_br[i_sr], L_br[i_er], L_tr[i_sr],
                                  L_tr[i_er]), L_l[i_el].move_copy(
                                      (self.wg_lengths[1], 0.0)), L_l[i_el]
                 ],
                           stub_width=TECH.TECH.MINIMUM_LINE,
                           only_sharp_angles=True) +
                 ShapeStub(original_shape=[
                     L_l[i_er], L_l[i_er].move_copy((self.wg_lengths[1], 0.0)),
                     intersection(L_tr[i_el], L_tr[i_sl], L_br[i_el],
                                  L_br[i_sl]), L_tr[i_el]
                 ],
                           stub_width=TECH.TECH.MINIMUM_LINE))
        sh_wg.close()

        # path shape from center to OpticalPort
        T_tr = ShapePath(original_shape=[(0.0, 0.0), self.p_tr],
                         path_width=ww0 +
                         2 * self.wg_definitions[0].trench_width)
        T_br = ShapePath(original_shape=[(0.0, 0.0), self.p_br],
                         path_width=ww0 +
                         2 * self.wg_definitions[0].trench_width)
        T_l = ShapePath(original_shape=[(0.0, 0.0), self.p_l],
                        path_width=ww1 +
                        2 * self.wg_definitions[0].trench_width)

        sh_tr = Shape([
            L_tr[i_er],
            T_tr[i_er], T_br[i_el], L_br[i_el], L_br[i_er], T_br[i_er],
            (0.0, T_br[i_er].y), T_l[i_el], L_l[i_el], L_l[i_er], T_l[i_er],
            (0.0, T_tr[i_el].y), T_tr[i_el], L_tr[i_el]
        ])
        sh_tr.close()

        elems += Boundary(
            PPLayer(self.wg_definitions[0].process, TECH.PURPOSE.LF.LINE),
            sh_wg)
        elems += Boundary(
            PPLayer(self.wg_definitions[0].process, TECH.PURPOSE.LF_AREA),
            sh_tr)
        return elems
Beispiel #15
0
    def define_elements(self, elems):
        ww0 = self.wg_definitions[0].wg_width
        ww1 = self.wg_definitions[1].wg_width
        tw0 = self.wg_definitions[0].trench_width
        tw1 = self.wg_definitions[1].trench_width

        # OpticalPort corners
        p_tr1 = self.p_tr.move_polar_copy(0.5 * ww0, 135 - self.dev_angles[0])
        p_tr2 = self.p_tr.move_polar_copy(0.5 * ww0, -45 - self.dev_angles[0]),

        p_br1 = self.p_br.move_polar_copy(0.5 * ww0, 45 + self.dev_angles[0])
        p_br2 = self.p_br.move_polar_copy(0.5 * ww0,
                                          -135 + self.dev_angles[0]),

        p_tl1 = self.p_tl.move_polar_copy(0.5 * ww1, -135 + self.dev_angles[1])
        p_tl2 = self.p_tl.move_polar_copy(0.5 * ww1, 45 + self.dev_angles[1]),

        p_bl1 = self.p_bl.move_polar_copy(0.5 * ww1, -45 - self.dev_angles[1])
        p_bl2 = self.p_bl.move_polar_copy(0.5 * ww1, 135 - self.dev_angles[1]),

        # path shape from center to OpticalPort
        L_tr = ShapePath(original_shape=[(0.0, 0.0), self.p_tr],
                         path_width=ww0)
        L_br = ShapePath(original_shape=[(0.0, 0.0), self.p_br],
                         path_width=ww0)
        L_tl = ShapePath(original_shape=[(0.0, 0.0), self.p_tl],
                         path_width=ww1)
        L_bl = ShapePath(original_shape=[(0.0, 0.0), self.p_bl],
                         path_width=ww1)

        # indices for positions in the path (start_east, end_east, ...)
        i_sl = 0
        i_el = 1
        i_sr = 3
        i_er = 2

        sh_wg = (ShapeStub(original_shape=[
            L_tr[i_er],
            intersection(L_tr[i_sr], L_tr[i_er], L_br[i_sl], L_br[i_el]),
            L_br[i_el]
        ],
                           stub_width=TECH.TECH.MINIMUM_LINE) +
                 ShapeStub(original_shape=[
                     L_br[i_er],
                     intersection(L_br[i_sr], L_br[i_er], L_bl[i_sl],
                                  L_bl[i_el]), L_bl[i_el]
                 ],
                           stub_width=TECH.TECH.MINIMUM_LINE) +
                 ShapeStub(original_shape=[
                     L_bl[i_er],
                     intersection(L_bl[i_sr], L_bl[i_er], L_tl[i_sl],
                                  L_tl[i_el]), L_tl[i_el]
                 ],
                           stub_width=TECH.TECH.MINIMUM_LINE) +
                 ShapeStub(original_shape=[
                     L_tl[i_er],
                     intersection(L_tl[i_sr], L_tl[i_er], L_tr[i_sl],
                                  L_tr[i_el]), L_tr[i_el]
                 ],
                           stub_width=TECH.TECH.MINIMUM_LINE))
        sh_wg.close()

        # path shape from center to OpticalPort
        T_tr = ShapePath(original_shape=[(0.0, 0.0), self.p_tr],
                         path_width=ww0 + 2 * tw0)
        T_br = ShapePath(original_shape=[(0.0, 0.0), self.p_br],
                         path_width=ww0 + 2 * tw0)
        T_tl = ShapePath(original_shape=[(0.0, 0.0), self.p_tl],
                         path_width=ww1 + 2 * tw1)
        T_bl = ShapePath(original_shape=[(0.0, 0.0), self.p_bl],
                         path_width=ww1 + 2 * tw1)

        sh_tr = Shape([L_tr[i_er], T_tr[i_er], T_br[i_el], L_br[i_el]] +
                      [L_br[i_er], T_br[i_er], T_bl[i_el], L_bl[i_el]] +
                      [L_bl[i_er], T_bl[i_er], T_tl[i_el], L_tl[i_el]] +
                      [L_tl[i_er], T_tl[i_er], T_tr[i_el], L_tr[i_el]])
        sh_tr.close()
        from ipkiss.process import PPLayer
        elems += Boundary(
            PPLayer(self.wg_definitions[0].process, TECH.PURPOSE.LF.LINE),
            sh_wg)
        elems += Boundary(
            PPLayer(self.wg_definitions[0].process, TECH.PURPOSE.LF_AREA),
            sh_tr)
        return elems
		def _default_layer(self):
			layer=PPLayer(process=i3.TECH.PROCESS.WG,purpose=i3.TECH.PURPOSE.LF.LINE)
			return layer
Beispiel #17
0
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 += [
    (PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.CLADDING), DISPLAY_CYAN),
    (PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.CORE), DISPLAY_VIOLET),
    (PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.TRENCH), DISPLAY_COPPER),
    (PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.HOLE), DISPLAY_BLUE),
    (PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.TRACE), DISPLAY_RED),
    (PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.CLADDING), DISPLAY_YELLOW),
    (PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.CORE), DISPLAY_ORANGE),
    (PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.TRENCH), DISPLAY_SANGRIA),
    (PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.HOLE), DISPLAY_SANGRIA),
    (PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.TRACE), DISPLAY_RED),
    (PPLayer(TECH.PROCESS.SKT, TECH.PURPOSE.CLADDING), DISPLAY_GREEN),
    (PPLayer(TECH.PROCESS.SKT, TECH.PURPOSE.CORE), DISPLAY_DARKSEY_GREEN),
    (PPLayer(TECH.PROCESS.SKT, TECH.PURPOSE.TRENCH), DISPLAY_DARKGREEN),
    (PPLayer(TECH.PROCESS.SKT, TECH.PURPOSE.HOLE), DISPLAY_DARKGREEN_HDENSE),
    (PPLayer(TECH.PROCESS.SKT, TECH.PURPOSE.TRACE), DISPLAY_RED),
    (PPLayer(TECH.PROCESS.FCW, TECH.PURPOSE.CORE), DISPLAY_PURPLE),
Beispiel #18
0
 def _default_layer(self):
     return PPLayer(process=TECH.PROCESS.M1,
                    purpose=TECH.PURPOSE.DRAWING)
Beispiel #19
0
 def define_unit_cell(self):
     s = ShapeRectangle((0.0, 0.0),
                        (self.hole_diameter, self.hole_diameter))
     return Structure(
         self.name + "_hp",
         Boundary(PPLayer(self.process, TECH.PURPOSE.DF.SQUARE), s))
Beispiel #20
0
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)
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.OL35_1,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
                                    number=101, datatype=DT_LINE)  # disk
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.OL35_2,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
                                    number=102, datatype=DT_LINE)  # island
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.BCB_1,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
                                    number=104, datatype=DT_LINE)  # botvia
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.BCB_2,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
                                    number=105, datatype=DT_LINE)  # topvia
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.MET_1,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
                                    number=103, datatype=DT_LINE)  # botcont
MY_OUTPUT_MAP.layer_map[PPLayer(process=MY_TECH.PROCESS.MET_2,
                                purpose=MY_TECH.PURPOSE.DEFAULT)] = GdsiiLayer(
		def _default_layer_c(self):
			layer=PPLayer(process=i3.TECH.PROCESS.SK,purpose=i3.TECH.PURPOSE.DF_AREA)
			return layer