Skip to content

SProcess Ch15:Python 接口

> 来源:sprocess_ug.pdfSentaurus Process User Guide, W-2024.09) > 章节范围:Chapter 15,文档目录页标注约 p.991–1000(PDF 物理页约 991–1000)

章节导读

本章讨论 Sentaurus Process Python 模块原型版本的用法。本章描述的接口受变更影响,需要单独的许可证(参见附录 B)。

15.1 Python 接口概述

除了传统的 Tcl 解释器外,Sentaurus Process 的仿真功能还可用作 Python 模块,可以加载到通用 Python shell(gpythonsh)中(参见 Sentaurus™ Workbench User Guide 中的 gpythonsh)。您可以使用 Python 接口创建高级仿真流程,利用可用的 Python 包和框架环境。

Sentaurus Process Python 接口具有提供所有 Tcl 解释器功能的类 SP,但使用原生 Python 命令。此外,接口提供在内存中导入和导出 TDR 对象的命令,用于与 TCAD Python 环境中可用的其他 Python 模块通信。接口还提供一个专用命令,允许您选择继续使用 Tcl 语法或 Python 语法。

Python 接口可以交互式使用,也可以通过将带有 Sentaurus Process 命令的 Python 脚本传递给 gpythonsh 以批处理模式运行:

bash
gpythonsh <Sentaurus_Process_Python_command_script>

为了获得更丰富的体验,您还可以通过 IPython 交互式使用 Python 接口(作为 gpythonsh 的一部分分发):

bash
gpythonsh -m IPython

使用 Python 脚本从命令行运行的仿真输出不会捕获到日志文件中,这与 Tcl 解释器不同。但是,Sentaurus Workbench 通过捕获标准输出并将其保存到 .out 文件中来正确保存日志文件。

要在 Python 接口中加载 Sentaurus Process Python 模块,请使用以下命令:

python
import sprocess

15.2 Python 命令语法

Sentaurus Process Python 接口定义了类 SP。工艺仿真步骤作为此类的方法实现。要在 Python 接口中执行工艺仿真,必须首先创建 SP 类对象,然后对该 SP 对象调用方法。SP 类对象可以通过以下方式创建:

python
sp = sprocess.SP()

> 注意: > 可以在 Python 接口中创建多个 SP 对象,且对象相互独立。但是,不支持删除 SP 对象,这意味着现有 SP 对象不能被新对象覆盖。

Tcl 语法与 Python 语法的差异

Python 版本命令使用的语法与 Tcl 语法相似,因为命令参数由参数及其值列表组成。区别在于 Python 在指定值的方式上有一些小差异(参见表 100)。

表 100 Tcl 语法与 Python 语法差异总结

类型Tcl 语法Python 语法
Booleanarg, !arg, arg=0, arg=1, arg=true, arg=falsearg=True, arg=False
字符串赋值arg = string, arg = "string"arg="string"
列表arg= {el1 el2 ... eln}arg=[el1, el2,..., eln]
单位arg=value<unit>arg=(value,'unit'), arg=value*qupy.Unit
命令/参数/选项名称plot.xy, normal.growth.ratio, report.locationplot_xy, normal_growth_ratio, report_location

> 注意: > 命令、参数、选项和变量名在 Python 语法中不能包含点,因为点符号在 Python 中有特殊含义。所有在 Tcl 中有点的命令和变量在 Python 等效中都将用下划线书写。

单位

参数数据库(PDB)单位可以在 Python 接口中以 (value,'unit') 的形式使用,其中 'unit' 是 PDB 中的单位。例如:

python
sp.line(X=True, location=(0.0,'um'), tag="SubTop")

除了 PDB 单位外,Sentaurus Process Python 接口还通过 qupy Python 模块支持单位。这允许在 TCAD Python 框架中一致地处理单位。

您可以使用以下命令导入 qupy 模块:

python
from qupy import *

在 qupy 模块中,单位由 Unit 对象表示,物理量由 Quantity_double 对象表示。Unit 对象有标准单位名称。例如,微米表示为 um

物理量同时具有值和单位。您可以使用 Quantity_double(value,'qupy.Unit') 方法或通过将值乘以 Unit 对象来创建 Quantity_double 对象。例如:

python
lg=Quantity_double(2, 'um')
lg=3.0*um

您可以将 Quantity_double 对象作为参数传递给 SP 对象的方法。例如:

python
sp.line(X=True, location=0.0*um, spacing=0.1*um, tag="SubTop")

> 注意: > 所有 qupy 单位等效于 PDB 中的单位,但 qupy 中的 "C" 对应 PDB 中的 "Coulomb",qupy 中的 "Cel" 对应 PDB 中的 "C"。

15.3 Python 接口命令

Availability of Tcl Commands in Python Interface

Tcl 接口中可用的所有命令在 Python 接口中也可用。在 Python 接口中,它们作为 SP 对象的方法实现。要执行命令,只需对 SP 对象执行相应的方法。例如:

python
sp.init(field="Boron", concentration=1.34e+14, DelayFullD=False)

Tcl 接口中的命令可分为两类:原生命令和实用命令(通过 Tcl 过程实现)。

在 Python 接口中,原生命令使用变量参数列表来指定参数。参数可以是全部关键字参数、全部位置参数,或位置参数列表后跟关键字参数列表。您可以使用 nativeCommands 命令显示原生命令列表。

对于实用命令,语法是字符串参数列表。例如:

python
sp.pdbSet("Grid", "Contacts.In.Brep", "1")

Additional Commands in Python Interface

本节讨论在 Python 接口中引入的命令。

getTdr and setTdr

getTdrsetTdr 命令允许您在仿真流程期间与其他模块交换内存中的 TDR 对象。setTdr 命令的行为类似于 init 命令,因为它接受 init 命令的所有可用参数(除了 tdr 参数),现在 tdr 参数是内存中的 TDR 对象。第一个参数是内存中的 TDR 对象(必需)。其余参数是其他 init 命令参数(可选)。

getTdr 命令的行为类似于 struct 命令,因为它接受 struct 命令的所有可用参数。它返回 TDR 对象而不是保存 TDR 文件。

必须指定 tdrtdr_bndtdr_spx 参数之一:

  • 如果指定 tdr 参数,命令返回包含结构、仿真网格和其他信息的 TDR 对象
  • 如果指定 tdr_bnd 参数,命令返回仅包含边界表示(brep)的 TDR 对象
  • 如果指定 tdr_spx 参数,命令返回具有几何列(GC)结构的 TDR 对象

例如:

python
tdrObject = sp.getTdr(tdr=1)
sp.setTdr(tdrObject)

getTdrBrep

getTdrBrep 命令返回仅包含 brep 的 TDR 对象。它不接受任何参数。例如:

python
tdrObject = sp.getTdrBrep()

getTdrGc

getTdrGc 命令返回与 Sentaurus Process Explorer 兼容的 GC 表示的 TDR 对象。它不接受任何参数。例如:

python
tdrObject = sp.getTdrGc()

loadTdr

loadTdr 命令允许您在仿真流程期间从其他模块加载内存中的 TDR 对象。例如:

python
sp.loadTdr(tdrObject, sum=True)

nativeCommands

nativeCommands 命令返回可用原生 Sentaurus Process 命令的列表。例如:

python
sp.nativeCommands()

readTdrFromFile and writeTdrToFile

这些命令提供直接读写内存中 TDR 对象的功能:

python
tdrObj = sp.readTdrFromFile("infile.tdr")
sp.writeTdrToFile(tdrObj,"outfile.tdr")

setOptions

setOptions 命令提供设置和取消设置 SP 对象以在语法检查仅模式下工作的功能。例如:

python
sp.setOptions(syntaxCheckOnly=True)

tclConverter

tclConverter 命令帮助您获取 Tcl 命令的相应 Python 语法。它接受 Tcl 脚本文件作为字符串参数,并以 Python 语法输出命令。例如:

python
sp.tclConverter("test.cmd")

> 警告: > 不要直接使用 tclConverter 命令的输出。在 Python 接口中使用前,请仔细检查并进行调整。

tclEval

tclEval 命令允许您使用 Tcl 语法运行命令。例如:

python
sp.tclEval("init field=Boron concentration=1.34e+14 !DelayFullD")

Return Values

Python 接口中的许多 Sentaurus Process 命令可以返回依赖于所执行选项的结果。根据返回值,结果可以是 Tcl 语法的列表或字符串。字符串值可以通过简单转换结果来转换为 Python 原生类型。列表可以使用索引切片来获取正确的组件。例如:

python
AsDose=float(sp.layers("Silicon", name='Arsenic', y=1.5)[1][2])

对于某些命令(主要是最初通过 Tcl 实现的命令),返回值(如果有)直接以 Python 原生类型返回。例如,pdbGetDoubleCutLine2D 返回双精度值,pdbGetBoolean 返回布尔值。

15.4 Python 输入文件示例

以下示例说明 Python 输入文件。

python
import sprocess          # 导入 sprocess Python 模块
from qupy import *        # 导入 qupy 模块

sp = sprocess.SP()       # 创建 SP 实例

sp.AdvancedCalibration()
sp.pdbSetDouble("Mechanics", "RefThExpCoeff", "0")

sp.math(coord_ucs=True)  # 布尔参数
sp.math(numThreads=1)

# 使用 PDB 单位
sp.line(X=True, location=(0.00,'um'), spacing=(0.100,'um'), tag="SubTop")

# 使用 qupy 单位
sp.line(X=True, location=1.00*um, spacing=0.100*um)

sp.line(X=True, location=(2.00,'um'), spacing=(0.700,'um'), tag="SubBottom")
sp.line(Y=True, location=(0.00e+00,'um'), spacing=(1.00,'um'), tag="SubLeft")
sp.line(Y=True, location=(10.00,'um'), spacing=(1.00,'um'), tag="SubRight")

# 参数名称中的点替换为下划线
sp.mgoals(accuracy=(2.00e-05,'um'),
          min_normal_size=(50.00,'nm'),
          normal_growth_ratio=2.0,
          max_lateral_size=(6.00,'um'))

sp.region(xlo="SubTop", xhi="SubBottom",
          ylo="SubLeft", yhi="SubRight", Silicon=True)

sp.init(concentration=(1.00e+15,'cm-3'), field="Boron")

# 字符串值列表
sp.deposit(time=(1.00,'min'), type="isotropic",
           rate=(0.0250,'um/min'), material=["Oxide"])

sp.implant("Antimony", energy=(100.00,'keV'), dose=(1.50e+15,'cm-2'))

sp.etch(time=(1.00,'min'), rate=(0.0300,'um/min'),
        type="anisotropic", material=["Oxide"])

sp.diffuse(time=(0.01,'min'), temperature=(1100.00,'C'))

sp.struct(tdr="out")

sp.SetPlxList("{BTotal SbTotal}")
sp.WritePlx("out_fps.plx", "y=5.0")

# 通过 tclEval 使用 Tcl 语法
sp.tclEval("WritePlx out_fps1.plx y=2.0")

15.5 TDR Python 模块

TDR Python 模块允许您在仿真流程中的工具之间交换内存中的 TDR 对象,并提供查询命令以查询内存中 TDR 对象的基本几何信息。

大多数 TCAD 工具默认加载此模块。要在 gpythonsh 中手动加载 TDR Python 模块,请使用:

python
import tdr

Query Methods

TDR Python 模块由两个类组成:CollectionGeometry

Collection 类提供的方法:

  • from_path 方法:直接从输入 TDR 文件创建 TDR 对象
  • number_of_geometries 属性:返回 TDR 对象中的几何数量
  • Geometry 方法:返回 TDR 对象中包含的 Geometry 对象

例如:

python
tdrObj = tdr.Collection.from_path("infile.tdr")
n = tdrObj.number_of_geometries
geo = tdrObj.Geometry(geoIndex)

Geometry 类提供的查询方法:

查询方法描述
geo.bounding_box返回两个边界框角的坐标列表(µm):[[xmin, ymin, zmin], [xmax, ymax, zmax]]
geo.contacts返回几何中的接触名称列表:['contact1', 'contact2', ...]
geo.coordinate_system返回坐标系方向:"UCS"(x轴指向晶圆内部)或 "DFISE"(x轴指向晶圆外部)
geo.dimension返回几何的维度
geo.materials返回几何中使用的材料名称列表
geo.name返回几何的名称
geo.number_of_regions返回几何中的区域数量
geo.number_of_vertices返回几何中的顶点数。对于 GC 结构返回 0
geo.nx返回 GC 结构中 x 列的大小。对于非 GC 结构返回 0
geo.ny返回 GC 结构中 y 列的大小。对于非 GC 结构返回 0
geo.regions返回区域名称及其关联材料名称的列表
geo.transformation_matrix返回变换矩阵分量格式的双精度列表
geo.translation_vector返回翻译向量的双精度列表格式
geo.type返回几何类型:"Boundary"(边界结构)、"GC"(几何列结构)或 "Grid"(网格结构)

15.6 最小可执行示例

python
#!/usr/bin/env gpythonsh
# ch15_min_python.cmd

import sprocess
from qupy import *

# 创建 SP 实例
sp = sprocess.SP()

# 设置初始结构
sp.line(X=True, location=(0.0,'um'), spacing=(0.1,'um'), tag="top")
sp.line(X=True, location=(1.0,'um'), spacing=(0.1,'um'), tag="bot")
sp.region(xlo="top", xhi="bot", Silicon=True)

# 初始化
sp.init(field="Boron", concentration=(1.0e15,'cm-3'))

# 执行工艺步骤
sp.deposit(time=(1.0,'min'), type="isotropic",
           rate=(0.05,'um/min'), material=["Oxide"])

sp.etch(time=(1.0,'min'), rate=(0.03,'um/min'),
        type="anisotropic", material=["Oxide"])

sp.diffuse(time=(30.0,'min'), temperature=(900.0,'C'))

# 保存结构
sp.struct(tdr="out/ch15_m1")

# 获取 TDR 对象
tdrObj = sp.getTdr(tdr=1)

# 查询几何信息
print("Bounding Box:", tdrObj.Geometry(0).bounding_box)
print("Materials:", tdrObj.Geometry(0).materials)

15.7 关键参数速查表

类别参数/命令作用示例
导入模块import sprocess导入 sprocess Python 模块-
创建实例sprocess.SP()创建 SP 类实例sp = sprocess.SP()
布尔参数arg=True/False替代 Tcl 的 !argDelayFullD=False
列表参数arg=[val1, val2]Tcl 的 {val1 val2}material=["Oxide"]
PDB 单位arg=(value,'unit')带单位的值location=(0.0,'um')
qupy 单位arg=value*um使用 qupy 单位location=0.0*um
TDR 对象getTdr/setTdr内存 TDR 交换sp.getTdr(tdr=1)
Tcl 转换tclConverterTcl 转 Pythonsp.tclConverter("a.cmd")
Tcl 执行tclEval执行 Tcl 命令sp.tclEval("init...")

15.8 常见问题与诊断步骤

问题 1:无法导入 sprocess 模块

诊断步骤:

  1. 确认已安装 Sentaurus Process Python 接口许可证
  2. 验证 gpythonsh 路径是否正确设置
  3. 检查 Python 环境变量

问题 2:命令语法错误

诊断步骤:

  1. 确认所有点已替换为下划线(如 normal_growth_ratio
  2. 检查布尔值使用 True/False 而非 true/false
  3. 确认列表使用方括号 [] 而非大括号 {}

问题 3:单位不识别

诊断步骤:

  1. 确认使用 (value,'unit') 格式或 value*qupy.Unit
  2. 检查 qupy 单位导入是否正确
  3. 验证 PDB 单位名称拼写正确

问题 4:Tcl 到 Python 转换失败

诊断步骤:

  1. 手动检查 tclConverter 输出
  2. 注意变量和流程控制指令需要手动转换
  3. 使用 tclEval 作为后备方案

相关链接

基于 Sentaurus TCAD 官方文档构建

代码块