topCell.add(smField3, origin=(-dx / 2., -dy / 2.)) topCell.add(smField4, origin=(dx / 2., -dy / 2.)) topCell.add(centerLeftAlignField, origin=(-dx / 2, 0.)) topCell.add(centerRightAlignField, origin=(dx / 2, 0.)) topCell.add(centerAlignField, origin=(0., 0.)) topCell.spacing = np.array([4000., 4000.]) # %%Create the layout and output GDS file layout = Layout('LIBRARY') if putOnWafer: # Fit as many patterns on a 2inch wafer as possible wafer = MBE100Wafer('MembranesWafer', cells=[topCell]) layout.add(wafer) # layout.show() else: # Only output a single copy of the pattern (not on a wafer) layout.add(topCell) layout.show() filestring = str(waferVer) + '_' + WAFER_ID + '_' + date.today().strftime( "%d%m%Y") + ' dMark' + str(tDicingMarks) filename = filestring.replace(' ', '_') + '.gds' layout.save(filename) cell_layout = Layout('LIBRARY') cell_layout.add(wafer.blocks[0]) cell_layout.save(filestring.replace(' ', '_') + '_block' + '.gds') # Output up chip for doing aligned jobs layout_field = Layout('LIBRARY') layout_field.add(topCell) layout_field.save(filestring.replace(' ', '_') + '_2mmField.gds')
topCell.add(smField, origin=(sm_orig_x, sm_orig_y)) topCell.add(mdField, origin=(md_coord_x, md_coord_y)) topCell.add(lgField, origin=(lg_orig_x, lg_orig_y)) topCell.add(lgField_label) # %%Create the layout and output GDS file wafer = MBE100Wafer('MembranesWafer', cells=[topCell]) fileID = "Char_" + PATTERN filestring = fileID + str( waferVer) + '_' + WAFER_ID + '_' + date.today().strftime("%d%m%Y") # Output the whole wafer layout = Layout('LIBRARY') layout.add(wafer) # layout.show() layout.save(filestring.replace(' ', '_') + '_wafer' + '.gds') # Output single chip cell_layout = Layout('LIBRARY') cell_layout.add(wafer.blocks[0]) # cell_layout.show() cell_layout.save(filestring.replace(' ', '_') + '_chip' + '.gds') # Output topCell layout_field = Layout('LIBRARY') layout_field.add(topCell) # layout_field.show() layout_field.save(filestring.replace(' ', '_') + '_smallFields.gds')
# Add everything together to a top cell topCell = Cell("TopCell") topCell.add(lgField) smFrameSpacing = 400 # Spacing between the three small frames dx = smFrameSpacing + smFrameSize dy = smFrameSpacing + smFrameSize topCell.add(smField1, origin=(-dx / 2., dy / 2.)) topCell.add(smField2, origin=(dx / 2., dy / 2.)) topCell.add(smField3, origin=(-dx / 2., -dy / 2.)) topCell.add(smField4, origin=(dx / 2., -dy / 2.)) topCell.add(centerAlignField, origin=(0., 0.)) topCell.spacing = np.array([12000., 12000.]) # %%Create the layout and output GDS file layout = Layout('LIBRARY') if putOnWafer: # Fit as many patterns on a 2inch wafer as possible wafer = MBE100Wafer('MembranesWafer', cells=[topCell]) layout.add(wafer) # layout.show() else: # Only output a single copy of the pattern (not on a wafer) layout.add(topCell) layout.show() filestring = str(waferVer) + '_' + WAFER_ID + '_' + date.today().strftime("%d%m%Y") + ' dMark' + str(tDicingMarks) filename = filestring.replace(' ', '_') + '.gds' layout.save(filename) cell_layout = Layout('LIBRARY') cell_layout.add(wafer.blocks[0]) cell_layout.save(filestring.replace(' ', '_') + '_block' + '.gds')
10.0, 1, nm_width, 1.0, 0, l_smBeam) QP_sm = Cell('QuantumPlayground_W{:.0f}'.format(nm_width * 1000)) QP_sm.add(cell_AB_Diamond_sm, origin=(-30, 30)) QP_sm.add(cell_AB_DiamondNoBuffer_sm, origin=(-10, 30)) QP_sm.add(cell_XShape, origin=(-30, 10)) QP_sm.add(cell_XShapeNoBuffer, origin=(-10, 10)) QP_sm.add(cell_HashTag, origin=(-30, -10)) QP_sm.add(cell_HashTagNoBuffer, origin=(-10, -10)) QP_sm.add(cell_Triangle_sm, origin=(-30, -30)) QP_sm.add(cell_TriangleNoBuffer_sm, origin=(-10, -30)) QP_sm.add(cell_AB_Hexagon_sm, origin=(10, 30)) QP_sm.add(cell_AB_HexagonNoBuffer_sm, origin=(30, 30)) QP_sm.add(cell_StarShape, origin=(10, 10)) QP_sm.add(cell_StarShapeNoBuffer, origin=(30, 10)) QP_sm.add(cell_Window, origin=(10, -10)) QP_sm.add(cell_WindowNoBuffer, origin=(30, -10)) TopCell.add(QP_sm, origin=(-qp_spacing + 2 * i * qp_spacing, -qp_spacing)) return TopCell if __name__ == "__main__": TopCell = make_qp() # Add the copied cell to a Layout and save layout = Layout('LIBRARY') layout.add(TopCell) layout.save('QuantumPlayground_v1.0.gds')
] xmax_cell = Cell('MerryChristmas') for i, xmas_text in enumerate(xmas_texts): xmas_text.translate( tuple( np.array(-xmas_text.bounding_box.mean(0)) + np.array([20, -80 - i * 10.]))) # Center justify label xmax_cell.add(xmas_text) TopCell = Cell('GrowthTheoryTopCell') TopCell.add(wheel1, origin=(-100., -60.)) TopCell.add(wheel2, origin=(-100., -65.)) TopCell.add(PitchDep, origin=(-200., -280.)) # TopCell.add3(TheorySlitElong, origin=(-250., -50)) TopCell.add(LenWidDep, origin=(-200., -50.)) # TopCell.add(hexagon_array, origin=(-100., -50)) # TopCell.add(circles_array, origin=(-75., -50.)) # TopCell.add(triangle_down_array, origin=(-50., -50)) # TopCell.add(triangle_up_array, origin=(-25., -50)) TopCell.add(xmax_cell, origin=(0, 50)) return TopCell if __name__ == "__main__": TopCell = make_theory_cell_3br() # Add the copied cell to a Layout and save layout = Layout('LIBRARY') layout.add(TopCell) layout.save('GrowthTheoryCell_3BD.gds')
arrayHeight = 20. arrayWidth = 20. arraySpacing = 10. spacing = 0.5 length = [arrayWidth] widths = [0.01, 0.015, 0.020, 0.030, 0.040, 0.050] #widths = [0.008, 0.016, 0.024, 0.032, 0.040, 0.048] pitches = [1.0, 2.0, 4.0] for j, width in enumerate(widths): for i, pitch in enumerate(pitches): PitchDep.add(makeSlitArray2(pitch, spacing, width, length, 0, arrayHeight, arrayWidth, arraySpacing, l_smBeam), origin=(i * 1.5 * arrayWidth, j * 1.5 * arrayHeight)) TopCell = Cell('GrowthTheoryTopCell') TopCell.add(PitchDep, origin=(0., 0.)) # # TODO: Add the branched growth shapes return TopCell if __name__ == "__main__": TopCell = make_theory_cell() # Add the copied cell to a Layout and save layout = Layout('LIBRARY') layout.add(TopCell) layout.save('NMDoseTest.gds')
# Create the layout and output GDS file layout = Layout('LIBRARY', precision=1e-10) wafer = MBEWafer('MembranesWafer', wafer_r=wafer_r, cells=[topCell], cell_gap=CELL_GAP, mkWidth=tDicingMarks, cellsAtEdges=False) file_string = str(waferVer) filename = file_string.replace(' ', '_') # Add pattern for ellipsometry check of SiO2 etching size = 2000 rect = Rectangle((size / 2., size / 2.), (-size / 2., -size / 2.), layer=10) rectCell = Cell('EtchCheckSquare') rectCell.add(rect) rect_layout = Layout('LIBRARY') rect_layout.add(rectCell) rect_layout.save(filename + '_etchCheck.gds') rect_layout.add(rectCell) layout.add(wafer) layout.save(filename + '.gds') # Output down chip for doing aligned jobs layout_down = Layout('LIBRARY') layout_down.add(wafer.block_down) layout_down.save(filename + '_downblock.gds') # Output up chip for doing aligned jobs layout_up = Layout('LIBRARY') layout_up.add(wafer.block_up) layout_up.save(filename + '_upblock.gds')
# topCell.add(smField2, origin=(dx / 2., dy / 2.)) # topCell.add(smField3, origin=(-dx / 2., -dy / 2.)) # topCell.add(smField4, origin=(dx / 2., -dy / 2.)) # topCell.add(centerLeftAlignField, origin=(-dx / 2, 0.)) # topCell.add(centerRightAlignField, origin=(dx / 2, 0.)) # topCell.add(centerAlignField, origin=(0., 0.)) # topCell.spacing = np.array([4000., 4000.]) # %%Create the layout and output GDS file layout = Layout('LIBRARY') if putOnWafer: # Fit as many patterns on a 2inch wafer as possible wafer = MBE100Wafer('MembranesWafer', cells=[topCell]) layout.add(wafer) # layout.show() else: # Only output a single copy of the pattern (not on a wafer) layout.add(topCell) layout.show() filestring = str(waferVer) + '_' + WAFER_ID + '_' + date.today().strftime("%d%m%Y") + ' dMark' + str(tDicingMarks) filename = filestring.replace(' ', '_') + '.gds' layout.save(filename) # cell_layout = Layout('LIBRARY') # cell_layout.add(wafer.blocks[0]) # cell_layout.save(filestring.replace(' ', '_') + '_block' + '.gds') # # Output up chip for doing aligned jobs # layout_field = Layout('LIBRARY') # layout_field.add(topCell) # layout_field.save(filestring.replace(' ', '_') + '_2mmField.gds')
# %%Create the layout and output GDS file layout = Layout('LIBRARY') if putOnWafer: # Fit as many patterns on a wafer as possible wafer = MBEWafer('MembranesWafer', wafer_r=wafer_r, cells=[topCell], cell_gap=CELL_GAP, mkWidth=tDicingMarks, cellsAtEdges=False) layout.add(wafer) # Try to poorly calculate the write time freq = 20E6 # 20 GHz spotsize = 100E-9 # 100nm beam gridsize = np.sqrt(2) / 2. * spotsize spotarea = gridsize ** 2. waferarea = wafer.area() / 1E6 ** 2. writetime = waferarea / spotarea / freq time = timedelta(seconds=writetime) print(('\nEstimated write time: \n' + str(time))) # layout.show() else: # Only output a single copy of the pattern (not on a wafer) layout.add(topCell) layout.show() file_string = str(waferVer) + '_' + str(density) + ' dMark' + str(tDicingMarks) filename = file_string.replace(' ', '_') + '.gds' layout.save(filename) # Output up chip for doing aligned jobs layout_up = Layout('LIBRARY') layout_up.add(lgField) layout_up.save(filename + '_2mmfield.gds')
arrayHeight = 20. arrayWidth = 20. arraySpacing = 10. spacing = 0.5 length = [arrayWidth] widths = [0.020, 0.040, 0.080, 0.140, 0.220, 0.320] #widths = [0.008, 0.016, 0.024, 0.032, 0.040, 0.048] pitches = [1.0, 2.0, 4.0] for j, width in enumerate(widths): for i, pitch in enumerate(pitches): PitchDep.add(makeSlitArray2(pitch, spacing, width, length, 0, arrayHeight, arrayWidth, arraySpacing, l_smBeam), origin=(i * 1.5 * arrayWidth, j * 1.5 * arrayHeight)) TopCell = Cell('GrowthTheoryTopCell') TopCell.add(PitchDep, origin=(0., 0.)) # # TODO: Add the branched growth shapes return TopCell if __name__ == "__main__": TopCell = make_theory_cell() # Add the copied cell to a Layout and save layout = Layout('LIBRARY') layout.add(TopCell) layout.save('NMDoseTest_v2.gds')
# Create the layout and output GDS file layout = Layout('LIBRARY', precision=1e-10) wafer = MBEWafer('MembranesWafer', wafer_r=wafer_r, cells=[topCell], cell_gap=CELL_GAP, mkWidth=tDicingMarks, cellsAtEdges=False) filestring = str(waferVer) + '_' + WAFER_ID + '_' + date.today().strftime( "%d%m%Y") + ' dMark' + str(tDicingMarks) filename = filestring.replace(' ', '_') layout.add(wafer) layout.save(filename + '.gds') # Output down chip for doing aligned jobs layout_down = Layout('LIBRARY') layout_down.add(wafer.block_down) layout_down.save(filename + '_downblock.gds') # Output up chip for doing aligned jobs layout_up = Layout('LIBRARY') layout_up.add(wafer.block_up) layout_up.save(filename + '_upblock.gds') # Output up chip for doing aligned jobs layout_up = Layout('LIBRARY') layout_up.add(lgField) layout_up.save(filename + '_2mmfield.gds')
PitchDep = Cell('PitchDependence') arrayHeight = 5. arrayWidth = arrayHeight * 2. arraySpacing = 10. spacing = 0.5 length = [arrayWidth] widths = [0.050, 0.100, 0.150, 0.200, 0.250] wire_spacings = [0.100, 0.200, 0.400] for j, width in enumerate(widths): for i, wire_spacing in enumerate(wire_spacings): PitchDep.add(makeSlitArray2(wire_spacing + width, spacing, width, length, 0, arrayHeight, arrayWidth, arraySpacing, l_smBeam), origin=(i * 30, j * 20)) TopCell = Cell('GrowthTheoryTopCell') TopCell.add(PitchDep, origin=(0., 0.)) # # TODO: Add the branched growth shapes return TopCell if __name__ == "__main__": TopCell = make_theory_cell() # Add the copied cell to a Layout and save layout = Layout('LIBRARY') layout.add(TopCell) layout.save('ContactsDoseTest.gds')