{-# LANGUAGE TypeFamilies #-} -- | This module provides some basic support for co-opting an identity entity block as a box -- containing some 'Dynamic' data. Any optimization pass -- will assume these blocks are identities, and perhaps remove them. module Language.KansasLava.Dynamic where import Language.KansasLava.Rep import Language.KansasLava.Signal import Language.KansasLava.Types import Data.Dynamic -- | We use identity "black boxes" as arbitary tags in the syntax, for extentablity. addDynamic :: (sig ~ Signal i, Rep a) => Dynamic -> sig a -> sig a addDynamic dyn = idS (BlackBox (Box dyn)) -- | Get any chain of (deep) black boxes on this signal. getDynamics :: (sig ~ Signal i, Rep a) => sig a -> [Dynamic] getDynamics sig = find (unD $ deepS sig) where find :: Driver E -> [Dynamic] find (Port _ (E (Entity (BlackBox (Box bb)) _ ins))) = bb : case ins of [(_,_,i)] -> find i _ -> error "getDynamics: no inputs" find _ = []