pyoptics.litho.opc¶
Optical proximity correction (OPC) of Manhattan layouts.
The printed shape of a feature depends on its neighbourhood (pitch, line ends, corners): OPC changes the mask so that the printed edges land on the target edges (the design).
Rule-based OPC¶
bias_table() tabulates, through pitch, the mask bias that prints the target CD of lines (or trenches) at one common dose, anchored on one pitch; the bias is then looked up for every feature. insert_srafs() adds sub-resolution assist features (scattering bars) to isolated or semi-dense lines, which make them image more like dense lines and move the process window of the forbidden pitches; sraf_margin() checks that the assists do not print.
Model-based OPC¶
The edges of the target polygons are cut into fragments (FragmentedLayout: short fragments at the corners, the rest of an edge in pieces of at most max_length). Every fragment has a site (its midpoint on the target edge, on corner fragments nearer to the fragment’s inner end) where the edge placement error (EPE) is measured: the distance from the target edge to the printed edge (threshold model) along the outward normal, positive if the printed feature is too large. model_opc() moves the fragments along their normals and re-images until the EPEs are small: either every fragment against its own EPE (“local”, the simplest scheme) or all fragments together from the Jacobian of the EPEs (a MEEF matrix) by regularized least squares (“jacobian”, the default). Line ends grow hammerheads, convex corners serifs and concave corners are cut back, as in the classic picture; the rounding of the printed corners cannot be corrected, so the corner sites get less weight. The image of every iteration is computed on a grid of one period, with Abbe’s method or, faster, with the Hopkins TCC (or its SOCS kernels) of the target layout, and interpolated along the normals.
Only Manhattan polygons are supported, no curvilinear masks, and the threshold model stands in for the resist.
References¶
N. B. Cobb, “Fast optical and process proximity correction algorithms for integrated circuit manufacturing”, Ph.D. dissertation, University of California, Berkeley (1998).
A. K.-K. Wong, “Resolution Enhancement Techniques in Optical Lithography”, SPIE Press (2001).
R. Socha et al., “Forbidden pitches for 130 nm lithography and below”, Proc. SPIE 4000, 1140 (2000).
A. K. Wong, R. A. Ferguson and S. M. Mansfield, “The mask error factor in optical lithography”, IEEE Trans. Semicond. Manuf. 13, 235-242 (2000).
A. Poonawala and P. Milanfar, “Mask design for optical microlithography - an inverse imaging problem”, IEEE Trans. Image Process. 16, 774-788 (2007).
Classes
Target polygons with their edges cut into movable fragments. |
|
Result of model_opc(). |
Functions
Mask bias of lines through pitch that prints the target CD at one dose (rule-based OPC). |
|
Edge placement errors of the threshold contour of an image. |
|
Grid of one period for images that |
|
Sub-resolution assist features next to the lines of a 1D layout. |
|
Model-based OPC: move the fragments of the target edges until the printed edges (threshold model) are on the target. |
|
Periodic cubic spline interpolation of an image. |
|
How far the assist features are from printing. |
- pyoptics.litho.opc.bias_table(sim, pitches, cd_target, threshold=0.3, anchor=None, focus=0.0, max_bias=None, make_layout=None)[source]¶
Mask bias of lines through pitch that prints the target CD at one dose (rule-based OPC).
- Parameters:
- simLithoSimulation
Stack, illumination and projector; its layout (1D lines or trenches) gives orientation and tone.
- pitchessequence of numbers
- cd_targetnumber
Target CD on the wafer.
- thresholdnumber, optional
Resist threshold (intensity relative to the open frame).
- anchornumber, optional
Pitch that prints at cd_target without bias and so sets the dose (default: the first pitch).
- focusnumber, optional
- max_biasnumber, optional
Largest absolute bias searched (default: cd_target).
- make_layoutcallable, optional
make_layout(pitch, cd) gives the layout of a pitch with the mask CD of the (first) line, e.g. with SRAFs (insert_srafs()). Default: lines and spaces with the orientation and tone of sim.layout.
- Returns:
- biasarray
Mask CD - target CD for every pitch (nan where no bias in the range prints the target).
- dosenumber
The common dose.
- pyoptics.litho.opc.insert_srafs(layout, width, distance, count=1, spacing=None, min_space=None)[source]¶
Sub-resolution assist features next to the lines of a 1D layout.
- Parameters:
- layoutMaskLayout
Lines (or trenches) along y or x with one feature per period.
- widthnumber
Width of the assists (well below the resolution, so they do not print).
- distancenumber
Center to center distance of the first assist from the line.
- countint, optional
Assists on each side of the line.
- spacingnumber, optional
Center to center distance of further assists (default: distance).
- min_spacenumber, optional
Smallest space between an assist and a line or another assist; assists from both sides of a space that come closer are merged into one in the middle (default: width).
- Returns:
- MaskLayout
The main line first, then the assists (same tone: absorber bars on a clear field, clear slits for a dark field).
- pyoptics.litho.opc.sraf_margin(sim, threshold=0.3, dose=1.0, foci=(0.0,))[source]¶
How far the assist features are from printing.
The assists are the layout features after the first; the margin is the smallest relative distance of the image at their centers from the threshold over the foci.
- Parameters:
- simLithoSimulation
Simulation whose layout contains the assists.
- thresholdnumber, optional
Printing threshold.
- dosenumber, optional
Relative dose.
- focisequence of numbers, optional
Foci to check.
- Returns:
- marginfloat
Positive: the assists do not print; np.inf without assists.
- class pyoptics.litho.opc.FragmentedLayout(layout, max_length=40.0, corner_length=15.0, corner_site=0.75)[source]¶
Bases:
objectTarget polygons with their edges cut into movable fragments.
- Parameters:
- layoutMaskLayout
Target layout made with MaskLayout.from_polygons().
- max_lengthnumber, optional
Longest fragment.
- corner_lengthnumber, optional
Length of the fragments at the ends of an edge. Edges shorter than 2*corner_length are one fragment, edges shorter than 3*corner_length two.
- corner_sitenumber, optional
Position of the site on the end fragments of edges with three or more fragments, as a fraction of the fragment length from the corner (0.5: the midpoint); away from the corner, where the rounding of the printed corner matters less.
- Attributes:
- start, endarrays (n_fragments, 2)
End points of the fragments on the target edges (counterclockwise).
- normalarray (n_fragments, 2)
Outward unit normals.
- sitesarray (n_fragments, 2)
Midpoints, where the EPE is evaluated.
- pyoptics.litho.opc.image_grid(layout, spacing=2.0)[source]¶
Grid of one period for images that
edge_placement_errors()interpolates.- Parameters:
- layoutMaskLayout
Layout periodic in x and y.
- spacingnumber, optional
Largest grid spacing.
- Returns:
- x, y1d arrays
Cell [-pitch/2, pitch/2), periodic.
- pyoptics.litho.opc.sample_image(I, x, y, points)[source]¶
Periodic cubic spline interpolation of an image.
- Parameters:
- I2d array
Image of shape (len(y), len(x)) on the grid of
image_grid().- x, y1d arrays
The grid.
- pointsarray
Points of shape (…, 2) as (x, y).
- Returns:
- valuesarray
Shape points.shape[:-1].
- pyoptics.litho.opc.edge_placement_errors(I, x, y, sites, normals, threshold, bright=False, search=30.0, step=0.25)[source]¶
Edge placement errors of the threshold contour of an image.
- Parameters:
- Iarray (len(y), len(x))
Image (times the dose) on the periodic grid of image_grid().
- x, yarrays
- sites, normalsarrays (n, 2)
Points on the target edges and outward unit normals.
- thresholdnumber
- brightbool, optional
The features are bright (dark field mask).
- searchnumber, optional
Largest distance searched along the normals; an edge that is not found counts as -search (feature missing at the site) or +search.
- stepnumber, optional
Sampling step along the normals.
- Returns:
- array (n,)
Distance of the printed edge from the site along the normal (positive: outside, the printed feature is larger).
- class pyoptics.litho.opc.OPCResult(layout, fragments, offsets, epe, history, x, y, image)¶
Bases:
tupleResult of model_opc().
layout : the corrected MaskLayout; fragments : FragmentedLayout of the target; offsets, epe : arrays (n_fragments,); history : array (iterations + 1, 2) of the largest and the RMS
abs(EPE), starting with the target as the mask; x, y, image : the final image (times the dose) on the grid.- epe¶
Alias for field number 3
- fragments¶
Alias for field number 1
- history¶
Alias for field number 4
- image¶
Alias for field number 7
- layout¶
Alias for field number 0
- offsets¶
Alias for field number 2
- x¶
Alias for field number 5
- y¶
Alias for field number 6
- pyoptics.litho.opc.model_opc(sim, layout=None, threshold=0.3, dose=1.0, focus=0.0, method='jacobian', max_iter=20, damping=0.6, regularization=0.05, corner_weight=0.3, tol=0.25, max_offset=None, max_length=40.0, corner_length=15.0, corner_site=0.75, spacing=2.0, search=30.0, imager='hopkins', energy=0.999)[source]¶
Model-based OPC: move the fragments of the target edges until the printed edges (threshold model) are on the target.
- Parameters:
- simLithoSimulation
Stack, illumination, projector and wafer stack.
- layoutMaskLayout, optional
Target made with MaskLayout.from_polygons() (default: the layout of sim).
- threshold, dose, focusnumbers, optional
Threshold model at this dose and focus.
- method“jacobian” or “local”, optional
“local”: every fragment is moved against its own EPE, offset -= damping*EPE (fragments do not know about each other). “jacobian”: the response of all EPEs to all fragment moves (the Jacobian, a MEEF matrix, by finite differences of the target) is computed once for the target, and the moves solve the regularized least squares problem
min |W*(EPE + J*move)|**2 + mu*|offset + move|**2(W: weights of the sites, corner_weight for the corner fragments; mu: regularization times the mean of diag(J^T W**2 J)), damped by damping. The regularization keeps the mask close to the target where the EPEs hardly depend on the moves (e.g. alternating moves of short fragments). This handles the cross talk of short fragments (line ends, corners) and targets that cannot be reached everywhere (rounded corners). Updating the Jacobian on the way does not help: the EPEs near the corners are not smooth functions of the moves.- max_iterint, optional
- dampingnumber, optional
Fraction of the computed move applied per iteration.
- regularization, corner_weightnumbers, optional
See method.
- tolnumber, optional
Stop when every
abs(EPE)is below tol.- max_offsetnumber, optional
Largest
abs(offset)of a fragment (default: 2*corner_length).- max_length, corner_length, corner_sitenumbers, optional
Fragmentation, see FragmentedLayout.
- spacingnumber, optional
Grid spacing of the images.
- searchnumber, optional
Search range of the edges along the normals.
- imager“abbe”, “hopkins” or “socs”, optional
Abbe imaging of every mask, or the TCC of the target (exact for thin masks) or its SOCS kernels (energy fraction kept: energy).
- energynumber, optional
- Returns:
- OPCResult