【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 ========================================还能直接导出 CSV:
exportConnectorPinsToCSV "J57" "J57_pins.csv"批量查多个连接器?一行搞定:
getMultipleConnectors {J1 J2 J3 J4}二、OrCAD TCL 是什么?为什么值得学?
OrCAD Capture 内置了 TCL 脚本引擎,可以直接访问原理图数据库。这意味着你能用代码自动化几乎所有手动操作:
- 遍历器件、引脚、网络
- 批量检查设计规则
- 自动生成报告
Cadence 的 DBO(Database 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 → PartInst
proc 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 操作?
