OrCAD Capture SPB 16.6 Tcl API: 器件位号 (RefDes) 获取方法参考 OrCAD Capture SPB 16.6 Tcl API: 器件位号 (RefDes) 获取方法参考概述在 OrCAD Capture SPB 16.6 的 Tcl API 中从不同对象获取器件位号Reference Designator的方法和可靠性各不相同。本文档总结了经过验证的可行方案和已知的限制。方法 A: PartInst/PlacedInst → Occurrence → PathName (预扫描推荐)可靠性: ⭐⭐⭐⭐⭐ 最佳方案这是从页面迭代场景获取位号的推荐方法源自DiodePolarityCheck.tcl第47-111行的模式# 从 PartInst 开始 set lPlacedInst [DboPartInstToDboPlacedInst $lInst] if {$lPlacedInst ! $lNullObj} { # 获取 Occurrence set lOcc [$lPlacedInst GetOccurrencesAtPos 0] if {$lOcc ! $lNullObj} { set lName [DboTclHelper_sMakeCString] $lOcc GetPathName $lName set PathName [DboTclHelper_sGetConstCharPtr $lName] # 提取最后一段 位号 if {[regexp {/(\w)$} $PathName - refName]} { set partRef $refName } } }关键步骤:PartInst → DboPartInstToDboPlacedInst → PlacedInst → GetOccurrencesAtPos(0) → Occurrence → GetPathName → SCHEMATIC1/PAGE1/R1 → regex {/(\w)$} → R1已知限制:需要从Page → NewPartInstsIter获取 PartInst不能在 FlatNet 迭代中使用位号中若含特殊字符非\w会导致 regex 匹配失败可改用splitlindex end方法 B: PortInst/Pin → Occurrence → PathName (FlatNet 迭代推荐)可靠性: ⭐⭐⭐⭐⭐ 最佳方案在FlatNet 迭代场景下通过DboSchematicNet → NewPortInstsIter或DboFlatNet → NewNetOccurrencesIter获得 PortInstPortInst 实际上是 DboPin 对象支持GetOccurrencesAtPos。# 从 PortInst 开始 catch { set lOcc [$lPortInst GetOccurrencesAtPos 0] if {$lOcc ! $lNullObj} { set occP [DboTclHelper_sMakeCString] $lOcc GetPathName $occP set occPath [DboTclHelper_sGetConstCharPtr $occP] if {$occPath ! } { set parts [split $occPath /] if {[llength $parts] 2} { # 路径格式: HierBlock/位号/引脚名 # 位号在倒数第二段 set partRef [lindex $parts end-1] } } } }路径格式说明:普通器件: T113-S3/C2300/1 → 倒数第二段 C2300 ✅ IC芯片: T113-S3/U25/AVCC → 倒数第二段 U25 (与位号U25A可能不匹配 ⚠️) 顶层设计: C2300/1 → 倒数第二段 C2300 ✅注意事项:提取结果为器件位号如U25、C2300、R454对于多 Part 封装如同一封装内的U25A、U25BOccurrence 路径返回的是封装级位号U25这是正确的——A/B后缀仅表示同一封装的不同逻辑 Part方法 C: Soure Package → Part Reference 映射表可靠性: ⭐⭐⭐⭐ 良好后备方案通过预扫描建立Source Package到Part Reference的映射表然后在 FlatNet 迭代中通过 PortInst 的 Source Package 属性反查位号。Step 1 - 预扫描建立映射:# 方法1: 从 Design Occurrences (预扫描1) set srcPkgToRef [list] # 遍历 Design Occurences, 获取 Source Package 和 Part Reference lappend srcPkgToRef [list $compSourcePkg $compRef] # 方法2: 从 PartInst (预扫描2, 更全面) set placedPkgToRef [list] # 在 PartInst 迭代中: lappend placedPkgToRef [list $pSP $pRef]Step 2 - FlatNet 迭代中反查:set lV [DboTclHelper_sMakeCString] $lPortInst GetEffectivePropStringValue [DboTclHelper_sMakeCString Source Package] $lV set srcPkg [DboTclHelper_sGetConstCharPtr $lV] # 查表 set idx [lsearch -index 0 -exact $srcPkgToRef $srcPkg] if {$idx 0} { set partRef [lindex [lindex $srcPkgToRef $idx] 1] }注意:Tcl 8.4 的lsearch不支持-index选项该选项从 Tcl 8.5 开始提供需使用兼容函数proc ::lsearchIdx0 {listVar value} { upvar $listVar lst for {set i 0} {$i [llength $lst]} {incr i} { if {[lindex [lindex $lst $i] 0] $value} { return $i } } return -1 }方法 D: (页面名 引脚号) → 位号 查表法可靠性: ⭐⭐⭐ 受限于唯一性适用于页面与引脚号组合能唯一确定器件的情况。局限:在层次化原理图上多个器件的同一引脚号可能连接到同一个网络。例如02,T113_SOC1页面上的64个器件都有pin1连接到AVCC1V8此时无法唯一确定。# 预扫描: 建立 pagePinRefMap [list $pageName $pinNumber $refdes] # 查找: (page, pin) → refdes foreach _entry $::pagePinRefMap { if {[lindex $_entry 0] $pageName [lindex $_entry 1] $pinNumber} { lappend _hits [lindex $_entry 2] } } if {[llength _hits] 1} { set partRef [lindex _hits 0] }方法 E: 最终后备 - 页面名可靠性: ⭐⭐ 仅作为最后手段当所有方法都无法获取位号时使用页面名作为显示标识set partRef P${pageName}不可行的 API 方法 (SPB 16.6 限制)API结果原因PortInst.GetPartInst()返回 NULLSPB 16.6 不支持PortInst.GetObjectOccurrence()语法上存在但类型不匹配DboPin 上存在但用途不同PortInst.GetParentObj()返回页面对象 (非 PartInst)名如 “INS17050041”DboPartInstToDboPlacedInst($parent)转换失败父对象不是 PartInstPortInst.GetEffectivePropStringValue(Part Reference)返回空PortInst 上无此属性完整的推荐策略 (优先级顺序)在 FlatNet 迭代中获取位号时按以下顺序尝试1. 方法 I: Pin.GetOccurrencesAtPos(0) → PathName → split取倒数第二段 2. 方法 G2: Source Package → 映射表反查 3. 方法 D: (页面名引脚号) → pagePinRefMap (唯一匹配时) 4. 方法 E: 页面名后备 P${pageName}在预扫描页面迭代中获取位号时1. 方法 A: PartInst→PlacedInst→GetOccurrencesAtPos(0)→PathName→regex 2. PartInst.GetReferenceDesignator (后备) 3. PartInst 的 OccurrencePath → split取倒数第二段关键 API 发现: DboPortInst 继承自 DboPinSPB 16.6 中DboSchematicNet.NewPortInstsIter返回的DboPortInst对象继承自 DboPin因此同时拥有两类方法从 DboPin 继承的方法GetPinName/GetPinNumber/GetPinPosition(state)GetStartPoint/GetHotSpot/GetOffsetStartPointGetDefiningPin/GetIdGetIsVisible/GetIsGlobal/GetIsNoConnect/IsBundlePinDboPortInst 自身的方法GetWire/GetNet— 获取连接的线和网络GetOccurrencesAtPos(index)— ✅ 获取 OccurrenceGetObjectOccurrence/GetObjectOccurrences— 方法存在GetEffectivePropStringValue(name, value)— 获取属性值GetOwner— 返回父对象可能是 DboPartInstGetParentObj— 返回页面对象不可用的方法GetPartInst()— ❌ SPB 16.6 中返回 NULL完整的可用方法列表可通过尝试调用不存在的方法获取错误信息会列出所有有效方法。