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

LithoSimulation

Imaging of a mask with an illumination, a projector and an optional wafer stack.

Projector

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

Projection 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.

with_(**kwargs)[source]

Copy with changed parameters, e.g. projector.with_(vectorial=False).

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

Imaging 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.

with_(**kwargs)[source]

Copy with some parts exchanged, e.g. sim.with_(illumination=…).

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