Reading GDSII Files

Learn how to read and parse GDSII files with LayKit.

Basic Reading

The simplest way to read a GDSII file:

use laykit::GDSIIFile;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let gds = GDSIIFile::read_from_file("design.gds")?;
    println!("Loaded: {}", gds.library_name);
    Ok(())
}

Accessing File Information

#![allow(unused)]
fn main() {
let gds = GDSIIFile::read_from_file("design.gds")?;

println!("Library: {}", gds.library_name);
println!("Version: {}", gds.version);
println!("Units: {} user, {} database (meters)", gds.units.0, gds.units.1);
println!("Structures: {}", gds.structures.len());
}

Iterating Through Structures

#![allow(unused)]
fn main() {
for structure in &gds.structures {
    println!("\nStructure: {}", structure.name);
    println!("  Created: {:04}-{:02}-{:02}",
        structure.creation_time.year,
        structure.creation_time.month,
        structure.creation_time.day
    );
    println!("  Elements: {}", structure.elements.len());
}
}

Processing Elements

#![allow(unused)]
fn main() {
use laykit::GDSElement;

for element in &structure.elements {
    match element {
        GDSElement::Boundary(b) => {
            println!("Boundary: layer={}, {} vertices", b.layer, b.xy.len());
        }
        GDSElement::Path(p) => {
            println!("Path: layer={}, width={:?}", p.layer, p.width);
        }
        GDSElement::Text(t) => {
            println!("Text: \"{}\" at ({}, {})", t.string, t.xy.0, t.xy.1);
        }
        GDSElement::StructRef(s) => {
            println!("Reference: {}", s.sname);
        }
        _ => {}
    }
}
}

Error Handling

#![allow(unused)]
fn main() {
match GDSIIFile::read_from_file("design.gds") {
    Ok(gds) => {
        println!("Successfully read {} structures", gds.structures.len());
    }
    Err(e) => {
        eprintln!("Error reading GDSII file: {}", e);
    }
}
}