예제 #1
0
    def make_align_markers(self, t, w, position, layers, joy_markers=False, camps_markers=False):
        if not (type(layers) == list):
            layers = [layers]
        top_mk_cell = Cell('AlignmentMark')
        for l in layers:
            if not joy_markers:
                am0 = Rectangle((-w / 2., -w / 2.), (w / 2., w / 2.), layer=l)
                rect_mk_cell = Cell("RectMarker")
                rect_mk_cell.add(am0)
                top_mk_cell.add(rect_mk_cell)
            elif joy_markers:
                crosspts = [(0, 0), (w / 2., 0), (w / 2., t), (t, t), (t, w / 2), (0, w / 2), (0, 0)]
                crosspts.extend(tuple(map(tuple, (-np.array(crosspts)).tolist())))
                am0 = Boundary(crosspts, layer=l)  # Create gdsCAD shape
                joy_mk_cell = Cell("JOYMarker")
                joy_mk_cell.add(am0)
                top_mk_cell.add(joy_mk_cell)

            if camps_markers:
                emw = 20.  # 20 um e-beam marker width
                camps_mk = Rectangle((-emw / 2., -emw / 2.), (emw / 2., emw / 2.), layer=l)
                camps_mk_cell = Cell("CAMPSMarker")
                camps_mk_cell.add(camps_mk)
                top_mk_cell.add(camps_mk_cell, origin=[100., 100.])
                top_mk_cell.add(camps_mk_cell, origin=[100., -100.])
                top_mk_cell.add(camps_mk_cell, origin=[-100., 100.])
                top_mk_cell.add(camps_mk_cell, origin=[-100., -100.])

            self.align_markers = Cell("AlignMarkers")
            self.align_markers.add(top_mk_cell, origin=np.array(position) * np.array([1, -1]))
            self.align_markers.add(top_mk_cell, origin=np.array(position) * np.array([-1, -1]))
            self.align_markers.add(top_mk_cell, origin=np.array(position) * np.array([1, 1]))
            self.align_markers.add(top_mk_cell, origin=np.array(position) * np.array([-1, 1]))
            self.add(self.align_markers)
예제 #2
0
    def make_align_markers(self, t, w, position, layers, cross=False):
        if not (type(layers) == list):
            layers = [layers]
        self.align_markers = Cell("AlignMarkers")
        for l in layers:
            if not cross:
                am0 = Rectangle((-w / 2., -w / 2.), (w / 2., w / 2.), layer=l)
            elif cross:
                crosspts = [(0, 0), (w / 2., 0), (w / 2., t), (t, t), (t, w / 2), (0, w / 2), (0, 0)]
                crosspts.extend(tuple(map(tuple, (-np.array(crosspts)).tolist())))

                #                crosspts = [(-t / 2., t / 2.), (-t / 2., h / 2.), (t / 2., h / 2.),
                #                            (t / 2., t / 2.), (w / 2., t / 2.), (w / 2., -t / 2.),
                #                            (t / 2., -t / 2.), (t / 2., -h / 2.),
                #                            (-t / 2., -h / 2.), (-t / 2., -t / 2.),
                #                            (-w / 2., -t / 2.), (-w / 2., t / 2.)]
                am0 = Boundary(crosspts, layer=l)  # Create gdsCAD shape
                # am1 = Polygon(crosspts) #Create shapely polygon for later calculation

            am1 = am0.copy().translate(tuple(np.array(position) * [1, 1]))  # 850,850
            am2 = am0.copy().translate(tuple(np.array(position) * [-1, 1]))  # 850,850
            am3 = am0.copy().translate(tuple(np.array(position) * [1, -1]))  # 850,850
            am4 = am0.copy().translate(tuple(np.array(position) * [-1, -1]))  # 850,850
            #            am4 = am0.copy().scale((-1, -1))  #Reflect in both x and y-axis
            self.align_markers.add([am1, am2, am3, am4])
            self.add(self.align_markers)
    def make_align_markers(self,
                           t,
                           w,
                           position,
                           layers,
                           cross=False,
                           auto_marks=False):
        if not (type(layers) == list):
            layers = [layers]
        self.align_markers = Cell("AlignMarkers")
        self.align_marker = Cell("AlignMarker")
        for l in layers:
            if not cross:
                am0 = Rectangle((-w / 2., -w / 2.), (w / 2., w / 2.), layer=l)
                self.align_marker.add(am0)
            elif cross:
                crosspts = [(0, 0), (w / 2., 0), (w / 2., t), (t, t),
                            (t, w / 2), (0, w / 2), (0, 0)]
                crosspts.extend(
                    tuple(map(tuple, (-np.array(crosspts)).tolist())))

                #                crosspts = [(-t / 2., t / 2.), (-t / 2., h / 2.), (t / 2., h / 2.),
                #                            (t / 2., t / 2.), (w / 2., t / 2.), (w / 2., -t / 2.),
                #                            (t / 2., -t / 2.), (t / 2., -h / 2.),
                #                            (-t / 2., -h / 2.), (-t / 2., -t / 2.),
                #                            (-w / 2., -t / 2.), (-w / 2., t / 2.)]
                am0 = Boundary(crosspts, layer=l)  # Create gdsCAD shape
                self.align_marker.add(am0)
                # am1 = Polygon(crosspts) #Create shapely polygon for later calculation

            if auto_marks:  # automatic alignment marks for the e-beam tool
                auto_mark_rect = Rectangle((-10., -10.), (10., 10.), layer=l)
                auto_mark = Cell("AutoMark")
                auto_mark.add(auto_mark_rect)
                self.align_marker.add(auto_mark, origin=(100, 100))
                self.align_marker.add(auto_mark, origin=(-100, 100))
                self.align_marker.add(auto_mark, origin=(100, -100))
                self.align_marker.add(auto_mark, origin=(-100, -100))

            self.align_markers.add(self.align_marker,
                                   origin=tuple(np.array(position) * [1, 1]))
            self.align_markers.add(self.align_marker,
                                   origin=tuple(np.array(position) * [-1, 1]))
            self.align_markers.add(self.align_marker,
                                   origin=tuple(np.array(position) * [1, -1]))
            self.align_markers.add(self.align_marker,
                                   origin=tuple(np.array(position) * [-1, -1]))
            self.add(self.align_markers)
    def make_align_markers(self,
                           t,
                           w,
                           position,
                           layers,
                           cross=False,
                           auto_align_marks=True):
        if not (type(layers) == list):
            layers = [layers]
        self.align_markers = Cell("AlignMarks_Four")
        align_mark = Cell("AlignMarks_Corner")
        for l in layers:
            if not cross:
                am0 = Rectangle((-w / 2., -w / 2.), (w / 2., w / 2.), layer=l)
            elif cross:
                crosspts = [(0, 0), (w / 2., 0), (w / 2., t), (t, t),
                            (t, w / 2), (0, w / 2), (0, 0)]
                crosspts.extend(
                    tuple(map(tuple, (-np.array(crosspts)).tolist())))
                am0 = Boundary(crosspts, layer=l)  # Create gdsCAD shape
                align_cross = Cell('AlignCross')
                align_cross.add(am0)
                align_mark.add(align_cross)

            if auto_align_marks:
                aa_mark = Rectangle((-10, -10), (10, 10), layer=l)
                auto_mark = Cell('AutoAlignMark')
                auto_mark.add(aa_mark)
                four_marks = Cell('FourAAMarks')
                pos = [100., 100.]
                four_marks.add(auto_mark, origin=tuple(np.array(pos) * [1, 1]))
                four_marks.add(auto_mark,
                               origin=tuple(np.array(pos) * [-1, 1]))
                four_marks.add(auto_mark,
                               origin=tuple(np.array(pos) * [1, -1]))
                four_marks.add(auto_mark,
                               origin=tuple(np.array(pos) * [-1, -1]))
                align_mark.add(four_marks)

            self.align_markers.add(align_mark,
                                   origin=tuple(np.array(position) * [1, 1]))
            self.align_markers.add(align_mark,
                                   origin=tuple(np.array(position) * [-1, 1]))
            self.align_markers.add(align_mark,
                                   origin=tuple(np.array(position) * [1, -1]))
            self.align_markers.add(align_mark,
                                   origin=tuple(np.array(position) * [-1, -1]))
            self.add(self.align_markers)
    def make_tapered_cross(self, nw1, nw2, tw1, tw2, l1, l2, tl1, tl2, layer):
        cross_cell = Cell(
            'TaperedCross_NW{:.0f}_TW{:.0f}_L{:.0f}_TL{:.0f}xNW{:.0f}_TW{:.0f}_L{:.0f}_TL{:.0f}'
            .format(nw1 * 1000, tw1 * 1000, l1, tl1, nw2 * 1000, tw2 * 1000,
                    l2, tl2))
        l1 += tw2
        l2 += tw1
        tl1 += tw2
        tl2 += tl1

        cross_pts = [(tw2 / 2., tw1 / 2.), (tl1, nw1 / 2.),
                     (l1 / 2., nw1 / 2.), (l1 / 2., -nw1 / 2.),
                     (tl1, -nw1 / 2.), (tw2 / 2., -tw1 / 2.),
                     (nw2 / 2., -tl2 / 2.), (nw2 / 2., -l2 / 2.),
                     (-nw2 / 2., -l2 / 2.), (-nw2 / 2., -tl2 / 2.),
                     (-tw2 / 2., -tw1 / 2.)]
        cross_pts.extend(tuple(map(tuple, (-np.array(cross_pts)).tolist())))
        membrane = Boundary(cross_pts, layer=layer)  # Create gdsCAD shape
        cross_cell.add(membrane)
        return cross_cell
예제 #6
0
 def makeAlignMarkers(self, t, w, position, layers, cross=False):
     if not (type(layers) == list): layers = [layers]
     self.aMarkers = Cell("AlignMarkers")
     for l in layers:
         if not (cross):
             am1 = Rectangle((-w / 2., -w / 2.), (w / 2., w / 2.), layer=l)
         elif cross:
             h = w
             crosspts = [(-t / 2., t / 2.), (-t / 2., h / 2.), (t / 2., h / 2.),
                         (t / 2., t / 2.), (w / 2., t / 2.), (w / 2., -t / 2.),
                         (t / 2., -t / 2.), (t / 2., -h / 2.),
                         (-t / 2., -h / 2.), (-t / 2., -t / 2.),
                         (-w / 2., -t / 2.), (-w / 2., t / 2.)]
             am1 = Boundary(crosspts, layer=l)  # Create gdsCAD shape
             # am1 = Polygon(crosspts) #Create shapely polygon for later calculation
         am1 = am1.translate(tuple(position))  # 850,850
         am2 = am1.copy().scale((-1, 1))  # Reflect in x-axis
         am3 = am1.copy().scale((1, -1))  # Reflect in y-axis
         am4 = am1.copy().scale((-1, -1))  # Reflect in both x and y-axis
         self.aMarkers.add([am1, am2, am3, am4])
         self.add(self.aMarkers)