예제 #1
0
        // 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;
                }
            }
        }
예제 #2
0
        // 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;
                }
            }
        }
예제 #3
0
 public void addNIC(BufRingMultiNetwork_NIC nic)
 {
     _nics[_nic_count++] = nic;
     nic.setRouter(this);
 }
예제 #4
0
 public void addNIC(BufRingMultiNetwork_NIC nic)
 {
     _nics[_nic_count++] = nic;
     nic.setRouter(this);
 }