<?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.

broadcast chan up[8], down[8], left[8], right[8];

const int tc= 2, tt = 3; // time car, time truck
int board[8][8] = { 	{ 1, 1, 1, 1, 1, 1, 1, 1},
			{ 1, 1, 1, 1, 1, 0, 0, 1},
			{ 1, 1, 0, 1, 1, 0, 0, 1},
			{ 1, 1, 1, 1, 1, 0, 0, 1},
			{ 1, 1, 1, 1, 1, 0, 1, 1},	
			{ 1, 0, 0, 0, 0, 0, 1, 1},
			{ 1, 0, 0, 0, 0, 0, 1, 1},
			{ 1, 1, 1, 0, 1, 1, 1, 1} };
 // the matrix is rotated with 90 degrees clockwise. upper left corner of the board is (1,1)  

struct { int x, y, u, r, d, l, t; } car[7] =  { {3, 3, 0, 1, 0, -2, tc}, // red
						{2, 1, 0, 1, 0, -2, tc}, // light green
						{3, 1, -1, 0, 2, 0, tc}, // orange
						{1, 2, -1, 0, 3, 0, tt}, // purple (truck)
						{4, 4, 0, 1, 0, -3, tt}, // blue (truck)
						{4, 1, -1, 0, 3, 0, tt}, // yellow (truck)
						{6, 6, 0, 1, 0, -3, tt}  // green (truck)
						};

// each car is considered oriented either facing up (vertical cars) either right (orizontal)
// and characterized by the possibile moves (up, right, down, left) and time  (t)
int count = 0;
</declaration><template><name x="5" y="5">RushHour</name><parameter>const int[0,6] id</parameter><declaration>// Place local declarations here.
</declaration><location id="id0" x="8" y="-40"></location><init ref="id0"/><transition><source ref="id0"/><target ref="id0"/><label kind="guard" x="-96" y="112">board[car[id].x][car[id].y+car[id].d]==0</label><label kind="synchronisation" x="-112" y="48">down[id]!</label><label kind="assignment" x="-96" y="64">board[car[id].x][car[id].y+car[id].d]=1,
board[car[id].x][car[id].y]=0,
car[id].y++, count+=car[id].t</label><label kind="comments">down</label><nail x="8" y="56"/><nail x="-96" y="56"/></transition><transition><source ref="id0"/><target ref="id0"/><label kind="guard" x="120" y="8">board[car[id].x+car[id].r][car[id].y]==0</label><label kind="synchronisation" x="136" y="-64">right[id]!</label><label kind="assignment" x="120" y="-40">board[car[id].x+car[id].r][car[id].y]=1,
board[car[id].x+car[id].l+1][car[id].y]=0,
car[id].x++, count+=car[id].t</label><label kind="comments">right</label><nail x="112" y="-40"/><nail x="112" y="40"/></transition><transition><source ref="id0"/><target ref="id0"/><label kind="guard" x="-72" y="-160">board[car[id].x][car[id].y+car[id].u]==0</label><label kind="synchronisation" x="-40" y="-144">up[id]!</label><label kind="assignment" x="-72" y="-208">board[car[id].x][car[id].y+car[id].u]=1,
board[car[id].x][car[id].y+car[id].d-1]=0,
car[id].y--, count+=car[id].t</label><label kind="comments">up</label><nail x="8" y="-136"/><nail x="104" y="-136"/></transition><transition><source ref="id0"/><target ref="id0"/><label kind="guard" x="-360" y="-72">board[car[id].x+car[id].l][car[id].y]==0</label><label kind="synchronisation" x="-216" y="-48">left[id]!</label><label kind="assignment" x="-360" y="-120">board[car[id].x+car[id].l][car[id].y]=1,
board[car[id].x][car[id].y]=0,
car[id].x--, count+=car[id].t</label><label kind="comments">left</label><nail x="-128" y="-40"/><nail x="-128" y="-120"/></transition></template><template><name>Dummy</name><location id="id1" x="0" y="0"></location><init ref="id1"/><transition><source ref="id1"/><target ref="id1"/><label kind="select" x="-16" y="88">i:int[0,7]</label><label kind="synchronisation" x="-16" y="104">down[i]?</label><nail x="-16" y="80"/><nail x="48" y="80"/></transition><transition><source ref="id1"/><target ref="id1"/><label kind="select" x="-168" y="-8">i:int[0,7]</label><label kind="synchronisation" x="-160" y="16">left[i]?</label><nail x="-104" y="-8"/><nail x="-96" y="48"/></transition><transition><source ref="id1"/><target ref="id1"/><label kind="select" x="-88" y="-176">i:int[0,7]</label><label kind="synchronisation" x="-88" y="-160">up[i]?</label><nail x="8" y="-136"/><nail x="-64" y="-128"/></transition><transition><source ref="id1"/><target ref="id1"/><label kind="select" x="120" y="-56">i:int[0,7]</label><label kind="synchronisation" x="112" y="-40">right[i]?</label><nail x="88" y="-64"/><nail x="88" y="8"/></transition></template><system>// Place template instantiations here.

// List one or more processes to be composed into a system.
system RushHour, Dummy;</system></nta>
