build: fix compile problems pointed out by gcc 4.4
[gem5.git] / src / mem / ruby / common / NetDest.cc
1
2 /*
3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer;
10 * redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution;
13 * neither the name of the copyright holders nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30 /*
31 * NetDest.C
32 *
33 * Description: See NetDest.hh
34 *
35 * $Id$
36 *
37 */
38
39 #include "mem/ruby/common/NetDest.hh"
40 #include "mem/protocol/Protocol.hh"
41
42 NetDest::NetDest()
43 {
44 setSize();
45 }
46
47 void NetDest::add(MachineID newElement)
48 {
49 m_bits[vecIndex(newElement)].add(bitIndex(newElement.num));
50 }
51
52 void NetDest::addNetDest(const NetDest& netDest)
53 {
54 assert(m_bits.size() == netDest.getSize());
55 for (int i = 0; i < m_bits.size(); i++) {
56 m_bits[i].addSet(netDest.m_bits[i]);
57 }
58 }
59
60 void NetDest::addRandom()
61 {
62 int i = random()%m_bits.size();
63 m_bits[i].addRandom();
64 }
65
66 void NetDest::setNetDest(MachineType machine, const Set& set)
67 {
68 // assure that there is only one set of destinations for this machine
69 assert(MachineType_base_level((MachineType)(machine+1)) - MachineType_base_level(machine) == 1);
70 m_bits[MachineType_base_level(machine)] = set;
71 }
72
73 void NetDest::remove(MachineID oldElement)
74 {
75 m_bits[vecIndex(oldElement)].remove(bitIndex(oldElement.num));
76 }
77
78 void NetDest::removeNetDest(const NetDest& netDest)
79 {
80 assert(m_bits.size() == netDest.getSize());
81 for (int i = 0; i < m_bits.size(); i++) {
82 m_bits[i].removeSet(netDest.m_bits[i]);
83
84 }
85 }
86
87 void NetDest::clear()
88 {
89 for (int i = 0; i < m_bits.size(); i++) {
90 m_bits[i].clear();
91 }
92 }
93
94 void NetDest::broadcast()
95 {
96 for (MachineType machine = MachineType_FIRST; machine < MachineType_NUM; ++machine) {
97 broadcast(machine);
98 }
99 }
100
101 void NetDest::broadcast(MachineType machineType) {
102
103 for (int i = 0; i < MachineType_base_count(machineType); i++) {
104 MachineID mach = {machineType, i};
105 add(mach);
106 }
107 }
108
109 //For Princeton Network
110 Vector<NodeID> NetDest::getAllDest() {
111 Vector<NodeID> dest;
112 dest.clear();
113 for (int i=0; i<m_bits.size(); i++) {
114 for (int j=0; j<m_bits[i].getSize(); j++) {
115 if (m_bits[i].isElement(j)) {
116 dest.insertAtBottom((NodeID) (MachineType_base_number((MachineType) i) + j));
117 }
118 }
119 }
120 return dest;
121 }
122
123 int NetDest::count() const
124 {
125 int counter = 0;
126 for (int i=0; i<m_bits.size(); i++) {
127 counter += m_bits[i].count();
128 }
129 return counter;
130 }
131
132 NodeID NetDest::elementAt(MachineID index) {
133 return m_bits[vecIndex(index)].elementAt(bitIndex(index.num));
134 }
135
136 NodeID NetDest::smallestElement() const
137 {
138 assert(count() > 0);
139 for (int i=0; i<m_bits.size(); i++) {
140 for (int j=0; j<m_bits[i].getSize(); j++) {
141 if (m_bits[i].isElement(j)) {
142 return j;
143 }
144 }
145 }
146 ERROR_MSG("No smallest element of an empty set.");
147 }
148
149 MachineID NetDest::smallestElement(MachineType machine) const
150 {
151 for (int j = 0; j < m_bits[MachineType_base_level(machine)].getSize(); j++) {
152 if (m_bits[MachineType_base_level(machine)].isElement(j)) {
153 MachineID mach = {machine, j};
154 return mach;
155 }
156 }
157
158 ERROR_MSG("No smallest element of given MachineType.");
159 }
160
161
162 // Returns true iff all bits are set
163 bool NetDest::isBroadcast() const
164 {
165 for (int i=0; i<m_bits.size(); i++) {
166 if (!m_bits[i].isBroadcast()) {
167 return false;
168 }
169 }
170 return true;
171 }
172
173 // Returns true iff no bits are set
174 bool NetDest::isEmpty() const
175 {
176 for (int i=0; i<m_bits.size(); i++) {
177 if (!m_bits[i].isEmpty()) {
178 return false;
179 }
180 }
181 return true;
182 }
183
184 // returns the logical OR of "this" set and orNetDest
185 NetDest NetDest::OR(const NetDest& orNetDest) const
186 {
187 assert(m_bits.size() == orNetDest.getSize());
188 NetDest result;
189 for (int i=0; i<m_bits.size(); i++) {
190 result.m_bits[i] = m_bits[i].OR(orNetDest.m_bits[i]);
191 }
192 return result;
193 }
194
195
196 // returns the logical AND of "this" set and andNetDest
197 NetDest NetDest::AND(const NetDest& andNetDest) const
198 {
199 assert(m_bits.size() == andNetDest.getSize());
200 NetDest result;
201 for (int i=0; i<m_bits.size(); i++) {
202 result.m_bits[i] = m_bits[i].AND(andNetDest.m_bits[i]);
203 }
204 return result;
205 }
206
207 // Returns true if the intersection of the two sets is non-empty
208 bool NetDest::intersectionIsNotEmpty(const NetDest& other_netDest) const
209 {
210 assert(m_bits.size() == other_netDest.getSize());
211 for (int i=0; i<m_bits.size(); i++) {
212 if (m_bits[i].intersectionIsNotEmpty(other_netDest.m_bits[i])) {
213 return true;
214 }
215 }
216 return false;
217 }
218
219 bool NetDest::isSuperset(const NetDest& test) const
220 {
221 assert(m_bits.size() == test.getSize());
222
223 for (int i=0; i<m_bits.size(); i++) {
224 if (!m_bits[i].isSuperset(test.m_bits[i])) {
225 return false;
226 }
227 }
228 return true;
229 }
230
231 bool NetDest::isElement(MachineID element) const
232 {
233 return ((m_bits[vecIndex(element)])).isElement(bitIndex(element.num));
234 }
235
236 void NetDest::setSize()
237 {
238 m_bits.setSize(MachineType_base_level(MachineType_NUM));
239 assert(m_bits.size() == MachineType_NUM);
240
241 for (int i = 0; i < m_bits.size(); i++) {
242 m_bits[i].setSize(MachineType_base_count((MachineType)i));
243 }
244 }
245
246 void NetDest::print(ostream& out) const
247 {
248 out << "[NetDest (" << m_bits.size() << ") ";
249
250 for (int i=0; i<m_bits.size(); i++) {
251 for (int j=0; j<m_bits[i].getSize(); j++) {
252 out << (bool) m_bits[i].isElement(j) << " ";
253 }
254 out << " - ";
255 }
256 out << "]";
257 }
258