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
Pixelated source optimization for a set of clips. |
|
Pixels of a freeform source, grouped by a symmetry. |
|
Result of SourceOptimizer.optimize(). |
Functions
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:
objectPixels 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
- 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
- class pyoptics.litho.source_opt.SourceOptimizer(clips, pixels, foci=(0.0,), polarization=None, h=0.5)[source]¶
Bases:
objectPixelated 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,).
- 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
- class pyoptics.litho.source_opt.SourceResult(weights, illumination, nils, worst, fill)¶
Bases:
tupleResult 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.