use crate::ast::SimpleAttri;
use core::str::FromStr;
use strum_macros::{Display, EnumString};
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum AntennaDiodeType {
#[strum(serialize = "power")]
Power,
#[strum(serialize = "ground")]
Ground,
#[strum(serialize = "power_and_ground")]
PowerAndGround,
}
impl SimpleAttri for AntennaDiodeType {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum Direction {
#[strum(serialize = "input")]
Input,
#[strum(serialize = "output")]
Output,
#[strum(serialize = "inout")]
Inout,
#[strum(serialize = "internal")]
Internal,
}
impl SimpleAttri for Direction {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum DontFault {
#[strum(serialize = "sa0")]
Sa0,
#[strum(serialize = "sa1")]
Sa1,
#[strum(serialize = "sao1")]
Sao1,
}
impl SimpleAttri for DontFault {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum DriverType {
#[strum(serialize = "pull_up")]
PullUp,
#[strum(serialize = "pull_down")]
PullDown,
#[strum(serialize = "open_drain")]
OpenDrain,
#[strum(serialize = "open_source")]
OpenSource,
#[strum(serialize = "bus_hold")]
BusHold,
#[strum(serialize = "resistive")]
Resistive,
#[strum(serialize = "resistive_0")]
Resistive0,
#[strum(serialize = "resistive_1")]
Resistive1,
}
impl SimpleAttri for DriverType {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum NextstateType {
#[strum(serialize = "data")]
Data,
#[strum(serialize = "preset")]
Preset,
#[strum(serialize = "clear")]
Clear,
#[strum(serialize = "load")]
Load,
#[strum(serialize = "scan_in")]
ScanIn,
#[strum(serialize = "scan_enable")]
ScanEnable,
}
impl SimpleAttri for NextstateType {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum PinFuncType {
#[strum(serialize = "clock_enable")]
ClockEnable,
#[strum(serialize = "active_high")]
ActiveHigh,
#[strum(serialize = "active_low")]
ActiveLow,
#[strum(serialize = "active_rising")]
ActiveRising,
#[strum(serialize = "active_falling")]
ActiveFalling,
}
impl SimpleAttri for PinFuncType {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum RestoreEdgeType {
#[strum(serialize = "edge_trigger")]
EdgeTrigger,
#[strum(serialize = "leading")]
Leading,
#[strum(serialize = "trailing")]
Trailing,
}
impl SimpleAttri for RestoreEdgeType {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum SignalType {
#[strum(serialize = "test_scan_in")]
TestScanIn,
#[strum(serialize = "test_scan_in_inverted")]
TestScanInInverted,
#[strum(serialize = "test_scan_out")]
TestScanOut,
#[strum(serialize = "test_scan_out_inverted")]
TestScanOutInverted,
#[strum(serialize = "test_scan_enable")]
TestScanEnable,
#[strum(serialize = "test_scan_enable_inverted")]
TestScanEnableInverted,
#[strum(serialize = "test_scan_clock")]
TestScanClock,
#[strum(serialize = "test_scan_clock_a")]
TestScanClockA,
#[strum(serialize = "test_scan_clock_b")]
TestScanClockB,
#[strum(serialize = "test_clock")]
TestClock,
}
impl SimpleAttri for SignalType {}
#[derive(Default)]
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum SlewControl {
#[strum(serialize = "low")]
Low,
#[strum(serialize = "medium")]
Medium,
#[strum(serialize = "high")]
High,
#[default]
#[strum(serialize = "none")]
None,
}
impl SimpleAttri for SlewControl {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum PreferTied {
#[strum(serialize = "1")]
One,
#[strum(serialize = "0")]
Zero,
}
impl SimpleAttri for PreferTied {}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Display, EnumString)]
#[derive(serde::Serialize, serde::Deserialize)]
enum OneValue {
#[strum(serialize = "1")]
One,
#[strum(serialize = "0")]
Zero,
#[strum(serialize = "x")]
Unkown,
}
#[derive(Debug, Clone, Eq, PartialEq, Copy)]
#[derive(serde::Serialize, serde::Deserialize)]
pub struct TwoValue(OneValue, OneValue);
impl SimpleAttri for TwoValue {}
impl core::fmt::Display for TwoValue {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "{}{}", self.0, self.1)
}
}
impl FromStr for TwoValue {
type Err = strum::ParseError;
#[inline]
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.len() != 2 {
return Err(strum::ParseError::VariantNotFound);
}
let mut i = s.chars();
if let Some(c1) = i.next() {
if let Some(c2) = i.next() {
let mut tmp = [0; 1];
return Ok(Self(
OneValue::from_str(c1.encode_utf8(&mut tmp))?,
OneValue::from_str(c2.encode_utf8(&mut tmp))?,
));
}
}
Err(strum::ParseError::VariantNotFound)
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn two_value() {
assert_eq!(Ok(TwoValue(OneValue::Unkown, OneValue::One)), TwoValue::from_str("x1"));
assert_eq!(Ok(TwoValue(OneValue::Zero, OneValue::One)), TwoValue::from_str("01"));
assert_eq!(Err(strum::ParseError::VariantNotFound), TwoValue::from_str("1"));
assert_eq!(Err(strum::ParseError::VariantNotFound), TwoValue::from_str("111"));
assert_eq!(Err(strum::ParseError::VariantNotFound), TwoValue::from_str("1-"));
}
}