pyoptics.litho.source_opt

Source optimization (“SO lite”): a pixelated source optimized for a set of clips.

In Abbe’s method the image is a sum over the source points, so it is linear in their weights. The image of a source with weights W is the weighted sum of the images of the single pixels (or, with a symmetry, of the symmetric groups of pixels). SourceOptimizer computes these responses once, at the nominal edges of every clip and for every focus, and then finds the weights by linear programming:

  • objective: the worst NILS over all clips and foci at the nominal feature edges, NILS = CD*slope/I with the image slope across the edge and the intensity I at the edge (the edge is printed at size when the threshold equals I, i.e. after a mask bias per clip, or at a common dose with dose_tolerance). Maximizing the minimum of these ratios is a quasi-concave problem, solved by bisection over the target value, each step a linear feasibility problem;

  • constraints: non-negative weights, the symmetry of the source (pixel groups share a weight), a minimum pupil fill (an upper bound for the weight of a single pixel, as a scanner’s illuminator cannot concentrate all light into a few pixels), and optionally a common dose: the intensities at the edges of all clips (their dose to size) agree within a tolerance.

Through focus the NILS at the nominal edges of the defocused images measures the depth of focus. The result is an Illumination that works everywhere else in the toolbox; SourceOptimizer.evaluate() rates any other source (annular, dipole, quasar, …) with the same metric.

This is source optimization only; the mask stays fixed apart from the implicit bias per clip (no SMO, no OPC).

References

A. E. Rosenbluth, S. Bukofsky, C. Fonseca, M. Hibbs, K. Lai, A. F. Molless, R. N. Singh and A. K. K. Wong, “Optimum mask and source patterns to print a given shape”, J. Microlith. Microfab. Microsyst. 1, 13-30 (2002).

Y. Granik, “Source optimization for image fidelity and throughput”, J. Microlith. Microfab. Microsyst. 3, 509 (2004).

Classes

SourceOptimizer

Pixelated source optimization for a set of clips.

SourcePixels

Pixels of a freeform source, grouped by a symmetry.

SourceResult

Result of SourceOptimizer.optimize().

Functions

scan

Rate a family of sources by the worst NILS of optimizer.evaluate().

class pyoptics.litho.source_opt.SourcePixels(n_samples=25, sigma_max=1.0, symmetry='xy')[source]

Bases: object

Pixels of a freeform source, grouped by a symmetry.

Parameters:
n_samplesint, optional

Grid points across the unit circle (as for the standard shapes of Illumination, so that those lie on the same pixels).

sigma_maxnumber, optional

Largest sigma of the pixels.

symmetry{“none”, “point”, “xy”, “xy-diagonal”}, optional

Pixels that share a weight: none; s and -s (a symmetric source, no telecentricity error); mirror symmetry about the x and y axes; additionally about the diagonals (equal for x and y features).

property sizes

Number of pixels in each group.

group_illumination(g, polarization='unpolarized', dop=1.0)[source]

The pixels of one symmetry group with equal weights.

Parameters:
gint

Group index.

polarizationsee Illumination, optional
dopnumber, optional

Degree of polarization.

Returns:
Illumination
point_weights(W)[source]

Weights of the single pixels for the group totals W.

illumination(W, polarization='unpolarized', dop=1.0, threshold=1e-06, name='freeform')[source]

Illumination with given group totals.

Parameters:
Warray

Total weight of each group.

polarizationsee Illumination, optional
dopnumber, optional

Degree of polarization.

thresholdnumber, optional

Pixels below threshold times the largest pixel weight are dropped.

namestr, optional
Returns:
Illumination
fill(W, threshold=0.01)[source]

Pupil fill of the source.

Parameters:
Warray

Total weight of each group.

thresholdnumber, optional

Pixels count as lit above threshold times the largest pixel weight.

Returns:
fillnumber

Fraction of the pupil area (sigma <= 1) that is lit.

class pyoptics.litho.source_opt.SourceOptimizer(clips, pixels, foci=(0.0,), polarization=None, h=0.5)[source]

Bases: object

Pixelated source optimization for a set of clips.

Parameters:
clipsdict {name: LithoSimulation} or list

The patterns to optimize for, each with its layout, mask stack and projector (and wafer stack); their illumination is ignored apart from its polarization. The first feature of each layout is evaluated, at its nominal edges along the cut direction (LithoSimulation.cut_coordinates()).

pixelsSourcePixels
focisequence, optional

Foci at which the NILS counts (e.g. (0, +-dof/2)).

polarizationstr or array, optional

Polarization of the source pixels (as for Illumination); default: that of the first clip’s illumination.

hnumber, optional

Step for the image slope across the edge.

property responses

Per group (unit total weight, not normalized): intensity at the edge E and signed slope S, shape (clips, foci, groups), and the open frame O (groups,).

nils(W)[source]

NILS at the nominal edges for the group totals W, shape (clips, foci).

edge_intensity(W)[source]

Normalized intensity at the nominal edges (the threshold that prints each clip at size), shape (clips, foci).

optimize(min_fill=0.1, dose_tolerance=None, tol=0.001)[source]

Weights that maximize the worst NILS over clips and foci.

Parameters:
min_fillnumber, optional

Minimum pupil fill: no pixel gets more than 1/(min_fill*N) of the light, N the number of grid points in the unit circle (0: no limit; the solution is then a few pixels).

dose_tolerancenumber, optional

Common dose: the intensities at the edges of all clips (at the first focus) stay within (1 +- dose_tolerance) times that of the first clip, so that one dose prints all of them at size within about dose_tolerance/NILS relative CD. None (default): every clip is assumed to be biased to size on the mask.

tolnumber, optional

Accuracy of the worst NILS (bisection).

Returns:
SourceResult
evaluate(illumination)[source]

NILS at the nominal edges (clips, foci) for any Illumination, computed with the full simulation (normalized images).

project(illumination)[source]

Group totals W of an Illumination whose points lie on the pixel grid (e.g. a standard shape with the same n_samples); points off the grid raise ValueError.

class pyoptics.litho.source_opt.SourceResult(weights, illumination, nils, worst, fill)

Bases: tuple

Result of SourceOptimizer.optimize().

weights : group totals (sum 1) for SourcePixels.illumination() illumination : the optimized Illumination nils : NILS at the nominal edges, shape (clips, foci) worst : its minimum (the objective) fill : pupil fill of the result (SourcePixels.fill())

fill

Alias for field number 4

illumination

Alias for field number 1

nils

Alias for field number 2

weights

Alias for field number 0

worst

Alias for field number 3

pyoptics.litho.source_opt.scan(optimizer, make_illumination, parameters)[source]

Rate a family of sources by the worst NILS of optimizer.evaluate().

Parameters:
optimizerSourceOptimizer
make_illuminationcallable

make_illumination(**p) returns an Illumination for each p in parameters.

parameterssequence of dict
Returns:
list of (worst NILS, parameters, Illumination), best first.