module Lava.Retime
( timeTransform
)
where
import Lava.Signal
import Lava.Generic
import Lava.Sequent
import Lava.Netlist
import Data.List
( isPrefixOf
)
timeTransform :: (Generic a, Generic b) => (a -> b) -> ([a] -> [b])
timeTransform circ [] = []
timeTransform circ inps@(inp:_) =
map construct
. transStruct
. netlist phi
. struct
. circ
. symbolize tag
$ inp
where
n = length inps
phi (DelayBool ini next) =
delay DelayBool ini next
phi (DelayInt ini next) =
delay DelayInt ini next
phi (VarBool s) | tag `isPrefixOf` s =
var (drop (length tag) s)
phi (VarInt s) | tag `isPrefixOf` s =
var (drop (length tag) s)
phi s =
take n (cycle (map symbol (zips s)))
delay del ~(ini0:_) next =
(symbol (del ini0 (last next)) : list (n1) (init next))
var s =
map (pickSymbol s) inps
list 0 _ = []
list n ~(x:xs) = x : list (n1) xs
tag = "#retime#"