use crate::{ArcStr, NotNan};
use core::marker::PhantomData;
pub use uom::{
fmt::DisplayStyle,
si::{
capacitance, electric_current, electric_potential, electrical_resistance,
f64::{
Capacitance, ElectricCharge, ElectricCurrent, ElectricPotential,
ElectricalResistance, Energy, Length, Power, Ratio, ThermodynamicTemperature, Time,
},
ratio, thermodynamic_temperature, Unit,
},
};
pub mod electric_charge;
pub mod energy;
pub mod length;
pub mod power;
pub mod time;
#[must_use]
#[inline]
pub fn meter(v: f64) -> Length {
Length::new::<length::meter>(v)
}
#[must_use]
#[inline]
pub fn second(v: f64) -> Time {
Time::new::<time::second>(v)
}
#[must_use]
#[inline]
pub fn microsecond(v: f64) -> Time {
Time::new::<time::microsecond>(v)
}
#[must_use]
#[inline]
pub fn nanosecond(v: f64) -> Time {
Time::new::<time::nanosecond>(v)
}
use crate::ast::{ComplexAttri, ComplexParseError, SimpleAttri};
use core::ops::Deref;
#[derive(Debug, Default, Clone, Copy)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum TimeUnit {
#[strum(serialize = "1ps")]
_1ps,
#[strum(serialize = "10ps")]
_10ps,
#[strum(serialize = "100ps")]
_100ps,
#[default]
#[strum(serialize = "1ns")]
_1ns,
}
impl TimeUnit {
const LUT: [<Self as Deref>::Target; 4] = [
Time {
dimension: PhantomData,
units: PhantomData,
value: 1E-12_f64,
},
Time {
dimension: PhantomData,
units: PhantomData,
value: 1E-11_f64,
},
Time {
dimension: PhantomData,
units: PhantomData,
value: 1E-10_f64,
},
Time {
dimension: PhantomData,
units: PhantomData,
value: 1E-9_f64,
},
];
}
impl Deref for TimeUnit {
type Target = Time;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&Self::LUT[*self as usize]
}
}
impl SimpleAttri for TimeUnit {}
#[derive(Debug, Default, Clone, Copy)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum VoltageUnit {
#[strum(serialize = "1mV")]
_1mV,
#[strum(serialize = "10mV")]
_10mV,
#[strum(serialize = "100mV")]
_100mV,
#[default]
#[strum(serialize = "1V")]
_1V,
}
impl VoltageUnit {
const LUT: [<Self as Deref>::Target; 4] = [
ElectricPotential {
dimension: PhantomData,
units: PhantomData,
value: 1E-3_f64,
},
ElectricPotential {
dimension: PhantomData,
units: PhantomData,
value: 1E-2_f64,
},
ElectricPotential {
dimension: PhantomData,
units: PhantomData,
value: 1E-1_f64,
},
ElectricPotential {
dimension: PhantomData,
units: PhantomData,
value: 1E0___f64,
},
];
}
impl Deref for VoltageUnit {
type Target = ElectricPotential;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&Self::LUT[*self as usize]
}
}
impl SimpleAttri for VoltageUnit {}
#[derive(Debug, Clone, Copy)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum CurrentUnit {
#[strum(serialize = "1uA")]
_1uA,
#[strum(serialize = "10uA")]
_10uA,
#[strum(serialize = "100uA")]
_100uA,
#[strum(serialize = "1mA")]
_1mA,
#[strum(serialize = "10mA")]
_10mA,
#[strum(serialize = "100mA")]
_100mA,
#[strum(serialize = "1A")]
_1A,
}
impl CurrentUnit {
const LUT: [<Self as Deref>::Target; 7] = [
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-6_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-5_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-4_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-3_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-2_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E-1_f64,
},
ElectricCurrent {
dimension: PhantomData,
units: PhantomData,
value: 1E0_f64,
},
];
}
impl Deref for CurrentUnit {
type Target = ElectricCurrent;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&Self::LUT[*self as usize]
}
}
impl SimpleAttri for CurrentUnit {}
#[derive(Debug, Clone, Copy)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum PullingResistanceUnit {
#[strum(serialize = "1ohm")]
_1ohm,
#[strum(serialize = "10ohm")]
_10ohm,
#[strum(serialize = "100ohm")]
_100ohm,
#[strum(serialize = "1kohm")]
_1kohm,
}
impl PullingResistanceUnit {
const LUT: [<Self as Deref>::Target; 4] = [
ElectricalResistance {
dimension: PhantomData,
units: PhantomData,
value: 1E0_f64,
},
ElectricalResistance {
dimension: PhantomData,
units: PhantomData,
value: 1E1_f64,
},
ElectricalResistance {
dimension: PhantomData,
units: PhantomData,
value: 1E2_f64,
},
ElectricalResistance {
dimension: PhantomData,
units: PhantomData,
value: 1E3_f64,
},
];
}
impl Deref for PullingResistanceUnit {
type Target = ElectricalResistance;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&Self::LUT[*self as usize]
}
}
impl SimpleAttri for PullingResistanceUnit {}
#[derive(Debug, Default, Clone, Copy)]
#[derive(serde::Serialize, serde::Deserialize)]
pub struct CapacitiveLoadUnit {
ff_pf: bool,
_v: Capacitance,
}
impl Deref for CapacitiveLoadUnit {
type Target = Capacitance;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&self._v
}
}
impl ComplexAttri for CapacitiveLoadUnit {
#[inline]
fn parse(v: &[&str]) -> Result<Self, ComplexParseError> {
let mut i = v.iter();
let value: NotNan<f64> = match i.next() {
Some(&s) => match s.parse() {
Ok(f) => f,
Err(e) => return Err(ComplexParseError::Float(e)),
},
None => return Err(ComplexParseError::LengthDismatch),
};
let (ff_pf, _v): (bool, Capacitance) = match i.next() {
Some(&s) => match s {
"ff" => (true, Capacitance::new::<capacitance::femtofarad>(*value)),
"pf" => (false, Capacitance::new::<capacitance::picofarad>(*value)),
_ => return Err(ComplexParseError::UnsupportedWord),
},
None => return Err(ComplexParseError::LengthDismatch),
};
if i.next().is_some() {
return Err(ComplexParseError::LengthDismatch);
}
Ok(Self { ff_pf, _v })
}
#[inline]
fn to_wrapper(&self) -> crate::ast::ComplexWrapper {
let mut buffer = ryu::Buffer::new();
if self.ff_pf {
vec![vec![
ArcStr::from(buffer.format(self._v.get::<capacitance::femtofarad>())),
"ff".into(),
]]
} else {
vec![vec![
ArcStr::from(buffer.format(self._v.get::<capacitance::picofarad>())),
"pf".into(),
]]
}
}
}
#[derive(Debug, Clone, Copy, Default)]
#[derive(strum_macros::EnumString, strum_macros::Display)]
#[derive(serde::Serialize, serde::Deserialize)]
pub enum LeakagePowerUnit {
#[strum(serialize = "")]
#[default]
None,
#[strum(serialize = "1pW")]
_1pW,
#[strum(serialize = "10pW")]
_10pW,
#[strum(serialize = "100pW")]
_100pW,
#[strum(serialize = "1nW")]
_1nW,
#[strum(serialize = "10nW")]
_10nW,
#[strum(serialize = "100nW")]
_100nW,
#[strum(serialize = "1uW")]
_1uW,
#[strum(serialize = "10uW")]
_10uW,
#[strum(serialize = "100uW")]
_100uW,
#[strum(serialize = "1mW")]
_1mW,
#[strum(serialize = "10mW")]
_10mW,
#[strum(serialize = "100mW")]
_100mW,
#[strum(serialize = "1W")]
_1W,
}
impl LeakagePowerUnit {
const LUT: [<Self as Deref>::Target; 14] = [
Power {
dimension: PhantomData,
units: PhantomData,
value: 1.0_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-12_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-11_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-10_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-9_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-8_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-7_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-6_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-5_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-4_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-3_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-2_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E-1_f64,
},
Power {
dimension: PhantomData,
units: PhantomData,
value: 1E0_f64,
},
];
}
impl Deref for LeakagePowerUnit {
type Target = Power;
#[allow(clippy::indexing_slicing, clippy::as_conversions)]
#[inline]
fn deref(&self) -> &Self::Target {
&Self::LUT[*self as usize]
}
}
impl SimpleAttri for LeakagePowerUnit {}