Skip to main content

STDF parser and writer

Project description

stdfast

This is a fork from stupidf, jlazear

stdfast is a library for parsing and writing of STDF files. The STDF structure can be used directly in rust, or alternatively sent out to Python. The library exposes several functions to read and write STDF file records from python. Additionally, there is a pydantic model for each record type to simplify the handling in python.

STDF is the Standard Test Data Format and is commonly used for high-volume test of semiconductors in Automated Test Equipment (ATE) systems.

The purpose of the library is to quickly and efficiently parse and write STDF files (which are a fairly unfriendly binary linked list-based format).

Examples

Python

Also contains Python bindings to this functionality, e.g.

Parsing

Full parse into a dict of DataFrames (eager):

import stdfast as sf

stdf = sf.parse_stdf("my_stdf.stdf")
stdf["data"]              # polars DataFrame of all test results
stdf["test_information"]  # DataFrame of test metadata
stdf["master_information"]["lot_id"]  # MIR field

Raw record dicts, fully loaded (eager):

import stdfast as sf

records = sf.get_raw_records("my_stdf.stdf")
ptrs = [r for r in records if r["record_type"] == "PTR"]

Pydantic models, fully loaded (eager):

import stdfast as sf

records = sf.get_records("my_stdf.stdf")
failing = [r for r in records if r.record_type == "PTR" and not r.pass_()]

Lazy iteration over raw dicts — memory-efficient for large files:

import stdfast as sf

for record in sf.iter_raw_records("my_stdf.stdf"):
    if record["record_type"] == "PTR":
        print(record["test_num"], record["result"])

Lazy iteration over Pydantic models:

import stdfast as sf

for record in sf.iter_records("my_stdf.stdf"):
    if record.record_type == "PTR":
        print(record.test_num, record.result)

Collect only MIR (file header metadata):

import stdfast as sf

mir = sf.get_mir("my_stdf.stdf")
print(mir["lot_id"], mir["part_typ"])

Writing

Batch write with write_stdf (builds the full list in memory first):

import stdfast as sf
from stdfast.records import FAR, MIR, MRR, PIR, PTR, PRR

records = [
    FAR(cpu_type=2, stdf_ver=4),
    MIR(lot_id="LOT001", part_typ="MYPART", job_nam="MYJOB"),
    PIR(head_num=1, site_num=1),
    PTR(test_num=1000, head_num=1, site_num=1, result=1.23, test_txt="my_test"),
    PRR(head_num=1, site_num=1, hard_bin=1, soft_bin=1, num_test=1),
    MRR(),
]
sf.write_stdf("output.stdf", records)

Streaming write with StdfWriter (flushes each record immediately):

import stdfast as sf
from stdfast.records import FAR, MIR, MRR, PIR, PTR, PRR

with sf.StdfWriter("output.stdf") as w:
    w.write_record(FAR(cpu_type=2, stdf_ver=4))
    w.write_record(MIR(lot_id="LOT001", part_typ="MYPART", job_nam="MYJOB"))
    for i, result in enumerate(my_results):
        w.write_record(PIR(head_num=1, site_num=1))
        w.write_record(PTR(test_num=1000 + i, head_num=1, site_num=1, result=result, test_txt=f"test_{i}"))
        w.write_record(PRR(head_num=1, site_num=1, hard_bin=1, soft_bin=1, num_test=1))
    w.write_record(MRR())

StdfWriter is preferable when the number of records is large or unknown upfront, since it never holds more than one record in memory at a time.

Rust

Parsing

use stdfast::data::STDF;
use polars::prelude::*;

let verbose = false;
if let Ok(stdf) = STDF::from_fname(&fname, verbose) {
    let df: DataFrame = (&stdf.test_data).into();
    let df_fmti: DataFrame = (&stdf.test_data.test_information).into();
    println!("{df:#?}");
    println!("{df_fmti}");
    }

Records is a lazy iterator over RawRecords. Each RawRecord reads from the file but does not parse its contents until .resolve() is called, which returns an Option<Record>. This lets you skip or filter records without paying the parsing cost for every one.

Print every record as ATDF text:

use stdfast::records::Records;

let records = Records::new("my_stdf.stdf")?;
for raw in records {
    if let Some(record) = raw.resolve() {
        println!("{record}");
    }
}

Collect only PTR records, resolving nothing else:

use stdfast::records::{Records, record_impl::Record};

let ptrs: Vec<_> = Records::new("my_stdf.stdf")?
    .filter_map(|raw| raw.resolve())
    .filter_map(|r| if let Record::PTR(ptr) = r { Some(ptr) } else { None })
    .collect();

Count records by type without resolving any:

use stdfast::records::{Records, RecordSummary};

let mut summary = RecordSummary::new();
for raw in Records::new("my_stdf.stdf")? {
    summary.add(&raw);
}
for (rtype, count) in summary {
    println!("{rtype:?}: {count}");
}

Find the first failing PTR:

use stdfast::records::{Records, record_impl::Record};

let first_fail = Records::new("my_stdf.stdf")?
    .filter_map(|raw| raw.resolve())
    .filter_map(|r| if let Record::PTR(ptr) = r { Some(ptr) } else { None })
    .find(|ptr| !ptr.pass());

Installation

There is no cargo or pypi release yet.

Building from source

Rust:

cargo build

Python bindings (requires an active virtualenv):

pip install maturin
maturin develop

Development

If you're seeing issues with pyo3 recompiling on every build, even when there are no pyo3-related changes, then you're most likely running into this issue.

Consider setting the PYO3_PYTHON env variable adding to your Cargo.toml or terminal:

[env]
PYO3_PYTHON = /path/to/python

and also ensuring this is the Python interpreter used by your IDE. E.g. if using nvim, activate the venv before starting nvim.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stdfast-0.1.2.tar.gz (76.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

stdfast-0.1.2-cp310-abi3-win_amd64.whl (4.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

stdfast-0.1.2-cp310-abi3-musllinux_1_2_x86_64.whl (5.5 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ x86-64

stdfast-0.1.2-cp310-abi3-musllinux_1_2_armv7l.whl (5.4 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARMv7l

stdfast-0.1.2-cp310-abi3-musllinux_1_2_aarch64.whl (5.2 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

stdfast-0.1.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

stdfast-0.1.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (5.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARMv7l

stdfast-0.1.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (5.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

stdfast-0.1.2-cp310-abi3-macosx_11_0_arm64.whl (4.6 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

File details

Details for the file stdfast-0.1.2.tar.gz.

File metadata

  • Download URL: stdfast-0.1.2.tar.gz
  • Upload date:
  • Size: 76.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2.tar.gz
Algorithm Hash digest
SHA256 117474a498bddc97a579949ffc898971b40942776722556ac773c33e5e779252
MD5 28e51780a407c64419aac9f6749b2296
BLAKE2b-256 b47a3792b67fef27920afe9e5a5dc86cc22c28fde2111b99b164105921b01b9a

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 4.8 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 a9b84336e89d173436049043d8756f525642dada4bd0cb2bda6a6f80e8bf24b7
MD5 47a9702bb5f96a435687b857331e1cad
BLAKE2b-256 7e0657ca659b2440552b28ff9d9aeb93a58a0e64f0feea2df571b11884a41338

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 5.5 MB
  • Tags: CPython 3.10+, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2a5a8947614d51b8fb938fad9b1a66ced9be9f84232ba7450638d63847441fb1
MD5 4d8ef3c0b26d35660a01ea91886bcec7
BLAKE2b-256 7f9b6b17d0cecb5e9e5b945d0ee3ba0796e27d296f0e00a275264a9931c9ef89

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-musllinux_1_2_armv7l.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-musllinux_1_2_armv7l.whl
  • Upload date:
  • Size: 5.4 MB
  • Tags: CPython 3.10+, musllinux: musl 1.2+ ARMv7l
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 e1eb34a74f0e34d0ba3e747cd7e6addfd7dd94d0df3171018065025b978c34e0
MD5 8b66736374023f02c4c7ae7a51753280
BLAKE2b-256 183c8e9dd616de480153523243158d3dc0e65a21ed894ca36689db84e68b2ea8

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.10+, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1850ad489dad1cb69aadd0a6e683eb624dda2c6a052be2e5f6effe171b9c57a9
MD5 3788ef702b5290f1e1767a0b0148a143
BLAKE2b-256 483ada5e2146d12f33b31158815c47335d5730b4ba7ff32f43e93f7af4994423

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 755cd4cc1b4d8d10b9da418296e1f71579a2707eabc1b47839994bcc8e7f2b21
MD5 8bc5496a5e20cb6661ca26cb87de750d
BLAKE2b-256 8e7c06589febd556eb3f572181ca3ad93544bdd89c64bdedf4465080a4eb052f

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
  • Upload date:
  • Size: 5.2 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ ARMv7l
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 68eb750833e37d939d83500ba9512c479ecd7d58d12ffc891a61dc14986c5587
MD5 f94821ba5c4582744a258cf53907c88e
BLAKE2b-256 ea93f6b489fbbcd03e586ddae5a0200d11c044c6de470dfd9ea5bff12e87460d

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
  • Upload date:
  • Size: 5.0 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bc18d39cfe62c8deeb28c817219ea3056c4c5c9f384482c0bf306adec072562a
MD5 48b2328745b7c954776991b5f8654297
BLAKE2b-256 51aa9202045d9c25e6c2f76e21443a3fe95f35fc2835a9b26d322f47f68de9b4

See more details on using hashes here.

File details

Details for the file stdfast-0.1.2-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: stdfast-0.1.2-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 4.6 MB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.1 {"installer":{"name":"uv","version":"0.11.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for stdfast-0.1.2-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e2b7c656c1b83abdbf4404bb198b44d2fd61270d9fb1ee3025231afc9d47d18
MD5 3523f9ad8e1fca78040e3d2ab50a9927
BLAKE2b-256 e35f37ebfb1166b8839729f72a5e362ede6d2e9d74ad16fe56ad3b6d003c7a94

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page