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