sat_counter.hh revision 13960
1/* 2 * Copyright (c) 2019 Inria 3 * All rights reserved. 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Copyright (c) 2005-2006 The Regents of The University of Michigan 15 * All rights reserved. 16 * 17 * Redistribution and use in source and binary forms, with or without 18 * modification, are permitted provided that the following conditions are 19 * met: redistributions of source code must retain the above copyright 20 * notice, this list of conditions and the following disclaimer; 21 * redistributions in binary form must reproduce the above copyright 22 * notice, this list of conditions and the following disclaimer in the 23 * documentation and/or other materials provided with the distribution; 24 * neither the name of the copyright holders nor the names of its 25 * contributors may be used to endorse or promote products derived from 26 * this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 39 * 40 * Authors: Kevin Lim 41 * Daniel Carvalho 42 */ 43 44#ifndef __BASE_SAT_COUNTER_HH__ 45#define __BASE_SAT_COUNTER_HH__ 46 47#include <cstdint> 48 49#include "base/logging.hh" 50#include "base/types.hh" 51 52/** 53 * Implements an n bit saturating counter and provides methods to 54 * increment, decrement, and read it. 55 */ 56class SatCounter 57{ 58 public: 59 /** 60 * Constructor for the counter. The explicit keyword is used to make 61 * sure the user does not assign a number to the counter thinking it 62 * will be used as a counter value when it is in fact used as the number 63 * of bits. 64 * 65 * @param bits How many bits the counter will have. 66 * @param initial_val Starting value for the counter. 67 */ 68 explicit SatCounter(unsigned bits, uint8_t initial_val = 0) 69 : initialVal(initial_val), maxVal((1 << bits) - 1), 70 counter(initial_val) 71 { 72 fatal_if(bits > 8*sizeof(uint8_t), 73 "Number of bits exceeds counter size"); 74 fatal_if(initial_val > maxVal, 75 "Saturating counter's Initial value exceeds max value."); 76 } 77 78 /** Pre-increment operator. */ 79 SatCounter& 80 operator++() 81 { 82 if (counter < maxVal) { 83 ++counter; 84 } 85 return *this; 86 } 87 88 /** Post-increment operator. */ 89 SatCounter 90 operator++(int) 91 { 92 SatCounter old_counter = *this; 93 ++*this; 94 return old_counter; 95 } 96 97 /** Pre-decrement operator. */ 98 SatCounter& 99 operator--() 100 { 101 if (counter > 0) { 102 --counter; 103 } 104 return *this; 105 } 106 107 /** Post-decrement operator. */ 108 SatCounter 109 operator--(int) 110 { 111 SatCounter old_counter = *this; 112 --*this; 113 return old_counter; 114 } 115 116 /** 117 * Read the counter's value. 118 */ 119 operator uint8_t() const { return counter; } 120 121 /** Reset the counter to its initial value. */ 122 void reset() { counter = initialVal; } 123 124 private: 125 uint8_t initialVal; 126 uint8_t maxVal; 127 uint8_t counter; 128}; 129 130#endif // __BASE_SAT_COUNTER_HH__ 131