use std::{collections::HashSet, fmt::Debug, rc::Rc};
use itertools::Itertools;
use strum_macros::{Display, EnumString};
use crate::ast::{GroupComments, SimpleAttri};
#[derive(Debug, Clone, PartialEq)]
#[derive(Default)]
pub struct SdfExpression {}
#[derive(Debug, Clone, Copy, PartialEq)]
#[derive(Default, EnumString, Display)]
pub enum SdfEdgeType {
#[default]
#[strum(serialize = "noedge")]
Noedge,
#[strum(serialize = "start_edge")]
StartEdge,
#[strum(serialize = "end_edge")]
EndEdge,
#[strum(serialize = "both_edges")]
BothEdges,
}
#[derive(Debug, Clone, Copy, PartialEq)]
#[derive(Display, EnumString)]
pub enum VariableType {
#[strum(serialize = "input_net_transition")]
InputNetTransition,
#[strum(serialize = "normalized_voltage")]
NormalizedVoltage,
#[strum(serialize = "total_output_net_capacitance")]
TotalOutputNetCapacitance,
#[strum(serialize = "related_out_total_output_net_capacitance")]
RelatedOutTotalOutputNetCapacitance,
#[strum(serialize = "constrained_pin_transition")]
ConstrainedPinTransition,
#[strum(serialize = "fanout_number")]
FanoutNumber,
#[strum(serialize = "fanout_pin_capacitance")]
FanoutPinCapacitance,
#[strum(serialize = "driver_slew")]
DriverSlew,
#[strum(serialize = "input_transition_time")]
InputTransitionTime,
}
#[derive(Debug, Default, Clone)]
#[derive(liberty_macros::Group)]
#[mut_set_derive::item(
macro(derive(Debug, Clone,Default);)
)]
pub struct Domain {
#[liberty(name)]
#[id]
pub name: String,
#[liberty(comments)]
_comments: GroupComments<Self>,
#[liberty(undefined)]
_undefined: crate::ast::AttributeList,
pub group_name: String,
pub calc_mode: Option<String>,
pub variable_1: Option<VariableType>,
pub variable_2: Option<VariableType>,
pub variable_3: Option<VariableType>,
pub index_1: Vec<f64>,
pub index_2: Vec<f64>,
pub index_3: Vec<f64>,
}
#[derive(Debug, Default, Clone, Eq, PartialEq)]
pub struct WordSet {
_set: HashSet<String>,
}
impl std::fmt::Display for WordSet {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Display::fmt(&self._set.iter().join(" "), f)
}
}
impl SimpleAttri for WordSet {}
impl std::hash::Hash for WordSet {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
let mut sum = 0_u64;
for item in &self._set {
let mut hasher = std::hash::DefaultHasher::new();
item.hash(&mut hasher);
sum = sum.wrapping_add(std::hash::Hasher::finish(&hasher));
}
state.write_u64(sum);
}
}
impl std::str::FromStr for WordSet {
type Err = std::fmt::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self {
_set: s.split(' ').map(ToString::to_string).collect(),
})
}
}
#[derive(Debug, Default, Clone)]
#[derive(liberty_macros::Group)]
#[mut_set_derive::item(
macro(derive(Debug, Clone,Default);)
)]
pub struct TableLookUpMultiSegment {
#[liberty(name)]
#[id]
name: Option<String>,
#[liberty(comments)]
_comments: GroupComments<Self>,
#[liberty(undefined)]
_undefined: crate::ast::AttributeList,
#[liberty(simple)]
#[id]
segment: usize,
#[liberty(complex(type=Default))]
pub index_1: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_2: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_3: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_4: Vec<f64>,
#[liberty(complex(type=Default))]
pub values: Vec<f64>,
}
#[derive(Debug, Default, Clone)]
#[derive(liberty_macros::Group)]
#[mut_set_derive::item(
macro(derive(Debug, Clone,Default);)
)]
pub struct TableLookUp {
#[id]
#[liberty(name)]
name: Option<String>,
#[liberty(comments)]
_comments: GroupComments<Self>,
#[liberty(undefined)]
_undefined: crate::ast::AttributeList,
#[liberty(complex(type=Default))]
pub index_1: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_2: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_3: Vec<f64>,
#[liberty(complex(type=Default))]
pub index_4: Vec<f64>,
#[liberty(complex(type=Default))]
pub values: Vec<f64>,
}