34,35d33
< #include <vector>
<
38a37
> #include "base/logging.hh"
44c43
< : Base(p), sectorBits(sizeBits - 1)
---
> : MultiBitSel(p), sectorBits(floorLog2(parFilterSize))
45a45,47
> fatal_if((numHashes * sectorBits) >
> (std::numeric_limits<Addr>::digits - offsetBits),
> "Sectors need more bits than available");
52,53c54,55
< void
< Bulk::set(Addr addr)
---
> int
> Bulk::hash(Addr addr, int hash_number) const
55,68c57
< // c0 contains the cache index bits
< int c0 = bits(addr, offsetBits + sectorBits - 1, offsetBits);
< // c1 contains the lower sectorBits permuted bits
< //Address permuted_bits = permute(addr);
< int c1 = bits(addr, (offsetBits + 2 * sectorBits) - 1,
< offsetBits + sectorBits);
< //assert(c0 < (filter_size/2));
< //assert(c0 + (filter_size/2) < filter_size);
< //assert(c1 < (filter_size/2));
< // set v0 bit
< filter[c0 + (filter.size()/2)] = 1;
< // set v1 bit
< filter[c1] = 1;
< }
---
> addr = permute(addr);
70,87c59,62
< bool
< Bulk::isSet(Addr addr) const
< {
< // c0 contains the cache index bits
< const int filter_size = filter.size();
< int c0 = bits(addr, offsetBits + sectorBits - 1, offsetBits);
< // c1 contains the lower 10 permuted bits
< //Address permuted_bits = permute(addr);
< int c1 = bits(addr, (offsetBits + 2 * sectorBits) - 1,
< offsetBits + sectorBits);
< //assert(c0 < (filter_size/2));
< //assert(c0 + (filter_size/2) < filter_size);
< //assert(c1 < (filter_size/2));
< // set v0 bit
< std::vector<int> temp_filter(filter.size(), 0);
< temp_filter[c0 + (filter_size/2)] = 1;
< // set v1 bit
< temp_filter[c1] = 1;
---
> // Get the sector-based c index
> int c = bits(addr, (offsetBits + (hash_number + 1) * sectorBits) - 1,
> offsetBits + hash_number * sectorBits);
> assert(c < filter.size()/numHashes);
89,104c64,66
< // perform filter intersection. If any c part is 0, no possibility
< // of address being in signature. get first c intersection part
< bool zero = false;
< for (int i = 0; i < filter_size/2; ++i){
< // get intersection of signatures
< temp_filter[i] = temp_filter[i] && filter[i];
< zero = zero || temp_filter[i];
< }
< zero = !zero;
< if (zero) {
< // one section is zero, no possiblility of address in signature
< // reset bits we just set
< temp_filter[c0 + (filter_size / 2)] = 0;
< temp_filter[c1] = 0;
< return false;
< }
---
> // Transform the sector-based c index into a filder index (v)
> c += (numHashes - 1 - hash_number) * (filter.size()/numHashes);
> assert(c < filter.size());
106,123c68
< // check second section
< zero = false;
< for (int i = filter_size / 2; i < filter_size; ++i) {
< // get intersection of signatures
< temp_filter[i] = temp_filter[i] && filter[i];
< zero = zero || temp_filter[i];
< }
< zero = !zero;
< if (zero) {
< // one section is zero, no possiblility of address in signature
< temp_filter[c0 + (filter_size / 2)] = 0;
< temp_filter[c1] = 0;
< return false;
< }
< // one section has at least one bit set
< temp_filter[c0 + (filter_size / 2)] = 0;
< temp_filter[c1] = 0;
< return true;
---
> return c;
126,132d70
< int
< Bulk::getCount(Addr addr) const
< {
< // TODO as in the multi-hashed filters
< return 0;
< }
<
134c72
< Bulk::hash(Addr addr) const
---
> Bulk::permute(Addr addr) const