Synopsys DC 中查询 Lib Cell 逻辑功能的方法总结
专栏:iLoveIC Aug. 3, 2026, 5:48 p.m. 9 阅读
基于get_lib_pins、get_attribute来获取lib cell的function

在数字芯片后端设计中,Synopsys Design Compiler(DC)是常用的综合工具。我们经常需要查看标准单元库(Liberty)中某个 cell 的逻辑功能,比如它是 AND 门、OR 门还是其他复杂门。然而,DC 并没有提供一个直接的 is_and_gate 属性,需要通过组合命令来获取。本文将总结我们在实际探索中积累的经验,涵盖属性查询命令、对象获取命令,并附上可直接运行的 Tcl 脚本示例。


一、属性查询三剑客:list_attributesreport_attributeget_attribute

DC 中的对象(如 design、cell、pin、net 等)都附带有大量属性。要了解一个对象拥有哪些属性,以及如何获取它们的值,可以使用以下三个命令:

命令用途适用场景
list_attributes列出某一类对象所有可能的属性名称想知道某个对象类型(如 lib_cell)支持哪些属性时
report_attribute报告某个具体对象实例当前有效属性及其值想快速查看一个具体对象(如 AN2M1TM)的所有有效属性时
get_attribute获取某个具体对象实例指定属性的值在脚本中需要读取某个属性值做判断时

示例用法

# 列出 lib_cell 类的所有可用属性
list_attributes -application -class lib_cell

# 报告某个 lib_cell 的所有有效属性
report_attribute [get_lib_cells */AN2M1TM]

# 获取特定属性的值
set func_class [get_attribute [get_lib_cells */AN2M1TM] function_class]

二、对象获取命令:get_lib_cellsget_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)。

示例

# 获取某个 cell 的所有输出引脚
get_lib_pins -of_objects [get_lib_cells */AN2M1TM] -filter "direction==out"

三、为什么不能依赖 function_class 判断 AND 门?

在尝试判断一个 cell 是否为 AND 门时,我们最初注意到了 function_classfunction_id 等属性。例如 AN2M1TMfunction_classa2,但后来发现 OR2M1TMfunction_class 同样是 a2。这说明 function_class 并不是逻辑类型(AND/OR)的直接编码,而是内部综合工具使用的其他分类(可能与算术/组合类有关)。因此,不能依赖该属性来判断具体逻辑功能

正确的做法是读取输出引脚的 function 属性,该属性直接描述了该引脚的布尔逻辑表达式(如 A&BA|B!(A&B) 等)。


四、实战脚本:打印 Lib Cell 的逻辑功能

下面两个 Tcl 过程是我们在探索过程中编写的,它们可以方便地打印出指定 lib_cell(或一组 lib_cell)的输出引脚功能表达式,供人工查看。

1. 通过 cell 名称打印功能

proc print_libcell_func_by_name {cell_name} {
    foreach_in_collection opin [get_lib_pins "*/${cell_name}/*" -filter "direction==out"] {
        set func [get_attribute $opin function]
        puts "cell: ${cell_name}, func: $func"
    }
}

用法print_libcell_func_by_name AN2M1TM
输出示例cell: AN2M1TM, func: A&B

2. 通过 lib_cell 对象集合打印功能

proc print_libcell_func_by_obj {clibcells} {
    foreach_in_collection olibcell $clibcells {
        set cell_name [get_object_name $olibcell]
        foreach_in_collection opin [get_lib_pins -of_objects $olibcell -filter "direction==out"] {
            set func [get_attribute $opin function]
            puts "cell: ${cell_name}, func: $func"
        }
    }
}

用法print_libcell_func_by_obj [get_lib_cells */OR*]
输出示例

cell: uk40lsclp11bdr_099c125_wc/OR2M1TM, func: A|B
cell: uk40lsclp11bdr_099c125_wc/OR3M1TM, func: A|B|C
...

这两个过程都考虑了多输出引脚的情况(如 DFF 有 Q 和 QN),会逐条打印每个输出引脚的功能,信息完整。


五、注意事项与扩展建议

  1. function 属性的表示风格
    不同 .lib 文件可能使用不同的运算符符号:

    • AND 可能表示为 &*and

    • OR 可能表示为 |+or

    • 反相可能表示为 !~not
      脚本中直接打印原始字符串,用户可根据实际风格进行人工判断。

  2. 若需自动化判断
    可以在上述脚本基础上增加正则匹配,排除 OR、XOR、反相,仅保留 AND 表达式。但鉴于用户明确表示只需打印,本文不再展开。

  3. 性能考虑
    若需处理大量 cell,建议将 get_lib_pins 的调用放在循环内,避免重复执行 get_lib_cells 等开销较大的操作。


六、总结

通过本文的讨论,我们明确了以下几点:

  • 使用 list_attributesreport_attributeget_attribute 可以全面了解对象的属性信息。

  • 使用 get_lib_cellsget_lib_pins 可以精准获取库单元和引脚对象。

  • 判断 cell 逻辑功能的最可靠方法是通过输出引脚的 function 属性,而非 function_class 等易误解的属性。

  • 提供的两个 Tcl 过程简单实用,可直接嵌入 DC 脚本中,快速查看任意 cell 的逻辑表达式。

感谢阅读,更多文章点击这里:【专栏:iLoveIC】
最新20篇 开设专栏