// 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; } } }
public void addNIC(BufRingMultiNetwork_NIC nic) { _nics[_nic_count++] = nic; nic.setRouter(this); }