pyoptics.litho.wafer¶
Wafer stack: a resist layer on a thin film stack, for images inside the resist.
The image-forming plane waves come from the immersion medium (refractive index n of the projector) and hit a stack
immersion medium | layers above (top coat) | resist | layers below
(BARC, ...) | substrate (e.g. silicon)
whose layers are parallel to the x-y plane. Each plane wave is decomposed into its TE (s) and TM (p) parts with respect to its own plane of incidence. With the coefficients of pyoptics.thin_films (ratios of tangential electric fields), the field in the resist at the depth z below the resist top is the sum of the downward and the upward (reflected) wave,
E_tan(z) = A*(exp(i*k_z*z) + r_b*exp(i*k_z*(2*d - z))),
A = t_top/(1 - r_top*r_b*exp(2*i*k_z*d)),
with the transmission t_top of the layers above into the resist, the reflection r_top of those layers seen from the resist, the reflection r_b of the layers below seen from the resist, the resist thickness d and the (complex, for an absorbing resist) z component k_z of the wave vector in the resist. The TE field stays perpendicular to the plane of incidence; the TM field has the tangential part E_tan along the transverse wave vector and the z component E_z = -k_perp/k_z*E_tan for the downward and +k_perp/k_z*E_tan for the upward wave (transversality). The swing of the intensity with z are the standing waves in the resist.
In the scalar model of the projector, the TE coefficients are used for both field components and there is no E_z.
Swing curves: for a plane wave with the transverse wave number
k_perp = k_0*na (na = n_medium*sin(theta) in the immersion medium, so na
runs up to the NA of the projector), WaferStack.reflectance() gives the
reflectance of the whole stack, substrate_reflectance() the reflectance
|r_b|**2 of the layers below as seen from the resist (it drives the
standing waves and the swing) and absorbed() the fraction of the incident
power absorbed in the resist,
A = k_0*Im(n_r**2)*int_0^d |E(z)|**2 dz/(n_medium*cos(theta))
for a unit incident field, integrated analytically. swing_curve() evaluates them through resist thickness, optimize_barc() scans the thickness of a bottom anti-reflective coating for the lowest substrate reflectance.
Convention: fields vary as exp(i(k.r - omega*t)), absorbing media have n + i*k with k > 0.
References¶
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).
T. A. Brunner, “Optimization of optical properties of resist processes”, Proc. SPIE 1466, 297 (1991).
C. Mack, “Fundamental Principles of Optical Lithography: The Science of Microfabrication”, Wiley (2007).
Classes
Result of swing_curve(): thickness, reflectance (of the whole stack), absorbed (fraction of the incident power absorbed in the resist) and substrate_reflectance (seen from the resist), averaged over the given angles; swing() gives the swing ratio (max - min)/mean of a curve. |
|
Resist on a substrate with optional layers above and below. |
Functions
Thickness of a bottom anti-reflective coating with the lowest substrate reflectance seen from the resist, averaged over the plane waves k_0*na with the weights. |
|
Reflectance and absorbed power of a wafer stack through resist thickness. |
- class pyoptics.litho.wafer.WaferStack(resist, below=(), substrate=(0.883, 2.778), above=(), name=None)[source]¶
Bases:
objectResist on a substrate with optional layers above and below.
- Parameters:
- resisttuple (n, k, thickness)
- belowsequence of (n, k, thickness), optional
Layers below the resist, from the resist downwards (e.g. a BARC).
- substratetuple (n, k), optional
Default: silicon at 193 nm, about 0.88 + 2.78i.
- abovesequence of (n, k, thickness), optional
Layers between the immersion medium and the resist, from the top (e.g. a top coat).
- namestr, optional
- with_(thickness=None, **kwargs)[source]¶
Copy with some parts exchanged, e.g. stack.with_(thickness=300.0) for another resist thickness or stack.with_(below=[…]).
- coefficients(k_perp, k0, n_medium, pol)[source]¶
Fresnel coefficients of the stack seen from the resist.
- Parameters:
- k_perparray
Transverse wave numbers of the plane waves.
- k0number
Vacuum wave number.
- n_mediumnumber
Refractive index of the medium above the stack.
- pol{“TE”, “TM”}
- Returns:
- t_toparray
Transmission from the medium through the layers above into the resist.
- r_toparray
Reflection at the layers above, seen from the resist.
- r_barray
Reflection of the layers below the resist (BARC, substrate).
- k_zarray
Axial wave number in the resist.
- factors(k_perp, k0, n_medium, depth, pol)[source]¶
Tangential field factors of the downward and upward waves at a depth.
Relative to the incident tangential field at the top of the stack, including the multiple reflections in the resist.
- Parameters:
- k_perparray
Transverse wave numbers.
- k0number
Vacuum wave number.
- n_mediumnumber
Refractive index of the medium above the stack.
- depthnumber
Depth below the resist top.
- pol{“TE”, “TM”}
- Returns:
- down, uparrays
Factors of the downward and upward travelling waves.
- k_zarray
Axial wave number in the resist.
- transmit(E, K_x, K_y, k0, n_medium, depth, vectorial=True)[source]¶
Field in the resist at a depth for a set of plane waves.
- Parameters:
- Earray
Fields of the plane waves at the top of the stack in the medium, shape (3,) + K_x.shape.
- K_x, K_yarrays
Transverse wave vectors.
- k0number
Vacuum wave number.
- n_mediumnumber
Refractive index of the medium above the stack.
- depthnumber
Depth below the resist top.
- vectorialbool, optional
False: scalar model (both components with the TE factors, no E_z).
- Returns:
- E_resistarray
Field components (E_x, E_y, E_z) in the resist, same shape as E.
- reflectance(na, wavelength, n_medium=1.0, pol='unpolarized')[source]¶
Reflectance of the whole stack for plane waves from the medium.
- Parameters:
- nanumber or array
Transverse wave numbers in units of k_0 (n_medium*sin(theta)).
- wavelengthnumber
Vacuum wavelength.
- n_mediumnumber, optional
Refractive index of the medium above the stack.
- pol{“TE”, “TM”, “unpolarized”}, optional
“unpolarized” is the mean of TE and TM.
- Returns:
- Rnumber or array
- substrate_reflectance(na, wavelength, n_medium=1.0, pol='unpolarized')[source]¶
Reflectance
|r_b|**2of the layers below the resist, seen from the resist.- Parameters:
- nanumber or array
Transverse wave numbers in units of k_0.
- wavelengthnumber
Vacuum wavelength.
- n_mediumnumber, optional
Refractive index of the medium above the stack.
- pol{“TE”, “TM”, “unpolarized”}, optional
- Returns:
- Rnumber or array
- absorbed(na, wavelength, n_medium=1.0, pol='unpolarized')[source]¶
Fraction of the incident power absorbed in the resist.
- Parameters:
- nanumber or array
Transverse wave numbers in units of k_0.
- wavelengthnumber
Vacuum wavelength.
- n_mediumnumber, optional
Refractive index of the medium above the stack.
- pol{“TE”, “TM”, “unpolarized”}, optional
- Returns:
- Anumber or array
- class pyoptics.litho.wafer.SwingCurve(thickness, reflectance, absorbed, substrate_reflectance)[source]¶
Bases:
objectResult of swing_curve(): thickness, reflectance (of the whole stack), absorbed (fraction of the incident power absorbed in the resist) and substrate_reflectance (seen from the resist), averaged over the given angles; swing() gives the swing ratio (max - min)/mean of a curve.
- pyoptics.litho.wafer.swing_curve(wafer, thicknesses, wavelength, n_medium=1.0, na=0.0, weights=None, pol='unpolarized')[source]¶
Reflectance and absorbed power of a wafer stack through resist thickness.
- Parameters:
- waferWaferStack
- thicknessesarray
Resist thicknesses.
- wavelengthnumber
- n_mediumnumber, optional
Refractive index of the medium above the stack (immersion liquid).
- nanumber or array, optional
Transverse wave numbers k_perp/k_0 of the plane waves (0: normal incidence); the results are averaged over them with the weights.
- weightsarray, optional
- pol“TE”, “TM” or “unpolarized”, optional
- Returns:
- SwingCurve
- pyoptics.litho.wafer.optimize_barc(wafer, barc, thicknesses, wavelength, n_medium=1.0, na=0.0, weights=None, pol='unpolarized')[source]¶
Thickness of a bottom anti-reflective coating with the lowest substrate reflectance seen from the resist, averaged over the plane waves k_0*na with the weights.
- Parameters:
- waferWaferStack
The BARC goes directly below the resist, above the layers already in wafer.below.
- barctuple (n, k)
- thicknessesarray
BARC thicknesses to scan.
- wavelength, n_medium, na, weights, pol
See swing_curve().
- Returns:
- bestnumber
Thickness with the lowest reflectance (scanned value, refined by a parabola through its neighbours).
- reflectancearray
Averaged substrate reflectance for all thicknesses.