module Lava2000.Table
( table
, tableProp
)
where
import Lava2000.Signal
import Lava2000.Netlist
import Lava2000.Generic
import Lava2000.Sequent
import Lava2000.Property
import Lava2000.MyST
tableProp :: Checkable a => a -> IO ([(Int,S Int)], [Int])
tableProp a =
do (props,_) <- properties a
let (tab, ps) = table (struct props)
return (tab, flatten ps)
table :: Sequent f => f Symbol -> ([(Int,S Int)], f Int)
table str =
runST
( do ref <- newSTRef 0
table <- newSTRef []
let new =
do n <- readSTRef ref
let n' = n+1
writeSTRef ref n'
return n'
define v def =
do tab <- readSTRef table
writeSTRef table ((v,def):tab)
str' <- netlistST new define str
tab <- readSTRef table
return (tab, str')
)