ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

AD封装迁移到Allegro:ASCII转换、库导出与避坑指南

AD封装迁移到Allegro:ASCII转换、库导出与避坑指南

简介:一份聚焦 Altium Designer 与 Cadence Allegro 封装迁移的 Word 文档,面向需要跨平台复用封装库的 PCB 设计人员,尤其适合已熟悉 AD 基本操作、希望减少重复建库工作的初中级工程师。文档以一次完整的封装导入实践为主线,依次说明在 AD 中新建空白 PCB、放置待迁移封装、另存为 PcbDoc ASCII 文件,再到 Allegro 中通过 CAD Translators 导入、导出 Library,并将 dra、psm 符号文件、ssm 形状文件与焊盘分别放入对应库路径的全过程,同时点出中文路径、库列表更新、尺寸与连接核对等易出错之处。压缩包内共 1 个 docx 文件,约 63KB,体量轻便,适合作为操作时随手查阅的步骤清单。目前已有 1476 人学习,反映该流程在跨平台建库场景中确有需求。读者可据此掌握一次迁移的完整路径,理清 symbol、shape 与 pad 文件的对应关系,并在后续项目中直接复用已有封装,减少重复劳动与建库出错概率。

1. 为什么要把AD封装搬进Allegro:跨EDA复用的真实场景

上周帮某实验室收拾一个烂尾项目:板子从外部接过来,原理图和PCB都在Altium Designer里,结构件和阻抗要求又必须走Cadence Allegro。最省事的路径不是照着PDF重画封装,而是把AD里的封装整包搬过去复用。AltiumDesigner AD Allegro 封装迁移这活儿,卡人的地方从来不是点哪个菜单,而是文件落地后Allegro认不认——.psm有没有生成、焊盘有没有跟过来、丝印落在哪一层。这篇把我自己走通的那条链路拆开:AD侧整理成ASCII PCB,Allegro侧用CAD Translators导入,再导出库文件分拣到三条路径。适合手里有一堆AD库存封装、又不得不交付Allegro工程的人。

2. AD侧的准备:把封装整理成可转换的ASCII PCB

2.1 新建空PCB:为什么必须从一张白纸开始

很多人图省事,直接在原工程里 File > Save As 一份改个名就丢给Allegro,结果转换日志里几十条 layer not mapped,导入后的brd里还莫名其妙多出板框、覆铜和一堆3D体。原因很简单:AD的PCB文件是整板容器,你另存的时候把所有层、所有图元、所有规则一起带走了,而Allegro的转换器只想要封装,多出来的东西它要么丢掉要么报错,日志就被撑爆了。

我一般会新建一个完全空白的PCB:File > New > PCB,先不画任何东西,立刻另存到工作目录。工作目录的命名要当成硬约束来对待——纯英文、无空格、层级不要太深。中文路径在转换器里经常表现为“文件能选中但导入报错”或者“导出到一半失败”,这类问题不写在日志里,只能靠排除法。同步盘目录(比如自动备份的云盘文件夹)也建议避开,转换过程中文件被占用或回写,容易出现半截文件。

下面这段脚本用来在动手前把路径检查一遍,省得后面拿玄学解释报错:

#!/usr/bin/env bash # 检查工作目录是否满足 AD/Allegro 转换的“纯英文、无空格”要求 WORK_DIR="${1:-.}" # 1) 拒绝非 ASCII 字符(中文、全角括号、全角空格等) if printf '%s' "$WORK_DIR" | LC_ALL=C grep -qP '[^\x00-\x7F]'; then echo "[FAIL] 路径含非 ASCII 字符: $WORK_DIR" exit 1 fi # 2) 拒绝空格,部分转换器会把空格当成参数分隔 case "$WORK_DIR" in *" "*) echo "[FAIL] 路径含空格: $WORK_DIR"; exit 1;; esac # 3) 路径总长度给个上限,过深目录在旧版工具里容易截断 if [ "${#WORK_DIR}" -gt 120 ]; then echo "[WARN] 路径偏长(${#WORK_DIR} 字符),建议换到盘符根目录下" fi echo "[OK] $WORK_DIR"

逻辑上就三步:用LC_ALL=C强制按字节比较,grep -P匹配所有非 ASCII 字节;用 shell 的 case 模式匹配空格;最后给一个长度提醒。参数只有一个,把准备使用的目录传进去即可,比如./check_path.sh "D:/ad2allegro/work"。这个脚本不能覆盖所有情况,但它拦掉的恰恰是最常见的一类“导入失败但没日志”的问题。

2.2 放置封装时的三个检查点

空白PCB建好之后,把目标封装放上去。路径是 Place > Component,从AD的库面板里选,或者直接把库里的封装拖到板上。一次可以放多个,但每个封装之间要拉开足够距离(我一般按 500 mil 起步),不要重叠。原因是转换器按图元坐标逐个搬运,重叠的封装在Allegro里解出来的焊盘会互相压在一起,后面想拆都拆不开。

放置时我固定看三件事。第一是封装原点:AD里封装的参考点如果设在1脚,导入Allegro后 placement origin 也在1脚,摆板时按坐标放会偏半个器件;如果原点在几何中心,对位会舒服很多。这个在AD的封装编辑器里能改,改完记得更新到PCB上再另存。第二是焊盘编号:焊盘号必须连续且与原理图符号的pin号一一对应,中间跳号在Allegro里表现为“symbol有pin但pad没生成”。第三是多余图元:3D体、机械层说明文字、装配层的外框,这些在转换时大多被丢弃,如果封装里塞了大量这类东西,日志会变长,排查成本上升,能删就删。

检查项在AD里看哪里不通过的后果
封装原点封装编辑器 > Edit > Set Reference摆放偏位,批量布局时坐标全错
焊盘编号连续性封装编辑器 Pad 属性 / PCB 面板symbol 有 pin 无 pad,网表对不上
多余机械图元机械层、3D体、装配层日志噪声大,偶发转换中断
焊盘尺寸单位焊盘属性里的 X/Y Size单位混用导致尺寸差 25.4 倍

这张表不是走过场,尤其是原点那一条,我见过一次导入后所有器件整体偏移了 2.54 mm,查了半天以为是单位问题,最后发现是AD封装的参考点被设在了一个焊盘角上。

2.3 另存为PCB ASCII File:选项、后缀与路径约束

封装摆好之后就是关键一步:File > Save As,在保存类型里选PCB ASCII File (*.PcbDoc)。注意这里不是普通的.PcbDoc,二进制格式和ASCII格式共用同一个后缀,靠保存类型区分。选错的话Allegro的转换器会直接拒绝,报“不支持的文件格式”或者干脆闪退。

保存完成后建议做一次格式自检:用文本编辑器打开文件,头部应该能看到|RECORD=这类按记录组织的文本,而不是一堆乱码。ASCII格式的体积通常是二进制的好几倍,这是正常的,因为它把每个图元都展开成了键值对。下面这条命令可以快速判断:

# 判断导出的 .PcbDoc 是否为 Altium ASCII 格式 # 用法: ./check_ascii.sh pkg_tmp.PcbDoc FILE="$1" if head -c 512 "$FILE" | grep -qa "RECORD"; then echo "[OK] $FILE 是 ASCII 记录格式" else echo "[FAIL] 未发现 RECORD 关键字,可能保存成了二进制 PCB" fi

head -c 512只取文件头,避免大文件读太久;grep -qa的-a是把文件当文本处理,防止二进制内容触发“binary file matches”而不输出结果。这条检查只能判断“像不像ASCII”,不能保证内容完整,但足以排除“保存类型选错”这个最常见的低级错误。

还有一个细节:保存前把PCB里所有未使用的层关掉、所有网络清除(如果只是搬封装,不需要网络)。带网络的ASCII文件在Allegro里会尝试重建net,遇到AD和Allegro命名规则冲突的网络名会报warning,虽然不影响封装本身,但日志会变脏,后面查真正的错误时容易被干扰。

3. Allegro侧导入:CAD Translators这条链路的实际操作

3.1 新建brd与Import菜单的入口位置

打开Allegro PCB Editor,File > New,类型选 Board,文件名用英文,落到和AD侧同一个工作盘里。这里有个容易忽略的点:新建的brd最好是一个空白板,不要拿现有项目的brd直接导入。转换器会把AD封装往当前设计里塞,如果当前设计已经有层叠、约束和器件,坐标冲突和层名冲突会一起爆发。

导入入口在 Import > CAD Translators > Altium PCB。如果菜单里找不到 Altium PCB 这一项,通常不是操作问题,而是安装时没有勾选对应的转换器组件,或者当前license不包含该功能。这种情况在日志里不会有任何提示,只能从菜单是否存在来判断,遇到了就找负责安装的人确认组件,不要在原地反复重装软件。

点击之后会弹出转换对话框,源文件选择刚才那个ASCII格式的.PcbDoc,输出可以选择“导入到当前brd”或“生成新的brd”。我倾向于先生成一个独立的临时brd,验证封装没问题之后再往正式工程里搬,这样即使转换出问题也不会污染主设计。

3.2 Altium PCB导入对话框:层映射、单位与焊盘选项

对话框里最要命的是三类参数:单位、层映射、焊盘栈。它们的默认值不一定适合你的工程,尤其是从AD这种层命名体系和Allegro差别很大的工具迁过来。

单位这一项,AD常用mil,Allegro默认也是mil,但有些工程模板会把Allegro设成mm。两边不一致时,一个 0402 的焊盘会变成 1 mm 见方,肉眼一看就不对,但如果你是批量导入、没逐个检查,这个错误会一路带到投板。我的做法是导入前先在Allegro里确认当前设计的单位(Setup > Design Parameters 里看),导入对话框里选同一个。

层映射是第二个坑。AD的层名是 Top Layer、Bottom Layer、Top Overlay、Bottom Overlay、Top Solder、Top Paste 这一套,Allegro是 TOP、BOTTOM、SILKSCREEN_TOP、SILKSCREEN_BOTTOM、SOLDERMASK_TOP、PASTEMASK_TOP。转换器会给一套默认映射,但默认映射经常把 Overlay 对到 ASSEMBLY 层,结果就是丝印在Allegro里“消失”了——其实它在装配层躺着。导入时逐条核对映射表,尤其是丝印、阻焊、助焊这三类,核对完再点执行。

焊盘栈选项决定.pad文件生不生成。这个必须勾上,否则导入后的brd里焊盘是“临时图形”,导出库的时候拿不到独立的pad文件,封装也就没法复用。文本转换和铜皮转换可以按需关掉,纯搬封装时它们只会增加日志量。

参数建议值理由
单位与目标brd一致(通常mil)不一致会导致尺寸整体缩放
Top/Bottom 层TOP / BOTTOM保持电气层对应
Overlay 层SILKSCREEN_TOP/BOTTOM默认常错映射到装配层
Solder/Paste 层SOLDERMASK / PASTEMASK影响开窗与钢网
焊盘栈转换勾选不勾选则导出库缺 .pad
文本转换可关闭减少日志噪声

3.3 读转换日志:log里哪几行决定成败

转换结束后,输出目录里会有一个log文件。多数人扫一眼没红字就关掉,这是后面返工的源头。日志里的信息分三档:ERROR 是硬失败,对应的封装基本不可用;WARNING 里有一类是“层未映射”,它不会让转换中断,但会让封装的某一部分静默丢失;还有一类是“记录被跳过”,通常指向不支持的图元。

我习惯先用命令把关键行挑出来,再决定要不要逐条看:

# 从转换日志里挑出会影响封装可用性的行 # 用法: ./scan_log.sh converter.log LOG="$1" echo "===== ERROR =====" grep -nE "ERROR|Error|FAILED|not found" "$LOG" | head -40 echo "===== 层映射相关 =====" grep -niE "unmapped|not mapped|layer.*skip" "$LOG" | head -40 echo "===== 跳过记录 =====" grep -niE "skipped|unsupported|ignored" "$LOG" | head -40

三段分别对应硬错误、层丢失、图元丢失。head -40是防止日志几千行刷屏,先看前几十条通常就能定位问题类型。如果 ERROR 段为空但封装明显缺东西,重点看第二段,十有八九是某个层没映射上。

日志里还有一类信息值得留意:焊盘重名。AD允许不同封装里有同名焊盘但尺寸不同,Allegro的padstack是按名字索引的,导入时后一个会覆盖前一个,日志里表现为“padstack already exists”之类的提示。这种覆盖不会报错,但会让某个封装的焊盘尺寸悄悄变掉,属于典型的黑匣子问题,只能靠日志加人工比对发现。

4. 导出库文件:dra、psm、ssm、pad各归其位

4.1 Export Libraries生成的文件清单与后缀含义

封装在临时brd里验证过位置和网络之后,就可以导出成库文件了。路径是 File > Export > Libraries,输出目录同样用英文路径。导出完成后目录里会混着好几类文件,第一次看容易懵,先把后缀和用途对上:

后缀含义由谁生成缺失后果
.dra封装的绘图源文件,可编辑Export Libraries无法在封装编辑器里修改
.psm编译后的封装符号,放置时实际读取Export LibrariesPlace 时找不到该封装
.log该封装的导出日志Export Libraries排查问题时没有依据
.ssmshape symbol 的编译结果Export Libraries异形焊盘/铜皮形状丢失
.pad焊盘栈定义导入时的焊盘转换封装能放但焊盘是空壳

这里要分清.dra和.psm的关系:.dra是给人改的,.psm是给Allegro读的。很多人只把.dra拷进库路径,然后在Place对话框里死活找不到封装,原因就是Allegro放置时读的是.psm,不是.dra。反过来,只有.psm没有.dra时能放置、不能编辑,后期改焊盘会很痛苦。两个都要。

.ssm容易被忽略,因为普通矩形焊盘用不到它。但只要封装里有异形焊盘、圆弧铜皮或者自定义shape,导出时就会产生.ssm,它和同名的.dra是一对。漏掉.ssm的表现是:封装能放,但某个焊盘的形状变成默认矩形,DRC和实际开窗对不上。

4.2 三条库路径怎么配:padpath、psmpath与shape

文件齐了还不算完,Allegro得知道去哪找它们。路径配置在 Setup > User Preferences > Paths > Library 里,核心是三条:padpath、psmpath、parampath。也可以直接改 env 文件,我更倾向改 env,因为换机器时可以整段拷走。

# 在 allegro 的 env 文件里追加库路径,路径分隔用空格,目录用正斜杠 # 注意:每行末尾不要留多余空格,否则会把空格当成路径的一部分 set padpath = (D:/allegro_lib/pad $padpath) set psmpath = (D:/allegro_lib/psm D:/allegro_lib/shape $psmpath) set parampath = (D:/allegro_lib/param $parampath)

padpath只认.pad,把焊盘文件放这里,不要和.psm混在一起。psmpath认.psm和.ssm,所以封装符号和shape符号都放这一条路径下,或者分成两个目录但都加进psmpath。parampath是给参数化封装用的,普通封装用不上,但留着不吃亏。

配置完要重启Allegro,或者在命令行里重新加载env,否则新路径不生效。验证方法是随便打开一个brd,Place > Manually,在Package symbols列表里看新封装有没有出现。没出现就按“文件在不在、路径对不对、后缀全不全”的顺序查,不要一上来就怀疑软件坏了。

4.3 用Placement与封装编辑器做首件验证

封装出现在列表里只是第一步,真正要验证的是尺寸和焊盘。我的做法是新建一个空白brd,把新封装放上去,然后用两步检查。第一步用 Display > Element 点中封装,看它的原点坐标、封装名、引用的padstack名字,确认引用的pad和导出的.pad对得上。第二步用 Tools > Padstack > Modify Design Padstack 打开焊盘,逐个看尺寸、钻孔、层对。

尺寸核对最直接的办法是量。AD里用 Reports > Measure 量一遍关键尺寸(焊盘间距、本体外形、1脚位置),Allegro里用 Display > Measure 再量一遍,两个数对不上就说明单位或转换精度出了问题。我一般会挑三个尺寸:最远两个焊盘的中心距、焊盘宽度、丝印外框长度。三个都对上,这个封装基本可以进库。

还有一点:验证时把封装放在空白brd的原点附近,不要随手一丢。放远了之后量出来的坐标是绝对坐标,容易把自己绕进去,判断不清是封装偏了还是你放偏了。

5. 避坑与排查:五条踩出来的记录

5.1 导入阶段的三个高频翻车

现象:导入完成后,器件全部堆在板外或者坐标大得离谱。原因基本是单位不一致或者原点不一致。AD封装的坐标是相对封装原点的,如果AD侧参考点设在焊盘角上,而Allegro按几何中心理解,整体就会偏半个器件。解决方式是回到AD封装编辑器,把参考点改到1脚或几何中心,重新放置、重新另存ASCII、重新导入。不要试图在Allegro里手动挪,挪完导出库,封装本身还是偏的,下次复用继续踩。

现象:封装放进brd后,焊盘全变成通孔,或者干脆没有焊盘。原因有两个:一是导入时没有勾选焊盘栈转换,.pad根本没生成;二是AD里同名焊盘尺寸不同,导入时被后一个覆盖。前者看导出目录里有没有.pad文件就能确认,后者要去日志里找 padstack 重名提示。解决办法是导入前把AD封装里的焊盘名改成全局唯一(比如加封装前缀),或者导入后逐个用 Pad Designer 核对尺寸,发现被覆盖的手工重建。

现象:丝印在Allegro里看不见,但封装能正常放置。这是层映射的典型症状,Overlay 被默认映射到了装配层。用 Display > Color 打开装配层就能看到它躺在那里。解决方式是在导入对话框的层映射表里手工把 Top Overlay 对到 SILKSCREEN_TOP,Bottom Overlay 对到 SILKSCREEN_BOTTOM,然后重新导入。已经导好的brd也可以手工改层,但批量封装多的时候不现实,还是从源头改映射表划算。

5.2 落地使用阶段的两个隐性坑

现象:封装在库目录里明明有.dra,但 Place 对话框里就是不显示。第一反应是路径没配好,但路径检查过没问题。真正的原因往往是只有.dra没有.psm,或者.psm是用旧版本生成的、当前版本读不了。Allegro放置读.psm,.dra只是源文件。解决方式是回到导出环节确认.psm是否生成,如果生成了但读不了,用当前版本的封装编辑器打开.dra重新保存一次,让它重新编译出.psm。这类问题没有捷径,只能对着目录逐个文件核。

现象:封装能放,DRC却报焊盘间距不足,量出来尺寸和AD里差一点。这种“差一点”通常是单位换算的舍入,AD里用mil存、Allegro里用内部单位存,来回换算时小数点后被截断。焊盘越大越不明显,小间距器件(0.4 mm pitch 一类)就很致命。解决办法是在AD侧就把焊盘尺寸取整到整数mil,避免出现 0.127 mm 这种带小数的值;导入后再用 Modify Design Padstack 逐个核对关键焊盘。我现在的习惯是,凡是准备迁到Allegro的封装,AD里一律用整数mil建库,从源头消掉这个误差。

6. 进阶:批量迁移与封装一致性校验

封装数量一多,手工分拣文件就会出错,我一般用一段脚本把导出目录按后缀分到三个库目录,重名时先备份再覆盖:

# 把导出目录里的 dra/psm/ssm/pad 分拣到 psm、shape、pad 三个库目录 import shutil from pathlib import Path SRC = Path("D:/ad2allegro/export") # 导出目录 DST = { ".pad": Path("D:/allegro_lib/pad"), ".psm": Path("D:/allegro_lib/psm"), ".ssm": Path("D:/allegro_lib/shape"), ".dra": Path("D:/allegro_lib/psm"), # dra 与 psm 同放 psmpath } for f in SRC.iterdir(): if f.suffix.lower() in DST: target = DST[f.suffix.lower()] / f.name if target.exists(): # 重名先留后悔药 target.rename(target.with_suffix(target.suffix + ".bak")) shutil.copy2(f, target) print(f"{f.name} -> {target}")

分拣完还要做一次完整性检查:每个封装名是否.dra和.psm都在,引用的.pad是否存在。我的做法是把AD侧的封装清单导成文本,和Allegro库目录的文件名做差集,缺哪个补哪个。尺寸比对我固定看三项——最远焊盘中心距、焊盘宽度、1脚到原点的距离,三项全过才允许进正式库。从那以后我每次迁移封装都强制走一遍“脚本分拣 + 三项尺寸比对”,再没出现过投板后焊盘偏位的翻车。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进