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

# Creates new file or overwrites content if it exists
with sf.StdfWriter("output.stdf", append=False) 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())

# Creates new file or appends to content if it exists
with sf.StdfWriter("output.stdf", append=True) as w:
    ...

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.2.1.tar.gz (77.7 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.2.1-cp310-abi3-win_amd64.whl (4.8 MB view details)

Uploaded CPython 3.10+Windows x86-64

stdfast-0.2.1-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.2.1-cp310-abi3-musllinux_1_2_armv7l.whl (5.4 MB view details)

Uploaded CPython 3.10+musllinux: musl 1.2+ ARMv7l

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

Uploaded CPython 3.10+musllinux: musl 1.2+ ARM64

stdfast-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.3 MB view details)

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

stdfast-0.2.1-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.2.1-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.2.1-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.2.1.tar.gz.

File metadata

  • Download URL: stdfast-0.2.1.tar.gz
  • Upload date:
  • Size: 77.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1.tar.gz
Algorithm Hash digest
SHA256 f9bc4b930a3d9862a61b67326c5714002c7594c36b88fed592f7193171b82e00
MD5 5b6ff6fbe2590331704952113c956d33
BLAKE2b-256 8860dca4d3834d4ac5fc5abc0d5cec28fe3484d697ab3c09b3a6cce16546de46

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 02e853d01650d86f152741ccf6bf32e10eb5d2d8753b05aee7919bb11d8e3765
MD5 f25b54b8d19e1432b875d3d319b9d2ba
BLAKE2b-256 b80732bea85336934a6b7c1e81b575228d76a79caa66dc9683c822a5051a6f39

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c62c2c7bd0332ddb0f0423eb16e66a1dfcb64c350935a4d0cc25566346a41bbd
MD5 739c16de799dcb6a79dc4b95103bab2b
BLAKE2b-256 a7e5fdcbeba386026d583c491a2f51d0cc3e5786f20a9b29265b2cda646e9f9f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 a9b0ce5818ffc005654741aac64bc29b012fe0a598f06bfc6f57693d83171a2e
MD5 ae4ba404540952ec6fe0d6209d8b79f3
BLAKE2b-256 c55bd71ac64a1448b8ca404b60e28cd1dda8d65fb3f702e4bdae68fe04be77e8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 57d84cb3279a9f425147fd7426ee58e2796f08db4f94f25f6d9f4f21790b72d0
MD5 567ccdd5cbe4fbce3f63e891a2c1ba1d
BLAKE2b-256 fde934c5ffb594b2af5f858a993a204ca5a7d0fe8584360391508267b08646ab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 5.3 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 810ec172bf39f2836db66a74ec2e4ae0b02d9b1cd04fd4a8d43792191225d7d5
MD5 ab15205977b73c3b82a15c71e1456e75
BLAKE2b-256 a63f4ac1dfa55036a8e2fb06a021ca1a32d6128af13c22ab2216961dcc4e29d0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 1d34ed32ae662278b9575c1fecbcf443ec633ef8128164811c83764f3c0ff2eb
MD5 8385bc73c71c3aa9396acf7b4e33e524
BLAKE2b-256 6be66badde6603f0e85bb3339bfee0304e615ebb5807117a91eaa8299ef8c2d8

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4415276f8126e2414c1b96c0bf4fb99871df35d7ff6fc22127021ccea00304cd
MD5 f5bbf71b4bee66d9b9c3c99c2f642c8d
BLAKE2b-256 6ba791f50b695dfd8025e0e0a3537cf0f5dce296f78fc378018e20a191ee21ce

See more details on using hashes here.

File details

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

File metadata

  • Download URL: stdfast-0.2.1-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.2 {"installer":{"name":"uv","version":"0.11.2","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.2.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9c5b32d9b770b9375d039b773fd422c5a2ecbf2678036bd5d895586fb8b72681
MD5 883d062ab0e13b682fd72d6e7e3ce2cf
BLAKE2b-256 c5325f9109c89d3e669712bef49aaeaabab2e9bc7e19ff13dbd870c2fe4a73e7

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