packages feed

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]