module Lava.Ports (module Lava.Ports)
where
import Control.Monad.State
import Data.List
import Lava.Netlist
import Lava.PortRange
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 :: String -> NetType -> Out [Bit]
inputBitVec name bvt@(BitVec a dir b)
= do state <- get
let p = ports state
oNet = netCount state
oNets = [oNet + i | (p,i) <- zip (portRange a dir b) [0..]]
put state{ports = Port name InputPort bvt oNets : p,
netCount = oNet + 1 + abs (ab)}
return oNets
inputArrayOfArray :: String -> NetType -> Out [[Bit]]
inputArrayOfArray name t@(ArrayType al dir1 ah (BitVec bl dir2 bh))
= error "inputArrayOfArray: array types must be named"
inputArrayOfArray name t@(NamedType typeName)
= do netlist <- get
let Just (ArrayType al dir1 ah (BitVec bl dir2 bh))
= lookup typeName (types netlist)
nets <- sequence [freshBitVec bl dir2 bh | i <- portRange al dir1 ah]
put netlist{ports = Port name InputPort t (concat nets) : ports netlist,
netCount = netCount netlist
+ (abs (ahal)+1) * (abs (bhbl)+1) }
return nets
inputLocalArrayOfArray :: String -> NetType -> Out [[Bit]]
inputLocalArrayOfArray name t@(ArrayType al dir1 ah (BitVec bl dir2 bh))
= error "inputArrayOfArray: array types must be named"
inputLocalArrayOfArray name t@(NamedType typeName)
= do netlist <- get
let Just (ArrayType al dir1 ah (BitVec bl dir2 bh))
= lookup typeName (types netlist)
nets <- sequence [freshBitVec bl dir2 bh | i <- portRange al dir1 ah]
put netlist{ports = Port name LocalInput t (concat nets) : ports netlist,
netCount = netCount netlist
+ (abs (ahal)+1) * (abs (bhbl)+1) }
return nets
freshBitVec :: Int -> Dir -> Int -> Out [Bit]
freshBitVec al dir ah
= sequence [getNewNet | i <- portRange al dir ah]
outputArrayOfArray :: String -> NetType -> [[Bit]] -> Out ()
outputArrayOfArray name t@(ArrayType al dir1 ah (BitVec bl dir2 bh)) nets
= error "outputArrayOfArray: array types must be named"
outputArrayOfArray name t@(NamedType typeName) nets
= do netlist <- get
let Just (ArrayType al dir1 ah (BitVec bl dir2 bh))
= lookup typeName (types netlist)
put netlist{ports = Port name OutputPort t (concat nets) :
ports netlist}
outputLocalArrayOfArray :: String -> NetType -> [[Bit]] -> Out ()
outputLocalArrayOfArray name t@(ArrayType al dir1 ah (BitVec bl dir2 bh)) nets
= error "outputArrayOfArray: array types must be named"
outputLocalArrayOfArray name t@(NamedType typeName) nets
= do netlist <- get
let Just (ArrayType al dir1 ah (BitVec bl dir2 bh))
= lookup typeName (types netlist)
put netlist{ports = Port name LocalOutput t (concat nets) :
ports netlist}
inputBitVecLocal :: String -> NetType -> Out [Bit]
inputBitVecLocal name bvt@(BitVec a dir b)
= do state <- get
let p = ports state
oNet = netCount state
oNets = [oNet + i | (p,i) <- zip (portRange a dir b) [0..]]
put (state{ports = Port name LocalInput bvt oNets : p,
netCount = oNet + 1 + abs (ab)})
return oNets
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 :: 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})
outputBitVecLocal :: String -> NetType -> [Bit] -> Out ()
outputBitVecLocal name bvt@(BitVec a dir b) o
= do state <- get
let p = ports state
put (state {ports = Port name LocalOutput bvt o : p})
declareType :: String -> NetType -> Out NetType
declareType typeName typeDef
= do netlist <- get
put netlist{types = (typeName, typeDef) : types netlist}
return (NamedType typeName)