4 个版本 (不稳定)
3.0.0-pre.2 | 2023 年 1 月 11 日 |
---|---|
0.2.0 | 2021 年 10 月 12 日 |
0.1.1 | 2021 年 4 月 6 日 |
0.1.0 | 2021 年 4 月 6 日 |
#11 在 #ic
55 每月下载次数
在 3 crates 中使用
140KB
2.5K SLoC
Gds21
Gds21 集成电路布局解析器 & 编写器
GDSII 是集成电路行业存储和共享布局数据的实际标准。Gds21 是一个用于读取和创建 GDSII 数据的库,类似于并大量受到诸如 gdstk 和其前身 gdspy 的库的启发。Gds21 的不同之处在于它主要被设计为 GDSII 的接口层,用于更大的 Layout21 库。读取和生成 GDSII 格式数据是主要目标;提供更复杂的 GDS 数据操作功能不是。 (尽管这些操作可以在 Gds21 的数据结构上执行)。因此,Gds21 使用 GDSII 的术语、习惯用法、命名约定和数据类型来存储布局数据。
布局数据以三种主要形式表示
- 一个包含三层短树的结构
- 根是一个
GdsLibrary
,它主要包含一组细胞(GdsStruct
),其次是一组元数据。每个GdsLibrary
都是一个宇宙,因为它没有理解自身之外的布局细胞或数据的机制。在磁盘上,每个GdsLibrary
通常与一个.gds
文件一一对应。 - 库由细胞定义组成,也称为
GdsStruct
,它定义每个布局细胞(或模块,或 GDSII 术语中的 "struct")。 - 单元由
GdsElement
组成,这是一个枚举,包括单个多边形(GdsBoundary
)、其他布局单元的实例(GdsStructRef
)、文本(GdsTextElem
)以及一些其他几何元素。
- 根是一个
- 为了在磁盘上存储,
GdsLibrary
树被展平为一系列GdsRecord
。这些记录指示每个树节点的开始、结束和内容。这些记录的详细描述构成了 GDSII 规范的大部分。 - 记录以 GDSII 规范中详细说明的二进制形式存储在磁盘上。每个记录包括记录类型标题、数据类型、长度字段和可选的附加内容。这些原始字节从不由 Gds21 存储,仅在进入和离开
Read
和Write
对象(通常是File
)时生成和消耗。
用法
从磁盘加载 GdsLibrary
let lib = GdsLibrary::load("sample.gds")?;
创建一个新的空 GdsLibrary
,并添加一个 GdsStruct
单元定义
use gds21::{GdsLibrary, GdsStruct};
let mut lib = GdsLibrary::new("mylib");
lib.structs.push(GdsStruct::new("mycell"));
将 GdsLibrary
保存到磁盘
lib.save("mylib.gds");
序列化
Gds21 的 GdsLibrary
树中的每个元素都是 serde
可序列化的。GDSII 数据可以简单地以任何 serde 支持的格式进行序列化。示例
let lib = gds21::GdsLibrary::new("mylib");
let json = serde_json::to_string(&lib);
let yaml = serde_yaml::to_string(&lib);
let toml = toml::to_string(&lib);
Gds21 通过其 SerializationFormat
枚举支持 serde 格式的一个子集,并通过其伴随的 SerdeFile
特性直接支持每个格式的读写。使用 SerializationFormat::Yaml
的示例
use gds21::SerializationFormat::Yaml;
let lib = gds21::GdsLibrary::new("mylib");
// Write to YAML-format file
Yaml.save(&lib, "mylib.gds.yaml")?;
// And read back from file
let lib2: gds21::GdsLibrary = Yaml.open("mylib.gds.yaml")?;
请注意,这些基于文本的表示通常会比二进制 GDSII 数据大得多。
依赖项
~5–15MB
~186K SLoC