use std::collections::{HashMap, HashSet};
mod builder;
mod endpoint;
mod node;
mod pads;
mod registry;
#[cfg(test)]
mod tests;
pub use node::NetNode;
use crate::parser::Circuit;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DanglingRef {
pub owner: String,
pub target: String,
}
#[derive(Debug, Clone, Default)]
pub struct Netlist {
pub(crate) nets: Vec<NetNode>,
pub(crate) by_id: HashMap<String, usize>,
pub(crate) port_to_net: HashMap<String, usize>,
pub(crate) pad_to_net: HashMap<String, usize>,
pub(crate) endpoint_ids_per_net: Vec<HashSet<String>>,
pub(crate) dangling_refs: Vec<DanglingRef>,
}
impl Netlist {
pub fn from_circuit(circuit: &Circuit) -> Self {
builder::build_netlist(circuit)
}
pub fn floating_nets(&self) -> impl Iterator<Item = &NetNode> {
self.nets.iter().filter(|n| n.is_floating())
}
pub fn ghost_nets(&self) -> impl Iterator<Item = &NetNode> {
self.nets.iter().filter(|n| n.is_ghost())
}
pub fn dangling_refs(&self) -> &[DanglingRef] {
&self.dangling_refs
}
}