module Analysis.Timing.Library where import Data.Function import Data.List import Foreign.C import Data.Hardware.Internal import Lava import Wired.Model data Slope = Rising | Falling deriving (Eq, Show) data Timing = Timing { arrivalTime :: Time , transitionTime :: TransitionTime } deriving (Eq, Show) data LayerProps = LayerProps { layerWidth :: Width -- Default width , capPerArea :: Double -- Area capacitance [F/m²] , edgeCap :: Double -- Edge capacitance [F/m] } deriving (Eq, Show) -- XXX All wires are currently assumed to have default width. class CellLibrary lib => TimingLibrary lib where loadCaps :: lib -> [Capacitance] delay :: lib -> InPin -> OutPin -> Slope -- For output -> Capacitance -- For output -> Timing -- For input -> Timing -- For output class TimingLibrary lib => WireTimingLibrary lib where layerProps :: Layer_ -> Res lib LayerProps maximumByArrival :: [Timing] -> Timing maximumByArrival = maximumBy (compare `on` arrivalTime) linearDelay :: Delay -- Intrinsic delay -> Double -- Transition time coefficient for output arrival -> Double -- Transition time coefficient for output transition -> Resistance -- Load capacitance coefficient for output arrival -> Resistance -- Load capacitance coefficient for output transition -> Capacitance -> Timing -> Timing linearDelay intrDel kAr kTr resAr resTr cap (Timing ar tr) = Timing (ar + intrDel + timeCast (kAr>