Tutorial 7a - 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))
../_images/examples_Tutorial_7a_Lithographic_Projection_System_6_0.png
  1. 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)
../_images/examples_Tutorial_7a_Lithographic_Projection_System_8_0.png

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)
../_images/examples_Tutorial_7a_Lithographic_Projection_System_17_0.png

This is a significant improvement over the initial design. We plot the diffraction limit as a reference.

  1. 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)
../_images/examples_Tutorial_7a_Lithographic_Projection_System_20_0.png
[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()
../_images/examples_Tutorial_7a_Lithographic_Projection_System_22_0.png
[12]:
fan = analysis.RayFan(lens)
fan.view()
../_images/examples_Tutorial_7a_Lithographic_Projection_System_23_0.png
  1. 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 |
+----+----------+------------+-------------+------------+---------+-----------------+