You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决重构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"。

错误原因

  1. 参数处理错误:自定义get_cells和set_disable_timing的参数定义为argv,且未正确将参数传递给原生SDC命令,导致-hier被误解析为独立命令。
  2. 集合遍历逻辑错误:自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:40:24