module Lava2000.Combinational where
import Lava2000.Ref
import Lava2000.Generic
import Lava2000.Signal
import Lava2000.Netlist
import Lava2000.Sequent
import Lava2000.Error
import Lava2000.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 Lava2000.Error.CombinationalLoop)
define r s =
do s' <- mmap readSTRef s
writeSTRef r (eval s')