module Lava.Combinational where
import Lava.Ref
import Lava.Generic
import Lava.Signal
import Lava.Netlist
import Lava.Sequent
import Lava.Error
import Lava.MyST
( ST
, STRef
, newSTRef
, readSTRef
, writeSTRef
, runST
)
simulate :: Generic b => (a -> b) -> a -> b
simulate circ inp = runST (
do sr <- netlistST new define (struct (circ inp))
sa <- mmap (fmap symbol . readSTRef) sr
let res = construct sa
return res
)
where
new =
newSTRef (wrong Lava.Error.CombinationalLoop)
define r s =
do s' <- mmap readSTRef s
writeSTRef r (eval s')