use std::collections::HashMap;
use std::sync::Arc;
use std::collections::HashSet;
use zeroable::Zeroable;
use sverilogparse::*;
use arcstr::{ArcStr, Substr};
use ulib::{ UVec, Device, UniversalCopy };
#[derive(Zeroable, Debug, PartialEq, Eq, Clone, UniversalCopy)]
#[repr(u8)]
pub enum Direction {
I = 0,
O = 1,
Unknown = 2
}
mod csr;
pub use csr::VecCSR;
mod hier_name;
pub use hier_name::{ HierName, GeneralHierName, GeneralPinName, RefPinName };
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
enum LogicPinType {
TopPort,
Net,
LeafCellPin,
Others
}
impl LogicPinType {
#[inline]
pub fn is_pin(self) -> bool {
use LogicPinType::*;
if let TopPort | LeafCellPin = self { true } else { false }
}
#[inline]
pub fn is_net(self) -> bool {
use LogicPinType::*;
if let TopPort | Net = self { true } else { false }
}
}
#[readonly::make]
#[derive(Debug)]
pub struct NetlistDB {
pub name: Substr,
pub num_cells: usize,
pub num_logic_pins: usize,
pub num_pins: usize,
pub num_nets: usize,
pub cellname2id: HashMap<HierName, usize>,
logicpinname2id: HashMap<(HierName, Substr, Option<isize>), usize>,
pub pinname2id: HashMap<(HierName, Substr, Option<isize>), usize>,
pub netname2id: HashMap<(HierName, Substr, Option<isize>), usize>,
pub celltypes: Vec<Substr>,
pub cellnames: Vec<HierName>,
logicpintypes: Vec<LogicPinType>,
logicpinnames: Vec<(HierName, Substr, Option<isize>)>,
pinid2logicpinid: Vec<usize>,
pub pinnames: Vec<(HierName, Substr, Option<isize>)>,
pub pin2cell: UVec<usize>,
pub pin2net: UVec<usize>,
pub cell2pin: VecCSR,
pub net2pin: VecCSR,
pub pindirect: UVec<Direction>,
pub net_zero: Option<usize>,
pub net_one: Option<usize>
}
mod utils;
use utils::*;
mod disjoint_set;
use disjoint_set::*;
mod builder;
pub use builder::{DirectionProvider, NoDirection};