NetDest.cc revision 7089
16145Snate@binkert.org/*
26145Snate@binkert.org * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
36145Snate@binkert.org * All rights reserved.
46145Snate@binkert.org *
56145Snate@binkert.org * Redistribution and use in source and binary forms, with or without
66145Snate@binkert.org * modification, are permitted provided that the following conditions are
76145Snate@binkert.org * met: redistributions of source code must retain the above copyright
86145Snate@binkert.org * notice, this list of conditions and the following disclaimer;
96145Snate@binkert.org * redistributions in binary form must reproduce the above copyright
106145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the
116145Snate@binkert.org * documentation and/or other materials provided with the distribution;
126145Snate@binkert.org * neither the name of the copyright holders nor the names of its
136145Snate@binkert.org * contributors may be used to endorse or promote products derived from
146145Snate@binkert.org * this software without specific prior written permission.
156145Snate@binkert.org *
166145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276145Snate@binkert.org */
286145Snate@binkert.org
296154Snate@binkert.org#include "mem/ruby/common/NetDest.hh"
306154Snate@binkert.org#include "mem/protocol/Protocol.hh"
316145Snate@binkert.org
326145Snate@binkert.orgNetDest::NetDest()
336145Snate@binkert.org{
346145Snate@binkert.org  setSize();
356145Snate@binkert.org}
366145Snate@binkert.org
377039Snate@binkert.orgvoid
387039Snate@binkert.orgNetDest::add(MachineID newElement)
396145Snate@binkert.org{
407039Snate@binkert.org    m_bits[vecIndex(newElement)].add(bitIndex(newElement.num));
416145Snate@binkert.org}
426145Snate@binkert.org
437039Snate@binkert.orgvoid
447039Snate@binkert.orgNetDest::addNetDest(const NetDest& netDest)
456145Snate@binkert.org{
467039Snate@binkert.org    assert(m_bits.size() == netDest.getSize());
477039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
487039Snate@binkert.org        m_bits[i].addSet(netDest.m_bits[i]);
497039Snate@binkert.org    }
506145Snate@binkert.org}
516145Snate@binkert.org
527039Snate@binkert.orgvoid
537039Snate@binkert.orgNetDest::addRandom()
546145Snate@binkert.org{
557039Snate@binkert.org    int i = random()%m_bits.size();
567039Snate@binkert.org    m_bits[i].addRandom();
576145Snate@binkert.org}
586145Snate@binkert.org
597039Snate@binkert.orgvoid
607039Snate@binkert.orgNetDest::setNetDest(MachineType machine, const Set& set)
616145Snate@binkert.org{
627039Snate@binkert.org    // assure that there is only one set of destinations for this machine
637039Snate@binkert.org    assert(MachineType_base_level((MachineType)(machine + 1)) -
647039Snate@binkert.org           MachineType_base_level(machine) == 1);
657039Snate@binkert.org    m_bits[MachineType_base_level(machine)] = set;
666145Snate@binkert.org}
676145Snate@binkert.org
687039Snate@binkert.orgvoid
697039Snate@binkert.orgNetDest::remove(MachineID oldElement)
706145Snate@binkert.org{
717039Snate@binkert.org    m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num));
726145Snate@binkert.org}
736145Snate@binkert.org
747039Snate@binkert.orgvoid
757039Snate@binkert.orgNetDest::removeNetDest(const NetDest& netDest)
766145Snate@binkert.org{
777039Snate@binkert.org    assert(m_bits.size() == netDest.getSize());
787039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
797039Snate@binkert.org        m_bits[i].removeSet(netDest.m_bits[i]);
807039Snate@binkert.org    }
816145Snate@binkert.org}
826145Snate@binkert.org
837039Snate@binkert.orgvoid
847039Snate@binkert.orgNetDest::clear()
856145Snate@binkert.org{
867039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
877039Snate@binkert.org        m_bits[i].clear();
887039Snate@binkert.org    }
896145Snate@binkert.org}
906145Snate@binkert.org
917039Snate@binkert.orgvoid
927039Snate@binkert.orgNetDest::broadcast()
936145Snate@binkert.org{
947039Snate@binkert.org    for (MachineType machine = MachineType_FIRST;
957039Snate@binkert.org         machine < MachineType_NUM; ++machine) {
967039Snate@binkert.org        broadcast(machine);
977039Snate@binkert.org    }
986145Snate@binkert.org}
996145Snate@binkert.org
1007039Snate@binkert.orgvoid
1017039Snate@binkert.orgNetDest::broadcast(MachineType machineType)
1027039Snate@binkert.org{
1037039Snate@binkert.org    for (int i = 0; i < MachineType_base_count(machineType); i++) {
1047039Snate@binkert.org        MachineID mach = {machineType, i};
1057039Snate@binkert.org        add(mach);
1067039Snate@binkert.org    }
1076145Snate@binkert.org}
1086145Snate@binkert.org
1096145Snate@binkert.org//For Princeton Network
1107039Snate@binkert.orgVector<NodeID>
1117039Snate@binkert.orgNetDest::getAllDest()
1127039Snate@binkert.org{
1137039Snate@binkert.org    Vector<NodeID> dest;
1147039Snate@binkert.org    dest.clear();
1157039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1167039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
1177039Snate@binkert.org            if (m_bits[i].isElement(j)) {
1187039Snate@binkert.org                int id = MachineType_base_number((MachineType)i) + j;
1197039Snate@binkert.org                dest.insertAtBottom((NodeID)id);
1207039Snate@binkert.org            }
1216145Snate@binkert.org        }
1227039Snate@binkert.org    }
1237039Snate@binkert.org    return dest;
1246145Snate@binkert.org}
1256145Snate@binkert.org
1267039Snate@binkert.orgint
1277039Snate@binkert.orgNetDest::count() const
1286145Snate@binkert.org{
1297039Snate@binkert.org    int counter = 0;
1307039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1317039Snate@binkert.org        counter += m_bits[i].count();
1327039Snate@binkert.org    }
1337039Snate@binkert.org    return counter;
1346145Snate@binkert.org}
1356145Snate@binkert.org
1367039Snate@binkert.orgNodeID
1377039Snate@binkert.orgNetDest::elementAt(MachineID index)
1387039Snate@binkert.org{
1397039Snate@binkert.org    return m_bits[vecIndex(index)].elementAt(bitIndex(index.num));
1406145Snate@binkert.org}
1416145Snate@binkert.org
1427039Snate@binkert.orgMachineID
1437039Snate@binkert.orgNetDest::smallestElement() const
1446145Snate@binkert.org{
1457039Snate@binkert.org    assert(count() > 0);
1467039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1477039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
1487039Snate@binkert.org            if (m_bits[i].isElement(j)) {
1497039Snate@binkert.org                MachineID mach = {MachineType_from_base_level(i), j};
1507039Snate@binkert.org                return mach;
1517039Snate@binkert.org            }
1527039Snate@binkert.org        }
1536145Snate@binkert.org    }
1547039Snate@binkert.org    ERROR_MSG("No smallest element of an empty set.");
1556145Snate@binkert.org}
1566145Snate@binkert.org
1577039Snate@binkert.orgMachineID
1587039Snate@binkert.orgNetDest::smallestElement(MachineType machine) const
1596145Snate@binkert.org{
1607039Snate@binkert.org    int size = m_bits[MachineType_base_level(machine)].getSize();
1617039Snate@binkert.org    for (int j = 0; j < size; j++) {
1627039Snate@binkert.org        if (m_bits[MachineType_base_level(machine)].isElement(j)) {
1637039Snate@binkert.org            MachineID mach = {machine, j};
1647039Snate@binkert.org            return mach;
1657039Snate@binkert.org        }
1666145Snate@binkert.org    }
1676145Snate@binkert.org
1687039Snate@binkert.org    ERROR_MSG("No smallest element of given MachineType.");
1696145Snate@binkert.org}
1706145Snate@binkert.org
1716145Snate@binkert.org// Returns true iff all bits are set
1727039Snate@binkert.orgbool
1737039Snate@binkert.orgNetDest::isBroadcast() const
1746145Snate@binkert.org{
1757039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1767039Snate@binkert.org        if (!m_bits[i].isBroadcast()) {
1777039Snate@binkert.org            return false;
1787039Snate@binkert.org        }
1796145Snate@binkert.org    }
1807039Snate@binkert.org    return true;
1816145Snate@binkert.org}
1826145Snate@binkert.org
1836145Snate@binkert.org// Returns true iff no bits are set
1847039Snate@binkert.orgbool
1857039Snate@binkert.orgNetDest::isEmpty() const
1866145Snate@binkert.org{
1877039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1887039Snate@binkert.org        if (!m_bits[i].isEmpty()) {
1897039Snate@binkert.org            return false;
1907039Snate@binkert.org        }
1916145Snate@binkert.org    }
1927039Snate@binkert.org    return true;
1936145Snate@binkert.org}
1946145Snate@binkert.org
1956145Snate@binkert.org// returns the logical OR of "this" set and orNetDest
1967039Snate@binkert.orgNetDest
1977039Snate@binkert.orgNetDest::OR(const NetDest& orNetDest) const
1986145Snate@binkert.org{
1997039Snate@binkert.org    assert(m_bits.size() == orNetDest.getSize());
2007039Snate@binkert.org    NetDest result;
2017039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2027039Snate@binkert.org        result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]);
2037039Snate@binkert.org    }
2047039Snate@binkert.org    return result;
2056145Snate@binkert.org}
2066145Snate@binkert.org
2076145Snate@binkert.org// returns the logical AND of "this" set and andNetDest
2087039Snate@binkert.orgNetDest
2097039Snate@binkert.orgNetDest::AND(const NetDest& andNetDest) const
2106145Snate@binkert.org{
2117039Snate@binkert.org    assert(m_bits.size() == andNetDest.getSize());
2127039Snate@binkert.org    NetDest result;
2137039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2147039Snate@binkert.org        result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]);
2157039Snate@binkert.org    }
2167039Snate@binkert.org    return result;
2176145Snate@binkert.org}
2186145Snate@binkert.org
2196145Snate@binkert.org// Returns true if the intersection of the two sets is non-empty
2207039Snate@binkert.orgbool
2217039Snate@binkert.orgNetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const
2226145Snate@binkert.org{
2237039Snate@binkert.org    assert(m_bits.size() == other_netDest.getSize());
2247039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2257089Snate@binkert.org        if (!m_bits[i].intersectionIsEmpty(other_netDest.m_bits[i])) {
2267039Snate@binkert.org            return true;
2277039Snate@binkert.org        }
2286145Snate@binkert.org    }
2297039Snate@binkert.org    return false;
2306145Snate@binkert.org}
2316145Snate@binkert.org
2327039Snate@binkert.orgbool
2337039Snate@binkert.orgNetDest::isSuperset(const NetDest& test) const
2346145Snate@binkert.org{
2357039Snate@binkert.org    assert(m_bits.size() == test.getSize());
2366145Snate@binkert.org
2377039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2387039Snate@binkert.org        if (!m_bits[i].isSuperset(test.m_bits[i])) {
2397039Snate@binkert.org            return false;
2407039Snate@binkert.org        }
2416145Snate@binkert.org    }
2427039Snate@binkert.org    return true;
2436145Snate@binkert.org}
2446145Snate@binkert.org
2457039Snate@binkert.orgbool
2467039Snate@binkert.orgNetDest::isElement(MachineID element) const
2476145Snate@binkert.org{
2487039Snate@binkert.org    return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num));
2496145Snate@binkert.org}
2506145Snate@binkert.org
2517039Snate@binkert.orgvoid
2527039Snate@binkert.orgNetDest::setSize()
2536145Snate@binkert.org{
2547039Snate@binkert.org    m_bits.setSize(MachineType_base_level(MachineType_NUM));
2557039Snate@binkert.org    assert(m_bits.size() == MachineType_NUM);
2566145Snate@binkert.org
2577039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2587039Snate@binkert.org        m_bits[i].setSize(MachineType_base_count((MachineType)i));
2597039Snate@binkert.org    }
2606145Snate@binkert.org}
2616145Snate@binkert.org
2627039Snate@binkert.orgvoid
2637055Snate@binkert.orgNetDest::print(std::ostream& out) const
2646145Snate@binkert.org{
2657039Snate@binkert.org    out << "[NetDest (" << m_bits.size() << ") ";
2666145Snate@binkert.org
2677039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2687039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
2697039Snate@binkert.org            out << (bool) m_bits[i].isElement(j) << " ";
2707039Snate@binkert.org        }
2717039Snate@binkert.org        out << " - ";
2726145Snate@binkert.org    }
2737039Snate@binkert.org    out << "]";
2746145Snate@binkert.org}
2756145Snate@binkert.org
276