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
Boundary layer at the absorber edges. |
|
Mask whose absorber is a thin film stack on the mask blank. |
|
Geometry of one period of a mask. |
|
Kirchhoff (thin mask) model with given transmissions. |
Functions
The polygon with counterclockwise vertices, without repeated or collinear vertices. |
|
Move every edge of a Manhattan polygon outward, keeping it rectilinear. |
|
Signed area (positive for counterclockwise vertices). |
|
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:
objectGeometry 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:
objectBoundary 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.
- class pyoptics.litho.mask.ThinMask(t_absorber=0.0, t_clear=1.0, boundary_layer=None, name=None)[source]¶
Bases:
objectKirchhoff (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 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:
objectMask 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).