clash-prelude-1.2.0: src/Clash/Signal/Internal/Ambiguous.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
module Clash.Signal.Internal.Ambiguous
( knownVDomain
, clockPeriod
, activeEdge
, resetKind
, initBehavior
, resetPolarity
) where
import Clash.Signal.Internal
import Clash.Promoted.Nat (SNat)
-- | Get the clock period from a KnownDomain context
clockPeriod
:: forall dom period
. (KnownDomain dom, DomainPeriod dom ~ period)
=> SNat period
clockPeriod =
case knownDomain @dom of
SDomainConfiguration _dom period _edge _sync _init _polarity ->
period
{-# NOINLINE clockPeriod #-}
-- @NOINLINE: https://github.com/clash-lang/clash-compiler/issues/662
-- | Get 'ActiveEdge' from a KnownDomain context. Example usage:
--
-- @
-- f :: forall dom . KnownDomain dom => ....
-- f a b c =
-- case activeEdge @dom of
-- SRising -> foo
-- SFalling -> bar
-- @
activeEdge
:: forall dom edge
. (KnownDomain dom, DomainActiveEdge dom ~ edge)
=> SActiveEdge edge
activeEdge =
case knownDomain @dom of
SDomainConfiguration _dom _period edge _sync _init _polarity ->
edge
{-# NOINLINE activeEdge #-}
-- @NOINLINE: https://github.com/clash-lang/clash-compiler/issues/662
-- | Get 'ResetKind' from a KnownDomain context. Example usage:
--
-- @
-- f :: forall dom . KnownDomain dom => ....
-- f a b c =
-- case resetKind @dom of
-- SAsynchronous -> foo
-- SSynchronous -> bar
-- @
resetKind
:: forall dom sync
. (KnownDomain dom, DomainResetKind dom ~ sync)
=> SResetKind sync
resetKind =
case knownDomain @dom of
SDomainConfiguration _dom _period _edge sync _init _polarity ->
sync
{-# NOINLINE resetKind #-}
-- @NOINLINE: https://github.com/clash-lang/clash-compiler/issues/662
-- | Get 'InitBehavior' from a KnownDomain context. Example usage:
--
-- @
-- f :: forall dom . KnownDomain dom => ....
-- f a b c =
-- case initBehavior @dom of
-- SDefined -> foo
-- SUnknown -> bar
-- @
initBehavior
:: forall dom init
. (KnownDomain dom, DomainInitBehavior dom ~ init)
=> SInitBehavior init
initBehavior =
case knownDomain @dom of
SDomainConfiguration _dom _period _edge _sync init_ _polarity ->
init_
{-# NOINLINE initBehavior #-}
-- @NOINLINE: https://github.com/clash-lang/clash-compiler/issues/662
-- | Get 'ResetPolarity' from a KnownDomain context. Example usage:
--
-- @
-- f :: forall dom . KnownDomain dom => ....
-- f a b c =
-- case resetPolarity @dom of
-- SActiveHigh -> foo
-- SActiveLow -> bar
-- @
resetPolarity
:: forall dom polarity
. (KnownDomain dom, DomainResetPolarity dom ~ polarity)
=> SResetPolarity polarity
resetPolarity =
case knownDomain @dom of
SDomainConfiguration _dom _period _edge _sync _init polarity ->
polarity
{-# NOINLINE resetPolarity #-}
-- @NOINLINE: https://github.com/clash-lang/clash-compiler/issues/662
-- | Like 'knownDomain but yields a 'VDomainConfiguration'. Should only be used
-- in combination with 'createDomain'.
knownVDomain
:: forall dom
. KnownDomain dom
=> VDomainConfiguration
knownVDomain =
vDomain (knownDomain @dom)