diff --git a/clash-cores/src/Clash/Cores/Sgmii/Common.hs b/clash-cores/src/Clash/Cores/Sgmii/Common.hs index 93bb3b3df7..be7852a0c4 100644 --- a/clash-cores/src/Clash/Cores/Sgmii/Common.hs +++ b/clash-cores/src/Clash/Cores/Sgmii/Common.hs @@ -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 diff --git a/clash-cores/src/Clash/Cores/Sgmii/PcsTransmit/OrderedSet.hs b/clash-cores/src/Clash/Cores/Sgmii/PcsTransmit/OrderedSet.hs index e9d478d3f2..fb72c55cb2 100644 --- a/clash-cores/src/Clash/Cores/Sgmii/PcsTransmit/OrderedSet.hs +++ b/clash-cores/src/Clash/Cores/Sgmii/PcsTransmit/OrderedSet.hs @@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-} +{-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE RecordWildCards #-} -- | @@ -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 @@ -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 #-}