{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# 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)
clockPeriod
:: forall dom period
. (KnownDomain dom, DomainPeriod dom ~ period)
=> SNat period
clockPeriod =
case knownDomain @dom of
SDomainConfiguration{sPeriod} ->
sPeriod
{-# OPAQUE clockPeriod #-}
activeEdge
:: forall dom edge
. (KnownDomain dom, DomainActiveEdge dom ~ edge)
=> SActiveEdge edge
activeEdge =
case knownDomain @dom of
SDomainConfiguration{sActiveEdge} ->
sActiveEdge
{-# OPAQUE activeEdge #-}
resetKind
:: forall dom sync
. (KnownDomain dom, DomainResetKind dom ~ sync)
=> SResetKind sync
resetKind =
case knownDomain @dom of
SDomainConfiguration{sResetKind} ->
sResetKind
{-# OPAQUE resetKind #-}
initBehavior
:: forall dom init
. (KnownDomain dom, DomainInitBehavior dom ~ init)
=> SInitBehavior init
initBehavior =
case knownDomain @dom of
SDomainConfiguration{sInitBehavior} ->
sInitBehavior
{-# OPAQUE initBehavior #-}
resetPolarity
:: forall dom polarity
. (KnownDomain dom, DomainResetPolarity dom ~ polarity)
=> SResetPolarity polarity
resetPolarity =
case knownDomain @dom of
SDomainConfiguration{sResetPolarity} ->
sResetPolarity
{-# OPAQUE resetPolarity #-}
knownVDomain
:: forall dom
. KnownDomain dom
=> VDomainConfiguration
knownVDomain =
vDomain (knownDomain @dom)