如何解决重构Tcl版SDC命令foreach_in_collection后的-hier命令错误
问题解决:自定义Tcl Proc时出现"invalid command "-hier""错误
问题背景
为替代SDC原生的foreach_in_collection命令,自定义了set_disable_timing、get_cells及foreach_in_collection三个Tcl过程。执行set all_cells [get_cells -hier my_cell*]后调用自定义遍历命令时,触发错误:invalid command "-hier"。
错误原因
- 参数处理错误:自定义
get_cells和set_disable_timing的参数定义为argv,且未正确将参数传递给原生SDC命令,导致-hier被误解析为独立命令。 - 集合遍历逻辑错误:自定义
foreach_in_collection中使用了未定义的$collection_list变量,且试图用普通Tclforeach遍历SDC集合(SDC集合是特殊对象,无法直接用标准foreach遍历)。
修复方案
1. 修复参数传递逻辑
自定义过程需正确接收并传递所有参数给原生SDC命令,使用args作为参数列表,并通过{*}展开参数:
# 自定义get_cells,转发调用原生SDC命令 proc get_cells { args } { return [::get_cells {*}$args] } # 自定义set_disable_timing,同理处理参数转发 proc set_disable_timing { args } { return [::set_disable_timing {*}$args] }
2. 修复集合遍历逻辑
SDC集合需通过专用API遍历,使用get_collection_size获取集合长度,get_collection_element获取指定位置元素:
proc foreach_in_collection { item collection script } { set size [get_collection_size $collection] for {set i 0} {$i < $size} {incr i} { set elem [get_collection_element $collection $i] uplevel [list set $item $elem] uplevel 1 $script } }
验证调用
修复后原调用代码可正常执行:
set all_cells [get_cells -hier my_cell*] foreach_in_collection cell $all_cells { set_disable_timing $cell }
内容的提问来源于stack exchange,提问作者JoshTitle
相关产品推荐
相关产品推荐

