{-# LANGUAGE DataKinds #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE Unsafe #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Clash.Explicit.Prelude
(
mealy
, mealyB
, moore
, mooreB
, registerB
, dualFlipFlopSynchronizer
, asyncFIFOSynchronizer
, asyncRom
, asyncRomPow2
, rom
, romPow2
, asyncRomFile
, asyncRomFilePow2
, romFile
, romFilePow2
, asyncRam
, asyncRamPow2
, blockRam
, blockRamPow2
, blockRamFile
, blockRamFilePow2
, readNew
, window
, windowD
, isRising
, isFalling
, assert
, stimuliGenerator
, outputVerifier
, module Clash.Explicit.Signal
, module Clash.Explicit.Signal.Delayed
, module Clash.Prelude.DataFlow
, module Clash.Sized.BitVector
, module Clash.Prelude.BitIndex
, module Clash.Prelude.BitReduction
, module Clash.Sized.Signed
, module Clash.Sized.Unsigned
, module Clash.Sized.Index
, module Clash.Sized.Fixed
, module Clash.Sized.Vector
, module Clash.Sized.RTree
, module Clash.Annotations.TopEntity
, module GHC.TypeLits
, module GHC.TypeLits.Extra
, module Clash.Promoted.Nat
, module Clash.Promoted.Nat.Literals
, module Clash.Promoted.Nat.TH
, module Clash.Promoted.Symbol
, Lift (..)
, module Clash.Class.BitPack
, module Clash.Class.Num
, module Clash.Class.Resize
, module Control.Applicative
, module Data.Bits
, module Data.Default
, module Clash.XException
, undefined
, module Clash.NamedTypes
, module Prelude
)
where
import Control.Applicative
import Data.Bits
import Data.Default
import GHC.TypeLits
import GHC.TypeLits.Extra
import Language.Haskell.TH.Syntax (Lift(..))
import Prelude hiding
((++), (!!), concat, drop, foldl, foldl1, foldr, foldr1, head, init, iterate,
last, length, map, repeat, replicate, reverse, scanl, scanr, splitAt, tail,
take, unzip, unzip3, zip, zip3, zipWith, zipWith3, undefined)
import Clash.Annotations.TopEntity
import Clash.Class.BitPack
import Clash.Class.Num
import Clash.Class.Resize
import Clash.NamedTypes
import Clash.Explicit.BlockRam
import Clash.Explicit.BlockRam.File
import Clash.Explicit.Mealy
import Clash.Explicit.Moore
import Clash.Explicit.RAM
import Clash.Explicit.ROM
import Clash.Explicit.ROM.File
import Clash.Explicit.Prelude.Safe
import Clash.Explicit.Signal
import Clash.Explicit.Signal.Delayed
import Clash.Explicit.Synchronizer
(dualFlipFlopSynchronizer, asyncFIFOSynchronizer)
import Clash.Explicit.Testbench
import Clash.Prelude.BitIndex
import Clash.Prelude.BitReduction
import Clash.Prelude.DataFlow
import Clash.Prelude.ROM (asyncRom, asyncRomPow2)
import Clash.Prelude.ROM.File (asyncRomFile, asyncRomFilePow2)
import Clash.Promoted.Nat
import Clash.Promoted.Nat.TH
import Clash.Promoted.Nat.Literals
import Clash.Promoted.Symbol
import Clash.Sized.BitVector
import Clash.Sized.Fixed
import Clash.Sized.Index
import Clash.Sized.RTree
import Clash.Sized.Signed
import Clash.Sized.Unsigned
import Clash.Sized.Vector
import Clash.XException
window
:: (KnownNat n, Default a)
=> Clock domain gated
-> Reset domain synchronous
-> Signal domain a
-> Vec (n + 1) (Signal domain a)
window clk rst x = res
where
res = x :> prev
prev = case natVal (asNatProxy prev) of
0 -> repeat def
_ -> let next = x +>> prev
in registerB clk rst (repeat def) next
{-# INLINABLE window #-}
windowD
:: (KnownNat n, Default a)
=> Clock domain gated
-> Reset domain synchronous
-> Signal domain a
-> Vec (n + 1) (Signal domain a)
windowD clk rst x =
let prev = registerB clk rst (repeat def) next
next = x +>> prev
in prev
{-# INLINABLE windowD #-}