packages feed

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