module Analysis.STA.Library where import Data.Function import Data.List import Data.Hardware.Internal import Lava import Wired.Model data Slope = Rising | Falling deriving (Eq, Show) type TransitionTime = Time data Timing = Timing { arrivalTime :: Time , transitionTime :: TransitionTime } class WiredLibrary lib => STALibrary lib where loadCaps :: lib -> [Capacitance] delay :: lib -> Pin -- Input -> Pin -- Output -> Slope -- For output -> Capacitance -- For output -> Timing -- For input -> Timing -- For output mulTiming :: Timing -> Time -> Timing mulTiming (Timing ar tr) x = Timing (ar*x) (tr*x) maxArrival :: Timing -> Timing -> Time maxArrival = max `on` arrivalTime maximumByArrival :: [Timing] -> Timing maximumByArrival = maximumBy (compare `on` arrivalTime) linearDelay :: Delay -- Intrinsic delay -> Double -- Rise time coefficient -> Resistance -- Load capacitance coefficient -> (Capacitance -> Timing -> Timing) linearDelay intrDel kTR res cap (Timing ar tr) = Timing (ar + intrDel + kTR> (Capacitance -> Timing -> Timing) worstLinearDelay params cap t = maximumByArrival [linearDelay intrDel kTR res cap t | (intrDel,kTR,res) <- params]