#layout #parser #data #writer #ic #interface #gdsii

gds21

Gds21 集成电路布局解析器 & 编写器

4 个版本 (不稳定)

3.0.0-pre.22023 年 1 月 11 日
0.2.0 2021 年 10 月 12 日
0.1.1 2021 年 4 月 6 日
0.1.0 2021 年 4 月 6 日

#11#ic

Download history 2/week @ 2024-04-07 4/week @ 2024-04-21 2/week @ 2024-04-28 3/week @ 2024-05-19 4/week @ 2024-05-26 5/week @ 2024-06-02 3/week @ 2024-06-09 1/week @ 2024-06-16 6/week @ 2024-06-23 1/week @ 2024-06-30 21/week @ 2024-07-14 33/week @ 2024-07-21

55 每月下载次数
3 crates 中使用

BSD-3-Clause

140KB
2.5K SLoC

Gds21

docs

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 存储,仅在进入和离开 ReadWrite 对象(通常是 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