1
%%----------------------------------------------------------------------
4
%% translated to XL by Yifei Dong
6
%%----------------------------------------------------------------------
8
%%----------------------------------------------------------------------
10
% numNodes(NumberOfNodes).
11
% maxID(NumberOfNodes-1).
12
% TotalSlots(TotalTimeSlots).
13
% maxRTSlots(TotalTimeSlots-1).
16
config(NumNodes, TotalSlots) :-
17
retractall(numNodes(_)),
19
retractall(totalSlots(_)),
20
retractall(maxRTSlots(_)),
23
MaxRT is TotalSlots-1,
24
assert(numNodes(NumNodes)),
26
assert(totalSlots(TotalSlots)),
27
assert(maxRTSlots(MaxRT)).
35
%%----------------------------------------------------------------------
36
% ID arithmetic , Prolog Term
40
NextID is (ID+1) mod N.
43
%%----------------------------------------------------------------------
46
% ServingRealtimeFlag,
47
% RealtimeModeBooleanArray,
49
% NonRealtimeSlotsRemaining,
50
% NextNonRealtimeNodeID
53
%%----------------------------------------------------------------------
55
% input: in(Port(ThisNode), Token)
56
% output: out(Port(DestNode), Token)
58
%%----------------------------------------------------------------------
61
% RealtimeMode (stored in token?)
64
node(Port, ID:integer) ::=
66
nodeActive(Port,ID,Token).
68
nodeActive(Port, ID:integer,Token) ::=
69
Token = token(ServingRT, _RTMode, _RTSlots, _NRTAvail, _NextNRT) o
71
then {nodeRT(Port, ID,Token)}
72
else {nodeNRT(Port, ID, Token)}.
76
% 1. optionally release realtime slot
79
nodeRT(Port,ID:integer,Token) ::=
81
{ releaseRT(ID,Token,Token1)
84
findNextNodeRT(ID, Token1, Next, NewToken) o
86
{% no token passing within the same node
87
nodeActive(Port,ID,NewToken)}
88
else {Port! (Next,NewToken) o
93
releaseRT(ID, Token, NewToken) :-
94
Token = token(ServingRT, RTMode, RTSlots, NRTAvail, NextNRT),
96
-> (NewRTSlots is RTSlots-1,
97
resetbit(RTMode, ID, NewRTMode),
98
NewToken = token(ServingRT, NewRTMode, NewRTSlots,
102
findNextNodeRT(ID,Token,Next,NewToken) :-
103
Token = token(_ServingRT, RTMode, RTSlots, NRTAvail, NextNRT),
105
(0 is (RTMode >> ID1)
106
-> % no more RT node, then pass token to NRT node
108
NewToken = token(0, RTMode, RTSlots, NRTAvail, NextNRT))
109
; (firstTrue(RTMode,ID1,Next),
115
% 1. optionally reserve realtime slot
119
nodeNRT(Port, ID:integer, Token) ::=
121
{reserveRT(Port, ID, Token, NewToken)
123
} o passTokenNRT(Port,ID,NewToken).
125
reserveRT(Port, ID:integer, Token, NewToken) ::=
126
Token = token(ServingRT, RTMode, RTSlots, NRTAvail, NextNRT) o
128
if (falsebit(RTMode, ID) /\ RTSlots < MaxRT) then
129
{NewRTSlots is RTSlots+1 o
130
setbit(RTMode, ID, NewRTMode) o
131
NewToken = token(ServingRT, NewRTMode, NewRTSlots,
134
else {NewToken = Token}.
136
passTokenNRT(Port, ID:integer,Token) ::=
137
Token = token(ServingRT, RTMode, RTSlots, NRTAvail, NextNRT) o
138
incID(NextNRT, NewNextNRT) o
139
NewNRTAvail is NRTAvail - 1 o
141
then % if NRT slots are available,
142
% pass the token to the next NRT ndde
143
{NewToken = token(ServingRT, RTMode, RTSlots,
144
NewNRTAvail, NewNextNRT) o
145
Port! (NewNextNRT, NewToken) o
147
else % if NRT slots are used up,
148
% end this cycle and start a new cycle
151
ResetNRTAvail is Slots - RTSlots o
152
NewToken = token(1, RTMode, RTSlots,
153
ResetNRTAvail, NewNextNRT) o
154
firstTrue(RTMode, 0, FirstRT) o
156
if FirstRT == ID then
157
% no token passing within the same node
158
{nodeActive(Port,ID, NewToken)}
159
else {Port! (FirstRT, NewToken) o
163
%%----------------------------------------------------------------------
165
% 1. creates the array of nodes
166
% 1. marks the starting of the first cycle
167
% 2. generates the token
169
generator(N:integer) ::=
172
{generator(N1) | node(Port,N1)}}
173
else {action(startcycle) o
175
NRTSlots is Slots-1 o
176
out(Port(0), token(1,1,1,NRTSlots,0)) o
179
%%----------------------------------------------------------------------
180
% System specification
184
(generator(N) \ { Port(_) }).
188
Port !(0, token(1,1,1,2,0)) o
198
%%----------------------------------------------------------------------
199
% Boolean array arithmetics
202
truebit(Array, Bit) :-
203
1 is ((Array >> Bit) mod 2).
205
falsebit(Array, Bit) :-
206
0 is ((Array >> Bit) mod 2).
208
setbit(Array, Bit, NewArray) :-
211
; NewArray is Array + (1 << Bit).
213
resetbit(Array, Bit, NewArray) :-
215
-> NewArray is Array - (1 << Bit)
218
firstTrue(Array, Begin, Result) :-
219
% (0 is Array >> Begin
220
% -> (write('Error parameter for firstTrue'),
221
% write(Array), writeln(Begin), halt)
223
truebit(Array, Begin)
226
firstTrue(Array, Next, Result)).
228
%%=============================================================================
233
dlf -= [-]dlf /\ <->tt.
235
% no starvation for NRT traffic
237
ns(I) -= [{startcycle}]nsY(I)
239
nsY(I) -= [{endcycle}]nsZ(I)
240
/\ [-{nrt(I),endcycle}]nsY(I).
242
/\ [-{nrt(I)}]nsZ(I).