Пример #1
0
    def define_elements(self, elems):
        from ipkiss.plugins.photonics.routing.connect import RouteConnectorRounded
        r1, r2 = self.get_waveguide_routes()

        elems += RouteConnectorRounded(route=r1)
        elems += RouteConnectorRounded(route=r2)
        return elems
Пример #2
0
 def define_connectors_splitter_transforms(self):
     T = -Translation(self.splitter.in_ports[0].position)
     #T = -Translation((0.0,0.0))
     splitter_transforms = [T]
     P = self.splitter.out_ports.y_sorted().transform_copy(T)
     connectors = [[RouteConnectorRounded(RouteToEastAtY(input_port = P[0], y_position = -0.5*self.y_spacing)),
                    RouteConnectorRounded(RouteToEastAtY(input_port = P[1], y_position = 0.5*self.y_spacing))]]
     return (connectors, splitter_transforms)
Пример #3
0
    def define_patches_connectors_splitter_transforms(self):
        N = 2**self.branch_level
        L = self.splitter.out_ports.size_info(
        ).east - self.splitter.in_ports.size_info().west
        T = [Translation(-self.splitter.in_ports[0].position)]
        splitter_transforms = []
        splitter_transforms += T
        connectors = []
        patches = []
        for i in range(self.branch_level):
            C = []
            P = []
            T2 = []
            Y = 0.5 * self.y_spacing * 2**(self.branch_level - i)
            for t in T:
                P_out = self.splitter.out_ports.y_sorted().transform_copy(t)
                P_in = self.splitter.in_ports.transform_copy(t)
                c1 = RouteConnectorRounded(
                    RouteToEastAtY(input_port=P_out[0],
                                   y_position=P_in[0].y - 0.5 * Y))
                c2 = RouteConnectorRounded(
                    RouteToEastAtY(input_port=P_out[1],
                                   y_position=P_in[0].y + 0.5 * Y))
                C += [c1, c2]
                # patch sharp angle between connectors
                c1i = c1.in_ports[0]
                c2i = c2.in_ports[0]
                c1o = c1.out_ports[0]
                c2o = c2.out_ports[0]
                xl = min(c1i.position.x,
                         c2i.position.x) + 0.5 * c1.shape.start_straight
                yl = 0.5 * (c1i.position.y + c2i.position.y)
                xr = max(c1o.position.x,
                         c2o.position.x) - 0.5 * c1.shape.end_straight
                wp = abs(c2o.position.y - c1o.position.y) + 0.5 * (
                    c1o.wg_definition.wg_width + c2o.wg_definition.wg_width
                ) + c1o.wg_definition.trench_width + c2o.wg_definition.trench_width
                ## patches necessary??? probably depends on the splitter you take
                #P += [Line(layer=PPLayer(self.splitter.wg_definition.process, TECH.PURPOSE.LF_AREA),begin_coord=(xl,yl),end_coord=(xr,yl),line_width=wp)]
                if i < self.branch_level - 1:
                    T2 += [
                        Translation(
                            coord2_match_position(self.splitter.in_ports[0],
                                                  c1.out_ports[0])),
                        Translation(
                            coord2_match_position(self.splitter.in_ports[0],
                                                  c2.out_ports[0]))
                    ]

            connectors += [C]
            patches += [P]
            splitter_transforms += T2
            T = T2
        return (patches, connectors, splitter_transforms)
Пример #4
0
    def define_elements(self, elems):
        t1, t2 = self.get_transformations()

        # Single References (SREF) place a copy of the layout at a given position with
        # transformation. This is a reference copy, so the layout data is not duplicated.
        elems += SRef(reference=self.ring1, transformation=t1)
        elems += SRef(reference=self.ring2, transformation=t2)

        # add the routes
        from ipkiss.plugins.photonics.routing.connect import RouteConnectorRounded
        for r in self.get_routes():
            elems += RouteConnectorRounded(route=r)
        return elems
Пример #5
0
    def define_elements(self, elems):
        from ipkiss.plugins.photonics.routing.connect import RouteConnectorRounded
        for r in self.get_routes():
            elems += RouteConnectorRounded(route=r)

        #calculate additional transformation to put the structure in place.
        structure_transform = vector_match_transform(
            self.structure.ports[self.port_labels[0]].transform_copy(
                self.structure_transformation),
            self.get_routes()[0].ports[-1])

        elems += SRef(reference=self.structure,
                      transformation=self.structure_transformation +
                      structure_transform)
        return elems
Пример #6
0
    def define_elements(self, elems):
        # go over ports
        for i in range(len(self.struct_west_ports)):
            ip = self.struct_west_ports[i]

            # position tapers
            t_pos = (ip.position[0] - self.connect_length, self.__y_west__[i])

            T = WgElTaperLinear(start_position=t_pos,
                                end_position=(t_pos[0] - self.taper_length,
                                              t_pos[1]),
                                start_wg_def=ip.wg_definition,
                                end_wg_def=self.wg_definition)

            elems += T
            # draw straight waveguides
            elems += self.wg_definition(
                shape=[T.west_ports[0].position, (0.0, t_pos[1])])
            # generic connector between structure port and taper port
            R = RouteToWestAtY(input_port=ip,
                               y_position=T.east_ports[0].y,
                               bend_radius=self.bend_radius,
                               min_straight=self.minimum_straight,
                               rounding_algorithm=self.rounding_algorithm)
            R.end_straight += R.out_ports[0].x - T.east_ports[0].x
            elems += RouteConnectorRounded(R)
            #blocking trenches
            elems += Line(
                PPLayer(self.wg_definition.process, TECH.PURPOSE.DF.TRENCH),
                (self.block_trench_position,
                 0.5 * self.wg_definition.wg_width +
                 self.wg_definition.trench_width),
                (self.block_trench_position, 0.5 * self.y_spacing),
                self.block_trench_width)
            elems += Line(
                PPLayer(self.wg_definition.process, TECH.PURPOSE.DF.TRENCH),
                (self.block_trench_position,
                 -0.5 * self.wg_definition.wg_width -
                 self.wg_definition.trench_width),
                (self.block_trench_position, -0.5 * self.y_spacing),
                self.block_trench_width)

        for i in range(len(self.struct.east_ports)):
            op = self.struct_east_ports[i]
            # position tapers
            t_pos = (op.position[0] + self.connect_length, self.__y_east__[i])
            T = WgElTaperLinear(start_position=t_pos,
                                end_position=(t_pos[0] + self.taper_length,
                                              t_pos[1]),
                                start_wg_def=op.wg_definition,
                                end_wg_def=self.wg_definition)
            elems += T
            # draw straight waveguides
            elems += self.wg_definition(
                shape=[T.east_ports[0].position, (self.width, t_pos[1])])

            # generic connector between structure port and taper port
            R = RouteToEastAtY(input_port=ip,
                               y_position=T.west_ports[0].y,
                               bend_radius=self.bend_radius,
                               min_straight=self.minimum_straight,
                               rounding_algorithm=self.rounding_algorithm)
            R.end_straight += -R.out_ports[0].x + T.west_ports[0].x
            elems += RouteConnectorRounded(R)

        return elems
Пример #7
0
 def define_elements(self, elems):
     from ipkiss.plugins.photonics.routing.connect import RouteConnectorRounded
     elems += RouteConnectorRounded(route=self.get_route())
     return elems