pyoptics.litho.imaging¶
Projection lens and lithography simulation (Abbe’s method).
For every source point the mask (a MaskLayout with a mask stack) diffracts the illuminating plane wave into orders with the transverse wave vectors k_0*NA*s + 2*pi*(m/p_x, n/p_y) and Jones matrices given by the Fourier coefficients of its regions times their transmissions (a RigorousMask gives the Jones matrices of the orders directly, computed with RCWA for each source point). The projector passes the orders inside its pupil, applies apodization, aberrations and defocus and, in the vectorial model, turns each order into a plane wave in the immersion medium with the aplanatic polarization rotation (as vectorial_imaging does). The optional WaferStack then gives the field inside the resist. Fields are summed over the orders on any rectilinear grid by two matrix products (exp(i*k_y*y) @ A @ exp(i*k_x*x).T), which is exact for any pitch and any grid; intensities are summed over the mutually incoherent polarization states and source points.
All source points, polarization states and foci are computed together in batches of array operations. Usually the intensities are not summed field by field but via the mutual intensities of the orders, sum_b w_b*A_b*A_b^H over all fields A_b, which are then synthesized into the image once; this is the same sum in another order (no approximation as in Hopkins’ SOCS decompositions) and is much faster unless there are many orders and few image points.
Images are normalized to the open frame (a clear mask) in the same plane, so a threshold of e.g. 0.3 means 30 % of the clear field intensity; a dose D prints where D*I exceeds the threshold.
Convention: fields vary as exp(i(k.r - omega*t)); a focus z > 0 places the image plane (or the top of the wafer stack) behind the focal plane, each plane wave gets exp(+i*k_z*z).
References¶
E. Abbe, “Beiträge zur Theorie des Mikroskops und der mikroskopischen Wahrnehmung”, Arch. Mikrosk. Anat. 9, 413-468 (1873).
D. G. Flagello, T. Milster and A. E. Rosenbluth, “Theory of high-NA imaging in homogeneous thin films”, J. Opt. Soc. Am. A 13, 53-64 (1996).
C. Mack, “Fundamental Principles of Optical Lithography: The Science of Microfabrication”, Wiley (2007).
A. Erdmann, “Optical and EUV Lithography: A Modeling Perspective”, SPIE Press (2021).
Classes
Imaging of a mask with an illumination, a projector and an optional wafer stack. |
|
Projection lens. |
- class pyoptics.litho.imaging.Projector(NA, wavelength, n=1.0, magnification=4.0, vectorial=True, obliquity=True, zernikes=None, phase=None, apodization_zernikes=None, apodization=None, apodization_model='linear', jones_pupil=None)[source]¶
Bases:
objectProjection lens.
- Parameters:
- NAnumber
Image-side numerical aperture (NA <= n).
- wavelengthnumber
Vacuum wavelength.
- nnumber, optional
Refractive index of the image space (immersion liquid; water at 193 nm: 1.437).
- magnificationnumber, optional
Reduction ratio M (4 for scanners); sets the angles at the mask.
- vectorialbool, optional
Vectorial (aplanatic polarization rotation) or scalar model.
- obliquitybool, optional
Radiometric factor 1/sqrt(cos(theta)) (vectorial model only).
- zernikesdict, optional
Fringe Zernike coefficients of the wavefront in waves, e.g. {9: 0.02} (spherical aberration), on the normalized pupil.
- phasecallable, optional
Additional pupil phase phase(P_x, P_y) in radians.
- apodization_zernikesdict, optional
Apodization (pupil amplitude transmission) as Fringe Zernike coefficients a_j. With apodization_model=”linear” (default) the amplitude transmission is A = 1 + sum_j a_j*Z_j(P_x, P_y), so the pupil function is A*exp(i*W); e.g. {4: -0.1} lets the transmission fall off towards the rim of the pupil (Z_4 = 2*rho**2 - 1), {4: -0.1, 9: 0.05} adds a fourth order term, and a constant (a_1) cancels in normalized images. A must not become negative inside the pupil (ValueError). With apodization_model=”log” the coefficients describe the log amplitude instead: A = exp(sum_j a_j*Z_j), which is positive for any coefficients and makes the coefficients of two apodizing elements add up; both agree to first order in a_j.
- apodization_model{“linear”, “log”}, optional
How apodization_zernikes are turned into the amplitude (see above).
- apodizationcallable, optional
Additional amplitude transmission apodization(P_x, P_y) (real, >= 0) on normalized pupil coordinates, multiplied with the Zernike part.
- jones_pupilcallable, optional
Polarization of the lens: jones_pupil(P_x, P_y) returns Jones matrices of shape np.shape(P_x) + (2, 2) that act on the Jones vector (E_x, E_y) of every order before the aplanatic rotation into the image space, on top of the scalar pupil above (see pyoptics.litho.jones_pupil, e.g. PauliZernikePupil or PhysicalJonesPupil). None: a polarization-free lens.
- pupil_phase(P_x, P_y)[source]¶
Wavefront phase of the lens on normalized pupil coordinates.
- Parameters:
- P_x, P_ynumbers or arrays
Pupil coordinates normalized to the NA.
- Returns:
- Warray
Phase in radians from the Zernike aberrations plus the phase function.
- pupil_amplitude(P_x, P_y)[source]¶
Amplitude transmission of the pupil (apodization).
- Parameters:
- P_x, P_ynumbers or arrays
Pupil coordinates normalized to the NA.
- Returns:
- Anumber or array
1 without apodization.
- Raises:
- ValueError
If linear apodization Zernikes give a negative transmission inside the pupil.
- property resolution_unit¶
lambda/NA, e.g. for k_1 = hp*NA/lambda.
- class pyoptics.litho.imaging.LithoSimulation(layout, stack, illumination, projector, wafer=None, normalize=True)[source]¶
Bases:
objectImaging of a mask with an illumination, a projector and an optional wafer stack.
- Parameters:
- layoutMaskLayout
- stackThinMask, FilmMask or RigorousMask
- illuminationIllumination
- projectorProjector
- waferWaferStack, optional
None: aerial image in the immersion medium.
- normalizebool, optional
Normalize images to the open frame.
- orders()[source]¶
Order indices m, n and the transverse spatial angular frequencies of the mask (without the shift by the source point).
- open_frame(focus=0.0, depth=0.0)[source]¶
Intensity of a clear mask in the same plane (used for the normalization).
- Parameters:
- focusnumber, optional
Image plane position relative to the focal plane, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Returns:
- I_0number
- image(x, y=None, focus=0.0, depth=0.0, return_components=False)[source]¶
Image intensity.
- Parameters:
- xarray
x positions (image side).
- yarray, optional
y positions; None gives the cut at y = 0 as a 1D array.
- focusnumber, optional
Position of the image plane (with a wafer stack: of the top of the stack) relative to the focal plane.
- depthnumber, optional
Depth below the resist top (wafer stack only).
- return_componentsbool, optional
Also return
|E_x|**2,|E_y|**2,|E_z|**2.
- Returns:
- Iarray
Shape (len(y), len(x)), or (len(x),) for y=None; normalized to the open frame if self.normalize.
- I_xyzarray, optional
Shape (3,) + I.shape.
- through_focus(x, foci, y=None, depth=0.0)[source]¶
Images for several foci.
- Parameters:
- xarray
x positions (image side).
- focisequence of numbers
Image plane positions, see
image().- yarray, optional
y positions; None gives cuts at y = 0.
- depthnumber, optional
Depth below the resist top (wafer stack only).
- Returns:
- Iarray
Shape (len(foci),) + image shape.
- cut_coordinates(N=201, periods=1.0, direction=None)[source]¶
Positions of a cut across the first feature, through its center.
- Parameters:
- Nint, optional
Number of points.
- periodsnumber, optional
Length of the cut in periods.
- direction{“x”, “y”}, optional
Direction of the cut; default: the periodic direction (x if both).
- Returns:
- uarray
Positions along the cut.
- centernumber
Center of the feature along the cut.
- cdnumber
Nominal size of the feature along the cut.
- directionstr
“x” or “y”.
- cut(N=401, periods=1.0, direction=None, focus=0.0, depth=0.0)[source]¶
Image along a cut through the first feature.
- Parameters:
- Nint, optional
Number of points.
- periodsnumber, optional
Length of the cut in periods.
- direction{“x”, “y”}, optional
See
cut_coordinates().- focusnumber, optional
Image plane position, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Returns:
- uarray
Positions along the cut.
- Iarray
Intensity.
- cd(threshold=0.3, dose=1.0, focus=0.0, depth=0.0, N=401, direction=None)[source]¶
Printed CD of the first feature for the threshold model.
- Parameters:
- thresholdnumber, optional
Printing threshold for the dose times the (normalized) intensity.
- dosenumber, optional
Relative dose.
- focusnumber, optional
Image plane position, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Nint, optional
Points of the cut.
- direction{“x”, “y”}, optional
See
cut_coordinates().
- Returns:
- cdnumber
NaN if the feature does not print.
- fem(foci, doses, threshold=0.3, depth=0.0, N=401, direction=None)[source]¶
Focus-exposure matrix of the CD of the first feature.
- Parameters:
- focisequence of numbers
Image plane positions, see
image().- dosessequence of numbers
Relative doses.
- thresholdnumber, optional
Printing threshold.
- depthnumber, optional
Depth below the resist top (wafer stack only).
- Nint, optional
Points of the cut.
- direction{“x”, “y”}, optional
See
cut_coordinates().
- Returns:
- cdsarray
Shape (len(doses), len(foci)).
- dose_to_size(cd_target=None, threshold=0.3, focus=0.0, depth=0.0, N=401, direction=None)[source]¶
Dose that prints the first feature at the target CD.
- Parameters:
- cd_targetnumber, optional
Target CD; default: the nominal size of the feature.
- thresholdnumber, optional
Printing threshold.
- focusnumber, optional
Image plane position, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Nint, optional
Points of the cut.
- direction{“x”, “y”}, optional
See
cut_coordinates().
- Returns:
- dosenumber
- meef(threshold=0.3, dose=1.0, delta=1.0, focus=0.0, depth=0.0, N=801, direction=None)[source]¶
Mask error enhancement factor dCD_wafer/dCD_mask.
Both CDs at wafer scale, from mask CDs biased by -delta/2 and +delta/2.
- Parameters:
- thresholdnumber, optional
Printing threshold.
- dosenumber, optional
Relative dose.
- deltanumber, optional
Total mask CD change (wafer scale).
- focusnumber, optional
Image plane position, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Nint, optional
Points of the cut.
- direction{“x”, “y”}, optional
See
cut_coordinates().
- Returns:
- meefnumber
- nils(threshold=None, dose=1.0, focus=0.0, depth=0.0, N=801, direction=None)[source]¶
NILS of the first feature,
cd*|d ln(I)/du|.- Parameters:
- thresholdnumber, optional
None (default): at the nominal edges of the feature; otherwise at the printed edges for this threshold.
- dosenumber, optional
Relative dose (with a threshold).
- focusnumber, optional
Image plane position, see
image().- depthnumber, optional
Depth below the resist top (wafer stack only).
- Nint, optional
Points of the cut.
- direction{“x”, “y”}, optional
See
cut_coordinates().
- Returns:
- nilsnumber