diff --git a/Vendors/HKUST/Python/make_masks.py b/Vendors/HKUST/Python/make_masks.py index ceddee99f1b9a445f5e7168d9a3fbfd9134f346f..9ad62873484e429251c2c8d4cc6189b474943fc9 100755 --- a/Vendors/HKUST/Python/make_masks.py +++ b/Vendors/HKUST/Python/make_masks.py @@ -2,8 +2,10 @@ import gdspy import numpy -spacing=1000 +#spacing=1000 +spacing=500 frame_width=200 +square_middle=18750 darkfield_masks = [ ["nwell","pwell","pbase","nbase"], @@ -17,10 +19,10 @@ brightfield_masks = [ ] def get_offset(idx): - x0=30000 - y0=30000 - x1=x0+34000 - y1=y0+34000 + x0=20000 + y0=20500 + x1=95000 + y1=95500 if(idx==0): return [x0,y1] @@ -33,6 +35,25 @@ def get_offset(idx): else: return [0,0] +def get_layer_location(idx,w,h): + ret=get_offset(idx) + #18750 + ret[0]=ret[0]-w/2 + ret[1]=ret[1]-h/2 + if(idx==0): + ret[0]=ret[0]+square_middle + ret[1]=ret[1]-square_middle + elif(idx==1): + ret[0]=ret[0]-square_middle + ret[1]=ret[1]-square_middle + elif(idx==2): + ret[0]=ret[0]+square_middle + ret[1]=ret[1]+square_middle + elif(idx==3): + ret[0]=ret[0]-square_middle + ret[1]=ret[1]+square_middle + + return ret def get_frame(bb): ret=[] @@ -63,11 +84,21 @@ def get_frame(bb): def mirrored_polygons(cell): bb=cell.get_bounding_box() + + zeroing_offset=[0,0] + zeroing_offset[0]=bb[0][0] + zeroing_offset[1]=bb[0][1] + width=bb[1][0]-bb[0][0] + pgs=cell.get_polygons() + for pg in pgs: for tp in pg: + tp[0]=tp[0]-zeroing_offset[0] + tp[1]=tp[1]-zeroing_offset[1] tp[0]=width-tp[0] + return pgs def make_masks(frame,mask_type,mask_mappings): @@ -78,58 +109,67 @@ def make_masks(frame,mask_type,mask_mappings): gdsii=gdspy.GdsLibrary("top") gdsii.read_gds(frame, units='skip', rename={}, layers={}, datatypes={}, texttypes={}) - if(len(gdsii.top_level())==1): - for c in gdsii.top_level(): - topcell=c.flatten(single_layer=1) - toppgs=topcell.get_polygons() - #we have four tiles ready to be filled - for idx in range(4): - if(len(m)>idx): - cellname="mask_"+m[idx] - tp=get_offset(idx) - fs=2000 - tp[1]=97800 - if((idx==2)or(idx==3)): - tp[1]=16000 - text=gdspy.Text(cellname, fs, tp) - #text=text.fillet(radius=45, points_per_2pi=256, max_points=199, precision=0.001) - toppgs=gdspy.fast_boolean(toppgs,text,"xor") - topcell=gdspy.Cell(mask_type+str(i)) - topcell.add(toppgs) - - for idx in range(4): - if(len(m)>idx): - cellname="mask_"+m[idx] - print("Adding "+cellname) - ngdsii=gdspy.GdsLibrary(cellname) - ngdsii.read_gds("Layout/gds/"+cellname+".gds", units='skip', rename={}, layers={}, datatypes={}, texttypes={}) - for c in ngdsii.top_level(): - cell=c.flatten(single_layer=1) - try: - pgs = mirrored_polygons(cell) - except: - print("No polygons found") - - bb=cell.get_bounding_box() - bb=bb*5 - bb[0]=bb[0]+get_offset(idx) - bb[1]=bb[1]+get_offset(idx) - - for stripe in get_frame(bb): - topcell.add(stripe) - - for pg in pgs: - pg=5*pg - pg=pg+get_offset(idx) - if((idx>=0) and (idx<=3)): - topcell.add(gdspy.Polygon(pg)) - - topcell=topcell.flatten(single_layer=1) - outgdsii.add(topcell) - outgdsii.write_gds("Vendors/HKUST/Masks/"+mask_type+str(i)+".gds") - i=i+1 - else: - print("Error! Wrong about of top cells!") + topcell=gdspy.Cell("mask_"+mask_type+str(i)) + for c in gdsii.top_level(): + topcell.add(c.flatten(single_layer=1)) + topcell=topcell.flatten(single_layer=1) + + toppgs=topcell.get_polygons() + #we have four tiles ready to be filled + for idx in range(4): + if(len(m)>idx): + cellname="mask_"+m[idx] + tp=get_offset(idx) + fs=2000 + tp[1]=97800 + if((idx==2)or(idx==3)): + tp[1]=16000 + if((idx==1)or(idx==3)): + tp[0]=tp[0]-(75000/2) + + text=gdspy.Text(cellname, fs, tp) + toppgs=gdspy.fast_boolean(toppgs,text,"xor", precision=0.001, max_points=800, layer=0) + topcell=gdspy.Cell(mask_type+str(i)) + topcell.add(toppgs) + + for idx in range(4): + if(len(m)>idx): + cellname="mask_"+m[idx] + ngdsii=gdspy.GdsLibrary(cellname) + ngdsii.read_gds("Layout/gds/"+cellname+".gds", units='skip', rename={}, layers={}, datatypes={}, texttypes={}) + cell=gdspy.Cell(cellname) + for c in ngdsii.top_level(): + cell.add(c.flatten(single_layer=1)) + cell=cell.flatten(single_layer=1) + pgs = mirrored_polygons(cell) + + bb=cell.get_bounding_box() + zeroing_offset=[0,0] + zeroing_offset[0]=bb[0][0] + zeroing_offset[1]=bb[0][1] + bb[0]=bb[0]-zeroing_offset + bb[1]=bb[1]-zeroing_offset + bb=bb*5 + + w=bb[1][0]-bb[0][0] + h=bb[1][1]-bb[0][1] + offset=get_layer_location(idx,w,h) + + for pg in pgs: + pg=pg*5 + pg=pg+offset + topcell.add(gdspy.Polygon(pg)) + + bb[0]=bb[0]+offset + bb[1]=bb[1]+offset + + for stripe in get_frame(bb): + topcell.add(stripe) + + topcell=topcell.flatten(single_layer=1) + outgdsii.add(topcell) + outgdsii.write_gds("Vendors/HKUST/Masks/"+mask_type+str(i)+".gds") + i=i+1 make_masks("Vendors/HKUST/GDS/stepperMK_15mm_Dark.gds","darkfield",darkfield_masks)