也许这是非常愚蠢的,但我真的无法找到解决方案。我创建了两个变量,并希望将它们转换为列表。 这些命令是特定于工具的,但它们以我想要的方式工作:
redirect max_transition {report_constraint -view $pargs(-scenario) -drv_violation_type {max_transition} -all_violators} -variable
redirect max_capacitance {report_constraint -view $pargs(-scenario) -drv_violation_type {max_capacitance} -all_violators} -variable
现在我想从中创建tcl列表。我可以使用循环,因为数据具有相同的结构。
set reports {$max_transition $max_capacitance}
set report_length [llength $reports]
for {set i 0} {$i < $report_length} {incr i} {
set tns_value 0
set max_wns 0
set vios 0
set report [lindex $reports $i]
puts $report
# remove all uneccessary white spaces
set no_space [regexp -all -inline {\S+} $report]
# insert a new line for every path
set insert_lines [string map {" U_" \nU_} $no_space]
# create list out of result reports
set report_list [split $insert_lines "\n"]
if {[llength $report_list] > 1} {
for {set i 1} {$i < [llength $report_list]} {incr i} {
# get value of violation
set slack [lindex [split [lindex $report_list $i] " "] 3]
set tns_value [expr $tns_value + $slack]
if {$vios == 0} {set max_wns $slack}
incr vios
}
}
# write out values
puts "$pargs(-scenario), $report, $max_wns, $tns_value, $vios"
}
但这没有用。循环只是输出变量的名称(因为&#34;放置$ report&#34;)而不是它的内容。 如果我没有循环(所以每个变量连续相同的代码),我得到我想要的列表。 那么如何在循环中整体处理这些变量呢?
答案 0 :(得分:0)
问题出在下面的循环变量i
中,它覆盖了外循环的变量值。尝试将内循环变量更改为j
。
for {set i 1} {$i < [llength $report_list]} {incr i} {
# get value of violation
set slack [lindex [split [lindex $report_list $i] " "] 3]
set tns_value [expr $tns_value + $slack]
if {$vios == 0} {set max_wns $slack}
incr vios
}
答案 1 :(得分:0)
很难为此写一个答案,因为这么多未知。首先,您可能应该按照list
和foreach
循环更改为分配:
set reports [list $max_transition $max_capacitance]
foreach report $reports {
由于您不需要在此处使用for
循环,因此简化它是有意义的。请评论,如果可以,我会反复改进答案。