{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Clash.Xilinx.DDR
( iddr
, oddr
, iddr#
, oddr#
)
where
import Data.Bifunctor
import GHC.Stack (HasCallStack, withFrozenCallStack)
import Clash.Annotations.Primitive (hasBlackBox)
import Clash.Explicit.Prelude
import Clash.Explicit.DDR
iddr
:: forall a dom domDDR
. HasCallStack
=> KnownDomain dom
=> KnownDomain domDDR
=> DomainPeriod dom ~ (2 * DomainPeriod domDDR)
=> DomainActiveEdge dom ~ 'Rising
=> BitPack a
=> Clock dom
-> Reset dom
-> Enable dom
-> Signal domDDR a
-> Signal dom (a, a)
iddr clk rst en =
fmap (bimap unpack unpack) . withFrozenCallStack (iddr# clk rst en) .
fmap pack
iddr#
:: forall n dom domDDR
. HasCallStack
=> KnownDomain dom
=> KnownDomain domDDR
=> DomainPeriod dom ~ (2 * DomainPeriod domDDR)
=> DomainActiveEdge dom ~ 'Rising
=> KnownNat n
=> Clock dom
-> Reset dom
-> Enable dom
-> Signal domDDR (BitVector n)
-> Signal dom (BitVector n, BitVector n)
iddr# clk rst en = withFrozenCallStack ddrIn# clk rst en 0 0 0
{-# CLASH_OPAQUE iddr# #-}
{-# ANN iddr# hasBlackBox #-}
oddr
:: forall a dom domDDR
. HasCallStack
=> KnownDomain dom
=> KnownDomain domDDR
=> DomainPeriod dom ~ (2 * DomainPeriod domDDR)
=> DomainActiveEdge dom ~ 'Rising
=> BitPack a
=> Clock dom
-> Reset dom
-> Enable dom
-> Signal dom (a, a)
-> Signal domDDR a
oddr clk rst en =
fmap unpack . uncurry (withFrozenCallStack oddr# clk rst en) . unbundle .
fmap (bimap pack pack)
oddr#
:: forall n dom domDDR
. HasCallStack
=> KnownDomain dom
=> KnownDomain domDDR
=> DomainPeriod dom ~ (2 * DomainPeriod domDDR)
=> DomainActiveEdge dom ~ 'Rising
=> KnownNat n
=> Clock dom
-> Reset dom
-> Enable dom
-> Signal dom (BitVector n)
-> Signal dom (BitVector n)
-> Signal domDDR (BitVector n)
oddr# clk rst en = ddrOut# clk rst en 0
{-# CLASH_OPAQUE oddr# #-}
{-# ANN oddr# hasBlackBox #-}