def make_basel_align_marks(self, points, layers, mk_width=5):
     if not (type(layers) == list):
         layers = [layers]
     wafer_rad = self.wafer_r
     tri_height = np.sqrt(3.) / 2. * self.trisize
     # Shift the points from the old dicing lines to make the dashed dicing lines
     points1 = np.array(points) + (self.trisize / 2., 0.)
     points2 = np.array(points) + (self.trisize / 4., tri_height / 2.)
     new_pts = np.vstack((points1, points2))
     # Create a lineshape of the boundary of the circle
     c = self.waferShape.boundary
     # Create a set (unordered with unique entries)
     dicing_lines = set()
     # For each point in the lattice, create three lines (one along each direction)
     for x, y in new_pts:
         l0 = LineString([(-4. * wafer_rad, y), (4. * wafer_rad, y)])
         l1 = rotateshape(l0, 60, origin=(x, y))
         l2 = rotateshape(l0, -60, origin=(x, y))
         # See where these lines intersect the wafer outline
         i0 = c.intersection(l0)
         i1 = c.intersection(l1)
         i2 = c.intersection(l2)
         if not i0.geoms == []:
             p0s = tuple(map(tuple, np.round((i0.geoms[0].coords[0], i0.geoms[
                 1].coords[0]))))
             dicing_lines.add(p0s)  # Add these points to a unique unordered set
         if not i1.geoms == []:
             p1s = tuple(map(tuple, np.round((i1.geoms[0].coords[0], i1.geoms[
                 1].coords[0]))))
             dicing_lines.add(p1s)
         if not i2.geoms == []:
             p2s = tuple(map(tuple, np.round((i2.geoms[0].coords[0], i2.geoms[
                 1].coords[0]))))
             dicing_lines.add(p2s)
예제 #2
0
 def add_dicing_marks(self, layers, mkWidth=100):
     """
     Create dicing marks
     """
     if not (type(layers) == list): layers = [layers]
     # Define the array and wafer parameters
     gap = self.block_gap
     wafer_r = self.wafer_r
     sl_tri = self.trisize
     sl_lattice = sl_tri + gap / np.tan(np.deg2rad(30))
     h_lattice = np.sqrt(3.) / 2. * sl_lattice
     # Create the lattice of the "up" facing triangles
     points = self.createPtLattice(2. * wafer_r, sl_lattice / 2., h_lattice)
     points = [np.array(elem) for elem in points]
     points = points + np.array(
         [-sl_lattice / 2., 0])  # Shift lattice so we can cleave the wafer at y=0
     points = points + np.array(self.blockOffset)  # Shift by point from MC search (if applicable)
     points = [
         point
         for point in points
         if (Point(point).distance(Point(0, 0)) < wafer_r)
         ]
     import pylab as plt
     # Plot points
     x, y = list(zip(*points))
     plt.plot(x, y, 'ko')
     # Create a lineshape of the boundary of the circle
     c = self.waferShape.boundary
     # Create a set (unordered with unique entries)
     dicinglines = set()
     # For each point in the lattice, create three lines (one along each direction)
     for x, y in points:
         l0 = LineString([(-4. * wafer_r, y), (4. * wafer_r, y)])
         l1 = rotateshape(l0, 60, origin=(x, y))
         l2 = rotateshape(l0, -60, origin=(x, y))
         # See where these lines intersect the wafer outline
         i0 = c.intersection(l0)
         i1 = c.intersection(l1)
         i2 = c.intersection(l2)
         p0s = tuple(map(tuple, np.round((i0.geoms[0].coords[0], i0.geoms[
             1].coords[0]))))
         p1s = tuple(map(tuple, np.round((i1.geoms[0].coords[0], i1.geoms[
             1].coords[0]))))
         p2s = tuple(map(tuple, np.round((i2.geoms[0].coords[0], i2.geoms[
             1].coords[0]))))
         # Add these points to a unique unordered set
         dicinglines.add(p0s)
         dicinglines.add(p1s)
         dicinglines.add(p2s)
     # At the end of the loop, the set will contain a list of point pairs which can be uesd to make the dicing marks
     dmarks = Cell('DIC_MRKS')
     for l in layers:
         for p1, p2 in dicinglines:
             dicingline = Path([p1, p2], width=mkWidth, layer=l)
             dmarks.add(dicingline)
         self.add(dmarks)
     return points
예제 #3
0
    def make_basel_align_marks(self, points, layers, mk_width=5):
        if not (type(layers) == list):
            layers = [layers]
        wafer_rad = self.wafer_r
        tri_height = np.sqrt(3.) / 2. * self.trisize
        # Shift the points from the old dicing lines to make the dashed dicing lines
        points1 = np.array(points) + (self.trisize / 2., 0.)
        points2 = np.array(points) + (self.trisize / 4., tri_height / 2.)
        new_pts = np.vstack((points1, points2))
        # Create a lineshape of the boundary of the circle
        c = self.waferShape.boundary
        # Create a set (unordered with unique entries)
        dicing_lines = set()
        # For each point in the lattice, create three lines (one along each direction)
        for x, y in new_pts:
            l0 = LineString([(-4. * wafer_rad, y), (4. * wafer_rad, y)])
            l1 = rotateshape(l0, 60, origin=(x, y))
            l2 = rotateshape(l0, -60, origin=(x, y))
            # See where these lines intersect the wafer outline
            i0 = c.intersection(l0)
            i1 = c.intersection(l1)
            i2 = c.intersection(l2)
            if not i0.geoms == []:
                p0s = tuple(map(tuple, np.round((i0.geoms[0].coords[0], i0.geoms[
                    1].coords[0]))))
                dicing_lines.add(p0s)  # Add these points to a unique unordered set
            if not i1.geoms == []:
                p1s = tuple(map(tuple, np.round((i1.geoms[0].coords[0], i1.geoms[
                    1].coords[0]))))
                dicing_lines.add(p1s)
            if not i2.geoms == []:
                p2s = tuple(map(tuple, np.round((i2.geoms[0].coords[0], i2.geoms[
                    1].coords[0]))))
                dicing_lines.add(p2s)

        hpoints1 = np.array(points) + (self.trisize / 8., tri_height / 4. + 300.)
        hpoints2 = np.array(points) + (-self.trisize / 8., -tri_height / 4. - 450.)
        hpoints = np.vstack((hpoints1, hpoints2))
        # Make horizontal lines to cleave each mini-triangle chip and make it fit in the 6x6mm chip holder in Basel
        for x, y in hpoints:
            l0 = LineString([(-4. * wafer_rad, y), (4. * wafer_rad, y)])
            # See where this line intersects the wafer outline
            i0 = c.intersection(l0)
            if not i0.geoms == []:
                p0s = tuple(map(tuple, np.round((i0.geoms[0].coords[0], i0.geoms[
                    1].coords[0]))))
                dicing_lines.add(p0s)  # Add these points to a unique unordered set

        # At the end of the loop, the set will contain a list of point pairs which can be used to make the dicing marks
        dmarks = Cell('DIC_MRKS')
        for l in layers:
            for p1, p2 in dicing_lines:
                # dicing_line = Path([p1, p2], width=mkWidth,layer=l)
                dicing_line = dashed_line(p1, p2, 500, mk_width, l)
                dmarks.add(dicing_line)
            self.add(dmarks)