夜雨聆风学习资料网

ARTICLE · 1136874

【Orcad Tcl源码】原理图转换踩坑记:如何用Tcl脚本揪出OrCAD中隐藏的管脚错误

【Orcad Tcl源码】原理图转换踩坑记:如何用Tcl脚本揪出OrCAD中隐藏的管脚错误

欢度国庆 共谱华章

我们经常会遇到不同EDA软件之间的工程转换问题,最近发现某原理图软件转换到OrCAD时,有一个非常隐蔽的坑:部分电容、电阻等基础器件的管脚号(Pin Number)在转换后出现了异常(比如不是常规的1和2),并且最致命的是,这些错误的管脚号在OrCAD原理图页面上是默认隐藏不显示的!

这种“看不见”的错误如果流到后续的网表导出和PCB Layout阶段,极易导致网表和封装不匹配以及浪费时间查找。

为了提前预防和排查这类转换带来的隐患,依靠人工去双击一个个器件检查属性显然是不现实的。因此,我编写了一个简单的OrCAD Tcl脚本,用于一键扫描整个工程,并按位号顺序导出所有器件的管脚名和管脚号,让所有隐藏错误在文本文档中无所遁形。

今天把这个脚本源码分享给大家,经常做原理图审查或工程转换的同行可以收藏备用,同时也是记录脚本学习。

脚本核心功能

  • 全工程扫描:不局限于当前打开的图纸,脚本会自动遍历整个.dsn工程下的所有原理图文件夹和页面,确保零遗漏。

  • 智能排序:导出的数据会先按照器件位号(Reference)进行字典序排序(如C1, C2, C10),同一器件的管脚也会按数字大小排列,极其利于比对。

  • 格式对齐:输出的纯文本文件采用固定字符宽度对齐,强迫症福音,查阅体验极佳。

使用方法

  • 在电脑D盘根目录(或其他全英文路径)新建一个文本文件,命名为 export_pins.tcl。

  • 将下方的完整源码复制进去并保存。

  • 打开OrCAD Capture,在左侧的项目管理器(Project Manager)中用鼠标左键单击选中你的 .dsn 文件。

  • 在底部的命令窗口(Command Window)中输入以下命令并回车:source {D:/export_pins.tcl}

  • 提示完成后,前往D盘打开 pin_list.txt,即可在Excel或文本编辑器中快速排查非法的管脚号。

完整 Tcl 源码:

# ============================================================#  export_pins.tcl#  功能:遍历当前OrCAD工程的所有器件,导出位号、管脚号与管脚名#  用法:在Command Window输入 source {D:/export_pins.tcl}# ============================================================set lStatus [DboState]set lNullObj NULLset lOutFile "D:/pin_list.txt"# 1. 智能获取当前工程 (Design)set lDesign ""if { [catch {set lDesign [GetActivePMDesign]}] == 0 && $lDesign != $lNullObj && $lDesign != "" } {    # 成功获取到顶层设计} else {    # 后备方案:从当前打开的页面顺藤摸瓜找工程    if { [catch {set lPage [GetActivePage]}] == 0 && $lPage != $lNullObj && $lPage != "" } {        set lSchem [$lPage GetSchematic $lStatus]        set lDesign [$lSchem GetDesign $lStatus]    } else {        puts "Error: Cannot find active design. Please open a schematic page or select the .dsn file."        return    }}set all_pins_list {}# 2. 遍历整个工程里的所有“视图/文件夹” (Views)set lViewsIter [$lDesign NewViewsIter $lStatus]set lView [$lViewsIter NextView $lStatus]while { $lView != $lNullObj } {    if { [catch {set lSchematic [DboViewToDboSchematic $lView]}] == 0 && $lSchematic != $lNullObj } {        # 3. 遍历当前文件夹下的所有页面 (Pages)        set lPageIter [$lSchematic NewPagesIter $lStatus]        set pPage [$lPageIter NextPage $lStatus]        while { $pPage != $lNullObj } {            # 4. 遍历当前页面上的所有器件            set lPartInstsIter [$pPage NewPartInstsIter $lStatus]            set lInst [$lPartInstsIter NextPartInst $lStatus]            while { $lInst != $lNullObj } {                set lPlacedInst [DboPartInstToDboPlacedInst $lInst]                if { $lPlacedInst != $lNullObj } {                    # 获取实际显示的位号                    set lRef [DboTclHelper_sMakeCString]                    set lRefProp [DboTclHelper_sMakeCString "Part Reference"]                    $lPlacedInst GetEffectivePropStringValue $lRefProp $lRef                    set lRefStr [DboTclHelper_sGetConstCharPtr $lRef]                    if { $lRefStr == "" } {                        $lPlacedInst GetReferenceDesignator $lRef                        set lRefStr [DboTclHelper_sGetConstCharPtr $lRef]                    }                    # 遍历器件管脚                    set lPinIter [$lPlacedInst NewPinsIter $lStatus]                    set lPin [$lPinIter NextPin $lStatus]                    while { $lPin != $lNullObj } {                        set lPinName [DboTclHelper_sMakeCString]                        $lPin GetPinName $lPinName                        set lPinNameStr [DboTclHelper_sGetConstCharPtr $lPinName]                        set lPinNum [DboTclHelper_sMakeCString]                        $lPin GetPinNumber $lPinNum                        set lPinNumStr [DboTclHelper_sGetConstCharPtr $lPinNum]                        # 追加到内存列表                        lappend all_pins_list [list $lRefStr $lPinNumStr $lPinNameStr]                        set lPin [$lPinIter NextPin $lStatus]                    }                    catch {delete_DboPartInstPinsIter $lPinIter}                }                set lInst [$lPartInstsIter NextPartInst $lStatus]            }            catch {delete_DboPagePartInstsIter $lPartInstsIter}            set pPage [$lPageIter NextPage $lStatus]        }        catch {delete_DboSchematicPagesIter $lPageIter}    }    set lView [$lViewsIter NextView $lStatus]}catch {delete_DboDesignViewsIter $lViewsIter}# 检查是否成功抓取数据if { [llength $all_pins_list] == 0 } {    puts "Warning: No pins found in the entire design. File not created."    return}# 5. 全局字典序排序 (先排位号,再排管脚号)set sorted_all_pins [lsort -dictionary $all_pins_list]# 6. 一次性格式化写入文件set lFh [open $lOutFile w]puts $lFh [format "%-15s %-15s %-20s" "Reference" "PinNumber" "PinName"]puts $lFh [format "%-15s %-15s %-20s" "---------" "---------" "-------"]foreach pin_data $sorted_all_pins {    set pRef  [lindex $pin_data 0]    set pNum  [lindex $pin_data 1]    set pName [lindex $pin_data 2]    puts $lFh [format "%-15s %-15s %-20s" $pRef $pNum $pName]}close $lFhputs "Done: Pin list of the ENTIRE DESIGN has been successfully written to $lOutFile"

EDA软件不仅是一个画图工具,借助脚本接口往往能大幅提升我们的防呆查错效率。希望这个小工具能帮大家在处理格式转换或进行BOM/网表审查时少走弯路。

相关学习资料