Skip to content

Commit

Permalink
Move xmit update logic to separate function
Browse files Browse the repository at this point in the history
  • Loading branch information
jvnknvlgl committed Jul 8, 2024
1 parent 5bb7d4a commit 3d29236
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 101 deletions.
8 changes: 4 additions & 4 deletions clash-cores/src/Clash/Cores/Sgmii/Common.hs
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ data Rudi = C | I | Invalid
-- 'Sgmii.pcsReceive', the 'Rudi' that is transmitted by 'Sgmii.pcsReceive'
-- and the 'Xmit' that is transmitted by 'Sgmii.autoNeg'.
data SgmiiStatus = SgmiiStatus
{ _syncStatus :: SyncStatus
, _rxConfReg :: ConfReg
, _rudi :: Rudi
, _xmit :: Xmit
{ _cSyncStatus :: SyncStatus
, _cRxConfReg :: ConfReg
, _cRudi :: Rudi
, _cXmit :: Xmit
}

-- | Function that converts the given status values to 'SgmiiStatus', with input
Expand Down
169 changes: 72 additions & 97 deletions clash-cores/src/Clash/Cores/Sgmii/PcsTransmit/OrderedSet.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE RecordWildCards #-}

-- |
Expand Down Expand Up @@ -38,14 +39,21 @@ data OrderedSetState
-- implemented as it does not transmit a code group
txTestXmit ::
Bool -> Bool -> Xmit -> Even -> Bool -> Bool -> Maybe OrderedSetState
txTestXmit txEn txEr xmit txEven cgSent xmitChange
| not (xmitChange && cgSent && txEven == Odd) = Nothing
txTestXmit txEn txEr xmit txEven tx xmitChange
| not (xmitChange && tx && txEven == Odd) = Nothing
| xmit == Conf = Just (Configuration xmit False)
| xmit == Idle = Just (IdleS xmit False)
| xmit == Data && txEn = Just (IdleS xmit False)
| xmit == Data && txEr = Just (IdleS xmit False)
| otherwise = Just (XmitData xmit False)

-- | Function to update the current values for 'Xmit' and @xmitChange@
xmitUpdate :: OrderedSetState -> Maybe Xmit -> (Xmit, Bool)
xmitUpdate s xmit = (xmit', xmitChange)
where
xmit' = fromMaybe s._xmit xmit
xmitChange = (xmit' /= s._xmit) || s._xmitChange

-- | Void function that is used to check whether @/V/@ needs to be propagated
-- based on the values of the input pins
void :: OrderedSet -> Bool -> Bool -> BitVector 8 -> OrderedSet
Expand All @@ -68,189 +76,156 @@ orderedSetT ::
(Bool, Bool, BitVector 8, Maybe Xmit, Even, Bool) ->
-- | The new state and the new output values
(OrderedSetState, (OrderedSetState, OrderedSet))
orderedSetT self@Configuration{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@Configuration{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState = fromMaybe (Configuration xmit' xmitChange) s

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetC)
orderedSetT self@IdleS{..} (txEn, txEr, _, xmit, txEven, cgSent) =
(nextState, out)
orderedSetT self@IdleS{} (txEn, txEr, _, xmit, txEven, tx) = (nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| xmit' == Data && cgSent && not txEn && not txEr =
| xmit' == Data && tx && not txEn && not txEr =
XmitData xmit' xmitChange
| otherwise = IdleS xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetI)
orderedSetT self@XmitData{..} (txEn, txEr, _, xmit, txEven, cgSent) =
(nextState, out)
orderedSetT self@XmitData{} (txEn, txEr, _, xmit, txEven, tx) = (nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| txEn && not txEr && cgSent = StartOfPacket xmit' xmitChange
| txEn && txEr && cgSent = StartError xmit' xmitChange
| txEn && not txEr && tx = StartOfPacket xmit' xmitChange
| txEn && txEr && tx = StartError xmit' xmitChange
| otherwise = XmitData xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetI)
orderedSetT self@StartOfPacket{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@StartOfPacket{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| txEn && cgSent = TxData xmit' xmitChange
| not txEn && not txEr && cgSent = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && cgSent = EndOfPacketExt xmit' xmitChange
| txEn && tx = TxData xmit' xmitChange
| not txEn && not txEr && tx = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && tx = EndOfPacketExt xmit' xmitChange
| otherwise = StartOfPacket xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetS)
orderedSetT self@TxData{..} (txEn, txEr, dw, xmit, txEven, cgSent) =
(nextState, out)
orderedSetT self@TxData{} (txEn, txEr, dw, xmit, txEven, tx) = (nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| txEn && cgSent = TxData xmit' xmitChange
| not txEn && not txEr && cgSent = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && cgSent = EndOfPacketExt xmit' xmitChange
| txEn && tx = TxData xmit' xmitChange
| not txEn && not txEr && tx = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && tx = EndOfPacketExt xmit' xmitChange
| otherwise = TxData xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
txOSet = void OSetD txEn txEr dw

out = (self, txOSet)
orderedSetT self@EndOfPacketNoExt{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@EndOfPacketNoExt{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| cgSent = Epd2NoExt xmit' xmitChange
| tx = Epd2NoExt xmit' xmitChange
| otherwise = EndOfPacketNoExt xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetT)
orderedSetT self@Epd2NoExt{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@Epd2NoExt{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| txEven == Odd && cgSent = XmitData xmit' xmitChange
| txEven == Even && cgSent = Epd3 xmit' xmitChange
| txEven == Odd && tx = XmitData xmit' xmitChange
| txEven == Even && tx = Epd3 xmit' xmitChange
| otherwise = Epd2NoExt xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetR)
orderedSetT self@Epd3{..} (txEn, txEr, _, xmit, txEven, cgSent) =
(nextState, out)
orderedSetT self@Epd3{} (txEn, txEr, _, xmit, txEven, tx) = (nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| cgSent = XmitData xmit' xmitChange
| tx = XmitData xmit' xmitChange
| otherwise = Epd3 xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetR)
orderedSetT self@EndOfPacketExt{..} (txEn, txEr, dw, xmit, txEven, cgSent) =
orderedSetT self@EndOfPacketExt{} (txEn, txEr, dw, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| not txEr && cgSent = ExtendBy1 xmit' xmitChange
| txEr && cgSent = CarrierExtend xmit' xmitChange
| not txEr && tx = ExtendBy1 xmit' xmitChange
| txEr && tx = CarrierExtend xmit' xmitChange
| otherwise = EndOfPacketExt xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
txOSet = void OSetT txEn txEr dw

out = (self, txOSet)
orderedSetT self@ExtendBy1{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@ExtendBy1{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| cgSent = Epd2NoExt xmit' xmitChange
| tx = Epd2NoExt xmit' xmitChange
| otherwise = ExtendBy1 xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetR)
orderedSetT self@CarrierExtend{..} (txEn, txEr, dw, xmit, txEven, cgSent) =
orderedSetT self@CarrierExtend{} (txEn, txEr, dw, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| not txEn && not txEr && cgSent = ExtendBy1 xmit' xmitChange
| txEn && txEr && cgSent = StartError xmit' xmitChange
| txEn && not txEr && cgSent = StartOfPacket xmit' xmitChange
| not txEn && not txEr && tx = ExtendBy1 xmit' xmitChange
| txEn && txEr && tx = StartError xmit' xmitChange
| txEn && not txEr && tx = StartOfPacket xmit' xmitChange
| otherwise = CarrierExtend xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
txOSet = void OSetR txEn txEr dw

out = (self, txOSet)
orderedSetT self@StartError{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@StartError{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| cgSent = TxDataError xmit' xmitChange
| tx = TxDataError xmit' xmitChange
| otherwise = StartError xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetS)
orderedSetT self@TxDataError{..} (txEn, txEr, _, xmit, txEven, cgSent) =
orderedSetT self@TxDataError{} (txEn, txEr, _, xmit, txEven, tx) =
(nextState, out)
where
xmit' = fromMaybe _xmit xmit
xmitChange = (xmit' /= _xmit) || _xmitChange
s = txTestXmit txEn txEr xmit' txEven cgSent xmitChange

nextState
| isJust s = fromJust s
| txEn && cgSent = TxData xmit' xmitChange
| not txEn && not txEr && cgSent = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && cgSent = EndOfPacketExt xmit' xmitChange
| txEn && tx = TxData xmit' xmitChange
| not txEn && not txEr && tx = EndOfPacketNoExt xmit' xmitChange
| not txEn && txEr && tx = EndOfPacketExt xmit' xmitChange
| otherwise = TxDataError xmit' xmitChange

(xmit', xmitChange) = xmitUpdate self xmit
s = txTestXmit txEn txEr xmit' txEven tx xmitChange
out = (self, OSetV)

{-# CLASH_OPAQUE orderedSetT #-}

0 comments on commit 3d29236

Please sign in to comment.