1

这个问题是我上一个问题的后续问题……</p>

从那里的答案中,我在解决方案之上遇到了一些问题。好吧,故事是这样的。我正在尝试与电子设计查看器程序合作编写脚本。我遇到的问题是在电子程序的语法中正确使用我的变量。

所以基本上意思是这样的。我读了一些设计,将不同的路径保存在一个数组中,然后一一读出。在这个阅读过程中,我在程序中打开它们。

打开程序布局的原始代码是这样的:

set L1 [ layout create ]
$L1 create cell layout

$L1 create cell ONE
$L1 create cell TWO

set ONE [ layout create /users/jerre_111/public/imec_logo_zwart_512.gds -dt_expand -log LUN.log]
set ONE_top [$ONE topcell]
set TWO [ layout create /users/jerre_111/public/logo-rood.gds -dt_expand -log KTH.log]
set TWO_top [$TWO topcell]

$L1 import layout $ONE FALSE overwrite
$L1 import layout $TWO FALSE overwrite

$L1 create ref ONE $ONE_top      0       0 0 0 1
$L1 create ref TWO $TWO_top      0       0 0 0 1

$L1 create ref build ONE         0       0 0 0 1
$L1 create ref build TWO    207500       0 0 0 1

所以,这是原始代码。ONE并且TWO都是我在程序中打开的两种不同的布局。

这就是它在我的脚本中的工作方式:我想用我打开的文件的名称动态替换 ONE 和 TWO。所以每次,我从数组中取出路径,然后从路径中取出名称。然后我想使用文件名而不是ONEand TWO。我正在尝试这样:

set L1 [ layout create ]
$L1 create cell build

foreach key [array names ::openedFiles] {
    set filename [file tail $::openedFiles($key)]
    set parts [split $filename .]
    set name [lindex $parts 0]

    $L1 create cell $name

    set $name[ layout create $::openedFiles($key) -dt_expand -log LUN.log]
    set cell_top [[set $name] topcell]

    $L1 import layout [set $name] FALSE overwrite

    $L1 create ref $name $cell_top     0       0 0 0 1

    $L1 create ref build $name         0       0 0 0 1
}

所以每次我通过循环时,我都会从数组中取出一项。然后我动态地给他们起名字。但是我在原始代码中遇到了一些问题$ONEONE喜欢...我正在尝试用...ONE的值替换$name

我希望你能理解我的问题,有人可以帮助我。

4

1 回答 1

3

对于此代码,您可能希望使用别名变量。

# Compute the name of the variable to use as in your code...
# I assume that the name is what $name produces

upvar 0 $name ALIAS

之后,您可以使用ALIASor$ALIAS原始样本使用的地方ONEor $ONE; 它们的行为相同(直到堆栈帧结束upvar 0直到您使用另一个调用重新定义别名)。

$L1 create cell ALIAS

set ALIAS [layout create $::openedFiles($key) -dt_expand -log LUN.log]
set cell_top [$ALIAS topcell]

$L1 import layout $ALIAS FALSE overwrite

$L1 create ref ALIAS $cell_top     0       0 0 0 1
$L1 create ref build ALIAS         0       0 0 0 1

唯一的问题可能是代码是否保留了对变量名称的引用。我猜这段代码没有,但有些肯定有。


或者使用数组,因为事情似乎需要一个标量。您甚至可以使用空名称的数组:

$L1 create cell ($name)

set ($name) [layout create $::openedFiles($key) -dt_expand -log LUN.log]
set cell_top [$($name) topcell]

$L1 import layout $($name) FALSE overwrite

$L1 create ref ($name) $cell_top     0       0 0 0 1
$L1 create ref build ($name)         0       0 0 0 1

不过,我真的不建议使用空名称;虽然它肯定会在整个 8.* 系列的 Tcl 中得到支持,但它在库包中使用(特别是stooop),我们不确定我们是否会保证这是 9.0 中支持的特性。具有一个字母名称的数组将更清晰 IMO。

于 2013-05-27T09:25:23.760 回答