Module 69 min
Parsing Reports
Strings, regexp, and reading files
A huge part of real EDA scripting is pulling numbers out of tool reports: how many violations, what is the worst slack, total power. This means string handling and file reading.
String basics
tcl
set line "WNS = -0.123 ns"
puts [string length $line] ;# length
puts [string match "*WNS*" $line] ;# 1 if it contains WNS
puts [string trim " spm "] ;# -> spm (trims spaces)Pulling out a number with regexp
Regular expressions extract exactly the piece you want. Here we grab the slack value from a report line.
tcl
set line "WNS = -0.123 ns"
if {[regexp {WNS = (\S+)} $line -> wns]} {
puts "Worst negative slack is $wns" ;# -0.123
}Reading a report file line by line
tcl
set viol 0
set fh [open "timing.rpt" r]
while {[gets $fh line] >= 0} { ;# gets returns -1 at end
if {[string match "*VIOLATED*" $line]} {
incr viol
}
}
close $fh
puts "Found $viol violated paths"Writing a file
tcl
set out [open "summary.txt" w]
puts $out "Violations: $viol"
close $outPro tip
regexp with a capture group in parentheses, written to a variable after the ->, is the everyday tool for scraping numbers from reports. Combined with reading a file line by line, you can turn any tool report into a one-line summary or a pass/fail check.
Watch out
always close a file you open, especially in a loop, or you will run out of file handles on a long run. Open, use, close - every time.