| Safe Haskell | None |
|---|---|
| Language | GHC2021 |
Protocols.DfConv
Description
Synopsis
- class Protocol df => DfConv df
- type family Dom df :: Domain
- type family BwdPayload df
- type family FwdPayload df
- toDfCircuit :: DfConv df => Proxy df -> Circuit (Df (Dom df) (FwdPayload df), Reverse (Df (Dom df) (BwdPayload df))) df
- fromDfCircuit :: DfConv df => Proxy df -> Circuit df (Df (Dom df) (FwdPayload df), Reverse (Df (Dom df) (BwdPayload df)))
- toDfCircuitHelper :: forall (dom :: Domain) df inpMsg otpMsg state fwdPayload bwdPayload. (HiddenClockResetEnable dom, Protocol df, Bwd df ~ Unbundled dom inpMsg, Fwd df ~ Unbundled dom otpMsg, NFDataX state, Bundle inpMsg, Bundle otpMsg) => Proxy df -> state -> otpMsg -> (inpMsg -> Bool -> Maybe fwdPayload -> State state (otpMsg, Maybe bwdPayload, Bool)) -> Circuit (Df dom fwdPayload, Reverse (Df dom bwdPayload)) df
- fromDfCircuitHelper :: forall (dom :: Domain) df inpMsg otpMsg state bwdPayload fwdPayload. (HiddenClockResetEnable dom, Protocol df, Fwd df ~ Unbundled dom inpMsg, Bwd df ~ Unbundled dom otpMsg, NFDataX state, Bundle inpMsg, Bundle otpMsg) => Proxy df -> state -> otpMsg -> (inpMsg -> Bool -> Maybe bwdPayload -> State state (otpMsg, Maybe fwdPayload, Bool)) -> Circuit df (Df dom fwdPayload, Reverse (Df dom bwdPayload))
- dfToDfConvInp :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit df (Df (Dom df) (FwdPayload df))
- dfToDfConvOtp :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit (Df (Dom df) (FwdPayload df)) df
- vecToDfConv :: forall df (n :: Nat). (DfConv df, HiddenClockResetEnable (Dom df), KnownNat n) => Proxy df -> Circuit (Vec n (Df (Dom df) (FwdPayload df)), Vec n (Reverse (Df (Dom df) (BwdPayload df)))) (Vec n df)
- vecFromDfConv :: forall df (n :: Nat). (DfConv df, HiddenClockResetEnable (Dom df), KnownNat n) => Proxy df -> Circuit (Vec n df) (Vec n (Df (Dom df) (FwdPayload df)), Vec n (Reverse (Df (Dom df) (BwdPayload df))))
- tupToDfConv :: (DfConv dfA, DfConv dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Circuit ((Df (Dom dfA) (FwdPayload dfA), Df (Dom dfB) (FwdPayload dfB)), (Reverse (Df (Dom dfA) (BwdPayload dfA)), Reverse (Df (Dom dfB) (BwdPayload dfB)))) (dfA, dfB)
- tupFromDfConv :: (DfConv dfA, DfConv dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Circuit (dfA, dfB) ((Df (Dom dfA) (FwdPayload dfA), Df (Dom dfB) (FwdPayload dfB)), (Reverse (Df (Dom dfA) (BwdPayload dfA)), Reverse (Df (Dom dfB) (BwdPayload dfB))))
- convert :: (DfConv dfA, DfConv dfB, FwdPayload dfA ~ FwdPayload dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- const :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> FwdPayload dfB -> Circuit dfA dfB
- void :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit df ()
- pure :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> FwdPayload df -> Circuit () df
- map :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> FwdPayload dfB) -> Circuit dfA dfB
- mapS :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> Signal (Dom dfA) (FwdPayload dfA -> FwdPayload dfB) -> Circuit dfA dfB
- bimap :: forall dfA dfB (p :: Type -> Type -> Type) a c b d. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a c, FwdPayload dfB ~ p b d) => Proxy dfA -> Proxy dfB -> (a -> b) -> (c -> d) -> Circuit dfA dfB
- fst :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (a, b), FwdPayload dfB ~ a) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- snd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (a, b), FwdPayload dfB ~ b) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- mapMaybe :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), NFDataX (FwdPayload dfB)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> Maybe (FwdPayload dfB)) -> Circuit dfA dfB
- catMaybes :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Maybe (FwdPayload dfB)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- filter :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> Bool) -> Circuit dfA dfB
- filterS :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB) => Proxy dfA -> Proxy dfB -> Signal (Dom dfA) (FwdPayload dfA -> Bool) -> Circuit dfA dfB
- either :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a b) => Proxy dfA -> Proxy dfB -> (a -> FwdPayload dfB) -> (b -> FwdPayload dfB) -> Circuit dfA dfB
- first :: forall dfA dfB (p :: Type -> Type -> Type) a c b. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a c, FwdPayload dfB ~ p b c) => Proxy dfA -> Proxy dfB -> (a -> b) -> Circuit dfA dfB
- mapLeft :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a c, FwdPayload dfB ~ Either b c) => Proxy dfA -> Proxy dfB -> (a -> b) -> Circuit dfA dfB
- second :: forall dfA dfB (p :: Type -> Type -> Type) a b c. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a b, FwdPayload dfB ~ p a c) => Proxy dfA -> Proxy dfB -> (b -> c) -> Circuit dfA dfB
- mapRight :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a b, FwdPayload dfB ~ Either a c) => Proxy dfA -> Proxy dfB -> (b -> c) -> Circuit dfA dfB
- zipWith :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> (FwdPayload dfA -> FwdPayload dfB -> FwdPayload dfC) -> Circuit (dfA, dfB) dfC
- zip :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfC ~ (FwdPayload dfA, FwdPayload dfB)) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (dfA, dfB) dfC
- partition :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfB, BwdPayload dfA ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, FwdPayload dfA ~ FwdPayload dfC) => Proxy dfA -> (Proxy dfB, Proxy dfC) -> (FwdPayload dfA -> Bool) -> Circuit dfA (dfB, dfC)
- route :: forall dfA dfB (n :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (Index n, FwdPayload dfB), KnownNat n, 1 <= n) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB)
- select :: forall dfA dfB dfC (n :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ Index n, KnownNat n) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (Vec n dfA, dfB) dfC
- selectN :: forall dfA dfB dfC (n :: Nat) (selectN :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ (Index n, Index selectN), KnownNat n, KnownNat selectN) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (Vec n dfA, dfB) dfC
- selectUntil :: forall dfA dfB dfC (n :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ Index n, KnownNat n) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> (FwdPayload dfA -> Bool) -> Circuit (Vec n dfA, dfB) dfC
- fanin :: forall dfA dfB (numA :: Nat) (decNumA :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), KnownNat numA, numA ~ (decNumA + 1)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> FwdPayload dfA -> FwdPayload dfA) -> Circuit (Vec numA dfA) dfB
- mfanin :: forall dfA dfB (numA :: Nat) (decNumA :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), Monoid (FwdPayload dfA), KnownNat numA, numA ~ (decNumA + 1)) => Proxy dfA -> Proxy dfB -> Circuit (Vec numA dfA) dfB
- fanout :: forall dfA dfB (numB :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), KnownNat numB, 1 <= numB) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec numB dfB)
- bundleVec :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Vec n (FwdPayload dfA) ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> Circuit (Vec n dfA) dfB
- unbundleVec :: forall dfA dfB (n :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Vec n (FwdPayload dfB), NFDataX (FwdPayload dfB), KnownNat n, 1 <= n) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB)
- roundrobin :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB)
- data CollectMode
- roundrobinCollect :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> CollectMode -> Circuit (Vec n dfA) dfB
- registerFwd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- registerBwd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB
- fifo :: forall dfA dfB (depth :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), KnownNat depth, 1 <= depth, FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> SNat depth -> Circuit dfA dfB
Typeclass and its associated types/fns
class Protocol df => DfConv df Source #
Class for protocols that are "similar" to Df, i.e. they can be converted
to and from a pair of Df ports (one going Fwd, one going Bwd), using
a Circuit (see toDfCircuit and fromDfCircuit). This is for protocols
that carry some "interesting" data, as well as some "uninteresting" data
(e.g. address, burst length). The Circuit should abstract away the
complexities of each protocol, so that they can be dealt with uniformly
using Df. For pipelined protocols, which can carry both in the same cycle,
the Circuit should pass along the interesting parts but not the
uninteresting parts.
Minimal complete definition
Instances
type family Dom df :: Domain Source #
Domain that messages are being sent over. In general, it should be true that
Fwd df ~ Signal dom [something] and that Bwd df ~ Signal dom [something].
Instances
| type Dom (Df dom dat) Source # | |
Defined in Protocols.DfConv | |
| type Dom (AvalonMmManager dom config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap | |
| type Dom (Reverse a) Source # | |
Defined in Protocols.DfConv | |
| type Dom (Df dom a, Reverse (Df dom b)) Source # | |
Defined in Protocols.DfConv | |
| type Dom (Axi4ReadAddress dom confAR dataAR, Reverse (Axi4ReadData dom confR userR dat)) Source # | |
Defined in Protocols.Experimental.DfConv | |
| type Dom (AvalonMmSubordinate dom 0 config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap | |
| type Dom (AvalonStream dom conf dataType) Source # | |
Defined in Protocols.Experimental.Avalon.Stream | |
| type Dom (Axi4Stream dom conf userType) Source # | |
Defined in Protocols.Experimental.Axi4.Stream | |
| type Dom (PacketStream dom dataWidth meta) Source # | |
Defined in Protocols.PacketStream.Base | |
| type Dom (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) Source # | |
Defined in Protocols.Experimental.DfConv type Dom (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) = dom | |
type family BwdPayload df Source #
Information being sent in the Bwd direction, along
Reverse (Df (Dom df) (BwdPayload df)). This is the information being
carried over the protocol, not the messages being carried over the
protocol, so it doesn't include auxiliary information like address or
burst length. If no data is sent in this direction, set this to ().
Instances
| type BwdPayload (Df dom dat) Source # | |
Defined in Protocols.DfConv | |
| type BwdPayload (AvalonMmManager dom config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap | |
| type BwdPayload (Reverse a) Source # | |
Defined in Protocols.DfConv | |
| type BwdPayload (Df dom a, Reverse (Df dom b)) Source # | |
Defined in Protocols.DfConv | |
| type BwdPayload (Axi4ReadAddress dom confAR dataAR, Reverse (Axi4ReadData dom confR userR dat)) Source # | |
Defined in Protocols.Experimental.DfConv type BwdPayload (Axi4ReadAddress dom confAR dataAR, Reverse (Axi4ReadData dom confR userR dat)) = (dat, userR, ResponseType (RKeepResponse confR)) | |
| type BwdPayload (AvalonMmSubordinate dom 0 config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap | |
| type BwdPayload (AvalonStream dom conf dataType) Source # | |
Defined in Protocols.Experimental.Avalon.Stream | |
| type BwdPayload (Axi4Stream dom conf userType) Source # | |
Defined in Protocols.Experimental.Axi4.Stream | |
| type BwdPayload (PacketStream dom dataWidth meta) Source # | |
Defined in Protocols.PacketStream.Base | |
| type BwdPayload (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) Source # | |
Defined in Protocols.Experimental.DfConv type BwdPayload (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) = (ResponseType (BKeepResponse confB), userB) | |
type family FwdPayload df Source #
Information being sent in the Fwd direction, along
Df (Dom df) (FwdPayload df). This is the information being
carried over the protocol, not the messages being carried over the
protocol, so it doesn't include auxiliary information like address or
burst length. If no data is sent in this direction, set this to ().
Instances
| type FwdPayload (Df dom dat) Source # | |
Defined in Protocols.DfConv | |
| type FwdPayload (AvalonMmManager dom config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap type FwdPayload (AvalonMmManager dom config) = Either (AvalonReadReqImpt 'True (MShared config)) (AvalonWriteImpt 'True (MShared config)) | |
| type FwdPayload (Reverse a) Source # | |
Defined in Protocols.DfConv | |
| type FwdPayload (Df dom a, Reverse (Df dom b)) Source # | |
Defined in Protocols.DfConv | |
| type FwdPayload (Axi4ReadAddress dom confAR dataAR, Reverse (Axi4ReadData dom confR userR dat)) Source # | |
Defined in Protocols.Experimental.DfConv type FwdPayload (Axi4ReadAddress dom confAR dataAR, Reverse (Axi4ReadData dom confR userR dat)) = Axi4ReadAddressInfo confAR dataAR | |
| type FwdPayload (AvalonMmSubordinate dom 0 config) Source # | |
Defined in Protocols.Experimental.Avalon.MemMap type FwdPayload (AvalonMmSubordinate dom 0 config) = Either (AvalonReadReqImpt (KeepAddr config) (SShared config)) (AvalonWriteImpt (KeepAddr config) (SShared config)) | |
| type FwdPayload (AvalonStream dom conf dataType) Source # | |
Defined in Protocols.Experimental.Avalon.Stream | |
| type FwdPayload (Axi4Stream dom conf userType) Source # | |
Defined in Protocols.Experimental.Axi4.Stream | |
| type FwdPayload (PacketStream dom dataWidth meta) Source # | |
Defined in Protocols.PacketStream.Base | |
| type FwdPayload (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) Source # | |
Defined in Protocols.Experimental.DfConv type FwdPayload (Axi4WriteAddress dom confAW userAW, Axi4WriteData dom confW userW, Reverse (Axi4WriteResponse dom confB userB)) = (Axi4WriteAddressInfo confAW userAW, BurstLengthType (AWKeepBurstLength confAW), BurstType (AWKeepBurst confAW), StrictStrobeType (WNBytes confW) (WKeepStrobe confW), userW) | |
toDfCircuit :: DfConv df => Proxy df -> Circuit (Df (Dom df) (FwdPayload df), Reverse (Df (Dom df) (BwdPayload df))) df Source #
Circuit which converts Df into this protocol's messages. This should
deal with all the complexities of your protocol such as addresses, bursts,
pipelining, etc. so that a circuit connected to the Df end doesn't have
to worry about all that. There are two Df channels, one for fwd data and
one for bwd data, so data can be sent both ways at once. This circuit is
expected to follow all of the conventions of Df; for example, data on the
fwd channel should stay the same between clock cycles unless acknowledged.
fromDfCircuit :: DfConv df => Proxy df -> Circuit df (Df (Dom df) (FwdPayload df), Reverse (Df (Dom df) (BwdPayload df))) Source #
toDfCircuit, but in reverse: the df port is on the left side instead
of the right side.
Helper functions
toDfCircuitHelper :: forall (dom :: Domain) df inpMsg otpMsg state fwdPayload bwdPayload. (HiddenClockResetEnable dom, Protocol df, Bwd df ~ Unbundled dom inpMsg, Fwd df ~ Unbundled dom otpMsg, NFDataX state, Bundle inpMsg, Bundle otpMsg) => Proxy df -> state -> otpMsg -> (inpMsg -> Bool -> Maybe fwdPayload -> State state (otpMsg, Maybe bwdPayload, Bool)) -> Circuit (Df dom fwdPayload, Reverse (Df dom bwdPayload)) df Source #
fromDfCircuitHelper :: forall (dom :: Domain) df inpMsg otpMsg state bwdPayload fwdPayload. (HiddenClockResetEnable dom, Protocol df, Fwd df ~ Unbundled dom inpMsg, Bwd df ~ Unbundled dom otpMsg, NFDataX state, Bundle inpMsg, Bundle otpMsg) => Proxy df -> state -> otpMsg -> (inpMsg -> Bool -> Maybe bwdPayload -> State state (otpMsg, Maybe fwdPayload, Bool)) -> Circuit df (Df dom fwdPayload, Reverse (Df dom bwdPayload)) Source #
Helper function to make it easier to implement fromDfCircuit in DfConv.
tAcks are automatically converted to and from Bools.
A default otpMsg value is
given for if reset is currently on. The State machine is run every clock cycle.
Parameters: initial state, default otpMsg, and State machine function
dfToDfConvInp :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit df (Df (Dom df) (FwdPayload df)) Source #
dfToDfConvOtp :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit (Df (Dom df) (FwdPayload df)) df Source #
vecToDfConv :: forall df (n :: Nat). (DfConv df, HiddenClockResetEnable (Dom df), KnownNat n) => Proxy df -> Circuit (Vec n (Df (Dom df) (FwdPayload df)), Vec n (Reverse (Df (Dom df) (BwdPayload df)))) (Vec n df) Source #
toDfCircuit, but the DfConv is inside a Vec
vecFromDfConv :: forall df (n :: Nat). (DfConv df, HiddenClockResetEnable (Dom df), KnownNat n) => Proxy df -> Circuit (Vec n df) (Vec n (Df (Dom df) (FwdPayload df)), Vec n (Reverse (Df (Dom df) (BwdPayload df)))) Source #
fromDfCircuit, but the DfConv is inside a Vec
tupToDfConv :: (DfConv dfA, DfConv dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Circuit ((Df (Dom dfA) (FwdPayload dfA), Df (Dom dfB) (FwdPayload dfB)), (Reverse (Df (Dom dfA) (BwdPayload dfA)), Reverse (Df (Dom dfB) (BwdPayload dfB)))) (dfA, dfB) Source #
toDfCircuit, but on a pair of DfConvs
tupFromDfConv :: (DfConv dfA, DfConv dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Circuit (dfA, dfB) ((Df (Dom dfA) (FwdPayload dfA), Df (Dom dfB) (FwdPayload dfB)), (Reverse (Df (Dom dfA) (BwdPayload dfA)), Reverse (Df (Dom dfB) (BwdPayload dfB)))) Source #
fromDfCircuit, but on a pair of DfConvs
Df functions generalized to Dflike
convert :: (DfConv dfA, DfConv dfB, FwdPayload dfA ~ FwdPayload dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Preserves Df data unmodified. Potentially useful for converting between
protocols.
const :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> FwdPayload dfB -> Circuit dfA dfB Source #
Acknowledge but ignore data from LHS protocol. Send a static value b.
void :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> Circuit df () Source #
Ignore incoming data
pure :: (DfConv df, HiddenClockResetEnable (Dom df)) => Proxy df -> FwdPayload df -> Circuit () df Source #
Drive a constant value composed of a.
map :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> FwdPayload dfB) -> Circuit dfA dfB Source #
Like map
mapS :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA)) => Proxy dfA -> Proxy dfB -> Signal (Dom dfA) (FwdPayload dfA -> FwdPayload dfB) -> Circuit dfA dfB Source #
Like mapS
bimap :: forall dfA dfB (p :: Type -> Type -> Type) a c b d. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a c, FwdPayload dfB ~ p b d) => Proxy dfA -> Proxy dfB -> (a -> b) -> (c -> d) -> Circuit dfA dfB Source #
Like bimap
fst :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (a, b), FwdPayload dfB ~ a) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Like fst
snd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (a, b), FwdPayload dfB ~ b) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Like fst
mapMaybe :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), NFDataX (FwdPayload dfB)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> Maybe (FwdPayload dfB)) -> Circuit dfA dfB Source #
Like mapMaybe
catMaybes :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Maybe (FwdPayload dfB)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Like catMaybes
filter :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> Bool) -> Circuit dfA dfB Source #
Like filter
filterS :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB) => Proxy dfA -> Proxy dfB -> Signal (Dom dfA) (FwdPayload dfA -> Bool) -> Circuit dfA dfB Source #
Like filterS
either :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a b) => Proxy dfA -> Proxy dfB -> (a -> FwdPayload dfB) -> (b -> FwdPayload dfB) -> Circuit dfA dfB Source #
Like either
first :: forall dfA dfB (p :: Type -> Type -> Type) a c b. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a c, FwdPayload dfB ~ p b c) => Proxy dfA -> Proxy dfB -> (a -> b) -> Circuit dfA dfB Source #
Like first
mapLeft :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a c, FwdPayload dfB ~ Either b c) => Proxy dfA -> Proxy dfB -> (a -> b) -> Circuit dfA dfB Source #
Like mapLeft
second :: forall dfA dfB (p :: Type -> Type -> Type) a b c. (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Bifunctor p, FwdPayload dfA ~ p a b, FwdPayload dfB ~ p a c) => Proxy dfA -> Proxy dfB -> (b -> c) -> Circuit dfA dfB Source #
Like second
mapRight :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Either a b, FwdPayload dfB ~ Either a c) => Proxy dfA -> Proxy dfB -> (b -> c) -> Circuit dfA dfB Source #
Like mapRight
zipWith :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA)) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> (FwdPayload dfA -> FwdPayload dfB -> FwdPayload dfC) -> Circuit (dfA, dfB) dfC Source #
Like zipWith. Any data not in Payload is copied from stream A.
zip :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfC ~ (FwdPayload dfA, FwdPayload dfB)) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (dfA, dfB) dfC Source #
Like zip
partition :: (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfB, BwdPayload dfA ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, FwdPayload dfA ~ FwdPayload dfC) => Proxy dfA -> (Proxy dfB, Proxy dfC) -> (FwdPayload dfA -> Bool) -> Circuit dfA (dfB, dfC) Source #
Like partition
route :: forall dfA dfB (n :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ (Index n, FwdPayload dfB), KnownNat n, 1 <= n) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB) Source #
Route a DfConv stream to another corresponding to the index
select :: forall dfA dfB dfC (n :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ Index n, KnownNat n) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (Vec n dfA, dfB) dfC Source #
Select data from the channel indicated by the DfConv stream carrying
Index n.
selectN :: forall dfA dfB dfC (n :: Nat) (selectN :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ (Index n, Index selectN), KnownNat n, KnownNat selectN) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> Circuit (Vec n dfA, dfB) dfC Source #
Select selectN samples from channel n.
selectUntil :: forall dfA dfB dfC (n :: Nat). (DfConv dfA, DfConv dfB, DfConv dfC, BwdPayload dfA ~ BwdPayload dfC, BwdPayload dfB ~ BwdPayload dfC, Dom dfA ~ Dom dfB, Dom dfA ~ Dom dfC, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfC, FwdPayload dfB ~ Index n, KnownNat n) => (Proxy dfA, Proxy dfB) -> Proxy dfC -> (FwdPayload dfA -> Bool) -> Circuit (Vec n dfA, dfB) dfC Source #
Selects samples from channel n until the predicate holds. The cycle in which the predicate turns true is included.
fanin :: forall dfA dfB (numA :: Nat) (decNumA :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), KnownNat numA, numA ~ (decNumA + 1)) => Proxy dfA -> Proxy dfB -> (FwdPayload dfA -> FwdPayload dfA -> FwdPayload dfA) -> Circuit (Vec numA dfA) dfB Source #
Merge data of multiple streams using a user supplied function
mfanin :: forall dfA dfB (numA :: Nat) (decNumA :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), Monoid (FwdPayload dfA), KnownNat numA, numA ~ (decNumA + 1)) => Proxy dfA -> Proxy dfB -> Circuit (Vec numA dfA) dfB Source #
Merge data of multiple streams using Monoid's <>.
fanout :: forall dfA dfB (numB :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA), KnownNat numB, 1 <= numB) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec numB dfB) Source #
Copy data of a single DfConv stream to multiple. LHS will only receive an acknowledgement when all RHS receivers have acknowledged data.
bundleVec :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), Vec n (FwdPayload dfA) ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> Circuit (Vec n dfA) dfB Source #
Bundle a vector of DfConv streams into one.
unbundleVec :: forall dfA dfB (n :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ Vec n (FwdPayload dfB), NFDataX (FwdPayload dfB), KnownNat n, 1 <= n) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB) Source #
Split up a DfConv stream of a vector into multiple independent DfConv streams.
roundrobin :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> Circuit dfA (Vec n dfB) Source #
Distribute data across multiple components on the RHS. Useful if you want to parallelize a workload across multiple (slow) workers. For optimal throughput, you should make sure workers can accept data every n cycles.
data CollectMode Source #
Collect modes for dataflow arbiters.
Constructors
| NoSkip | Collect in a round-robin fashion. If a source does not produce data, wait until it does. Use with care, as there is a risk of starvation if a selected source is idle for a long time. |
| Skip | Collect in a round-robin fashion. If a source does not produce data, skip it and check the next source on the next cycle. |
| Parallel | Check all sources in parallel. Biased towards the first source. If the number of sources is high, this is more expensive than other modes. |
roundrobinCollect :: forall dfA dfB (n :: Nat) (decN :: Natural). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, KnownNat n, n ~ (decN + 1)) => Proxy dfA -> Proxy dfB -> CollectMode -> Circuit (Vec n dfA) dfB Source #
Opposite of roundrobin. Useful to collect data from workers that only
produce a result with an interval of n cycles.
registerFwd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Place register on forward part of a circuit.
registerBwd :: (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> Circuit dfA dfB Source #
Place register on backward part of a circuit. This is implemented using a in-logic two-element shift register.
fifo :: forall dfA dfB (depth :: Nat). (DfConv dfA, DfConv dfB, BwdPayload dfA ~ BwdPayload dfB, Dom dfA ~ Dom dfB, HiddenClockResetEnable (Dom dfA), KnownNat depth, 1 <= depth, FwdPayload dfA ~ FwdPayload dfB, NFDataX (FwdPayload dfA)) => Proxy dfA -> Proxy dfB -> SNat depth -> Circuit dfA dfB Source #
A fifo buffer with user-provided depth. Uses blockram to store data