TCL解析文件

TCL解析文件,tcl,Tcl,我想将标题vdd、vddpll等存储为键,并将相关列条目存储为值。 从下面的示例中,您希望读取每一列并根据列中的第一个条目进行存储 vdd -> ON ON OFF OFF vddpll -> ON OFF ON OFFF vdd->开-关-关 vddpll->开-关-开-关 …等等 create_pst top_pst -supplies {vdd vddpll vdd_NWELL vdd33 gnd gnd_PWELL} add_pst_state state1 -

我想将标题vdd、vddpll等存储为键,并将相关列条目存储为值。 从下面的示例中,您希望读取每一列并根据列中的第一个条目进行存储

vdd -> ON ON OFF OFF vddpll -> ON OFF ON OFFF vdd->开-关-关 vddpll->开-关-开-关 …等等

create_pst top_pst -supplies {vdd vddpll vdd_NWELL vdd33 gnd gnd_PWELL} add_pst_state state1 -pst top_pst -state {ON ON ON ON gnd_on gnd_on} add_pst_state state2 -pst top_pst -state {ON OFF ON ON gnd_on gnd_on} add_pst_state state3 -pst top_pst -state {OFF ON ON ON gnd_on gnd_on} add_pst_state state4 -pst top_pst -state {OFF OFF ON ON gnd_on gnd_on} 创建\pst top \u pst-供应{vdd vddpll vdd_NWELL vdd33 gnd gnd_PWELL} 添加pst_state1-pst toppst-state{ON ON gnd_ON gnd_ON} 添加pst_state2-pst top pst-state{ON ON gnd_ON gnd_ON} 添加pst_state3-pst toppst-state{OFF ON ON gnd_ON gnd_ON} 添加pst_state4-pst toppst-state{OFF ON gnd_ON gnd_ON}
set fp[open“test.upf”r]
设置i 0
而{[get$fp data]>=0}{
如果{[regexp“create_pst”$data match]}{
设置供应品行[拆分行$数据]
设置供应品名称[L范围$supplies\u第3行结束]
对于{set j 0}{$j<[llength$supply_names]}{incr j}{
设置电源名称[lindex$supply\u names$j]
设置电源和状态($power\u name){}
}
如果{[regexp“addpst_state”$data match]}{
设置状态行[拆分行$data]
设置供应状态[范围$state第5行结束]
对于{set j 0}{$j<[llength$supply_state]}{incr j}{
设置电源名称[lindex$supply\u names$j]
lappend power_和_state($power_name)[lindex$supply_state$j]
}
}
proc split_行{data}{
设置upf_entries1[regexp-all-inline{\S+}$data]
设置entries1[regsub“{$upf_entries1”“]
设置entries2[regsub”}“$entries1”“]
设置entries3[regsub-all{\-}$entries2”“]
设置entries4[regsub-all{\\}$entries3”“]
返回$entries4
}
}
结束$fp
我希望power_和_状态数组包含所有键vdd、vddpll..等,并且相关条目存储在分配给键的列表中

提前谢谢你的帮助

我希望power_和_状态数组包含所有键vdd, vddpll..etc和相关条目存储在指定的列表中 到钥匙那儿去

我认为您的“数据馈送”非常符合Tcl的本机语法,因此无需通过正则表达式绕道而行。尽可能多地借助于Tcl。一种简单的方法可以如下所示:

set data {create_pst top_pst -supplies {vdd vddpll vdd_NWELL vdd33 gnd gnd_PWELL}
add_pst_state state1 -pst top_pst -state {ON ON ON ON gnd_on gnd_on}
add_pst_state state2 -pst top_pst -state {ON OFF ON ON gnd_on gnd_on}
add_pst_state state3 -pst top_pst -state {OFF ON ON ON gnd_on gnd_on}
add_pst_state state4 -pst top_pst -state {OFF OFF ON ON gnd_on gnd_on}}

proc create_pst {name args} {
    global $name
    set opts [dict create {*}$args]
    set $name [dict create {*}"[join [dict get $opts -supplies] " {} "] {}"]
    return
}

proc add_pst_state {name args} {
    set opts [dict create {*}$args]
    set pst [dict get $opts -pst]
    global $pst
    set state [dict get $opts -state]
    foreach k [dict keys [set $pst]] v $state {
       dict lappend $pst $k $v
    }
    return
}

eval $data

puts $top_pst
一些解释性的评论
  • 两个过程
    create\pst
    add\pst\u state
    匹配“输入语句”
  • 这两个过程之间有一个简单的协议,基于以
    create_pst
    first arg命名的全局
    dict
  • create_pst
    将使用所有键初始化全局
    dict
    ,以保持其顺序
  • 稍后对
    addpst\u state
    的调用建立在保留的顺序上,只需在顺序键上循环(
    foreach
  • 涉及到一些helper
    dict
    ,主要用于处理两个进程的非位置参数(
    -supplies
    -pst
    -state
我希望power_和_状态数组包含所有键vdd, vddpll..etc和相关条目存储在指定的列表中 到钥匙那儿去

我认为您的“数据馈送”非常符合Tcl的本机语法,因此无需通过正则表达式绕道而行。尽可能多地借助于Tcl。一种简单的方法可以如下所示:

set data {create_pst top_pst -supplies {vdd vddpll vdd_NWELL vdd33 gnd gnd_PWELL}
add_pst_state state1 -pst top_pst -state {ON ON ON ON gnd_on gnd_on}
add_pst_state state2 -pst top_pst -state {ON OFF ON ON gnd_on gnd_on}
add_pst_state state3 -pst top_pst -state {OFF ON ON ON gnd_on gnd_on}
add_pst_state state4 -pst top_pst -state {OFF OFF ON ON gnd_on gnd_on}}

proc create_pst {name args} {
    global $name
    set opts [dict create {*}$args]
    set $name [dict create {*}"[join [dict get $opts -supplies] " {} "] {}"]
    return
}

proc add_pst_state {name args} {
    set opts [dict create {*}$args]
    set pst [dict get $opts -pst]
    global $pst
    set state [dict get $opts -state]
    foreach k [dict keys [set $pst]] v $state {
       dict lappend $pst $k $v
    }
    return
}

eval $data

puts $top_pst
一些解释性的评论
  • 两个过程
    create\pst
    add\pst\u state
    匹配“输入语句”
  • 这两个过程之间有一个简单的协议,基于以
    create_pst
    first arg命名的全局
    dict
  • create_pst
    将使用所有键初始化全局
    dict
    ,以保持其顺序
  • 稍后对
    addpst\u state
    的调用建立在保留的顺序上,只需在顺序键上循环(
    foreach
  • 涉及到一些helper
    dict
    ,主要用于处理两个进程的非位置参数(
    -supplies
    -pst
    -state

我会使用
eval
而不是
try
。您好,多纳尔,谢谢您的及时回复。我对tcl环境完全陌生。我复制了原样的代码并运行了,它失败了,出现以下错误消息。添加\pst\u状态:未找到命令添加\pst\u状态:未找到命令添加状态:找不到命令添加状态:找不到命令过程:找不到命令全局:找不到命令返回:只能从函数或源代码脚本返回意外标记附近的语法错误}'`}'`复制并运行“?恐怕这太不具体了。首先:将脚本保存在单独的文件(
myscript.tcl
)中,并从CLI运行:
tclsh myscript.tcl
。在着手处理手头的任务之前,你可能应该先看一下表格。卡尔文先生,对不起,我应该说得更具体一些。谢谢你的指导。我的理解是,top诖pst应具有vdd、vddpll..etc键和其他信息作为值。来自add_pst_state的所有条目都存储在一个列表中,而不是与密钥对应的单个列表中。vdd{}vddpll{}vdd{vdd}NWELL{}vdd33{gnd}gnd{u PWELL{ON OFF}{ON ON gnd{u ON gnd{u ON ON gnd{u ON ON gnd}gnd{u ON ON gnd}gnd{u ON ON ON gnd}gnd{u ON ON gnd}gnd{u ON OFF ON gnd}。当这是运行某些脚本得到的输出时,它就不是我发布的那个。这就是当你做1:1时你得到的结果,正如我所暗示的:
vdd{ON ON OFF}vddpll{ON OFF ON OFF}vdd_NWELL{ON ON ON ON}vdd33{ON ON ON ON ON ON}gnd{gnd_ON gnd_ON gnd_ON gnd_ON gnd_ON}gnd{gnd_ON gnd_ON gnd_ON gnd_ON gnd_ON gnd_ON gnd_ON}gnd_ON gnd_ON gnd_ON}gnd_ON gnd_ON gnd_ON gnd_ON}
我会用
来代替
eval代码,谢谢你的回复。我对tcl环境完全陌生。我复制了原样的代码并运行了,它失败了,错误消息如下。