Control Flow
if, for, while, and the brace rule
Control flow in TCL is straightforward once you accept one thing: the braces are part of the syntax and their placement matters.
if / else
set slack -0.05
if {$slack < 0} {
puts "VIOLATION: slack is $slack"
} else {
puts "Timing met"
}for and while
for {set i 0} {$i < 4} {incr i} {
puts "metal layer M[expr {$i + 1}]"
}
set n 8
while {$n > 1} {
set n [expr {$n / 2}]
}the opening brace must sit on the same line as if, for, and while. Putting it on the next line breaks TCL, because it reads the command as finished at the end of the line. This is a real, frequent error: keep the { on the line with the keyword.
Comparisons
Use the usual operators inside the condition: <, >, ==, !=, <=, >=, and && and || to combine them. For string comparison use eq and ne, which compare as strings rather than numbers.
if {$corner eq "ss" && $slack < 0} {
puts "Setup problem at the slow corner"
}use eq and ne for strings and ==, != for numbers. Comparing strings with == sometimes works and sometimes surprises you; the dedicated string operators are unambiguous.
Finished reading?
Mark it complete to track your progress through the path.
Go further
Put your Tcl to work driving a real flow: take a RISC-V CPU from RTL to GDSII with OpenLane.
Includes Interview Bootcamp and Fresher Pack free, worth ₹498.
Get new lessons by email
New lessons, interview prep and real EDA tool workflows. No spam.