我是tcl的新手,想在简单案例的文本处理中使用它。以下格式在Liberty(.lib文件)中,用于芯片设计。对于这方面的任何帮助,我都会感激不尽。
以下是我的文件片段(仅在"值&#34上进行文字处理;)
timing () {
related_pin : "clk";
timing_type : setup_rising;
rise_constraint (constraint_template_5X5) {
index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
index_3 ("0.084, 0.84, 3.36, 8.4, 13.44") ;
values ( \
"1.1, 1.2, 1.3, 1.4, 1.5", \
"2.1, 2.2, 2.3, 2.4, 2.5", \
"3.1, 3.2, 3.3, 3.4, 3.5", \
"4.1, 4.2, 4.3, 4.4, 4.5", \
"5.1, 5.2, 5.3, 5.4, 5.5", \
"6.1, 6.2, 6.3, 6.4, 6.5", \
"7.1 ,7.2, 7.3, 7.4, 7.5", \
"8.1, 8.2, 8.3, 8.4, 8.5", \
"9.1, 9.2, 9.3, 9.4, 9.5", \
"10.1,10.2,10.3,10.4,10.5", \
"11.1,11.2,11.3,11.4,11.5", \
"12.1,12.2,12.3,12.4,12.5", \
"13.1,13.2,13.3,13.4,13.5", \
"14.1,14.2,14.3,14.4,14.5", \
"15.1,15.2,15.3,15.4,15.5", \
"16.1,16.2,16.3,16.4,16.5", \
"17.1,17.2,17.3,17.4,17.5", \
"18.1,18.2,18.3,18.4,18.5", \
"19.1,19.2,19.3,19.4,19.5", \
"20.1,20.2,20.3,20.4,20.5", \
"21.1,21.2,21.3,21.4,21.5", \
"22.1,22.2,22.3,22.4,22.5", \
"23.1,23.2,23.3,23.4,23.5", \
"24.1,24.2,24.3,24.4,24.5", \
"25.1,25.2,25.3,25.4,25.5", \
);
}
所有"值"是25行x 5列查找表格式,我希望更改为5行x 5列表格式。为了实现这一点,我想询问用户在映射之前他/她想要的5个值中的哪个值如下所示(同时还删除了index_3行):
C是基于index_3的用户定义列:(第1列为0.084,第2列为0.84,第3列为3.36,第4列为8.4,第5列为13.44)。 *用户只能选择1个值
映射方案:
1,C -> row 1 column 1
2,C -> row 2 column 1
3,C -> row 3 column 1
4,C -> row 4 column 1
5,C -> row 5 column 1
6,C -> row 1 column 2
7,C -> row 2 column 2
8,C -> row 3 column 2
等..
例如,假设用户选择第1列(index_3中的值0.084) - >哪个'选择'整个第一列数据的值是'进行文字处理/安排
因此,基于映射方案由tcl完成的文本处理应该是:
index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
values ( \
"1.1, 6.1, 11.1, 16.1, 21.1", \
"2.1, 7.1, 12.1, 17.1, 22.1", \
"3.1, 8.1, 13.1, 18.1, 23.1", \
"4.1, 9.1, 14.1, 19.1, 24.1", \
"5.1, 10.1,15.1, 20.1, 25.1", \
);
我的策略是:
搜索" rise_constraint"在整个文件中处理文本处理的值
注释掉行" index_3(...)&#34 ;;在重新打印的已处理文件中添加/ *和* /在行的开头和结尾(可选)
转换价值'从25行x 5列表到5行x 5列表基于所选的Index_3值("用户定义的列选择")
按原样重新打印其他行(包括已处理的文字'值')
我尽力解释我的编码请求。你们中的任何一个可以帮助我想一想tcl我可以做这样的文本处理的正确方法吗?非常感谢!!
答案 0 :(得分:1)
第一步是知道如何以最终形式表示tcl中的数据。 这只是一种可能的解决方案。
dict set risedata constraints {
constraint {
0.084 { 0 { 0 1.1 1 6.1 2 11.1 3 16.1 4 21.1 }
1 { 0 2.1 1 7.1 2 12.1 3 17.1 4 22.1 }
2 { 0 3.1 1 8.1 2 13.1 3 18.1 4 23.1 }
3 { 0 4.1 1 9.1 2 14.1 3 19.1 4 24.1 }
4 { 0 5.1 1 10.1 2 15.1 3 20.1 4 25.1 }
}
}
indexes { 1 { 0.01 0.05 0.12 0.2 0.4 }
2 { 0.005 0.025 0.06 0.1 0.3 }
3 { 0.084 0.84 3.36 8.4 13.44 } }
}
set c 0.084
puts "$c 2 3: [dict get $risedata constraints constraint $c 2 3]"
puts "idx1 3: [lindex [dict get $risedata constraints indexes 1] 3]"
puts "idx2 3: [lindex [dict get $risedata constraints indexes 2] 3]"
然后知道你需要在哪里,加载.lib只是一个简单的解析问题:
set fh [open z.lib r]
set inval false
while { [gets $fh line] >= 0 } {
if { [regexp {\);} $line] } {
set inval false
}
if { [regexp {index_(\d+)} $line all idx] } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {,} $d {} d
dict set risedata constraints indexes $idx $d
}
if { $inval } {
regsub {^[^"]*"} $line {} d
regsub {".*} $d {} d
regsub -all {[ ,]+} $d { } d
set row [expr {$rcount % 5}]
set column [expr {$rcount / 5}]
set i 0
foreach {v} [split $d { }] {
set c [lindex [dict get $risedata constraints indexes 3] $i]
dict set risedata constraints constraint $c $row $column $v
incr i
}
incr rcount
}
if { [regexp {values} $line] } {
set inval true
set row 0
set rcount 0
}
}
close $fh
puts $risedata
set c 0.084
puts "$c 2 3: [dict get $risedata constraints constraint $c 2 3]"
puts "idx1 3: [lindex [dict get $risedata constraints indexes 1] 3]"
puts "idx2 3: [lindex [dict get $risedata constraints indexes 2] 3]"
答案 1 :(得分:1)
我终于对此非常感兴趣,反对我更好的判断编写了一个完整的答案。我不会以任何方式记录它。阅读它,阅读你不理解的命令的文档,然后来问问题。
查看你的自由文件,我发现与本机Tcl语法非常接近。因此,您可以创建一些名为“timing”,“rise_constraint”等的过程,您基本上可以将其作为脚本运行。
package require struct::list
######################################################################
proc main {libfile} {
global lines idx3 vals
set lines [list]
set idx3 [list]
set vals [list]
evaluate_liberty $libfile
set idx [get_choice "select an index_3 value: " $idx3]
set column [struct::list mapfor elem $vals {lindex $elem $idx}]
set newvalues [list]
for {set i 0} {$i < 5} {incr i} {
lappend newvalues [lrange $column [expr {5*$i}] [expr {5*($i+1)-1}]]
}
print_liberty $newvalues
}
######################################################################
proc evaluate_liberty {libfile} {
set fh [open $libfile r]
# handle known syntax error in liberty file
set contents [string map {\", \"} [read -nonewline $fh]]
regsub -all -line {\s+$} $contents {} contents
close $fh
uplevel #0 $contents
}
proc get_choice {prompt values} {
while {1} {
for {set i 0} {$i < [llength $values]} {incr i} {
puts stderr [format "%2d. %s" $i [lindex $values $i]]
}
puts -nonewline stderr $prompt
gets stdin answer
if {[string is integer -strict $answer]} {
if {0 <= $answer && $answer < [llength $values]} {
return $answer
}
}
}
}
proc print_liberty {newvalues} {
global lines close_braces
puts [join $lines \n]
puts "values ( \\"
foreach elem $newvalues {
puts [format "\"%s\", \\" [join $elem {, }]]
}
puts ");"
for {set i 1} {$i <= $close_braces} {incr i} {
puts [format %c 125]
}
}
######################################################################
# define DSL
proc timing {label script} {
lappend ::lines [format "timing %s %c" $label 123]
incr ::close_braces
uplevel 1 $script
}
proc rise_constraint {label script} {
lappend ::lines [format "rise_constraint %s %c" $label 123]
incr ::close_braces
uplevel 1 $script
}
proc index_3 {args} {
global idx3
foreach item $args {
lappend idx3 [string map {( "" \" "" , "" ) ""} $item]
}
}
proc values {args} {
global vals
foreach set [lrange $args 1 end-1] {
lappend vals [split [regsub -all {\s*,\s*} $set { }]]
}
}
rename unknown system_unknown
proc unknown args {
lappend ::lines "[join $args];"
}
######################################################################
if {$argc == 0} {
puts "usage: $argv0 filename.lib"
exit
}
set libfile [lindex $argv 0]
if {![file exists $libfile]} {
error "no such file: $libfile"
}
main $libfile
运行它:
$ tclsh liberty.tcl test.lib > newlib.lib
0. 0.084
1. 0.84
2. 3.36
3. 8.4
4. 13.44
select an index_3 value: 0
$ cat newlib.lib
timing () {
related_pin : clk;
timing_type : setup_rising;
rise_constraint (constraint_template_5X5) {
index_1 ("0.01, 0.05, 0.12, 0.2, 0.4");
index_2 ("0.005, 0.025, 0.06, 0.1, 0.3");
values ( \
"1.1, 2.1, 3.1, 4.1, 5.1", \
"6.1, 7.1, 8.1, 9.1, 10.1", \
"11.1, 12.1, 13.1, 14.1, 15.1", \
"16.1, 17.1, 18.1, 19.1, 20.1", \
"21.1, 22.1, 23.1, 24.1, 25.1", \
);
}
}
你确实失去了所有漂亮的缩进,但你得到了你想要的值。
答案 2 :(得分:0)
这是STF(Synopsys Technology File)或简称为 [dot] lib liberty
我在TCL平台上完成了这些文件,但是使用了一些Parsers。
虽然这里有很多解析器可供您使用。
我建议使用解析器处理 [dot] lib ,因为文件格式化了很多次,并且无法通过黄金时段或其他lib工具读取。
还有另外一个可用C语言... google vlsicad ucsd edu + liberty parser