File indexing completed on 2024-04-06 12:21:58
0001 #include "L1Trigger/TrackFindingTracklet/interface/FPGAWord.h"
0002
0003 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0004
0005 using namespace std;
0006 using namespace trklet;
0007
0008 FPGAWord::FPGAWord() {}
0009
0010 FPGAWord::FPGAWord(int value, int nbits, bool positive, int line, const char* file) {
0011 set(value, nbits, positive, line, file);
0012 }
0013
0014 void FPGAWord::set(int value, int nbits, bool positive, int line, const char* file) {
0015 value_ = value;
0016 nbits_ = nbits;
0017 positive_ = positive;
0018 if (positive) {
0019 if (value < 0) {
0020 edm::LogProblem("Tracklet") << "FPGAWord got negative value:" << value << " (" << file << ":" << line << ")";
0021 }
0022 assert(value >= 0);
0023 }
0024 if (nbits >= 22) {
0025 edm::LogPrint("Tracklet") << "FPGAWord got too many bits:" << nbits << " (" << file << ":" << line << ")";
0026 }
0027 assert(nbits < 22);
0028 if (nbits <= 0) {
0029 edm::LogPrint("Tracklet") << "FPGAWord got too few bits:" << nbits << " (" << file << ":" << line << ")";
0030 }
0031 assert(nbits > 0);
0032 if (positive) {
0033 if (value >= (1 << nbits)) {
0034 if (file != nullptr) {
0035 edm::LogProblem("Tracklet") << "value too large:" << value << " " << (1 << nbits) << " (" << file << ":" << line
0036 << ")";
0037 }
0038 }
0039 assert(value < (1 << nbits));
0040 } else {
0041 if (value >= (1 << (nbits - 1))) {
0042 edm::LogProblem("Tracklet") << "value too large:" << value << " " << (1 << (nbits - 1)) - 1 << " (" << file << ":"
0043 << line << ")";
0044 }
0045 assert(value < (1 << (nbits - 1)));
0046 if (value < -(1 << (nbits - 1))) {
0047 edm::LogProblem("Tracklet") << "value too negative:" << value << " " << -(1 << (nbits - 1)) << " (" << file << ":"
0048 << line << ")";
0049 }
0050 assert(value >= -(1 << (nbits - 1)));
0051 }
0052 }
0053
0054 std::string FPGAWord::str() const {
0055 const int nbit = nbits_;
0056
0057 if (!(nbit > 0 && nbit < 22))
0058 edm::LogVerbatim("Tracklet") << "nbit: " << nbit;
0059 if (nbit == -1)
0060 return "?";
0061 if (nbit == 0)
0062 return "~";
0063
0064 int valtmp = value_;
0065 string str = "";
0066 for (int i = 0; i < nbit; i++) {
0067 str = ((valtmp & 1) ? "1" : "0") + str;
0068 valtmp >>= 1;
0069 }
0070
0071 return str;
0072 }
0073
0074 unsigned int FPGAWord::bits(unsigned int lsb, unsigned int nbit) const {
0075 assert(lsb + nbit <= (unsigned int)nbits());
0076 return (value_ >> lsb) & ((1 << nbit) - 1);
0077 }
0078
0079 bool FPGAWord::atExtreme() const {
0080 if (positive_) {
0081 return (value_ == 0) || (value_ == (1 << nbits_) - 1);
0082 }
0083 return ((value_ == (-(1 << (nbits_ - 1)))) || (value_ == ((1 << (nbits_ - 1)) - 1)));
0084 }
0085
0086 bool FPGAWord::operator==(const FPGAWord& other) const {
0087 return (value_ == other.value_) && (nbits_ == other.nbits_) && (positive_ == other.positive_);
0088 }