-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathexample02_alignment_and_imageslib.py
133 lines (94 loc) · 4.4 KB
/
example02_alignment_and_imageslib.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding: utf-8 -*-
"""
ASML_JobCreator - Example 02
Alignment and advanced options.
Multi-layer job, multiple images per layer, with marks exposure and subsequent alignment to those marks.
Also shows usage of predefined Images from files in ASML_JobCreator/Images/ directory.
@author: Demis D. John
Univ. of California Santa Barbara
UCSB Nanofabrication Facility: http://www.nanotech.ucsb.edu
2020-05-14
All units are in millimeters.
Coordinates and sizes are specified as two-valued iterables like [X,Y]
All sizes and shifts are specified at 1x wafer-scale (NOT 4x/5x reticle-scale)
For help: after running once, use commands like:
help( asml )
help( MyJob )
dir( MyJob.Cell )
help( MyJob.Cell.set_CellSize )
"""
####################################################
# Module setup etc.
import matplotlib.pyplot as plt
import ASML_JobCreator as asml
####################################################
print('Running...')
MyJob = asml.Job()
MyJob.set_comment("Demo Alignment Job", "", "Exported from Python ASML_JobCreator")
## Cell Structure:
MyJob.Cell.set_CellSize( [5.00, 5.00] ) # cell size [X,Y] in millimeters
MyJob.unset_ExposeEdgeDie() # set/unset (on/off) Expose die that fall only partially on the wafer
MyJob.Cell.set_RoundEdgeClearance( 0 ) # Width of disallowed border of wafer
MyJob.Cell.set_FlatEdgeClearance( 0 ) # Width of disallowed border at wafer flat
## Image Definition:
# MyJob.Image( <ImageID>, <ReticleID_Barcode>, sizeXY=coords, shiftXY=coords)
## To expose on Layer 1:
# Resolution test structures:
Res = MyJob.Image("UCSB_Res", "UCSB-OPC1", sizeXY=[3, 3], shiftXY=[4,5])
## To expose on Layer 2:
# We'll use a pre-defined image from file, in the sub-folder ASML_JobCreator/Images/SPM_X.py
# `dir( asml.Images )` will show you a list, or look inside the sub-folder.
# You can place your own Image Library files into the Images subfolder.
# We'll place X-scribe-line alignment marks, used as dicing alignment guides
DicingLine_X = MyJob.Image( asml.Images.SPM_X )
# In order to use alignment mark images for other purposes, must give a custom Image ID, otherwise it thinks it's an SPM-X alignment mark:
DicingLine_X.set_ImageID( "DiceX" )
## Image Distribution
# cellCR is integer pair of Col/Row specificiation
# shiftXY is floating-point X/Y shift
## To expose on Layer 1:
# Distribute Image "Res" across whole wafer
for cells in MyJob.Cell.get_ValidCells():
Res.distribute( cells )
#end for(cells)
## To expose on Layer 2:
# Distribute DicingX in rows across wafer, on top and bottom of cells:
for r in [-2,+1]:
for c in range(-8,+9):
DicingLine_X.distribute( [c,r], shiftXY=[0,+2.5] ) # top of cell
DicingLine_X.distribute( [c,r], shiftXY=[0,+2.5] ) # bottom of cell
#end for(c)
#end for(r)
## Alignment Mark Definition
E = MyJob.Alignment.Mark("E", "PM", waferXY=[42.5, 0.0])
EN = MyJob.Alignment.Mark("EN", "PM", waferXY=[42.5, 2.5])
ES = MyJob.Alignment.Mark("ES", "PM", waferXY=[42.5, -2.5])
W = MyJob.Alignment.Mark("W", "PM", waferXY=[-42.5, 0.0])
WN = MyJob.Alignment.Mark("WN", "PM", waferXY=[-42.5, 2.5])
WS = MyJob.Alignment.Mark("WS", "PM", waferXY=[-42.5, -2.5])
ALL = MyJob.Alignment.Strategy("ALL", marks=[E, EN, ES, W, WN, WS])
ALL.set_required_marks(2) # num marks that must pass, defaults to all
## Layer Definition & Reticle Data -
# Add Zero layer, with alignment mark exposure
ZeroLyr = MyJob.Layer() # Empty blank Layer
ZeroLyr.set_ZeroLayer() # Sets as special system-layer for alignment marks
ZeroLyr.expose_Marks( marks=[E, EN, ES, W, WN, WS], Energy=21, Focus=-0.10 ) # set Marks Exposure.
# Layer 1 - combine with Zero layer alignment mark exposure
Lyr1 = MyJob.Layer( LayerID="Lyr1" )
Lyr1.set_CombineWithZeroLayer()
Lyr1.expose_Image( Res, Energy=21, Focus=-0.10 )
# Layer 2 - Aligns to ZeroLayer
Lyr2 = MyJob.Layer( LayerID="Lyr2" )
Lyr2.set_PreAlignment( marks=[E, W] ) # choose 2 marks
Lyr2.set_GlobalAlignment( strategy=ALL ) # choose a global strategy
Lyr2.expose_Image( DicingLine_X, Energy=21, Focus=-0.10 )
# Print all the data added to this Job:
print(MyJob)
fig, ax = MyJob.Plot.plot_wafer()
plt.show()
## Export the text file:
asml.unset_WARN() # Turn off warning messages about defaults
asml.set_DEBUG() # Turn on debugging output.
# overwrite the file. A warning will be printed while doing so.
MyJob.export('examplejob02_alignments_and_imageslib.txt', overwrite=True)
print('done.')