-
-
Notifications
You must be signed in to change notification settings - Fork 62
/
ModalCycleBreaker.lf
79 lines (66 loc) · 1.41 KB
/
ModalCycleBreaker.lf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
* Modal Reactor Test.
*
* Tests if connections in the same reactor that have the same destination work if they are located
* in separate modes.
*/
target Python {
fast: false,
timeout: 1 sec
}
import TraceTesting from "util/TraceTesting.lf"
reactor Modal {
input in1
input in2
output out
# Defining reaction to in2 before in1 would cause cycle if no mode were present
mode Two {
timer wait(150 msec, 1 sec)
reaction(in2) {= =}
reaction(wait) -> reset(One) {=
One.set()
print("Switching to mode One")
=}
}
initial mode One {
reaction(in1) -> out {=
out.set(in1.value)
=}
reaction(in1) -> reset(Two) {=
if in1.value % 5 == 4:
Two.set()
print("Switching to mode Two")
=}
}
}
reactor Counter(period = 1 sec) {
output value
timer t(0, period)
state curval = 0
reaction(t) -> value {=
value.set(self.curval)
self.curval += 1
=}
}
main reactor {
counter = new Counter(period = 100 msec)
modal = new Modal()
test = new TraceTesting(events_size = 1, trace = ( // keep-format
0,1,0,
100000000,1,1,
100000000,1,2,
100000000,1,3,
100000000,1,4,
200000000,1,6,
100000000,1,7,
100000000,1,8,
100000000,1,9
), training = False)
counter.value -> modal.in1
modal.out -> modal.in2
modal.out -> test.events
# Print
reaction(modal.out) {=
print(modal.out.value)
=}
}