clash-prelude-1.8.4: Clash: a functional hardware description language - Prelude library

Copyright | (C) 2019 Myrtle Software Ltd
License | BSD2 (see the file LICENSE)
Maintainer | Christiaan Baaij <christiaan.baaij@gmail.com>
Safe Haskell | None
Language | Haskell2010

Clash.Class.HasDomain.HasSpecificDomain

Description

Internals for Clash.Class.HasDomain

Synopsis

- 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 link the given domain (by passing in a 'Clock', 'Reset', or") :$$$: "'Enable') to the component passed in.") :$$$: ""
- type NotFoundError (dom :: Domain) t = (((((((((((("Could not find domain '" :<<>>: 'ShowType dom) :<<>>: "' in the following type:") :$$$: "") :$$$: (" " :<<>>: t)) :$$$: "") :$$$: "If that type contains that domain anyway, you might need to provide an") :$$$: "additional type instance of HasDomain. Example implementations:") :$$$: "") :$$$: " * type instance HasDomain dom (MyVector n a) = HasDomain dom a") :$$$: " * type instance HasDomain dom1 (MyCircuit dom2 a) = DomEq dom1 dom2") :$$$: " * type instance HasDomain dom1 (MyTuple a b) = Merge dom a b") :$$$: "") :$$$: Outro
- type WithSpecificDomain (dom :: Domain) r = (HasSpecificDomain dom r, dom ~ GetDomain dom r)
- data HasDomainWrapperResult
  - = NotFound
  - | Found
- type family MergeWorker (n :: HasDomainWrapperResult) (m :: HasDomainWrapperResult) :: HasDomainWrapperResult where ...
- type Merge (dom :: Domain) n m = MergeWorker (HasDomainWrapper dom n) (HasDomainWrapper dom m)
- type family DomEqWorker (n :: Domain) (m :: Domain) :: HasDomainWrapperResult where ...
- type DomEq (n :: Domain) (m :: Domain) = IfStuck (DomEqWorker n m) 'NotFound (Pure (DomEqWorker n m))
- type family HasDomain (dom :: Domain) n :: HasDomainWrapperResult
- type family ErrOnNotFound (dom :: Domain) (n :: HasDomainWrapperResult) t :: Domain where ...
- type family HasDomainWrapper (dom :: Domain) n :: HasDomainWrapperResult where ...
- type family ResolveOrErr (dom :: Domain) t :: Domain where ...
- class HasSpecificDomain (dom :: Domain) r where
  - type GetDomain (dom :: Domain) r :: Domain

# Documentation

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 link the given domain (by passing in a 'Clock', 'Reset', or") :$$$: "'Enable') to the component passed in.") :$$$: "" Source #

type NotFoundError (dom :: Domain) t = (((((((((((("Could not find domain '" :<<>>: 'ShowType dom) :<<>>: "' in the following type:") :$$$: "") :$$$: (" " :<<>>: t)) :$$$: "") :$$$: "If that type contains that domain anyway, you might need to provide an") :$$$: "additional type instance of HasDomain. Example implementations:") :$$$: "") :$$$: " * type instance HasDomain dom (MyVector n a) = HasDomain dom a") :$$$: " * type instance HasDomain dom1 (MyCircuit dom2 a) = DomEq dom1 dom2") :$$$: " * type instance HasDomain dom1 (MyTuple a b) = Merge dom a b") :$$$: "") :$$$: Outro Source #

type WithSpecificDomain (dom :: Domain) r = (HasSpecificDomain dom r, dom ~ GetDomain dom r) Source #

Type that forces dom to be present in r at least once. Will resolve to a type error if it doesn't. It will always fail if given dom is completely polymorphic and can't be tied to r in any way.

data HasDomainWrapperResult Source #

Constructors

NotFound | No domain found
Found | Found the specific domain caller was looking for

type family MergeWorker (n :: HasDomainWrapperResult) (m :: HasDomainWrapperResult) :: HasDomainWrapperResult where ... Source #

Merge two `HasDomainWrapperResult`s according to the semantics of 'HasDomain.

Equations

MergeWorker 'Found b = 'Found |
MergeWorker a 'Found = 'Found |
MergeWorker 'NotFound 'NotFound = 'NotFound |

type Merge (dom :: Domain) n m = MergeWorker (HasDomainWrapper dom n) (HasDomainWrapper dom m) Source #

type family DomEqWorker (n :: Domain) (m :: Domain) :: HasDomainWrapperResult where ... Source #

Equations

DomEqWorker n n = 'Found |
DomEqWorker n m = 'NotFound |

type DomEq (n :: Domain) (m :: Domain) = IfStuck (DomEqWorker n m) 'NotFound (Pure (DomEqWorker n m)) Source #

Check domain for equality. Return `'Found` if so, return `'NotFound` if not. The reason d'etre for this type family is that _open_ type families don't allow overlapping types. We therefore defer equality checking to a closed type family.

type family HasDomain (dom :: Domain) n :: HasDomainWrapperResult Source #

Type family that searches a type and checks whether a specific domain is present. Will result in either "domain not found, and no others either", "domain not found, but found another", or "found domain".

#### Instances

Instances details

type HasDomain dom1 (Clock dom2) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (Clock dom2) = DomEq dom1 dom2
type HasDomain dom1 (Enable dom2) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (Enable dom2) = DomEq dom1 dom2
type HasDomain dom1 (Reset dom2) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (Reset dom2) = DomEq dom1 dom2
type HasDomain dom (Vec n a) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (Vec n a) = HasDomain dom a
type HasDomain dom (a, b) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a, b) = Merge dom a b
type HasDomain dom (a -> b) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a -> b) = Merge dom a b
type HasDomain dom1 (Signal dom2 a) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (Signal dom2 a) = DomEq dom1 dom2
type HasDomain dom1 (Proxy dom2) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (Proxy dom2) = DomEq dom1 dom2
type HasDomain dom (a0, a1, a2) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2) = Merge dom a0 (a1, a2)
type HasDomain dom1 (BiSignalOut ds dom2 n) Source # |
Instance details Defined in Clash.Signal.BiSignal type HasDomain dom1 (BiSignalOut ds dom2 n) = DomEq dom1 dom2
type HasDomain dom1 (DSignal dom2 delay a) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom1 (DSignal dom2 delay a) = DomEq dom1 dom2
type HasDomain dom (a0, a1, a2, a3) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3) = Merge dom a0 (a1, a2, a3)
type HasDomain dom (a0, a1, a2, a3, a4) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4) = Merge dom a0 (a1, a2, a3, a4)
type HasDomain dom (a0, a1, a2, a3, a4, a5) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5) = Merge dom a0 (a1, a2, a3, a4, a5)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6) = Merge dom a0 (a1, a2, a3, a4, a5, a6)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7) = Merge dom a0 (a1, a2, a3, a4, a5, a6, a7)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8) = Merge dom a0 (a1, a2, a3, a4, a5, a6, a7, a8)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) = Merge dom a0 (a1, a2, a3, a4, a5, a6, a7, a8, a9)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) = Merge dom a0 (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) Source # |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type HasDomain dom (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) = Merge dom a0 (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)

type family ErrOnNotFound (dom :: Domain) (n :: HasDomainWrapperResult) t :: Domain where ... Source #

Equations

ErrOnNotFound dom 'NotFound t = DelayError (NotFoundError dom t) :: Domain |
ErrOnNotFound dom 'Found t = dom |

type family HasDomainWrapper (dom :: Domain) n :: HasDomainWrapperResult where ... Source #

Wrapper that checks for stuckness and returns `'NotFound` if so

Equations

HasDomainWrapper dom n = IfStuck (HasDomain dom n) 'NotFound (Pure (HasDomain dom n)) |

type family ResolveOrErr (dom :: Domain) t :: Domain where ... Source #

Helper function for HasSpecificDomain class (I don't really understand why this one is necessary. HasDomainWrapper _should_ check for stuckness and does so according to tests..

Equations

ResolveOrErr dom t = IfStuck (HasDomainWrapper dom t) (ErrOnNotFound dom 'NotFound t) (Pure (ErrOnNotFound dom (HasDomainWrapper dom t) t)) |

class HasSpecificDomain (dom :: Domain) r Source #

Type class that specifies that a certain domain, dom, needs to be present in some other type, r. This is used to disambiguate what hidden clock, reset, and enable lines should be exposed in functions such as `withSpecificReset`.

Functions in need of this class should use `WithSpecificDomain` though, to force Clash to display an error instead of letting it silently pass.

Associated Types

type GetDomain (dom :: Domain) r :: Domain Source #

type GetDomain (dom :: Domain) r = ResolveOrErr dom r

#### Instances

Instances details

HasSpecificDomain dom a Source # |

Instance details

Defined in Clash.Class.HasDomain.HasSpecificDomain

Associated Types

type GetDomain dom a |
Instance details Defined in Clash.Class.HasDomain.HasSpecificDomain type GetDomain dom a = ResolveOrErr dom a