Wired-0.1: Libs/Simple130nm/Lava.hs
{-# 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