第1章:Python基础回顾

各位同学,欢迎来到S207D光刻机自动化编程的第一课。

说实话,Python这门语言,在半导体设备自动化里越来越重要了。我入行那会儿,大家还在用Tcl和Perl写脚本,现在新项目基本都转向Python了。为什么?因为Python的库太丰富了,处理数据、控制硬件、做界面,一套搞定。

1.1 Python环境配置

先说说环境配置。我个人习惯用Anaconda来管理Python环境,尤其是在工控机上,多个项目共存是常事。

推荐配置:

  • Python 3.8 或 3.9(稳定,兼容性好)
  • IDE:VS Code 或 PyCharm
  • 包管理器:pip 或 conda

我记得有一次,现场工程师在光刻机上位机上装了Python 3.12,结果一堆旧库不兼容,折腾了两天才回退。嗯,这里要注意:工控环境别追新,稳定第一。

我的小技巧:用虚拟环境隔离项目。每个光刻机recipe对应一个虚拟环境,互不干扰。

# 创建虚拟环境
conda create -n litho_env python=3.8

# 激活环境
conda activate litho_env

# 安装常用库
pip install numpy pandas pyserial pyvisa

1.2 基本语法回顾

Python的语法,说白了就是「简洁」二字。没有大括号,靠缩进。刚开始写C++转过来的同事可能会不习惯,但用久了就知道,这其实是在逼你写出整洁的代码。

变量和数据类型这块,我直接上例子:

# 变量赋值,动态类型
wafer_count = 25          # 整数
exposure_time = 2.5       # 浮点数
recipe_name = "Layer_3"   # 字符串
is_ready = True           # 布尔值

# 字符串拼接,我常用f-string
print(f"当前晶圆数量:{wafer_count},曝光时间:{exposure_time}s")

避坑指南:我曾经在项目中遇到过,因为浮点数精度问题导致曝光时间计算偏差。比如0.1+0.2不等于0.3,这在精密控制里是致命的。建议用Decimal模块处理关键数值。

1.3 数据结构:列表与字典

这两个数据结构,在光刻机自动化里用得最多。列表存序列数据,字典存键值对。

列表(List)

# 晶圆批次列表
wafers = ["W01", "W02", "W03", "W04", "W05"]

# 访问元素
print(wafers[0])    # 第一个
print(wafers[-1])   # 最后一个

# 切片操作
batch = wafers[1:4]  # 取中间三个

# 列表推导式,快速生成
exposure_times = [2.0 + i*0.1 for i in range(5)]
print(exposure_times)  # [2.0, 2.1, 2.2, 2.3, 2.4]

字典(Dict)

字典这东西,说白了就是「标签-内容」的对应关系。我习惯用它来存recipe参数。

# 光刻工艺参数
recipe = {
    "name": "Layer_3",
    "exposure_dose": 25.0,      # mJ/cm²
    "focus_offset": 0.0,        # μm
    "alignment": "global",
    "wafer_size": 300           # mm
}

# 访问值
print(recipe["exposure_dose"])

# 修改值
recipe["exposure_dose"] = 26.5

# 遍历字典
for key, value in recipe.items():
    print(f"{key}: {value}")

实用技巧:用字典存设备状态,比用列表清晰多了。比如:stage_status = {"x": 125.3, "y": -45.2, "z": 0.0, "theta": 0.5}

1.4 函数与模块

函数,就是把一段逻辑封装起来,方便复用。模块,就是把相关函数打包成一个文件。

定义函数

def calculate_exposure_time(dose, intensity):
    """
    计算曝光时间
    :param dose: 曝光剂量 (mJ/cm²)
    :param intensity: 光强 (mW/cm²)
    :return: 曝光时间 (s)
    """
    if intensity <= 0:
        raise ValueError("光强必须大于0")
    return dose / intensity

# 调用函数
time = calculate_exposure_time(25.0, 10.0)
print(f"曝光时间:{time:.2f}s")

你想想看,如果每次都要手算曝光时间,不仅慢还容易出错。封装成函数,一劳永逸。

模块化编程

我建议把设备控制相关的函数单独放一个模块。比如建一个 litho_utils.py

# litho_utils.py
def move_stage(x, y, z):
    """移动工件台到指定位置"""
    # 这里写控制代码
    pass

def set_exposure_params(dose, focus):
    """设置曝光参数"""
    # 这里写控制代码
    pass

def check_system_status():
    """检查系统状态"""
    # 这里写检查代码
    pass

然后在主程序里导入:

from litho_utils import move_stage, set_exposure_params

# 使用
move_stage(100.0, 50.0, 0.0)
set_exposure_params(25.0, 0.0)

注意:模块名不要和标准库重名。我曾经见过有人把文件命名为 time.py,结果把Python自带的time模块覆盖了,排查了半天。

知识体系总览

下面这张图,是我梳理的本章知识结构。你可以把它当作一个地图,随时回来对照。

Python基础回顾 - 知识体系 环境配置 Anaconda管理 虚拟环境隔离 Python 3.8/3.9 VS Code / PyCharm 基本语法 变量与数据类型 缩进规则 f-string格式化 浮点数精度注意 数据结构 列表:序列数据 字典:键值对 切片操作 列表推导式 函数与模块 函数封装 参数与返回值 模块化编程 导入与命名空间 应用场景:光刻机自动化流程编程 四个模块环环相扣,最终服务于光刻机自动化编程

好了,这一章的内容就这些。环境配好,语法过一遍,数据结构和函数模块心里有数,后面写自动化脚本就顺手多了。

课后练习建议:

  1. 配好Python环境,建一个虚拟环境
  2. 写一个函数,模拟计算光刻机的曝光剂量
  3. 用字典存一份完整的recipe参数

专注资料整理