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