TCL 文件解析(一旦找到模式就循环读取后续行)?
TCL file parsing (Loop to read subsequent lines once pattern found)?
下面是我将使用 TCL 读取的文件中重复多次的序列。
Startpoint: FF1 (rising edge-triggered flip-flop clocked by Clk)
Endpoint: FF2 (rising edge-triggered flip-flop clocked by Clk)
Path Group: Clk
Path Type: max
Point Incr Path
-----------------------------------------------------------
clock Clk (rise edge) 0.00 0.00
clock network delay (propagated) 1.10 * 1.10
FF1/CLK (fdef1a15) 0.00 1.10 r
FF1/Q (fdef1a15) 0.50 * 1.60 r
U2/Y (buf1a27) 0.11 * 1.71 r
U3/Y (buf1a27) 0.11 * 1.82 r
FF2/D (fdef1a15) 0.05 * 1.87 r
data arrival time 1.87
clock Clk (rise edge) 4.00 4.00
clock network delay (propagated) 1.00 * 5.00
FF2/CLK (fdef1a15) 5.00 r
library setup time -0.21 * 4.79
data required time 4.79
------------------------------------------------------------
data required time 4.79
data arrival time -1.87
------------------------------------------------------------
slack (MET) 2.92
开始由 Startpoint 表示,结束由 slack 表示。
我正在寻找一种方法来编写将读取第一行起点的循环。
然后文件指针转到后续行,我读取它们并对其进行后处理。
一旦遇到 Slack 线,循环将转到文件中的下一个起点并重复同样的事情。
只有找到起点线,我才进一步进行所有处理。
遇到 Startpoint 行后,无法找到将文件指针转移到下一行的方法。同样,当遇到松弛线时,文件指针应转移到下一个起点线。
我是 TCL 的新手,正在尝试想象这将如何工作。
Python 相当于我想要实现的是:
使用指针 fp 打开文件进行读取
for line in fp:
if startpoint found
for next_line_in_file in fp:
do post processing until slack line found and then continue from outer for loop
一般模式是这样的:
while {[gets $channel line] >= 0} {
# Skip lines until the start point
if {![string match "Startpoint: *" $line]} continue
set lines [list $line]
# Accumulate lines until we have a whole section
while {[gets $channel line] >= 0} {
lappend lines $line
if {[string match "slack *" $line]} break
}
# You'll need to provide a command — most likely a procedure — for this...
postProcess $lines
}
你的伪代码的主要变化是,它将整个行列表(代表从 Startpoint:
到 slack
的所有内容)输入 post-processing 命令立刻。有了丰富的经验,这种事情可以使分块数据流的复杂处理 变得容易得多 而不是尝试处理其上的每一行自己的(有复杂的状态机等;这是可能的,但相当困难且很容易出错)。
下面是我将使用 TCL 读取的文件中重复多次的序列。
Startpoint: FF1 (rising edge-triggered flip-flop clocked by Clk)
Endpoint: FF2 (rising edge-triggered flip-flop clocked by Clk)
Path Group: Clk
Path Type: max
Point Incr Path
-----------------------------------------------------------
clock Clk (rise edge) 0.00 0.00
clock network delay (propagated) 1.10 * 1.10
FF1/CLK (fdef1a15) 0.00 1.10 r
FF1/Q (fdef1a15) 0.50 * 1.60 r
U2/Y (buf1a27) 0.11 * 1.71 r
U3/Y (buf1a27) 0.11 * 1.82 r
FF2/D (fdef1a15) 0.05 * 1.87 r
data arrival time 1.87
clock Clk (rise edge) 4.00 4.00
clock network delay (propagated) 1.00 * 5.00
FF2/CLK (fdef1a15) 5.00 r
library setup time -0.21 * 4.79
data required time 4.79
------------------------------------------------------------
data required time 4.79
data arrival time -1.87
------------------------------------------------------------
slack (MET) 2.92
开始由 Startpoint 表示,结束由 slack 表示。
我正在寻找一种方法来编写将读取第一行起点的循环。
然后文件指针转到后续行,我读取它们并对其进行后处理。
一旦遇到 Slack 线,循环将转到文件中的下一个起点并重复同样的事情。
只有找到起点线,我才进一步进行所有处理。
遇到 Startpoint 行后,无法找到将文件指针转移到下一行的方法。同样,当遇到松弛线时,文件指针应转移到下一个起点线。
我是 TCL 的新手,正在尝试想象这将如何工作。
Python 相当于我想要实现的是:
使用指针 fp 打开文件进行读取
for line in fp:
if startpoint found
for next_line_in_file in fp:
do post processing until slack line found and then continue from outer for loop
一般模式是这样的:
while {[gets $channel line] >= 0} {
# Skip lines until the start point
if {![string match "Startpoint: *" $line]} continue
set lines [list $line]
# Accumulate lines until we have a whole section
while {[gets $channel line] >= 0} {
lappend lines $line
if {[string match "slack *" $line]} break
}
# You'll need to provide a command — most likely a procedure — for this...
postProcess $lines
}
你的伪代码的主要变化是,它将整个行列表(代表从 Startpoint:
到 slack
的所有内容)输入 post-processing 命令立刻。有了丰富的经验,这种事情可以使分块数据流的复杂处理 变得容易得多 而不是尝试处理其上的每一行自己的(有复杂的状态机等;这是可能的,但相当困难且很容易出错)。