涉及变量的Tcl问题

时间:2013-05-27 07:35:23

标签: variables tcl

这个问题是我last question ...

的后续问题

我在答案中遇到了一些问题。 好的,故事就是这样。我正在尝试编写一个与电子设计查看器程序协作的脚本。我遇到的问题是在电子程序的语法中正确使用我的变量。

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

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

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

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

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

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的值。 ..

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

1 个答案:

答案 0 :(得分: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

之后,您可以使用ALIAS$ALIAS原始样本使用ONE$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。