Ejemplo n.º 1
0
        def _generate_ports(self, ports):  # Use _generate_ports method to define ports
            #ports += i3.InFluidicPort(name = "in", position = (0., 10.), angle = 180.0)
            ports += i3.OpticalPort(name = "in", position = (0., self.channel_trap_width*0.5), angle = 180.0)
            #ports += i3.OutFluidicPort(name ="out", position = (30., 10.), angle = 0.0)
            ports += i3.OpticalPort(name ="out", position = ((self.obstacle_trap_length+self.gap_btw_barriers)*2, self.channel_trap_width*0.5), angle = 0.0)

            return ports
Ejemplo n.º 2
0
        def _generate_ports(self, ports):

            ports += i3.OpticalPort(name="in", position=(-self.taper_length, 0.0), angle=180.0, trace_template=self.trace_template)
            ports += i3.OpticalPort(name="out1", position=(self.length + self.taper_length, -0.5 * self.waveguide_spacing), angle=0.0,
                                    trace_template=self.trace_template)
            ports += i3.OpticalPort(name="out2", position=(self.length + self.taper_length, +0.5 * self.waveguide_spacing), angle=0.0,
                                    trace_template=self.trace_template)

            return ports
Ejemplo n.º 3
0
 def _generate_ports(self, ports):
     # generate ports
     # the ports are 'right', and 'left'
     ports += i3.OpticalPort(name='right',
                             position=(0.0, 0.0),
                             angle=0.0)
     ports += i3.OpticalPort(name='left',
                             position=(-self.length, 0.0),
                             angle=180.0)
     return ports
Ejemplo n.º 4
0
        def _generate_ports(self, ports):

            for cnt, coords in enumerate(self._get_input_taper_coords(), 1):
                ports += i3.OpticalPort(name="in{}".format(cnt), position=coords[1], angle=180.0,
                                        trace_template=self.trace_template)

            for cnt, coords in enumerate(self._get_output_taper_coords(), 1):
                ports += i3.OpticalPort(name="out{}".format(cnt), position=coords[1], angle=0.0,
                                        trace_template=self.trace_template)

            return ports
        def _generate_ports(self, ports):
            # ports += i3.OpticalPort(name="in", position=(0.0, 0.0), angle=180.0,
            #                         trace_template=StripWgTemplate().Layout(core_width=self.wg_width))
            # ports += i3.OpticalPort(name="out", position=(self.length, 0.0), angle=0.0,
            #                         trace_template=StripWgTemplate().Layout(core_width=self.wg_width))

            ports += i3.OpticalPort(name="in",
                                    position=(0.0, 0.0),
                                    angle=180.0)
            ports += i3.OpticalPort(name="out",
                                    position=(self.length, 0.0),
                                    angle=0.0)
            return ports
        def _generate_ports(
                self, ports):  # Use _generate_ports method to define ports
            ports += i3.OpticalPort(name="in",
                                    position=(0., self.obstacle_trap_radius +
                                              self.gap_btw_barriers),
                                    angle=180.0)
            ports += i3.OpticalPort(
                name="out",
                position=((self.gap_btw_barriers * 1.5 +
                           self.obstacle_trap_radius * 3),
                          self.obstacle_trap_radius + self.gap_btw_barriers),
                angle=0.0)

            return ports
Ejemplo n.º 7
0
 def _generate_ports(self, ports):
     size = self.wg_width.shape
     length = size[0] - 1
     ports += i3.OpticalPort(name="in",
                             position=(self.wg_path[0, 0],
                                       self.wg_path[0, 1]),
                             angle=self.start_angle + 180.0,
                             trace_template=StripWgTemplate().Layout(
                                 core_width=self.wg_width[0]))
     ports += i3.OpticalPort(name="out",
                             position=(self.wg_path[length, 0],
                                       self.wg_path[length, 1]),
                             angle=self.end_angle,
                             trace_template=StripWgTemplate().Layout(
                                 core_width=self.wg_width[length]))
     return ports
Ejemplo n.º 8
0
        def _generate_ports(self, ports):
            # add ports 'left' and 'right'

            # left port
            ports += i3.OpticalPort(
                name='left',
                position=self.instances['tp0'].ports['left'].position,
                angle=180.0)

            # right port
            ports += i3.OpticalPort(
                name='right',
                position=self.instances['tp' + str(self.n_pairs -
                                                   1)].ports['right'].position,
                angle=0.0)

            return ports
Ejemplo n.º 9
0
        def _generate_ports(self, ports):
            # add ports 'left' and 'right'

            # left port
            ports += i3.OpticalPort(
                name='left',
                position=self.instances[self.name +
                                        '_taper1'].ports['left'].position,
                angle=180.0)

            # right port
            ports += i3.OpticalPort(
                name='right',
                position=self.instances[self.name +
                                        '_taper2'].ports['left'].position,
                angle=0.0)

            return ports
Ejemplo n.º 10
0
        def _generate_ports(self, ports):
            # add ports 'left' and 'right'

            # left port
            ports += i3.OpticalPort(
                name='left',
                position=self.instances[
                    self.name + '_EDGETAPER_WEST'].ports['in'].position,
                angle=180.0)

            # right port
            ports += i3.OpticalPort(
                name='right',
                position=self.instances[
                    self.name + '_EDGETAPER_EAST'].ports['out'].position,
                angle=0.0)

            return ports
Ejemplo n.º 11
0
        def _generate_ports(self, ports):
            """
            THIS NEEDS TO BE UPDATED TO REFLECT INPUT OUTPUT TAPERS
            """
            # ports += self.instances["SidewallGratWg0"].ports["in"]
            # ports += self.instances["SidewallGratWg"+str(self.numrows-1)].ports["out"]

            ports += i3.OpticalPort(name='in',
                                    position=self.instances["SwgTaper_West0"].
                                    ports["left"].position,
                                    angle=180.0)
            ports += i3.OpticalPort(
                name='out',
                position=self.instances["SwgTaper_East" +
                                        str(self.numrows -
                                            1)].ports["left"].position,
                angle=0.0)

            return ports
Ejemplo n.º 12
0
        def _generate_ports(self, ports):
            # add ports 'left' and 'right'

            # left port
            ports += i3.OpticalPort(
                name='in',
                position=self.instances[self.name +
                                        '_BEND_A0'].ports['in'].position,
                angle=0.0)

            # right port
            ports += i3.OpticalPort(
                name='out',
                position=self.instances[self.name + '_BEND_B' +
                                        str(self.n_pairs -
                                            1)].ports['out'].position,
                angle=180.0)

            return ports
        def _generate_ports(self, ports):
            ports += i3.OpticalPort(
                name='in', position=(20.0, 0.0), angle=0.0
            )  # We have to manually set the ports as this info is not in the gdsii file yet
            ports += i3.VerticalOpticalPort(
                name="vertical_in",
                position=(0.0, 0.0),
                inclination=90.0,
                angle=0.0)  # For the fiber a vertical port is used.

            return ports
Ejemplo n.º 14
0
 def _generate_ports(self, ports):
     from ..waveguides.wire import SWG450
     ports += i3.OpticalPort(name="in",
                             position=(-5.0, 0.0),
                             angle=180.0,
                             trace_template=SWG450())
     ports += i3.ElectricalPort(name="cathode",
                                position=(0.5 * self.length,
                                          self.contact_offset + 1.25))
     ports += i3.ElectricalPort(name="anode",
                                position=(0.5 * self.length,
                                          -self.contact_offset - 1.25))
     return ports
Ejemplo n.º 15
0
        def _generate_ports(self, ports):
            # Port 'out' = chip edge
            # Port 'in' = connecting waveguide

            # generate chip/out port
            edge_coupler_size_inf = self.instances[
                self.name + '_EDGE_COUPLER'].size_info()
            edge_coupler_left_edge_pos = edge_coupler_size_inf.west
            edge_coupler_mid_y = edge_coupler_size_inf.center[1]
            ports += i3.OpticalPort(name='out',
                                    position=(edge_coupler_left_edge_pos,
                                              edge_coupler_mid_y),
                                    angle=180.0)

            # generate waveguide/in port
            edge_coupler_right_edge_pos = edge_coupler_size_inf.east
            ports += i3.OpticalPort(name='in',
                                    position=(edge_coupler_right_edge_pos,
                                              edge_coupler_mid_y),
                                    angle=0.0)

            return ports
Ejemplo n.º 16
0
    def new_function(start_port,
                     end_port,
                     name=None,
                     shape=None,
                     connector_kwargs={}):

        start_ports = [start_port] + [
            i3.OpticalPort(trace_template=start_port.trace_template,
                           position=(0.0, 0.0)).transform(transformation=t)
            for t in cleaned_transformations
        ]

        end_ports = [
            p.modified_copy(angle=p.angle + 180.0) for p in start_ports[1:]
        ] + [end_port]

        traces = []
        for cnt, (cf, sp, ep) in enumerate(
                zip(connector_functions, start_ports, end_ports)):
            seg_name = "{}_segment_{}".format(name, cnt)
            traces.append(cf(start_port=sp, end_port=ep, name=seg_name))

        return TraceChainWithCenterLine(name=name, traces=traces)
        def _generate_instances(self, insts):
            # Generates taper pairs w edge couplers

            # load the aim gds just to get its positions and stuff
            # main chip GDS
            fname = '../PDK_Library_Layout_GDS/ap_suny_v20a_chipframe.gds'
            main_chip_gds_cell = i3.GDSCell(filename=fname)

            # grab layout size info
            main_chip_gds_lay = main_chip_gds_cell.Layout()
            main_chip_gds_lay_size_info = main_chip_gds_lay.size_info()

            # grab relevant positions
            chip_edge_east = main_chip_gds_lay_size_info.east
            chip_edge_west = main_chip_gds_lay_size_info.west

            # make edge coupler
            edge_coupler_gds_lay = EdgeCoupler(name=self.name +
                                               'edge_coupler_sffdfi').Layout()

            # add and route input/west edgecoupler
            # position edge coupler on west side of chip
            chip_port_west = i3.OpticalPort(position=(chip_edge_west, 0.0),
                                            angle_deg=0.0)
            edge_coupler_west_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_west_port,
                                          chip_port_west)
            edge_coupler_west_name = self.name + '_EDGE_COUPLER_WEST'
            west_edge_coupler = i3.SRef(name=edge_coupler_west_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          west_edge_coupler.ports['in'])
            lin_taper_lay_name = self.name + '_EDGETAPER_WEST'
            insts += i3.SRef(name=lin_taper_lay_name,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # route wg to wg with arc
            bend_radius = 10.0
            arc_center_1 = (
                insts[lin_taper_lay_name].ports['out'].position[0],
                insts[lin_taper_lay_name].ports['out'].position[1] +
                bend_radius)
            route_wg_shape_arc1 = i3.ShapeArc(radius=bend_radius,
                                              angle_step=1.0,
                                              center=arc_center_1,
                                              start_angle=269.5,
                                              end_angle=0.5,
                                              closed=False,
                                              clockwise=False)
            wg_name_arc1 = self.name + '_ARC1'
            wg_lay_arc1 = i3.Waveguide(trace_template=StripWgTemplate(),
                                       name=wg_name_arc1).get_default_view(
                                           i3.LayoutView)
            wg_lay_arc1.set(shape=route_wg_shape_arc1)
            insts += i3.SRef(name=wg_name_arc1,
                             reference=wg_lay_arc1,
                             flatten=True)

            # add the bends
            bend_clip_lay = BendClip(
                name=self.name + '_BEND_CLIP').get_default_view(i3.LayoutView)
            bend_clip_lay.set(n_pairs=self.n_pairs)

            # add to insts
            bend_clip_lay_name = self.name + '_BEND_CLIP'
            t = i3.vector_match_transform(bend_clip_lay.ports['in'],
                                          insts[wg_name_arc1].ports['out'])
            insts += i3.SRef(name=bend_clip_lay_name,
                             reference=bend_clip_lay,
                             transformation=t,
                             flatten=True)

            # add output bend
            arc_center_2 = (
                insts[bend_clip_lay_name].ports['out'].position[0] +
                bend_radius,
                insts[bend_clip_lay_name].ports['out'].position[1])
            route_wg_shape_arc2 = i3.ShapeArc(radius=bend_radius,
                                              angle_step=1.0,
                                              center=arc_center_2,
                                              start_angle=180.5,
                                              end_angle=89.5,
                                              closed=False,
                                              clockwise=True)
            wg_name_arc2 = self.name + '_ARC2'
            wg_lay_arc2 = i3.Waveguide(trace_template=StripWgTemplate(),
                                       name=wg_name_arc2).get_default_view(
                                           i3.LayoutView)
            wg_lay_arc2.set(shape=route_wg_shape_arc2)
            insts += i3.SRef(name=wg_name_arc2,
                             reference=wg_lay_arc2,
                             flatten=True)

            # add east coupler
            chip_port_east = i3.OpticalPort(
                position=(chip_edge_east,
                          insts[wg_name_arc2].ports['out'].position[1]),
                angle_deg=180.0)
            edge_coupler_east_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_east_port,
                                          chip_port_east,
                                          mirrored=True)
            edge_coupler_east_name = self.name + '_EDGE_COUPLER_EAST'
            east_edge_coupler = i3.SRef(name=edge_coupler_east_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          east_edge_coupler.ports['in'],
                                          mirrored=True)
            lin_taper_lay_name = self.name + '_EDGETAPER_EAST'
            insts += i3.SRef(name=lin_taper_lay_name,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # route arc to arc with straight section
            route_wg_shape_out = i3.Shape([
                insts[wg_name_arc2].ports['out'].position,
                insts[lin_taper_lay_name].ports['out'].position
            ])
            wg_name_out = self.name + '_WG_CON_OUT'
            wg_lay_out = i3.Waveguide(trace_template=StripWgTemplate(),
                                      name=wg_name_out).get_default_view(
                                          i3.LayoutView)
            wg_lay_out.set(shape=route_wg_shape_out)
            insts += i3.SRef(name=wg_name_out,
                             reference=wg_lay_out,
                             flatten=True)

            return insts
Ejemplo n.º 18
0
 def _generate_ports(self, ports):
     from technology.WgTemplate import StripWgTemplate
     ports += i3.OpticalPort(name="port_name0", position=(xloc0, yloc0), angle=angle0, trace_template=StripWgTemplate())
     ports += i3.OpticalPort(name="port_name1", position=(xloc1, yloc1), angle=angle1, trace_template=StripWgTemplate())
     return ports
Ejemplo n.º 19
0
        width_wide = connector_kwargs["width_wide"]
    else:
        width_wide = 3.

    if shape is None:
        shape = RouteManhattan(input_port=start_port,
                               output_port=end_port,
                               bend_radius=bend_radius)

    from ipkiss3.pcell.photonics.expanded_waveguide import ExpandedWaveguide

    wav = ExpandedWaveguide(trace_template=trace_template, name=name)
    wav.Layout(shape=shape,
               narrow_width=trace_template.core_width,
               expanded_width=width_wide,
               taper_length=taper_length,
               expanded_layer=trace_template.core_layer)

    return wav


if __name__ == "__main__":

    from ipkiss3 import all as i3
    start_port = i3.OpticalPort(position=(0.0, 0.0), angle=0.0)
    end_port = i3.OpticalPort(position=(200.0, 50.0), angle=180.0)
    cell = wide_manhattan(start_port, end_port, name="TestWaveguide")
    lv = cell.get_default_view(i3.LayoutView)
    lv.visualize()
    lv.write_gdsii("expanded.gds")
Ejemplo n.º 20
0
        def _generate_instances(self, insts):
            # Generates taper pairs

            tp_name_list = []

            # temporary? pick taper properties
            taper_prop_dict = {
                'length': 79.0,
                'width1': 0.50,
                'width2': 6.50,
                'width_etch': 2.0
            }

            # generate a huge taper row
            tp_rows_layout = TaperPairRow().Layout(
                taper_prop_dict=taper_prop_dict,
                connect_length=0.0,
                pair_connect_length=10.0,
                n_pairs=self.n_pairs)

            # load the aim gds just to get its positions and stuff
            # main chip GDS
            fname = os.path.dirname(
                os.path.realpath(__file__)) + '/gds/ap_suny_v20a_chipframe.gds'
            main_chip_gds_cell = i3.GDSCell(filename=fname)

            # grab layout size info
            main_chip_gds_lay = main_chip_gds_cell.Layout()
            main_chip_gds_lay_size_info = main_chip_gds_lay.size_info()

            # grab relevant positions
            chip_edge_east = main_chip_gds_lay_size_info.east
            chip_edge_west = main_chip_gds_lay_size_info.west

            # make edge coupler and add to layout
            # edge coupler
            edge_coupler_gds_lay = EdgeCoupler(name=self.name +
                                               'edge_coupler_si').Layout()

            # add and route input/west edgecoupler
            # position edge coupler on west side of chip
            chip_port_west = i3.OpticalPort(position=(chip_edge_west, 0.0),
                                            angle_deg=0.0)
            edge_coupler_west_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_west_port,
                                          chip_port_west)
            edge_coupler_west_name = self.name + '_EDGE_COUPLER_WEST'
            west_edge_coupler = i3.SRef(name=edge_coupler_west_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          west_edge_coupler.ports['in'])
            lin_taper_lay_name = self.name + '_EDGETAPER_WEST'
            insts += i3.SRef(name=lin_taper_lay_name,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # add taper rows
            taper_row_name = self.name + '_TAPERSSSSSSSS'
            t = i3.vector_match_transform(
                tp_rows_layout.ports['left'],
                insts[lin_taper_lay_name].ports['out'])
            insts += i3.SRef(name=taper_row_name,
                             reference=tp_rows_layout,
                             transformation=t,
                             flatten=True)

            # add east coupler
            chip_port_east = i3.OpticalPort(position=(chip_edge_east, 0.0),
                                            angle_deg=180.0)
            edge_coupler_east_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_east_port,
                                          chip_port_east,
                                          mirrored=True)
            edge_coupler_east_name = self.name + '_EDGE_COUPLER_EAST'
            east_edge_coupler = i3.SRef(name=edge_coupler_east_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          east_edge_coupler.ports['in'],
                                          mirrored=True)
            lin_taper_lay_name = self.name + '_EDGETAPER_EAST'
            insts += i3.SRef(name=lin_taper_lay_name,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # route the east coupler to the east edge of the taper pairs
            route_wg_row_taper = i3.Shape([
                insts[taper_row_name].ports['right'].position,
                insts[lin_taper_lay_name].ports['out'].position
            ])
            wg_name = self.name + '_WG'
            wg_lay = i3.Waveguide(trace_template=StripWgTemplate(),
                                  name=wg_name).get_default_view(i3.LayoutView)
            wg_lay.set(shape=route_wg_row_taper)
            insts += i3.SRef(name=wg_name, reference=wg_lay, flatten=True)

            return insts
Ejemplo n.º 21
0
 def _generate_ports(self, ports):
     ports += i3.OpticalPort(name="in", position=(4.0, 0.0), angle=0.0, trace_template=i3.TECH.PCELLS.WG.DEFAULT)
     return ports
        def _generate_instances(self, insts):
            width = 200.0
            p1 = (-self.radius, -self.radius)  #near cylinders
            p2 = (-self.radius, -2 * self.radius)  #bottom
            p3 = (2 * self.radius, -2 * self.radius)  #right
            p4 = (2 * self.radius, 0)  #top
            p5 = (2 * self.radius + 500, 0)  #out
            pax = (-width * 0.5 * math.cos(45), width * 0.5 * math.sin(45))

            #generate a circle
            sr1 = i3.ShapeCircle(center=(0.0, 0.0),
                                 radius=self.radius)  #, line_width = 200)
            br1 = i3.Boundary(layer=self.layer, shape=sr1)
            #s= i3.Structure(elements = br1)

            #rectangle
            sc1 = i3.ShapeRectangle(center=p1,
                                    box_size=(self.radius * 4,
                                              self.radius * 0.25))
            bc1 = i3.Boundary(layer=self.layer,
                              shape=sc1,
                              transformation=i3.Rotation((0, 0),
                                                         -45.0))  # was -35
            #Substruct boundaries and add to the element list
            b_sub = br1 - bc1
            s = i3.Structure(elements=b_sub)
            insts += i3.SRef(s)

            #Input channel - segment
            channel1 = microfluidics.Channel(
                trace_template=self.cell.channel_template)
            #channel_template = microfluidics.ShortChannelTemplate().Layout(width=200.0)
            channel1_lo = channel1.Layout(shape=[(self.inlet_channel_length +
                                                  self.offset_matching * 0.5,
                                                  0), (0, 0)])
            insts += i3.SRef(
                channel1_lo,
                position=(-(self.inlet_channel_length + self.radius), 0),
                transformation=i3.Rotation((0.0, 0.0), 0.0))

            #############################routing

            from ipkiss.plugins.photonics.routing.manhattan import RouteManhattan

            channel_4 = microfluidics.RoundedChannel(
                trace_template=self.cell.channel_template)  # used for routing
            channel_4_layout = channel_4.Layout()

            import operator
            p1Array = tuple(map(operator.add, p1, pax))

            print 'p1: ', p1
            print 'pax: ', pax
            print 'p1Array: ', p1Array

            #obstacles
            insts += i3.SRef(reference=self.obstacles,
                             position=p1Array,
                             transformation=i3.Rotation((0, 0), -45.0))

            in_port_1 = microfluidics.FluidicPort(
                position=p1, trace_template=self.cell.channel_template)
            out_port_1 = microfluidics.FluidicPort(
                trace_template=self.cell.channel_template)
            in_port_1.angle_deg = 225
            out_port_1.angle_deg = 45

            in_port_2 = microfluidics.FluidicPort(
                position=p2, trace_template=self.cell.channel_template)
            in_port_2.angle_deg = 225
            channel_4_layout.set(bend_radius=150.0,
                                 shape=RouteManhattan(input_port=in_port_2,
                                                      points=[p2, p3, p4, p5],
                                                      output_port=out_port_1,
                                                      bend_radius=300.0))
            insts += i3.SRef(name="Route_1", reference=channel_4)
            ##############################routing

            from ipkiss3.pcell.routing import RouteToAngle

            # create the route object
            channel_1 = microfluidics.RoundedChannel(
                trace_template=self.cell.channel_template)  # used for routing
            channel_1_layout = channel_1.Layout()
            channel_1_layout.set(bend_radius=50.0,
                                 shape=RouteToAngle(input_port=in_port_1,
                                                    start_straight=300,
                                                    end_straight=300,
                                                    angle_out=45))
            #insts += i3.SRef(name = "Route_2", reference = channel_1)

            from ipkiss3.pcell.routing import RouteToEastAtMaxY, RouteToEastAtMinY, RouteToEastAtY

            # create the route object
            input_portx = i3.OpticalPort(name="in",
                                         position=(-self.radius, -self.radius),
                                         angle_deg=225.0)
            channel_x = microfluidics.RoundedChannel(
                trace_template=self.cell.channel_template)  # used for routing
            channel_x_layout = channel_x.Layout()
            channel_x_layout.set(bend_radius=150.0,
                                 shape=RouteToEastAtY(input_port=input_portx,
                                                      start_straight=200,
                                                      end_straight=200,
                                                      y_position=-2 *
                                                      self.radius))
            insts += i3.SRef(name="Route_x", reference=channel_x)

            return insts
Ejemplo n.º 23
0
        def _generate_instances(self, insts):
            # Generates a long ass row of gratings

            # serp_grating_layout = SerpGratingArray().get_default_view(i3.LayoutView)
            # serp_grating_layout.set( pitch              = 0.5,
            #                          grat_wg_width      = 6.5,
            #                          flyback_wg_width   = 6.5,
            #                          grating_amp        = grating_amps[i_row][i_col],
            #                          duty_cycle         = duty_cycle,
            #                          period             = period,
            #                          numrows            = numrows_tx,
            #                          grating_type       = grating_types[i_row][i_col],
            #                          length             = 100.0 )

            # load the aim gds just to get its positions and stuff
            # main chip GDS
            fname = '../PDK_Library_Layout_GDS/ap_suny_v20a_chipframe.gds'
            main_chip_gds_cell = i3.GDSCell(filename=fname)

            # grab layout size info
            main_chip_gds_lay = main_chip_gds_cell.Layout()
            main_chip_gds_lay_size_info = main_chip_gds_lay.size_info()

            # grab relevant positions
            chip_edge_east = main_chip_gds_lay_size_info.east
            chip_edge_west = main_chip_gds_lay_size_info.west

            # make edge coupler
            edge_coupler_gds_lay = EdgeCoupler(
                name=self.name + 'edge_coupler_mmmmffff').Layout()

            # add and route input/west edgecoupler
            # position edge coupler on west side of chip
            chip_port_west = i3.OpticalPort(position=(chip_edge_west, 0.0),
                                            angle_deg=0.0)
            edge_coupler_west_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_west_port,
                                          chip_port_west)
            edge_coupler_west_name = self.name + '_EDGE_COUPLER_WEST'
            west_edge_coupler = i3.SRef(name=edge_coupler_west_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          west_edge_coupler.ports['in'])
            lin_taper_lay_name = self.name + '_EDGETAPER_WEST'
            insts += i3.SRef(name=lin_taper_lay_name,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # Hard code the tapers into here: (I hate hardcoding stuff, but no choice here)
            taper_length = 79.0  # 79 is the best according to deniz' sims
            width_etch = 4.0
            wg_width = 0.5
            taper_swg_lay_1 = ParabolicTaper(
                name=self.name + '_TAPER_1').get_default_view(i3.LayoutView)
            taper_swg_lay_1.set(length=taper_length,
                                width1=wg_width,
                                width2=self.grat_wg_width,
                                width_etch=width_etch)
            taper_swg_name_1 = self.name + '_TAPER_1'
            t = i3.vector_match_transform(
                taper_swg_lay_1.ports['left'],
                insts[lin_taper_lay_name].ports['out'])
            insts += i3.SRef(name=taper_swg_name_1,
                             reference=taper_swg_lay_1,
                             transformation=t,
                             flatten=True)

            # add grating array
            # make grating layout
            swg_l_name = self.name + '_SWG'
            if self.grating_type == 'one_sidewall':
                # single sidewall grating
                swg_l = SidewallGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          both_sides=False)

            elif self.grating_type == 'two_sidewalls':
                # double sidewall grating
                swg_l = SidewallGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          both_sides=True)

            elif self.grating_type == 'nitride_vertical_top':
                # nitride vertical grating, top layer
                swg_l = NitrideGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          grating_type='vertical',
                          nitride_layer='top')

            elif self.grating_type == 'nitride_vertical_bottom':
                # nitride vertical grating, top layer
                swg_l = NitrideGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          grating_type='vertical',
                          nitride_layer='bottom')

            elif self.grating_type == 'nitride_one_sidewall_top':
                # nitride vertical grating, top layer
                swg_l = NitrideGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          grating_type='one_sidewall',
                          nitride_layer='top')

            elif self.grating_type == 'nitride_one_sidewall_bottom':
                # nitride vertical grating, top layer
                swg_l = NitrideGratingWg(name=swg_l_name).get_default_view(
                    i3.LayoutView)
                swg_l.set(period=self.period,
                          duty_cycle=self.duty_cycle,
                          grating_amp=self.grating_amp,
                          wg_width=self.grat_wg_width,
                          length=self.length,
                          grating_type='one_sidewall',
                          nitride_layer='bottom')

            # end getting grating layout

            # add waveguide instance

            t = i3.vector_match_transform(
                swg_l.ports['in'], insts[taper_swg_name_1].ports['right'])
            insts += i3.SRef(name=swg_l_name,
                             reference=swg_l,
                             transformation=t,
                             flatten=True)

            # add east coupler
            chip_port_east = i3.OpticalPort(position=(chip_edge_east, 0.0),
                                            angle_deg=180.0)
            edge_coupler_east_port = edge_coupler_gds_lay.ports['out']
            t = i3.vector_match_transform(edge_coupler_east_port,
                                          chip_port_east,
                                          mirrored=True)
            edge_coupler_east_name = self.name + '_EDGE_COUPLER_EAST'
            east_edge_coupler = i3.SRef(name=edge_coupler_east_name,
                                        reference=edge_coupler_gds_lay,
                                        transformation=t,
                                        flatten=False)

            # add a small linear taper to go from 0.4 to 0.5um wg
            lin_taper_lay = LinearTaper().get_default_view(i3.LayoutView)
            lin_taper_lay.set(wg_width_in=0.4, wg_width_out=0.5, length=10.0)
            t = i3.vector_match_transform(lin_taper_lay.ports['in'],
                                          east_edge_coupler.ports['in'],
                                          mirrored=True)
            lin_taper_lay_name_east = self.name + '_EDGETAPER_EAST'
            insts += i3.SRef(name=lin_taper_lay_name_east,
                             reference=lin_taper_lay,
                             transformation=t,
                             flatten=True)

            # east taper
            taper_swg_lay_2 = ParabolicTaper(
                name=self.name + '_TAPER_2').get_default_view(i3.LayoutView)
            taper_swg_lay_2.set(length=taper_length,
                                width1=wg_width,
                                width2=self.grat_wg_width,
                                width_etch=width_etch)
            taper_swg_name_2 = self.name + '_TAPER_2'
            t = i3.vector_match_transform(
                taper_swg_lay_2.ports['left'],
                insts[lin_taper_lay_name_east].ports['out'],
                mirrored=True)
            insts += i3.SRef(name=taper_swg_name_2,
                             reference=taper_swg_lay_2,
                             transformation=t,
                             flatten=True)

            # connect with fat waveguide, which is just a sidewall grating with no amp
            connect_len = insts[taper_swg_name_2].ports['right'].position[
                0] - insts[swg_l_name].ports['out'].position[0]
            fat_wg_l = SidewallGratingWg().get_default_view(i3.LayoutView)
            fat_wg_l_name = self.name + '_FAT_WG_CON'
            fat_wg_l.set(period=self.period,
                         duty_cycle=self.duty_cycle,
                         grating_amp=0.0,
                         wg_width=self.grat_wg_width,
                         length=connect_len,
                         both_sides=False)
            t = i3.vector_match_transform(fat_wg_l.ports['in'],
                                          insts[swg_l_name].ports['out'])
            insts += i3.SRef(name=fat_wg_l_name,
                             reference=fat_wg_l,
                             transformation=t,
                             flatten=True)

            return insts
Ejemplo n.º 24
0
        def _generate_instances(self, insts):
            # Generates taper clip

            # taper clip defaults
            n_rows = 3
            n_taper_pairs_per_row = [1, 3, 5]
            row_spacing = 15.0
            grating_name = 'FGCCTE_FCWFC1DC_630_378'
            connect_length = 5.0
            pair_connect_length = 5.0
            bot_gc_connect_length = 15.0
            top_gc_connect_length = 15.0
            bend_radius = 10.0

            # taper properties
            # taper_prop_dict = {
            #     'length':       100.0,
            #     'width1':       0.450,
            #     'width2':       11.0,
            #     'width_etch':   2.0
            # }

            # add first taper clip
            tc1_name = self.name + '_tc1'
            taper_clip_layout = TaperClip(tc1_name).get_default_view(
                i3.LayoutView)
            taper_clip_layout.set(
                n_rows=n_rows,
                n_taper_pairs_per_row=n_taper_pairs_per_row[0],
                row_spacing=row_spacing,
                grating_name=grating_name,
                connect_length=connect_length,
                pair_connect_length=pair_connect_length,
                bot_gc_connect_length=bot_gc_connect_length,
                top_gc_connect_length=top_gc_connect_length,
                bend_radius=bend_radius,
                taper_prop_dict=self.taper_prop_dict)

            # plop it down
            insts += i3.SRef(name=tc1_name, reference=taper_clip_layout)

            # add second taper clip
            tc2_name = self.name + '_tc2'
            taper_clip_layout = TaperClip(tc2_name).get_default_view(
                i3.LayoutView)
            taper_clip_layout.set(
                n_rows=n_rows,
                n_taper_pairs_per_row=n_taper_pairs_per_row[1],
                row_spacing=row_spacing,
                grating_name=grating_name,
                connect_length=connect_length,
                pair_connect_length=pair_connect_length,
                bot_gc_connect_length=bot_gc_connect_length,
                top_gc_connect_length=top_gc_connect_length,
                bend_radius=bend_radius,
                taper_prop_dict=self.taper_prop_dict)

            # plop it down
            tc1_size_info = insts[tc1_name].size_info()
            tc2_size_info = taper_clip_layout.size_info()

            t = i3.vector_match_transform(
                i3.OpticalPort(name='temp1',
                               position=(tc2_size_info.west, 0.0),
                               angle=180.0),
                i3.OpticalPort(name='temp2',
                               position=(tc1_size_info.east, 0.0),
                               angle=0.0))
            t += i3.Translation((-25.0, 0.0))
            insts += i3.SRef(name=tc2_name,
                             reference=taper_clip_layout,
                             transformation=t)

            # add third taper clip
            tc3_name = self.name + '_tc3'
            taper_clip_layout = TaperClip(tc3_name).get_default_view(
                i3.LayoutView)
            taper_clip_layout.set(
                n_rows=n_rows,
                n_taper_pairs_per_row=n_taper_pairs_per_row[2],
                row_spacing=row_spacing,
                grating_name=grating_name,
                connect_length=connect_length,
                pair_connect_length=pair_connect_length,
                bot_gc_connect_length=bot_gc_connect_length,
                top_gc_connect_length=top_gc_connect_length,
                bend_radius=bend_radius,
                taper_prop_dict=taper_prop_dict)

            # plop it down
            tc2_size_info = insts[tc2_name].size_info()
            tc3_size_info = taper_clip_layout.size_info()

            pos = (0.0, 60.0)

            insts += i3.SRef(name=tc3_name,
                             reference=taper_clip_layout,
                             position=pos)

            # t = i3.vector_match_transform(
            #         i3.OpticalPort(name='temp1', position=(tc3_size_info.west, 0.0), angle=180.0),
            #         i3.OpticalPort(name='temp2', position=(tc2_size_info.east, 0.0), angle=0.0) )
            # t += i3.Translation( (-25.0, 0.0) )
            # insts += i3.SRef( name      = tc3_name,
            #                   reference = taper_clip_layout,
            #                   transformation = t )

            return insts