如果我正确理解您的要求,我会这样做:
输入文件包含:
****************************************
Report : net
-connections
Design : soc
Version: G-2012.06-SP2
Date : Sun Apr 7 22:56:33 2013
****************************************
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh`:
Driver Pins Type
------------ ----------------
a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par)
Load Pins Type
------------ ----------------
b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
1
Connections for net `pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2`:
Driver Pins Type
------------ ----------------
d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par)
Load Pins Type
------------ ----------------
e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (e_par)
f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
1
<more . . .>
剧本:
# Read file containing input
set inputfile [open "inputfile.txt" r]
# File where output will be written in
set outputfile [open "outputfile.txt" w]
# $type will contain the Pin Type and $outputline will contain the final
# line to be written
set type ""
set outputline ""
# Read each line in the inputfile
while {[gets $inputfile line] != -1} {
# If first word in line is "Connections" execute
if {[lindex [split $line " "] 0] == "Connections"} {
# If $outputline not empty while in this if, it means that we have
# reached a new connection. So print out the current connection
# after joining all its elements by " :: " and reset the output line.
if {$outputline != ""} {
puts $outputfile [join $outputline " :: "]
set outputline ""
}
# Replacing the ` by ' and removing the end ":" and then putting
# the full thing into $output line as an element of a list
regsub -all {\`} $line "\'" newline
set newline [string trimright $newline "\:"]
lappend outputline $newline
}
# If there is "Pins" in the line, this means we have a header. The regexp
# captures the pin type by looking for any alphanumeric characters before
# "Pins"
regexp -- {([\w]+) Pins} $line - type
# If there is " Pin " in the line, it means we are in a row of the
# different 'Pins' type. Here, we put the while line after removing
# the extra white spaces into the $outputline list.
if {[regexp -- { Pin } $line]} {
lappend outputline "$type [string trim $line]"
}
}
# We reached the end of the document. So, add the last line into the outputfile.
puts $outputfile [join $outputline " :: "]
# Close the files we opened.
close $inputfile
close $outputfile
输出:
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh' :: Driver a_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Output Pin (a_par) :: Load b_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh Input Pin (b_par)
Connections for net 'pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2' :: Driver d_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_2 Output Pin (d_par) :: Load e_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (e_par) :: Load f_par/pmg_ccu_ot2_tam_50mhz_sel_xainfwh_3 Input Pin (f_par)
此脚本将按它们出现的任何顺序采用“驱动程序类型”或“加载类型”(您也可以添加新类型)。您的输入中是否还有其他可能的变化?
编辑:您可以将switch
块更改为此,它将采用任何类型的Pins
if {[regexp -- {([\w]+) Pins} $line - type]} {
set counter 0
}
重新编辑:添加--
到正则表达式。
rereEDIT:有问题的匹配编辑。