AD封装导入Allegro:ASCII转换、库路径与验收避坑
简介:一份聚焦 EDA 工具协同的实操文档,面向需要在 Cadence Allegro 中复用 Altium Designer 封装库的 PCB 设计工程师与库管理初学者,针对两套软件封装格式不互通、重复建库耗时的问题给出可落地的转换路径。内容沿 AD 端新建空 PCB、放置待迁移封装、另存为 PCB ASCII 文件,到 Allegro 端新建 BRD 工程、经 CAD Translators 导入 Altium PCB、再导出 Library 的完整链路展开,并重点说明 symbol 的 dra、log、psm 文件,shape 的 dra 与 .ssm 文件,以及焊盘文件应分别归入封装库、shape-symbol 库和焊盘路径的存放规则,同时提示导入后核对尺寸、位置与连接一致性的检查要点。压缩包共 1 个 docx 文件,约 63KB,篇幅精简、按步骤编号组织,便于边操作边对照。目前已有 1475 人学习,适合希望打通 AD 与 Allegro 封装迁移、减少重复建库工作量的读者快速上手,并排查路径设置与文件归类中的常见问题。
1. AD 封装导入 Allegro:一次迁移值不值,先看这三个前提
手上一批在 AD 里已经出过三版板子的封装,新项目要求用 Allegro 交付,重画四十多个封装显然不划算。把 AD(Altium Designer)的封装导入 Allegro,本质是把一个二进制 PCB 数据库翻译成双方都能读的 ASCII 记录,再在目标端重建 padstack、package symbol、shape symbol 三套文件,最后挂进库路径里被 Place 调用。它适合两类人:已经有成熟 AD 封装库、必须切到 Allegro 出图的团队;以及只迁移个别难画封装(异形连接器、天线馈点、沉板器件)的场合。不适合的也要说清楚——封装里堆了大量 3D 体、叠焊盘、复杂铜皮定义的,转过去大概率要手工返工,那不如直接按 Allegro 的 padstack 规范重画一遍,省下的返工时间比硬转更多。
2. 迁移链路拆解:ASCII、PSM、SSM 与焊盘文件到底在传什么
2.1 交换格式为什么锁定 PCB ASCII 而不是二进制 PcbDoc
AD 的.PcbDoc默认是二进制容器,内部带压缩、带版本头、带工具自己的对象索引,第三方工具没法直接解析。ASCII 版本则是纯文本记录流,每一行对应一个对象:pad、track、arc、text、component、polygon,转换器读的就是这些记录。
真正被翻译的是 component 记录里的三样东西:这个封装有哪些焊盘、焊盘各自落在哪一层、焊盘的形状和尺寸参数。转换器拿到这三样后,先在 Allegro 里重新生成 padstack(.pad),再把焊盘实例和图形元素(丝印线、装配外框)拼成 package symbol(.dra→.psm),如果封装里还嵌了自定义图形(比如异形铜皮做成的 logo 或天线形状),会额外生成 shape symbol(.ssm)。
这里有个版本兼容的坑:AD 版本越新,ASCII 里的记录字段越多,老转换器遇到不认识的字段会直接跳过甚至报错。常见做法是拿一份和转换器同代的 AD 版本重新导出,而不是硬用最新版存。
2.2 一次转换会在磁盘上留下哪几类文件
很多人导入完成后看到输出目录里一堆文件就懵了,其实只有五类,职责分得很清楚:
| 扩展名 | 归属 | 作用 | 是否要进库搜索路径 |
|---|---|---|---|
.pad | padstack | 焊盘定义,含各层尺寸与热焊盘参数 | 必须,进 padpath |
.dra | 源文件 | symbol / shape 的可编辑源图 | 不用,但要留档 |
.psm | 编译产物 | package symbol,Place 时真正被读取的文件 | 必须,进 psmpath |
.ssm | 编译产物 | shape symbol,异形图形引用时被读取 | 必须,进 psmpath |
.txt | device file | 器件映射,网表导入时用于匹配引脚 | 建议,进 devpath |
.log | 日志 | 转换过程记录,含跳过的对象和报错 | 不用,留着排查 |
最关键的一条:.psm是.dra编译出来的产物,不是同一个东西。改了.dra里的丝印或焊盘位置,如果不重新执行一次生成 symbol 的动作,Place 出来的还是老样子。这个机制在 Allegro 里属于典型的黑匣子,新手会反复怀疑自己路径配错了,其实只是没重建。
2.3 三个路径变量与三类目录的对应关系
Allegro 找文件不靠“导入”,靠环境变量里的搜索路径。装好之后在Setup → User Preferences → Paths → Library里能看到三个关键项:
padpath:找.pad。焊盘找不到时,Place 阶段直接报错退出。psmpath:找.psm和.ssm。这一项配错,封装列表就是空的。devpath:找.txt。只有走网表导入才用得上,手工放置可以暂时不管。
我一般会把三个路径都指向项目根目录下的固定子目录,而不是散落在各个导出目录里。团队里更稳的做法是把这三个变量写进项目级的初始化文件,让每个人打开工程时路径一致,避免“我这里能放你那里不能放”的扯皮。
2.4 转换器能带过去什么,哪些必须手工补
先把预期摆正,省得白干:
| 对象 | 迁移结果 |
|---|---|
| 圆形、方形、矩形、椭圆焊盘 | 基本准确,需核对尺寸精度 |
| 阻焊、钢网层开窗 | 跟随焊盘带过去,取决于层映射是否配对 |
| 丝印线与文字 | 带过去,字体被替换成 Allegro 的笔画字体,字高需复核 |
| 装配外框、器件高度 | 高度值通常丢失,需手工填到 symbol 属性里 |
| 3D 体 | 丢失,不影响电气,但影响结构干涉检查 |
| 叠焊盘(顶层-中间层-底层分开定义) | 可能退化成单层焊盘,必须逐个检查 |
| 板级覆铜、设计规则 | 不随封装迁移,本来也不该出现在封装里 |
3. AD 侧准备:空 PCB、封装摆放与 ASCII 另存的四个规范
3.1 新建空白 PCB 的四条硬规矩
第一步是在 AD 里新建一个空 PCB,把要迁移的封装放上去。听起来简单,但这一步决定了后面 80% 的问题,四条规矩必须守:
路径无中文、无空格。整条路径从盘符开始全部用英文和数字,目录层级也不要太深。转换器在中途会写临时文件,路径里带中文时某些环节会静默失败,日志里只留一行语焉不详的报错。这条属于血泪经验,别试。
原点设在封装的第一脚或者几何中心。AD 里用Edit → Set Reference分别设成 Pin 1 或 Center,两种都行,但整批封装要统一。如果不设,转换器会按 AD 的绝对坐标搬运,导入后在 Allegro 里 Place 出来位置会偏得离谱。
单位与目标端对齐。AD 的 PCB 单位设成 mil 还是 mm,直接决定 ASCII 里记录的小数位数。目标封装要求是 mil 的,就在 AD 里切成 mil 再放封装;要求是 mm 的,就统一 mm 并且保留三位小数。中途混用会引入二次换算误差,这个误差在 0.6mm 焊盘上表现为 0.5999,肉眼看不出来,贴片时能让你怀疑人生。
不要带设计规则、不要带网络、不要铺铜。空的 PCB 就是空的,规则和网络会让转换器多做一堆无用功,某些情况下还会因为规则里的非法对象中断转换。
3.2 放置封装的姿势:一个封装一个位置
用Place → Component从库里挑封装,一个一个放。三条操作要点:
第一,每个封装之间留出足够间距,别叠在一起。叠放会让转换器把多个封装的图形元素混到同一个 symbol 里,或者是后一个覆盖前一个,最后只能重来。
第二,每放一个就把 Designator 改成能认出来的名字,比如U1、J1、CONN_A。转换后的 symbol 名字大多来自 Designator 或 Comment,命名混乱的话,后面在 Allegro 库列表里根本对不上号。我习惯在放之前先在库里把封装名统一成前缀_封装类型_尺寸的格式,比如CONN_HDR_2X5_254,转换后一个都不用改。
第三,确认焊盘编号与原理图符号对得上。转换器会照搬 AD 里的焊盘编号,编号是1,2,3还是A1,A2,B1,直接影响后续网表匹配。有编号缺失或者重复的,先在 AD 里改掉。
3.3 另存为 PCB ASCII File 的路径与验证方法
放完之后,File → Save As,保存类型选PCB ASCII File (*.PcbDoc),文件名保持和原工程一致,另存到一个干净的输出目录。
存完做一次验证:用任意文本编辑器打开这个文件,能看到大量以|RECORD=开头的文本行,说明确实是 ASCII 格式;如果打开是一堆乱码,说明保存类型没选对,回去重存。文件体积上,ASCII 版本通常比二进制大好几倍,这个差异本身也是一个快速判断依据。
有个细节容易被忽略:ASCII 的保存动作会把当前板上的所有对象都写进去,包括那些你看不见的、被隐藏的、放在板框外的对象。所以保存前按Ctrl+A全选看一下状态栏的统计数字,跟预期差太多就说明板上还有多余的东西。
3.4 导出前的自检表
导出前照着过一遍,比事后在 Allegro 里排错省事得多:
| 检查项 | 合格标准 | 不合格的后果 |
|---|---|---|
| 保存路径 | 全英文、无空格、层级浅 | 转换中途静默失败 |
| 板子内容 | 只有目标封装,无网络无覆铜 | 转换缓慢或报错中断 |
| 封装原点 | 全部统一为 Pin 1 或 Center | 导入后位置偏移 |
| 封装间距 | 互不重叠,边界清晰 | symbol 图形互相污染 |
| 命名 | 统一前缀,无中文、无空格、无斜杠 | 文件名非法,psm 生成失败 |
| 焊盘编号 | 与原理图符号一致,无重复 | 网表导入匹配失败 |
| 单位与精度 | 与目标端一致,小数位够用 | 焊盘尺寸差 0.01 量级 |
| 文件格式 | 文本编辑器能读出记录行 | 实际存的还是二进制 |
4. Allegro 侧导入:转换器参数、Library 导出与文件归位
4.1 新建 .brd 与设计参数的前置设置
在 Allegro PCB Editor 里新建一个空白.brd。别急着导入,先把设计参数对齐:Setup → Design Parameters → Design页里,把 User Units 设成和目标封装一致的单位(mil 或 mm),精度按常规取 4 位小数,原点保持默认的 (0,0) 不做偏移。
这一步不做的话,转换器会拿.brd当前的单位去解读 ASCII 里的数值,mil 当 mm 读,封装直接放大 39 倍,看起来像个巨无霸。转换器本身也有单位选项,两处设置必须一致,这是最容易翻车的地方之一。
另外确认一下转换器组件是否装上了。部分安装选项里 CAD Translators 不是默认勾选的,File → Import → CAD Translators下面如果找不到 Altium 相关条目,回去补装导入导出组件即可,不用重装整个工具。
4.2 Altium PCB 转换器的选项逐项拆解
路径是File → Import → CAD Translators → Altium PCB,弹出的对话框里几个参数值得逐个说:
Input file:选刚才存出来的 ASCII 文件。选不中或者报格式错误,多半是文件名后缀被系统藏起来了,实际存的还是.PcbDoc二进制。
Output directory:单独建一个空目录,不要和已有库混在一起。转换器会把.brd、日志和一批 symbol 文件全倒进来,混在旧库目录里以后根本分不清哪些是这次生成的。
Units:跟 AD 侧保持一致。AD 用的 mil 就选 mil,用的 mm 就选 mm。这一项和 4.1 里的 Design Parameters 必须成对,一对错了就得整批重来。
Layer mapping:这是最需要人工干预的一项。AD 的层名和 Allegro 完全不是一套体系,常见映射关系如下:
| AD 层 | Allegro 目标层 | 说明 |
|---|---|---|
| Top Layer | TOP | 顶层走线/焊盘 |
| Bottom Layer | BOTTOM | 底层 |
| Top Overlay | SILKSCREEN_TOP | 顶层丝印 |
| Bottom Overlay | SILKSCREEN_BOTTOM | 底层丝印 |
| Top Paste | PASTEMASK_TOP | 钢网 |
| Top Solder | SOLDERMASK_TOP | 阻焊 |
| Mechanical 13 / 15 | PACKAGE GEOMETRY / PLACE_BOUND_TOP | 器件占地,必须映射 |
最后一行是重点。AD 里很多人用 Mechanical 13 或 15 画器件外框,如果这两层没映射到PLACE_BOUND_TOP,导入后封装就没有 place bound,布局时器件叠在一起 DRC 也全绿,等打样回来才发现装不下。
Create library / Extract symbols:这一项要勾上,否则转换器只生成一个带封装的.brd,不给你独立的 symbol 文件,后面还得手工从板上再导一次。
3D 与铜皮相关选项:封装迁移用不上,关掉能明显缩短转换时间,也少一堆警告。
转换跑完后先看日志,日志里会列出跳过的对象、替换的字体、失败的焊盘。日志干净不代表没问题,但日志里全是 error 就一定有问题。
4.3 导出 Library 与文件归位
转换器勾了生成库的话,输出目录里应该已经有.dra、.psm、.ssm、.pad了。如果没有,在 Allegro 里打开转换出来的.brd,执行File → Export → Libraries,指定一个空目录,把 symbol、pad、shape 一次性导出来。
接下来是纯体力活:按类型把文件分到三个库目录。手工拖动几十个文件容易漏,我一般用脚本一次搞定。
#!/usr/bin/env bash # 把 Allegro 导出目录里的文件按类型分发到三个库目录 # 用法: ./split_libs.sh <导出目录> <symbol目录> <shape目录> <pad目录> set -euo pipefail SRC=${1:?缺少导出目录} SYMDIR=${2:?缺少 symbol 目录} SHAPEDIR=${3:?缺少 shape 目录} PADDIR=${4:?缺少 pad 目录} mkdir -p "$SYMDIR" "$SHAPEDIR" "$PADDIR" # 焊盘定义:全部进 pad 目录,padpath 只认这里 find "$SRC" -maxdepth 1 -type f -name '*.pad' -exec cp -f {} "$PADDIR"/ \; # package symbol:psm 是 Place 时真正读取的文件,dra 一起放便于后期修改 find "$SRC" -maxdepth 1 -type f -name '*.psm' -exec cp -f {} "$SYMDIR"/ \; find "$SRC" -maxdepth 1 -type f -name '*.dra' -exec cp -f {} "$SYMDIR"/ \; # device file:有就带上,走网表导入时用于引脚匹配 find "$SRC" -maxdepth 1 -type f -name '*.txt' -exec cp -f {} "$SYMDIR"/ \; # shape symbol:ssm 进 shape 目录 find "$SRC" -maxdepth 1 -type f -name '*.ssm' -exec cp -f {} "$SHAPEDIR"/ \; # 日志留在原地,不进库路径 echo "分发完成" printf ' symbol: %s 个\n' "$(find "$SYMDIR" -maxdepth 1 -type f | wc -l)" printf ' shape : %s 个\n' "$(find "$SHAPEDIR" -maxdepth 1 -type f | wc -l)" printf ' pad : %s 个\n' "$(find "$PADDIR" -maxdepth 1 -type f | wc -l)"脚本逻辑很直白:按扩展名做白名单复制,maxdepth 1保证不递归到子目录里误抓旧文件,cp -f覆盖同名文件让重跑是幂等的。四个参数里,前三个是必填,缺任何一个都会在参数展开时就退出,避免拷到一半发现路径写错。
这里有个脚本解决不了的歧义要说清楚:.dra既可能是 package symbol 的源文件,也可能是 shape symbol 的源文件,两者扩展名一样。脚本统一丢进 symbol 目录,如果某个 shape symbol 的.dra被放错了位置,后果是以后想改这个形状时找不到源文件,但不影响当前使用,因为 Place 读的是.ssm。判断方法是对着.ssm的文件名去找同名.dra,找到了就人工挪到 shape 目录。批量迁移几十个封装时,我一般先按脚本跑一遍,再单独花五分钟人工核对 shape 那部分。
4.4 在 Allegro 里加载与放置验证
路径配好之后,在 Allegro 主界面点Place → Manually,右侧面板切到 Package symbols 标签,展开库列表,能看到刚放进去的封装名就说明路径通了。
放一个到板上做首轮验证:Display → Measure量一下关键尺寸,Tools → Padstack → Modify Design Padstack点开焊盘看参数,Show Element点中 symbol 看它的来源路径是不是你刚配的那个目录。三项都过了,说明这个封装至少在文件层面是完整的。
如果库列表里能列出来但放不下去,多半是.pad没找到,回去检查 padpath。如果列表里压根没有,参考下一章的第一条。
5. 避坑与排查:五类翻车现场的现象、原因和补丁
5.1 库里明明有 psm,Place 列表里却是空的
现象:三个路径都配了,Refresh 也点了好几次,Package symbols 下面还是空的。
原因:三种可能,按概率排序。一是psmpath指向了.dra所在的目录,而.psm被导出到了别处,两个文件不在同一个文件夹里;二是转换过程中封装名被改写过,.psm的文件名和预期的对不上,列表里其实有,只是名字不认识;三是.psm由更高版本的数据库生成,当前 Allegro 版本读不了,会静默忽略。
解决:先find一下.psm的实际位置,确认 psmpath 指对了;再看导出日志里有没有重命名记录,Allegro 对 symbol 名有长度限制,超长会被截断,截断后的名字和.dra就对不上了;最后拿一个.dra用当前版本打开,File → Create Symbol重新生成一次.psm,能生成就说明是版本问题。
5.2 焊盘尺寸差一点点,贴片贴不上
现象:转过来的焊盘,标称 0.6mm,实际量出来 0.5999mm,或者 0.6mm 变成 0.61mm。
原因:AD 侧和 Allegro 侧的单位换算链路上多了一次往返。AD 用 mm 存 ASCII,转换器按 mil 解读,再换算回 mm,中间的小数位被截断。也可能是 AD 里那个焊盘本身就是按 mil 定义的整数尺寸,换成 mm 显示时被四舍五入过。
解决:AD 侧统一用目标端要求的单位,不要中途切换;ASCII 保存前把焊盘尺寸的显示精度调到 3 位以上确认一遍;转换完成后用 Padstack Designer 逐个核对直径和长宽,偏差超过 0.005mm 的手工改掉。批量的话可以导出一份 padstack 参数清单做差异比对,比一个一个点开快得多。
5.3 原点偏移,封装放上去就“跑”
现象:Place 出来的时候封装离鼠标指针很远,或者放到板上后相对板框的位置明显不对。
原因:AD 里的封装没有设置参考点,转换器按 AD 的绝对坐标搬,原点就定在了 AD 板子的 (0,0),而不是封装的第一脚。另一种情况是 AD 里设了参考点,但放置时是把封装放在板子的任意位置,转换器把那个偏移量也带过来了。
解决:回到 AD,对每个封装执行Edit → Set Reference → Pin 1(或 Center),然后在空白 PCB 里把每个封装的第一脚都放在坐标 (0,0) 附近,重存 ASCII 再转一次。已经转完不想重来的,可以在 Allegro 里打开.dra,Edit → Move把图形整体挪到原点附近,再File → Create Symbol重新生成.psm。
5.4 place bound 缺失,DRC 全绿但器件实际干涉
现象:布局阶段两个高器件在物理上重叠了,跑 DRC 一条都不报。
原因:AD 的器件外框画在 Mechanical 层上,转换时层映射没把这一层对到PACKAGE GEOMETRY / PLACE_BOUND_TOP,转换器就把这些线当普通图形丢掉了,symbol 里根本没有 place bound 形状。没有这个形状,Allegro 的间距检查就无从比对。
解决:短期补丁是打开.dra,用Shape → Rectangular在Package Geometry / Place_Bound_Top层画一个包住整个器件的矩形,File → Create Symbol重建;长期做法是在转换器的层映射里显式把 Mechanical 13/15 指向 Place_Bound_Top,一次配好后面所有封装都受益。补完之后记得在板上执行一次Place → Update Symbols,让已放置的实例刷新。
5.5 改了 dra 没重建 psm,板上还是旧封装
现象:发现丝印压到焊盘,在.dra里改好了,删掉板上的实例重新放,还是老样子。
原因:Place 读的是.psm,.dra只是源文件。改完.dra不执行生成动作,.psm一个字节都没变。
解决:打开.dra,File → Create Symbol覆盖同名.psm,这是必须走的一步。然后回到板上Place → Update Symbols,勾选对应封装刷新已放置的实例。如果刷新后还是旧的,检查一下是不是有多个同名.psm分散在不同路径里,psmpath 的搜索顺序先命中了另一个副本——这种情况在多人共用一台机器或者库目录有多份拷贝时特别常见。
6. 验收:用尺寸对照表和文件时间戳把封装验明正身
转换完成不等于迁移成功,验收这一步不能省。我的做法是拉一张对照表,AD 侧和 Allegro 侧各填一遍,逐项打钩:
| 检查项 | AD 侧取值 | Allegro 侧取值 | 允许偏差 |
|---|---|---|---|
| 焊盘直径 / 长宽 | 实测 | Padstack Designer 读数 | ≤ 0.005mm |
| 相邻焊盘中心距 | 实测 | Measure 工具 | ≤ 0.01mm |
| 1 脚相对原点坐标 | (0,0) | Show Element 查看 | 应为 0 |
| 器件外框尺寸 | 实测 | place bound 形状 | ≤ 0.02mm |
| 丝印外扩 | 实测 | 丝印层线到焊盘距离 | 目视比对 |
| 器件高度 | AD 的 Height 属性 | symbol 的 Height 字段 | 需手工填 |
六个项目里,只有“器件高度”这一行大概率需要手工补,转换器通常不搬这个值。高度填在 symbol 属性里的用处是布局阶段的 3D 干涉预检,不做也行,但做了以后结构同事会少找你几次。
第二件事是查文件时间戳。.dra改过而.psm没重建,是这套流程里最隐蔽的问题,靠眼睛看不出来,靠时间戳一查一个准:
#!/usr/bin/env python3 """扫描库目录,找出 dra 比 psm 新(说明改了没重建)以及只有单边的文件""" import sys from pathlib import Path def scan(root: str) -> None: base = Path(root) # stem 是去掉扩展名的文件名,dra 和 psm 靠它配对 dra = {p.stem: p for p in base.rglob("*.dra")} psm = {p.stem: p for p in base.rglob("*.psm")} only_psm = sorted(set(psm) - set(dra)) # 有 psm 没源文件,能放但改不了 only_dra = sorted(set(dra) - set(psm)) # 有源文件没 psm,根本放不了 stale = [] # dra 更新过,psm 是旧的 for name in sorted(set(dra) & set(psm)): # 留 1 秒容差,避免文件系统时间精度导致的误报 if dra[name].stat().st_mtime - psm[name].stat().st_mtime > 1: stale.append(name) print(f"目录: {base}") print(f" 成对 : {len(set(dra) & set(psm))}") print(f" 缺 psm : {len(only_dra)} {only_dra[:5]}") print(f" 缺 dra : {len(only_psm)} {only_psm[:5]}") print(f" 待重建 : {len(stale)} {stale[:5]}") if __name__ == "__main__": if len(sys.argv) != 2: sys.exit("用法: python check_pairs.py <库目录>") scan(sys.argv[1])rglob会递归进子目录,所以直接指向库的根目录就行,不用管文件分了几层。stem拿的是不含扩展名的文件名,.dra和.psm靠它配对,这也顺带验证了命名是否一致——“缺 dra”列表里出现的东西,往往就是转换器截断名字的受害者。“待重建”列表是重点,出现任何一条就说明有人改了源文件忘了重新生成,回到 Allegro 里补一次Create Symbol即可。
这个脚本我一般挂成提交前的一道检查,跑完看到“待重建 0”才放心交付。从那以后我每次把封装从 AD 迁到 Allegro,都会强制走一遍“层映射核对、时间戳扫描、尺寸对照表”这三步,宁可多花二十分钟,也不想在打样回来对着装不上的器件发愣。希望帮到你。
本文还有配套的精品资源,点击获取