pyoptics.litho.resist¶
Resist model for chemically amplified (DUV) resists in an x-z cross section: exposure, post-exposure bake (PEB) and development.
The constant threshold model of metrics prints where the image exceeds a threshold. This module follows the physical chain instead, on a grid that spans one period across the feature (x, periodic) and the resist thickness (z, below the resist top):
Image in the resist (intensity_in_resist()):
|E|**2inside the resist of a LithoSimulation with a WaferStack, including the standing waves, relative to the open frame intensity incident on the stack (the aerial open frame in the immersion medium).Exposure: the photo acid generator turns into acid with the Dill C parameter,
h_0 = 1 - exp(-C*D*I)for the dose D (mJ/cm**2) and C (cm**2/mJ). DUV resists bleach little, so the optical constants stay fixed (no Dill A and B).PEB: the acid h (relative to the acid generator concentration) diffuses with the diffusion length sigma = sqrt(2*D_acid*t_PEB), is neutralized by a base quencher q (initial concentration quencher, diffusion length quencher_diffusion_length) and deprotects the polymer,
dh/dtau = sigma**2/2*Laplace(h) - kappa*h*q, dq/dtau = sigma_q**2/2*Laplace(q) - kappa*h*q, dm/dtau = -K*h*m,
over the normalized bake time tau from 0 to 1 with m = 1 (fully protected) at the start, the amplification K = k_amp*t_PEB and the neutralization rate kappa (None: instantaneous). Diffusion is spectral (FFT along x, periodic; cosine transform along z, no flux through the top and the bottom of the resist), the reactions are integrated exactly over each of n_steps time steps (operator splitting).
Development with the Mack rate model,
r(m) = r_max*(a + 1)*(1 - m)**n/(a + (1 - m)**n) + r_min, a = (n + 1)/(n - 1)*(1 - m_th)**n,
(nm/s; m_th is the threshold inhibitor concentration, n the dissolution selectivity), and the development front from the arrival times T(x, z) of the eikonal equation
|grad T| = 1/rwith T = 0 at the resist top, solved by fast marching. The resist is removed where T <= develop_time.Dose: ResistModel.dose_to_size() finds the dose for a target CD at a given depth, ResistModel.dose_to_clear() the dose at which the open frame (open_frame_in_resist()) develops through, E_0, whose swing with the resist thickness is the classic swing curve.
Profile: the CD of the first feature of the layout through the resist thickness (a line of resist for a dark mask feature, an opening for a bright one), CDs at the top, middle and bottom (10, 50 and 90 % of the thickness), sidewall angle and top loss.
The geometry is a cut across the feature: diffusion along the feature (y) is neglected, which is exact for lines and spaces.
Lengths in nm, times in s, doses in mJ/cm**2.
References¶
F. H. Dill, W. P. Hornberger, P. S. Hauge and J. M. Shaw, “Characterization of positive photoresist”, IEEE Trans. Electron Devices 22, 445-452 (1975).
H. Ito and C. G. Willson, “Chemical amplification in the design of dry developing resist materials”, Polym. Eng. Sci. 23, 1012-1018 (1983).
C. A. Mack, “Development of positive photoresists”, J. Electrochem. Soc. 134, 148-152 (1987).
J. A. Sethian, “A fast marching level set method for monotonically advancing fronts”, Proc. Natl. Acad. Sci. USA 93, 1591-1595 (1996).
C. Mack, “Fundamental Principles of Optical Lithography: The Science of Microfabrication”, Wiley (2007).
Classes
Intensity in the resist on the grid x (one period, periodic), z (cell centers of the resist thickness); I has shape (len(z), len(x)). |
|
Resist profile of the feature: z (rows), left, right and cd per row (nan where the feature is not resolved), cd_top, cd_middle and cd_bottom (at 10, 50 and 90 % of the thickness), sidewall_angle (degrees, 90 for vertical walls, < 90 for a resist line that widens towards the bottom or an opening that narrows) and top_loss (thickness lost at the top of the resist between the features). |
|
Chemically amplified resist: exposure, PEB and Mack development (see the module documentation). |
|
Result of ResistModel.process(): the latent image, the dose, the acid after exposure (acid_0) and after the bake (acid), the inhibitor concentration m, the development rate, the arrival times of the development front, the develop time and the profile; all arrays of shape (N_z, N_x). |
Functions
Arrival times T of the development front, |
|
Image in the resist across the first feature of the layout. |
|
Development rate of the Mack model. |
|
Intensity in the resist for a clear mask (the open frame). |
|
Resist profile of the feature from the arrival times of the development front. |
- class pyoptics.litho.resist.LatentImage(x, z, I, center, opening, thickness, pitch)[source]¶
Bases:
objectIntensity in the resist on the grid x (one period, periodic), z (cell centers of the resist thickness); I has shape (len(z), len(x)). center is the feature center, opening True if the feature is an opening in the resist (a bright feature on the mask).
- pyoptics.litho.resist.intensity_in_resist(sim, focus=0.0, N_x=128, N_z=40, direction=None)[source]¶
Image in the resist across the first feature of the layout.
- Parameters:
- simLithoSimulation
With a WaferStack.
- focusnumber, optional
Position of the resist top relative to the focal plane.
- N_x, N_zint, optional
Grid points across one period and through the resist thickness.
- direction“x” or “y”, optional
Direction of the cut (default: as LithoSimulation.cut()).
- Returns:
- LatentImage
Intensity relative to the open frame intensity incident on the stack.
- pyoptics.litho.resist.open_frame_in_resist(sim, focus=0.0, N_z=40)[source]¶
Intensity in the resist for a clear mask (the open frame).
Use it e.g. for
ResistModel.dose_to_clear().- Parameters:
- simLithoSimulation
Simulation with a WaferStack.
- focusnumber, optional
Position of the resist top relative to the focal plane.
- N_zint, optional
Number of cells across the resist thickness.
- Returns:
- LatentImage
A single column, normalized to the open frame without the stack.
- Raises:
- ValueError
If the simulation has no wafer stack.
- pyoptics.litho.resist.mack_rate(m, r_max=100.0, r_min=0.1, n=5.0, m_th=0.5)[source]¶
Development rate of the Mack model.
- Parameters:
- mnumber or array
Relative inhibitor concentration in [0, 1].
- r_max, r_minnumbers, optional
Largest and smallest rate (nm/s).
- nnumber, optional
Dissolution selectivity.
- m_thnumber, optional
Threshold inhibitor concentration.
- Returns:
- ratenumber or array
Development rate in nm/s.
- pyoptics.litho.resist.develop(rate, dx, dz)[source]¶
Arrival times T of the development front,
|grad T| = 1/ratewith T = 0 at the resist top (half a cell above the first row), periodic along x (axis 1), by first order fast marching.- Parameters:
- ratearray, shape (N_z, N_x)
Development rate in the cells (positive).
- dx, dznumbers
Grid spacings.
- class pyoptics.litho.resist.Profile(z, left, right, thickness, top_loss, opening)[source]¶
Bases:
objectResist profile of the feature: z (rows), left, right and cd per row (nan where the feature is not resolved), cd_top, cd_middle and cd_bottom (at 10, 50 and 90 % of the thickness), sidewall_angle (degrees, 90 for vertical walls, < 90 for a resist line that widens towards the bottom or an opening that narrows) and top_loss (thickness lost at the top of the resist between the features).
- pyoptics.litho.resist.profile(latent, arrival, develop_time, rate=None)[source]¶
Resist profile of the feature from the arrival times of the development front.
Without the rate, the front is interpolated linearly in time between the samples.
- Parameters:
- latentLatentImage
Grid and feature of the simulation.
- arrival(N_z, N_x) array
Arrival times of the development front at the cell centers.
- develop_timenumber
Develop time (s).
- rate(N_z, N_x) array, optional
Development rate (nm/s).
- Returns:
- Profile
Edges per depth and the top loss.
- class pyoptics.litho.resist.ResistResult(latent, dose, acid_0, acid, inhibitor, rate, arrival, develop_time, profile)[source]¶
Bases:
objectResult of ResistModel.process(): the latent image, the dose, the acid after exposure (acid_0) and after the bake (acid), the inhibitor concentration m, the development rate, the arrival times of the development front, the develop time and the profile; all arrays of shape (N_z, N_x).
- property resist¶
True where resist remains after development.
- class pyoptics.litho.resist.ResistModel(C=0.05, diffusion_length=20.0, amplification=2.0, quencher=0.0, quencher_diffusion_length=0.0, neutralization=None, r_max=100.0, r_min=0.1, n=5.0, m_th=0.5, develop_time=60.0, n_steps=40)[source]¶
Bases:
objectChemically amplified resist: exposure, PEB and Mack development (see the module documentation).
- Parameters:
- Cnumber, optional
Dill C (cm**2/mJ).
- diffusion_lengthnumber, optional
Acid diffusion length sqrt(2*D*t_PEB) (nm).
- amplificationnumber, optional
k_amp*t_PEB.
- quenchernumber, optional
Initial base quencher concentration (relative to the acid generator).
- quencher_diffusion_lengthnumber, optional
- neutralizationnumber or None, optional
kappa*t_PEB; None for instantaneous neutralization.
- r_max, r_min, n, m_thnumbers, optional
Mack development rate parameters (nm/s).
- develop_timenumber, optional
- n_stepsint, optional
Time steps of the bake.
- expose(I, dose)[source]¶
Relative acid concentration after exposure, 1 - exp(-C*dose*I).
- Parameters:
- Iarray
Relative intensity in the resist.
- dosenumber
Dose in mJ/cm**2.
- Returns:
- acidarray
- bake(acid, dx, dz)[source]¶
Post exposure bake: acid diffusion, quenching and amplification.
- Parameters:
- acid(N_z, N_x) array
Acid after exposure.
- dxnumber
Grid spacing in x (periodic).
- dznumber
Spacing of the cell centers in z.
- Returns:
- acid(N_z, N_x) array
Acid after the bake.
- m(N_z, N_x) array
Relative inhibitor concentration.
- process(latent, dose)[source]¶
Expose, bake and develop.
- Parameters:
- latentLatentImage
From intensity_in_resist().
- dosenumber
mJ/cm**2.
- Returns:
- ResistResult
- dose_to_size(latent, cd_target, depth=0.5, doses=(1.0, 300.0), n_scan=40)[source]¶
Dose that prints cd_target at a relative depth of the resist.
A geometric scan of n_scan doses brackets the solution, which is then refined by root finding. Between doses where the feature appears or disappears at that depth the scan is repeated more finely, since the window of doses that resolve it can be narrow (standing waves). The lowest dose found is returned.
- Parameters:
- latentLatentImage
From intensity_in_resist().
- cd_targetnumber
Target CD (nm).
- depthnumber, optional
Relative depth, 0: top, 1: bottom of the resist.
- doses(number, number), optional
Range of doses in mJ/cm**2.
- n_scanint, optional
Doses of the initial scan.
- Returns:
- dosenumber
Dose in mJ/cm**2; nan if no dose in the range prints cd_target.
- dose_to_clear(latent, doses=(0.1, 1000.0))[source]¶
Dose to clear, E_0.
The dose (mJ/cm**2) at which the development front reaches the bottom of the resist within the develop time everywhere; for the open frame (
open_frame_in_resist()) this is the classic E_0.- Parameters:
- latentLatentImage
Intensity in the resist.
- doses(number, number), optional
Range of doses in mJ/cm**2.
- Returns:
- dosenumber
nan if the resist does not clear within the range of doses.