在数字芯片后端设计中,Synopsys Design Compiler(DC)是常用的综合工具。我们经常需要查看标准单元库(Liberty)中某个 cell 的逻辑功能,比如它是 AND 门、OR 门还是其他复杂门。然而,DC 并没有提供一个直接的 is_and_gate 属性,需要通过组合命令来获取。本文将总结我们在实际探索中积累的经验,涵盖属性查询命令、对象获取命令,并附上可直接运行的 Tcl 脚本示例。
list_attributes、report_attribute、get_attributeDC 中的对象(如 design、cell、pin、net 等)都附带有大量属性。要了解一个对象拥有哪些属性,以及如何获取它们的值,可以使用以下三个命令:
| 命令 | 用途 | 适用场景 |
|---|---|---|
list_attributes | 列出某一类对象所有可能的属性名称 | 想知道某个对象类型(如 lib_cell)支持哪些属性时 |
report_attribute | 报告某个具体对象实例的当前有效属性及其值 | 想快速查看一个具体对象(如 AN2M1TM)的所有有效属性时 |
get_attribute | 获取某个具体对象实例的指定属性的值 | 在脚本中需要读取某个属性值做判断时 |
get_lib_cells 与 get_lib_pins要获取标准单元库中的 cell 或 pin 对象,需要使用以下命令:
get_lib_cells:返回一个或多个 lib_cell 对象的集合。支持通配符匹配库名和 cell 名,如 get_lib_cells */AN2M1TM 表示所有库中名为 AN2M1TM 的单元。
get_lib_pins:返回 lib_pin 对象的集合。常用于获取某个 cell 的特定引脚,或通过 -filter 条件筛选(如 direction==out 筛选输出引脚)。
这两个命令都支持 -of_objects 选项,用于获取与某个对象相关联的对象(例如获取某个 cell 的所有 pin)。
function_class 判断 AND 门?在尝试判断一个 cell 是否为 AND 门时,我们最初注意到了 function_class 和 function_id 等属性。例如 AN2M1TM 的 function_class 为 a2,但后来发现 OR2M1TM 的 function_class 同样是 a2。这说明 function_class 并不是逻辑类型(AND/OR)的直接编码,而是内部综合工具使用的其他分类(可能与算术/组合类有关)。因此,不能依赖该属性来判断具体逻辑功能。
正确的做法是读取输出引脚的 function 属性,该属性直接描述了该引脚的布尔逻辑表达式(如 A&B、A|B、!(A&B) 等)。
下面两个 Tcl 过程是我们在探索过程中编写的,它们可以方便地打印出指定 lib_cell(或一组 lib_cell)的输出引脚功能表达式,供人工查看。
用法:print_libcell_func_by_name AN2M1TM
输出示例:cell: AN2M1TM, func: A&B
lib_cell 对象集合打印功能用法:print_libcell_func_by_obj [get_lib_cells */OR*]
输出示例:
这两个过程都考虑了多输出引脚的情况(如 DFF 有 Q 和 QN),会逐条打印每个输出引脚的功能,信息完整。
function 属性的表示风格
不同 .lib 文件可能使用不同的运算符符号:
AND 可能表示为 &、* 或 and
OR 可能表示为 |、+ 或 or
反相可能表示为 !、~ 或 not
脚本中直接打印原始字符串,用户可根据实际风格进行人工判断。
若需自动化判断
可以在上述脚本基础上增加正则匹配,排除 OR、XOR、反相,仅保留 AND 表达式。但鉴于用户明确表示只需打印,本文不再展开。
性能考虑
若需处理大量 cell,建议将 get_lib_pins 的调用放在循环内,避免重复执行 get_lib_cells 等开销较大的操作。
通过本文的讨论,我们明确了以下几点:
使用 list_attributes、report_attribute 和 get_attribute 可以全面了解对象的属性信息。
使用 get_lib_cells 和 get_lib_pins 可以精准获取库单元和引脚对象。
判断 cell 逻辑功能的最可靠方法是通过输出引脚的 function 属性,而非 function_class 等易误解的属性。
提供的两个 Tcl 过程简单实用,可直接嵌入 DC 脚本中,快速查看任意 cell 的逻辑表达式。