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

SwingCurve

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.

WaferStack

Resist on a substrate with optional layers above and below.

Functions

optimize_barc

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.

swing_curve

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: object

Resist 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|**2 of 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: object

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.

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.