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
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9bc4b930a3d9862a61b67326c5714002c7594c36b88fed592f7193171b82e00
|
|
| MD5 |
5b6ff6fbe2590331704952113c956d33
|
|
| BLAKE2b-256 |
8860dca4d3834d4ac5fc5abc0d5cec28fe3484d697ab3c09b3a6cce16546de46
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
02e853d01650d86f152741ccf6bf32e10eb5d2d8753b05aee7919bb11d8e3765
|
|
| MD5 |
f25b54b8d19e1432b875d3d319b9d2ba
|
|
| BLAKE2b-256 |
b80732bea85336934a6b7c1e81b575228d76a79caa66dc9683c822a5051a6f39
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c62c2c7bd0332ddb0f0423eb16e66a1dfcb64c350935a4d0cc25566346a41bbd
|
|
| MD5 |
739c16de799dcb6a79dc4b95103bab2b
|
|
| BLAKE2b-256 |
a7e5fdcbeba386026d583c491a2f51d0cc3e5786f20a9b29265b2cda646e9f9f
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a9b0ce5818ffc005654741aac64bc29b012fe0a598f06bfc6f57693d83171a2e
|
|
| MD5 |
ae4ba404540952ec6fe0d6209d8b79f3
|
|
| BLAKE2b-256 |
c55bd71ac64a1448b8ca404b60e28cd1dda8d65fb3f702e4bdae68fe04be77e8
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57d84cb3279a9f425147fd7426ee58e2796f08db4f94f25f6d9f4f21790b72d0
|
|
| MD5 |
567ccdd5cbe4fbce3f63e891a2c1ba1d
|
|
| BLAKE2b-256 |
fde934c5ffb594b2af5f858a993a204ca5a7d0fe8584360391508267b08646ab
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
810ec172bf39f2836db66a74ec2e4ae0b02d9b1cd04fd4a8d43792191225d7d5
|
|
| MD5 |
ab15205977b73c3b82a15c71e1456e75
|
|
| BLAKE2b-256 |
a63f4ac1dfa55036a8e2fb06a021ca1a32d6128af13c22ab2216961dcc4e29d0
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d34ed32ae662278b9575c1fecbcf443ec633ef8128164811c83764f3c0ff2eb
|
|
| MD5 |
8385bc73c71c3aa9396acf7b4e33e524
|
|
| BLAKE2b-256 |
6be66badde6603f0e85bb3339bfee0304e615ebb5807117a91eaa8299ef8c2d8
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4415276f8126e2414c1b96c0bf4fb99871df35d7ff6fc22127021ccea00304cd
|
|
| MD5 |
f5bbf71b4bee66d9b9c3c99c2f642c8d
|
|
| BLAKE2b-256 |
6ba791f50b695dfd8025e0e0a3537cf0f5dce296f78fc378018e20a191ee21ce
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c5b32d9b770b9375d039b773fd422c5a2ecbf2678036bd5d895586fb8b72681
|
|
| MD5 |
883d062ab0e13b682fd72d6e7e3ce2cf
|
|
| BLAKE2b-256 |
c5325f9109c89d3e669712bef49aaeaabab2e9bc7e19ff13dbd870c2fe4a73e7
|