NetDest.cc revision 6145
16145Snate@binkert.org 26145Snate@binkert.org/* 36145Snate@binkert.org * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 46145Snate@binkert.org * All rights reserved. 56145Snate@binkert.org * 66145Snate@binkert.org * Redistribution and use in source and binary forms, with or without 76145Snate@binkert.org * modification, are permitted provided that the following conditions are 86145Snate@binkert.org * met: redistributions of source code must retain the above copyright 96145Snate@binkert.org * notice, this list of conditions and the following disclaimer; 106145Snate@binkert.org * redistributions in binary form must reproduce the above copyright 116145Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 126145Snate@binkert.org * documentation and/or other materials provided with the distribution; 136145Snate@binkert.org * neither the name of the copyright holders nor the names of its 146145Snate@binkert.org * contributors may be used to endorse or promote products derived from 156145Snate@binkert.org * this software without specific prior written permission. 166145Snate@binkert.org * 176145Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 186145Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 196145Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 206145Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 216145Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 226145Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 236145Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 246145Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 256145Snate@binkert.org * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 266145Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 276145Snate@binkert.org * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 286145Snate@binkert.org */ 296145Snate@binkert.org 306145Snate@binkert.org/* 316145Snate@binkert.org * NetDest.C 326145Snate@binkert.org * 336145Snate@binkert.org * Description: See NetDest.h 346145Snate@binkert.org * 356145Snate@binkert.org * $Id$ 366145Snate@binkert.org * 376145Snate@binkert.org */ 386145Snate@binkert.org 396145Snate@binkert.org#include "NetDest.hh" 406145Snate@binkert.org#include "RubyConfig.hh" 416145Snate@binkert.org#include "Protocol.hh" 426145Snate@binkert.org 436145Snate@binkert.orgNetDest::NetDest() 446145Snate@binkert.org{ 456145Snate@binkert.org setSize(); 466145Snate@binkert.org} 476145Snate@binkert.org 486145Snate@binkert.orgvoid NetDest::add(MachineID newElement) 496145Snate@binkert.org{ 506145Snate@binkert.org m_bits[vecIndex(newElement)].add(bitIndex(newElement.num)); 516145Snate@binkert.org} 526145Snate@binkert.org 536145Snate@binkert.orgvoid NetDest::addNetDest(const NetDest& netDest) 546145Snate@binkert.org{ 556145Snate@binkert.org assert(m_bits.size() == netDest.getSize()); 566145Snate@binkert.org for (int i = 0; i < m_bits.size(); i++) { 576145Snate@binkert.org m_bits[i].addSet(netDest.m_bits[i]); 586145Snate@binkert.org } 596145Snate@binkert.org} 606145Snate@binkert.org 616145Snate@binkert.orgvoid NetDest::addRandom() 626145Snate@binkert.org{ 636145Snate@binkert.org int i = random()%m_bits.size(); 646145Snate@binkert.org m_bits[i].addRandom(); 656145Snate@binkert.org} 666145Snate@binkert.org 676145Snate@binkert.orgvoid NetDest::setNetDest(MachineType machine, const Set& set) 686145Snate@binkert.org{ 696145Snate@binkert.org // assure that there is only one set of destinations for this machine 706145Snate@binkert.org assert(MachineType_base_level((MachineType)(machine+1)) - MachineType_base_level(machine) == 1); 716145Snate@binkert.org m_bits[MachineType_base_level(machine)] = set; 726145Snate@binkert.org} 736145Snate@binkert.org 746145Snate@binkert.orgvoid NetDest::remove(MachineID oldElement) 756145Snate@binkert.org{ 766145Snate@binkert.org m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num)); 776145Snate@binkert.org} 786145Snate@binkert.org 796145Snate@binkert.orgvoid NetDest::removeNetDest(const NetDest& netDest) 806145Snate@binkert.org{ 816145Snate@binkert.org assert(m_bits.size() == netDest.getSize()); 826145Snate@binkert.org for (int i = 0; i < m_bits.size(); i++) { 836145Snate@binkert.org m_bits[i].removeSet(netDest.m_bits[i]); 846145Snate@binkert.org 856145Snate@binkert.org } 866145Snate@binkert.org} 876145Snate@binkert.org 886145Snate@binkert.orgvoid NetDest::clear() 896145Snate@binkert.org{ 906145Snate@binkert.org for (int i = 0; i < m_bits.size(); i++) { 916145Snate@binkert.org m_bits[i].clear(); 926145Snate@binkert.org } 936145Snate@binkert.org} 946145Snate@binkert.org 956145Snate@binkert.orgvoid NetDest::broadcast() 966145Snate@binkert.org{ 976145Snate@binkert.org for (MachineType machine = MachineType_FIRST; machine < MachineType_NUM; ++machine) { 986145Snate@binkert.org broadcast(machine); 996145Snate@binkert.org } 1006145Snate@binkert.org} 1016145Snate@binkert.org 1026145Snate@binkert.orgvoid NetDest::broadcast(MachineType machineType) { 1036145Snate@binkert.org 1046145Snate@binkert.org for (int i = 0; i < MachineType_base_count(machineType); i++) { 1056145Snate@binkert.org MachineID mach = {machineType, i}; 1066145Snate@binkert.org add(mach); 1076145Snate@binkert.org } 1086145Snate@binkert.org} 1096145Snate@binkert.org 1106145Snate@binkert.org//For Princeton Network 1116145Snate@binkert.orgVector<NodeID> NetDest::getAllDest() { 1126145Snate@binkert.org Vector<NodeID> dest; 1136145Snate@binkert.org dest.clear(); 1146145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1156145Snate@binkert.org for (int j=0; j<m_bits[i].getSize(); j++) { 1166145Snate@binkert.org if (m_bits[i].isElement(j)) { 1176145Snate@binkert.org dest.insertAtBottom((NodeID) (MachineType_base_number((MachineType) i) + j)); 1186145Snate@binkert.org } 1196145Snate@binkert.org } 1206145Snate@binkert.org } 1216145Snate@binkert.org return dest; 1226145Snate@binkert.org} 1236145Snate@binkert.org 1246145Snate@binkert.orgint NetDest::count() const 1256145Snate@binkert.org{ 1266145Snate@binkert.org int counter = 0; 1276145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1286145Snate@binkert.org counter += m_bits[i].count(); 1296145Snate@binkert.org } 1306145Snate@binkert.org return counter; 1316145Snate@binkert.org} 1326145Snate@binkert.org 1336145Snate@binkert.orgNodeID NetDest::elementAt(MachineID index) { 1346145Snate@binkert.org return m_bits[vecIndex(index)].elementAt(bitIndex(index.num)); 1356145Snate@binkert.org} 1366145Snate@binkert.org 1376145Snate@binkert.orgNodeID NetDest::smallestElement() const 1386145Snate@binkert.org{ 1396145Snate@binkert.org assert(count() > 0); 1406145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1416145Snate@binkert.org for (int j=0; j<m_bits[i].getSize(); j++) { 1426145Snate@binkert.org if (m_bits[i].isElement(j)) { 1436145Snate@binkert.org return j; 1446145Snate@binkert.org } 1456145Snate@binkert.org } 1466145Snate@binkert.org } 1476145Snate@binkert.org ERROR_MSG("No smallest element of an empty set."); 1486145Snate@binkert.org} 1496145Snate@binkert.org 1506145Snate@binkert.orgMachineID NetDest::smallestElement(MachineType machine) const 1516145Snate@binkert.org{ 1526145Snate@binkert.org for (int j = 0; j < m_bits[MachineType_base_level(machine)].getSize(); j++) { 1536145Snate@binkert.org if (m_bits[MachineType_base_level(machine)].isElement(j)) { 1546145Snate@binkert.org MachineID mach = {machine, j}; 1556145Snate@binkert.org return mach; 1566145Snate@binkert.org } 1576145Snate@binkert.org } 1586145Snate@binkert.org 1596145Snate@binkert.org ERROR_MSG("No smallest element of given MachineType."); 1606145Snate@binkert.org} 1616145Snate@binkert.org 1626145Snate@binkert.org 1636145Snate@binkert.org// Returns true iff all bits are set 1646145Snate@binkert.orgbool NetDest::isBroadcast() const 1656145Snate@binkert.org{ 1666145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1676145Snate@binkert.org if (!m_bits[i].isBroadcast()) { 1686145Snate@binkert.org return false; 1696145Snate@binkert.org } 1706145Snate@binkert.org } 1716145Snate@binkert.org return true; 1726145Snate@binkert.org} 1736145Snate@binkert.org 1746145Snate@binkert.org// Returns true iff no bits are set 1756145Snate@binkert.orgbool NetDest::isEmpty() const 1766145Snate@binkert.org{ 1776145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1786145Snate@binkert.org if (!m_bits[i].isEmpty()) { 1796145Snate@binkert.org return false; 1806145Snate@binkert.org } 1816145Snate@binkert.org } 1826145Snate@binkert.org return true; 1836145Snate@binkert.org} 1846145Snate@binkert.org 1856145Snate@binkert.org// returns the logical OR of "this" set and orNetDest 1866145Snate@binkert.orgNetDest NetDest::OR(const NetDest& orNetDest) const 1876145Snate@binkert.org{ 1886145Snate@binkert.org assert(m_bits.size() == orNetDest.getSize()); 1896145Snate@binkert.org NetDest result; 1906145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 1916145Snate@binkert.org result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]); 1926145Snate@binkert.org } 1936145Snate@binkert.org return result; 1946145Snate@binkert.org} 1956145Snate@binkert.org 1966145Snate@binkert.org 1976145Snate@binkert.org// returns the logical AND of "this" set and andNetDest 1986145Snate@binkert.orgNetDest NetDest::AND(const NetDest& andNetDest) const 1996145Snate@binkert.org{ 2006145Snate@binkert.org assert(m_bits.size() == andNetDest.getSize()); 2016145Snate@binkert.org NetDest result; 2026145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 2036145Snate@binkert.org result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]); 2046145Snate@binkert.org } 2056145Snate@binkert.org return result; 2066145Snate@binkert.org} 2076145Snate@binkert.org 2086145Snate@binkert.org// Returns true if the intersection of the two sets is non-empty 2096145Snate@binkert.orgbool NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const 2106145Snate@binkert.org{ 2116145Snate@binkert.org assert(m_bits.size() == other_netDest.getSize()); 2126145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 2136145Snate@binkert.org if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) { 2146145Snate@binkert.org return true; 2156145Snate@binkert.org } 2166145Snate@binkert.org } 2176145Snate@binkert.org return false; 2186145Snate@binkert.org} 2196145Snate@binkert.org 2206145Snate@binkert.orgbool NetDest::isSuperset(const NetDest& test) const 2216145Snate@binkert.org{ 2226145Snate@binkert.org assert(m_bits.size() == test.getSize()); 2236145Snate@binkert.org 2246145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 2256145Snate@binkert.org if (!m_bits[i].isSuperset(test.m_bits[i])) { 2266145Snate@binkert.org return false; 2276145Snate@binkert.org } 2286145Snate@binkert.org } 2296145Snate@binkert.org return true; 2306145Snate@binkert.org} 2316145Snate@binkert.org 2326145Snate@binkert.orgbool NetDest::isElement(MachineID element) const 2336145Snate@binkert.org{ 2346145Snate@binkert.org return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num)); 2356145Snate@binkert.org} 2366145Snate@binkert.org 2376145Snate@binkert.orgvoid NetDest::setSize() 2386145Snate@binkert.org{ 2396145Snate@binkert.org m_bits.setSize(MachineType_base_level(MachineType_NUM)); 2406145Snate@binkert.org assert(m_bits.size() == MachineType_NUM); 2416145Snate@binkert.org 2426145Snate@binkert.org for (int i = 0; i < m_bits.size(); i++) { 2436145Snate@binkert.org m_bits[i].setSize(MachineType_base_count((MachineType)i)); 2446145Snate@binkert.org } 2456145Snate@binkert.org} 2466145Snate@binkert.org 2476145Snate@binkert.orgvoid NetDest::print(ostream& out) const 2486145Snate@binkert.org{ 2496145Snate@binkert.org out << "[NetDest (" << m_bits.size() << ") "; 2506145Snate@binkert.org 2516145Snate@binkert.org for (int i=0; i<m_bits.size(); i++) { 2526145Snate@binkert.org for (int j=0; j<m_bits[i].getSize(); j++) { 2536145Snate@binkert.org out << (bool) m_bits[i].isElement(j) << " "; 2546145Snate@binkert.org } 2556145Snate@binkert.org out << " - "; 2566145Snate@binkert.org } 2576145Snate@binkert.org out << "]"; 2586145Snate@binkert.org} 2596145Snate@binkert.org 260