Skip to content

Tcl 接口

NOTE

原文来源:Sentaurus Data Explorer User Guide, Version W-2024.09, Synopsys, Inc. PDF 源页码:第 3 章,对应 PDF 第 30–121 页

Tcl 接口概述

Sentaurus Data Explorer 的 Tcl 接口基于工具命令语言(Tcl)。TDX 的输入脚本实际上就是 Tcl 脚本,因此具有 Tcl 的全部灵活性。

使用 Tcl 接口可以:

  • 从 TDR 文件中提取和处理信息
  • 修改 TDR 文件中的特定条目,如材料和数据集的名称
  • 使用标签(Tag)向 TDR 文件中的对象添加自定义信息

NOTE

在编写脚本之前,需要先了解 TDR 文件结构。TDR 文件结构说明见附录 B。


使用 Tcl 接口

运行 Tcl 脚本

bash
tdx -tcl script.tcl

运行单个 Tcl 命令

bash
tdx -tclcmd TdrFileOpen tdr_file.tdr

访问命令行参数

TDX 在 Tcl 数组 cmd_args 中提供命令行参数:

变量说明
$cmd_args(all)完整的命令行参数,包括可执行文件名
$cmd_args(rest)-tcl、脚本文件名和可执行文件名外的所有参数
$cmd_args(-tcl)Tcl 脚本文件名

循环中删除条目

在循环中调用删除函数时,必须按反向顺序遍历条目

tcl
for { set index N-1 } { $index >= 0 } { incr index -1 } {
    TdrStateDelete ... $index ...
}

这是因为删除后,剩余的条目会被重新索引。

WARNING

按正向顺序遍历会导致未定义行为。


示例脚本

提取文件头信息

tcl
set f myfile.tdr
puts "file: $f"
TdrFileOpen $f

# 遍历几何体
set ng [TdrFileGetNumGeometry $f]
puts "#geometries: $ng"
for {set ig 0} {$ig < $ng} {incr ig} {
    set gname [TdrGeometryGetName $f $ig]
    set ns [TdrGeometryGetNumState $f $ig]
    set nr [TdrGeometryGetNumRegion $f $ig]

    puts "   geometry $ig: $gname"
    puts "      type      : [TdrGeometryGetType $f $ig]"
    puts "      dimension: [TdrGeometryGetDimension $f $ig]"
    puts "      transform: [TdrGeometryGetTransform $f $ig]"
    puts "      shift     : [TdrGeometryGetShift $f $ig]"
    puts "      #states : $ns"

    # 遍历状态
    for {set is 0} {$is < $ns} {incr is} {
        set sname [TdrStateGetName $f $ig $is]
        puts "   state $is: $sname"
    }

    puts "      #regions: $nr"
    # 遍历区域
    for {set ir 0} {$ir < $nr} {incr ir} {
        set rname [TdrRegionGetName $f $ig $ir]
        puts "   region $ir: $rname"
    }
}
TdrFileClose $f

修改数据值

tcl
set inp original.tdr
set out modified.tdr
TdrFileOpen $inp

# 遍历几何体
set ng [TdrFileGetNumGeometry $inp]
for {set ig 0} {$ig < $ng} {incr ig} {
    set ns [TdrGeometryGetNumState $inp $ig]
    set nr [TdrGeometryGetNumRegion $inp $ig]

    # 遍历状态
    for {set is 0} {$is < $ns} {incr is} {
        # 遍历区域
        for {set ir 0} {$ir < $nr} {incr ir} {
            # 遍历数据集
            set nd [TdrRegionGetNumDataset $inp $ig $ir $is]
            for {set id 0} {$id < $nd} {incr id} {
                # 遍历数据值
                set nv [TdrDatasetGetNumValue $inp $ig $ir $is $id]
                for {set iv 0} {$iv < $nv} {incr iv} {
                    set ni [TdrDataGetNumRow $inp $ig $ir $is $id $iv]
                    set nj [TdrDataGetNumCol $inp $ig $ir $is $id $iv]
                    for {set i 0} {$i < $ni} {incr i} {
                        for {set j 0} {$j < $nj} {incr j} {
                            set original [TdrDataGetComponent $inp $ig $ir $is $id $iv $i $j]
                            set modified [expr $original + 1]
                            TdrDataSetComponent $inp $ig $ir $is $id $iv $i $j $modified
                        }
                    }
                }
            }
        }
    }
}
TdrFileSave $inp $out
TdrFileClose $inp

打印标签

tcl
set f myfile.tdr
set recursive 1

proc PrintTagGroup {tg indent recursive} {
    set space [format "% ${indent}s" ""]
    set nt [TdrTagGroupGetNumTag $tg]
    set ng [TdrTagGroupGetNumTagGroup $tg]

    if {$ng > 0 || $nt > 0} {
        puts "${space}tag group: \'[TdrTagGroupGetName $tg]\'"
        puts "${space}    contains $ng tag groups and $nt tags"

        # 列出标签
        for {set it 0} {$it < $nt} {incr it} {
            set struc [TdrTagGetStructure $tg $it]
            set type [TdrTagGetType $tg $it]
            puts "${space}    tag $it:"
            puts "${space}       name: [TdrTagGetName $tg $it]"
            puts "${space} structure: $struc"
            puts "${space}       type: $type"
            if {$struc == "scalar"} {
                puts "${space} value: [TdrTagGetValue $tg $it]"
            } else {
                puts "${space}    rows: [TdrTagGetNumRow $tg $it]"
                puts "${space}    cols: [TdrTagGetNumCol $tg $it]"
            }
        }

        # 列出标签组
        for {set ig 0} {$ig < $ng} {incr ig} {
            set tgi [TdrTagGroupGetTagGroup $tg $ig]
            if {$recursive} {
                PrintTagGroup $tgi [expr $indent + 3] $recursive
            } else {
                puts "${space} tag group $ig: \'[TdrTagGroupGetName $tgi]\'"
            }
        }
    }
}

TdrFileOpen $f
puts "file $f"
PrintTagGroup [TdrFileGetTagGroup $f] 3 $recursive

# 遍历几何体
set ng [TdrFileGetNumGeometry $f]
for {set ig 0} {$ig < $ng} {incr ig} {
    set gname [TdrGeometryGetName $f $ig]
    puts "    geometry $ig: $gname"
    PrintTagGroup [TdrGeometryGetTagGroup $f $ig] 6 $recursive
}
TdrFileClose $f

Tcl 接口限制

  • 不支持复数:包含复数值的数据集无法读取或修改
  • 不支持几何坐标访问:无法访问顶点、边、元素的几何坐标
  • 只能创建标签和标签组:创建其他新数据是不可能的

函数分类

Tcl 接口函数分为以下几类:

类别说明
文件相关函数文件的打开、保存、关闭和转换
几何相关函数几何体的名称、类型、维度、变换矩阵
状态相关函数状态的管理和查询
区域相关函数区域的材料、名称、类型
数据集相关函数数据集的名称、数量、单位
数据值相关函数数据值的读取和修改
标签组相关函数标签组的层次结构管理
标签相关函数标签的创建和修改

NOTE

大多数函数使用整数参数按索引指定列表条目。索引从零开始,即第一个条目的索引为 0。


文件相关函数

TdrFileClose

关闭 TDR 文件,不保存任何修改。

tcl
TdrFileClose <filename>

返回值:Boolean — 成功关闭返回 TRUE,否则返回 FALSE

tcl
TdrFileClose file1.tdr

TdrFileConvert

转换文件格式,语法与命令行接口相同。

tcl
TdrFileConvert <convert-command> [parameter] <source-file> [<destination-file>]

返回值:Boolean — 转换成功返回 TRUE,否则返回 FALSE

tcl
TdrFileConvert -mtt -y tdr_file.tdr tdr_mirr.tdr

TdrFileGetNumGeometry

返回文件中的几何体数量。

tcl
TdrFileGetNumGeometry <filename>

返回值:Integer — 几何体数量;出错时返回负值

tcl
set file1_num_geom [TdrFileGetNumGeometry file1.tdr]

TdrFileGetTagGroup

返回文件的标签组句柄。

tcl
TdrFileGetTagGroup <filename>

返回值:Handle — 用于标签组相关函数

tcl
set tg [TdrFileGetTagGroup file1.tdr]

TdrFileOpen

打开 TDR 文件。使用文件前必须先调用此命令

tcl
TdrFileOpen <filename> [-native_units] [-reference_coordinates]
选项说明
-native_units不进行单位缩放,按原始单位读取数据
-reference_coordinates将坐标和矢量数据集转换为参考坐标系

返回值:Boolean — 成功打开返回 TRUE,否则返回 FALSE

tcl
TdrFileOpen file1.tdr -native_units

TdrFileSave

保存文件的所有更改。

tcl
TdrFileSave <filename> [<new_filename>]

返回值:Boolean — 成功保存返回 TRUE,否则返回 FALSE

tcl
TdrFileSave file1.tdr file1_copy.tdr
TdrFileSave file2.tdr

几何相关函数

TdrGeometryDelete

删除指定几何体。

tcl
TdrGeometryDelete <filename> <geometry_index>

WARNING

在循环中调用时,必须按反向顺序遍历。

tcl
TdrGeometryDelete file1.tdr 1

TdrGeometryGetDimension

返回几何体的维度。

tcl
TdrGeometryGetDimension <filename> <geometry_index>

返回值:Integer — 几何体维度

tcl
set geom_dim [TdrGeometryGetDimension file1.tdr 1]

TdrGeometryGetName

返回几何体的名称。

tcl
TdrGeometryGetName <filename> <geometry_index>

返回值:String — 几何体名称

tcl
set geom_name [TdrGeometryGetName file1.tdr 1]

TdrGeometryGetNumRegion

返回几何体中的区域数量。

tcl
TdrGeometryGetNumRegion <filename> <geometry_index>

返回值:Integer — 区域数量


TdrGeometryGetNumState

返回几何体中的状态数量。

tcl
TdrGeometryGetNumState <filename> <geometry_index>

返回值:Integer — 状态数量


TdrGeometryGetShift

返回几何体的偏移向量(长度为 3 的列表)。

tcl
TdrGeometryGetShift <filename> <geometry_index>

返回值:List — 格式为 {x y z} 的偏移向量

tcl
set geom_shift [TdrGeometryGetShift file1.tdr 1]

TdrGeometryGetTagGroup

返回几何体的标签组句柄。

tcl
TdrGeometryGetTagGroup <filename> <geometry_index>

返回值:Handle

tcl
set tg [TdrGeometryGetTagGroup file1.tdr 1]

TdrGeometryGetTransform

返回几何体的变换矩阵(3×3 矩阵,表示为列表)。

tcl
TdrGeometryGetTransform <filename> <geometry_index>

返回值:List — 格式为 {x00 x01 x02 ... x21 x22} 的变换矩阵


TdrGeometryGetType

返回几何体的类型。

tcl
TdrGeometryGetType <filename> <geometry_index>

返回值:String — 可能的值包括:

  • "envelop"
  • "grid_raytree"
  • "mixed_element"
  • "tensor_rectilinear"
  • "tensor_uniform"
  • "tensor_warped"
  • "tensor_xy"

TdrGeometrySetName

设置几何体的新名称。

tcl
TdrGeometrySetName <filename> <geometry_index> <name>

返回值:Boolean

tcl
TdrGeometrySetName file1.tdr 1 new_geometry_name

TdrGeometrySetShift

设置几何体的新偏移向量。

tcl
TdrGeometrySetShift <filename> <geometry_index> <shift_list>
tcl
set new_shift {0.1 0.4 0.3}
TdrGeometrySetShift file1.tdr 1 $new_shift

TdrGeometrySetTransform

设置几何体的新旋转矩阵。

tcl
TdrGeometrySetTransform <filename> <geometry_index> <transformation_list>
tcl
set new_transform {1 3.14 4.13 3.13 1 6.13 4.13 6.13 1}
TdrGeometrySetTransform file1.tdr 1 $new_transform

状态相关函数

TdrStateDelete

删除指定状态。

tcl
TdrStateDelete <filename> <geometry_index> <state_index>

WARNING

在循环中调用时,必须按反向顺序遍历。

tcl
TdrStateDelete file1.tdr 1 2

TdrStateGetName

返回状态的名称。

tcl
TdrStateGetName <filename> <geometry_index> <state_index>

返回值:String

tcl
set state_name [TdrStateGetName file1.tdr 1 2]

TdrStateGetTagGroup

返回状态的标签组句柄。

tcl
TdrStateGetTagGroup <filename> <geometry_index> <state_index>

返回值:Handle


TdrStateSetName

设置状态的新名称。

tcl
TdrStateSetName <filename> <geometry_index> <state_index> <name>
tcl
TdrStateSetName file1.tdr 1 2 FinalState

区域相关函数

TdrRegionGetDimension

返回区域的维度。

tcl
TdrRegionGetDimension <filename> <geometry_index> <region_index>

返回值:Integer


TdrRegionGetMaterial

返回区域的材料名称。

tcl
TdrRegionGetMaterial <filename> <geometry_index> <region_index>

返回值:String

tcl
set region_material [TdrRegionGetMaterial file1.tdr 1 2]

TdrRegionGetName

返回区域的名称。

tcl
TdrRegionGetName <filename> <geometry_index> <region_index>

返回值:String


TdrRegionGetNumDataset

返回区域的数据集数量。

tcl
TdrRegionGetNumDataset <filename> <geometry_index> <region_index> <state_index>

返回值:Integer


TdrRegionGetTagGroup

返回区域的标签组句柄。

tcl
TdrRegionGetTagGroup <filename> <geometry_index> <region_index>

返回值:Handle


TdrRegionGetType

返回区域的类型。

tcl
TdrRegionGetType <filename> <geometry_index> <region_index>

返回值:String — 可能的值包括:

  • "bulk"
  • "contact"
  • "interface"
  • "raytree"
  • "ten_bulk"
  • "ten_contact"
  • "ten_xy"

TdrRegionSetMaterial

设置区域的新材料。

tcl
TdrRegionSetMaterial <filename> <geometry_index> <region_index> <material>
tcl
TdrRegionSetMaterial file1.tdr 1 2 Copper

TdrRegionSetName

设置区域的新名称。

tcl
TdrRegionSetName <filename> <geometry_index> <region_index> <name>
tcl
TdrRegionSetName file1.tdr 1 2 new_region_name

数据集相关函数

TdrDatasetDelete

删除数据集。

tcl
TdrDatasetDelete <filename> <geometry_index> <region_index> <state_index> <dataset_index>

WARNING

在循环中调用时,必须按反向顺序遍历。

tcl
TdrDatasetDelete file1.tdr 1 2 0 0

TdrDatasetDeleteByName

按名称删除数据集。

tcl
TdrDatasetDeleteByName <filename> [<name>]

name 可以是 Tcl 正则表达式,指定要删除的数据集。如果省略参数,则删除所有数据集。

tcl
TdrDatasetDeleteByName file1.tdr DopingConcentration

TdrDatasetGetLocation

返回数据集的位置。

tcl
TdrDatasetGetLocation <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String — 可能的值:

  • "edge"
  • "element"
  • "element_edge"
  • "element_face"
  • "element_vertex"
  • "face"
  • "region"
  • "vertex"

TdrDatasetGetName

返回数据集的名称。

tcl
TdrDatasetGetName <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String


TdrDatasetGetNumValue

返回数据集的数据值数量。

tcl
TdrDatasetGetNumValue <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:Integer


TdrDatasetGetQuantity

返回数据集的物理量名称。

tcl
TdrDatasetGetQuantity <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String — 例如 "DopingConcentration"、"ElectricField" 等


TdrDatasetGetStructure

返回数据集的结构类型。

tcl
TdrDatasetGetStructure <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String — 可能的值:

  • "matrix"
  • "scalar"
  • "tensor_sym"
  • "var_dim_matrix"
  • "var_dim_vector"
  • "vector"

TdrDatasetGetTagGroup

返回数据集的标签组句柄。

tcl
TdrDatasetGetTagGroup <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:Handle


TdrDatasetGetType

返回数据集的类型。

tcl
TdrDatasetGetType <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String


TdrDatasetGetUnit / TdrDatasetGetUnitLong

返回数据集的单位(短名称/长名称)。

tcl
TdrDatasetGetUnit <filename> <geometry_index> <region_index> <state_index> <dataset_index>
TdrDatasetGetUnitLong <filename> <geometry_index> <region_index> <state_index> <dataset_index>

返回值:String


TdrDatasetRename

全局重命名数据集。

tcl
TdrDatasetRename <filename> <old_name> <new_name>

TdrDatasetRenameQuantity

全局更改数据集的物理量。

tcl
TdrDatasetRenameQuantity <filename> <old_quantity> <new_quantity>

TdrDatasetSetName

设置数据集的新名称。

tcl
TdrDatasetSetName <filename> <geometry_index> <region_index> <state_index> <dataset_index> <name>

TdrDatasetSetQuantity

设置数据集的物理量。

tcl
TdrDatasetSetQuantity <filename> <geometry_index> <region_index> <state_index> <dataset_index> <quantity>

数据值相关函数

TdrDataGetAllCoordinates

返回数据值的所有坐标。

tcl
TdrDataGetAllCoordinates <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index>

返回值:String


TdrDataGetComponent

返回数据值的指定分量。

tcl
TdrDataGetComponent <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index> [<row>] [<col>]

返回值:Double


TdrDataGetCoordinate

返回数据值的指定坐标。

tcl
TdrDataGetCoordinate <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index> <coordinate_index>

返回值:Integer


TdrDataGetNumCol

返回数据值的列数。

tcl
TdrDataGetNumCol <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index>

返回值:Integer


TdrDataGetNumRow

返回数据值的行数。

tcl
TdrDataGetNumRow <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index>

返回值:Integer


TdrDataGetValue

返回数据值。

tcl
TdrDataGetValue <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index>

返回值:Boolean


TdrDataSetComponent

设置数据值的指定分量。

tcl
TdrDataSetComponent <filename> <geometry_index> <region_index> <state_index> <dataset_index> <value_index> [<row>] [<col>] <value>

返回值:Boolean


标签组相关函数

TdrTagGroupCreate

创建新标签组。

tcl
TdrTagGroupCreate <parent_tag_group> <name>

返回值:Handle


TdrTagGroupDelete

删除标签组。

tcl
TdrTagGroupDelete <parent_tag_group> <tag_group_index>

返回值:Boolean


TdrTagGroupDeleteByName

按名称删除标签组。

tcl
TdrTagGroupDeleteByName <parent_tag_group> <tag_group_name>

返回值:Boolean


TdrTagGroupGetByPath

按路径获取标签组。

tcl
TdrTagGroupGetByPath <filename> [<geometry_index>] [<region_index>] [<state_index>] [<dataset_index>] <path>

返回值:Handle


TdrTagGroupGetName

返回标签组的名称。

tcl
TdrTagGroupGetName <tag_group>

返回值:String


TdrTagGroupGetNumTag

返回标签组中的标签数量。

tcl
TdrTagGroupGetNumTag <tag_group>

返回值:Integer


TdrTagGroupGetNumTagGroup

返回标签组中的子标签组数量。

tcl
TdrTagGroupGetNumTagGroup <tag_group>

返回值:Integer


TdrTagGroupGetTagGroup

返回指定索引的子标签组。

tcl
TdrTagGroupGetTagGroup <parent_tag_group> <tag_group_index>

返回值:Handle


标签相关函数

TdrTagCreateScalar

创建标量标签。

tcl
TdrTagCreateScalar <parent_tag_group> <name> <type> <value>

返回值:Boolean


TdrTagDelete

删除标签。

tcl
TdrTagDelete <tag_group> <tag_index>

返回值:Boolean


TdrTagDeleteByName

按名称删除标签。

tcl
TdrTagDeleteByName <tag_group> <tag_name>

返回值:Boolean


TdrTagGetComponent

返回标签的指定分量。

tcl
TdrTagGetComponent <tag_group> <tag_index> [<row>] [<col>]

返回值:String


TdrTagGetName

返回标签的名称。

tcl
TdrTagGetName <tag_group> <tag_index>

返回值:String


TdrTagGetNumCol

返回标签的列数。

tcl
TdrTagGetNumCol <tag_group> <tag_index>

返回值:Integer


TdrTagGetNumRow

返回标签的行数。

tcl
TdrTagGetNumRow <tag_group> <tag_index>

返回值:Integer


TdrTagGetStructure

返回标签的结构类型。

tcl
TdrTagGetStructure <tag_group> <tag_index>

返回值:String — "scalar""matrix"


TdrTagGetType

返回标签的值类型。

tcl
TdrTagGetType <tag_group> <tag_index>

返回值:String


TdrTagGetValue

返回标签的值。

tcl
TdrTagGetValue <tag_group> <tag_index>

返回值:String


TdrTagSetComponent

设置标签的分量值。

tcl
TdrTagSetComponent <tag_group> <tag_index> [<row>] [<col>] <value>

返回值:Boolean


本章小结

  • TDX 提供基于 Tcl 的脚本接口,支持完整的 Tcl 语法
  • 使用 tdx -tcl script.tcl 运行脚本,tdx -tclcmd 运行单条命令
  • 循环删除时必须按反向顺序遍历
  • 支持文件、几何体、状态、区域、数据集、数据值、标签组、标签的管理和修改

基于 Sentaurus TCAD 官方文档构建

代码块