Wired-0.1.1: Analysis/STA/Library.hs
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><tr + res><cap)
(1.2*tr) -- *** What should it be?
worstLinearDelay
:: [(Delay, Double, Resistance)] -> (Capacitance -> Timing -> Timing)
worstLinearDelay params cap t = maximumByArrival
[linearDelay intrDel kTR res cap t | (intrDel,kTR,res) <- params]