【OrCAD】【TCL】【获取连接器引脚信息】
做硬件的都知道评审原理图时最头疼的事之一——数引脚。40pin 的连接器一个个点开属性看半小时没了。抄到 Excel 里给 FPGA 工程师还容易漏、容易错。今天用一段 TCL 脚本3 秒搞定。目录一、先看效果二、OrCAD TCL 是什么为什么值得学三、脚本设计思路四、核心代码4.1 获取会话4.2 按位号查找器件4.3 提取引脚信息4.4 主函数和 CSV 导出五、使用方法六、还能做什么总结一、先看效果在 OrCAD Capture 的 TCL 控制台输入一行命令getConnectorPins J57立刻输出 Searching connector: J57 Part Info: RefDes : J57 Name : INS66096 Library: D:\MY_SHARE\ZC706_2_0_LIB#0.OLB Pin List: Pin# Pin Name Net -------------------------------------------------------------- 1 P1 IIC_PMOD_0 2 P2 IIC_PMOD_4 3 P3 IIC_PMOD_1 4 P4 IIC_PMOD_5 5 P5 IIC_PMOD_2 6 P6 IIC_PMOD_6 7 P7 IIC_PMOD_3 8 P8 IIC_PMOD_7 9 P9 GND 10 P10 GND 11 P11 VCC3V3_PS 12 P12 VCC3V3_PS Total 12 pins found 还能直接导出 CSVexportConnectorPinsToCSV J57 J57_pins.csv批量查多个连接器一行搞定getMultipleConnectors {J1 J2 J3 J4}二、OrCAD TCL 是什么为什么值得学OrCAD Capture 内置了 TCL 脚本引擎可以直接访问原理图数据库。这意味着你能用代码自动化几乎所有手动操作遍历器件、引脚、网络批量检查设计规则自动生成报告Cadence 的 DBODatabase Object对象模型层级如下DboSession 会话 └── DboDesign 设计 └── DboSchematic 原理图 └── DboPage 页面 └── DboPartInst 元器件实例 └── DboPin 引脚 └── DboNet 网络每一层都有迭代器Iterator可以遍历所有子对象。三、脚本设计思路整个脚本拆成 6 个函数各司其职函数功能说明getSession获取当前 OrCAD 会话句柄findPartByRefDes按位号遍历整个设计定位目标器件getPartPinInfo遍历器件的所有引脚提取引脚信息getConnectorPins主函数格式化打印引脚信息exportConnectorPinsToCSV导出引脚信息到 CSV 文件getMultipleConnectors批量查询多个连接器四、核心代码4.1 获取会话proc getSession {} { set lSession $::DboSession_s_pDboSession DboSession -this $lSession return $lSession }⚠️DboSession -this这行是关键它将 TCL 对象句柄与底层 C 对象绑定缺少这一步后续调用会报错。4.2 按位号查找器件这是最核心的部分——四层嵌套遍历Design → Schematic → Page → PartInstproc findPartByRefDes {pSession refDes} { set lStatus [DboState] set lNullObj NULL set lDesignsIter [$pSession NewDesignsIter $lStatus] while {1} { set lDesign [$lDesignsIter NextDesign $lStatus] if {$lDesign $lNullObj} { break } set lSchematicsIter [$lDesign NewViewsIter $lStatus $::IterDefs_SCHEMATICS] while {1} { set lView [$lSchematicsIter NextView $lStatus] if {$lView $lNullObj} { break } # View 必须强制转换为 Schematic 类型否则后续方法调用失败 set lSchematic [DboViewToDboSchematic $lView] set lPagesIter [$lSchematic NewPagesIter $lStatus] while {1} { set lPage [$lPagesIter NextPage $lStatus] if {$lPage $lNullObj} { break } set lPartInstsIter [$lPage NewPartInstsIter $lStatus] while {1} { set lInst [$lPartInstsIter NextPartInst $lStatus] if {$lInst $lNullObj} { break } set cstrRef [DboTclHelper_sMakeCString] $lInst GetReferenceDesignator $cstrRef set lRefDes [DboTclHelper_sGetConstCharPtr $cstrRef] DboTclHelper_sReleaseAllCreatedPtrs if {$lRefDes eq $refDes} { return [list $lDesign $lSchematic $lPage $lInst] } } } } } return }4.3 提取引脚信息proc getPartPinInfo {pPartInst} { set lStatus [DboState] set lNullObj NULL set pinList {} set lPinsIter [$pPartInst NewPinsIter $lStatus] while {1} { set lPin [$lPinsIter NextPin $lStatus] if {$lPin $lNullObj} { break } # 引脚号 set cstrPinNum [DboTclHelper_sMakeCString] $lPin GetPinNumber $cstrPinNum set pinNumber [DboTclHelper_sGetConstCharPtr $cstrPinNum] DboTclHelper_sReleaseAllCreatedPtrs # 引脚名 set cstrPinName [DboTclHelper_sMakeCString] $lPin GetPinName $cstrPinName set pinName [DboTclHelper_sGetConstCharPtr $cstrPinName] DboTclHelper_sReleaseAllCreatedPtrs # 网络名 set lNet [$lPin GetNet $lStatus] if {$lNet ! $lNullObj} { set cstrNet [DboTclHelper_sMakeCString] $lNet GetNetName $cstrNet set netName [DboTclHelper_sGetConstCharPtr $cstrNet] DboTclHelper_sReleaseAllCreatedPtrs if {$netName eq } { set cstrNet2 [DboTclHelper_sMakeCString] $lNet GetName $cstrNet2 set netName [DboTclHelper_sGetConstCharPtr $cstrNet2] DboTclHelper_sReleaseAllCreatedPtrs } } else { set netName NO_NET } lappend pinList [list $pinNumber $pinName $netName] } return $pinList }4.4 主函数和 CSV 导出proc getConnectorPins {refDes} { set lSession [getSession] set result [findPartByRefDes $lSession $refDes] if {$result } { puts Error: Part $refDes not found return } set lPartInst [lindex $result 3] set pinList [getPartPinInfo $lPartInst] puts Pin#,Pin Name,Net foreach pin $pinList { puts [lindex $pin 0],[lindex $pin 1],[lindex $pin 2] } puts Total [llength $pinList] pins } proc exportConnectorPinsToCSV {refDes {csvFile }} { if {$csvFile } { set csvFile ${refDes}_pins.csv } set lSession [getSession] set result [findPartByRefDes $lSession $refDes] set lPartInst [lindex $result 3] set pinList [getPartPinInfo $lPartInst] set fp [open $csvFile w] puts $fp Pin#,Pin Name,Net foreach pin $pinList { puts $fp [lindex $pin 0],[lindex $pin 1],[lindex $pin 2] } close $fp puts Exported to: $csvFile }五、使用方法# 第一步加载脚本 source [file normalize {D:\scripts\get_connector_pins.tcl}] # 第二步查询单个连接器引脚 getConnectorPins J57 # 第三步导出到 CSV exportConnectorPinsToCSV J57 J57_pins.csv # 第四步批量查询多个连接器 getMultipleConnectors {J1 J2 J3}六、还能做什么这个脚本只是一个起点。基于同样的 DBO 遍历框架可以继续扩展正则批量查询用J*一键查所有连接器引脚电气类型获取每个引脚的输入/输出/双向属性网络追踪从引脚出发追踪整个网络的完整连接链路接口文档自动化自动生成接口定义文档直接交付给 FPGA 工程师总结要点说明对象模型Session → Design → Schematic → Page → PartInst → Pin字符串操作模式MakeCString→ 方法调用 →GetConstCharPtr→ReleaseAll类型转换DboViewToDboSchematic必须调用不能省略迭代器管理每个NewXxxIter对应一个delete_函数用完释放注意事项不写中文注释、方括号命令需用花括号包裹不想自己折腾留言获取打包好的.enc加密执行文件开箱即用。觉得有用的话点赞 收藏 关注后续会分享更多 OrCAD 自动化脚本电源树分析、差分对检查、时钟网络检查……评论区告诉我你最想自动化哪个 OrCAD 操作