module Lava.Instantiate (instantiate)
where
import Control.Monad.State
import Lava.ComputeNetlist
import Lava.Netlist
instantiate :: String -> Out () -> [(String, Bit)] -> [String] -> Out [Bit]
instantiate name circuit args outputs
= do netlist <- get
let sm = subCircuits netlist
nc = netCount netlist
ic = instCount netlist
cn <- findSubCircuit name (xilinxArchitecture netlist) circuit sm
let sz = if layout cn == [] then
Nothing
else
Just (sizeOfLayout (head (layout cn)))
Just (w, h) = sz
placement = if sz /= Nothing && layoutNesting netlist > 0 then
Placed
else
Unplaced
when (layoutNesting netlist > 0 && placement == Placed) $
pushLayout (Tile (w,h) ic)
addInstance (Instance (PrimitiveGate args (zip outputs [nc..]))
name ic placement sz)
incrementNetCount (length outputs)
incrementInstCount
return [nc .. nc+length outputs1]
findSubCircuit :: String -> XilinxArchitecture ->
Out () -> [Netlist] -> Out Netlist
findSubCircuit name arch circuit []
= do addSubCircuit circuitNL
return circuitNL
where
circuitNL = computeNetlist name arch circuit
findSubCircuit name arch circuit (c:cs)
= if name == circuitName c then
return c
else
findSubCircuit name arch circuit cs
addSubCircuit :: Netlist -> Out ()
addSubCircuit subcir
= do netlist <- get
put netlist{subCircuits = subcir : subCircuits netlist}