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)
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
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)