1
|
types
|
2
|
TimeSteps = {Int0 = 0 , Int20 = 20, Int30 = 30, Int270 = 270} ;
|
3
|
Int = int[0..270] ;
|
4
|
SmallInt = int[0..3] ;
|
5
|
AlarmSystem = autocons system
|
6
|
|[
|
7
|
var
|
8
|
open : bool = true ;
|
9
|
locked : bool = false ;
|
10
|
armed : bool = false ;
|
11
|
soundAlarm : bool = false ;
|
12
|
flashAlarm : bool = false ;
|
13
|
blockingLevel : SmallInt = 0 ;
|
14
|
armedOnNow : bool = false ;
|
15
|
armedOnLater : bool = false ;
|
16
|
armedOff : bool = false ;
|
17
|
soundOn : bool = false ;
|
18
|
soundOffNow : bool = false ;
|
19
|
soundOffLater : bool = false ;
|
20
|
flashOn : bool = false ;
|
21
|
flashOffNow : bool = false ;
|
22
|
flashOffLater : bool = false ;
|
23
|
silent : bool = false # true after alarms turned off
|
24
|
actions
|
25
|
ctr Close ( waittime : Int) =
|
26
|
requires not flashAlarm and not soundAlarm :
|
27
|
requires open and waittime = 0 and blockingLevel = 0 and locked and silent:
|
28
|
open := false ;
|
29
|
blockingLevel := 1 ;
|
30
|
armedOnNow := true ;
|
31
|
silent := false
|
32
|
|
33
|
end []
|
34
|
requires open and waittime = 0 and blockingLevel = 0 and not locked and silent:
|
35
|
silent := false ;
|
36
|
open := false
|
37
|
end []
|
38
|
requires open and waittime = 0 and blockingLevel = 0 and locked and not silent:
|
39
|
open := false ;
|
40
|
blockingLevel := 1 ;
|
41
|
armedOnLater := true
|
42
|
|
43
|
end []
|
44
|
requires open and waittime = 0 and blockingLevel = 0 and not locked and not silent:
|
45
|
open := false
|
46
|
end
|
47
|
|
48
|
end ;
|
49
|
|
50
|
ctr Open ( waittime : Int) =
|
51
|
requires true :
|
52
|
requires not open and waittime = 0 and blockingLevel = 0 and not armed :
|
53
|
open := true
|
54
|
end []
|
55
|
requires not open and waittime = 0 and blockingLevel = 0 and armed :
|
56
|
open := true ;
|
57
|
armed := false ;
|
58
|
blockingLevel := 3 ;
|
59
|
armedOff := true ;
|
60
|
soundOn := true ;
|
61
|
flashOn := true
|
62
|
end
|
63
|
end ;
|
64
|
|
65
|
# requires not open and waittime = 0 and blockingLevel = 0 :
|
66
|
# open := true ;
|
67
|
# (requires not armed :
|
68
|
# skip
|
69
|
# end []
|
70
|
# requires armed :
|
71
|
# armed := false ;
|
72
|
# blockingLevel := 3 ;
|
73
|
# armedOff := true ;
|
74
|
# soundOn := true ;
|
75
|
# flashOn := true
|
76
|
# end)
|
77
|
# end ;
|
78
|
ctr Unlock ( waittime : Int) =
|
79
|
requires true :
|
80
|
requires locked and waittime = 0 and blockingLevel = 0 and not flashAlarm and soundAlarm:
|
81
|
locked := false ;
|
82
|
silent := false ;
|
83
|
soundOffLater := false ;
|
84
|
soundOffNow := true ;
|
85
|
blockingLevel := 1
|
86
|
end []
|
87
|
requires locked and waittime = 0 and blockingLevel = 0 and flashAlarm and soundAlarm :
|
88
|
locked := false ;
|
89
|
flashOffNow := true ;
|
90
|
blockingLevel := 2 ;
|
91
|
silent := false ;
|
92
|
soundOffLater := false ;
|
93
|
soundOffNow := true
|
94
|
|
95
|
end []
|
96
|
requires locked and waittime = 0 and blockingLevel = 0 and not flashAlarm and not soundAlarm:
|
97
|
locked := false ;
|
98
|
silent := false ;
|
99
|
armedOff := true ;
|
100
|
blockingLevel := 1
|
101
|
end []
|
102
|
requires locked and waittime = 0 and blockingLevel = 0 and flashAlarm and not soundAlarm:
|
103
|
locked := false ;
|
104
|
flashOffNow := true ;
|
105
|
flashOffLater := false ;
|
106
|
blockingLevel := 1 ;
|
107
|
silent := false
|
108
|
end
|
109
|
end;
|
110
|
|
111
|
ctr Lock ( waittime : Int) =
|
112
|
requires true :
|
113
|
requires not locked and waittime = 0 and blockingLevel = 0 and open :
|
114
|
locked := true
|
115
|
end []
|
116
|
requires not locked and waittime = 0 and blockingLevel = 0 and not open :
|
117
|
locked := true ;
|
118
|
blockingLevel := 1 ;
|
119
|
armedOnLater := true
|
120
|
end
|
121
|
end ;
|
122
|
obs ArmedOn (waittime : Int) =
|
123
|
requires (armedOnNow or armedOnLater):
|
124
|
requires (waittime = 20 and armedOnLater) :
|
125
|
armedOnLater := false ;
|
126
|
blockingLevel := blockingLevel - 1 ;
|
127
|
armed := true
|
128
|
end
|
129
|
[] requires (waittime = 0 and armedOnNow) :
|
130
|
armedOnNow := false ;
|
131
|
blockingLevel := blockingLevel - 1 ;
|
132
|
armed := true
|
133
|
end
|
134
|
end ;
|
135
|
obs ArmedOff (waittime : Int) =
|
136
|
requires (waittime = 0 and armedOff) :
|
137
|
armedOff := false ;
|
138
|
blockingLevel := blockingLevel - 1 ;
|
139
|
armed := false
|
140
|
end ;
|
141
|
obs SoundOn (waittime : Int) =
|
142
|
requires true :
|
143
|
requires (waittime = 0 and soundOn and blockingLevel = 1) :
|
144
|
soundOn := false ;
|
145
|
blockingLevel := blockingLevel - 1 ;
|
146
|
soundAlarm := true ;
|
147
|
soundOffLater := true
|
148
|
end []
|
149
|
requires (waittime = 0 and soundOn and blockingLevel <> 1) :
|
150
|
soundOn := false ;
|
151
|
blockingLevel := blockingLevel - 1 ;
|
152
|
soundAlarm := true
|
153
|
end
|
154
|
|
155
|
end ;
|
156
|
obs SoundOff (waittime : Int) =
|
157
|
requires (soundOffNow or soundOffLater) :
|
158
|
requires (waittime = 30 and soundOffLater) :
|
159
|
soundOffLater := false ;
|
160
|
flashOffLater := true ;
|
161
|
soundAlarm := false
|
162
|
end
|
163
|
[] requires (waittime = 0 and soundOffNow) :
|
164
|
soundOffNow := false ;
|
165
|
blockingLevel := blockingLevel - 1 ;
|
166
|
soundAlarm := false
|
167
|
end
|
168
|
end ;
|
169
|
obs FlashOn (waittime : Int) =
|
170
|
requires true :
|
171
|
requires (waittime = 0 and flashOn and blockingLevel = 1) :
|
172
|
flashOn := false ;
|
173
|
blockingLevel := blockingLevel - 1 ;
|
174
|
flashAlarm := true ;
|
175
|
soundOffLater := true
|
176
|
end []
|
177
|
requires (waittime = 0 and flashOn and blockingLevel <> 1) :
|
178
|
flashOn := false ;
|
179
|
blockingLevel := blockingLevel - 1 ;
|
180
|
flashAlarm := true
|
181
|
end
|
182
|
end ;
|
183
|
obs FlashOff (waittime : Int) =
|
184
|
requires (flashOffNow or flashOffLater) :
|
185
|
requires (waittime = 270 and flashOffLater) :
|
186
|
flashOffLater := false ;
|
187
|
# blockingLevel := blockingLevel - 1 ;
|
188
|
flashAlarm := false ;
|
189
|
silent := true
|
190
|
end
|
191
|
[] requires (waittime = 0 and flashOffNow) :
|
192
|
flashOffNow := false ;
|
193
|
blockingLevel := blockingLevel - 1 ;
|
194
|
flashAlarm := false
|
195
|
end
|
196
|
end
|
197
|
do
|
198
|
var A : TimeSteps : Close (A) []
|
199
|
var B : TimeSteps : Open (B) []
|
200
|
var C : TimeSteps : Lock (C) []
|
201
|
var D : TimeSteps : Unlock (D) []
|
202
|
var E : TimeSteps : ArmedOn (E) []
|
203
|
var F : TimeSteps : ArmedOff (F) []
|
204
|
var G : TimeSteps : SoundOn (G) []
|
205
|
var H : TimeSteps : SoundOff (H) []
|
206
|
var I : TimeSteps : FlashOn (I) []
|
207
|
var J : TimeSteps : FlashOff (J)
|
208
|
od
|
209
|
]|
|
210
|
system
|
211
|
AlarmSystem
|