Tutorial 4e: Design of a Lithographic Projection System
This tutorial demonstrates how Optiland can be used to analyze and optimize a lithographic projection lens. The starting point for this design is based on U.S. Patent #5831776.
[1]:
import numpy as np
from optiland import analysis, materials, mtf, optic, optimization, wavefront
The lens is designed for a wavelength of 248 nm and only uses silica lenses. Note that the lens is telecentric in object space. This only forces the chief ray in object space to be parallel with the optical axis. It does not directly enforce that the chief ray passes through the center of the aperture stop.
[ ]:
lens = optic.Optic()
# We define SiO2 with the index of refraction at 248 nm
SiO2 = materials.IdealMaterial(n=1.5084, k=0)
# Define all surfaces
lens.surfaces.add(index=0, radius=np.inf, thickness=110.85883544)
lens.surfaces.add(index=1, radius=-737.7847, thickness=27.484, material=SiO2)
lens.surfaces.add(index=2, radius=-235.2891, thickness=0.916)
lens.surfaces.add(index=3, radius=211.1786, thickness=36.646, material=SiO2)
lens.surfaces.add(index=4, radius=-461.3986, thickness=0.916)
lens.surfaces.add(index=5, radius=412.6778, thickness=21.071, material=SiO2)
lens.surfaces.add(index=6, radius=160.5391, thickness=16.197)
lens.surfaces.add(index=7, radius=-604.1283, thickness=7.215, material=SiO2)
lens.surfaces.add(index=8, radius=218.1877, thickness=23.941)
lens.surfaces.add(index=9, radius=-3586.063, thickness=11.978, material=SiO2)
lens.surfaces.add(index=10, radius=251.8168, thickness=47.506)
lens.surfaces.add(index=11, radius=-85.2817, thickness=11.961, material=SiO2)
lens.surfaces.add(index=12, radius=584.8597, thickness=9.968)
lens.surfaces.add(index=13, radius=4074.801, thickness=35.291, material=SiO2)
lens.surfaces.add(index=14, radius=-162.0185, thickness=0.923)
lens.surfaces.add(index=15, radius=629.544, thickness=41.227, material=SiO2)
lens.surfaces.add(index=16, radius=-226.7397, thickness=0.916)
lens.surfaces.add(index=17, radius=522.2739, thickness=27.842, material=SiO2)
lens.surfaces.add(index=18, radius=-582.424, thickness=0.916)
lens.surfaces.add(index=19, radius=423.729, thickness=22.904, material=SiO2)
lens.surfaces.add(index=20, radius=-1385.36, thickness=0.916, is_stop=True)
lens.surfaces.add(index=21, radius=212.039, thickness=33.646, material=SiO2)
lens.surfaces.add(index=22, radius=802.3695, thickness=55.304)
lens.surfaces.add(index=23, radius=-776.5697, thickness=8.703, material=SiO2)
lens.surfaces.add(index=24, radius=106.1728, thickness=24.09)
lens.surfaces.add(index=25, radius=-200.683, thickness=11.452, material=SiO2)
lens.surfaces.add(index=26, radius=311.8264, thickness=59.54)
lens.surfaces.add(index=27, radius=-77.2276, thickness=11.772, material=SiO2)
lens.surfaces.add(index=28, radius=2317.8032, thickness=11.862)
lens.surfaces.add(index=29, radius=-290.8859, thickness=22.904, material=SiO2)
lens.surfaces.add(index=30, radius=-148.3577, thickness=1.373)
lens.surfaces.add(index=31, radius=-5658.5043, thickness=41.227, material=SiO2)
lens.surfaces.add(index=32, radius=-151.9858, thickness=0.916)
lens.surfaces.add(index=33, radius=678.1005, thickness=32.981, material=SiO2)
lens.surfaces.add(index=34, radius=-358.554, thickness=0.916)
lens.surfaces.add(index=35, radius=264.2734, thickness=32.814, material=SiO2)
lens.surfaces.add(index=36, radius=2309.6884, thickness=0.916)
lens.surfaces.add(index=37, radius=171.2681, thickness=29.015, material=SiO2)
lens.surfaces.add(index=38, radius=364.7765, thickness=0.918)
lens.surfaces.add(index=39, radius=113.37, thickness=76.259, material=SiO2)
lens.surfaces.add(index=40, radius=78.6982, thickness=54.304)
lens.surfaces.add(index=41, radius=49.5443, thickness=18.65, material=SiO2)
lens.surfaces.add(index=42, radius=109.8136, thickness=13.07647896)
lens.surfaces.add(index=43, radius=np.inf)
# Define the aperture (the original NA was 0.15, but we reduce it slightly to avoid
# negative edge thicknesses)
lens.set_aperture(aperture_type="objectNA", value=0.133)
# Define the field
lens.fields.set_type(field_type="object_height")
lens.fields.add(y=0)
lens.fields.add(y=32)
lens.fields.add(y=48)
# Define the wavelength
lens.wavelengths.add(value=0.248, is_primary=True)
# Specify that the lens is object-space telecentric
lens.obj_space_telecentric = True
# Move last surface to the paraxial image plane
lens.image_solve()
[3]:
lens.draw(figsize=(12, 3))
Initial Performance Assessment
Let’s see how close the lens is to diffraction-limited by plotting the MTF:
[4]:
lens_mtf = mtf.FFTMTF(lens)
lens_mtf.view(add_reference=True)
Clearly, the lens is far from the diffraction limit.
[5]:
problem = optimization.OptimizationProblem()
# Add focal length operand
problem.add_operand(operand_type="f2", target=494, weight=1, input_data={"optic": lens})
# Add OPD operands for imaging quality
for field in lens.fields.get_field_coords():
input_data = {
"optic": lens,
"Hx": field[0],
"Hy": field[1],
"num_rays": 5,
"wavelength": 0.248,
"distribution": "gaussian_quad",
}
problem.add_operand(
operand_type="OPD_difference",
target=0,
weight=10,
input_data=input_data,
)
# Allow the radii of curvature of all surfaces to vary
for k in range(1, lens.surfaces.num_surfaces - 1):
problem.add_variable(
lens,
"radius",
surface_number=k,
min_val=-10000,
max_val=10000,
)
# Print current merit function value
problem.merit_info()
+----+------------------------+-------------------+
| | Merit Function Value | Improvement (%) |
|----+------------------------+-------------------|
| 0 | 12.5476 | 0 |
+----+------------------------+-------------------+
We now run the standard optimizer. Note that this may take several minutes for a termination tolerance of 1e-9, but this should result in a high-performing lens.
[6]:
optimizer = optimization.OptimizerGeneric(problem)
res = optimizer.optimize(tol=1e-9)
Printing the merit function result, we can see an improvement of ≈98%.
[7]:
problem.merit_info()
+----+------------------------+-------------------+
| | Merit Function Value | Improvement (%) |
|----+------------------------+-------------------|
| 0 | 0.18312 | 98.5406 |
+----+------------------------+-------------------+
Let’s again view the MTF:
[8]:
lens_mtf = mtf.FFTMTF(lens)
lens_mtf.view(add_reference=True)
This is a significant improvement over the initial design. We plot the diffraction limit as a reference.
Final Performance Assessment
Let’s generate a few visualizations to show the final performance of the system. We will compute:
Wavefront OPD map for the (Hx, Hy) = (0, 1) field & corresponding standard Zernike coefficients
Standard spot diagram
Ray aberration fans
[9]:
opd = wavefront.OPD(lens, field=(0, 1), wavelength=0.248)
opd.view(projection="2d", num_points=256)
[10]:
print("Zernike Standard Coefficients:")
zernike = wavefront.ZernikeOPD(
lens,
(0, 1),
0.55,
zernike_type="standard",
num_terms=21,
)
for k in range(len(zernike.coeffs)):
print(f"\tZ{k + 1}: {zernike.coeffs[k]:.8f}")
Zernike Standard Coefficients:
Z1: 0.01735758
Z2: -0.05168029
Z3: -0.00000000
Z4: -0.00000000
Z5: -0.01909300
Z6: -0.06172758
Z7: -0.01506762
Z8: -0.01705757
Z9: -0.00000000
Z10: -0.00000000
Z11: -0.00000000
Z12: 0.00000000
Z13: -0.01240470
Z14: -0.00315813
Z15: -0.00200293
Z16: -0.00086635
Z17: 0.00089715
Z18: -0.01099649
Z19: 0.00000000
Z20: 0.00000000
Z21: 0.00000000
[11]:
spot = analysis.SpotDiagram(lens)
spot.view()
[12]:
fan = analysis.RayFan(lens)
fan.view()
Conclusions:
Starting from a patent design, we optimized a lithographic projection lens to achieve near diffraction-limited performance
While significantly improved, the final design still has room for improvement. For example, we could have introduced aspheres on some of the surfaces.
As a reference, we print the final optimized lens data:
[15]:
lens.info()
+----+----------+------------+-------------+------------+---------+-----------------+
| | Type | Radius | Thickness | Material | Conic | Semi-aperture |
|----+----------+------------+-------------+------------+---------+-----------------|
| 0 | Planar | inf | 110.859 | Air | 0 | 48 |
| 1 | Standard | -737.785 | 27.484 | 1.5084 | 0 | 62.8764 |
| 2 | Standard | -235.279 | 0.916 | Air | 0 | 63.7129 |
| 3 | Standard | 211.148 | 36.646 | 1.5084 | 0 | 63.6289 |
| 4 | Standard | -461.394 | 0.916 | Air | 0 | 57.6775 |
| 5 | Standard | 412.675 | 21.071 | 1.5084 | 0 | 57.3949 |
| 6 | Standard | 160.56 | 16.197 | Air | 0 | 52.0974 |
| 7 | Standard | -604.128 | 7.215 | 1.5084 | 0 | 48.6269 |
| 8 | Standard | 218.198 | 23.941 | Air | 0 | 47.7977 |
| 9 | Standard | -3586.06 | 11.978 | 1.5084 | 0 | 46.314 |
| 10 | Standard | 251.823 | 47.506 | Air | 0 | 45.8739 |
| 11 | Standard | -85.3358 | 11.961 | 1.5084 | 0 | 47.6413 |
| 12 | Standard | 584.873 | 9.968 | Air | 0 | 50.187 |
| 13 | Standard | 4074.8 | 35.291 | 1.5084 | 0 | 53.8219 |
| 14 | Standard | -162.051 | 0.923 | Air | 0 | 62.1964 |
| 15 | Standard | 629.532 | 41.227 | 1.5084 | 0 | 62.3467 |
| 16 | Standard | -226.686 | 0.916 | Air | 0 | 65.4205 |
| 17 | Standard | 522.268 | 27.842 | 1.5084 | 0 | 65.3891 |
| 18 | Standard | -582.418 | 0.916 | Air | 0 | 63.5819 |
| 19 | Standard | 423.728 | 22.904 | 1.5084 | 0 | 63.4414 |
| 20 | Standard | -1385.36 | 0.916 | Air | 0 | 59.9561 |
| 21 | Standard | 212.068 | 33.646 | 1.5084 | 0 | 59.9823 |
| 22 | Standard | 802.37 | 55.304 | Air | 0 | 57.4136 |
| 23 | Standard | -776.571 | 8.703 | 1.5084 | 0 | 53.0568 |
| 24 | Standard | 106.107 | 24.09 | Air | 0 | 52.8027 |
| 25 | Standard | -200.677 | 11.452 | 1.5084 | 0 | 57.8364 |
| 26 | Standard | 311.82 | 59.54 | Air | 0 | 60.5352 |
| 27 | Standard | -77.2254 | 11.772 | 1.5084 | 0 | 87.5769 |
| 28 | Standard | 2317.8 | 11.862 | Air | 0 | 95.6209 |
| 29 | Standard | -290.882 | 22.904 | 1.5084 | 0 | 108.096 |
| 30 | Standard | -148.471 | 1.373 | Air | 0 | 126.934 |
| 31 | Standard | -5658.5 | 41.227 | 1.5084 | 0 | 128.041 |
| 32 | Standard | -151.964 | 0.916 | Air | 0 | 150.384 |
| 33 | Standard | 678.099 | 32.981 | 1.5084 | 0 | 150.672 |
| 34 | Standard | -358.55 | 0.916 | Air | 0 | 155.075 |
| 35 | Standard | 264.261 | 32.814 | 1.5084 | 0 | 155.058 |
| 36 | Standard | 2309.69 | 0.916 | Air | 0 | 148.167 |
| 37 | Standard | 171.243 | 29.015 | 1.5084 | 0 | 147.906 |
| 38 | Standard | 364.78 | 0.918 | Air | 0 | 133.993 |
| 39 | Standard | 113.324 | 76.259 | 1.5084 | 0 | 133.501 |
| 40 | Standard | 78.7098 | 54.304 | Air | 0 | 76.0959 |
| 41 | Standard | 49.5982 | 18.65 | 1.5084 | 0 | 41.1269 |
| 42 | Standard | 109.823 | 13.1392 | Air | 0 | 27.9527 |
| 43 | Planar | inf | nan | Air | 0 | 15.6533 |
+----+----------+------------+-------------+------------+---------+-----------------+