use std::ops::Not;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LogicLevel {
Low,
High,
}
impl Default for LogicLevel {
fn default() -> Self {
LogicLevel::Low
}
}
impl Not for LogicLevel {
type Output = Self;
fn not(self) -> Self::Output {
match self {
LogicLevel::Low => LogicLevel::High,
LogicLevel::High => LogicLevel::Low,
}
}
}
impl From<bool> for LogicLevel {
fn from(value: bool) -> Self {
if value {
LogicLevel::High
} else {
LogicLevel::Low
}
}
}
impl From<LogicLevel> for bool {
fn from(value: LogicLevel) -> Self {
match value {
LogicLevel::High => true,
LogicLevel::Low => false,
}
}
}
pub fn and(a: LogicLevel, b: LogicLevel) -> LogicLevel {
match (a, b) {
(LogicLevel::High, LogicLevel::High) => LogicLevel::High,
_ => LogicLevel::Low,
}
}
pub fn or(a: LogicLevel, b: LogicLevel) -> LogicLevel {
match (a, b) {
(LogicLevel::Low, LogicLevel::Low) => LogicLevel::Low,
_ => LogicLevel::High,
}
}
pub fn nand(a: LogicLevel, b: LogicLevel) -> LogicLevel {
!and(a, b)
}
pub fn nor(a: LogicLevel, b: LogicLevel) -> LogicLevel {
!or(a, b)
}
pub fn xor(a: LogicLevel, b: LogicLevel) -> LogicLevel {
match (a, b) {
(LogicLevel::Low, LogicLevel::High) | (LogicLevel::High, LogicLevel::Low) => {
LogicLevel::High
}
_ => LogicLevel::Low,
}
}