use compact_str::CompactString;
use std::sync::Arc;
#[derive(Debug)]
pub struct SPEF {
pub header: SPEFHeader,
pub top_ports: Vec<SPEFPort>,
pub nets: Vec<SPEFNet>,
}
#[derive(Debug)]
pub struct SPEFHeader {
pub edition: CompactString, pub design: CompactString,
pub date: CompactString,
pub vendor: CompactString,
pub program: CompactString,
pub version: CompactString,
pub design_flow: Vec<CompactString>,
pub divider: char,
pub delimiter: char,
pub bus_delimiter_left: char,
pub bus_delimiter_right: char,
pub time_unit: f32,
pub cap_unit: f32,
pub res_unit: f32,
pub induct_unit: f32
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum Direction {
I,
O,
B
}
#[derive(Debug, PartialEq, Copy, Clone)] pub enum ParValue {
Single(f32),
Three(f32, f32, f32)
}
mod hier_name;
pub use hier_name::HierName;
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct SPEFHierPortPinRef(pub Arc<HierName>, pub Option<CompactString>, pub Option<isize>);
#[derive(Debug)]
pub struct SPEFConnAttr {
pub coords: Option<(f32, f32)>,
pub cap_load: Option<ParValue>,
pub slew: Option<(ParValue, ParValue)>,
pub driving_cell: Option<CompactString>
}
#[derive(Debug)]
pub struct SPEFPort {
pub name: SPEFHierPortPinRef,
pub direction: Direction,
pub conn_attr: SPEFConnAttr
}
#[derive(Debug)]
pub struct SPEFNet {
pub name: SPEFHierPortPinRef,
pub total_cap: f32,
pub conns: Vec<SPEFNetConn>,
pub caps: Vec<SPEFNetCap>,
pub ress: Vec<SPEFNetRes>
}
#[derive(Debug)]
pub struct SPEFNetConn {
pub name: SPEFHierPortPinRef,
pub direction: Direction,
pub conn_attr: SPEFConnAttr
}
#[derive(Debug)]
pub struct SPEFNetCap {
pub a: SPEFHierPortPinRef,
pub b: Option<SPEFHierPortPinRef>,
pub val: ParValue
}
#[derive(Debug)]
pub struct SPEFNetRes {
pub a: SPEFHierPortPinRef,
pub b: SPEFHierPortPinRef,
pub val: ParValue
}
mod spefpest;
mod fmt;
impl SPEF {
#[inline]
pub fn parse_str(s: &str) -> Result<SPEF, String> {
spefpest::parse_spef(s)
}
}