#
# SCR style Cruise Control specification
# March 6, 1998
# I added explanatory comments. They go from '#' to the end of line.
# Paul Black 6 April 1998
MONITORED-COND # "input" variables
Ignited EngRun Toofast Brake Activate Deactivate Resume
MODECLASS CruiseControl # transition table
INITIAL Off (!Ignited)
MODE Off
Inactive @T(Ignited) # New state is Inactive if there is
# a transition to Ignited True
MODE Inactive
Off @F(Ignited)
Cruise @T(Activate) WHEN [EngRun & ~Toofast & ~Brake]
MODE Cruise
Off @F(Ignited)
Inactive @F(EngRun) WHEN [Ignited]
Inactive @T(Toofast) WHEN [Ignited]
Override @T(Brake) WHEN [Ignited & EngRun & ~Toofast]
Override @T(Deactivate) WHEN [Ignited & EngRun & ~Toofast]
MODE Override
Off @F(Ignited)
Inactive @F(EngRun) WHEN [Ignited]
Cruise @T(Activate) WHEN [Ignited & EngRun & ~Toofast & ~Brake]
Cruise @T(Resume) WHEN [Ignited & EngRun & ~Toofast & ~Brake]
ASSUMPTIONS # the input should never violate these
EngRun -> Ignited
Toofast -> EngRun
Activate / Deactivate / Resume
PROPERTIES # these are the specs. E is there 'Exists.'
# A is 'for All.' X is 'neXt state.'
# these are safety invariants
AG(Off -> ~Ignited)
AG(Inactive -> Ignited)
AG(Cruise -> (Ignited & EngRun & ~Toofast & ~Brake & ~Deactivate))
AG(Override -> (Ignited & EngRun))
# should always be able to reach every state
EF(Off)
EF(Inactive)
EF(Cruise)
EF(Override)
# the following are a restatement of the transition table above.
# They come in pairs. The first one (EF) states that the event
# can happen. The second one (AG) repeats the transition.
EF(Off & EX(@T(Ignited)))
AG(Off -> AX(@T(Ignited) -> Inactive))
EF(Inactive & EX(@F(Ignited)))
AG(Inactive -> AX(@F(Ignited) -> Off))
EF(Inactive & EX(@T(Activate) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]))
AG(Inactive -> AX((@T(Activate) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]) -> Cruise))
EF(Cruise & EX(@F(Ignited)))
AG(Cruise -> AX(@F(Ignited) -> Off))
EF(Cruise & EX(@F(EngRun) & WHEN [Ignited]))
AG(Cruise -> AX((@F(EngRun) & WHEN [Ignited]) -> Inactive))
EF(Cruise & EX(@T(Toofast) & WHEN [Ignited]))
AG(Cruise -> AX((@T(Toofast) & WHEN [Ignited]) -> Inactive))
EF(Cruise & EX(@T(Brake) & WHEN [Ignited & EngRun & ~Toofast]))
AG(Cruise -> AX((@T(Brake) & WHEN [Ignited & EngRun & ~Toofast]) -> Override))
EF(Cruise & EX(@T(Deactivate) & WHEN [Ignited & EngRun & ~Toofast]))
AG(Cruise -> AX((@T(Deactivate) & WHEN [Ignited & EngRun & ~Toofast]) -> Override))
EF(Override & EX(@F(Ignited)))
AG(Override -> AX(@F(Ignited) -> Off))
EF(Override & EX(@F(EngRun) & WHEN [Ignited]))
AG(Override -> AX((@F(EngRun) & WHEN [Ignited]) -> Inactive))
EF(Override & EX(@T(Activate) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]))
AG(Override -> AX((@T(Activate) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]) -> Cruise))
EF(Override & EX(@T(Resume) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]))
AG(Override -> AX((@T(Resume) & WHEN [Ignited & EngRun & ~Toofast & ~Brake]) -> Cruise))
# end
#