Yosys read_liberty 解析报错:用最小 Liberty 对照定位语法行
更新时间:2026-10-31。FAQ 速查页,属于 EDA 报错排查系列。Yosys read_liberty 解析报错发生在读取 Liberty 标准单元库时,此时工具还没有开始处理设计的逻辑功能。其他开源工具的诊断入口见 开源 EDA 报错排查导航。
首屏答案:ERROR: Syntax error in liberty file on line N 是库文件语法错误,先检查第 N 行及其相邻括号、冒号、分号,不要先改 RTL。本文坏例只是在 direction input; 中漏了冒号;改成 direction : input; 后,同一文件能被 read_liberty 读取,也能交给 abc -liberty 完成映射。
本文要回答的问题
- 这条错误发生在综合流程的哪个阶段?
- 怎样用最小合法 cell 判断库文件的语法问题?
- 修复后为什么还要分别检查
read_liberty与abc -liberty? - 哪些警告不代表解析失败,哪些结果不能由最小库推出?
一、先按行号修库,不要从 RTL 猜原因
Liberty 是描述标准单元引脚、逻辑功能及时序等属性的库格式。read_liberty 的前端先解析文本,再把单元定义交给后续流程;解析器在语法处停下时,Verilog 顶层、约束和 ABC 脚本都还没有机会影响结果。
图中红色是原始报错,蓝色两步负责缩小范围,橙色是单点修复,绿色才表示解析通过。回边很重要:若行号变化,应读取新的首条错误,不要同时替换整个库,否则无法知道哪项修改真正生效。
二、缺少冒号就是本次第 5 行错误
坏例具有完整的 library → cell → pin 层次,错误只在输入引脚的属性写法:
library (demo) {
delay_model : table_lookup;
cell (INV_X1) {
pin (A) {
direction input;
}
pin (Y) {
direction : output;
function : "!A";
}
}
}终端卡中的命令与原始记录首行一致,第三行固定了工具版本,末尾就是本次真实错误。第 5 行应当写成 direction : input;:属性名、冒号、属性值和分号缺一不可。这里的空格不是关键,冒号才是。
最小合法 cell 不必包含面积或时序表。下面片段保留了输入、输出和布尔函数,足以让 Yosys 认识一个反相器;实验文件另外加入缓冲器和与非门,供 ABC 映射使用。
cell (INV_X1) {
pin (A) { direction : input; }
pin (Y) {
direction : output;
function : "!A";
}
}| 对照项 | 坏例 | 修复例 |
|---|---|---|
| 第 5 行 | direction input; | direction : input; |
| 其他单元与引脚定义 | 完全相同 | 完全相同 |
read_liberty 结果 | 第 5 行语法错误,退出 1 | 导入 3 个 cell 类型 |
abc -liberty 结果 | 未执行到该阶段 | 成功映射为 INV_X1 |
单变量对照把结论限制得很清楚:本次失败来自 Liberty 属性语法,不是单元功能 !A,也不是顶层模块。实际工程若报错行看起来正常,还要检查上一行是否少分号、字符串是否少引号,以及当前块是否少右花括号;解析器报告的是发现无法继续的位置,不总是缺陷字符的精确坐标。
缩小大库时不要只截取报错的 cell。脱离外层 library 的单元片段不再是同一输入结构,可能引出新的错误,反而干扰判断。稳妥做法是保留库声明和必要层次,每次删除完整的属性组或完整单元,并确保剩余花括号仍然配对。若文件来自格式转换脚本,还应直接检查生成结果,不要只审阅脚本里的模板变量;换行、转义和字符串拼接都可能在生成后改变实际文本。
另一个容易误判的地方是“把报错行改到能读”与“恢复原库语义”并不等价。例如缺少引号时,随手删除整个 function 也许能绕过某个解析点,却同时丢掉了输出逻辑。正确修复应恢复属性语法,保留原有的引脚方向与函数表达式。每次修改后用版本差异确认只动了预期字符,再让解析器重新给出结论。
三、读取成功与映射成功要分别确认
修复后脚本执行 read_liberty -lib good.lib,日志出现 Imported 3 cell types from liberty file.。-lib 把这些定义作为库单元导入,供设计层次和映射使用。随后读入只含一位反相逻辑的 top.v,再执行 abc -liberty good.lib。ABC 会再次读取同一个库,因此这一复跑同时覆盖了后续使用路径。
ABC: + read_lib -w /work/good.lib
ABC: Parsing finished successfully. Parsing time = 0.00 sec
ABC: Library "demo" from "/work/good.lib" has 3 cells (0 skipped: 0 seq; 0 tri-state; 0 no func; 0 dont_use). Time = 0.00 sec
ABC RESULTS: INV_X1 cells: 1
good_exit=0
PASS bad input rejected; good library loaded and mapped这段记录给出三个层次:ABC 解析完成,库中三个单元均被接受,最终一位反相器映射成一个 INV_X1。原始输出还提示最小库没有显式给出时间单位和电容负载单位,ABC 因而采用默认单位;这些提示没有阻止本次映射,但也说明该玩具库不能用来解释真实工艺时序。
不要因为 read_liberty 成功,就默认任何后续流程都成功。库语法合法只说明文本可解析;单元是否适合目标映射、是否缺少后续步骤所需属性,是下一层问题。反过来,遇到 ABC 阶段失败时,也不能笼统地继续称为“第 5 行语法错误”,应改用当时的新日志定位。
这里把两个命令放在同一脚本,是为了证明修复后的文件能走通实际使用链路,而不是把两者当成可互换命令。read_liberty -lib 的结果体现在 Yosys 已导入单元类型;abc -liberty 则把库交给映射器,由映射结果中的单元名证明它确实参与了实现。只看其中任意一项,覆盖范围都不完整。
本次 stat 中的一个 INV_X1 也只描述这个一位示例的结构。它不能推出更大设计的单元数量,更不能用来比较不同工艺库。若修复对象包含时序表、状态单元或三态单元,还应沿用原工程的综合与验证流程检查这些定义;不要拿本文最小组合库的通过结果替代原工程回归。
四、工程里的最小修复顺序
面对 Yosys read_liberty 解析报错,可以按下面的清单处理:
- 复制完整首条
ERROR和退出码,确认文件名及行号对应当前读入的库,而不是同名旧文件。 - 用文本比较检查报错行附近的冒号、分号、引号与花括号,每次只修一处并重跑。
- 大库难以定位时,保留相同层次制作最小 cell;最小例也失败,问题就在基础语法,最小例通过再逐步补回原属性。
- 解析成功后运行实际后续命令。需要使用 ABC 时,直接复跑
abc -liberty,不要只停在单元导入。 - 不为了让最小例运行而编造面积、时序或负载数值。本文只证明语法修复与逻辑映射,不提供任何工艺质量结论。
若错误变成找不到库文件或后续缺少可用单元,就已经是另一类问题,可转到 Yosys ABC 找不到单元库 的排查路径,不必继续反复检查同一个冒号。
实验环境
- 机器/系统:MacBook Pro / macOS 26.5.2,Docker 容器
geek-eda:0.2 - 工具版本:Yosys 0.33 (git sha1 2584903a060)
- 日期:2026-10-31
- 完整命令:在代码目录执行
bash run.sh。脚本用docker run --rm -v "$PWD:/work" -w /work geek-eda:0.2分别执行yosys -p 'read_liberty bad.lib',以及对修复例的read_liberty -lib good.lib; read_verilog top.v; hierarchy -top top; proc; opt; techmap; opt; abc -liberty good.lib; stat; write_verilog ...,并检查坏例非零、好例为零的退出码。
代码获取
坏例、修复例、一位反相器顶层与完整运行脚本位于公开仓 https://github.com/derekzhuo/geek-doc.cn/tree/main/experiments/ts-yosys-read-liberty-error。准备同名容器镜像后进入该目录执行 bash run.sh,即可复现第 5 行错误和 ABC 成功映射。
这一篇在知识体系里的位置
本篇处理 Yosys 读取 Liberty 时的文本语法错误,属于综合输入阶段。需要判断其他开源 EDA 错误阶段时,从 开源 EDA 报错排查导航 进入;优化阶段与输入解析不同,可对照 Yosys FSM 状态机未识别。
总结
Yosys read_liberty 解析报错应先按日志行号检查 Liberty 文本,而不是修改 RTL。Yosys 0.33 实测中,direction input; 缺少冒号会触发第 5 行语法错误并退出 1;只补回冒号后,同一库成功导入三个 cell,且 abc -liberty 将反相器映射为一个 INV_X1。保留单变量对照、分别确认读取与映射,才能把语法修复和后续库能力问题分清。