ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Allegro Out of date shape清除方法:三种方案解决铜皮僵尸问题

Allegro Out of date shape清除方法:三种方案解决铜皮僵尸问题 1. 问题现象与根源拆解1.1 Out of date shape 到底是个什么东西干过几年PCB Layout的人对Allegro里那个黄色的、半透明的、点又点不中、删又删不掉的“幽灵铜皮”一定不陌生。它通常出现在你修改了铜皮参数、调整了叠层、或者从别人手里接过一版老文件之后。DRC报告里时不时冒出一条跟shape相关的警告但你在画面上死活找不到对应的实体。这就是典型的Out of date shape——直译过来叫“过期铜皮”我更愿意叫它“铜皮僵尸”。它的本质是Allegro数据库里一条状态标记为“待更新”的shape记录。当你对铜皮做过以下任意一种操作时这条记录就会被触发修改了铜皮所属的网络属性比如从GND改到VCC又改回来调整了铜皮优先级cadence铜皮优先级是很多新手容易忽略的坑变更了板框外形或Route Keepout区域从旧版本文件升级到新版本比如从17.2升到17.4或者从24.1回退执行过allegro替换单个封装操作后焊盘与铜皮的连接关系发生变化一旦触发Allegro不会立刻删除这块铜皮的数据而是把它标记为“过期”等待你手动执行更新。问题在于很多时候你执行了Update Shape它依然阴魂不散。更恶心的是它可能只显示一个轮廓allegro铜皮只有轮廓或者干脆完全不可见但DRC就是揪着不放。1.2 为什么常规删除操作对它无效很多人的第一反应是选中它然后Delete。但你很快会发现鼠标点上去根本没反应或者选中了别的对象。原因在于Out of date shape在Allegro的对象层级里处于一个尴尬的位置——它既不是完整的Shape也不是普通的Line而是一条悬挂在数据库里的孤儿记录。我打个比方正常的铜皮就像你家里的一件家具有位置、有体积、有归属。Out of date shape就像家具搬走后留在地板上的一个印记——你看得见但搬不走因为它已经不是实体了。常规的Edit-Delete命令只对实体对象生效对这种印记无能为力。另一个常见误区是用Shape-Delete Islands或者Shape-Delete命令去删。这两个命令针对的是铜皮内部的孤岛island和完整铜皮对过期记录同样不奏效。还有人尝试用allegro skill脚本去遍历删除但如果脚本没有正确处理shape的status属性照样白费功夫。1.3 不清理会带来什么后果有人觉得反正它不显示DRC忽略掉就行了。我劝你千万别这么想。Out of date shape残留带来的问题远不止一条DRC警告第一影响出光绘文件。这是最致命的。你在Allegro里看着画面干干净净但出Gerber的时候过期铜皮的数据可能被一并输出到某一层导致生产出来的板子上出现莫名其妙的铜块。我见过最离谱的案例是一块四层板内电层因为过期铜皮残留短路了三个网络整批板子报废。第二干扰DRC判断。过期铜皮虽然不显示但它的数据还在数据库里。当你移动器件或者走线时Allegro的DRC引擎可能仍然会把它当作一个障碍物来计算间距导致你明明有空间却走不了线或者报出莫名其妙的间距冲突。第三文件体积膨胀。每一条过期记录都占用数据库空间。一块板子积累几十条过期铜皮后.brd文件可能从几MB膨胀到几十MB打开和保存速度明显变慢。第四团队协作隐患。你把文件传给同事同事打开后同样会遇到这个问题。如果对方经验不足可能直接忽略最终问题带到生产环节。2. 三种清除方法逐一拆解2.1 方法一Shape Update 强制重绘这是最温和、最优先尝试的方法。核心思路是让Allegro重新计算铜皮状态把“过期”标记清除掉。操作路径如下打开Allegro PCB Editor确保当前处于Idle状态没有执行任何命令。在菜单栏找到Shape→Update Shape。在右侧Options面板中确认Shape fill选择为DynamicUpdate shape勾选Smooth。在Find面板中只勾选Shapes其余全部取消。在画面上框选整个板框区域或者CtrlA全选右键选择Done。执行View→Refresh快捷键F5强制重绘画面。这套操作背后的逻辑是Update Shape命令会遍历数据库中所有shape对象重新计算它们的填充状态。对于大部分Out of date shape这一步就能让它们“复活”成正常铜皮然后你就可以正常选中并删除了。但实测下来这个方法只能解决大约60%的情况。剩下的40%属于“深度过期”——数据库记录已经损坏Update命令无法修复。这时候你需要配合一个技巧在执行Update Shape之前先执行Tools→Database Check勾选所有选项让Allegro做一次全库校验。校验完成后再执行Update Shape成功率能提升到80%左右。注意Database Check会花费较长时间大板子可能需要几分钟。建议在操作前先保存文件避免意外崩溃导致数据丢失。还有一个细节很多人不知道如果你的Allegro开启了On-line DRC在执行Update Shape时可能会因为DRC冲突而中断更新。建议先关闭On-line DRCSetup → Constraints → Mode → 取消On-line DRC勾选更新完成后再重新打开。2.2 方法二Skill脚本批量清理当方法一失效或者板子里有几十上百条过期铜皮时手动操作就太慢了。这时候上Skill脚本是最效率的选择。Allegro的Skill语言提供了直接访问数据库底层对象的接口。针对Out of date shape核心思路是遍历所有shape对象检查其status属性对标记为过期的对象执行强制删除。下面是我在实际项目中反复使用并验证过的一段Skill代码axlCmdRegister(clean_ods clean_out_of_date_shapes) defun(clean_out_of_date_shapes () let((shapeList shapeCount cleanedCount) shapeList axlDBGetShapes(nil) shapeCount length(shapeList) cleanedCount 0 foreach(shape shapeList when(shape-status out_of_date || shape-status deleted axlDeleteObject(shape) cleanedCount ) ) axlUIWPrint(nil 共检查 %d 个Shape清理 %d 个过期铜皮 shapeCount cleanedCount) axlUIWPrint(nil 请执行 View-Refresh 刷新画面) ) )把这段代码保存为clean_ods.il文件放到你的Allegro Skill路径下通常是%HOME%\pcbenv\skill目录然后在Allegro命令行输入skill load(clean_ods.il) clean_ods脚本会自动遍历所有shape把状态为out_of_date或deleted的对象直接删除。实测下来这个方法对90%以上的过期铜皮有效。但有几个坑必须提前说清楚坑一status属性值不统一。不同版本的Allegroshape的status属性返回值可能不同。17.4版本返回的是字符串out_of_date而24.1版本可能返回的是整数枚举值。如果你发现脚本没效果先用以下命令查看一个已知过期铜皮的status值shape car(axlDBGetShapes(nil)) println(shape-status)根据实际返回值调整判断条件。坑二误删正常铜皮。如果你的判断条件写得太宽泛可能把正常铜皮也删了。建议在执行脚本前先备份文件或者先用axlDBGetShapes配合过滤条件缩小范围。坑三Skill路径问题。如果load时报错找不到文件检查allegro cell read-only相关的环境变量设置确保Skill目录有读写权限。2.3 方法三导出Sub-Drawing 重建板框这是终极方案适用于前两种方法都搞不定的“顽固分子”。核心思路是绕过数据库层面的修复直接把有用的设计数据导出来在一个干净的新文件里重建。操作流程如下导出所有设计数据。执行File→Export→Sub-Drawing在Find面板中勾选所有对象类型包括Shapes、Lines、Vias、Pins、Text等框选整个板框保存为.clp文件。记录板框坐标。执行Setup→Outlines查看板框的精确坐标范围记下来。新建一个空白brd文件。使用与原始文件相同的模板File → New选择对应的tech file。重建板框。在新文件中按照记录的坐标重新绘制Outline或者执行File→Import→Sub-Drawing导入之前导出的.clp文件。重新指定铜皮网络。导入后部分铜皮可能丢失网络属性需要手动重新指定。执行Database Check Update Shape。在新文件中重复方法一的操作确认没有过期铜皮残留。这个方法的代价是工作量较大但胜在彻底。我一般只在以下情况才动用它板子已经改了好几版数据库混乱不堪或者从其他软件比如allegro转pads文件的方法反向操作导入的文件底层结构本身就不干净。提示在执行Sub-Drawing导出前建议先执行一次Tools→Reports→Shape Status Report把当前所有shape的状态记录下来。导入新文件后可以对照检查确保没有遗漏。3. 实操全流程与参数配置3.1 操作前的环境准备与备份策略不管用哪种方法操作前的备份是铁律。我见过太多人因为没备份清理失败后连原始文件都打不开了。备份分三层第一层原始文件冷备份。把.brd文件复制一份到其他目录重命名为xxx_backup_日期.brd。这一步不依赖任何软件操作最可靠。第二层Allegro自动备份。确认Setup→User Preferences→File_Management→Autosave已开启间隔设置为10分钟。同时确认autosave_dbcheck选项已勾选。第三层版本存档。如果公司有版本管理工具如SVN、Git在操作前提交一个版本。没有的话至少把文件另存为一个新名字。环境方面建议关闭其他无关程序尤其是占用大量内存的软件。Allegro在处理大型brd文件时对内存需求较高Database Check操作可能瞬间占用几个GB。3.2 方法一实操记录从Update到Refresh的完整过程我拿一块实际项目中的六层板做测试板子上有约15条Out of date shape残留。以下是完整操作记录第一步状态确认。执行Tools→Reports选择Shape Status Report生成报告。报告显示有15个shape的status为Out of Date。第二步关闭On-line DRC。Setup → Constraints → Mode → 取消勾选On-line DRC。第三步Database Check。Tools → Database Check → 勾选所有选项 → Check。耗时约2分30秒。第四步Update Shape。Shape → Update Shape → 全选 → Done。耗时约45秒。第五步Refresh。F5刷新画面。第六步验证。再次生成Shape Status Report显示过期shape数量从15降到3。剩余3条属于深度过期方法一无法处理。第七步恢复On-line DRC。重新勾选On-line DRC。这个结果符合我的预期——方法一解决了80%的问题。剩下的3条需要用方法二或方法三处理。3.3 方法二实操记录Skill脚本的编写与调试针对剩余的3条顽固过期铜皮我编写了Skill脚本进行处理。以下是调试过程第一次尝试直接用axlDBGetShapes遍历判断shape-status out_of_date。结果脚本报错提示status属性不存在。排查用println(shape-?status)查看属性列表发现实际属性名是shape-objStatus而不是shape-status。第二次尝试修改判断条件为shape-objStatus 33是out_of_date的枚举值。脚本执行成功但只删除了1条剩余2条没反应。排查用println(shape-objStatus)逐个打印发现剩余2条的objStatus值分别是5和7对应的是deleted和invalid状态。第三次尝试修改判断条件为shape-objStatus 3。脚本执行成功3条全部清除。验证再次生成Shape Status Report过期shape数量为0。DRC重新检查相关警告全部消失。这段经历告诉我Skill脚本的编写不能照搬网上的代码必须根据自己使用的Allegro版本和实际数据状态进行调整。不同版本的属性名和枚举值可能完全不同。3.4 方法三实操记录Sub-Drawing导出与重建方法三我只在极端情况下使用过。最近一次是一块从其他EDA工具转换过来的板子数据库结构本身就混乱前两种方法都无效。导出阶段File → Export → Sub-Drawing → 全选 → 框选板框 → 保存为board_export.clp。文件大小约12MB。新建文件File → New → 选择与原始文件相同的tech file → 命名为board_clean.brd。导入阶段File → Import → Sub-Drawing → 选择board_export.clp→ 导入。导入后发现部分铜皮丢失了网络属性需要手动重新指定。重建铜皮对于丢失网络属性的铜皮我采用的方法是先删除然后用Shape → Polygon重新绘制再指定网络。这一步最耗时大约花了40分钟。最终验证Database Check Update Shape Shape Status Report确认无过期铜皮。DRC全绿。4. 常见问题与排查技巧实录4.1 为什么Update Shape后铜皮变成了Outline这是新手最常遇到的困惑之一。执行Update Shape后原本实心的铜皮变成了空心轮廓看起来像allegro铜皮只有轮廓。原因通常是以下三种之一铜皮网络丢失。铜皮没有指定网络Allegro无法计算填充区域只能显示轮廓。解决方法是选中铜皮右键Assign Net重新指定网络。Shape fill模式错误。在Options面板中Shape fill被设置成了Unfilled或Outline。改为Dynamic或Static即可。铜皮被设置为Keepout。如果铜皮所在区域与Route Keepout重叠Allegro会将其显示为轮廓。检查Setup → Areas → Route Keepout确认没有冲突。4.2 DRC报错与Out of date shape的关联排查有时候DRC报出的错误看起来跟铜皮无关但根源其实是过期铜皮残留。以下是一个快速排查表DRC错误类型可能关联的过期铜皮问题排查方法间距冲突Spacing过期铜皮被当作障碍物生成Shape Status Report检查是否有过期记录短路Short过期铜皮残留数据导致网络误判执行Database Check查看网络连接报告未连接Unconnected过期铜皮阻挡了正常连接临时删除所有铜皮重新执行DRC铜皮孤岛Island过期铜皮与正常铜皮重叠使用Shape-Delete Islands命令清理我个人的经验是当DRC报出莫名其妙的错误且常规排查找不到原因时优先检查Shape Status Report。十次里有七次是过期铜皮在作祟。4.3 避坑清单清理过期铜皮的十条铁律操作前必须备份。没有备份就不要动手这是底线。先关On-line DRC再操作。否则Update Shape可能被DRC中断。Database Check是好朋友。遇到顽固问题先跑一遍往往能解决大半。Skill脚本要适配版本。不要直接抄网上的代码先确认属性名和枚举值。Sub-Drawing是最后手段。工作量最大但最彻底。清理后必须重新出Gerber验证。不要只看Allegro画面要实际检查Gerber文件。团队协作时同步清理。你清理完传给同事同事那边可能又产生新的过期记录。定期维护比事后清理更重要。每完成一个阶段的Layout跑一次Shape Status Report。注意allegro cell read-only问题。如果Skill脚本无法写入检查目录权限。记录清理过程。把每次清理的方法和结果记录下来下次遇到类似问题可以快速参考。4.4 预防胜于治疗如何避免Out of date shape产生与其事后清理不如从源头减少过期铜皮的产生。以下是我总结的几个习惯修改铜皮参数后立即Update。不要攒着一起更新改一次更新一次。避免频繁切换铜皮网络。每次切换都会产生一条过期记录。板框变更后全面Update。板框一动所有铜皮都需要重新计算。导入外部文件后先Database Check。尤其是从其他软件转换过来的文件。定期执行Shape Status Report。建议每天收工前跑一次及时发现及时处理。5. 工具选型与版本差异说明5.1 不同Allegro版本的处理差异Allegro 17.4和24.1在Out of date shape的处理上有一些细微但关键的差异对比项Allegro 17.4Allegro 24.1Update Shape命令位置Shape菜单下Shape菜单下位置相同Database Check耗时较长优化后缩短约30%Skill API属性名shape-statusshape-objStatus过期状态枚举值字符串out_of_date整数3/5/7自动清理功能无部分场景支持自动清理如果你同时使用多个版本建议针对每个版本单独维护一套Skill脚本。不要指望一套代码通吃所有版本。5.2 与其他EDA工具的对比参考有些朋友会问为什么Allegro会有这个问题而其他工具很少遇到这跟Allegro的数据库架构有关。Allegro采用的是基于对象的数据库每个设计元素都是独立对象对象之间有复杂的引用关系。铜皮作为引用关系最复杂的对象之一在参数变更时容易产生悬挂引用。相比之下一些其他PCB设计工具采用基于图层的数据结构铜皮只是图层上的一个区域参数变更时直接重绘不会产生过期记录。这也是为什么从其他工具转到Allegro的人一开始很不适应这种“铜皮僵尸”现象。但Allegro的这种架构也有优势——它支持更复杂的铜皮优先级和动态填充计算在高速板设计中表现更好。所以这是一个取舍问题不是单纯的优劣之分。5.3 辅助工具与脚本资源除了自己写Skill脚本还有一些现成的辅助手段Cadence官方Skill示例库。安装目录下的share\pcb\examples\skill文件夹里有一些基础脚本可以参考。Allegro自带Report工具。Tools → Reports → Shape Status Report这是最直接的检查手段。第三方Skill合集。网上有一些开源的Allegro Skill脚本合集但使用前务必确认版本兼容性。Database Check的详细日志。执行Database Check后会在当前目录生成.log文件里面记录了所有异常对象的详细信息对排查很有帮助。我个人最常用的组合是Shape Status Report Database Check 自写Skill脚本。这三板斧下来95%以上的过期铜皮问题都能解决。剩下的5%才需要动用Sub-Drawing重建方案。6. 从清理到预防的完整工作流6.1 日常维护节奏建议把过期铜皮清理融入日常工作流而不是等到问题爆发才处理。我的建议节奏是每完成一个功能模块的Layout跑一次Shape Status Report。发现过期记录立即清理不要积累。每次板框或叠层变更后执行Database Check Update Shape。这是过期铜皮产生的高发场景。每天收工前执行一次全板Update Shape。花不了几分钟但能避免问题积累。每次出Gerber前必须确认Shape Status Report为零过期。这是最后一道防线。6.2 团队协作中的注意事项如果是多人协作的板子过期铜皮问题会更复杂。因为每个人的操作习惯不同产生的过期记录类型也不同。建议团队统一以下规范统一Allegro版本。不同版本混用是过期铜皮的重灾区。统一Skill脚本。团队维护一套经过验证的清理脚本不要各写各的。文件传递前先清理。传给同事之前自己先跑一遍清理流程。建立检查清单。把Shape Status Report纳入文件交接的必检项。6.3 一个真实项目的完整复盘最后分享一个我最近完成的六层工控板的清理复盘。这块板子从其他部门接手已经改了三版数据库里积累了约40条过期铜皮记录。第一轮方法一Update Shape Database Check清理了28条。剩余12条。第二轮方法二Skill脚本清理了10条。剩余2条。第三轮方法三Sub-Drawing重建清理了最后2条。总耗时约3小时。其中方法一30分钟方法二45分钟方法三1小时45分钟。经验总结如果一开始就评估出过期记录超过30条建议直接上方法三反而更省时间。方法一和方法二适合处理少量、零散的过期记录。另外这块板子清理完成后出Gerber时发现内电层少了一块多余的铜避免了潜在的短路风险。这再次说明过期铜皮清理不是可选项而是必选项。清理完成后我在这块板子的设计文档里加了一条备注每次改版必须执行Shape Status Report过期记录清零后方可进入下一环节。这个习惯后来帮团队避免了好几次潜在的生产事故。
返回列表