2 个版本 (1 个不稳定版本)

3.0.0-pre.22023 年 1 月 11 日
0.2.0 2021 年 10 月 12 日

Rust 模式 中排名 1143


3 个 仓库中使用

BSD-3-Clause

135KB
2.5K SLoC

Lef21

docs

Lef21 库交换格式 (LEF) 解析器和编写器

库交换格式 (LEF) 是一种基于 ASCII 的集成电路 (IC) 布局和技术格式。

LEF 在整个 IC 行业内被广泛用于两个相关目的

  • LEF 设计库,主要由 LEF 组成,提供了电路设计的 物理抽象 视图。
    • 这种抽象视图通常是布局综合程序 ("布局和布线") 的目标。
    • 它们包括电路的引脚位置和物理阻塞 ("障碍") 的要求等元数据,通常不包括电路的内部实现。
  • LEF 技术描述 ("tech-lef") 提供了组装此类单元的设计规则的简洁描述,这是布局综合软件通常执行的操作。

Lef21 包括对解析和写入 LEF 设计库 的全面支持,这些库主要存储为其 LefLibraryLefMacro 类型。还支持 tech-lef 的一些选定功能,尤其是那些模糊技术和库数据之间界限的功能。

使用方法

仅通过调用 LefLibrary::open 方法即可从文件创建 LefLibrary

use lef21::LefLibrary;
let lib = LefLibrary::open("mylib.lef")?;

每个 LefLibrary 都是一棵宏定义的短树,而这些宏定义主要是由引脚定义和障碍物组成。这个 LefLibrary 树的形式是

LefLibrary 树中所有层的所有字段都是公开可访问和可修改的。

Lef21 库可以通过其 LefLibrary::save 方法保存到文件

lib.save("yourlib.lef")?;

或者通过 LefLibrary::to_string 方法转换为内存中的 LEF 格式 [String]

let s = lib.to_string()?;
println!({}, s);

序列化

LefLibrary、所有底层数据结构和所有 Lef21 的其他主要数据存储都是 serde 可序列化的,并且可以简单地转换为任何 serde 兼容的格式。示例

let lib = lef21::LefLibrary::new();
let json = serde_json::to_string(&lib);
let yaml = serde_yaml::to_string(&lib);
let toml = toml::to_string(&lib);

Lef21 通过其 SerializationFormat 枚举支持一组 serde 格式,并通过其伴随的 SerdeFile 特性直接读取和写入每种格式的文件。使用 SerializationFormat::Yaml 的示例

use lef21::SerializationFormat::Yaml;
let lib = lef21::LefLibrary::new();

// Write to YAML-format file
Yaml.save(&lib, "mylib.lef.yaml")?;
// And read back from file
let lib2: lef21::LefLibrary = Yaml.open("mylib.lef.yaml")?;

背景

Lef21 是更大的 Layout21 库的一个子集,主要用于导入和导出层。Lef21 相应地使用了 LEF 格式的概念、惯用术语(例如,“宏”与“单元”),并且其 LEF 数据结构设计用于直接操作,例如在程序中修改现有的 LEF 内容。

LEF 通常与基于 ASCII 的 DEF 格式一起使用,以指定电路的内部物理实现。更常见的行业用法是将 LEF 与 GDSII 的二进制实现格式配对,这大大减少了大型电路的数据大小。Lef21 不支持 DEF。GDSII 由相关的 gds21 包支持。

许可证

Lef21 和 Layout21 在宽松的 BSD 许可证下发布。

LEF 格式最初由 Tangent Systems 设计,后来被 Cadence Design Systems 收购。Lef21 与这两家公司都没有任何关系,也不拥有该格式的任何权限或所有权。无数的 LEF 格式设计描述作为开源软件 免费提供。它们的示例是 Lef21 的基础。

依赖关系

~5MB
~95K SLoC