gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Set.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 // modified by Dan Gibson on 05/20/05 to accomidate FASTER
30 // >32 set lengths, using an array of ints w/ 32 bits/int
31 
32 #ifndef __MEM_RUBY_COMMON_SET_HH__
33 #define __MEM_RUBY_COMMON_SET_HH__
34 
35 #include <bitset>
36 #include <cassert>
37 #include <iostream>
38 
39 #include "base/misc.hh"
41 
42 // Change for systems with more than 64 controllers of a particular type.
43 const int NUMBER_BITS_PER_SET = 64;
44 
45 class Set
46 {
47  private:
48  // Number of bits in use in this set.
49  int m_nSize;
50  std::bitset<NUMBER_BITS_PER_SET> bits;
51 
52  public:
53  Set() : m_nSize(0) {}
54 
55  Set(int size) : m_nSize(size)
56  {
57  if (size > NUMBER_BITS_PER_SET)
58  fatal("Number of bits(%d) < size specified(%d). "
59  "Increase the number of bits and recompile.\n",
60  NUMBER_BITS_PER_SET, size);
61  }
62 
63  Set(const Set& obj) : m_nSize(obj.m_nSize), bits(obj.bits) {}
64  ~Set() {}
65 
66  Set& operator=(const Set& obj)
67  {
68  m_nSize = obj.m_nSize;
69  bits = obj.bits;
70  return *this;
71  }
72 
73  void
75  {
76  bits.set(index);
77  }
78 
79  /*
80  * This function should set all the bits in the current set that are
81  * already set in the parameter set
82  */
83  void
84  addSet(const Set& obj)
85  {
86  assert(m_nSize == obj.m_nSize);
87  bits |= obj.bits;
88  }
89 
90  /*
91  * This function clears bits that are =1 in the parameter set
92  */
93  void
94  remove(NodeID index)
95  {
96  bits.reset(index);
97  }
98 
99  /*
100  * This function clears bits that are =1 in the parameter set
101  */
102  void
103  removeSet(const Set& obj)
104  {
105  assert(m_nSize == obj.m_nSize);
106  bits &= (~obj.bits);
107  }
108 
109  void clear() { bits.reset(); }
110 
111  /*
112  * this function sets all bits in the set
113  */
114  void broadcast()
115  {
116  bits.set();
117  for (int j = m_nSize; j < NUMBER_BITS_PER_SET; ++j) {
118  bits.reset(j);
119  }
120  }
121 
122  /*
123  * This function returns the population count of 1's in the set
124  */
125  int count() const { return bits.count(); }
126 
127  /*
128  * This function checks for set equality
129  */
130  bool
131  isEqual(const Set& obj) const
132  {
133  assert(m_nSize == obj.m_nSize);
134  return bits == obj.bits;
135  }
136 
137  // return the logical OR of this set and orSet
138  Set
139  OR(const Set& obj) const
140  {
141  assert(m_nSize == obj.m_nSize);
142  Set r(m_nSize);
143  r.bits = bits | obj.bits;
144  return r;
145  };
146 
147  // return the logical AND of this set and andSet
148  Set
149  AND(const Set& obj) const
150  {
151  assert(m_nSize == obj.m_nSize);
152  Set r(m_nSize);
153  r.bits = bits & obj.bits;
154  return r;
155  }
156 
157  // Returns true if the intersection of the two sets is empty
158  bool
159  intersectionIsEmpty(const Set& obj) const
160  {
161  std::bitset<NUMBER_BITS_PER_SET> r = bits & obj.bits;
162  return r.none();
163  }
164 
165  /*
166  * Returns false if a bit is set in the parameter set that is NOT set
167  * in this set
168  */
169  bool
170  isSuperset(const Set& test) const
171  {
172  assert(m_nSize == test.m_nSize);
173  std::bitset<NUMBER_BITS_PER_SET> r = bits | test.bits;
174  return (r == bits);
175  }
176 
177  bool isSubset(const Set& test) const { return test.isSuperset(*this); }
178 
179  bool isElement(NodeID element) const { return bits.test(element); }
180 
181  /*
182  * this function returns true iff all bits in use are set
183  */
184  bool
185  isBroadcast() const
186  {
187  return (bits.count() == m_nSize);
188  }
189 
190  bool isEmpty() const { return bits.none(); }
191 
193  {
194  for (int i = 0; i < m_nSize; ++i) {
195  if (bits.test(i)) {
196  return i;
197  }
198  }
199  panic("No smallest element of an empty set.");
200  }
201 
202  bool elementAt(int index) const { return bits[index]; }
203 
204  int getSize() const { return m_nSize; }
205 
206  void
208  {
209  if (size > NUMBER_BITS_PER_SET)
210  fatal("Number of bits(%d) < size specified(%d). "
211  "Increase the number of bits and recompile.\n",
212  NUMBER_BITS_PER_SET, size);
213  m_nSize = size;
214  bits.reset();
215  }
216 
217  void print(std::ostream& out) const
218  {
219  out << "[Set (" << m_nSize << "): " << bits << "]";
220  }
221 };
222 
223 inline std::ostream&
224 operator<<(std::ostream& out, const Set& obj)
225 {
226  obj.print(out);
227  out << std::flush;
228  return out;
229 }
230 
231 #endif // __MEM_RUBY_COMMON_SET_HH__
Bitfield< 30, 0 > index
~Set()
Definition: Set.hh:64
int count() const
Definition: Set.hh:125
Set(int size)
Definition: Set.hh:55
Bitfield< 7 > i
Definition: miscregs.hh:1378
void print(std::ostream &out) const
Definition: Set.hh:217
#define panic(...)
Definition: misc.hh:153
void removeSet(const Set &obj)
Definition: Set.hh:103
void setSize(int size)
Definition: Set.hh:207
std::bitset< NUMBER_BITS_PER_SET > bits
Definition: Set.hh:50
Set(const Set &obj)
Definition: Set.hh:63
int getSize() const
Definition: Set.hh:204
bool isBroadcast() const
Definition: Set.hh:185
unsigned int NodeID
Definition: TypeDefines.hh:34
Set()
Definition: Set.hh:53
std::ostream & operator<<(std::ostream &out, const Set &obj)
Definition: Set.hh:224
bool isSuperset(const Set &test) const
Definition: Set.hh:170
#define fatal(...)
Definition: misc.hh:163
Set AND(const Set &obj) const
Definition: Set.hh:149
bool intersectionIsEmpty(const Set &obj) const
Definition: Set.hh:159
bool isSubset(const Set &test) const
Definition: Set.hh:177
bool elementAt(int index) const
Definition: Set.hh:202
void addSet(const Set &obj)
Definition: Set.hh:84
bool isEmpty() const
Definition: Set.hh:190
Set & operator=(const Set &obj)
Definition: Set.hh:66
Bitfield< 24 > j
Definition: miscregs.hh:1369
bool isEqual(const Set &obj) const
Definition: Set.hh:131
void broadcast()
Definition: Set.hh:114
int size()
Definition: pagetable.hh:146
const int NUMBER_BITS_PER_SET
Definition: Set.hh:43
void add(NodeID index)
Definition: Set.hh:74
int m_nSize
Definition: Set.hh:49
NodeID smallestElement() const
Definition: Set.hh:192
Set OR(const Set &obj) const
Definition: Set.hh:139
bool isElement(NodeID element) const
Definition: Set.hh:179
void clear()
Definition: Set.hh:109
Definition: Set.hh:45

Generated on Fri Jun 9 2017 13:03:49 for gem5 by doxygen 1.8.6