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