You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求完善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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:50:27