{-# OPTIONS_GHC -fno-warn-missing-fields #-} module Libs.Simple130nm.Lava where import Data.Hardware.Internal import Lava.Internal import Lava import qualified Lava2000 as L import qualified Lava2000.Arithmetic as L data Simple130nm = IVHSP | AN2HSP | OR2HSP | HA1HSP | FA1HSP deriving (Eq, Show) instance CellLibrary Simple130nm where numConsts _ = 2 numIns IVHSP = 1 numIns AN2HSP = 2 numIns OR2HSP = 2 numIns HA1HSP = 2 numIns FA1HSP = 2 numOuts IVHSP = 1 numOuts AN2HSP = 1 numOuts OR2HSP = 1 numOuts HA1HSP = 2 numOuts FA1HSP = 2 pinName IVHSP 0 = "Z" pinName IVHSP 1 = "A" pinName AN2HSP 0 = "Z" pinName AN2HSP 1 = "A" pinName AN2HSP 2 = "B" pinName OR2HSP 0 = "Z" pinName OR2HSP 1 = "A" pinName OR2HSP 2 = "B" pinName HA1HSP 0 = "S" pinName HA1HSP 1 = "CO" pinName HA1HSP 2 = "A" pinName HA1HSP 3 = "B" pinName FA1HSP 0 = "Z" pinName FA1HSP 1 = "CO" pinName FA1HSP 2 = "A" pinName FA1HSP 3 = "B" pinName FA1HSP 4 = "CI" pinId IVHSP "Z" = 0 pinId IVHSP "A" = 1 pinId AN2HSP "Z" = 0 pinId AN2HSP "A" = 1 pinId AN2HSP "B" = 2 pinId OR2HSP "Z" = 0 pinId OR2HSP "A" = 1 pinId OR2HSP "B" = 2 pinId HA1HSP "S" = 0 pinId HA1HSP "CO" = 1 pinId HA1HSP "A" = 2 pinId HA1HSP "B" = 3 pinId FA1HSP "Z" = 0 pinId FA1HSP "CO" = 1 pinId FA1HSP "A" = 2 pinId FA1HSP "B" = 3 pinId FA1HSP "CI" = 4 isFlop = const False lava2000Interp = Interp { constants = [L.low, L.high] , defaultVal = error "Undefined signal" , propagator = prop } where prop IVHSP = \[_,a] -> [Just (L.inv a), Nothing] prop AN2HSP = \[_,a,b] -> [Just (L.and2 (a,b)), Nothing, Nothing] prop OR2HSP = \[_,a,b] -> [Just (L.or2 (a,b)), Nothing, Nothing] prop HA1HSP = \[_,_,a,b] -> let (s,co) = L.halfAdd (a,b) in [Just s, Just co, Nothing, Nothing] prop FA1HSP = \[_,_,a,b,ci] -> let (s,co) = L.fullAdd (a,(b,ci)) in [Just s, Just co, Nothing, Nothing] low,high :: Signal [low,high] = libraryConstants (T::TypeOf Simple130nm) inv :: MonadLava Simple130nm m => Signal -> m Signal inv = cell IVHSP and2 :: MonadLava Simple130nm m => (Signal,Signal) -> m Signal and2 = cell AN2HSP or2 :: MonadLava Simple130nm m => (Signal,Signal) -> m Signal or2 = cell OR2HSP halfAdd :: MonadLava Simple130nm m => (Signal,Signal) -> m (Signal,Signal) halfAdd = cell HA1HSP fullAdd :: MonadLava Simple130nm m => (Signal, (Signal,Signal)) -> m (Signal,Signal) fullAdd = cell FA1HSP