<?xml version="1.0" encoding="utf-8"?><!DOCTYPE nta PUBLIC '-//Uppaal Team//DTD Flat System 1.1//EN' 'http://www.it.uu.se/research/group/darts/uppaal/flat-1_1.dtd'><nta><declaration>// Place global declarations here.
const int MaxProc = 2;
const int TMax = 5;
const int TMin = 5;
bool failure = false;
bool jnd [MaxProc] = {false, false};
bool waiting [MaxProc] = {false, false};
bool join[MaxProc] = {false, false}; 
bool leave[MaxProc]= {false, false}; 
bool active[MaxProc+1] = {true,true,true};
broadcast chan rcvtruebeat[MaxProc+1];
broadcast chan sndtruebeat[MaxProc+1];
broadcast chan rcvfalsebeat[MaxProc+1];
broadcast chan sndfalsebeat[MaxProc+1];

chan priority sndtruebeat[0] &lt; rcvtruebeat[1] ;
chan priority sndtruebeat[0] &lt; rcvfalsebeat[2];
chan priority sndtruebeat[0] &lt; rcvtruebeat[2];
chan priority sndtruebeat[0] &lt; rcvfalsebeat[1];
chan priority sndtruebeat[0] &lt; rcvtruebeat[0];

</declaration><template><name x="5" y="5">Process0</name><declaration>// Place local declarations here.
int t = TMax;

bool rcvd [MaxProc]={true,true};
int  tm[MaxProc] = {TMax, TMax};
clock waiting;

void initialize (bool&amp; j[MaxProc], bool&amp; r[MaxProc], int&amp; t[MaxProc])
{
  for ( i : int[0,MaxProc-1])
 {
 j[i] = false;  
 r[i] = true; 
 t[i] = TMax;
 }
}


void updateTM (bool j[MaxProc], bool r[MaxProc], int&amp; t[MaxProc])
{
  for ( i : int[0,MaxProc-1])
 {
 if ( j[i] and r[i] ) { t[i] = TMax; }

 if (j[i] and (not r[i]) ) { t[i] =  t[i] / 2; }

 }
}

void fillFalse (bool&amp; r[MaxProc])
{
  for ( i : int[0,MaxProc-1])
 {
 r[i] = false;
 }
}


int minList( int t[MaxProc])
{
int i = 0; 
int min = TMax;
while ( i &lt; MaxProc) 
{
if (min &gt; t[i]) { min = t[i]; } 
i += 1;
}
return min;  
}</declaration><location id="id0" x="-208" y="-200"><committed/></location><location id="id1" x="-368" y="-200"><name x="-416" y="-240">NV_Inactivated</name></location><location id="id2" x="-88" y="-280"><committed/></location><location id="id3" x="-208" y="-536"><name x="-256" y="-568">V_Inactivated</name></location><location id="id4" x="-208" y="-360"><name x="-192" y="-360">Alive</name><label kind="invariant" x="-192" y="-408">(waiting &lt;= t) and 
(t &gt;= TMin)</label></location><init ref="id4"/><transition><source ref="id0"/><target ref="id1"/><label kind="guard" x="-328" y="-192">t &lt; TMin</label><label kind="assignment" x="-328" y="-176">active[0] = false</label><nail x="-312" y="-200"/></transition><transition><source ref="id0"/><target ref="id4"/><label kind="guard" x="-224" y="-272">t &gt;= TMin</label></transition><transition><source ref="id2"/><target ref="id0"/><label kind="assignment" x="-104" y="-192">fillFalse(rcvd),
t = minList(tm)</label><nail x="-88" y="-200"/></transition><transition><source ref="id4"/><target ref="id2"/><label kind="guard" x="-80" y="-360">waiting == t</label><label kind="synchronisation" x="-80" y="-344">sndtruebeat[0]!</label><label kind="assignment" x="-80" y="-328">waiting = 0,
updateTM(jnd,rcvd,tm)</label><nail x="-88" y="-360"/></transition><transition><source ref="id4"/><target ref="id4"/><label kind="select" x="-392" y="-512">i : int[1,MaxProc]</label><label kind="synchronisation" x="-384" y="-496">rcvfalsebeat[i]?</label><label kind="assignment" x="-384" y="-480">rcvd[i-1] = false, 
jnd[i-1] = false</label><nail x="-240" y="-448"/><nail x="-304" y="-448"/><nail x="-304" y="-392"/></transition><transition><source ref="id4"/><target ref="id4"/><label kind="select" x="-416" y="-368">i : int[1,MaxProc]</label><label kind="synchronisation" x="-416" y="-352">rcvtruebeat[i]?</label><label kind="assignment" x="-416" y="-336">rcvd[i-1] = true, 
jnd[i-1] = true</label><nail x="-290" y="-361"/><nail x="-290" y="-297"/><nail x="-226" y="-297"/></transition><transition><source ref="id4"/><target ref="id3"/><label kind="assignment" x="-176" y="-480">active[0] = false</label></transition></template><template><name>Channel</name><parameter>int[1,MaxProc]  i</parameter><declaration>clock delay;
bool lostMsg = false;
</declaration><location id="id5" x="-440" y="-480"><label kind="invariant" x="-520" y="-512">delay &lt;= TMin</label></location><location id="id6" x="-368" y="-416"><label kind="invariant" x="-432" y="-448">delay &lt;= TMin</label></location><location id="id7" x="-200" y="-416"><label kind="invariant" x="-184" y="-432">delay &lt;= TMin</label></location><location id="id8" x="-200" y="-312"><label kind="invariant" x="-208" y="-296">delay &lt;= TMin</label></location><location id="id9" x="-368" y="-312"></location><init ref="id9"/><transition><source ref="id6"/><target ref="id9"/><label kind="assignment" x="-488" y="-384">lostMsg = true,
delay = 0</label><nail x="-392" y="-392"/><nail x="-392" y="-336"/></transition><transition><source ref="id5"/><target ref="id9"/><label kind="assignment" x="-696" y="-392">lostMsg = true,
delay = 0</label><nail x="-440" y="-528"/><nail x="-448" y="-536"/><nail x="-584" y="-536"/><nail x="-600" y="-520"/><nail x="-600" y="-256"/><nail x="-584" y="-240"/><nail x="-440" y="-240"/></transition><transition><source ref="id8"/><target ref="id7"/><label kind="assignment" x="-152" y="-368">lostMsg=true</label><nail x="-160" y="-328"/><nail x="-160" y="-392"/></transition><transition><source ref="id5"/><target ref="id9"/><label kind="guard" x="-552" y="-288">active[i] == false</label><nail x="-560" y="-480"/><nail x="-560" y="-288"/><nail x="-440" y="-288"/></transition><transition><source ref="id7"/><target ref="id9"/><label kind="guard" x="-200" y="-224">active[i] == false</label><nail x="-72" y="-416"/><nail x="-72" y="-232"/><nail x="-288" y="-232"/></transition><transition><source ref="id9"/><target ref="id9"/><label kind="guard" x="-400" y="-240">not jnd[i-1]</label><label kind="synchronisation" x="-424" y="-224">sndtruebeat[0]?</label><label kind="assignment" x="-408" y="-208">delay=0</label><nail x="-400" y="-248"/><nail x="-344" y="-248"/></transition><transition><source ref="id5"/><target ref="id9"/><label kind="synchronisation" x="-544" y="-448">rcvfalsebeat[i]!</label><label kind="assignment" x="-520" y="-432">delay=0</label><nail x="-440" y="-312"/></transition><transition><source ref="id7"/><target ref="id5"/><label kind="guard" x="-384" y="-520">jnd[i-1]==true</label><label kind="synchronisation" x="-392" y="-504">sndfalsebeat[i]?</label><nail x="-200" y="-480"/></transition><transition><source ref="id6"/><target ref="id9"/><label kind="synchronisation" x="-360" y="-384">rcvtruebeat[i]!</label><label kind="assignment" x="-360" y="-368">delay=0</label></transition><transition><source ref="id7"/><target ref="id6"/><label kind="guard" x="-328" y="-456">jnd[i-1] == true</label><label kind="synchronisation" x="-328" y="-440">sndtruebeat[i]?</label></transition><transition><source ref="id8"/><target ref="id7"/><label kind="synchronisation" x="-288" y="-352">rcvtruebeat[0]!</label></transition><transition><source ref="id9"/><target ref="id8"/><label kind="guard" x="-312" y="-280">jnd[i-1]</label><label kind="synchronisation" x="-336" y="-296">sndtruebeat[0]?</label><label kind="assignment" x="-336" y="-312">delay=0</label></transition></template><template><name>Processi</name><parameter>int[1, MaxProc]  i </parameter><declaration>int t = TMax;
clock waitingforbeat;
clock waitingtojoin;

</declaration><location id="id10" x="-976" y="-488"><name x="-1040" y="-520">NV_Inactivated</name></location><location id="id11" x="-552" y="-624"><committed/></location><location id="id12" x="-200" y="-512"><committed/></location><location id="id13" x="-888" y="-352"><urgent/></location><location id="id14" x="-1008" y="-424"><name x="-1072" y="-456">V_Inactivated</name></location><location id="id15" x="-568" y="-352"><name x="-552" y="-400">Alive</name><label kind="invariant" x="-824" y="-392">(waitingtojoin &lt;= TMin) and 
(waitingforbeat &lt;= (2*TMax + TMin)+1)</label></location><init ref="id13"/><transition><source ref="id15"/><target ref="id10"/><label kind="guard" x="-880" y="-544">(waitingforbeat&gt;2*TMax + TMin) and 
(not leave[i-1])</label><label kind="assignment" x="-880" y="-512">active[i]=false</label><nail x="-648" y="-488"/><nail x="-768" y="-488"/></transition><transition><source ref="id11"/><target ref="id15"/><label kind="synchronisation" x="-544" y="-568">sndfalsebeat[i]!</label><label kind="assignment" x="-544" y="-584">waitingtojoin = 0, waitingforbeat = 0</label><nail x="-544" y="-424"/></transition><transition><source ref="id15"/><target ref="id11"/><label kind="guard" x="-712" y="-576">active[i] and leave[i-1]</label><label kind="synchronisation" x="-664" y="-592">rcvtruebeat[0]?</label><nail x="-568" y="-360"/><nail x="-584" y="-408"/><nail x="-592" y="-488"/></transition><transition><source ref="id12"/><target ref="id15"/><label kind="synchronisation" x="-424" y="-368">sndtruebeat[i]!</label><label kind="assignment" x="-416" y="-384">join[i-1] = true, waitingforbeat = 0</label><nail x="-344" y="-400"/></transition><transition><source ref="id15"/><target ref="id12"/><label kind="guard" x="-432" y="-536">active[i] and 
waiting[i-1] and 
(not leave[i-1])</label><label kind="synchronisation" x="-432" y="-488">rcvtruebeat[0]?</label><label kind="assignment" x="-440" y="-472">join[i-1] = true</label><nail x="-480" y="-408"/></transition><transition><source ref="id15"/><target ref="id15"/><label kind="guard" x="-896" y="-264">active[i] and join[i-1] and ( not leave[i-1] )</label><label kind="assignment" x="-744" y="-280">leave[i-1] = true</label><nail x="-584" y="-344"/><nail x="-744" y="-280"/><nail x="-656" y="-280"/></transition><transition><source ref="id15"/><target ref="id15"/><label kind="guard" x="-624" y="-240">(waitingtojoin==TMin) and join[i-1]</label><label kind="assignment" x="-608" y="-224">waitingtojoin = 0</label><nail x="-568" y="-248"/><nail x="-528" y="-248"/></transition><transition><source ref="id15"/><target ref="id15"/><label kind="guard" x="-464" y="-336">(waitingtojoin==TMin) and (not join[i-1]) and active[i]</label><label kind="synchronisation" x="-456" y="-320">sndtruebeat[i]!</label><label kind="assignment" x="-456" y="-304">waitingtojoin = 0,
waiting[i-1] = true</label><nail x="-464" y="-336"/><nail x="-464" y="-272"/></transition><transition><source ref="id13"/><target ref="id15"/><label kind="assignment" x="-872" y="-352">(waitingforbeat = 0), (waitingtojoin = 0)</label></transition><transition><source ref="id15"/><target ref="id14"/><label kind="guard" x="-912" y="-464">(waitingforbeat &lt;= 2*TMax + TMin)</label><label kind="assignment" x="-872" y="-448">active[i] = false</label><nail x="-656" y="-424"/><nail x="-928" y="-424"/></transition></template><template><name>Channel2</name><parameter>int[0,MaxProc]  i</parameter><declaration>clock delay2;</declaration><location id="id16" x="-8" y="-248"><label kind="invariant" x="-18" y="-233">delay2 &lt;= TMin</label></location><location id="id17" x="-432" y="-248"></location><init ref="id17"/><transition><source ref="id16"/><target ref="id17"/><label kind="synchronisation" x="-360" y="-80">rcvtruebeat[i]!</label><nail x="-216" y="-64"/></transition><transition><source ref="id17"/><target ref="id16"/><label kind="guard" x="-232" y="-234">not join[i-1]</label><label kind="synchronisation" x="-232" y="-219">sndtruebeat[i]?</label><label kind="assignment" x="-232" y="-204">delay2 = 0</label></transition></template><template><name>MonitorR1</name><parameter>int[1, MaxProc]  i </parameter><declaration>clock delay;</declaration><location id="id18" x="-648" y="-464"></location><location id="id19" x="-224" y="-464"></location><location id="id20" x="-512" y="-464"></location><location id="id21" x="-512" y="-360"><name x="-488" y="-368">ErrorR1</name></location><init ref="id18"/><transition><source ref="id20"/><target ref="id21"/><label kind="guard" x="-504" y="-432">active[0] and 
(delay &gt; 3 * TMax - TMin)</label></transition><transition><source ref="id18"/><target ref="id20"/><label kind="synchronisation" x="-632" y="-488">rcvtruebeat[i]?</label><label kind="assignment" x="-616" y="-464">delay=0</label></transition><transition><source ref="id20"/><target ref="id19"/><label kind="synchronisation" x="-416" y="-488">rcvfalsebeat[i]?</label></transition><transition><source ref="id20"/><target ref="id20"/><label kind="synchronisation" x="-568" y="-552">rcvtruebeat[i]?</label><label kind="assignment" x="-552" y="-568">delay = 0</label><nail x="-484" y="-531"/><nail x="-572" y="-531"/></transition></template><system>// Place template instantiations here.
P1 = Processi(1);
P2 = Processi(2);
P3 = Processi(3);
C11 = Channel(1); 
C12 = Channel(2); 
C13 = Channel(3); 
C21 = Channel2(1); 
C22 = Channel2(2); 
C23 = Channel2(3); 
M1  = MonitorR1(1); 
M2  = MonitorR1(2); 


// List one or more processes to be composed into a system.
system C21, C22, Process0, P1, P2,  C11, C12, M1, M2;</system></nta>
