第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环境,建一个虚拟环境
- 写一个函数,模拟计算光刻机的曝光剂量
- 用字典存一份完整的recipe参数