TCL · DIGITAL FLOW AUTOMATION

TCL 入门:从基础语法到第一个自动化脚本

掌握变量、字符串、列表、条件判断、循环、过程与文件读写,为数字 IC 流程自动化打下基础。

TCLEDA 自动化入门教程

$ tclsh hello.tcl

hello.tcl
set tool "TCL"
set taskCount 3
puts "Hello, $tool!"
puts "Ready for $taskCount automation tasks."

TCL 用简洁的命令式语法,把工具控制、数据提取和流程编排连接起来。

一门语言,串起整个数字实现流程

  • 约束与工具控制
  • 报告解析与数据提取
  • 批处理与流程编排

TCL(Tool Command Language)是一门轻量级脚本语言。在数字 IC 设计流程中,许多 EDA 工具都提供 TCL 命令接口,因此它常被用于读取设计对象、设置约束、批量执行任务和生成报告。

1. 命令、注释与输出

空格分隔命令名和参数,换行或分号结束命令,井号用于注释:

basics.tcl
# 这是一行注释
puts "Hello, TCL!"
puts "第二条命令"; puts "第三条命令"

2. 变量与替换

使用 set 创建或读取变量,使用美元符号取得变量值:

variables.tcl
set project "cpu_core"
set corner "ss_0p72v_125c"
puts "Project: $project"
puts "Corner: $corner"
  • 双引号:允许变量和命令替换。
  • 花括号:保持内容原样,常用于表达式和脚本块。
  • 方括号:先执行其中的命令,再使用返回值。

3. 数值计算

数学表达式使用 expr 求值:

math.tcl
set setupWns -0.12
set margin 0.05
set adjusted [expr $setupWns-$margin]
puts "Adjusted WNS = $adjusted ns"

4. 列表

列表适合保存端口、时钟、路径组或报告文件:

lists.tcl
set corners [list ss tt ff]
lappend corners ff_0p88v
puts "Count: [llength $corners]"
puts "First: [lindex $corners 0]"
puts "All: $corners"

5. 条件判断

conditions.tcl
set wns -0.08
if {$wns >= 0.0} {
  puts "Timing PASS"
} elseif {$wns > -0.10} {
  puts "Timing MARGINAL"
} else {
  puts "Timing FAIL"
}

6. foreach 与 for 循环

foreach 遍历列表,for 处理次数明确的循环:

loops.tcl
set corners {ss tt ff}
foreach corner $corners {
  puts "Running corner: $corner"
}

for {set i 0} {$i < 3} {incr i} {
  puts "Iteration $i"
}

7. 定义过程 proc

procedures.tcl
proc reportStatus {name value {unit "ns"}} {
  if {$value >= 0} {
    set status "PASS"
  } else {
    set status "FAIL"
  }
  return "$name: $value $unit - $status"
}
puts [reportStatus "Setup WNS" -0.12]

8. 字典 dict

dicts.tcl
set metrics [dict create wns -0.12 tns -8.45 area 102345.7]
puts "WNS: [dict get $metrics wns]"
dict set metrics power 0.84
puts "Metrics: $metrics"

9. 文件读写

files.tcl
set fp [open "run.log" r]
while {[gets $fp line] >= 0} {
  if {[string match "*ERROR*" $line]} {
    puts "Found: $line"
  }
}
close $fp

set out [open "summary.txt" w]
puts $out "Run completed"
close $out

10. 错误处理 catch

errors.tcl
if {[catch {set fp [open "missing.rpt" r]} message]} {
  puts "Open failed: $message"
} else {
  puts "File opened"
  close $fp
}

完整练习:汇总多角点时序数据

把过程、列表、循环、字典、判断和文件输出组合起来:

timing_summary.tcl
proc classifyWns {wns} {
  if {$wns >= 0.0} {return "PASS"}
  if {$wns > -0.10} {return "MARGINAL"}
  return "FAIL"
}

set timing [dict create ss -0.12 tt 0.03 ff -0.04]
set out [open "timing_summary.csv" w]
puts $out "corner,wns,status"

dict for {corner wns} $timing {
  set status [classifyWns $wns]
  puts "$corner: $wns ns - $status"
  puts $out "$corner,$wns,$status"
}
close $out
puts "Summary written to timing_summary.csv"

下一步

把 TCL 放进真实 EDA 流程

继续学习集合查询、对象属性、约束生成、时序报告解析和批量运行,让 TCL 成为数字 IC 自动化工具。

查看更多技术教程