11#ifndef L1TopoSimulationUtils_L1TOPODATATYPES_H
12#define L1TopoSimulationUtils_L1TOPODATATYPES_H
28 if (n >=
sizeof(T) * 8)
29 return ~static_cast<T>(0);
30 return (
static_cast<T
>(1) << n) - 1ull;
35 typedef unsigned long long T;
36 T convert(
const unsigned long long& v,
const unsigned& in_p,
const unsigned int& in_f,
37 const unsigned int& out_p,
const unsigned int& out_f);
57 for(
auto in = b.rbegin(); in!=b.rend(); ++in){
58 if(*in==
'1') m_tvalue += (1ull << idx);
80 operator float()
const {
84 operator int()
const {
88 operator unsigned()
const {
92 operator int64_t()
const {
96 operator unsigned long long()
const {
114 for(
unsigned j=0;j<PREC;++j){
115 res += v & (1ull << j) ? 0 : (1ull << j);
135 short int neg = (
m_tvalue >> (PREC-1ull)) ? 1 : 0;
167 for(
int j=PREC-1;j>=0;--j){
168 out += ((d.m_tvalue>>j)&1ull) ?
"1" :
"0";
170 os <<
"integer value " << d.m_tvalue <<
" binary " << out <<
" float " << d.to_float();
177 float res = ((
m_tvalue>>(PREC-1ull))&1ull) ? -(1ll<<(PREC-
F)) : 0.;
183 res +=
static_cast<float>(
frac) / (2ull<<(
F-1ull));
188 constexpr unsigned int prec()
const {
return PREC; }
189 constexpr unsigned int frac()
const {
return F; }
196 T
complement(
const T& v,
const unsigned int& p);
203 std::string
to_binary(T value,
const unsigned int& p);
206 float to_float(
const T& va,
const unsigned int& p,
const unsigned int& f);
210 constexpr unsigned int frac = (F1 > F2) ? F1 : F2;
211 constexpr unsigned int digit = ((P1-F1) > (P2-F2)) ? (P1-F1) - 1 : (P2-F2) - 1;
212 constexpr unsigned int prec =
frac + digit + 1;
222 constexpr unsigned int frac = (F1 > F2) ? F1 : F2;
223 constexpr unsigned int digit = ((P1-F1) > (P2-F2)) ? (P1-F1) - 1 : (P2-F2) - 1;
224 constexpr unsigned int prec =
frac + digit + 1;
267 constexpr unsigned int frac = (P1+P2-1 >
MAXBITS) ? (F2>F1 ? F2 - ((P1+P2-1) -
MAXBITS) : F1 - ((P1+P2-1) -
MAXBITS)) : ((F1 > F2) ? F1 : F2);
269 constexpr unsigned int prec =
frac + digit + 1;
270 T lhsconvert = lhs.m_tvalue;
271 T rhsconvert = rhs.m_tvalue;
273 if((lhs.m_tvalue >> (P1-1ull)) & 1ull){
274 lhsconvert = complement(lhsconvert,P1);
276 if((rhs.m_tvalue >> (P2-1ull)) & 1ull){
277 rhsconvert = complement(rhsconvert,P2);
280 T lhsconvint =
convert(lhsconvert,P1,F1,P1-F1,0);
281 T rhsconvint =
convert(rhsconvert,P2,F2,P2-F2,0);
282 T lhsconvfrac =
convert(lhsconvert,P1,F1,F1+1,F1);
283 T rhsconvfrac =
convert(rhsconvert,P2,F2,F2+1,F2);
284 T prod_int = lhsconvint*rhsconvint;
285 T prod_frac = lhsconvfrac*rhsconvfrac;
286 T prod_mix1 = lhsconvint*rhsconvfrac;
287 T prod_mix2 = lhsconvfrac*rhsconvint;
292 if(!(((lhs.m_tvalue >> (P1-1ull)) & 1ull) ^ ((rhs.m_tvalue >> (P2-1ull)) & 1ull))){
std::pair< std::vector< unsigned int >, bool > res
consteval T ones(unsigned int n)
Return a bit mask with the lower n bits set.
constexpr unsigned int frac() const
L1TopoDataTypes(double d)
L1TopoDataTypes & operator-()
friend std::ostream & operator<<(std::ostream &os, const L1TopoDataTypes &d)
L1TopoDataTypes & operator*=(const int &factor)
friend L1TopoDataTypes< P, FF > operator*(const int &factor, L1TopoDataTypes< P, FF > d)
L1TopoDataTypes(unsigned i)
constexpr unsigned int prec() const
L1TopoDataTypes(const std::string &b="")
L1TopoDataTypes & operator+=(const T &value)
L1TopoDataTypes<(P1+P2-1 > MAXBITS) ? MAXBITS :P1+P2-1,(P1+P2-1 > MAXBITS) ?(F2 >F1 ? F2 -((P1+P2-1) - MAXBITS) :F1 -((P1+P2-1) - MAXBITS)) :((F1 > F2) ? F1 :F2)> operator*(const L1TopoDataTypes< P1, F1 > lhs, const L1TopoDataTypes< P2, F2 > rhs)
T convert(const unsigned long long &v, const unsigned &in_p, const unsigned int &in_f, const unsigned int &out_p, const unsigned int &out_f)
L1TopoDataTypes<((P1-F1) >(P2-F2) ?(P1-F1) :(P2-F2))+((F1 > F2) ? F1 :F2),(F1 > F2) ? F1 :F2 > operator+(const L1TopoDataTypes< P1, F1 > &lhs, const L1TopoDataTypes< P2, F2 > &rhs)
float to_float(const T &va, const unsigned int &p, const unsigned int &f)
std::string to_binary(T value, const unsigned int &p)
L1TopoDataTypes<((P1-F1) >(P2-F2) ?(P1-F1) :(P2-F2))+((F1 > F2) ? F1 :F2),(F1 > F2) ? F1 :F2 > operator-(const L1TopoDataTypes< P1, F1 > &lhs, const L1TopoDataTypes< P2, F2 > &rhs)
T complement(const T &v, const unsigned int &p)