-------------------------------------------------------------------------------
--- $Id: OverlayTile.hs#1 2010/09/28 17:03:48 REDMOND\\satnams $
-------------------------------------------------------------------------------

module Lava.OverlayTile (overlayTile)
where
import Control.Monad.State
import Lava.Netlist

-------------------------------------------------------------------------------
-- | overlayTile takes a circuit instantiation block and overlays all the
--   the instantions.

overlayTile :: Out a -> Out a
overlayTile circuit 
  = do incrementLayoutNesting
       pushLayout BeginOverlayTile
       r <- circuit
       decrementLayoutNesting
       performOverlay
       return r

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

performOverlay :: Out ()
performOverlay
  = do l1 <- popLayout
       when (l1 /= BeginOverlayTile) $ -- There is at least one element in tile
         do l2 <- popLayout
            if l2 /= BeginOverlayTile then -- Two tiles to combine
              do let (aW, aH) = sizeOfLayout l1
                     (bW, bH) = sizeOfLayout l2 
                 pushLayout (Overlay (aW `max` bW, aH `max` bH) l1 l2)
                 performOverlay
             else -- Just one tile so put it back
                pushLayout l1

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