-------------------------------------------------------------------------------
--- $Id: Ports.hs#2 2010/09/21 13:51:11 REDMOND\\satnams $
-------------------------------------------------------------------------------

module Lava.Ports (module Lava.Ports)
where
import Control.Monad.State
import Lava.Netlist
import Lava.PortRange

-- * Circuit input/output ports

-------------------------------------------------------------------------------
-- | 'inputPort' creates a single bit input port

inputPort :: String -> NetType -> Out Bit
inputPort name BitType
  = do state <- get
       let p = ports state
           oNet = netCount state
       put (state{ports = Port name InputPort BitType [oNet] : p, 
            netCount = oNet+1})
       return oNet

-------------------------------------------------------------------------------
-- | 'inputBitVec' creates a bit-vector input port

inputBitVec :: String -> NetType -> Out [Bit]
inputBitVec name bvt@(BitVec a dir b)
  = do state <- get
       let p = ports state
           oNet = netCount state
           oNets = [oNet + p | p <- portRange a dir b]
       put (state{ports = Port name InputPort bvt oNets : p, 
            netCount = oNet + 1 + abs (a-b)})
       return oNets

-------------------------------------------------------------------------------

-- | 'outputPort' creates a single bit output port

outputPort :: String -> NetType -> Bit -> Out ()
outputPort name BitType o
  = do state <- get
       let p = ports state
       put (state {ports = Port name OutputPort BitType [o] : p})

-------------------------------------------------------------------------------
-- | 'outputBitVec' creates a bit-vector output port

outputBitVec :: String -> NetType -> [Bit] -> Out ()
outputBitVec name bvt@(BitVec a dir b) o
  = do state <- get
       let p = ports state
       put (state {ports = Port name OutputPort bvt o : p})

-------------------------------------------------------------------------------