use crate::logic_level::LogicLevel;
use std::fmt::Debug;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PinType {
Input,
Output,
Vcc, Gnd, Nc, }
pub trait Chip: Debug + Send + Sync {
fn pin_count(&self) -> usize;
fn get_pin_type(&self, pin: usize) -> PinType;
fn set_input(&mut self, pin: usize, level: LogicLevel);
fn get_output(&self, pin: usize) -> LogicLevel;
fn update(&mut self);
fn name(&self) -> &'static str;
fn box_clone(&self) -> Box<dyn Chip>;
}
impl Clone for Box<dyn Chip> {
fn clone(&self) -> Self {
self.box_clone()
}
}
#[inline(always)]
pub(crate) fn validate_pin(pin: usize, max_pin: usize) {
assert!(pin >= 1 && pin <= max_pin, "Invalid pin number: {}", pin);
}