Ejemplo n.º 1
0
    def define_windows(self):
        windows = []
        windows.append(
            PathWindow(layer=PPLayer(TECH.PROCESS.FC, TECH.PURPOSE.LF.LINE),
                       start_offset=-0.5 * self.wg_width,
                       end_offset=+0.5 * self.wg_width))
        windows.append(
            PathWindow(layer=PPLayer(TECH.PROCESS.WG, TECH.PURPOSE.LF.LINE),
                       start_offset=-0.5 * self.wg_width,
                       end_offset=+0.5 * self.wg_width))
        if self.polarity == "left":
            sign = -1
        else:
            sign = +1.0

        if (self.trench_width > 0.0):
            windows.append(
                PathWindow(layer=PPLayer(TECH.PROCESS.FC,
                                         TECH.PURPOSE.LF_AREA),
                           start_offset=sign * (-0.5 * self.wg_width),
                           end_offset=sign *
                           (0.5 * self.wg_width + self.trench_width))),
            windows.append(
                PathWindow(layer=PPLayer(TECH.PROCESS.WG,
                                         TECH.PURPOSE.LF_AREA),
                           start_offset=-sign * (-0.5 * self.wg_width),
                           end_offset=-sign *
                           (0.5 * self.wg_width + self.trench_width)))
        return windows
Ejemplo n.º 2
0
 def define_windows(self):
     return [
         PathWindow(layer=PPLayer(self.doping_process,
                                  TECH.PURPOSE.DF.TRENCH),
                    start_offset=-0.5 * self.doping_width,
                    end_offset=0.5 * self.doping_width)
     ]
Ejemplo n.º 3
0
    def define_windows(self):
        windows = super(WGFCWgElDefinition, self).define_windows()

        windows += [
            PathWindow(layer=PPLayer(self.shallow_process,
                                     TECH.PURPOSE.LF_AREA),
                       start_offset=-0.5 * self.shallow_wg_width -
                       self.shallow_trench_width,
                       end_offset=+0.5 * self.shallow_wg_width +
                       self.shallow_trench_width),
            PathWindow(layer=PPLayer(self.shallow_process,
                                     TECH.PURPOSE.LF.LINE),
                       start_offset=-0.5 * self.shallow_wg_width,
                       end_offset=+0.5 * self.shallow_wg_width)
        ]
        return windows
Ejemplo n.º 4
0
 def define_windows(self) :
     windows = super(ThinWgElDefinition, self).define_windows()
     
     windows += [PathWindow(layer = PPLayer(self.thin_process, TECH.PURPOSE.LF_AREA),
                        start_offset = -0.5 * self.thin_width,
                        end_offset = +0.5 * self.thin_width)]
     return windows
Ejemplo n.º 5
0
 def define_windows(self):
     windows = []
     windows.append(
         PathWindow(layer=PPLayer(self.process, TECH.PURPOSE.LF.LINE),
                    start_offset=-0.5 * self.wg_width,
                    end_offset=-0.5 * self.slot_width))
     windows.append(
         PathWindow(layer=PPLayer(self.process, TECH.PURPOSE.LF.LINE),
                    start_offset=+0.5 * self.slot_width,
                    end_offset=+0.5 * self.wg_width))
     if (self.trench_width > 0.0):
         windows.append(
             PathWindow(layer=PPLayer(self.process, TECH.PURPOSE.LF_AREA),
                        start_offset=-0.5 * self.wg_width -
                        self.trench_width,
                        end_offset=+0.5 * self.wg_width + self.trench_width,
                        shape_property_name="trench_shape"))
     return windows
Ejemplo n.º 6
0
    def define_windows(self):
        windows = super(JunctionWaveguideDefinition, self).define_windows()

        sign = -1.0 if self.flipped else +1.0

        windows += [
            PathWindow(layer=PPLayer(self.p_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=-sign * 0.5 * self.junction_overlap +
                       sign * self.junction_offset,
                       end_offset=sign * self.p_width),
            PathWindow(layer=PPLayer(self.n_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=sign * 0.5 * self.junction_overlap -
                       sign * self.junction_offset,
                       end_offset=-sign * self.n_width),
            PathWindow(layer=PPLayer(self.pp_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=sign * self.pp_offset,
                       end_offset=sign * (self.pp_offset + self.pp_width)),
            PathWindow(layer=PPLayer(self.nn_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=-sign * self.nn_offset,
                       end_offset=-sign * (self.nn_offset + self.nn_width)),
            PathWindow(layer=PPLayer(self.sal_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=sign * self.salp_offset,
                       end_offset=sign * (self.salp_offset + self.salp_width)),
            PathWindow(layer=PPLayer(self.sal_process, TECH.PURPOSE.DF.TRENCH),
                       start_offset=-sign * self.saln_offset,
                       end_offset=-sign *
                       (self.saln_offset + self.saln_width)),
        ]
        return windows
Ejemplo n.º 7
0
    def define_elements(self, elems):
        from picazzo.io.fibcoup import IoFibcoup
        from picazzo.io.column import IoColumn
        layout = IoColumn(name="EXAMPLE_WINDOW_WAVEGUIDE",
                          y_spacing=35.0,
                          south_west=(0.0, 0.0),
                          south_east=(3500.0, 0.0),
                          adapter=IoFibcoup)

        # define a shape
        my_path_shape = Shape([(0.0, 0.0), (50.0, 0.0), (100.0, 30.0),
                               (150.0, 5.0)])

        # Example 1:
        # Make a standard wire waveguide by using the well-know regular class 'WgElDefinition'
        wire_wg_def = WgElDefinition(wg_width=0.6, trench_width=0.9)
        wire_wg = wire_wg_def(shape=my_path_shape)
        layout += Structure(name="wire",
                            elements=[wire_wg],
                            ports=wire_wg.ports)
        layout.add_blocktitle("REGULAR_WIRE", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 2:
        # Make wire waveguide by directly using the raw base class 'WindowWaveguideDefinition'
        from ipkiss.plugins.photonics.wg.window import WindowWaveguideDefinition, PathWindow
        raw_wg_def = WindowWaveguideDefinition(
            wg_width=0.45,  #no function except for ports
            trench_width=2.0,  #no function except for ports
            process=TECH.PROCESS.WG,  #no function except for ports
            windows=[
                PathWindow(layer=PPLayer(TECH.PROCESS.WG,
                                         TECH.PURPOSE.LF.LINE),
                           start_offset=-0.225,
                           end_offset=0.225),  # waveguide
                PathWindow(layer=PPLayer(TECH.PROCESS.WG,
                                         TECH.PURPOSE.LF_AREA),
                           start_offset=-0.225 - 2.0,
                           end_offset=0.225 + 2.0)
                # add additional layers if needed
            ])
        raw_wg = raw_wg_def(shape=my_path_shape)
        layout += Structure(name="raw", elements=[raw_wg], ports=raw_wg.ports)
        layout.add_blocktitle("RAW", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 3:
        # implanted waveguide: doping window on top of other waveguide definition
        doped_wg_def = DopedWaveguideDefinition(wg_definition=wire_wg_def,
                                                doping_width=1.5,
                                                doping_process=TECH.PROCESS.P1)

        doped_wg = doped_wg_def(shape=my_path_shape)
        layout += Structure(name="doped",
                            elements=[doped_wg],
                            ports=doped_wg.ports)
        layout.add_blocktitle("DOP", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 4:
        # Add new windows to another waveguide definition
        from ipkiss.plugins.photonics.wg.window import WindowsOnWaveguideDefinition
        win_wg_def = WindowsOnWaveguideDefinition(
            wg_definition=wire_wg_def,
            windows=[
                PathWindow(layer=PPLayer(TECH.PROCESS.FC,
                                         TECH.PURPOSE.DF.TRENCH),
                           start_offset=0.0,
                           end_offset=1.0)
            ]  # etch an FC window in one side of the waveguide
        )
        win_wg = win_wg_def(shape=my_path_shape)
        layout += Structure(name="window",
                            elements=[win_wg],
                            ports=win_wg.ports)

        layout.add_blocktitle("WIN", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 5:
        # Modulator : use of JunctionWaveguideDefinition
        mod_wg_def = JunctionWaveguideDefinition()
        mod_wg = mod_wg_def(shape=my_path_shape)
        layout += Structure(name="modulator",
                            elements=[mod_wg],
                            ports=mod_wg.ports)
        layout.add_blocktitle("MOD", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 6:
        # Use new waveguide in a rounded connector
        from ipkiss.plugins.photonics.wg.connect import WaveguidePointRoundedConnectElementDefinition
        rounded_wg_def = WaveguidePointRoundedConnectElementDefinition(
            wg_definition=mod_wg_def,  # previous definition, with the junction
            bend_radius=
            20.0,  # needs to be sufficiently large with the broad windows
        )
        rounded_wg = rounded_wg_def(shape=my_path_shape)
        layout += Structure(name="rounded",
                            elements=[rounded_wg],
                            ports=rounded_wg.ports)
        layout.add_blocktitle("ROUND", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 7:
        # Use new waveguide in a spiral
        from picazzo.wg.spiral import WaveguideDoubleSpiralWithIncoupling
        from picazzo.container.taper_ports import TaperShallowPorts
        spiral = WaveguideDoubleSpiralWithIncoupling(
            wg_definition=rounded_wg_def,
            spacing=12.0,
            n_o_loops=2,
            inner_size=(100.0, 100.0))
        layout += TaperShallowPorts(structure=spiral)
        layout.add_blocktitle("SPIRAL", center_clearout=(500.0, 0.0))

        elems += SRef(reference=layout)
        return elems
Ejemplo n.º 8
0
    def define_elements(self, elems):
        layout = IoColumnGroup(y_spacing=25.0, south_east=(6000.0, 0.0))

        # define a shape
        my_path_shape = Shape([(0.0, 0.0), (50.0, 0.0), (100.0, 30.0),
                               (150.0, 5.0)])

        # Example 2:
        # Make a standard wire waveguide by using the well-know regular class 'WgElDefinition'
        wire_wg_def = WgElDefinition(wg_width=0.6, trench_width=0.9)
        layout += Structure(name="wire",
                            elements=[wire_wg_def(shape=my_path_shape)])
        layout.add_blocktitle("REGULAR_WIRE", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 2:
        # Make wire waveguide by directly using the raw base class 'WindowWaveguideDefinition'
        from ipkiss.plugins.photonics.wg.window import WindowWaveguideDefinition, PathWindow
        raw_wg_def = WindowWaveguideDefinition(
            wg_width=0.45,  #no function except for ports
            trench_width=2.0,  #no function except for ports
            process=TECH.PROCESS.WG,  #no function except for ports
            windows=[
                PathWindow(layer=PPLayer(TECH.PROCESS.WG,
                                         TECH.PURPOSE.LF.LINE),
                           start_offset=-0.225,
                           end_offset=0.225),  # waveguide
                PathWindow(layer=PPLayer(TECH.PROCESS.WG,
                                         TECH.PURPOSE.LF_AREA),
                           start_offset=-0.225 - 2.0,
                           end_offset=0.225 + 2.0)
                # add additional layers if needed
            ])
        layout += Structure(name="raw",
                            elements=[raw_wg_def(shape=my_path_shape)])
        layout.add_blocktitle("RAW", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 3:
        # Use Advanced Passive waveguide which subclasses from the raw base class
        # Note that no taper classes have been provided yet
        ts_wg_def = RaisedWgElDefinition(wg_width=0.8,
                                         trench_width=3.0,
                                         top_process=TECH.PROCESS.FCW,
                                         top_width=0.4)

        layout.add_blocktitle("TWO STEP", center_clearout=(500.0, 0.0))
        layout += Structure(
            name="two_step",
            elements=[ts_wg_def(shape=Shape([(0.0, 0.0), (50.0, 0.0)]))])
        layout.add_emptyline(2)

        # Example 4:
        # implanted waveguide: doping window on top of other waveguide definition
        doped_wg_def = DopedWaveguideDefinition(wg_definition=wire_wg_def,
                                                doping_width=1.5,
                                                doping_process=TECH.PROCESS.P1)

        # taper to deep waveguides
        from picazzo.container.taper_ports import TaperShallowPorts
        layout += TaperShallowPorts(structure=Structure(
            name="doped", elements=[doped_wg_def(shape=my_path_shape)]))
        layout.add_blocktitle("DOP", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 5:
        # Add new windows to another waveguide definition
        from ipkiss.plugins.photonics.wg.window import WindowsOnWaveguideDefinition
        win_wg_def = WindowsOnWaveguideDefinition(
            wg_definition=wire_wg_def,
            windows=[
                PathWindow(layer=PPLayer(TECH.PROCESS.FC,
                                         TECH.PURPOSE.DF.TRENCH),
                           start_offset=0.0,
                           end_offset=1.0)
            ]  # etch an FC window in one side of the waveguide
        )

        layout += Structure(name="window",
                            elements=[win_wg_def(shape=my_path_shape)])

        layout.add_blocktitle("WIN", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 6:
        # Modulator : Shallow Waveguide with Junction which subclasses from the raw base class
        mod_wg_def = JunctionWaveguideDefinition()
        layout += TaperShallowPorts(structure=Structure(
            name="modulator", elements=[mod_wg_def(shape=my_path_shape)]))
        layout.add_blocktitle("MOD", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 7:
        # Use new waveguide in a rounded connector
        from ipkiss.plugins.photonics.wg.connect import WaveguidePointRoundedConnectElementDefinition
        rounded_wg_def = WaveguidePointRoundedConnectElementDefinition(
            wg_definition=mod_wg_def,  # previous definition, with the junction
            bend_radius=
            20.0,  # needs to be sufficiently large with the broad windows
        )
        layout.add_emptyline(2)

        # taper to deep waveguides
        from picazzo.container.taper_ports import TaperShallowPorts
        layout += TaperShallowPorts(structure=Structure(
            name="rounded", elements=[rounded_wg_def(shape=my_path_shape)]))
        layout.add_blocktitle("CON", center_clearout=(500.0, 0.0))
        layout.add_emptyline(2)

        # Example 8:
        # Use new waveguide in a spiral
        from picazzo.wg.spiral import WaveguideDoubleSpiralWithIncoupling
        from picazzo.container.taper_ports import TaperShallowPorts
        spiral = WaveguideDoubleSpiralWithIncoupling(
            wg_definition=rounded_wg_def,
            spacing=12.0,
            n_o_loops=2,
            inner_size=(100.0, 100.0))
        layout += TaperShallowPorts(structure=spiral)
        layout.add_blocktitle("SPIRAL", center_clearout=(500.0, 0.0))

        elems += layout
        return elems
Ejemplo n.º 9
0
 def define_windows(self):
     return [
         PathWindow(layer=TECH.PPLAYER.ACO.DEFAULT,
                    start_offset=-0.5 * self.wg_width,
                    end_offset=0.5 * self.wg_width)
     ]