pyoptics.vectorial_imaging

Vectorial, partially coherent imaging (Abbe’s method), e.g. for lithography.

A thin mask is illuminated by a partially coherent source. Each source point is a plane wave that is mutually incoherent with all other source points; its direction is given by the partial coherence coordinates (s_x, s_y) (sigma in lithography): the transverse wave vector of the illuminating plane wave in image space is k_0*NA*(s_x, s_y). The mask diffracts it into plane waves (diffraction orders) with the transverse wave vectors k_0*NA*s + k_mask, which the projection lens passes if |k_perp| <= k_0*NA. All quantities refer to the image side: pitches and NA are image-side values (for a reduction lens the mask dimensions divided by the reduction ratio).

Polarization: the illumination has a Jones vector [E_x, E_y] at the mask, which a thin (Kirchhoff) mask keeps. In the vectorial model each diffraction order is then turned into a plane wave in the image space medium (refractive index n) by the aplanatic lens (propagators.aplanatic_rotation()): its TE (s) component stays perpendicular to the plane of incidence, its TM (p) component tilts with the wave and gets a z component. Interfering TM waves are not parallel, which reduces the image contrast at high NA. An optional obliquity (radiometric) factor 1/sqrt(cos(theta)) conserves the energy flowing through the lens, as in propagators.vectorial_mansuripur(). In the scalar model the Jones vector is kept as it is.

The image is the energy density |E_x|**2 + |E_y|**2 + |E_z|**2, summed over the source points (weighted) and over the mutually incoherent polarization states of each source point.

Polarization of the illumination can be given as

  • a Jones vector, e.g. polarization.jones.J_V,

  • a Stokes vector (shape (4,)), e.g. polarization.mueller.S_unpol (it is decomposed into two incoherent Jones vectors, see polarization.jones_from_stokes()),

  • one of the strings “x”, “y”, “unpolarized”, “TE” (= “azimuthal”, or tangential: perpendicular to the radius vector of the source point) and “TM” (= “radial”); “TE”/”TM” refer to the plane of incidence of the illumination, on the axis they fall back to y and x,

  • a callable pol(s_x, s_y) returning one of the above for each source point.

For lines along y (pitch along x) and illumination in the x-z plane (e.g. an x dipole), “y” is TE (s) polarization for all diffraction orders, and “x” is TM (p).

Convention: fields vary as exp(i(k.r - omega*t)), a defocus z > 0 (image plane behind the focal plane) multiplies each plane wave by exp(+i*k_z*z).

References

B. Richards and E. Wolf, “Electromagnetic diffraction in optical systems II. Structure of the image field in an aplanatic system”, Proc. R. Soc. Lond. A 253, 358-379 (1959).

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

Functions

contrast

Michelson contrast (I_max - I_min)/(I_max + I_min) of an image.

image_1d

Aerial image of a periodic one-dimensional mask (lines along y).

image_2d

Aerial image of a two-dimensional mask with Abbe's method.

lines_spaces_orders

Fourier coefficients of a lines and spaces mask.

nils

Normalized image log slope NILS = linewidth*|d ln(I)/dx| at x_edge.

source_points

Sample an illumination source on a square grid in the sigma plane.

two_beam_contrast

Contrast of the interference of two plane waves of equal amplitude that travel at the angles +theta and -theta to the z axis.

pyoptics.vectorial_imaging.lines_spaces_orders(pitch, linewidth, max_order, line=0.0, space=1.0)[source]

Fourier coefficients of a lines and spaces mask.

One period consists of a line of width linewidth (centered at x = 0) with the complex amplitude transmission line and a space with the transmission space: t(x) = sum_m c_m exp(2*pi*i*m*x/pitch).

Parameters:
pitch, linewidthnumbers
max_orderint

Orders -max_order … max_order are returned.

line, spacecomplex numbers, optional

Amplitude transmissions; the defaults describe a binary (chrome on glass) mask. An attenuated phase shift mask with 6 % intensity transmission has line = -sqrt(0.06).

Returns:
marray of ints
c_marray
pyoptics.vectorial_imaging.source_points(shape='conventional', sigma=0.5, sigma_in=0.0, opening_angle=None, n_samples=21, axis='x')[source]

Sample an illumination source on a square grid in the sigma plane.

Parameters:
shapestr

“coherent” (one point at sigma), “conventional” (disk of radius sigma), “annular” (sigma_in <= |s| <= sigma), “dipole” (two poles on the axis, annular sector with the opening angle) or “quasar” (four poles on the diagonals).

sigmanumber or tuple

Outer radius of the source; for “coherent” the source point (s_x, s_y) or a number s_x.

sigma_innumber, optional

Inner radius for “annular”, “dipole”, “quasar”.

opening_anglenumber, optional

Opening angle of the poles of “dipole” and “quasar” in degrees (default 35°).

n_samplesint, optional

Number of grid points across the diameter of the unit circle.

axis“x” or “y”, optional

Orientation of the dipole.

Returns:
s_x, s_y, weightsarrays

Source points and their weights (summing to 1).

pyoptics.vectorial_imaging.image_1d(x, pitch, orders, NA, wavelength, source=None, polarization='unpolarized', n=1.0, defocus=0.0, vectorial=True, obliquity=True, phase=None, return_components=False)[source]

Aerial image of a periodic one-dimensional mask (lines along y).

The diffraction orders of the mask are summed up directly, so the pitch is arbitrary and no FFT grid is involved.

Parameters:
xarray

Positions (image side) at which the image is computed.

pitchnumber

Image-side pitch.

orderstuple (m, c_m)

Diffraction orders and their amplitudes, e.g. from lines_spaces_orders().

NAnumber

Image-side numerical aperture (NA <= n).

wavelengthnumber

Vacuum wavelength.

sourcetuple (s_x, s_y, weights), optional

Source points from source_points(); defaults to coherent, normal illumination.

polarizationsee module docstring
nnumber, optional

Refractive index of the image space (immersion liquid).

defocusnumber, optional

Distance of the image plane from the focal plane.

vectorialbool, optional

If False, use the scalar model (no rotation of the polarization).

obliquitybool, optional

Use the radiometric factor 1/sqrt(cos(theta)) (vectorial model only).

phasecallable, optional

Pupil phase phase(P_x, P_y) in radians on normalized pupil coordinates (unit disk), e.g. a Zernike aberration as in imaging.

return_componentsbool, optional

Also return the intensities of the three field components.

Returns:
Iarray

Image intensity |E|**2 at x.

I_xyzarray, optional

Shape (3,) + x.shape: |E_x|**2, |E_y|**2, |E_z|**2.

pyoptics.vectorial_imaging.image_2d(mask, x, y, NA, wavelength, source=None, polarization='unpolarized', n=1.0, defocus=0.0, vectorial=True, obliquity=True, phase=None, return_components=False)[source]

Aerial image of a two-dimensional mask with Abbe’s method.

The mask (complex amplitude transmission, image-side coordinates) is taken as periodic in the computational window. For each source point the mask spectrum is filtered by the pupil, shifted by the illumination direction; the three field components are transformed back separately.

Parameters:
maskarray

Amplitude transmission sampled on x, y.

x, yarrays

Linear, centered coordinates (see pyoptics.fft).

NA, wavelength, source, polarization, n, defocus, vectorial, obliquity,
phase, return_components

As for image_1d().

Returns:
Iarray

Image intensity, shape (Ny, Nx).

I_xyzarray, optional

Shape (3, Ny, Nx).

pyoptics.vectorial_imaging.contrast(I)[source]

Michelson contrast (I_max - I_min)/(I_max + I_min) of an image.

pyoptics.vectorial_imaging.nils(x, I, x_edge, linewidth)[source]

Normalized image log slope NILS = linewidth*|d ln(I)/dx| at x_edge.

Parameters:
x, Iarrays

Sampled image (x increasing, finely sampled).

x_edgenumber

Position of the nominal edge of the feature.

linewidthnumber

Nominal width of the feature.

Returns:
NILSnumber
pyoptics.vectorial_imaging.two_beam_contrast(theta, polarization)[source]

Contrast of the interference of two plane waves of equal amplitude that travel at the angles +theta and -theta to the z axis.

TE (s) polarized waves are parallel and give contrast 1, TM (p) polarized waves enclose the angle 2*theta and give |cos(2*theta)|. Unpolarized light is the incoherent mean of both, I = 2 + (1 + cos(2*theta))*cos(Delta), with the contrast (1 + cos(2*theta))/2 = cos(theta)**2.

Parameters:
thetanumber or array

Half the angle between the waves, in the medium [rad].

polarization“TE”, “TM” or “unpolarized”
Returns:
contrastnumber or array