spectacle-1.0.0: test/integration/Specifications/BitClock.hs
{-# LANGUAGE OverloadedLabels #-}
module Specifications.BitClock where
import Data.Word (Word8)
import Language.Spectacle
( Action,
ActionType (ActionWF),
Fairness (WeakFair),
Modality (Always),
Specification (Specification),
Temporal,
TemporalType (PropG),
interaction,
plain,
specInit,
specNext,
specProp,
(.=),
pattern ConF,
pattern NilF,
type (#),
)
-- ---------------------------------------------------------------------------------------------------------------------
check :: IO ()
check = interaction bitClockSpec
-- ---------------------------------------------------------------------------------------------------------------------
type BitClockSpec =
Specification
'["clock" # Word8]
'["tick" # 'WeakFair]
'["times" # 'Always]
bitClockNext :: Action '["clock" # Word8] Bool
bitClockNext = do
clock <- plain #clock
if clock == 0
then #clock .= pure 1
else #clock .= pure 0
return True
bitClockTimes :: Temporal '["clock" # Word8] Bool
bitClockTimes = do
clock <- plain #clock
pure (clock == 0 || clock == 1)
bitClockSpec :: BitClockSpec
bitClockSpec =
Specification
{ specInit = ConF #clock (pure 0) NilF
, specNext = ConF #tick (ActionWF bitClockNext) NilF
, specProp = ConF #times (PropG bitClockTimes) NilF
}