clash-prelude-1.8.1: Clash: a functional hardware description language - Prelude library
Copyright(C) 2019 Myrtle Software Ltd
2022 QBayLogic B.V.
LicenseBSD2 (see the file LICENSE)
MaintainerQBayLogic B.V. <devops@qbaylogic.com>
Safe HaskellNone
LanguageHaskell2010

Clash.Class.HasDomain.HasSingleDomain

Description

Internals for Clash.Class.HasDomain

Synopsis

Documentation

type MissingInstance = (((((("This might happen if an instance for TryDomain is missing. Try to determine" :$$$: "which of the types miss an instance, and add them. Example implementations:") :$$$: "") :$$$: " * type instance TryDomain t (MyVector n a) = TryDomain t a") :$$$: " * type instance TryDomain t (MyCircuit dom a) = Found dom") :$$$: " * type instance TryDomain t Terminal = NotFound") :$$$: "") :$$$: "Alternatively, use one of the withSpecific* functions." Source #

type Outro = ((((((((((((((("" :$$$: "------") :$$$: "") :$$$: "You tried to apply an explicitly routed clock, reset, or enable line") :$$$: "to a construct with, possibly, an implicitly routed one. Clash failed to") :$$$: "unambigously determine a single domain and could therefore not route it.") :$$$: "You possibly used one of these sets of functions:") :$$$: "") :$$$: " * with{ClockResetEnable,Clock,Reset,Enable}") :$$$: " * expose{ClockResetEnable,Clock,Reset,Enable}") :$$$: "") :$$$: "These functions are suitable for components defined over a single domain") :$$$: "only. If you want to use multiple domains, use the following instead:") :$$$: "") :$$$: " * withSpecific{ClockResetEnable,Clock,Reset,Enable}") :$$$: " * exposeSpecific{ClockResetEnable,Clock,Reset,Enable}") :$$$: "" Source #

type NotFoundError (t :: Type) = (((("Could not find a non-ambiguous domain in the following type:" :$$$: "") :$$$: (" " :<<>>: t)) :$$$: "") :$$$: MissingInstance) :$$$: Outro Source #

type AmbiguousError (t :: Type) (dom1 :: Domain) (dom2 :: Domain) = ((((((("Could not determine that the domain '" :<<>>: dom1) :<<>>: "'") :$$$: (("was equal to the domain '" :<<>>: dom2) :<<>>: "' in the type:")) :$$$: "") :$$$: (" " :<<>>: t)) :$$$: "") :$$$: "This is usually resolved by adding explicit type signatures.") :$$$: Outro Source #

type StuckErrorMsg (orig :: Type) (n :: Type) = (((((((((((("Could not determine whether the following type contained a non-ambiguous domain:" :$$$: "") :$$$: (" " :<<>>: n)) :$$$: "") :$$$: "In the full type:") :$$$: "") :$$$: (" " :<<>>: orig)) :$$$: "") :$$$: "Does it contain one?") :$$$: "") :$$$: "------") :$$$: "") :$$$: MissingInstance) :$$$: Outro Source #

type WithSingleDomain dom r = (HasSingleDomain r, dom ~ GetDomain r) Source #

Type that forces dom to be the same in all subtypes of r that might contain a domain. If given a polymorphic domain not tied to r, GHC will be allowed to infer that that domain is equal to the one in r on the condition that r contains just a single domain.

type family Merge' (n :: TryDomainResult) (m :: TryDomainResult) :: TryDomainResult where ... Source #

Type family to resolve type conflicts (if any)

Equations

Merge' 'NotFound b = b 
Merge' ('Ambiguous dom1 dom2) b = 'Ambiguous dom1 dom2 
Merge' a 'NotFound = a 
Merge' a ('Ambiguous dom1 dom2) = 'Ambiguous dom1 dom2 
Merge' ('Found dom) ('Found dom) = 'Found dom 
Merge' ('Found dom1) ('Found dom2) = 'Ambiguous dom1 dom2 

type family Merge (orig :: Type) (n :: Type) (m :: Type) :: TryDomainResult where ... Source #

Same as Merge', but will insert a type error if Merge' got stuck.

Equations

Merge orig n m = IfStuck (TryDomain orig n) (DelayError (StuckErrorMsg orig n)) (Pure (IfStuck (TryDomain orig m) (DelayError (StuckErrorMsg orig m)) (Pure (Merge' (TryDomain orig n) (TryDomain orig m))))) 

type family ErrOnConflict (t :: Type) (n :: TryDomainResult) :: Domain where ... Source #

Equations

ErrOnConflict t 'NotFound = TypeError (NotFoundError t) 
ErrOnConflict t ('Ambiguous dom1 dom2) = TypeError (AmbiguousError t dom1 dom2) 
ErrOnConflict t ('Found dom) = dom 

type family TryDomain (orig :: Type) (n :: Type) :: TryDomainResult Source #

Instances

Instances details
type TryDomain t Double Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t Float Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t Int Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t Natural Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t Integer Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t Bool Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t () Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t () = 'NotFound
type TryDomain t Bit Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Maybe a) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Maybe a) = TryDomain t a
type TryDomain t (BitVector n) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Signed n) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Signed n) = 'NotFound
type TryDomain t (Unsigned n) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Index n) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Index n) = 'NotFound
type TryDomain t (Enable dom) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Enable dom) = 'Found dom
type TryDomain t (Reset dom) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Reset dom) = 'Found dom
type TryDomain t (Clock dom) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Clock dom) = 'Found dom
type TryDomain t (RTree d a) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (RTree d a) = TryDomain t a
type TryDomain t (Vec n a) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Vec n a) = TryDomain t a
type TryDomain t (Proxy dom) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Proxy dom) = 'Found dom
type TryDomain t (Signal dom a) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Signal dom a) = 'Found dom
type TryDomain t (Either a b) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Either a b) = Merge t a b
type TryDomain t (a, b) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (a, b) = Merge t a b
type TryDomain t (a -> b) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (a -> b) = Merge t a b
type TryDomain t (Fixed a n m) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (Fixed a n m) = TryDomain t (a (n + m))
type TryDomain t (DSignal dom delay a) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (DSignal dom delay a) = 'Found dom
type TryDomain t (a0, a1, a2) Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

type TryDomain t (a0, a1, a2) = Merge t a0 (a1, a2)
type TryDomain t (BiSignalOut ds dom n) Source # 
Instance details

Defined in Clash.Signal.BiSignal

type TryDomain t (BiSignalOut ds dom n) = 'Found dom

class HasSingleDomain (r :: Type) Source #

Type family that searches a type and checks whether all subtypes that can contain a domain (for example, Signal) contain the same domain. Its associated type, GetDomain, will yield a type error if that doesn't hold OR if it can't check it.

Associated Types

type GetDomain r :: Domain Source #

Instances

Instances details
HasSingleDomain a Source # 
Instance details

Defined in Clash.Class.HasDomain.HasSingleDomain

Associated Types

type GetDomain a :: Domain Source #