114262Sodanrc@yahoo.com.br/*
214262Sodanrc@yahoo.com.br * Copyright (c) 2019 Inria
314262Sodanrc@yahoo.com.br * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
414262Sodanrc@yahoo.com.br * All rights reserved.
514262Sodanrc@yahoo.com.br *
614262Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without
714262Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are
814262Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright
914262Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer;
1014262Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright
1114262Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the
1214262Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution;
1314262Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its
1414262Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from
1514262Sodanrc@yahoo.com.br * this software without specific prior written permission.
1614262Sodanrc@yahoo.com.br *
1714262Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1814262Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1914262Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2014262Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2114262Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2214262Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2314262Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2414262Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2514262Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2614262Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2714262Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2814262Sodanrc@yahoo.com.br *
2914262Sodanrc@yahoo.com.br * Authors: Daniel Carvalho
3014262Sodanrc@yahoo.com.br */
3114262Sodanrc@yahoo.com.br
3214262Sodanrc@yahoo.com.br#include "base/filters/bulk_bloom_filter.hh"
3314262Sodanrc@yahoo.com.br
3414262Sodanrc@yahoo.com.br#include <limits>
3514262Sodanrc@yahoo.com.br
3614262Sodanrc@yahoo.com.br#include "base/bitfield.hh"
3714263Sodanrc@yahoo.com.br#include "base/logging.hh"
3814262Sodanrc@yahoo.com.br#include "params/BloomFilterBulk.hh"
3914262Sodanrc@yahoo.com.br
4014262Sodanrc@yahoo.com.brnamespace BloomFilter {
4114262Sodanrc@yahoo.com.br
4214262Sodanrc@yahoo.com.brBulk::Bulk(const BloomFilterBulkParams* p)
4314263Sodanrc@yahoo.com.br    : MultiBitSel(p), sectorBits(floorLog2(parFilterSize))
4414262Sodanrc@yahoo.com.br{
4514263Sodanrc@yahoo.com.br    fatal_if((numHashes * sectorBits) >
4614263Sodanrc@yahoo.com.br        (std::numeric_limits<Addr>::digits - offsetBits),
4714263Sodanrc@yahoo.com.br        "Sectors need more bits than available");
4814262Sodanrc@yahoo.com.br}
4914262Sodanrc@yahoo.com.br
5014262Sodanrc@yahoo.com.brBulk::~Bulk()
5114262Sodanrc@yahoo.com.br{
5214262Sodanrc@yahoo.com.br}
5314262Sodanrc@yahoo.com.br
5414263Sodanrc@yahoo.com.brint
5514263Sodanrc@yahoo.com.brBulk::hash(Addr addr, int hash_number) const
5614262Sodanrc@yahoo.com.br{
5714263Sodanrc@yahoo.com.br    addr = permute(addr);
5814262Sodanrc@yahoo.com.br
5914263Sodanrc@yahoo.com.br    // Get the sector-based c index
6014263Sodanrc@yahoo.com.br    int c = bits(addr, (offsetBits + (hash_number + 1) * sectorBits) - 1,
6114263Sodanrc@yahoo.com.br                 offsetBits + hash_number * sectorBits);
6214263Sodanrc@yahoo.com.br    assert(c < filter.size()/numHashes);
6314262Sodanrc@yahoo.com.br
6414263Sodanrc@yahoo.com.br    // Transform the sector-based c index into a filder index (v)
6514263Sodanrc@yahoo.com.br    c += (numHashes - 1 - hash_number) * (filter.size()/numHashes);
6614263Sodanrc@yahoo.com.br    assert(c < filter.size());
6714262Sodanrc@yahoo.com.br
6814263Sodanrc@yahoo.com.br    return c;
6914262Sodanrc@yahoo.com.br}
7014262Sodanrc@yahoo.com.br
7114262Sodanrc@yahoo.com.brAddr
7214263Sodanrc@yahoo.com.brBulk::permute(Addr addr) const
7314262Sodanrc@yahoo.com.br{
7414262Sodanrc@yahoo.com.br    // permutes the original address bits according to Table 5
7514262Sodanrc@yahoo.com.br    Addr part1  = bits(addr, offsetBits + 6, offsetBits),
7614262Sodanrc@yahoo.com.br         part2  = bits(addr, offsetBits + 9),
7714262Sodanrc@yahoo.com.br         part3  = bits(addr, offsetBits + 11),
7814262Sodanrc@yahoo.com.br         part4  = bits(addr, offsetBits + 17),
7914262Sodanrc@yahoo.com.br         part5  = bits(addr, offsetBits + 8, offsetBits + 7),
8014262Sodanrc@yahoo.com.br         part6  = bits(addr, offsetBits + 10),
8114262Sodanrc@yahoo.com.br         part7  = bits(addr, offsetBits + 12),
8214262Sodanrc@yahoo.com.br         part8  = bits(addr, offsetBits + 13),
8314262Sodanrc@yahoo.com.br         part9  = bits(addr, offsetBits + 16, offsetBits + 15),
8414262Sodanrc@yahoo.com.br         part10 = bits(addr, offsetBits + 20, offsetBits + 18),
8514262Sodanrc@yahoo.com.br         part11 = bits(addr, offsetBits + 14);
8614262Sodanrc@yahoo.com.br
8714262Sodanrc@yahoo.com.br    Addr result =
8814262Sodanrc@yahoo.com.br        (part1 << 14) | (part2 << 13) | (part3 << 12) | (part4 << 11) |
8914262Sodanrc@yahoo.com.br        (part5 << 9)  | (part6 << 8)  | (part7 << 7)  | (part8 << 6)  |
9014262Sodanrc@yahoo.com.br        (part9 << 4)  | (part10 << 1) | (part11);
9114262Sodanrc@yahoo.com.br
9214262Sodanrc@yahoo.com.br    // Select the remaining high-order bits
9314262Sodanrc@yahoo.com.br    Addr remaining_bits = bits(addr, std::numeric_limits<Addr>::digits - 1,
9414262Sodanrc@yahoo.com.br        offsetBits + 21) << 21;
9514262Sodanrc@yahoo.com.br    result = result | remaining_bits;
9614262Sodanrc@yahoo.com.br
9714262Sodanrc@yahoo.com.br    return result;
9814262Sodanrc@yahoo.com.br}
9914262Sodanrc@yahoo.com.br
10014262Sodanrc@yahoo.com.br} // namespace BloomFilter
10114262Sodanrc@yahoo.com.br
10214262Sodanrc@yahoo.com.brBloomFilter::Bulk*
10314262Sodanrc@yahoo.com.brBloomFilterBulkParams::create()
10414262Sodanrc@yahoo.com.br{
10514262Sodanrc@yahoo.com.br    return new BloomFilter::Bulk(this);
10614262Sodanrc@yahoo.com.br}
10714262Sodanrc@yahoo.com.br
108