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

  1. Image in the resist (intensity_in_resist()): |E|**2 inside 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).

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

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

  4. 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/r with T = 0 at the resist top, solved by fast marching. The resist is removed where T <= develop_time.

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

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

LatentImage

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

Profile

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

ResistModel

Chemically amplified resist: exposure, PEB and Mack development (see the module documentation).

ResistResult

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

develop

Arrival times T of the development front, |grad T| = 1/rate with T = 0 at the resist top (half a cell above the first row), periodic along x (axis 1), by first order fast marching.

intensity_in_resist

Image in the resist across the first feature of the layout.

mack_rate

Development rate of the Mack model.

open_frame_in_resist

Intensity in the resist for a clear mask (the open frame).

profile

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

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)). 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/rate with 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: object

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

cd_at(z)[source]

CD at the depth z (linear interpolation, nan if not resolved).

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

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

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

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

with_(**kwargs)[source]

Copy with some parameters exchanged.

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.

rate(m)[source]

Mack development rate (nm/s).

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.