请求完善TCL版引脚信息读取与对比代码(对标Python实现)
修复LEF引脚参数对比的TCL代码实现
问题背景
需要处理两个LEF格式文件,读取每个引脚的LAYER和RECT信息,对比相同引脚的这两类参数,输出参数完全一致的引脚名称。原TCL代码读取逻辑错误,且未完成对比输出逻辑。
完整TCL代码实现
# 读取LEF文件,返回存储引脚LAYER和RECT信息的字典 proc readPinFile {filename} { set pinDict [dict create] set currentPin "" set fh [open $filename r] while {[gets $fh line] != -1} { set line [string trim $line] if {$line eq ""} { continue } # 匹配PIN行,提取引脚名称 if {[string match "PIN *" $line]} { set currentPin [lindex [split $line] 1] # 初始化当前引脚的LAYER和RECT为空 dict set pinDict $currentPin [dict create LAYER "" RECT ""] } # 匹配LAYER行,提取层信息 if {[string match "LAYER *;" $line]} { if {$currentPin ne ""} { set layer [lindex [split $line] 1] dict set pinDict $currentPin LAYER $layer } } # 匹配RECT行,提取坐标信息 if {[string match "RECT *;" $line]} { if {$currentPin ne ""} { # 拆分后去掉末尾的分号,保留坐标列表 set rectParts [split $line] set rect [lrange $rectParts 1 end-1] dict set pinDict $currentPin RECT $rect } } } close $fh return $pinDict } # 读取两个LEF文件的引脚数据 set pinData1 [readPinFile "osi_hbmp_top_briscm_1.lef"] set pinData2 [readPinFile "osi_hbmp_top_briscm_2.lef"] # 对比引脚并输出结果到文件 set outputFh [open "file04.txt" w] dict for {pinName pinInfo1} $pinData1 { # 检查引脚是否存在于第二个文件中 if {[dict exists $pinData2 $pinName]} { set pinInfo2 [dict get $pinData2 $pinName] # 对比LAYER和RECT是否完全一致 set layerMatch [expr {[dict get $pinInfo1 LAYER] eq [dict get $pinInfo2 LAYER]}] set rectMatch [expr {[dict get $pinInfo1 RECT] eq [dict get $pinInfo2 RECT]}] if {$layerMatch && $rectMatch} { puts $outputFh $pinName puts $outputFh "" ;# 空行分隔,和Python逻辑一致 } } } close $outputFh
代码解释
读取部分(readPinFile proc)
- 用嵌套字典存储数据:顶层字典键为引脚名称,对应的值是包含
LAYER和RECT的子字典 - 逐行读取文件,跳过空行避免无效处理
- 匹配
PIN行时提取引脚名,初始化该引脚的信息字典 - 匹配
LAYER和RECT行时,提取有效信息存入当前引脚的字典(自动过滤行尾分号)
对比输出部分
- 遍历第一个文件的所有引脚,用
dict exists快速判断引脚是否存在于第二个文件 - 分别对比
LAYER字符串和RECT坐标列表的一致性 - 将符合条件的引脚名写入输出文件,保留Python实现中的空行分隔格式
内容的提问来源于stack exchange,提问作者user19842766
相关产品推荐
相关产品推荐

