请求完善TCL脚本:提取电压数据并生成指定格式输出文件
问题描述
现有一数据文件,首行定义各类电压类型(如VDDQL(W)、VDDA(W)等),后续每行包含模块名称及对应电压值,电压值间以一个或多个制表符分隔。要求将输入文件转换为指定格式的输出文件。
输入文件示例
Block Name VDDQL(W) VDDA(W) VDD(W) VDDPLL VDD1P2 Data IO TX 8.80E-04 3.00E-04 1.10E-03 Data IO RX 1.88E-05 4.35E-04 6.15E-04 WDQS 2.10E-03 9.00E-04 2.30E-03 RDQS 1.30E-03 TX_CLKGEN 1.20E-03 3.30E-03 TX_CLKGEN_WDQS 1.00E-03 2.90E-03 RX_CLKGEN 4.00E-03 INV_32X 4.13E-04 INV_64X 5.63E-04 INV_128X 9.38E-04 INV_256X 1.70E-03 ZQ Calibration 9.60E-03 2.30E-03 HBM3_PLL 7.50E-03 1.36E-02 SoC PLL 7.50E-03 1.36E-02 RX_VREF 3.96E-04 3.30E-06
期望输出文件格式
Data IO TX < 8.80E-04 3.00E-04 1.10E-03 > VDDQL(W) VDDA(W) VDD(W) Data IO RX < 1.88E-05 4.35E-04 6.15E-04 > VDDQL(W) VDDA(W) VDD(W) WDQS < 2.10E-03 9.00E-04 2.30E-03 > VDDQL(W) VDDA(W) VDD(W) RDQS < 1.30E-03 > VDDA(W) TX_CLKGEN < 1.20E-03 3.30E-03 > VDDA(W) VDD(W) TX_CLKGEN_WDQS < 1.00E-03 2.90E-03 > VDDA(W) VDD(W) RX_CLKGEN < 4.00E-03 > VDDA(W) INV_32X< 4.13E-04 > VDDA(W) INV_64X < 5.63E-04 > VDDA(W) INV_128X < 9.38E-04 > VDDA(W) INV_256X < 1.70E-03 > VDDA(W) ZQ Calibration < 9.60E-03 2.30E-03 > VDDQL(W) VDD(W) HBM3_PLL < 7.50E-03 1.36E-02 > VDD(W) VDDPLL SoC PLL < 7.50E-03 1.36E-02 > VDDA(W) VDD(W) RX_VREF < 3.96E-04 3.30E-06 > VDDQL(W) VDD(W)
现有代码(逻辑受阻)
while {[gets $in_lib line] >=0} { if {[string match {*Block*} $line] == 1} { set input $line set columns [split $input {\s+}] set blockName [lindex $columns 0] set column_1 [lindex $columns 1] set column_2 [lindex $columns 2] set column_3 [lindex $columns 3] set column_4 [lindex $columns 4] set column_5 [lindex $columns 5] } else { set lineData $line } foreach data_line $lineData { set columns [split $line "\t"] # Extract the keyword and values set keyword [lindex $columns 0] set value1 [lindex $columns 1] set value2 [lindex $columns 2] set value3 [lindex $columns 3] set value4 [lindex $columns 4] set value5 [lindex $columns 5] # Print the extracted data set Keyword $keyword set Value1 $value1 set Value2 $value2 set Value3 $value3 set Value4 $value4 set Value5 $value5 } puts $Keyword
解决方案
以下是完善后的TCL脚本,可实现输入到输出的格式转换:
# 打开输入和输出文件,替换为实际文件路径 set in_file [open "input.txt" r] set out_file [open "output.txt" w] # 读取首行并解析电压类型 gets $in_file header_line # 分割首行,忽略空字符串,得到电压类型列表 set voltage_types [lsearch -all -inline -not $header_line ""] # 移除第一个元素"Block Name" set voltage_types [lrange $voltage_types 1 end] # 处理后续每一行数据 while {[gets $in_file line] >= 0} { # 分割行数据,忽略空字符串 set parts [lsearch -all -inline -not [split $line "\t"] ""] if {[llength $parts] == 0} { continue ;# 跳过空行 } # 模块名称是第一个元素 set block_name [lindex $parts 0] # 剩余元素是电压值 set values [lrange $parts 1 end] # 收集非空值对应的电压类型和值 set valid_values [list] set valid_types [list] foreach val $values type $voltage_types { if {$val ne ""} { lappend valid_values $val lappend valid_types $type } } # 构建输出行 set output_line "$block_name < [join $valid_values " "] > [join $valid_types " "]" # 写入输出文件并打印到控制台 puts $out_file $output_line puts $output_line } # 关闭文件 close $in_file close $out_file
关键逻辑说明
- 首行处理:读取首行后,分割并过滤空字符串,提取出所有电压类型,去掉开头的"Block Name"。
- 数据行处理:对每一行数据按制表符分割,过滤空字符串,分离模块名称和电压值。
- 有效值匹配:遍历电压值和对应的电压类型,只保留非空值及其对应的类型。
- 输出构建:按照指定格式拼接模块名称、有效值(用
< >包裹)、有效电压类型,写入输出文件。
内容的提问来源于stack exchange,提问作者Santhosh Nayak D.
相关产品推荐
相关产品推荐

