Crate gds

source ·
Expand description

A library for parsing and writing GDSII files.

GDSII is the IC industry’s de facto standard for storing and sharing layout data. gds is a crate for reading and creating GDSII data based on Gds21 and similar to libraries such as gdstk and its predecessor gdspy. Reading and generating GDSII-format data are primary goals; offering ease-of-use functionality for more elaborate manipulations of GDS data is not.

Layout data is represented in three primary forms:

  • A short tree with three layers:
    • The root is a GdsLibrary, which primarily consists of a set of cells (GdsStructs), and secondarily a set of metadata. Each GdsLibrary is a universe unto itself, in that it has no mechanisms for comprehending layout cells or data defined outside itself. On-disk each GdsLibrary is typically paired one-to-one with a .gds file.
    • Libraries consist of cell definitions AKA GdsStructs, which define each layout cell (or module, or “struct” in GDSII terms).
    • Cells consist of GdsElements, an enumeration which includes individual polygons (GdsBoundary), instances of other layout cells (GdsStructRef), text (GdsTextElem), and a few other geometric elements.
  • For storage on disk, the GdsLibrary tree is flattened to a series of GdsRecords. These records indicate the beginning, end, and content of each tree-node. Detailed descriptions of these records comprise the majority of the GDSII spec.
  • Records are stored on-disk in binary form as detailed in the GDSII spec. Each includes a record-type header, datatype, length field, and optional additional content. These raw-bytes are never stored by Gds21, only generated and consumed on their way into and out of Read and Write objects (typically Files).

§Usage

Loading a GdsLibrary from disk:

let lib = GdsLibrary::load("sample.gds")?;

Creating a new and empty GdsLibrary, and adding a GdsStruct cell-definition:

use gds::{GdsLibrary, GdsStruct};
let mut lib = GdsLibrary::new("mylib");
lib.structs.push(GdsStruct::new("mycell"));

Saving a GdsLibrary to disk:

lib.save("mylib.gds");

§Serialization

Each element in Gds21’s GdsLibrary tree is serde-serializable. GDSII data can be straightforwardly serialized in any serde-supported format. Examples:

let lib = gds::GdsLibrary::new("mylib");
let json = serde_json::to_string(&lib);
let yaml = serde_yaml::to_string(&lib);
let toml = toml::to_string(&lib);

Gds21 includes built-in support for a subset of serde-formats via its SerializationFormat enumeration, and support for directly reading and writing files in each format via its accompanying SerdeFile trait. Example using SerializationFormat::Yaml:

use gds::SerializationFormat::Yaml;
let lib = gds::GdsLibrary::new("mylib");

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

Note these text-based representations will generally be substantially larger than binary GDSII data.

Structs§

Enums§

Traits§

  • An object that has a corresponding GDS layer.
  • A trait for serializing/deserializing files.

Functions§

  • Check lib matches across a write-read round-trip cycle

Type Aliases§