public Router_TorusRingConnect(int ID) : base()
     {
     	ConnectID = ID;
     	coord.ID = ID;
     	linkIn = new Link[2];
     	linkOut = new Link[2];
         m_n = null;
     }
Beispiel #2
0
        public override void setup()
        {
			if (Config.network_nrX != 4 && Config.network_nrY != 4)
				throw new Exception("buffered hierarchical ring only support 4x4 network");
			nics = new Router_NIC[Config.N];
			iris = new Router_IRI[4];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
				nics[n] = new Router_NIC(c);
                nodes[n].setRouter(nics[n]);
                nics[n].setNode(nodes[n]);
            }
			for (int n = 0; n < 4; n++)
			{
				iris[n] = new Router_IRI(n);
			}

			for (int group = 0; group < 4; group ++)
			{
				for (int i = 0; i < 4; i++)
				{
					if (i == 3) continue;
					int node = group * 4 + i;
					Link dirA = new Link(Config.router.switchLinkLatency - 1);
					links.Add(dirA);
					nics[node].linkOut[0] = dirA;
					nics[node+1].linkIn[0] = dirA;
				}

				Link dirD = new Link(Config.router.switchLinkLatency - 1);
				Link dirB = new Link(Config.router.switchLinkLatency - 1);
				links.Add(dirB);
				links.Add(dirD);
				nics[group*4 + 3].linkOut[0] = dirD;
				iris[group].LLinkIn[0] = dirD;	
				nics[group*4].linkIn[0] = dirB;
				iris[group].LLinkOut[0] = dirB;
				int next = (group + 1) % 4;
				Link dirC = new Link(Config.router.level1RingLinkLatency - 1);
				links.Add(dirC);
				iris[group].GLinkOut[0] = dirC;
				iris[next].GLinkIn[0] = dirC;
			}
       	} 
Beispiel #3
0
		public Router_Bridge(int ID, int GlobalRingWidth, int LocalRingWidth = 1, int L2GBufferDepth = -1, int G2LBufferDepth = -1) : base()
		{
			if (GlobalRingWidth == 4)
				RouterType = 2;
			else if (GlobalRingWidth == 2)
				RouterType = 1;
			enable = true;
			m_n = null;
			coord.ID = ID;
			if (L2GBufferDepth != -1)			
				bufferDepth_L2G = L2GBufferDepth;
			if (G2LBufferDepth != -1)
				bufferDepth_G2L = G2LBufferDepth;
			LLinkIn = new Link[LocalRingWidth * 2];
			LLinkOut = new Link[LocalRingWidth * 2];
			GLinkIn = new Link[2 * GlobalRingWidth];
			GLinkOut = new Link[2 * GlobalRingWidth];
			Q_G2L = new Queue<Flit>[2 * GlobalRingWidth];
			Q_L2G = new Queue<Flit>[LocalRingWidth * 2];
			this.GWidth = GlobalRingWidth;
			this.LWidth = LocalRingWidth;
			// for livelock freedom
			local_observer = new Flit[2 * LWidth];
			global_observer = new Flit[2 * GWidth];
			local_preserve = new Flit[2 * LWidth];
			global_preserve = new Flit[2 * GWidth];
			local_obCounter = new int[2 * LWidth];
			global_obCounter = new int[2 * GWidth];
			local_loopCounter = new int[2 * LWidth];
			global_loopCounter = new int [2 * GWidth];

			local_starveCounter = new int[2 * LWidth];
			global_starveCounter = new int[2 * GWidth];
			localRR = 0;
			globalRR = 0;
			for (int n = 0; n < 2 * LWidth; n++)
			{
				Q_L2G[n] = new Queue<Flit>();
				local_starveCounter[n] = 0;
			}
			for (int n = 0; n < 2 * GlobalRingWidth; n++)
			{
				Q_G2L[n] = new Queue<Flit>();
				global_starveCounter[n] = 0;
			}
			if (Config.simpleLivelock)
				switch (Config.topology)
				{
					case Topology.HR_4drop : {local_loopCycle = 5; global_loopCycle = 8; break;}
					case Topology.HR_8drop : {local_loopCycle = 6; global_loopCycle = 16; break;}
					case Topology.HR_16drop : {local_loopCycle = 8; global_loopCycle = 16; break;}
				}
		}
Beispiel #4
0
    	public Router_Node(Coord myCoord)
            : base(myCoord)
        {
        	// the node Router is just a Rong node. A Flit gets ejected or moves straight forward
        	linkOut = new Link[2];
        	linkIn = new Link[2];
        	m_injectSlot_CW = null;
        	m_injectSlot_CCW = null;
			throttle[ID] = false;
			starved[ID] = false;
			starveCounter = 0;
        }
Beispiel #5
0
        public Router_Node(RC_Coord RC_c, Coord c) : base(c)
        {
        	linkOut = new Link[2];
        	linkIn = new Link[2];
        	m_injectSlot_CW = null;
        	m_injectSlot_CCW = null;
			ejectBuffer = new Queue<Flit> [2];
			for (int i = 0; i < 2; i++)
				ejectBuffer[i] = new Queue<Flit>();
			throttle[ID] = false;
			starved[ID] = false;
			starveCounter = 0;
        }
Beispiel #6
0
      	public override void setup()
       	{
            if (Config.bBufferedRing)
                nodeRouters = new Router_Node_Buffer[Config.N];
            else
                nodeRouters = new Router_Node[Config.N];

            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
           	{
                Coord c = new Coord(n);
                RC_Coord RC_c = new RC_Coord(n);

                nodes[n] = new Node(mapping, c);
                if (Config.bBufferedRing)
                    nodeRouters[n] = new Router_Node_Buffer(RC_c, c);
                else
                    nodeRouters[n] = new Router_Node(RC_c, c);
                nodes[n].setRouter(nodeRouters[n]);
                nodeRouters[n].setNode(nodes[n]);
            }
            // connect the network with Links
            for (int n = 0; n < Config.N; n++)
            {
				int next = (n + 1) % Config.N;
				Link dirA = new Link(Config.router.switchLinkLatency - 1);
				Link dirB = new Link(Config.router.switchLinkLatency - 1);
				links.Add(dirA);
				links.Add(dirB);
				nodeRouters[n].linkOut[CW] = dirA;
				nodeRouters[next].linkIn[CW] = dirA;
				nodeRouters[n].linkIn[CCW] = dirB;
				nodeRouters[next].linkOut[CCW] = dirB;
			}
       	}
Beispiel #7
0
		public Router_IRI(int ID) : base()
		{
			coord.ID = ID;
			for (int n = 0; n < 2; n ++)
			{
				gringBuffer[n] = new Queue<Flit>();
				lringBuffer[n] = new Queue<Flit>();
				g2lBuffer[n] = new Queue<Flit>();
				l2gBuffer[n] = new Queue<Flit>();
			}
			LLinkIn = new Link[2];
			GLinkIn = new Link[2];
			LLinkOut = new Link[2];
			GLinkOut = new Link[2];
			for (int n = 0; n < 4; n++)
			{
				lcounter[n] = depth;
				gcounter[n] = depth;
			}
		}
Beispiel #8
0
        public Router_Flit_Ctlr_InjectPrio(Coord myCoord)
            : base(myCoord)
        {
            swapLink = new Link[INPUT_NUM];

            for (int i = 0; i < INPUT_NUM; i++)
                swapLink[i] = new Link(0,0,0); // a single cycle link
        }
Beispiel #9
0
        public void ftflySetup()
        {
            if (Config.router.algorithm != RouterAlgorithm.DR_FLIT_SWITCHED_OLDEST_FIRST
                    && Config.router.algorithm != RouterAlgorithm.DR_AFC
                    && Config.router.algorithm != RouterAlgorithm.DR_FLIT_SWITCHED_CALF)
                throw new Exception(String.Format("Flattened butteryfly network does not support {0}", Config.router.algorithm));

            routers = new Router[Config.N];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                routers[n] = MakeRouter(c);
                nodes[n].setRouter(routers[n]);
                routers[n].setNode(nodes[n]);
            }

            // create the Golden manager
            golden = new Golden();

            if (Config.RouterEvaluation)
                return;

            // connect the network with Links
            for (int n = 0; n < Config.N; n++)
            {
                int x, y;
                Coord.getXYfromID(n, out x, out y);
#if DEBUG
                Console.WriteLine("NETWORK SETUP: coord ({0},{1}) ID {2}",x,y,n);
#endif
                // inter-router links
                for (int dir = 0; dir < 8; dir++)
                {
                    //if same coordinates
                    if(dir==x)
                        continue;
                    if(dir>=4 && dir%4==y)
                        continue;

                    int oppDir = (dir<4)?(x):(4+y);// direction from neighbor's perspective

                    // determine neighbor's coordinates
                    int x_, y_;
                    switch (dir)
                    {
                        case Simulator.DIR_Y_0: x_ = x; y_ = 0;break;
                        case Simulator.DIR_Y_1: x_ = x; y_ = 1; break;
                        case Simulator.DIR_Y_2: x_ = x; y_ = 2; break;
                        case Simulator.DIR_Y_3: x_ = x; y_ = 3; break;
                        case Simulator.DIR_X_0: x_ = 0; y_ = y; break;
                        case Simulator.DIR_X_1: x_ = 1; y_ = y; break;
                        case Simulator.DIR_X_2: x_ = 2; y_ = y; break;
                        case Simulator.DIR_X_3: x_ = 3; y_ = y; break;
                        default: continue;
                    }
                    // mesh, not torus: detect edge
                    // This part is for torus setup
                    if (x_ < 0 || x_ >= X || y_ < 0 || y_ >= Y)
                    {
                        if (Config.edge_loop)
                        {
                            Link edgeL = new Link(Config.router.linkLatency - 1, n, dir);
                            links.Add(edgeL);

                            routers[Coord.getIDfromXY(x, y)].linkOut[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].linkIn[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].neighbors++;
                            throw new Exception("FTFLY shouldn't hit a torus network setup(edge_loop=true).");
                        }

                        continue;
                    }

                    // ensure no duplication by handling a link at the lexicographically
                    // first router
                    // for flattened butterfly, it's fine cuz it's going to overwrite it
                    if (x_ < x || (x_ == x && y_ < y)) continue;

                    //Console.WriteLine("dst ({0},{1})",x_,y_);

                    /* The setup is row wise going upward */
                    int link_lat=Config.router.linkLatency-1;

                    // Extra latency to links that have longer hops.
                    if(Math.Abs(x-x_)>1)
                        link_lat+=Math.Abs(x-x_);
                    if(Math.Abs(y-y_)>1)
                        link_lat+=Math.Abs(y-y_);

                    // an extra cycle on router b/c of higher radix routers
                    // for bless. However, this extra cycle is modeled in
                    // chipper by having a larger sorting network.
                    if (Config.router.algorithm != RouterAlgorithm.DR_FLIT_SWITCHED_CALF)
                        link_lat++;

                    Link dirA = new Link(link_lat, n, dir);
                    Link dirB = new Link(link_lat, n, dir);
                    links.Add(dirA);
                    links.Add(dirB);

                    // link 'em up
                    routers[Coord.getIDfromXY(x, y)].linkOut[dir] = dirA;
                    routers[Coord.getIDfromXY(x_, y_)].linkIn[oppDir] = dirA;

                    routers[Coord.getIDfromXY(x, y)].linkIn[dir] = dirB;
                    routers[Coord.getIDfromXY(x_, y_)].linkOut[oppDir] = dirB;

                    routers[Coord.getIDfromXY(x, y)].neighbors++;
                    routers[Coord.getIDfromXY(x_, y_)].neighbors++;

                    routers[Coord.getIDfromXY(x, y)].neigh[dir] = routers[Coord.getIDfromXY(x_, y_)];
                    routers[Coord.getIDfromXY(x_, y_)].neigh[oppDir] = routers[Coord.getIDfromXY(x, y)];
    
                    // DONE CARE for ftfly
                    if (Config.router.algorithm == RouterAlgorithm.DR_SCARAB)
                    {
                        for (int wireNr = 0; wireNr < Config.nack_nr; wireNr++)
                        {
                            Link nackA = new Link(Config.nack_linkLatency - 1, n, dir);
                            Link nackB = new Link(Config.nack_linkLatency - 1, n, dir);
                            links.Add(nackA);
                            links.Add(nackB);
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackOut[dir * Config.nack_nr + wireNr] = nackA;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackIn[oppDir * Config.nack_nr + wireNr] = nackA;

                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackIn[dir * Config.nack_nr + wireNr] = nackB;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackOut[oppDir * Config.nack_nr + wireNr] = nackB;
                        }
                    }
                }
            }
            for (int n = 0; n < Config.N; n++)
            {
               int x, y;
               Coord.getXYfromID(n, out x, out y);
               //Console.WriteLine("router {0}-({1},{2}):{3}",n,x,y,routers[n].neighbors); 
            }
        }
        public override void setup()
        {
            // boilerplate
            nodes = new Node[Config.N];
            cache = new CmpCache();
            ParseFinish(Config.finish);
            workload = new Workload(Config.traceFilenames);
            mapping = new NodeMapping_AllCPU_SharedCache();

            links = new List<Link>();
            _routers = new BufRingNetwork_Router[Config.N];

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                _routers[n] = new BufRingNetwork_Router(c);
                _routers[n].setNode(nodes[n]);
                nodes[n].setRouter(_routers[n]);
            }

            int B = Config.bufrings_branching;

            // create the NICs and IRIs
            _nics = new BufRingNetwork_NIC[Config.N * Config.bufrings_n];
            _iris = new BufRingNetwork_IRI[B * Config.bufrings_n];

            // for each copy of the network...
            for (int copy = 0; copy < Config.bufrings_n; copy++) {

                // for each local ring...
                for (int ring = 0; ring < B; ring++) {

                    // create global ring interface
                    _iris[copy*B + ring] = new BufRingNetwork_IRI(ring);

                    // create local NICs (ring stops)
                    for (int local = 0; local < B; local++)
                        _nics[copy*Config.N + ring*B + local] = new BufRingNetwork_NIC(ring, local);
                    // connect with links
                    for (int local = 1; local < B; local++)
                    {
                        Link l = new Link(Config.bufrings_locallat - 1);
                        links.Add(l);
                        _nics[copy*Config.N + ring*B + local - 1].setOutput(l,
                                _nics[copy*Config.N + ring*B + local]);
                        _nics[copy*Config.N + ring*B + local].setInput(l);
                    }
                    Link iriIn = new Link(Config.bufrings_locallat - 1), iriOut = new Link(Config.bufrings_locallat - 1);
                    links.Add(iriIn);
                    links.Add(iriOut);
                    _nics[copy*Config.N + ring*B + B-1].setOutput(iriIn,
                            _iris[copy*B + ring]);
                    _nics[copy*Config.N + ring*B + 0].setInput(iriOut);

                    _iris[copy*B + ring].setLocalInput(iriIn);
                    _iris[copy*B + ring].setLocalOutput(iriOut,
                            _nics[copy*Config.N + ring*B + 0]);

                }

                // connect IRIs with links to make up global ring
                for (int ring = 0; ring < B; ring++) {
                    Link globalLink = new Link(Config.bufrings_globallat - 1);
                    links.Add(globalLink);
                    _iris[copy*B + ring].setGlobalOutput(globalLink,
                            _iris[copy*B + (ring+1)%B]);
                    _iris[copy*B + (ring+1)%B].setGlobalInput(globalLink);
                }

                // add the corresponding NIC to each node/router
                for (int id = 0; id < Config.N; id++) {
                    int ring, local;
                    BufRingNetwork_NIC.Map(id, out ring, out local);

                    _routers[id].addNIC(_nics[copy * Config.N + ring*B + local]);
                    _nics[copy * Config.N + ring*B + local].setRouter(_routers[id]);
                }
            }

        }
Beispiel #11
0
        public override void setup()
        {
            nodeRouters = new Router_Node[Config.N];
            connectRouters = new Router_Connect[Config.N / 2]; // some of the connectRouters may be disabled
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
           {
                Coord c = new Coord(n);
                RC_Coord RC_c = new RC_Coord(n);

                nodes[n] = new Node(mapping, c);
                nodeRouters[n] = new Router_Node(RC_c, c);
                nodes[n].setRouter(nodeRouters[n]);
                nodeRouters[n].setNode(nodes[n]);
            }
            // connectRouters are numbered by sweeping x, with y increase in steps
            // disable the routers not needed here. Different topologies can be realised. (mesh, torus)
            for (int n = 0; n < Config.N / 2 ; n++)
            {
            	connectRouters[n] = new Router_Connect(n);
				/*if (n == 0 || n == 1 || n == 2 || n == 3 || 
            		n == 32 || n == 33 || n == 34 || n == 35)
            		connectRouters[n].enable = false;
            	if (n == 4 || n == 12 || n == 20 || n == 28)
            		connectRouters[n].enable = false;*/
            }
			if(Config.RC_mesh)
			{
				for (int i = 0; i < Config.network_nrX / 2; i++)
					connectRouters[i].enable = false;
				for (int i = 0; i < Config.network_nrY / 2; i++)
					connectRouters[Config.network_nrX * i + Config.network_nrX / 2].enable = false;
			}
			if(Config.RC_Torus)
			{
				// all connection Routers are enabled. Both horizontally and vertically. 
				; 
			}
			if (Config.RC_x_Torus)
			{
				for (int i = 0; i < Config.network_nrX / 2; i++)
					connectRouters[i].enable = false;
			}

//			Console.WriteLine("test");
            if (Config.RouterEvaluation)
                return;

            // connect the network with Links
            for (int y = 0; y < Y / 2; y++)
            {
            	for (int x = 0; x < X / 2; x++)
            	{
            		for (int z = 0; z < 4; z++)
            		{
            			int nextCRouter = -1;
						int preCRouter = -1;
            			switch (z)
            			{
            				case 0 : {nextCRouter = x + X*y + X/2; preCRouter = x + X*y; break;}
            				case 1 : {nextCRouter = (x + X*(y+1)) % (Config.N/2); preCRouter = x + X*y + X/2; break;}
            				case 2 : {nextCRouter = (x+1) % (X/2) + X*y + X/2; preCRouter = (x + X*(y+1)) % (Config.N/2); break;}
            				case 3 : {nextCRouter = x + X*y; preCRouter = (x+1) % (X/2) + X*y + X/2; break;}
            			}
						

		        		if (connectRouters[nextCRouter].enable) // clockwise: the connectRouter next to z = 0
		        		{	
		        			Link dirA = new Link(Config.router.linkLatency_N2R - 1);
		        			Link dirB = new Link(Config.router.linkLatency_N2R - 1);
		        			links.Add(dirA);
		        			links.Add(dirB);
							int port = ((z-1) < 0) ? z + 3 : z - 1;
						//	Console.WriteLine("x:{0},y:{1},z:{2}, ID:{3}", x, y, z, RC_Coord.getIDfromXYZ(x, y, z));
						//	Console.WriteLine("node:{0}, next_id:{1}, port{2}", RC_Coord.getIDfromXYZ(x, y, z), nextCRouter, port);
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkOut[CW] = dirA;							
		        			connectRouters[nextCRouter].linkIn[port] = dirA;
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkIn[CCW] = dirB;
		        			connectRouters[nextCRouter].linkOut[port] = dirB;
		        		}
		        		else  // the router is not enabled : does not exist
		        		{
		        			Link dirA = new Link(Config.router.linkLatency_N2N - 1);
		        			Link dirB = new Link(Config.router.linkLatency_N2N - 1);
		        			links.Add(dirA);
		        			links.Add(dirB);
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkOut[CW] = dirA;
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, (z+1) % 4)].linkIn[CW] = dirA;
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkIn[CCW] = dirB;
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, (z+1) % 4)].linkOut[CCW] = dirB;
							//Console.WriteLine("node:{0}, wire to node:{1}", RC_Coord.getIDfromXYZ(x, y, z), RC_Coord.getIDfromXYZ(x, y, (z+1) % 4));
		        		}		        		
		        		if (connectRouters[preCRouter].enable)
		        		{
		        			Link dirA = new Link(Config.router.linkLatency_N2R - 1);
		        			Link dirB = new Link(Config.router.linkLatency_N2R - 1);
		        			links.Add(dirA);
		        			links.Add(dirB);
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkOut[CCW] = dirA;
		        			connectRouters[preCRouter].linkIn[(z+1) % 4] = dirA;
		        			nodeRouters[RC_Coord.getIDfromXYZ(x, y, z)].linkIn[CW] = dirB;
		        			connectRouters[preCRouter].linkOut[(z+1) % 4] = dirB;
							//Console.WriteLine("node:{0}, pre_id:{1}, port{2}", RC_Coord.getIDfromXYZ(x, y, z), preCRouter, port);
		        		}
            		}
            	}
            }
			
        }
Beispiel #12
0
        public void setup()
        {
            routers = new Router[Config.N * (1 + ((Config.RingRouter) ? Config.nrConnections : 0))];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();
            
            ringRouter = new RingRouter[Config.N * (1 + Config.nrConnections)];

            /*if(Config.disjointRings)
            {
            	bool ignoreCase = true;
            	if (String.Compare(Config.disjointConnection, "mesh", ignoreCase) == 0)
            		connector = new RingRouter[Config.N]; // Fix later
            	else if (String.Compare(Config.disjointConnection, "torus", ignoreCase) == 0)
            		connector = new RingRouter[Config.N];
            	else if (String.Compare(Config.disjointConnection, "ring", ignoreCase) == 0)
            		connector = new RingRouter[Config.N]; // Fix later
            }*/

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                
                if (!Config.RingRouter)
                {
                	routers[n] = MakeRouter(c);
                	nodes[n].setRouter(routers[n]);
                	routers[n].setNode(nodes[n]);
                }
            }
            /*if (Config.disjointRings)
	            for (int n = 0; n < 8; n++)
	            {
	              	connectors[n] = MakeConnector(n);
	            }
			*/
            // create the Golden manager
            golden = new Golden();

            if (Config.RouterEvaluation)
                return;
			
            /*
             * Ring width = node width of each ring
             * Ring height = node height of each ring
             * NrConnections = number of connections routers per node
             * 
             */
            if (Config.RingRouter)
            {
            	int nrPlaceholdersPerNetwork = Config.nrPlaceholders / 2;
                int nrNodesPerRing = (Config.ringWidth * 2 + Config.ringHeight * 2 - 4);
                int nrConnectPerRing = nrNodesPerRing * Config.nrConnections;
                int nrItemInRing = nrConnectPerRing + nrNodesPerRing;
                
                #if DEBUG
                	Console.WriteLine("NrNodesPerRing = {0}, NrConectPerRing = {1}, NrItemInRing = {2}", nrNodesPerRing, nrConnectPerRing, nrItemInRing);
                #endif
                int prevID = -1;
                
                // TODO: Check edge conditions of for loops.  Currently only using for 2x2 ring.
				bool clockwise = false;
                for (int y = 0; y < Config.network_nrY / Config.ringHeight; y++) {
                    for (int x = 0; x < Config.network_nrX / Config.ringWidth; x++) {
                    	if (Config.alternateDir)
                    	{
                    		clockwise = !clockwise;
                    	}
                    	else
                    	{
                    		clockwise = true;
                    	}
                    	prevID = -1;
                    	
                        for (int z = 0; z < nrItemInRing; z++)
                        {
                            int ringID = RingCoord.getIDfromXYZ(x, y, z);
                            int nodeID = RingCoord.getIDfromRingID(ringID);
                            RingCoord rc = new RingCoord(ringID);
                            
                            #if DEBUG
                            	Console.WriteLine("ringID = {0}, nodeID = {1}, prevID = {2}", ringID, nodeID, prevID);
                            #endif
                            
                            ringRouter[ringID] = makeNodeRouter(rc); 
                            
							ringRouter[ringID].clockwise = clockwise;
							
													                            
							routers[nodeID] = ringRouter[ringID];
							nodes[nodeID].setRouter(ringRouter[ringID]);
							ringRouter[ringID].setNode(nodes[nodeID]);

                            // Link them up if its not the first node in the loop
                            if (prevID != -1)
                            {
                            	Link prev = new Link(Config.router.linkLatency - 1);
                            	links.Add(prev);
                            	
                            	#if DEBUG
                            		Console.WriteLine("Connecting prev{0} & current{1} with link {2}", prevID, ringID, prev);
                            	#endif
                            	
                            	if (clockwise)
                            	{
                            		ringRouter[prevID].linkOut[Simulator.DIR_CW] = prev;
                            		ringRouter[ringID].linkIn[Simulator.DIR_CCW] = prev;
                            	}
                            	else
                            	{
                            		ringRouter[prevID].linkIn[Simulator.DIR_CW]   = prev;
                            		ringRouter[ringID].linkOut[Simulator.DIR_CCW] = prev;
                            	}
                            }
                            
                            prevID = ringID;
                            
                            // Connection routers
                            for (int i = 0; i < Config.nrConnections; i++)
                            {
                                z++;
                                int connectID = RingCoord.getIDfromXYZ(x, y, z);
                                int connect2ID = RingCoord.getIDfromRingID(connectID);
                                RingCoord connectRC = new RingCoord(connectID);
                                
                                ringRouter[connectID] = makeConnection(connectRC);
								ringRouter[connectID].clockwise = clockwise;
								
								
								routers[connect2ID] = ringRouter[connectID];
								
                                Link prev_link = new Link(Config.router.linkLatency - 1);
                                links.Add(prev_link);
                                
                                #if DEBUG
                            		Console.WriteLine("Connecting prev{0} & connect{1} with link {2}", prevID, connectID, prev_link);
                                #endif
                                
                                if (clockwise)
                            	{
                            		ringRouter[prevID].linkOut[Simulator.DIR_CW] = prev_link;
                            		ringRouter[connectID].linkIn[Simulator.DIR_CCW] = prev_link;
                            	}
                            	else
                            	{
                            		ringRouter[prevID].linkIn[Simulator.DIR_CW]   = prev_link;
                            		ringRouter[connectID].linkOut[Simulator.DIR_CCW] = prev_link;
                            	}
                                
                                prevID = connectID;
                            }
                        }
                        
                        // Finish ring
                        int startID = RingCoord.getIDfromXYZ(x, y, 0);
                       	Link finish_link = new Link(Config.router.linkLatency - 1); 
                       	links.Add(finish_link);
                        
                        #if DEBUG
                        Console.WriteLine("Finishing connecting prev{0} & start{1} with link {2}", prevID, startID, finish_link);
                        #endif
                        
                        if (clockwise)
                    	{
                    		ringRouter[prevID].linkOut[Simulator.DIR_CW]  = finish_link;
                    		ringRouter[startID].linkIn[Simulator.DIR_CCW] = finish_link;
                    	}
                    	else
                    	{
                    		ringRouter[prevID].linkIn[Simulator.DIR_CW]    = finish_link;
                    		ringRouter[startID].linkOut[Simulator.DIR_CCW] = finish_link;
                    	} 
                    }
                }
				
                
                if (Config.nrConnections > 1)
                	throw new Exception("Check the rest of the code before you continue making more connections");
				
				#if DEBUG
					Console.WriteLine("Starting connections....");
				#endif
				
                int connectionDir, oppDir;
                int oppX;
                int oppY;
                int oppZ;
               	int currentID, oppID;
                
                for (int y = 0; y < Config.network_nrY / Config.ringHeight; y++) {
					for (int x = 0; x < Config.network_nrX / Config.ringWidth; x++) {
                	 	for (int z = 0; z < nrItemInRing; z++) {
                	 		for (int i = 0; i < Config.nrConnections; i++) {
                	 			//TODO: reconfigure for more than a 4x4 network and/or more connections
                	 			
                	 			z++;
                	 			connectionDir = -1;
                	 			oppDir = -1;
                	 			currentID = -1;
                	 			oppID = -1;
                	 			oppX = x;
                	 			oppY = y;
                	 			oppZ = z + 4;
                	 			
                	 			if(oppZ > nrItemInRing)
                	 				oppZ -= nrItemInRing;
 								
                	 			currentID  = RingCoord.getIDfromXYZ(x, y, z);
	 							
                    			
                    			#if DEBUG
                	 				Console.WriteLine("Current Coord ({0},{1},{2})", x, y, z);
                	 			#endif
                	 			
                	 			int switchNum = (z - 1) / 2;
                	 			switch (switchNum)
                	 			{
                	 				case 0: connectionDir = Simulator.DIR_UP;
                	 						oppDir = Simulator.DIR_DOWN;
                	 						oppY = y - 1;
                	 						
                	 						#if DEBUG
                	 							Console.WriteLine("0");
                	 						#endif
                	 						
                	 						if (oppY < 0)
                	 						{
                	 							oppY = Config.network_nrY / Config.ringHeight - 1;
                	 							
                	 							// ensure no duplication by handling a link at the lexicographically
                    							// first router
                    							if (oppX < x || (oppX == x && oppY < y)) continue;
                	 							
                	 							if (!Config.torus)
                	 							{
                	 								//Lower the link latency because this router is not being used
                	 								oppID = RingCoord.getIDfromXYZ(oppX, oppY, oppZ);
													int nextZ = ((z + 1) > nrItemInRing - 1) ? 0 : z+1;
													int prevZ = ((z - 1) < 0) ? nrItemInRing - 1 : z-1;
													int nextID = RingCoord.getIDfromXYZ(x, y, nextZ);
													int previousID = RingCoord.getIDfromXYZ(x, y, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, currentID {4}, previousID {5}", oppX, oppY, oppZ, nextID, currentID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[currentID].linkIn[Simulator.DIR_CCW] = ringRouter[currentID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[currentID].linkIn[Simulator.DIR_CW] = ringRouter[currentID].linkOut[Simulator.DIR_CCW];
													}
													
													nextZ = ((oppZ + 1) > nrItemInRing - 1) ? 0 : oppZ+1;
													prevZ = ((oppZ - 1) < 0) ? nrItemInRing - 1 : oppZ-1;
													nextID = RingCoord.getIDfromXYZ(oppX, oppY, nextZ);
													previousID = RingCoord.getIDfromXYZ(oppX, oppY, prevZ);
															
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, oppID {4}, previousID {5}", oppX, oppY, oppZ, nextID, oppID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {													
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[oppID].linkIn[Simulator.DIR_CCW] = ringRouter[oppID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[oppID].linkIn[Simulator.DIR_CW] = ringRouter[oppID].linkOut[Simulator.DIR_CCW];
													}
													ringRouter[currentID] = null;
													ringRouter[oppID] = null;
       	 								    		continue;
                	 							}
                	 						}
                	 							
                	 						break;
                	 						
                	 				case 1: connectionDir = Simulator.DIR_RIGHT;
                	 						oppDir = Simulator.DIR_LEFT;
                	 						oppX = x + 1;
                	 						
                	 						#if DEBUG
                	 							Console.WriteLine("1");
                	 						#endif
                	 						
                	 						if (oppX >= Config.network_nrX / Config.ringWidth)
                	 						{
                	 							oppX = 0;
                	 							
                	 							// ensure no duplication by handling a link at the lexicographically
                    							// first router
                    							if (oppX < x || (oppX == x && oppY < y)) continue;
                    							
                	 							if (!Config.torus)
                	 							{
                	 								//Lower the link latency because this router is not being used
                	 								oppID = RingCoord.getIDfromXYZ(oppX, oppY, oppZ);
													int nextZ = ((z + 1) > nrItemInRing - 1) ? 0 : z+1;
													int prevZ = ((z - 1) < 0) ? nrItemInRing - 1 : z-1;
													int nextID = RingCoord.getIDfromXYZ(x, y, nextZ);
													int previousID = RingCoord.getIDfromXYZ(x, y, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, currentID {4}, previousID {5}", oppX, oppY, oppZ, nextID, currentID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[currentID].linkIn[Simulator.DIR_CCW] = ringRouter[currentID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[currentID].linkIn[Simulator.DIR_CW] = ringRouter[currentID].linkOut[Simulator.DIR_CCW];
													}
													
													nextZ = ((oppZ + 1) > nrItemInRing - 1) ? 0 : oppZ+1;
													prevZ = ((oppZ - 1) < 0) ? nrItemInRing - 1 : oppZ-1;
													nextID = RingCoord.getIDfromXYZ(oppX, oppY, nextZ);
													previousID = RingCoord.getIDfromXYZ(oppX, oppY, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, oppID {4}, previousID {5}", oppX, oppY, oppZ, nextID, oppID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[oppID].linkIn[Simulator.DIR_CCW] = ringRouter[oppID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[oppID].linkIn[Simulator.DIR_CW] = ringRouter[oppID].linkOut[Simulator.DIR_CCW];
													}
													ringRouter[currentID] = null;
													ringRouter[oppID] = null;
       	 								    		continue;
                	 							}
                	 						}
                	 							
                	 						break;	

                	 				case 2: connectionDir = Simulator.DIR_DOWN;
                	 						oppDir = Simulator.DIR_UP;
                	 						oppY = y + 1;
                	 						
                	 						#if DEBUG
                	 							Console.WriteLine("2");
                	 						#endif
                	 						
                	 						if (oppY >= Config.network_nrY / Config.ringHeight)
                	 						{
                	 							oppY = 0;
                	 							
                	 							// ensure no duplication by handling a link at the lexicographically
                    							// first router
                    							if (oppX < x || (oppX == x && oppY < y)) continue;
                	 							
                	 							if (!Config.torus)
                	 							{
                	 								//Lower the link latency because this router is not being used
                	 								oppID = RingCoord.getIDfromXYZ(oppX, oppY, oppZ);
													int nextZ = ((z + 1) > nrItemInRing - 1) ? 0 : z+1;
													int prevZ = ((z - 1) < 0) ? nrItemInRing - 1 : z-1;
													int nextID = RingCoord.getIDfromXYZ(x, y, nextZ);
													int previousID = RingCoord.getIDfromXYZ(x, y, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, currentID {4}, previousID {5}", oppX, oppY, oppZ, nextID, currentID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[currentID].linkIn[Simulator.DIR_CCW] = ringRouter[currentID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[currentID].linkIn[Simulator.DIR_CW] = ringRouter[currentID].linkOut[Simulator.DIR_CCW];
													}
													
													nextZ = ((oppZ + 1) > nrItemInRing - 1) ? 0 : oppZ+1;
													prevZ = ((oppZ - 1) < 0) ? nrItemInRing - 1 : oppZ-1;
													nextID = RingCoord.getIDfromXYZ(oppX, oppY, nextZ);
													previousID = RingCoord.getIDfromXYZ(oppX, oppY, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, oppID {4}, previousID {5}", oppX, oppY, oppZ, nextID, oppID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[oppID].linkIn[Simulator.DIR_CCW] = ringRouter[oppID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[oppID].linkIn[Simulator.DIR_CW] = ringRouter[oppID].linkOut[Simulator.DIR_CCW];
													}
													ringRouter[currentID] = null;
													ringRouter[oppID] = null;
       	 								    		continue;
                	 							}
                	 						}
                	 							
                	 						break;

                	 				case 3: connectionDir = Simulator.DIR_LEFT;
                	 				
                	 						#if DEBUG
                	 							Console.WriteLine("3");
                	 						#endif
                	 						
                	 						oppDir = Simulator.DIR_RIGHT;
                	 						oppX = x - 1;
                	 				        if (oppX < 0)
                	 						{
                	 							oppX = Config.network_nrX / Config.ringWidth - 1;
										
        										// ensure no duplication by handling a link at the lexicographically
                    							// first router
                    							if (oppX < x || (oppX == x && oppY < y)) continue;
                    							
                    							if (!Config.torus)
                	 							{
                	 								//Lower the link latency because this router is not being used
                	 								oppID = RingCoord.getIDfromXYZ(oppX, oppY, oppZ);
													int nextZ = ((z + 1) > nrItemInRing - 1) ? 0 : z+1;
													int prevZ = ((z - 1) < 0) ? nrItemInRing - 1 : z-1;
													int nextID = RingCoord.getIDfromXYZ(x, y, nextZ);
													int previousID = RingCoord.getIDfromXYZ(x, y, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, currentID {4}, previousID {5}", oppX, oppY, oppZ, nextID, currentID, previousID);
													#endif
													
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[currentID].linkIn[Simulator.DIR_CCW] = ringRouter[currentID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[currentID].linkIn[Simulator.DIR_CW] = ringRouter[currentID].linkOut[Simulator.DIR_CCW];
													}
													
													nextZ = ((oppZ + 1) > nrItemInRing - 1) ? 0 : oppZ+1;
													prevZ = ((oppZ - 1) < 0) ? nrItemInRing - 1 : oppZ-1;
													nextID = RingCoord.getIDfromXYZ(oppX, oppY, nextZ);
													previousID = RingCoord.getIDfromXYZ(oppX, oppY, prevZ);
													
													#if DEBUG
														Console.WriteLine("opp({0},{1},{2})\tnextID {3}, oppID {4}, previousID {5}", oppX, oppY, oppZ, nextID, oppID, previousID);
													#endif	
																
													if (ringRouter[nextID].clockwise) {
														ringRouter[nextID].linkIn[Simulator.DIR_CCW] = ringRouter[previousID].linkOut[Simulator.DIR_CW];
														ringRouter[oppID].linkIn[Simulator.DIR_CCW] = ringRouter[oppID].linkOut[Simulator.DIR_CW];
													}
													else {
														ringRouter[previousID].linkIn[Simulator.DIR_CW] = ringRouter[nextID].linkOut[Simulator.DIR_CCW];
														ringRouter[oppID].linkIn[Simulator.DIR_CW] = ringRouter[oppID].linkOut[Simulator.DIR_CCW];
													}
													ringRouter[currentID] = null;
													ringRouter[oppID] = null;
       	 								    		continue;
                	 							}
                	 						}
                	 						break;	
                	 						
                	 				default: throw new Exception("Ring too big for current system");
                	 			}
                	 			
								oppID = RingCoord.getIDfromXYZ(oppX, oppY, oppZ);
								
								// ensure no duplication by handling a link at the lexicographically
                    			// first router
                    			if (oppX < x || (oppX == x && oppY < y)) continue;													
								#if DEBUG
									Console.WriteLine("Creating normal link\topp({0},{1},{2})\toppID {3} dir {4} : oppdir {5}", oppX, oppY, oppZ, oppID, connectionDir, oppDir);
								#endif	
								
								Link linkA = new Link(Config.router.linkLatency - 1);
								Link linkB = new Link(Config.router.linkLatency - 1);
								links.Add(linkA);
								links.Add(linkB);
								
								#if DEBUG
                	 				Console.WriteLine("-------------------------------------------current{0} opp{1}", currentID, oppID);
								#endif
								
								((Connector)ringRouter[currentID]).connectionDirection    = connectionDir;
								((Connector)ringRouter[oppID]).connectionDirection        = oppDir;
								
								ringRouter[currentID].linkOut[connectionDir] = linkA;
								ringRouter[oppID].linkIn[oppDir]             = linkA;
								 
								ringRouter[currentID].linkIn[connectionDir]  = linkB;
								ringRouter[oppID].linkOut[oppDir]            = linkB;		
								
								if (nrPlaceholdersPerNetwork > 0) {
									((Connector)ringRouter[currentID]).injectPlaceholder = 2;
									nrPlaceholdersPerNetwork--;
								}
                	 		}
                	 	}
                	 			
                	}
                }
                #if DEBUG
				//Verification
				for (int y = 0; y < Config.network_nrY / Config.ringHeight; y++) {
					for (int x = 0; x < Config.network_nrX / Config.ringWidth; x++) {
						Console.WriteLine("");
						for (int z = 0; z < nrItemInRing; z++) {
							int tempID = RingCoord.getIDfromXYZ(x, y, z);
							if (ringRouter[tempID] == null) continue;
							if(z % 2 == 0) Console.WriteLine("Node with clockwise = {0}", ringRouter[tempID].clockwise);
							if(z % 2 == 1) Console.WriteLine("Connector with direction {0}", ((Connector)ringRouter[tempID]).connectionDirection);
							
							if (ringRouter[tempID].clockwise) {
								for (int dir = 5; dir >= 0; dir--) {
									if(ringRouter[tempID].linkIn[dir] != null)
										Console.WriteLine("{0} | ID:{1},  \tLinkIn  Direction {2}, \tLink: {3}\t|", ringRouter[tempID], tempID, dir, ringRouter[tempID].linkIn[dir]);
								}	
								for (int dir = 0; dir < 6; dir++) {
									if(ringRouter[tempID].linkOut[dir] != null)
										Console.WriteLine("{0} | ID:{1},  \tLinkOut Direction {2}, \tLink: {3}\t|", ringRouter[tempID], tempID, dir, ringRouter[tempID].linkOut[dir]);
								}
							}
							else {
								for (int dir = 5; dir >= 0; dir--) {
									if(ringRouter[tempID].linkOut[dir] != null)
										Console.WriteLine("{0} | ID:{1},  \tLinkOut Direction {2}, \tLink: {3}\t|", ringRouter[tempID], tempID, dir, ringRouter[tempID].linkOut[dir]);
								}
								for (int dir = 0; dir < 6; dir++) {
									if(ringRouter[tempID].linkIn[dir] != null)
										Console.WriteLine("{0} | ID:{1},  \tLinkIn  Direction {2}, \tLink: {3}\t|", ringRouter[tempID], tempID, dir, ringRouter[tempID].linkIn[dir]);
								}	
							}
						}
					}
				}
				#endif
                return;
            }

            /*
			if (Config.DisjointRings)
			{
				if (Config.SeperateConnect)
				{
					if (Config.network_nrX != Config.network_nrY)
						throw new Exception("Only works with square networks");
					
					// Designed for ringSize of 2
					// And square network
					// TODO: work on different dimensions
					
					int ringLength = Config.ringSize;
					int netXLength = Config.network_nrX;
					int netYLength = Config.network_nrY;
					
					int numRings = (netYLength / ringLength) * (netXLength / ringLength);
					int numRingNodes = (ringLength * ringLength);
					
					int dirOut    = 1;
					int dirIn     = 0;
					int dirInject = 2;
					int dirEject  = 3;
					
					Link A_B   = new Link(Config.router.linkLatency - 1);
					Link B_Z1A = new Link(Config.router.linkLatency - 1);
					Link Z1A_C = new Link(Config.router.linkLatency - 1); 
					Link C_Z4B = new Link(Config.router.linkLatency - 1);
					Link Z4B_D = new Link(Config.router.linkLatency - 1);
					Link D_A   = new Link(Config.router.linkLatency - 1);
					
					Link E_F   = new Link(Config.router.linkLatency - 1);
					Link F_G   = new Link(Config.router.linkLatency - 1);
					Link G_Z2A = new Link(Config.router.linkLatency - 1);
					Link Z2A_H = new Link(Config.router.linkLatency - 1);
					Link H_Z1B = new Link(Config.router.linkLatency - 1);
					Link Z1B_E = new Link(Config.router.linkLatency - 1);
					
					Link M_Z2B = new Link(Config.router.linkLatency - 1);
					Link Z2B_N = new Link(Config.router.linkLatency - 1);
					Link N_O   = new Link(Config.router.linkLatency - 1);
					Link O_P   = new Link(Config.router.linkLatency - 1);
					Link P_Z3A = new Link(Config.router.linkLatency - 1);
					Link Z3A_M = new Link(Config.router.linkLatency - 1);
					
					Link I_Z4A = new Link(Config.router.linkLatency - 1);
					Link Z4A_J = new Link(Config.router.linkLatency - 1);
					Link J_Z3B = new Link(Config.router.linkLatency - 1);
					Link Z3B_K = new Link(Config.router.linkLatency - 1);
					Link K_L   = new Link(Config.router.linkLatency - 1);
					Link L_I   = new Link(Config.router.linkLatency - 1);
					
					Link A_B1 = new Link(Config.router.linkLatency - 1);
					Link B_A1 = new Link(Config.router.linkLatency - 1);
					
					Link A_B2 = new Link(Config.router.linkLatency - 1);
					Link B_A2 = new Link(Config.router.linkLatency - 1);
					
					Link A_B3 = new Link(Config.router.linkLatency - 1);
					Link B_A3 = new Link(Config.router.linkLatency - 1);
					
					Link A_B4 = new Link(Config.router.linkLatency - 1);
					Link B_A4 = new Link(Config.router.linkLatency - 1);
					
					links.Add(A_B);
					links.Add(B_Z1A);
					links.Add(Z1A_C);
					links.Add(C_Z4B);
					links.Add(Z4B_D);
					links.Add(D_A);
					
					links.Add(E_F);
					links.Add(F_G); 
					links.Add(G_Z2A); 
					links.Add(Z2A_H);
					links.Add(H_Z1B);
					links.Add(Z1B_E);
					
					links.Add(M_Z2B);
					links.Add(Z2B_N);
					links.Add(N_O);
					links.Add(O_P);   
					links.Add(P_Z3A);
					links.Add(Z3A_M);
					
					links.Add(I_Z4A);
					links.Add(Z4A_J);
					links.Add(J_Z3B);
					links.Add(Z3B_K);
					links.Add(K_L);
					links.Add(L_I); 
					
					links.Add(A_B1);
					links.Add(B_A1);
					
					links.Add(A_B2);
					links.Add(B_A2);
					
					links.Add(A_B3);
					links.Add(B_A3); 
					
					links.Add(A_B4);
					links.Add(B_A4);
					
					int A = Coord.getIDfromXY(0, 0);
					int B = Coord.getIDfromXY(1, 0); 
					int C = Coord.getIDfromXY(1, 1);
					int D = Coord.getIDfromXY(0, 1);
					int E = Coord.getIDfromXY(2, 0);
					int F = Coord.getIDfromXY(3, 0);
					int G = Coord.getIDfromXY(3, 1);
					int H = Coord.getIDfromXY(2, 1);
					int I = Coord.getIDfromXY(0, 2);
					int J = Coord.getIDfromXY(1, 2);
					int K = Coord.getIDfromXY(1, 3);
					int L = Coord.getIDfromXY(0, 3);
					int M = Coord.getIDfromXY(2, 2);
					int N = Coord.getIDfromXY(3, 2);
					int O = Coord.getIDfromXY(3, 3);
					int P = Coord.getIDfromXY(2, 3);
					
					int Z1A = 0;
					int Z1B = 1;
					int Z2A = 2;
					int Z2B = 3;
					int Z3A = 4;
					int Z3B = 5;
					int Z4A = 6;
					int Z4B = 7;
					
					routers[A].linkIn[dirIn]   = D_A;
					routers[A].linkOut[dirOut] = A_B;
					routers[A].neigh[dirIn]    = routers[D];
					routers[A].neigh[dirOut]   = routers[B];
					routers[A].neighbors = 2;

					routers[B].linkIn[dirIn]   = A_B;
					routers[B].linkOut[dirOut] = B_Z1A;
					routers[B].neigh[dirIn]    = routers[A];
					routers[B].neigh[dirOut]   = connectors[Z1A];
					routers[B].neighbors = 2;

					routers[C].linkIn[dirIn]   = Z1A_C;
					routers[C].linkOut[dirOut] = C_Z4B;
					routers[C].neigh[dirIn]    = connectors[Z1A];
					routers[C].neigh[dirOut]   = connectors[Z4B];
					routers[C].neighbors = 2;	
					
					routers[D].linkIn[dirIn]   = Z4B_D;
					routers[D].linkOut[dirOut] = D_A;	
					routers[D].neigh[dirIn]    = connectors[Z4B];
					routers[D].neigh[dirOut]   = routers[A];
					routers[D].neighbors = 2;
				    
				    if (Config.sameDir)
				    {
					    routers[E].linkIn[dirIn]   = Z1B_E;
						routers[E].linkOut[dirOut] = E_F;
						routers[E].neigh[dirIn]    = connectors[Z1B];
						routers[E].neigh[dirOut]   = routers[F];
						routers[E].neighbors = 2;	
						
						routers[F].linkIn[dirIn]   = E_F;
						routers[F].linkOut[dirOut] = F_G;
						routers[F].neigh[dirIn]    = routers[E];
						routers[F].neigh[dirOut]   = routers[G];
						routers[F].neighbors = 2;	
						
						routers[G].linkIn[dirIn]   = F_G;
						routers[G].linkOut[dirOut] = G_Z2A;
						routers[G].neigh[dirIn]    = routers[F];
						routers[G].neigh[dirOut]   = connectors[Z2A];
						routers[G].neighbors = 2;	
						
						routers[H].linkIn[dirIn]   = Z2A_H;
						routers[H].linkOut[dirOut] = H_Z1B;
						routers[H].neigh[dirIn]    = connectors[Z2A];
						routers[H].neigh[dirOut]   = connectors[Z1B];
						routers[H].neighbors = 2;	
						
						routers[I].linkIn[dirIn]   = L_I;
						routers[I].linkOut[dirOut] = I_Z4A;
						routers[I].neigh[dirIn]    = routers[L];
						routers[I].neigh[dirOut]   = connectors[Z4A];
						routers[I].neighbors = 2;	
						
						routers[J].linkIn[dirIn]   = Z4A_J;
						routers[J].linkOut[dirOut] = J_Z3B;
						routers[J].neigh[dirIn]    = connectors[Z4A];
						routers[J].neigh[dirOut]   = connectors[Z3B];
						routers[J].neighbors = 2;	

						routers[K].linkIn[dirIn]   = Z3B_K;
						routers[K].linkOut[dirOut] = K_L;
						routers[K].neigh[dirIn]    = connectors[Z3B];
						routers[K].neigh[dirOut]   = routers[L];
						routers[K].neighbors = 2;	
						
						routers[L].linkIn[dirIn]   = K_L;
						routers[L].linkOut[dirOut] = L_I;
						routers[L].neigh[dirIn]    = routers[K];
						routers[L].neigh[dirOut]   = routers[I];
						routers[L].neighbors = 2;
					}
					else
					{
						routers[E].linkIn[dirIn]   = E_F;
						routers[E].linkOut[dirOut] = Z1B_E;	
						routers[E].neigh[dirIn]    = routers[F]; 
						routers[E].neigh[dirOut]   = connectors[Z1B];
						routers[E].neighbors = 2;	
						
						routers[F].linkIn[dirIn]   = F_G;
						routers[F].linkOut[dirOut] = E_F;
						routers[F].neigh[dirIn]    = routers[G];
						routers[F].neigh[dirOut]   = routers[E];
						routers[F].neighbors = 2;	
						
						routers[G].linkIn[dirIn]   = G_Z2A;
						routers[G].linkOut[dirOut] = F_G;	
						routers[G].neigh[dirIn]    = connectors[Z2A];
						routers[G].neigh[dirOut]   = routers[F];
						routers[G].neighbors = 2;	
						
						routers[H].linkIn[dirIn]   = H_Z1B;
						routers[H].linkOut[dirOut] = Z2A_H;	
						routers[H].neigh[dirIn]    = connectors[Z1B];
						routers[H].neigh[dirOut]   = connectors[Z2A];
						routers[H].neighbors = 2;	
						
						routers[I].linkIn[dirIn]   = I_Z4A;
						routers[I].linkOut[dirOut] = L_I;	
						routers[I].neigh[dirIn]    = connectors[Z4A];
						routers[I].neigh[dirOut]   = routers[L];
						routers[I].neighbors = 2;
						
						routers[J].linkIn[dirIn]   = J_Z3B;
						routers[J].linkOut[dirOut] = Z4A_J;
						routers[J].neigh[dirIn]    = connectors[Z3B];
						routers[J].neigh[dirOut]   = connectors[Z4A];
						routers[J].neighbors = 2;		

						routers[K].linkIn[dirIn]   = K_L;
						routers[K].linkOut[dirOut] = Z3B_K;	
						routers[K].neigh[dirIn]    = routers[L];
						routers[K].neigh[dirOut]   = connectors[Z3B];
						routers[K].neighbors = 2;
						
						routers[L].linkIn[dirIn]   = L_I;
						routers[L].linkOut[dirOut] = K_L;	
						routers[L].neigh[dirIn]    = routers[I]; 
						routers[L].neigh[dirOut]   = routers[K];
						routers[L].neighbors = 2;
					}
					
					routers[M].linkIn[dirIn]   = Z3A_M;
					routers[M].linkOut[dirOut] = M_Z2B;	
					routers[M].neigh[dirIn]    = connectors[Z3A];
					routers[M].neigh[dirOut]   = connectors[Z2B];
					routers[M].neighbors = 2;
					
					
					routers[N].linkIn[dirIn]   = Z2B_N;
					routers[N].linkOut[dirOut] = N_O;	
					routers[N].neigh[dirIn]    = connectors[Z2B];
					routers[N].neigh[dirOut]   = routers[O];
					routers[N].neighbors = 2;
					
					routers[O].linkIn[dirIn]   = N_O;
					routers[O].linkOut[dirOut] = O_P;	
					routers[O].neigh[dirIn]    = routers[N];
					routers[O].neigh[dirOut]   = routers[P];
					routers[O].neighbors = 2;	
					
					routers[P].linkIn[dirIn]   = O_P;
					routers[P].linkOut[dirOut] = P_Z3A;	
					routers[P].neigh[dirIn]    = routers[O];
					routers[P].neigh[dirOut]   = connectors[Z3A];
					routers[P].neighbors = 2;	
					
					// Connectors
					connectors[Z1A].linkIn[dirIn]     = B_Z1A;
					connectors[Z1A].linkOut[dirOut]   = Z1A_C;
					connectors[Z1A].neigh[dirIn]      = routers[B];
					connectors[Z1A].neigh[dirOut]     = routers[C];
					connectors[Z1A].neighbors        += 2;
					
					connectors[Z2B].linkIn[dirIn]     = M_Z2B;
					connectors[Z2B].linkOut[dirOut]   = Z2B_N;
					connectors[Z2B].neigh[dirIn]      = routers[M];
					connectors[Z2B].neigh[dirOut]     = routers[N];
					connectors[Z2B].neighbors        += 2;
					
					connectors[Z3A].linkIn[dirIn]     = P_Z3A;
					connectors[Z3A].linkOut[dirOut]   = Z3A_M;
					connectors[Z3A].neigh[dirIn]      = routers[P];
					connectors[Z3A].neigh[dirOut]     = routers[M];
					connectors[Z3A].neighbors        += 2;	
						
					connectors[Z4B].linkIn[dirIn]     = C_Z4B;
					connectors[Z4B].linkOut[dirOut]   = Z4B_D;
					connectors[Z4B].neigh[dirIn]      = routers[C];
					connectors[Z4B].neigh[dirOut]     = routers[D];
					connectors[Z4B].neighbors        += 2;	
					
					if (Config.sameDir)
					{
						connectors[Z1B].linkIn[dirIn]     = H_Z1B;
						connectors[Z1B].linkOut[dirOut]   = Z1B_E;
						connectors[Z1B].neigh[dirIn]      = routers[H];
						connectors[Z1B].neigh[dirOut]     = routers[E];
						connectors[Z1B].neighbors        += 2;	
					
						connectors[Z2A].linkIn[dirIn]     = G_Z2A;
						connectors[Z2A].linkOut[dirOut]   = Z2A_H;
						connectors[Z2A].neigh[dirIn]      = routers[G];
						connectors[Z2A].neigh[dirOut]     = routers[H];
						connectors[Z2A].neighbors        += 2;	
						
						connectors[Z4A].linkIn[dirIn]     = I_Z4A;
						connectors[Z4A].linkOut[dirOut]   = Z4A_J;
						connectors[Z4A].neigh[dirIn]      = routers[I];
						connectors[Z4A].neigh[dirOut]     = routers[J];
						connectors[Z4A].neighbors        += 2;	
					
						connectors[Z3B].linkIn[dirIn]     = J_Z3B;
						connectors[Z3B].linkOut[dirOut]   = Z3B_K;	
						connectors[Z3B].neigh[dirIn]      = routers[J];
						connectors[Z3B].neigh[dirOut]     = routers[K];
						connectors[Z3B].neighbors        += 2;
					}
					else
					{
						connectors[Z1B].linkIn[dirIn]     = Z1B_E;
						connectors[Z1B].linkOut[dirOut]   = H_Z1B;
						connectors[Z1B].neigh[dirIn]      = routers[E];
						connectors[Z1B].neigh[dirOut]     = routers[H];
						connectors[Z1B].neighbors        += 2;		
					
						connectors[Z2A].linkIn[dirIn]     = Z2A_H;
						connectors[Z2A].linkOut[dirOut]   = G_Z2A;
						connectors[Z2A].neigh[dirIn]      = routers[H];
						connectors[Z2A].neigh[dirOut]     = routers[G];
						connectors[Z2A].neighbors        += 2;		
					
						connectors[Z4A].linkIn[dirIn]     = Z4A_J;
						connectors[Z4A].linkOut[dirOut]   = I_Z4A;
						connectors[Z4A].neigh[dirIn]      = routers[J];
						connectors[Z4A].neigh[dirOut]     = routers[I];
						connectors[Z4A].neighbors        += 2;		
					
						connectors[Z3B].linkIn[dirIn]     = Z3B_K;
						connectors[Z3B].linkOut[dirOut]   = J_Z3B;	
						connectors[Z3B].neigh[dirIn]      = routers[K];
						connectors[Z3B].neigh[dirOut]     = routers[J];
						connectors[Z3B].neighbors        += 2;	
					}
					
					connectors[Z1A].linkIn[dirInject] = B_A1;
					connectors[Z1A].linkOut[dirEject] = A_B1;
					connectors[Z1A].neigh[dirIn]      = connectors[Z1B];
					connectors[Z1A].neigh[dirOut]     = connectors[Z1B];
					connectors[Z1A].neighbors        += 2;	
						
					connectors[Z1B].linkIn[dirInject] = A_B1;
					connectors[Z1B].linkOut[dirEject] = B_A1;	
					connectors[Z1B].neigh[dirIn]      = connectors[Z1A];
					connectors[Z1B].neigh[dirOut]     = connectors[Z1A];
					connectors[Z1B].neighbors        += 2;	
					
					connectors[Z2A].linkIn[dirInject] = B_A2;
					connectors[Z2A].linkOut[dirEject] = A_B2;	
					connectors[Z2A].neigh[dirIn]      = connectors[Z2B];
					connectors[Z2A].neigh[dirOut]     = connectors[Z2B];
					connectors[Z2A].neighbors        += 2;	
					
					connectors[Z2B].linkIn[dirInject] = A_B2;
					connectors[Z2B].linkOut[dirEject] = B_A2;
					connectors[Z2B].neigh[dirIn]      = connectors[Z2A];
					connectors[Z2B].neigh[dirOut]     = connectors[Z2A];
					connectors[Z2B].neighbors        += 2;		
					
					connectors[Z3A].linkIn[dirInject] = B_A3;
					connectors[Z3A].linkOut[dirEject] = A_B3;
					connectors[Z3A].neigh[dirIn]      = connectors[Z3B];
					connectors[Z3A].neigh[dirOut]     = connectors[Z3B];
					connectors[Z3A].neighbors        += 2;	
						
					connectors[Z3B].linkIn[dirInject] = A_B3;
					connectors[Z3B].linkOut[dirEject] = B_A3;	
					connectors[Z3B].neigh[dirIn]      = connectors[Z3A];
					connectors[Z3B].neigh[dirOut]     = connectors[Z3A];
					connectors[Z3B].neighbors        += 2;		
					
					connectors[Z4A].linkIn[dirInject] = B_A4;
					connectors[Z4A].linkOut[dirEject] = A_B4;
					connectors[Z4A].neigh[dirIn]      = connectors[Z4B];
					connectors[Z4A].neigh[dirOut]     = connectors[Z4B];
					connectors[Z4A].neighbors        += 2;			
					
					connectors[Z4B].linkIn[dirInject] = A_B4;
					connectors[Z4B].linkOut[dirEject] = B_A4;
					connectors[Z4B].neigh[dirIn]      = connectors[Z4A];
					connectors[Z4B].neigh[dirOut]     = connectors[Z4A];
					connectors[Z4B].neighbors        += 2;		
						
					return;
				}
			}
			
			/*
			if (Config.StreetRings)
			{
				// connect the network with Links
	            for (int n = 0; n < Config.N; n++)
	            {
	                int x, y;
	                Coord.getXYfromID(n, out x, out y);
	
	                // inter-router links
	                for (int dir = 0; dir < 2; dir++)
	                {
	                    int oppDir = (dir + 2) % 4; // direction from neighbor's perspective
	
	                    // determine neighbor's coordinates
	                    int x_, y_;
	                    switch (x % 2)
	                    {
		                    case 0:
				            	switch (dir)
				                {
				                    case 0:    x_ = x;     y_ = y + 1; break;
				                    case 1:    x_ = x;     y_ = y - 1; break;
				                    default: continue;
				                }
				                break;
		                    
		                    case 1:
			                    switch (dir)
			                    {
			                        case 0:    x_ = x;     y_ = y - 1; break;
			                        case 1:    x_ = x;     y_ = y + 1; break;
			                        default: continue;
			                    }
		                    break;
						}
				
	
	                    // ensure no duplication by handling a link at the lexicographically
	                    // first router
	                    if (x_ < x || (x_ == x && y_ < y)) continue;
	
	                    // Link param is *extra* latency (over the standard 1 cycle)
	                    Link dirA = new Link(Config.router.linkLatency - 1);
	                    Link dirB = new Link(Config.router.linkLatency - 1);
	                    links.Add(dirA);
	                    links.Add(dirB);
	
	                    // link 'em up
	                    routers[Coord.getIDfromXY(x,  y)].linkOut[dir]    = dirA;
	                    routers[Coord.getIDfromXY(x_, y_)].linkIn[oppDir] = dirA;
	
	                    routers[Coord.getIDfromXY(x,  y)].linkIn[dir]      = dirB;
	                    routers[Coord.getIDfromXY(x_, y_)].linkOut[oppDir] = dirB;
	
	                    routers[Coord.getIDfromXY(x,  y)].neighbors++;
	                    routers[Coord.getIDfromXY(x_, y_)].neighbors++;
	
	                    routers[Coord.getIDfromXY(x,  y)].neigh[dir]     = routers[Coord.getIDfromXY(x_, y_)];
	                    routers[Coord.getIDfromXY(x_, y_)].neigh[oppDir] = routers[Coord.getIDfromXY(x,  y)];
	
	                }
	            }
			}
			*/

            // connect the network with Links
            for (int n = 0; n < Config.N; n++)
            {
                int x, y;
                Coord.getXYfromID(n, out x, out y);
				int ID = n;
                // inter-router links
                for (int dir = 0; dir < 4; dir++)
                {
                    int oppDir = (dir + 2) % 4; // direction from neighbor's perspective

                    // determine neighbor's coordinates
                    int x_, y_;
                    switch (dir)
                    {
                        case Simulator.DIR_UP:    x_ = x;     y_ = y + 1; break;
                        case Simulator.DIR_DOWN:  x_ = x;     y_ = y - 1; break;
                        case Simulator.DIR_RIGHT: x_ = x + 1; y_ = y;     break;
                        case Simulator.DIR_LEFT:  x_ = x - 1; y_ = y;     break;
                        default: continue;
                    }

                    // If we are a torus, we manipulate x_ and y_
                    if(Config.torus)
                    {
                      if(x_ < 0)
                        x_ += X;
                      else if(x_ >= X)
                        x_ -= X;

                      if(y_ < 0)
                        y_ += Y;
                      else if(y_ >= Y)
                        y_ -= Y;
                    }
                    // mesh, not torus: detect edge
                    else if (x_ < 0 || x_ >= X || y_ < 0 || y_ >= Y)
                    {
                        if (Config.edge_loop)
                        {
                            Link edgeL = new Link(Config.router.linkLatency - 1);
                            links.Add(edgeL);
                            routers[ID].linkOut[dir] = edgeL;
                            routers[ID].linkIn[dir]  = edgeL;
                            routers[ID].neighbors++;
                            routers[ID].neigh[dir] =
                                routers[ID];
                        }

                        continue;
                    }

                    // ensure no duplication by handling a link at the lexicographically
                    // first router
                    if (x_ < x || (x_ == x && y_ < y)) continue;

                    // Link param is *extra* latency (over the standard 1 cycle)
                    Link dirA = new Link(Config.router.linkLatency - 1);
                    Link dirB = new Link(Config.router.linkLatency - 1);
                    links.Add(dirA);
                    links.Add(dirB);

					int oppID = Coord.getIDfromXY(x_, y_);

                    // link 'em up
                    routers[ID].linkOut[dir]    = dirA;
                    routers[oppID].linkIn[oppDir] = dirA;

                    routers[ID].linkIn[dir]      = dirB;
                    routers[oppID].linkOut[oppDir] = dirB;

                    routers[ID].neighbors++;
                    routers[oppID].neighbors++;

                    routers[ID].neigh[dir]     = routers[oppID];
                    routers[oppID].neigh[oppDir] = routers[ID];


                    if (Config.router.algorithm == RouterAlgorithm.DR_SCARAB)
                    {
                        for (int wireNr = 0; wireNr < Config.nack_nr; wireNr++)
                        {
                            Link nackA = new Link(Config.nack_linkLatency - 1);
                            Link nackB = new Link(Config.nack_linkLatency - 1);
                            links.Add(nackA);
                            links.Add(nackB);
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x,  y)]).nackOut[dir    * Config.nack_nr + wireNr] = nackA;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackIn[oppDir * Config.nack_nr + wireNr] = nackA;

                            ((Router_SCARAB)routers[Coord.getIDfromXY(x,  y)]).nackIn[dir      * Config.nack_nr + wireNr] = nackB;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackOut[oppDir * Config.nack_nr + wireNr] = nackB;
                        }
                    }
                }
            }

            if (Config.torus)
                for (int i = 0; i < Config.N; i++)
                    if (routers[i].neighbors < 4)
                        throw new Exception("torus construction not successful!");
        }
 public void setLocalInput(Link l) { _lin = l; }
 public void setGlobalOutput(Link l, IBufRingMultiBackpressure b) { _gout = l; _downstreamG = b; }
 public void setGlobalInput(Link l) { _gin = l; }
 public void setOutput(Link l, IBufRingMultiBackpressure downstream)
 {
     _out = l;
     _downstream = downstream;
 }
 public void setInput(Link l)
 {
     _in = l;
 }
Beispiel #18
0
        int Local = 0;// defined in router_bridge

        public Router_Node_Buffer(Coord myCoord)
            : base(myCoord)
        {
            // the node Router is just a Ring node. A Flit gets ejected or moves straight forward
            linkOut = new Link[2];
            linkIn = new Link[2];
            m_injectSlot_CW = null;
            m_injectSlot_CCW = null;
            throttle[ID] = false;
            starved[ID] = false;
            starveCounter = 0;
            m_ringBuf = new WormholeBuffer[2];
            for (int i = 0; i < 2; i++)
                m_ringBuf[i] = new WormholeBuffer(Config.ringBufferSize);
        }
Beispiel #19
0
 public Router_Node_Buffer(RC_Coord RC_c, Coord c) : base(c)
 {
     linkOut = new Link[2];
     linkIn = new Link[2];
     m_injectSlot_CW = null;
     m_injectSlot_CCW = null;
     ejectBuffer = new Queue<Flit> [2];
     for (int i = 0; i < 2; i++)
         ejectBuffer[i] = new Queue<Flit>();
     throttle[ID] = false;
     starved[ID] = false;
     starveCounter = 0;
     m_ringBuf = new WormholeBuffer[2];
     for (int i = 0; i < 2; i++)
         m_ringBuf[i] = new WormholeBuffer(Config.ringBufferSize);
 }
 public void setLocalOutput(Link l, IBufRingMultiBackpressure b) { _lout = l; _downstreamL = b; }
		public override void setup()
		{
			if (Config.sub_net <= 0) 
				throw new Exception ("No subnetwork is configured (sub_net <= 0)!");

			_routers = new MultiMeshRouter [Config.N];
			nodes = new Node[Config.N];
			links = new List<Link>();
			cache = new CmpCache();

			endOfTraceBarrier = new bool[Config.N];
			canRewind = false;

			ParseFinish(Config.finish);

			workload = new Workload(Config.traceFilenames);

			mapping = new NodeMapping_AllCPU_SharedCache();

			// create routers and nodes
			// each node contains router [sub_net * node, ... ,  sub_net*(node+1)-1]
			for (int n = 0; n < Config.N; n++)
			{
				Coord c = new Coord(n);
				nodes[n] = new Node(mapping, c);
				_routers [n] = new MultiMeshRouter (c);
				nodes [n].setRouter (_routers [n]);
				_routers [n].setNode (nodes [n]);
				endOfTraceBarrier[n] = false;
			}


			// create the Golden manager
			// NOT sure if needed
			golden = new Golden();

			// connect the network with Links
			for (int n = 0; n < Config.N; n++)
			{
				int x, y;
				Coord.getXYfromID(n, out x, out y);

				// inter-router links
				for (int dir = 0; dir < 4; dir++)
				{

					// Clockwise 0->3 map to N->E->S->W
					/* Coordinate Mapping (e.g. 16 nodes)
					 * (0,3) (1,3) .....     |||||    3  7 ...
					 * ...					 |||||	  2  6 ...
					 * ...					 |||||    1  5 ...
					 * (0,0) (1,0) ......	 |||||    0  4 ...
					 * */

					int oppDir = (dir + 2) % 4; // direction from neighbor's perspective

					// determine neighbor's coordinates
					int x_, y_;
					switch (dir)
					{
						case Simulator.DIR_UP: x_ = x; y_ = y + 1; break;
						case Simulator.DIR_DOWN: x_ = x; y_ = y - 1; break;
						case Simulator.DIR_RIGHT: x_ = x + 1; y_ = y; break;
						case Simulator.DIR_LEFT: x_ = x - 1; y_ = y; break;
						default: continue;
					}

					// If we are a torus, we manipulate x_ and y_
					if(Config.torus)
					{
						if(x_ < 0)
							x_ += X;
						else if(x_ >= X)
							x_ -= X;

						if(y_ < 0)
							y_ += Y;
						else if(y_ >= Y)
							y_ -= Y;
					}
					// mesh, not torus: detect edge
					else if (x_ < 0 || x_ >= X || y_ < 0 || y_ >= Y)
						continue;

					// ensure no duplication by handling a link at the lexicographically
					// first router
					if (x_ < x || (x_ == x && y_ < y)) continue;

					int ID, ID_neighbor; 
					ID = Coord.getIDfromXY(x, y);
					ID_neighbor = Coord.getIDfromXY(x_, y_);

					for (int m = 0; m < Config.sub_net; m++)
					{
						// Link param is *extra* latency (over the standard 1 cycle)
						Link dirA = new Link(Config.router.linkLatency - 1);
						Link dirB = new Link(Config.router.linkLatency - 1);
						links.Add(dirA);
						links.Add(dirB);

						_routers [ID].subrouter [m].linkOut [dir] = dirA;
						_routers [ID_neighbor].subrouter [m].linkIn [oppDir] = dirA;
						_routers [ID].subrouter [m].linkIn [dir] = dirB;
						_routers [ID_neighbor].subrouter [m].linkOut [oppDir] = dirB;
						_routers [ID].subrouter [m].neighbors++;
						_routers [ID_neighbor].subrouter [m].neighbors++;
						_routers [ID].subrouter [m].neigh [dir] = _routers [ID_neighbor].subrouter [m];
						_routers [ID_neighbor].subrouter [m].neigh [oppDir] = _routers [ID].subrouter [m];

					}
				}

				// connect the subrouters

				if (Config.bypass_enable && Config.bridge_subnet)
					for (int pi = 0; pi < Config.num_bypass; pi++)
						for (int m = 0; m < Config.sub_net; m++)
						{
							Link bypass = new Link(0);
							links.Add(bypass);
							_routers[n].subrouter[m].bypassLinkOut[pi] = bypass;
							_routers[n].subrouter[(m+1)%Config.sub_net].bypassLinkIn[pi] = bypass;
							_routers [n].subrouter[m].neighbors++;
							//_routers [n].subrouter [m].neigh [pi] = _routers [n].subrouter [(m+1)%Config.sub_net];
						}

				
			}

			if (Config.bypass_enable == true && Config.bridge_subnet == false)
				for (int i = 0; i < Config.sub_net; i++)
					for (int k = 0; k < Config.network_nrY; k++)
						for (int j = 0; j < Config.network_nrX; j++)
					{
						Link bypass = new Link(0);
						links.Add(bypass);
						_routers[k * Config.network_nrX+j%Config.network_nrX].subrouter[i].bypassLinkOut[0] = bypass;
						_routers[k * Config.network_nrX+(j+1)%Config.network_nrX].subrouter[i].bypassLinkIn[0] = bypass;
						_routers[k * Config.network_nrX+j%Config.network_nrX].subrouter [i].neighbors++;
					}


			// TORUS: be careful about the number of neighbors, which is based on if bypass is enabled. NOT tested.
			if (Config.torus)
				for (int i = 0; i < Config.N; i++)
					for (int j = 0; j < Config.sub_net; j++)
						if (_routers[i].subrouter [j].neighbors < 4)
							throw new Exception("torus construction not successful!");
		}
Beispiel #22
0
       	public void setup_RingCluster_4()
       	{
       		nodeRouters = new Router_Node[Config.N];
       		connectRouters = new Router_Connect[6];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                 
                nodeRouters[n] = new Router_Node(c); 
                nodes[n].setRouter(nodeRouters[n]);                                
                nodeRouters[n].setNode(nodes[n]);
            }
            for (int n = 0; n < 6; n++)
            	connectRouters[n] = new Router_Connect(n);
            
            for (int n = 0; n < Config.N / 4; n++)  // n is the cluster number
            {
            	for (int i = 0; i < 4; i++)  // for each node in the same cluster
            	{
            		if (n == 0 && i == 3 || n == 1 && i == 1 || n == 2 && i == 1 || n == 3 && i == 3)
            		{
	            		Link dirA = new Link(0);   
    	                Link dirB = new Link(0);                  	
    	                links.Add(dirA);                    	
    	                links.Add(dirB);
    	                int next = (i + 1 == 4)? n * 4 : n * 4 + i + 1;                    
    	        		nodeRouters[n * 4 + i].linkOut[CW] = dirA;
    	        		nodeRouters[next].linkIn[CW] = dirA;
    	        		nodeRouters[next].linkOut[CCW] = dirB;
    	        		nodeRouters[n * 4 + i].linkIn[CCW] = dirB;            		
            		}
            	}
            }
            for (int n = 0; n < 6; n++)
            {
            	Link dirA = new Link(Config.router.linkLatency - 1);	            	
            	Link dirB = new Link(Config.router.linkLatency - 1);	            	
            	links.Add(dirA);
            	links.Add(dirB);
            	int[] node1 = new int[6] {1, 6, 11, 12, 0, 4};
            	nodeRouters[node1[n]].linkOut[CW] = dirA;
            	nodeRouters[node1[n]].linkIn[CCW] = dirB;
            	connectRouters[n].linkIn[L0] = dirA;
            	connectRouters[n].linkOut[L0] = dirB;
            	
            	dirA = new Link(Config.router.linkLatency - 1);
            	dirB = new Link(Config.router.linkLatency - 1);	            	            	
            	links.Add(dirA);
            	links.Add(dirB);
            	int[] node2 = new int[6] {2, 7, 8, 13, 1, 5};
            	nodeRouters[node2[n]].linkOut[CCW] = dirA;
            	nodeRouters[node2[n]].linkIn[CW] = dirB;
            	connectRouters[n].linkIn[L3] = dirA;
            	connectRouters[n].linkOut[L3] = dirB;
            	
            	dirA = new Link(Config.router.linkLatency - 1);
            	dirB = new Link(Config.router.linkLatency - 1);	            	            	
            	links.Add(dirA);
            	links.Add(dirB);
            	int[] node3 = new int[6] {4, 9, 14, 3, 15, 11};
            	nodeRouters[node3[n]].linkOut[CCW] = dirA;
            	nodeRouters[node3[n]].linkIn[CW] = dirB;
            	connectRouters[n].linkIn[L1] = dirA;
            	connectRouters[n].linkOut[L1] = dirB;
            	
            	dirA = new Link(Config.router.linkLatency - 1);
            	dirB = new Link(Config.router.linkLatency - 1);	            	            	
            	links.Add(dirA);
            	links.Add(dirB);
            	int[] node4 = new int[6] {7, 8, 13, 2, 14, 10};
            	nodeRouters[node4[n]].linkOut[CW] = dirA;
            	nodeRouters[node4[n]].linkIn[CCW] = dirB;
            	connectRouters[n].linkIn[L2] = dirA;
            	connectRouters[n].linkOut[L2] = dirB;
            }  
                    
       	}
        // set up a ring with local nodes at level 'level'
        void setup_ring(BufRingMultiNetwork_Coord coord, int level, out BufRingMultiNetwork_IRI iri, out int count)
        {
            count = 0;

            //Console.WriteLine("setup_ring: coord {0}, level {1}", coord, level);

            if (level == (Config.bufrings_levels - 1)) {
                BufRingMultiNetwork_NIC first = null, last = null;
                for (int n = 0; n < Config.bufrings_branching; n++) {
                    int id = coord.id + n;
                    //Console.WriteLine("setup_ring: coord {0}, level {1}: node {2}, global id {3}",
                    //        coord, level, n, id);
                    BufRingMultiNetwork_Coord c = new BufRingMultiNetwork_Coord(id, level);
                    BufRingMultiNetwork_NIC nic = new BufRingMultiNetwork_NIC(c);
                    _routers[id].addNIC(nic);
                    _nics.Add(nic);

                    if (last != null) {
                        Link l = new Link(Config.bufrings_locallat);
                        links.Add(l);
                        nic.setInput(l);
                        last.setOutput(l, nic);
                        //Console.WriteLine("link nic coord {0} -> nic coord {1}",
                        //        last.Coord, nic.Coord);
                    }
                    else {
                        first = nic;
                    }
                    last = nic;
                }

                BufRingMultiNetwork_Coord iricoord = new BufRingMultiNetwork_Coord(coord);
                iricoord.level--;

                iri = new BufRingMultiNetwork_IRI(iricoord);
                _iris.Add(iri);
                Link iriIn = new Link(Config.bufrings_locallat - 1), iriOut = new Link(Config.bufrings_locallat - 1);
                links.Add(iriIn);
                links.Add(iriOut);

                last.setOutput(iriIn, iri.LocalPort);
                iri.setLocalInput(iriIn);
                iri.setLocalOutput(iriOut, first);
                first.setInput(iriOut);

                //Console.WriteLine("link nic coord {0} -> IRI coord {1} local",
                //        last.Coord, iri.Coord);
                //Console.WriteLine("link IRI coord {0} local -> nic coord {1}",
                //        iri.Coord, first.Coord);

                count = Config.bufrings_branching;
            }
            else {
                BufRingMultiNetwork_IRI first = null, last = null;
                int id = coord.id;
                for (int n = 0; n < Config.bufrings_branching; n++) {
                    BufRingMultiNetwork_Coord c = new BufRingMultiNetwork_Coord(coord);
                    BufRingMultiNetwork_IRI I;
                    int subcount;

                    c.level++;
                    c.coord[c.level - 1] = n;
                    c.id = id;

                    setup_ring(c, level + 1, out I, out subcount);
                    id += subcount;
                    count += subcount;

                    if (last != null) {
                        Link l = new Link(Config.bufrings_globallat - 1);
                        links.Add(l);
                        I.setGlobalInput(l);
                        last.setGlobalOutput(l, I.GlobalPort);
                        //Console.WriteLine("link IRI coord {0} global -> IRI coord {1} global",
                        //        last.Coord, I.Coord);
                    }
                    else {
                        first = I;
                    }
                    last = I;
                }

                if (level > 0) {
                    BufRingMultiNetwork_Coord iricoord = new BufRingMultiNetwork_Coord(coord);
                    iricoord.level--;
                    iri = new BufRingMultiNetwork_IRI(iricoord);
                    _iris.Add(iri);
                    Link iriIn = new Link(Config.bufrings_globallat - 1), iriOut = new Link(Config.bufrings_globallat - 1);
                    links.Add(iriIn);
                    links.Add(iriOut);

                    last.setGlobalOutput(iriIn, iri.LocalPort);
                    iri.setLocalInput(iriIn);
                    iri.setLocalOutput(iriOut, first.GlobalPort);
                    first.setGlobalInput(iriOut);

                    //Console.WriteLine("link IRI coord {0} global -> IRI coord {1} local",
                    //        last.Coord, iri.Coord);
                    //Console.WriteLine("link IRI coord {0} local -> IRI coord {1} global",
                    //        iri.Coord, first.Coord);
                }
                else {
                    Link l = new Link(Config.bufrings_globallat - 1);
                    links.Add(l);

                    last.setGlobalOutput(l, first.GlobalPort);
                    first.setGlobalInput(l);
                    
                    //Console.WriteLine("link IRI coord {0} global -> IRI coord {1} global",
                    //        last.Coord, first.Coord);

                    iri = null;
                }
            }
        }
Beispiel #24
0
        public virtual void setup()
        {
            routers = new Router[Config.N];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            endOfTraceBarrier = new bool[Config.N];
            canRewind = false;

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                routers[n] = MakeRouter(c);
                nodes[n].setRouter(routers[n]);
                routers[n].setNode(nodes[n]);
                endOfTraceBarrier[n] = false;
            }

            // create the Golden manager
            golden = new Golden();

            if (Config.RouterEvaluation)
                return;

            // connect the network with Links
            for (int n = 0; n < Config.N; n++)
            {
                int x, y;
                Coord.getXYfromID(n, out x, out y);

                // inter-router links
                for (int dir = 0; dir < 4; dir++)
                {
                    int oppDir = (dir + 2) % 4; // direction from neighbor's perspective

                    // determine neighbor's coordinates
                    int x_, y_;
                    switch (dir)
                    {
                        case Simulator.DIR_UP: x_ = x; y_ = y + 1; break;
                        case Simulator.DIR_DOWN: x_ = x; y_ = y - 1; break;
                        case Simulator.DIR_RIGHT: x_ = x + 1; y_ = y; break;
                        case Simulator.DIR_LEFT: x_ = x - 1; y_ = y; break;
                        default: continue;
                    }

                    // If we are a torus, we manipulate x_ and y_
                    if(Config.torus)
                    {
                      if(x_ < 0)
                        x_ += X;
                      else if(x_ >= X)
                        x_ -= X;

                      if(y_ < 0)
                        y_ += Y;
                      else if(y_ >= Y)
                        y_ -= Y;
                    }
                    // mesh, not torus: detect edge
                    else if (x_ < 0 || x_ >= X || y_ < 0 || y_ >= Y)
                    {
                        if (Config.edge_loop)
                        {
                            Link edgeL = new Link(Config.router.linkLatency - 1);
                            links.Add(edgeL);

                            routers[Coord.getIDfromXY(x, y)].linkOut[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].linkIn[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].neighbors++;
                            routers[Coord.getIDfromXY(x, y)].neigh[dir] =
                                routers[Coord.getIDfromXY(x, y)];
                        }

                        continue;
                    }

                    // ensure no duplication by handling a link at the lexicographically
                    // first router
                    if (x_ < x || (x_ == x && y_ < y)) continue;

                    // Link param is *extra* latency (over the standard 1 cycle)
                    Link dirA = new Link(Config.router.linkLatency - 1);
                    Link dirB = new Link(Config.router.linkLatency - 1);
                    links.Add(dirA);
                    links.Add(dirB);

                    // link 'em up
                    routers[Coord.getIDfromXY(x, y)].linkOut[dir] = dirA;
                    routers[Coord.getIDfromXY(x_, y_)].linkIn[oppDir] = dirA;

                    routers[Coord.getIDfromXY(x, y)].linkIn[dir] = dirB;
                    routers[Coord.getIDfromXY(x_, y_)].linkOut[oppDir] = dirB;

                    routers[Coord.getIDfromXY(x, y)].neighbors++;
                    routers[Coord.getIDfromXY(x_, y_)].neighbors++;

                    routers[Coord.getIDfromXY(x, y)].neigh[dir] = routers[Coord.getIDfromXY(x_, y_)];
                    routers[Coord.getIDfromXY(x_, y_)].neigh[oppDir] = routers[Coord.getIDfromXY(x, y)];

                    if (Config.router.algorithm == RouterAlgorithm.DR_SCARAB)
                    {
                        for (int wireNr = 0; wireNr < Config.nack_nr; wireNr++)
                        {
                            Link nackA = new Link(Config.nack_linkLatency - 1);
                            Link nackB = new Link(Config.nack_linkLatency - 1);
                            links.Add(nackA);
                            links.Add(nackB);
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackOut[dir * Config.nack_nr + wireNr] = nackA;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackIn[oppDir * Config.nack_nr + wireNr] = nackA;

                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackIn[dir * Config.nack_nr + wireNr] = nackB;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackOut[oppDir * Config.nack_nr + wireNr] = nackB;
                        }
                    }
                }
            }

            if (Config.torus)
                for (int i = 0; i < Config.N; i++)
                    if (routers[i].neighbors < 4)
                        throw new Exception("torus construction not successful!");
        }
Beispiel #25
0
       	public void setup_TorusSingleRing()
       	{
       		nodeRouters = new Router_TorusRingNode[Config.N];
       		connectRouters = new Router_TorusRingConnect[8];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);
            workload = new Workload(Config.traceFilenames);
            mapping = new NodeMapping_AllCPU_SharedCache();
            
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);                 
                nodeRouters[n] = new Router_TorusRingNode(c); 
                nodes[n].setRouter(nodeRouters[n]);                                
                nodeRouters[n].setNode(nodes[n]);
            }
            for (int n = 0; n < 8; n++)
            	connectRouters[n] = new Router_TorusRingConnect(n);

       		int[] CW_Connect = new int[16] {7,0,6,1,3,1,2,0,2,5,3,4,6,4,7,5};
       		int[] CCW_Connect = new int[16] {1,7,0,6,0,3,1,2,4,2,5,3,5,6,4,7};	
       		int[] dirCW = new int[16] {1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1};
       		int[] dirCCW = new int[16] {1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0};
       		for (int n = 0; n < Config.N; n++)
       		{
       			Link dirA = new Link(Config.router.linkLatency - 1);	            	
            	Link dirB = new Link(Config.router.linkLatency - 1);
            	links.Add(dirA);
            	links.Add(dirB);
            	nodeRouters[n].linkOut[0] = dirA;
            	nodeRouters[n].linkIn[0] = dirB;
            	connectRouters[CW_Connect[n]].linkIn[dirCW[n]] = dirA;
            	connectRouters[CCW_Connect[n]].linkOut[dirCCW[n]] = dirB;
       		}
       	}
Beispiel #26
0
      	public override void setup()
       	{
			if (Config.N != 16)
				throw new Exception("HR_Simple only suport 4x4 network");
            nodeRouters = new Router_Node[Config.N];
           	bridgeRouters = new Router_Bridge[4]; 
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
           	{
                Coord c = new Coord(n);
                RC_Coord RC_c = new RC_Coord(n);

                nodes[n] = new Node(mapping, c);
                nodeRouters[n] = new Router_Node(RC_c, c);
                nodes[n].setRouter(nodeRouters[n]);
                nodeRouters[n].setNode(nodes[n]);
            }
            for (int n = 0; n < 4; n++)
            	bridgeRouters[n] = new Router_Bridge(n, Config.GlobalRingWidth);
            // connect the network with Links
            for (int n = 0; n < 4; n++)
            {
				for (int i = 0; i < 4; i++)
				{
					int ID = n * 4 + i;
					if (ID == 2 || ID == 6 || ID == 8 || ID == 12)
						continue;
					int next = (i + 1) % 4 + n * 4;
					Link dirA = new Link(Config.router.switchLinkLatency - 1);
					Link dirB = new Link(Config.router.switchLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					nodeRouters[ID].linkOut[CW] = dirA;
					nodeRouters[next].linkIn[CW] = dirA;
					nodeRouters[ID].linkIn[CCW] = dirB;
					nodeRouters[next].linkOut[CCW] = dirB;
				}
			}
			for (int n = 0; n < 4; n++)
			{
				Link dirA = new Link(Config.router.switchLinkLatency - 1);
				Link dirB = new Link(Config.router.switchLinkLatency - 1);
				Link dirC = new Link(Config.router.switchLinkLatency - 1);
				Link dirD = new Link(Config.router.switchLinkLatency - 1);
				links.Add(dirA);
				links.Add(dirB);
				links.Add(dirC);
				links.Add(dirD);
				bridgeRouters[n].LLinkOut[CW] = dirA;
				nodeRouters[CWnext[n]].linkIn[CW] = dirA;
				bridgeRouters[n].LLinkIn[CCW] = dirB;
				nodeRouters[CWnext[n]].linkOut[CCW] = dirB;

				bridgeRouters[n].LLinkOut[CCW] = dirC;
				nodeRouters[CCWnext[n]].linkIn[CCW] = dirC;
				bridgeRouters[n].LLinkIn[CW] = dirD;
				nodeRouters[CCWnext[n]].linkOut[CW] = dirD;
				
				int next = (n + 1) % 4;

				for (int i = 0 ; i < Config.GlobalRingWidth; i++)
				{
					dirA = new Link(2 - 1);
					dirB = new Link(2 - 1);
					links.Add(dirA);
					links.Add(dirB);
					bridgeRouters[n].GLinkIn[i*2+1] = dirA;
					bridgeRouters[next].GLinkOut[i*2+1] = dirA;
					bridgeRouters[n].GLinkOut[i*2] = dirB;
					bridgeRouters[next].GLinkIn[i*2] = dirB;
				}
			}
       	}
Beispiel #27
0
      	public override void setup()
       	{
			if (Config.N != 1024)
				throw new Exception("HR_16_8drop only suport 8x8 network");
            nodeRouters = new Router_Node[Config.N];
           	L1bridgeRouters = new Router_Bridge[512];
			L2bridgeRouters = new Router_Bridge[128];
			L3bridgeRouters = new Router_Bridge[32];
			L4bridgeRouters = new Router_Bridge[8];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
           	{
                Coord c = new Coord(n);
                RC_Coord RC_c = new RC_Coord(n);

                nodes[n] = new Node(mapping, c);
                nodeRouters[n] = new Router_Node(RC_c, c);
                nodes[n].setRouter(nodeRouters[n]);
                nodeRouters[n].setNode(nodes[n]);
            }
            for (int n = 0; n < 512; n++)
            	L1bridgeRouters[n] = new Router_Bridge(n, 2, 1);
			for (int n = 0; n < 128; n++)
				L2bridgeRouters[n] = new Router_Bridge(n, 4, 2, 2, 8);
			for (int n = 0; n < 32; n++)
				L3bridgeRouters[n] = new Router_Bridge(n, 8, 4, 4, 16);
			for (int n = 0; n < 8; n++)
				L4bridgeRouters[n] = new Router_Bridge(n, 16, 8, 8, 32);
            // connect the network with Links
            for (int n = 0; n < 256; n++)
            {
				for (int i = 0; i < 4; i++)
				{
					int ID = n * 4 + i;
					if (ID % 2 == 0) 
						continue;
					int next = (i + 1) % 4 + n * 4;
					Link dirA = new Link(Config.router.switchLinkLatency - 1);
					Link dirB = new Link(Config.router.switchLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					nodeRouters[ID].linkOut[CW] = dirA;
					nodeRouters[next].linkIn[CW] = dirA;
					nodeRouters[ID].linkIn[CCW] = dirB;
					nodeRouters[next].linkOut[CCW] = dirB;
				}
			}

			// connect L1 bridge Routers
			for (int n = 0; n < 512; n++)
			{
				int ID = n;
				int next, pre;
				if (ID % 8 == 0 || ID % 8 == 6) { next = ID * 2 + 3; pre = ID * 2 + 2; }
				else if (ID % 8 == 1 || ID % 8 == 7) {next = ID * 2 - 1; pre = ID * 2 - 2; }
				else { next = ID * 2 + 1; pre = ID * 2;}

				Link dirA = new Link(Config.router.switchLinkLatency - 1);
				Link dirB = new Link(Config.router.switchLinkLatency - 1);
				Link dirC = new Link(Config.router.switchLinkLatency - 1);
				Link dirD = new Link(Config.router.switchLinkLatency - 1);
				links.Add(dirA);
				links.Add(dirB);
				links.Add(dirC);
				links.Add(dirD);
				L1bridgeRouters[n].LLinkOut[CW] = dirA;
				nodeRouters[next].linkIn[CW] = dirA;
				L1bridgeRouters[n].LLinkIn[CCW] = dirB;
				nodeRouters[next].linkOut[CCW] = dirB;

				L1bridgeRouters[n].LLinkOut[CCW] = dirC;
				nodeRouters[pre].linkIn[CCW] = dirC;
				L1bridgeRouters[n].LLinkIn[CW] = dirD;
				nodeRouters[pre].linkOut[CW] = dirD;
				
				int nextL1 = (n + 1) % 8 + n / 8 * 8;
				if (ID % 8 == 1 || ID % 8 == 5)
					continue;
				for (int i = 0 ; i < 2; i++)
				{
					dirA = new Link(Config.router.level1RingLinkLatency - 1);
					dirB = new Link(Config.router.level1RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					L1bridgeRouters[n].GLinkIn[i*2+1] = dirA;
					L1bridgeRouters[nextL1].GLinkOut[i*2+1] = dirA;
					L1bridgeRouters[n].GLinkOut[i*2] = dirB;
					L1bridgeRouters[nextL1].GLinkIn[i*2] = dirB;
				}
			}			
			// connect L2 bridge Routers
			for (int n = 0; n < 128; n++)
			{
				int next, pre;
				if (n % 8 == 0 || n % 8 == 6) {next = n * 4 + 6; pre = next - 1; }
				else if (n % 8 == 1 || n % 8 == 7) {next = n * 4 - 2; pre = next - 1;}
				else {next = n * 4 + 2; pre = next - 1;}
				
				for (int i = 0; i < 2; i++)
				{
					Link dirA = new Link(Config.router.level1RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level1RingLinkLatency - 1);
					Link dirC = new Link(Config.router.level1RingLinkLatency - 1);
					Link dirD = new Link(Config.router.level1RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					links.Add(dirC);
					links.Add(dirD);
	
					L2bridgeRouters[n].LLinkOut[i * 2] = dirA;
					L1bridgeRouters[next].GLinkIn[i * 2] = dirA;
					L2bridgeRouters[n].LLinkIn[i * 2 + 1] = dirB;
					L1bridgeRouters[next].GLinkOut[i * 2 + 1] = dirB;

					L2bridgeRouters[n].LLinkOut[i * 2 + 1] = dirC;
					L1bridgeRouters[pre].GLinkIn[i * 2 + 1] = dirC;
					L2bridgeRouters[n].LLinkIn[i * 2] = dirD;
					L1bridgeRouters[pre].GLinkOut[i * 2] = dirD;
				}
				int nextL2 = (n + 1) % 8 + n / 8 * 8;
				if (n % 8 == 1 || n % 8 == 5)
					continue;
				for (int i = 0; i < 4; i++)
				{
					Link dirA = new Link(Config.router.level2RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level2RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					L2bridgeRouters[n].GLinkIn[i*2+1] = dirA;
					L2bridgeRouters[nextL2].GLinkOut[i*2+1] = dirA;
					L2bridgeRouters[n].GLinkOut[i*2] = dirB;
					L2bridgeRouters[nextL2].GLinkIn[i*2] = dirB;
				}
			}			
			//connect L3 bridge Routers
			for (int n = 0; n < 32; n++)
			{
				int next, pre;
				if (n % 8 == 0 || n % 8 == 6) {next = n * 4 + 6; pre = next - 1;}
				else if (n % 8 == 1 || n % 8 == 7) {next = n * 4 - 2; pre = next - 1;}
				else {next = n * 4 + 2; pre = next - 1;}

				for (int i = 0; i < 4; i++)
				{	
					Link dirA = new Link(Config.router.level2RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level2RingLinkLatency - 1);
					Link dirC = new Link(Config.router.level2RingLinkLatency - 1);
					Link dirD = new Link(Config.router.level2RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					links.Add(dirC);
					links.Add(dirD);

					L3bridgeRouters[n].LLinkOut[i*2] = dirA;
					L2bridgeRouters[next].GLinkIn[i*2] = dirA;
					L3bridgeRouters[n].LLinkIn[i*2+1] = dirB;
					L2bridgeRouters[next].GLinkOut[i*2+1] = dirB;

					L3bridgeRouters[n].LLinkOut[i * 2 + 1] = dirC;
					L2bridgeRouters[pre].GLinkIn[i * 2 + 1] = dirC;
					L3bridgeRouters[n].LLinkIn[i * 2] = dirD;
					L2bridgeRouters[pre].GLinkOut[i * 2] = dirD;
				}				
				int nextL3 = (n+1) % 8 + n / 8 * 8;
				if (n % 8 == 1 || n % 8 == 5)
					continue;
				for (int i = 0; i < 8; i++)
				{
					Link dirA = new Link(Config.router.level3RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level3RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					L3bridgeRouters[n].GLinkIn[i*2+1] = dirA;
					L3bridgeRouters[nextL3].GLinkOut[i*2+1] = dirA;
					L3bridgeRouters[n].GLinkOut[i*2] = dirB;
					L3bridgeRouters[nextL3].GLinkIn[i*2] = dirB;
				}
			}
			//connect L4 bridge Routers
			for (int n = 0; n < 8; n++)
			{
				int next, pre;
				if (n % 8 == 0 || n % 8 == 6) {next = n * 4 + 6; pre = next - 1;}
				else if (n % 8 == 1 || n % 8 == 7) {next = n * 4 - 2; pre = next - 1;}
				else {next = n * 4 + 2; pre = next - 1;}

				for (int i = 0; i < 8; i++)
				{	
					Link dirA = new Link(Config.router.level3RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level3RingLinkLatency - 1);
					Link dirC = new Link(Config.router.level3RingLinkLatency - 1);
					Link dirD = new Link(Config.router.level3RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					links.Add(dirC);
					links.Add(dirD);

					L4bridgeRouters[n].LLinkOut[i*2] = dirA;
					L3bridgeRouters[next].GLinkIn[i*2] = dirA;
					L4bridgeRouters[n].LLinkIn[i*2+1] = dirB;
					L3bridgeRouters[next].GLinkOut[i*2+1] = dirB;

					L4bridgeRouters[n].LLinkOut[i * 2 + 1] = dirC;
					L3bridgeRouters[pre].GLinkIn[i * 2 + 1] = dirC;
					L4bridgeRouters[n].LLinkIn[i * 2] = dirD;
					L3bridgeRouters[pre].GLinkOut[i * 2] = dirD;
				}				
				int nextL4 = (n+1) % 8 + n / 8 * 8;
				for (int i = 0; i < 16; i++)
				{
					Link dirA = new Link(Config.router.level4RingLinkLatency - 1);
					Link dirB = new Link(Config.router.level4RingLinkLatency - 1);
					links.Add(dirA);
					links.Add(dirB);
					L4bridgeRouters[n].GLinkIn[i*2+1] = dirA;
					L4bridgeRouters[nextL4].GLinkOut[i*2+1] = dirA;
					L4bridgeRouters[n].GLinkOut[i*2] = dirB;
					L4bridgeRouters[nextL4].GLinkIn[i*2] = dirB;
				}
			}

       	}
Beispiel #28
0
        public virtual void setup()
        {
            routers = new Router[Config.N];
            nodes = new Node[Config.N];
            links = new List<Link>();
            cache = new CmpCache();

            endOfTraceBarrier = new bool[Config.N];
			hsReqPerNode = new int[Config.N];
            canRewind = false;
			hotSpotNode = -1;
			hotSpotGenCount = 0;
			hsFlowID = 0;

            ParseFinish(Config.finish);

            workload = new Workload(Config.traceFilenames);

            mapping = new NodeMapping_AllCPU_SharedCache();

            // create routers and nodes
            for (int n = 0; n < Config.N; n++)
            {
                Coord c = new Coord(n);
                nodes[n] = new Node(mapping, c);
                routers[n] = MakeRouter(c);
                nodes[n].setRouter(routers[n]);
                routers[n].setNode(nodes[n]);
                endOfTraceBarrier[n] = false;
				hsReqPerNode [n] = 0;
				#if DEBUG
				Console.WriteLine ("*******This is Node {0} **********", n);
				((Router_BLESS_MC)nodes [n].router).PrintMask ();
				#endif
            }


			//Console.WriteLine ("Exit Normally!");
			//System.Environment.Exit (1);

            // create the Golden manager
            golden = new Golden();

            if (Config.RouterEvaluation)
                return;

            // connect the network with Links
            for (int n = 0; n < Config.N; n++)
            {
                int x, y;
                Coord.getXYfromID(n, out x, out y);

                // inter-router links
                for (int dir = 0; dir < 4; dir++)
                {

					// Clockwise 0->3 map to N->E->S->W
					/* Coordinate Mapping (e.g. 16 nodes)
					 * (0,3) (1,3) .....     |||||    3  7 ...
					 * ...					 |||||	  2  6 ...
					 * ...					 |||||    1  5 ...
					 * (0,0) (1,0) ......	 |||||    0  4 ...
					 * */

                    int oppDir = (dir + 2) % 4; // direction from neighbor's perspective

                    // determine neighbor's coordinates
                    int x_, y_;
                    switch (dir)
                    {
                        case Simulator.DIR_UP: x_ = x; y_ = y + 1; break;
                        case Simulator.DIR_DOWN: x_ = x; y_ = y - 1; break;
                        case Simulator.DIR_RIGHT: x_ = x + 1; y_ = y; break;
                        case Simulator.DIR_LEFT: x_ = x - 1; y_ = y; break;
                        default: continue;
                    }

                    // If we are a torus, we manipulate x_ and y_
                    if(Config.torus)
                    {
                      if(x_ < 0)
                        x_ += X;
                      else if(x_ >= X)
                        x_ -= X;

                      if(y_ < 0)
                        y_ += Y;
                      else if(y_ >= Y)
                        y_ -= Y;
                    }
                    // mesh, not torus: detect edge
                    else if (x_ < 0 || x_ >= X || y_ < 0 || y_ >= Y)
                    {
                        if (Config.edge_loop)
                        {
                            Link edgeL = new Link(Config.router.linkLatency - 1);
                            links.Add(edgeL);

                            routers[Coord.getIDfromXY(x, y)].linkOut[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].linkIn[dir] = edgeL;
                            routers[Coord.getIDfromXY(x, y)].neighbors++;
                            routers[Coord.getIDfromXY(x, y)].neigh[dir] =
                                routers[Coord.getIDfromXY(x, y)];
                        }

                        continue;
                    }

                    // ensure no duplication by handling a link at the lexicographically
                    // first router
                    if (x_ < x || (x_ == x && y_ < y)) continue;

                    // Link param is *extra* latency (over the standard 1 cycle)
                    Link dirA = new Link(Config.router.linkLatency - 1);
                    Link dirB = new Link(Config.router.linkLatency - 1);
                    links.Add(dirA);
                    links.Add(dirB);

                    // link 'em up
                    routers[Coord.getIDfromXY(x, y)].linkOut[dir] = dirA;
                    routers[Coord.getIDfromXY(x_, y_)].linkIn[oppDir] = dirA;

                    routers[Coord.getIDfromXY(x, y)].linkIn[dir] = dirB;
                    routers[Coord.getIDfromXY(x_, y_)].linkOut[oppDir] = dirB;

                    routers[Coord.getIDfromXY(x, y)].neighbors++;
                    routers[Coord.getIDfromXY(x_, y_)].neighbors++;

                    routers[Coord.getIDfromXY(x, y)].neigh[dir] = routers[Coord.getIDfromXY(x_, y_)];
                    routers[Coord.getIDfromXY(x_, y_)].neigh[oppDir] = routers[Coord.getIDfromXY(x, y)];

                    if (Config.router.algorithm == RouterAlgorithm.DR_SCARAB)
                    {
                        for (int wireNr = 0; wireNr < Config.nack_nr; wireNr++)
                        {
                            Link nackA = new Link(Config.nack_linkLatency - 1);
                            Link nackB = new Link(Config.nack_linkLatency - 1);
                            links.Add(nackA);
                            links.Add(nackB);
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackOut[dir * Config.nack_nr + wireNr] = nackA;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackIn[oppDir * Config.nack_nr + wireNr] = nackA;

                            ((Router_SCARAB)routers[Coord.getIDfromXY(x, y)]).nackIn[dir * Config.nack_nr + wireNr] = nackB;
                            ((Router_SCARAB)routers[Coord.getIDfromXY(x_, y_)]).nackOut[oppDir * Config.nack_nr + wireNr] = nackB;
                        }
                    }
                }
            }

			// Just to verify the formed topology
			//for ( int i=0; i<16; i++) {
			//	Console.WriteLine ("Router {0} has {1} neighbors", i, routers[i].neighbors);
			//}

            if (Config.torus)
                for (int i = 0; i < Config.N; i++)
                    if (routers[i].neighbors < 4)
                        throw new Exception("torus construction not successful!");
        }