pyoptics.litho.mask

Masks for lithographic imaging: layouts (geometry) and mask stacks (materials and the model that turns them into transmissions).

Layout

A MaskLayout is one period (pitch_x, pitch_y) of a periodic mask that holds rectangular features on a background (the field). A pitch of None makes the mask invariant along that direction: lines along y have pitch_y = None. With tone=”clear” the field is clear and the features are absorber (lines on a clear field mask), with tone=”dark” the field is absorber and the features are clear (contact holes, trenches). Isolated features are periodic features with a pitch large enough that the neighbours do not interact (the coherence length of the illumination, a few lambda/NA).

The diffraction orders are the Fourier coefficients of the transmission on one period. They are computed analytically from the rectangles (products of sinc functions), so there is no pixelation of the mask.

Manhattan polygons (MaskLayout.from_polygons()) are turned into the exact union of non-overlapping rectangles, so L and T shapes, line ends with hammerheads or serifs and OPC’d shapes have exact Fourier coefficients too. Overlapping polygons are merged. The boundary layer model is not available for polygon layouts (the rectangles of a polygon share internal edges).

Mask stacks and approximations

A mask stack gives the transmissions of the clear and absorber regions as Jones matrices for an illuminating plane wave (source point (s_x, s_y)):

  • ThinMask: Kirchhoff (thin mask) approximation with given complex transmissions, e.g. binary (chrome on glass, t = 0) or attenuated phase shift masks (t = sqrt(T)*exp(i*phase)); independent of angle and polarization.

  • FilmMask: the absorber is a stack of thin films (n + i*k, thickness) on the mask blank. Absorber and clear regions are taken as laterally infinite film stacks (a thin mask whose local transmissions are those of the films): their transmissions t_TE and t_TM are computed with pyoptics.thin_films for the angle of incidence of each source point at the mask, n*sin(theta) = NA*|s|/M (M: reduction ratio), and for TE and TM with respect to its plane of incidence. Phase and amplitude of the absorber, e.g. of an attenuated PSM, follow from the material data instead of being set by hand.

  • BoundaryLayer (optional for both): thick mask (mask 3D) effects at the edges of the absorber are approximated by strips of width w centered on every edge, with a complex transmission that depends on whether the electric field is parallel (TE) or perpendicular (TM) to the edge (Tirapu-Azpiroz and Yablonovitch’s boundary layer model). Its parameters come from a rigorous simulation or a calibration. At the corners of rectangles, the strips along y are taken to cover the corner squares.

Transmissions are relative to the clear area: the clear region has the transmission 1 (FilmMask normalizes to the clear region unless normalize=False), so that images can be normalized to the open frame.

References

J. Tirapu-Azpiroz, P. Burchard and E. Yablonovitch, “Boundary layer model to account for thick mask effects in photolithography”, Proc. SPIE 5040, 1611 (2003).

A. Erdmann, “Optical and EUV Lithography: A Modeling Perspective”, SPIE Press (2021).

A. K.-K. Wong, “Resolution Enhancement Techniques in Optical Lithography”, SPIE Press (2001).

Classes

BoundaryLayer

Boundary layer at the absorber edges.

FilmMask

Mask whose absorber is a thin film stack on the mask blank.

MaskLayout

Geometry of one period of a mask.

ThinMask

Kirchhoff (thin mask) model with given transmissions.

Functions

counterclockwise

The polygon with counterclockwise vertices, without repeated or collinear vertices.

offset_polygon

Move every edge of a Manhattan polygon outward, keeping it rectilinear.

polygon_area

Signed area (positive for counterclockwise vertices).

polygon_rectangles

The union of Manhattan polygons as non-overlapping rectangles (x0, y0, w_x, w_y) (exact; cells of the grid of all vertex coordinates, merged along x and then along y).

pyoptics.litho.mask.polygon_area(polygon)[source]

Signed area (positive for counterclockwise vertices).

pyoptics.litho.mask.counterclockwise(polygon)[source]

The polygon with counterclockwise vertices, without repeated or collinear vertices.

pyoptics.litho.mask.offset_polygon(polygon, distance)[source]

Move every edge of a Manhattan polygon outward, keeping it rectilinear.

Parameters:
polygon(N, 2) array

Vertices (x, y); edges parallel to x or y.

distancenumber

Shift of each edge along its outward normal (negative: inward).

Returns:
polygon(N, 2) array

Offset polygon, counterclockwise.

pyoptics.litho.mask.polygon_rectangles(polygons)[source]

The union of Manhattan polygons as non-overlapping rectangles (x0, y0, w_x, w_y) (exact; cells of the grid of all vertex coordinates, merged along x and then along y).

class pyoptics.litho.mask.MaskLayout(pitch_x, pitch_y=None, features=(), tone='clear', name=None)[source]

Bases: object

Geometry of one period of a mask.

Parameters:
pitch_x, pitch_ynumbers or None

Periods; None for an invariant direction (at most one).

featuressequence of (x0, y0, w_x, w_y)

Centers and sizes of rectangles (must not overlap). Sizes along an invariant direction are ignored.

tone“clear” or “dark”

Clear field (features are absorber) or dark field (features are clear).

namestr, optional
classmethod from_polygons(pitch_x, pitch_y, polygons, tone='clear', name=None)[source]

Layout of Manhattan polygons in one period.

The polygons should lie within one period of pitch_x x pitch_y (they are repeated periodically, images in neighbouring periods are not merged). Overlapping polygons are merged; the first polygon is the feature that cut_coordinates() and the CD metrics use (through its first rectangle).

Parameters:
pitch_x, pitch_ynumbers

Periods; both directions must be periodic.

polygonssequence of (N, 2) arrays

Vertices (x, y) of each polygon, edges parallel to x or y.

tone{“clear”, “dark”}, optional

Clear field (polygons are absorber) or dark field (polygons are clear).

namestr, optional
Returns:
MaskLayout
classmethod lines_spaces(pitch, cd, orientation='y', tone='clear', name=None)[source]

Lines and spaces.

Parameters:
pitchnumber

Period.

cdnumber

Width of the lines (absorber for tone=”clear”, clear trenches for tone=”dark”).

orientation{“y”, “x”}, optional

Direction of the lines: along y (pitch along x) or along x.

tone{“clear”, “dark”}, optional
namestr, optional
Returns:
MaskLayout
classmethod iso_line(cd, pitch=None, orientation='y', tone='clear', name=None)[source]

Isolated line (or trench for tone=”dark”).

Parameters:
cdnumber

Line width.

pitchnumber, optional

Period of the repeated line, default 20*cd.

orientation{“y”, “x”}, optional

Direction of the line.

tone{“clear”, “dark”}, optional
namestr, optional
Returns:
MaskLayout
classmethod contact_holes(pitch, cd, pitch_y=None, cd_y=None, tone='dark', name=None)[source]

Array of rectangular contact holes.

Dark field (default): clear holes in absorber.

Parameters:
pitchnumber

Period in x.

cdnumber

Hole width in x.

pitch_y, cd_ynumbers, optional

Period and hole width in y (defaults: square holes on a square grid).

tone{“dark”, “clear”}, optional
namestr, optional
Returns:
MaskLayout
classmethod iso_contact(cd, pitch=None, cd_y=None, tone='dark', name=None)[source]

Isolated contact hole.

Parameters:
cdnumber

Hole width in x.

pitchnumber, optional

Period of the repeated hole, default 10*cd.

cd_ynumber, optional

Hole width in y, default cd.

tone{“dark”, “clear”}, optional
namestr, optional
Returns:
MaskLayout
classmethod staggered_contacts(pitch_x, pitch_y, cd, cd_y=None, tone='dark', name=None)[source]

Staggered (brick) contact array.

Rows at the distance pitch_y, every other row shifted by pitch_x/2.

Parameters:
pitch_xnumber

Period within a row.

pitch_ynumber

Distance of the rows.

cdnumber

Hole width in x.

cd_ynumber, optional

Hole width in y, default cd.

tone{“dark”, “clear”}, optional
namestr, optional
Returns:
MaskLayout
property feature_is_bright

True if the features transmit (dark field mask).

scaled(factor_cd=1.0, bias=0.0)[source]

Copy with scaled and biased features.

Parameters:
factor_cdnumber, optional

Factor for all feature sizes (polygon layouts: only 1).

biasnumber, optional

Added to every feature size (each edge moves by bias/2), e.g. a mask CD error for MEEF.

Returns:
MaskLayout
max_orders(NA, wavelength, sigma_max=1.0)[source]

Largest diffraction order indices that can pass the pupil.

Parameters:
NAnumber

Numerical aperture (image side).

wavelengthnumber

Vacuum wavelength.

sigma_maxnumber, optional

Largest source point radius (partial coherence).

Returns:
M, Nint

Largest order indices in x and y (0 for an invariant direction).

region_coefficients(m, n, boundary_width=0.0)[source]

Fourier coefficients of the regions of the layout.

Parameters:
m, narrays of ints

Order indices along x and y (1D each).

boundary_widthnumber, optional

Width of the boundary layer strips.

Returns:
cdict of arrays of shape (len(n), len(m))

“field”, “feature” and, for boundary_width > 0, “edge_y” (strips along edges parallel to y) and “edge_x” (edges parallel to x). The coefficients of all regions add up to the delta of order 0.

transmission(x, y=None, t_clear=1.0, t_absorber=0.0)[source]

Sample the scalar thin mask transmission, e.g. for plots.

Parameters:
xarray

x coordinates.

yarray, optional

y coordinates; None gives a cut at y = 0.

t_clear, t_absorbercomplex, optional

Transmissions of the clear area and the absorber.

Returns:
tarray

Shape (len(y), len(x)), or (len(x),) for y=None.

class pyoptics.litho.mask.BoundaryLayer(width, t_TE, t_TM)[source]

Bases: object

Boundary layer at the absorber edges.

Parameters:
widthnumber

Width of the strip centered on each edge (wafer scale).

t_TE, t_TMcomplex numbers

Transmission of the strip for the electric field parallel (TE) and perpendicular (TM) to the edge.

jones()[source]

Jones matrices of the strips along y and along x.

class pyoptics.litho.mask.ThinMask(t_absorber=0.0, t_clear=1.0, boundary_layer=None, name=None)[source]

Bases: object

Kirchhoff (thin mask) model with given transmissions.

Parameters:
t_absorbercomplex, optional

Amplitude transmission of the absorber (default 0: binary mask).

t_clearcomplex, optional
boundary_layerBoundaryLayer, optional
namestr, optional
classmethod binary(**kwargs)[source]

Binary (chrome on glass) mask.

classmethod att_psm(transmission=0.06, phase=180.0, **kwargs)[source]

Attenuated phase shift mask.

Parameters:
transmissionnumber, optional

Intensity transmission of the absorber.

phasenumber, optional

Phase of the absorber in degrees.

**kwargs

Further arguments of ThinMask (e.g. boundary_layer, name).

Returns:
ThinMask
jones(s_x, s_y, NA, wavelength, magnification)[source]

Jones matrices of the clear area and the absorber for source points.

Parameters:
s_x, s_ynumbers or arrays

Source point coordinates (sigma).

NAnumber

Numerical aperture (unused by the thin mask).

wavelengthnumber

Vacuum wavelength (unused by the thin mask).

magnificationnumber

Reduction ratio of the projector (unused by the thin mask).

Returns:
J_clear, J_absorberarrays

Shape np.shape(s_x) + (2, 2).

class pyoptics.litho.mask.FilmMask(n, k, t, substrate_n=1.563, substrate_k=0.0, exit_n=1.0, normalize=True, boundary_layer=None, name=None)[source]

Bases: object

Mask whose absorber is a thin film stack on the mask blank.

Light comes from the blank (substrate_n), passes the absorber layers in the given order and leaves into the exit medium (air). The clear region is the bare blank; its transmission is taken at the same plane as the absorber’s (bottom of the absorber), i.e. through exit medium of the same thickness.

Parameters:
n, k, tsequences

Refractive indices n + i*k and thicknesses of the absorber layers, from the blank outwards (mask scale thicknesses).

substrate_n, substrate_knumbers, optional

Mask blank (fused silica at 193 nm: about 1.563).

exit_nnumber, optional

Medium between mask and projection lens.

normalizebool, optional

Divide by the clear transmission (per TE/TM), so that the clear region transmits 1.

boundary_layerBoundaryLayer, optional
namestr, optional
transmissions(sin_theta, wavelength)[source]

Transmissions of absorber and clear area for oblique incidence.

Parameters:
sin_thetanumber or array

Sine of the angle of incidence in the blank (substrate).

wavelengthnumber

Vacuum wavelength in the unit of the layer thicknesses.

Returns:
t_abs, t_cleararrays of shape (2,) + np.shape(sin_theta)

[t_TE, t_TM] each (ratios of tangential electric fields).

jones(s_x, s_y, NA, wavelength, magnification)[source]

Jones matrices of the clear area and the absorber for source points.

The angle of incidence at the mask follows from NA*sigma/magnification in the blank; TE and TM transmissions are combined on the TE/TM basis of each source point.

Parameters:
s_x, s_ynumbers or arrays

Source point coordinates (sigma).

NAnumber

Numerical aperture (image side).

wavelengthnumber

Vacuum wavelength.

magnificationnumber

Reduction ratio of the projector.

Returns:
J_clear, J_absorberarrays

Shape np.shape(s_x) + (2, 2).