psfparser 0.1.2

A PSF reader written in Rust
Documentation
use crate::analysis::ac::AcData;
use crate::analysis::transient::TransientData;

use super::*;

pub(crate) static TRAN_EXAMPLE_PSFBIN_1: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/examples/tranbin1.tran.tran"
));

pub(crate) static VDIV_SIN_PSFBIN: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/examples/vdiv_sin_bin.tran.tran"
));

pub(crate) static SRAM_TINY_PSFBIN: &[u8] = include_bytes!(concat!(
    env!("CARGO_MANIFEST_DIR"),
    "/examples/sram_tiny_bin.tran.tran"
));

pub(crate) static AC_ZOUT_PSFBIN: &[u8] =
    include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/examples/AcZout.ac"));

#[test]
fn test_header() {
    let toc = parse_toc(TRAN_EXAMPLE_PSFBIN_1);
    let header = parse_header(TRAN_EXAMPLE_PSFBIN_1, &toc.data[&SectionKind::Header]);
    println!("Header: {:?}", header);
}

#[test]
fn test_types() {
    let toc = parse_toc(TRAN_EXAMPLE_PSFBIN_1);
    let types = parse_types(TRAN_EXAMPLE_PSFBIN_1, &toc.data[&SectionKind::Type]);
    println!("Types: {:?}", types);
}

#[test]
fn test_traces() {
    let toc = parse_toc(TRAN_EXAMPLE_PSFBIN_1);
    println!("ToC: {:?}", toc);
    let traces = parse_traces(TRAN_EXAMPLE_PSFBIN_1, &toc.data[&SectionKind::Trace]);
    let expected = vec![Trace::Group(TraceGroup {
        name: "group",
        count: 3,
        id: GroupId(24),
        signals: vec![
            SignalRef {
                id: TraceId(25),
                name: "out",
                type_id: TypeId(11),
                properties: Properties { values: vec![] },
            },
            SignalRef {
                id: TraceId(26),
                name: "vdd",
                type_id: TypeId(11),
                properties: Properties { values: vec![] },
            },
            SignalRef {
                id: TraceId(27),
                name: "Vvdd:p",
                type_id: TypeId(12),
                properties: Properties { values: vec![] },
            },
        ],
    })];
    println!("Traces: {:?}", traces);
    assert_eq!(traces, expected);
}

#[test]
fn test_values() {
    let toc = parse_toc(TRAN_EXAMPLE_PSFBIN_1);
    println!("ToC: {:?}", toc);
    let mut parser = PsfParser::new(TRAN_EXAMPLE_PSFBIN_1);
    parser.parse();
}

#[test]
fn test_sweeps() {
    let toc = parse_toc(TRAN_EXAMPLE_PSFBIN_1);
    println!("ToC: {:?}", toc);
    let sweeps = parse_sweeps(TRAN_EXAMPLE_PSFBIN_1, &toc.data[&SectionKind::Sweep]);
    println!("Sweeps: {:?}", sweeps);
}

#[test]
fn test_to_transient_1() {
    use crate::binary::parse;
    let ast = parse(TRAN_EXAMPLE_PSFBIN_1).unwrap();
    println!("ast = {ast:#?}");
    let data = TransientData::from_binary(ast);
    assert_eq!(data.signals.len(), 4);
    assert_eq!(
        data.signal("time")
            .expect("should contain a time signal")
            .len(),
        11
    );
}

#[test]
fn parses_vdiv_sin_bin() {
    use crate::binary::parse;
    let ast = parse(VDIV_SIN_PSFBIN).unwrap();
    let data = TransientData::from_binary(ast);
    assert_eq!(data.signals.len(), 4);
    assert_eq!(
        data.signal("time")
            .expect("should contain a time signal")
            .len(),
        16001
    );
}

#[test]
fn parses_sram_tiny_bin() {
    use crate::binary::parse;
    let ast = parse(SRAM_TINY_PSFBIN).unwrap();
    let data = TransientData::from_binary(ast);
    assert_eq!(data.signals.len(), 1321);
    assert_eq!(
        data.signal("time")
            .expect("should contain a time signal")
            .len(),
        201
    );
}

#[test]
fn parses_ac() {
    let ast = parse(AC_ZOUT_PSFBIN).expect("Failed to parse ac PSF file");
    let data = AcData::from_binary(ast);
    assert_eq!(data.signals.len(), 2);
    assert_eq!(data.freq.len(), 78);
}