Changeset 52 for sources/src/sc_uint.h
- Timestamp:
- Jan 22, 2013, 4:23:22 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sources/src/sc_uint.h
r27 r52 10 10 | | 11 11 \------------------------------------------------------------*/ 12 12 13 #ifndef __SC_UINT_H__ 13 14 #define __SC_UINT_H__ … … 32 33 typedef sc_uint<1> sc_uint_bit_ref_r; 33 34 35 34 36 // -------------------------------- 35 37 // CLASS : sc_uint_subref_r 36 38 // 37 39 // Used for range, concat functions 38 class sc_uint_subref_r 39 { 40 template <int W> friend class sc_dt::sc_uint; 41 int left, right; 42 public : uint64 val; 43 sc_uint_subref_r (uint64 val_, int left_, int right_) 44 { 45 val = val_; left = left_; right = right_; 46 } 47 public: 48 inline uint64 read () const { return val; } 49 inline const sc_uint_subref_r& operator | (const sc_uint_subref_r &v) const 50 { print_warning (); return *this; } 51 52 private :void print_warning () const; 40 // -------------------------------- 41 42 class sc_uint_subref_r { 43 template <int W> friend class sc_dt::sc_uint; 44 int left, right; 45 public : 46 uint64 val; 47 sc_uint_subref_r(uint64 val_, int left_, int right_) { 48 val = val_; 49 left = left_; 50 right = right_; 51 } 52 53 public: 54 inline uint64 read() const { 55 return val; 56 } 57 58 inline const sc_uint_subref_r & operator | (const sc_uint_subref_r & v) const { 59 print_warning(); 60 return *this; 61 } 62 63 private: 64 void print_warning() const; 65 53 66 }; 54 67 55 // 56 #define MASK32(W) ((~ (const uint32)0) >> (sizeof (uint32) * 8 - W)) 57 #define MASK64(W) ((~ (const uint64)0) >> (sizeof (uint64) * 8 - W)) 58 // 59 60 template<int W> struct s_uint_type { typedef uint64 uint_type;}; 68 69 #define MASK32(W) ((~ (const uint32)0) >> (sizeof(uint32) * 8 - W)) 70 #define MASK64(W) ((~ (const uint64)0) >> (sizeof(uint64) * 8 - W)) 71 72 73 template<int W> struct s_uint_type { 74 typedef uint64 uint_type; 75 }; 76 61 77 #define DECLAR_UINT_TYPE(W) template<> struct s_uint_type<W> { typedef smallest_uint uint_type; }// not declared as uint16 because << operator threats like a character 62 DECLAR_UINT_TYPE( 63 DECLAR_UINT_TYPE( 64 DECLAR_UINT_TYPE( 65 DECLAR_UINT_TYPE( 66 DECLAR_UINT_TYPE( 67 DECLAR_UINT_TYPE( 68 DECLAR_UINT_TYPE( 69 DECLAR_UINT_TYPE( 78 DECLAR_UINT_TYPE(1); 79 DECLAR_UINT_TYPE(2); 80 DECLAR_UINT_TYPE(3); 81 DECLAR_UINT_TYPE(4); 82 DECLAR_UINT_TYPE(5); 83 DECLAR_UINT_TYPE(6); 84 DECLAR_UINT_TYPE(7); 85 DECLAR_UINT_TYPE(8); 70 86 #undef DECLAR_UINT_TYPE 87 71 88 #define DECLAR_UINT_TYPE(W) template<> struct s_uint_type<W> { typedef uint16 uint_type; } 72 DECLAR_UINT_TYPE( 89 DECLAR_UINT_TYPE(9); 73 90 DECLAR_UINT_TYPE(10); 74 91 DECLAR_UINT_TYPE(11); … … 79 96 DECLAR_UINT_TYPE(16); 80 97 #undef DECLAR_UINT_TYPE 98 81 99 #define DECLAR_UINT_TYPE(W) template<> struct s_uint_type<W> { typedef uint32 uint_type; } 82 100 DECLAR_UINT_TYPE(17); … … 98 116 #undef DECLAR_UINT_TYPE 99 117 118 100 119 class sc_uint_subref_r; 101 120 102 template<int W> /* width of data type = SC_INTWIDTH */ 103 class sc_uint 104 { 105 /***********************/ 106 /* SYSTEMCASS SPECIFIC */ 107 /***********************/ 108 typedef sc_uint<W> this_type; 109 typedef typename s_uint_type<W>::uint_type data_type; 110 111 typedef data_type sc_uint_subref; 112 //typedef data_type sc_uint_subref_r; 113 /* removed since "operator ," was going wrong */ 114 115 // internal 116 union { 117 val_field<W,(sizeof (data_type) * 8) - W,data_type> vf; /* To compute */ 118 data_type val; /* To return an int reference (read function) */ 119 // data_type valW:W; /* works with little endianess only */ 120 // bool valB[W]; /* removed since 1 bool takes 1 byte */ 121 }; 122 123 /***********************/ 124 /* L R M */ 125 /***********************/ 126 public: 127 sc_uint () { val = 0; } 128 // sc_uint (data_type val_) { val = 0; write (val_); } 129 sc_uint (const char *a) { val = 0; write (std::atoi (a)); } 130 sc_uint (unsigned short a){ val = 0; write (a); } 131 sc_uint (short a) { val = 0; write (a); } 132 sc_uint (unsigned long a) { val = 0; write (a); } 133 sc_uint (long a) { val = 0; write (a); } 134 sc_uint (unsigned int a) { val = 0; write (a); } 135 sc_uint (int a) { val = 0; write (a); } 136 sc_uint (int64 a) { val = 0; write (a); } 137 sc_uint (uint64 a) { val = 0; write (a); } 138 sc_uint (double a) { val = 0; write (a); } 139 140 template <int W2> sc_uint (const sc_uint<W2> &val_) { val = 0; write (val_.read());} 141 /* this template doesn't redefine default copy constructor of sc_uint. 142 * So, we define by this way 143 */ 144 sc_uint (const sc_uint &val_) { val = 0; write (val_.read()); } 145 sc_uint (const sc_uint_subref_r &val_) { val = 0; write (val_.read()); } 121 122 /* width of data type = SC_INTWIDTH */ 123 template<int W> 124 class sc_uint { 125 126 /***********************/ 127 /* SYSTEMCASS SPECIFIC */ 128 /***********************/ 129 typedef sc_uint<W> this_type; 130 typedef typename s_uint_type<W>::uint_type data_type; 131 typedef data_type sc_uint_subref; 132 //typedef data_type sc_uint_subref_r; /* removed since "operator ," was going wrong */ 133 134 135 // internal 136 union { 137 val_field<W, (sizeof(data_type) * 8) - W, data_type> vf; /* To compute */ 138 data_type val; /* To return an int reference (read function) */ 139 // data_type valW: W; /* works with little endianess only */ 140 // bool valB[W]; /* removed since 1 bool takes 1 byte */ 141 }; 142 143 /***********************/ 144 /* L R M */ 145 /***********************/ 146 public: 147 sc_uint() { val = 0; } 148 // sc_uint(data_type val_) { val = 0; write (val_); } 149 sc_uint(const char * a) { val = 0; write(std::atoi(a)); } 150 sc_uint(unsigned short a) { val = 0; write(a); } 151 sc_uint(short a) { val = 0; write(a); } 152 sc_uint(unsigned long a) { val = 0; write(a); } 153 sc_uint(long a) { val = 0; write(a); } 154 sc_uint(unsigned int a) { val = 0; write(a); } 155 sc_uint(int a) { val = 0; write(a); } 156 sc_uint(int64 a) { val = 0; write(a); } 157 sc_uint(uint64 a) { val = 0; write(a); } 158 sc_uint(double a) { val = 0; write(a); } 159 160 161 template <int W2> sc_uint(const sc_uint<W2> & val_) { 162 val = 0; 163 write(val_.read()); 164 } 165 166 /* this template doesn't redefine default copy constructor of sc_uint. 167 * So, we define by this way 168 */ 169 sc_uint(const sc_uint & val_) { val = 0; write(val_.read()); } 170 sc_uint(const sc_uint_subref_r & val_) { val = 0; write(val_.read()); } 146 171 /* the user needs to cast explicitly result of range () method. */ 147 172 148 /***********************/ 149 /* SYSTEMCASS SPECIFIC */ 150 /***********************/ 151 // read/write 152 inline const data_type& read() const { return val; } 153 inline void write(data_type val_) { vf.valW = val_; } 154 template <int W2> inline void write (const sc_uint<W2> val_) { write (val_.read()); } 155 //inline void write (const sc_uint<W> val_) { write (val_.read()); } 156 inline void write (const sc_uint_subref_r& s) { write (s.read()); } 157 158 /***********************/ 159 /* L R M */ 160 /***********************/ 161 // operators 162 inline operator const data_type& () const { return read (); } 163 // inline void write(uint64 val_) { val = val_ & MASK64(W); } 164 // inline void write(unsigned int val_) { val = val_ & MASK32(W); } 165 template <typename T> inline sc_uint& operator = (const T& val_) 166 { write (val_); return *this; } 167 inline sc_uint& operator = (const sc_uint_subref_r& a) 168 { write (a); return *this; } 169 170 // explicit conversions 171 inline uint32 to_uint () const {return val & MASK32(W);} 172 inline int32 to_int () const {return val & MASK32(W);} 173 inline uint64 to_uint64 () const {return val & MASK64(W);} 174 inline int64 to_int64 () const {return val & MASK64(W);} 175 176 // explicit conversion to character string 177 const sc_string to_string ( sc_numrep numrep = SC_DEC ) const 178 { return sc_dt::to_string (val, W, numrep); } 179 const sc_string to_dec() const { return to_string (SC_DEC); } 180 const sc_string to_bin() const { return to_string (SC_BIN); } 181 const sc_string to_oct() const { return to_string (SC_OCT); } 182 const sc_string to_hex() const { return to_string (SC_HEX); } 183 184 // arithmetic 185 #define DEFINE_OPERATOR(OPER) \ 186 template <typename T> \ 187 inline sc_uint& operator OPER (T v)\ 188 { vf.valW OPER v; return *this; } 189 190 DEFINE_OPERATOR(<<=) 191 DEFINE_OPERATOR(>>=) 192 DEFINE_OPERATOR(+=) 193 DEFINE_OPERATOR(-=) 194 DEFINE_OPERATOR(*=) 195 DEFINE_OPERATOR(/=) 196 DEFINE_OPERATOR(%=) 197 DEFINE_OPERATOR(&=) 198 DEFINE_OPERATOR(|=) 199 DEFINE_OPERATOR(^=) 173 /***********************/ 174 /* SYSTEMCASS SPECIFIC */ 175 /***********************/ 176 // read/write 177 inline const data_type & read() const { 178 return val; 179 } 180 181 inline void write(data_type val_) { 182 vf.valW = val_; 183 } 184 185 template <int W2> inline void write(const sc_uint<W2> val_) { 186 write(val_.read()); 187 } 188 189 // inline void write(const sc_uint<W> val_) { 190 // write(val_.read()); 191 // } 192 193 inline void write(const sc_uint_subref_r & s) { 194 write(s.read()); 195 } 196 197 198 /***********************/ 199 /* L R M */ 200 /***********************/ 201 // operators 202 inline operator const data_type & () const { 203 return read(); 204 } 205 206 // inline void write(uint64 val_) { 207 // val = val_ & MASK64(W); 208 // } 209 // inline void write(unsigned int val_) { 210 // val = val_ & MASK32(W); 211 // } 212 213 template < typename T > inline sc_uint & operator = (const T & val_) { 214 write(val_); 215 return *this; 216 } 217 218 inline sc_uint & operator = (const sc_uint_subref_r & a) { 219 write(a); 220 return *this; 221 } 222 223 // explicit conversions 224 inline uint32 to_uint() const { return val & MASK32(W); } 225 inline int32 to_int() const { return val & MASK32(W); } 226 inline uint64 to_uint64() const { return val & MASK64(W); } 227 inline int64 to_int64() const { return val & MASK64(W); } 228 229 // explicit conversion to character string 230 const sc_string to_string(sc_numrep numrep = SC_DEC) const { 231 return sc_dt::to_string(val, W, numrep); 232 } 233 const sc_string to_dec() const { return to_string(SC_DEC); } 234 const sc_string to_bin() const { return to_string(SC_BIN); } 235 const sc_string to_oct() const { return to_string(SC_OCT); } 236 const sc_string to_hex() const { return to_string(SC_HEX); } 237 238 239 // arithmetic 240 #define DEFINE_OPERATOR(OPER) \ 241 template < typename T > \ 242 inline sc_uint & operator OPER (T v) \ 243 { vf.valW OPER v; return *this; } 244 245 DEFINE_OPERATOR(<<=) 246 DEFINE_OPERATOR(>>=) 247 DEFINE_OPERATOR(+=) 248 DEFINE_OPERATOR(-=) 249 DEFINE_OPERATOR(*=) 250 DEFINE_OPERATOR(/=) 251 DEFINE_OPERATOR(%=) 252 DEFINE_OPERATOR(&=) 253 DEFINE_OPERATOR(|=) 254 DEFINE_OPERATOR(^=) 200 255 #undef DEFINE_OPERATOR 201 256 257 258 inline sc_uint_bit_ref operator [] (int v) { 259 return (vf.valW >> v) & 1; 260 } 261 262 inline sc_uint_bit_ref_r operator [] (int v) const { 263 return (vf.valW >> v) & 1; 264 } 265 266 template <int W2> 267 inline sc_uint<W + W2> operator , (const sc_uint<W2> & b) const { 268 sc_uint<W + W2> res = read() << W2; 269 res += b.read(); 270 return res; 271 } 272 273 inline sc_uint<W + 1> operator , (bool b) const { 274 sc_uint<W + 1> res = read(); 275 res <<= 1; 276 res += b; 277 return res; 278 } 279 280 template <int W2> 281 inline sc_uint<W2> operator , (const sc_uint_subref_r & v) const { 282 std::cerr << "Warning : \n"; // ?? 283 return sc_uint<W2> (v.read()); 284 } 285 286 inline sc_uint_subref range(int left, int right) { 287 return (data_type) ((data_type) (((data_type) ~(0)) >> (sizeof(data_type) * 8 - left - 1)) & val) >> right; 288 } 289 290 inline sc_uint_subref_r range(int left, int right) const { 291 return sc_uint_subref_r (((data_type) (((data_type) ~(0)) >> (sizeof(data_type) * 8 - left - 1)) & val) >> right, left, right); 292 } 293 202 294 #if 0 203 #define DEFINE_OPERATOR(OPER) \ 204 friend bool operator OPER (const data_type& a, const data_type& b); 205 // { return (a.valW) OPER (b.valW); } 206 207 DEFINE_OPERATOR(==) 208 DEFINE_OPERATOR(!=) 209 DEFINE_OPERATOR(>=) 210 DEFINE_OPERATOR(<=) 211 #undef DEFINE_OPERATOR 295 std::cerr << "range(" << left << "," << right << ")\n"; 296 std::cerr << "val = " << val << "\n"; 297 std::cerr << "~0 >> " << (sizeof (data_type) * 8 - left - 1) << " = " << (data_type) (((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) << "\n"; 298 std::cerr << ((data_type) ((((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) & val) >> right) << "\n"; 299 std::cerr << "data_type = " << sizeof (data_type) << "\n"; 212 300 #endif 213 inline sc_uint_bit_ref operator [] (int v) 214 { return (vf.valW >> v) & 1; } 215 inline sc_uint_bit_ref_r operator [] (int v) const 216 { return (vf.valW >> v) & 1; } 217 218 template <int W2> 219 inline sc_uint<W+W2> operator , (const sc_uint<W2> &b) const 220 { sc_uint<W+W2> res = read() << W2; res += b.read(); return res; } 221 #if 0 222 std::cerr << "[" << to_bin() << "," << b.to_bin() << " = " << res.to_bin() << "]\n"; 223 #endif 224 225 inline sc_uint<W+1> operator , (bool b) const 226 { sc_uint<W+1> res = read(); res <<= 1; res += b; return res; } 227 #if 0 228 std::cerr << "[" << to_bin() << "," << b.to_bin() << " = " << res.to_bin() << "]\n"; 229 #endif 230 231 template <int W2> 232 inline sc_uint<W2> operator , (const sc_uint_subref_r &v) const 233 { std::cerr << "Warning : \n"; return sc_uint<W2> (v.read()); } 234 235 inline sc_uint_subref range (int left, int right) 236 { return (data_type)((data_type) (((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) & val) >> right; } 237 238 inline sc_uint_subref_r range (int left, int right) const 239 { return sc_uint_subref_r (((data_type) (((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) & val) >> right, left, right); } 240 #if 0 241 std::cerr << "range(" << left << "," << right << ")\n"; 242 std::cerr << "val = " << val << "\n"; 243 std::cerr << "~0 >> " << (sizeof (data_type) * 8 - left - 1) << " = " << (data_type) (((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) << "\n"; 244 std::cerr << ((data_type) ((((data_type)~(0)) >> (sizeof (data_type) * 8 - left - 1)) & val) >> right) << "\n"; 245 std::cerr << "data_type = " << sizeof (data_type) << "\n"; 246 #endif 301 302 #undef MASK32 303 #undef MASK64 247 304 248 305 }; … … 250 307 // 251 308 // no sign flag to threat 252 // 253 254 inline std::ostream& operator << (std::ostream &o, const sc_uint_subref_r& s) 255 { return o << s.val; } 309 310 inline std::ostream & operator << (std::ostream & o, const sc_uint_subref_r & s) { 311 return o << s.val; 312 } 313 256 314 257 315 } /* end of sc_dt namespace */ … … 259 317 #endif /* __SC_UINT_H__ */ 260 318 319 /* 320 # Local Variables: 321 # tab-width: 4; 322 # c-basic-offset: 4; 323 # c-file-offsets:((innamespace . 0)(inline-open . 0)); 324 # indent-tabs-mode: nil; 325 # End: 326 # 327 # vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 328 */ 329
Note: See TracChangeset
for help on using the changeset viewer.