NetDest.cc revision 10004
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
298946Sandreas.hansson@arm.com#include <algorithm>
308946Sandreas.hansson@arm.com
316154Snate@binkert.org#include "mem/ruby/common/NetDest.hh"
326145Snate@binkert.org
336145Snate@binkert.orgNetDest::NetDest()
346145Snate@binkert.org{
357454Snate@binkert.org  resize();
366145Snate@binkert.org}
376145Snate@binkert.org
387039Snate@binkert.orgvoid
397039Snate@binkert.orgNetDest::add(MachineID newElement)
406145Snate@binkert.org{
419138Spowerjg@cs.wisc.edu    assert(bitIndex(newElement.num) < m_bits[vecIndex(newElement)].getSize());
427039Snate@binkert.org    m_bits[vecIndex(newElement)].add(bitIndex(newElement.num));
436145Snate@binkert.org}
446145Snate@binkert.org
457039Snate@binkert.orgvoid
467039Snate@binkert.orgNetDest::addNetDest(const NetDest& netDest)
476145Snate@binkert.org{
487039Snate@binkert.org    assert(m_bits.size() == netDest.getSize());
497039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
507039Snate@binkert.org        m_bits[i].addSet(netDest.m_bits[i]);
517039Snate@binkert.org    }
526145Snate@binkert.org}
536145Snate@binkert.org
547039Snate@binkert.orgvoid
557039Snate@binkert.orgNetDest::addRandom()
566145Snate@binkert.org{
577039Snate@binkert.org    int i = random()%m_bits.size();
587039Snate@binkert.org    m_bits[i].addRandom();
596145Snate@binkert.org}
606145Snate@binkert.org
617039Snate@binkert.orgvoid
627039Snate@binkert.orgNetDest::setNetDest(MachineType machine, const Set& set)
636145Snate@binkert.org{
647039Snate@binkert.org    // assure that there is only one set of destinations for this machine
657039Snate@binkert.org    assert(MachineType_base_level((MachineType)(machine + 1)) -
667039Snate@binkert.org           MachineType_base_level(machine) == 1);
677039Snate@binkert.org    m_bits[MachineType_base_level(machine)] = set;
686145Snate@binkert.org}
696145Snate@binkert.org
707039Snate@binkert.orgvoid
717039Snate@binkert.orgNetDest::remove(MachineID oldElement)
726145Snate@binkert.org{
737039Snate@binkert.org    m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num));
746145Snate@binkert.org}
756145Snate@binkert.org
767039Snate@binkert.orgvoid
777039Snate@binkert.orgNetDest::removeNetDest(const NetDest& netDest)
786145Snate@binkert.org{
797039Snate@binkert.org    assert(m_bits.size() == netDest.getSize());
807039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
817039Snate@binkert.org        m_bits[i].removeSet(netDest.m_bits[i]);
827039Snate@binkert.org    }
836145Snate@binkert.org}
846145Snate@binkert.org
857039Snate@binkert.orgvoid
867039Snate@binkert.orgNetDest::clear()
876145Snate@binkert.org{
887039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
897039Snate@binkert.org        m_bits[i].clear();
907039Snate@binkert.org    }
916145Snate@binkert.org}
926145Snate@binkert.org
937039Snate@binkert.orgvoid
947039Snate@binkert.orgNetDest::broadcast()
956145Snate@binkert.org{
967039Snate@binkert.org    for (MachineType machine = MachineType_FIRST;
977039Snate@binkert.org         machine < MachineType_NUM; ++machine) {
987039Snate@binkert.org        broadcast(machine);
997039Snate@binkert.org    }
1006145Snate@binkert.org}
1016145Snate@binkert.org
1027039Snate@binkert.orgvoid
1037039Snate@binkert.orgNetDest::broadcast(MachineType machineType)
1047039Snate@binkert.org{
1057039Snate@binkert.org    for (int i = 0; i < MachineType_base_count(machineType); i++) {
1067039Snate@binkert.org        MachineID mach = {machineType, i};
1077039Snate@binkert.org        add(mach);
1087039Snate@binkert.org    }
1096145Snate@binkert.org}
1106145Snate@binkert.org
1116145Snate@binkert.org//For Princeton Network
1127454Snate@binkert.orgstd::vector<NodeID>
1137039Snate@binkert.orgNetDest::getAllDest()
1147039Snate@binkert.org{
1157454Snate@binkert.org    std::vector<NodeID> dest;
1167039Snate@binkert.org    dest.clear();
1177039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1187039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
1197039Snate@binkert.org            if (m_bits[i].isElement(j)) {
1207039Snate@binkert.org                int id = MachineType_base_number((MachineType)i) + j;
1217454Snate@binkert.org                dest.push_back((NodeID)id);
1227039Snate@binkert.org            }
1236145Snate@binkert.org        }
1247039Snate@binkert.org    }
1257039Snate@binkert.org    return dest;
1266145Snate@binkert.org}
1276145Snate@binkert.org
1287039Snate@binkert.orgint
1297039Snate@binkert.orgNetDest::count() const
1306145Snate@binkert.org{
1317039Snate@binkert.org    int counter = 0;
1327039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1337039Snate@binkert.org        counter += m_bits[i].count();
1347039Snate@binkert.org    }
1357039Snate@binkert.org    return counter;
1366145Snate@binkert.org}
1376145Snate@binkert.org
1387039Snate@binkert.orgNodeID
1397039Snate@binkert.orgNetDest::elementAt(MachineID index)
1407039Snate@binkert.org{
1417039Snate@binkert.org    return m_bits[vecIndex(index)].elementAt(bitIndex(index.num));
1426145Snate@binkert.org}
1436145Snate@binkert.org
1447039Snate@binkert.orgMachineID
1457039Snate@binkert.orgNetDest::smallestElement() const
1466145Snate@binkert.org{
1477039Snate@binkert.org    assert(count() > 0);
1487039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1497039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
1507039Snate@binkert.org            if (m_bits[i].isElement(j)) {
1517039Snate@binkert.org                MachineID mach = {MachineType_from_base_level(i), j};
1527039Snate@binkert.org                return mach;
1537039Snate@binkert.org            }
1547039Snate@binkert.org        }
1556145Snate@binkert.org    }
1567805Snilay@cs.wisc.edu    panic("No smallest element of an empty set.");
1576145Snate@binkert.org}
1586145Snate@binkert.org
1597039Snate@binkert.orgMachineID
1607039Snate@binkert.orgNetDest::smallestElement(MachineType machine) const
1616145Snate@binkert.org{
1627039Snate@binkert.org    int size = m_bits[MachineType_base_level(machine)].getSize();
1637039Snate@binkert.org    for (int j = 0; j < size; j++) {
1647039Snate@binkert.org        if (m_bits[MachineType_base_level(machine)].isElement(j)) {
1657039Snate@binkert.org            MachineID mach = {machine, j};
1667039Snate@binkert.org            return mach;
1677039Snate@binkert.org        }
1686145Snate@binkert.org    }
1696145Snate@binkert.org
1707805Snilay@cs.wisc.edu    panic("No smallest element of given MachineType.");
1716145Snate@binkert.org}
1726145Snate@binkert.org
1736145Snate@binkert.org// Returns true iff all bits are set
1747039Snate@binkert.orgbool
1757039Snate@binkert.orgNetDest::isBroadcast() const
1766145Snate@binkert.org{
1777039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1787039Snate@binkert.org        if (!m_bits[i].isBroadcast()) {
1797039Snate@binkert.org            return false;
1807039Snate@binkert.org        }
1816145Snate@binkert.org    }
1827039Snate@binkert.org    return true;
1836145Snate@binkert.org}
1846145Snate@binkert.org
1856145Snate@binkert.org// Returns true iff no bits are set
1867039Snate@binkert.orgbool
1877039Snate@binkert.orgNetDest::isEmpty() const
1886145Snate@binkert.org{
1897039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
1907039Snate@binkert.org        if (!m_bits[i].isEmpty()) {
1917039Snate@binkert.org            return false;
1927039Snate@binkert.org        }
1936145Snate@binkert.org    }
1947039Snate@binkert.org    return true;
1956145Snate@binkert.org}
1966145Snate@binkert.org
1976145Snate@binkert.org// returns the logical OR of "this" set and orNetDest
1987039Snate@binkert.orgNetDest
1997039Snate@binkert.orgNetDest::OR(const NetDest& orNetDest) const
2006145Snate@binkert.org{
2017039Snate@binkert.org    assert(m_bits.size() == orNetDest.getSize());
2027039Snate@binkert.org    NetDest result;
2037039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2047039Snate@binkert.org        result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]);
2057039Snate@binkert.org    }
2067039Snate@binkert.org    return result;
2076145Snate@binkert.org}
2086145Snate@binkert.org
2096145Snate@binkert.org// returns the logical AND of "this" set and andNetDest
2107039Snate@binkert.orgNetDest
2117039Snate@binkert.orgNetDest::AND(const NetDest& andNetDest) const
2126145Snate@binkert.org{
2137039Snate@binkert.org    assert(m_bits.size() == andNetDest.getSize());
2147039Snate@binkert.org    NetDest result;
2157039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2167039Snate@binkert.org        result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]);
2177039Snate@binkert.org    }
2187039Snate@binkert.org    return result;
2196145Snate@binkert.org}
2206145Snate@binkert.org
2216145Snate@binkert.org// Returns true if the intersection of the two sets is non-empty
2227039Snate@binkert.orgbool
2237039Snate@binkert.orgNetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const
2246145Snate@binkert.org{
2257039Snate@binkert.org    assert(m_bits.size() == other_netDest.getSize());
2267039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2277089Snate@binkert.org        if (!m_bits[i].intersectionIsEmpty(other_netDest.m_bits[i])) {
2287039Snate@binkert.org            return true;
2297039Snate@binkert.org        }
2306145Snate@binkert.org    }
2317039Snate@binkert.org    return false;
2326145Snate@binkert.org}
2336145Snate@binkert.org
2347039Snate@binkert.orgbool
2357039Snate@binkert.orgNetDest::isSuperset(const NetDest& test) const
2366145Snate@binkert.org{
2377039Snate@binkert.org    assert(m_bits.size() == test.getSize());
2386145Snate@binkert.org
2397039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2407039Snate@binkert.org        if (!m_bits[i].isSuperset(test.m_bits[i])) {
2417039Snate@binkert.org            return false;
2427039Snate@binkert.org        }
2436145Snate@binkert.org    }
2447039Snate@binkert.org    return true;
2456145Snate@binkert.org}
2466145Snate@binkert.org
2477039Snate@binkert.orgbool
2487039Snate@binkert.orgNetDest::isElement(MachineID element) const
2496145Snate@binkert.org{
2507039Snate@binkert.org    return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num));
2516145Snate@binkert.org}
2526145Snate@binkert.org
2537039Snate@binkert.orgvoid
2547454Snate@binkert.orgNetDest::resize()
2556145Snate@binkert.org{
2567454Snate@binkert.org    m_bits.resize(MachineType_base_level(MachineType_NUM));
2577039Snate@binkert.org    assert(m_bits.size() == MachineType_NUM);
2586145Snate@binkert.org
2597039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2607039Snate@binkert.org        m_bits[i].setSize(MachineType_base_count((MachineType)i));
2617039Snate@binkert.org    }
2626145Snate@binkert.org}
2636145Snate@binkert.org
2647039Snate@binkert.orgvoid
2657055Snate@binkert.orgNetDest::print(std::ostream& out) const
2666145Snate@binkert.org{
2677039Snate@binkert.org    out << "[NetDest (" << m_bits.size() << ") ";
2686145Snate@binkert.org
2697039Snate@binkert.org    for (int i = 0; i < m_bits.size(); i++) {
2707039Snate@binkert.org        for (int j = 0; j < m_bits[i].getSize(); j++) {
2717039Snate@binkert.org            out << (bool) m_bits[i].isElement(j) << " ";
2727039Snate@binkert.org        }
2737039Snate@binkert.org        out << " - ";
2746145Snate@binkert.org    }
2757039Snate@binkert.org    out << "]";
2766145Snate@binkert.org}
2776145Snate@binkert.org
27810004Snilay@cs.wisc.edubool
27910004Snilay@cs.wisc.eduNetDest::isEqual(const NetDest& n) const
28010004Snilay@cs.wisc.edu{
28110004Snilay@cs.wisc.edu    assert(m_bits.size() == n.m_bits.size());
28210004Snilay@cs.wisc.edu    for (unsigned int i = 0; i < m_bits.size(); ++i) {
28310004Snilay@cs.wisc.edu        if (!m_bits[i].isEqual(n.m_bits[i]))
28410004Snilay@cs.wisc.edu            return false;
28510004Snilay@cs.wisc.edu    }
28610004Snilay@cs.wisc.edu    return true;
28710004Snilay@cs.wisc.edu}
288