sc_uint.hh revision 12853:e23d6f09069a
16691Stjones1@inf.ed.ac.uk/***************************************************************************** 26691Stjones1@inf.ed.ac.uk 36691Stjones1@inf.ed.ac.uk Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 46691Stjones1@inf.ed.ac.uk more contributor license agreements. See the NOTICE file distributed 56691Stjones1@inf.ed.ac.uk with this work for additional information regarding copyright ownership. 66691Stjones1@inf.ed.ac.uk Accellera licenses this file to you under the Apache License, Version 2.0 76691Stjones1@inf.ed.ac.uk (the "License"); you may not use this file except in compliance with the 86691Stjones1@inf.ed.ac.uk License. You may obtain a copy of the License at 96691Stjones1@inf.ed.ac.uk 106691Stjones1@inf.ed.ac.uk http://www.apache.org/licenses/LICENSE-2.0 116691Stjones1@inf.ed.ac.uk 126691Stjones1@inf.ed.ac.uk Unless required by applicable law or agreed to in writing, software 136691Stjones1@inf.ed.ac.uk distributed under the License is distributed on an "AS IS" BASIS, 146691Stjones1@inf.ed.ac.uk WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 156691Stjones1@inf.ed.ac.uk implied. See the License for the specific language governing 166691Stjones1@inf.ed.ac.uk permissions and limitations under the License. 176691Stjones1@inf.ed.ac.uk 186691Stjones1@inf.ed.ac.uk *****************************************************************************/ 196691Stjones1@inf.ed.ac.uk 206691Stjones1@inf.ed.ac.uk/***************************************************************************** 216691Stjones1@inf.ed.ac.uk 226691Stjones1@inf.ed.ac.uk sc_uint.h -- An unsigned integer whose length is less than 64 bits. 236691Stjones1@inf.ed.ac.uk 246691Stjones1@inf.ed.ac.uk Unlike arbitrary precision, arithmetic and bitwise operations 256691Stjones1@inf.ed.ac.uk are performed using the native types (hence capped at 64 bits). 266691Stjones1@inf.ed.ac.uk The sc_uint integer is useful when the user does not need 276691Stjones1@inf.ed.ac.uk arbitrary precision and the performance is superior to 286691Stjones1@inf.ed.ac.uk sc_bigint/sc_biguint. 296691Stjones1@inf.ed.ac.uk 306691Stjones1@inf.ed.ac.uk Original Author: Amit Rao, Synopsys, Inc. 316691Stjones1@inf.ed.ac.uk 326691Stjones1@inf.ed.ac.uk *****************************************************************************/ 336691Stjones1@inf.ed.ac.uk 346691Stjones1@inf.ed.ac.uk/***************************************************************************** 356691Stjones1@inf.ed.ac.uk 366691Stjones1@inf.ed.ac.uk MODIFICATION LOG - modifiers, enter your name, affiliation, date and 376691Stjones1@inf.ed.ac.uk changes you are making here. 386691Stjones1@inf.ed.ac.uk 396691Stjones1@inf.ed.ac.uk Name, Affiliation, Date: Ali Dasdan, Synopsys, Inc. 406691Stjones1@inf.ed.ac.uk Description of Modification: - Resolved ambiguity with sc_(un)signed. 416691Stjones1@inf.ed.ac.uk - Merged the code for 64- and 32-bit versions 426691Stjones1@inf.ed.ac.uk via the constants in sc_nbdefs.h. 436691Stjones1@inf.ed.ac.uk - Eliminated redundant file inclusions. 446691Stjones1@inf.ed.ac.uk 456691Stjones1@inf.ed.ac.uk Name, Affiliation, Date: 466691Stjones1@inf.ed.ac.uk Description of Modification: 476691Stjones1@inf.ed.ac.uk 486691Stjones1@inf.ed.ac.uk *****************************************************************************/ 496691Stjones1@inf.ed.ac.uk 506691Stjones1@inf.ed.ac.uk// $Log: sc_uint.h,v $ 516691Stjones1@inf.ed.ac.uk// Revision 1.2 2011/02/18 20:19:15 acg 526691Stjones1@inf.ed.ac.uk// Andy Goodrich: updating Copyright notice. 536691Stjones1@inf.ed.ac.uk// 546691Stjones1@inf.ed.ac.uk// Revision 1.1.1.1 2006/12/15 20:20:05 acg 556691Stjones1@inf.ed.ac.uk// SystemC 2.3 566691Stjones1@inf.ed.ac.uk// 576691Stjones1@inf.ed.ac.uk// Revision 1.3 2006/01/13 18:49:32 acg 586691Stjones1@inf.ed.ac.uk// Added $Log command so that CVS check in comments are reproduced in the 596691Stjones1@inf.ed.ac.uk// source. 606691Stjones1@inf.ed.ac.uk// 616691Stjones1@inf.ed.ac.uk 626691Stjones1@inf.ed.ac.uk#ifndef __SYSTEMC_EXT_DT_INT_SC_UINT_HH__ 636691Stjones1@inf.ed.ac.uk#define __SYSTEMC_EXT_DT_INT_SC_UINT_HH__ 646691Stjones1@inf.ed.ac.uk 656691Stjones1@inf.ed.ac.uk#include "sc_uint_base.hh" 666691Stjones1@inf.ed.ac.uk 676691Stjones1@inf.ed.ac.uknamespace sc_dt 686691Stjones1@inf.ed.ac.uk{ 696691Stjones1@inf.ed.ac.uk 706691Stjones1@inf.ed.ac.uk// classes defined in this module 716691Stjones1@inf.ed.ac.uktemplate <int W> 726691Stjones1@inf.ed.ac.ukclass sc_uint; 736691Stjones1@inf.ed.ac.uk 746691Stjones1@inf.ed.ac.uk 756691Stjones1@inf.ed.ac.uk// ---------------------------------------------------------------------------- 766691Stjones1@inf.ed.ac.uk// CLASS TEMPLATE : sc_uint<W> 776691Stjones1@inf.ed.ac.uk// 786691Stjones1@inf.ed.ac.uk// Template class sc_uint<W> is the interface that the user sees. It 796691Stjones1@inf.ed.ac.uk// is derived from sc_uint_base and most of its methods are just 806691Stjones1@inf.ed.ac.uk// wrappers that call the corresponding method in the parent 816691Stjones1@inf.ed.ac.uk// class. Note that the length of sc_uint datatype is specified as a 826691Stjones1@inf.ed.ac.uk// template parameter. 836691Stjones1@inf.ed.ac.uk// ---------------------------------------------------------------------------- 846691Stjones1@inf.ed.ac.uk 856691Stjones1@inf.ed.ac.uktemplate <int W> 866691Stjones1@inf.ed.ac.ukclass sc_uint : public sc_uint_base 876691Stjones1@inf.ed.ac.uk{ 886691Stjones1@inf.ed.ac.uk public: 896691Stjones1@inf.ed.ac.uk // constructors 906691Stjones1@inf.ed.ac.uk sc_uint() : sc_uint_base(W) {} 916691Stjones1@inf.ed.ac.uk sc_uint(uint_type v) : sc_uint_base(v, W) {} 926691Stjones1@inf.ed.ac.uk sc_uint(const sc_uint<W> &a) : sc_uint_base(a) {} 936691Stjones1@inf.ed.ac.uk sc_uint(const sc_uint_base &a) : sc_uint_base(W) 946691Stjones1@inf.ed.ac.uk { 956691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 966691Stjones1@inf.ed.ac.uk } 976691Stjones1@inf.ed.ac.uk sc_uint(const sc_uint_subref_r &a) : sc_uint_base(W) 986691Stjones1@inf.ed.ac.uk { 996691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 1006691Stjones1@inf.ed.ac.uk } 1016691Stjones1@inf.ed.ac.uk template< class T > 1026691Stjones1@inf.ed.ac.uk sc_uint(const sc_generic_base<T> &a) : sc_uint_base(W) 1036691Stjones1@inf.ed.ac.uk { 1046691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 1056691Stjones1@inf.ed.ac.uk } 1066691Stjones1@inf.ed.ac.uk sc_uint(const sc_signed &a) : sc_uint_base(W) 1076691Stjones1@inf.ed.ac.uk { 1086691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 1096691Stjones1@inf.ed.ac.uk } 1106691Stjones1@inf.ed.ac.uk sc_uint(const sc_unsigned &a) : sc_uint_base(W) 1116691Stjones1@inf.ed.ac.uk { 1126691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 1136691Stjones1@inf.ed.ac.uk } 1146691Stjones1@inf.ed.ac.uk explicit sc_uint(const sc_fxval &a) : sc_uint_base(W) 1156691Stjones1@inf.ed.ac.uk { 1166691Stjones1@inf.ed.ac.uk sc_uint_base::operator = (a); 1176691Stjones1@inf.ed.ac.uk } 1186691Stjones1@inf.ed.ac.uk explicit sc_uint(const sc_fxval_fast &a) : sc_uint_base(W) 119 { 120 sc_uint_base::operator = (a); 121 } 122 explicit sc_uint(const sc_fxnum &a) : sc_uint_base(W) 123 { 124 sc_uint_base::operator = (a); 125 } 126 explicit sc_uint(const sc_fxnum_fast &a) : sc_uint_base(W) 127 { 128 sc_uint_base::operator = (a); 129 } 130 sc_uint(const sc_bv_base &a) : sc_uint_base(W) 131 { 132 sc_uint_base::operator = (a); 133 } 134 sc_uint(const sc_lv_base &a) : sc_uint_base(W) 135 { 136 sc_uint_base::operator = (a); 137 } 138 sc_uint(const char* a) : sc_uint_base(W) 139 { 140 sc_uint_base::operator = (a); 141 } 142 sc_uint(unsigned long a) : sc_uint_base(W) 143 { 144 sc_uint_base::operator = (a); 145 } 146 sc_uint(long a) : sc_uint_base(W) 147 { 148 sc_uint_base::operator = (a); 149 } 150 sc_uint(unsigned int a) : sc_uint_base(W) 151 { 152 sc_uint_base::operator = (a); 153 } 154 sc_uint(int a) : sc_uint_base(W) 155 { 156 sc_uint_base::operator = (a); 157 } 158 sc_uint(int64 a) : sc_uint_base(W) 159 { 160 sc_uint_base::operator = (a); 161 } 162 sc_uint(double a) : sc_uint_base(W) 163 { 164 sc_uint_base::operator = (a); 165 } 166 167 // assignment operators 168 sc_uint<W> & 169 operator = (uint_type v) 170 { 171 sc_uint_base::operator = (v); 172 return *this; 173 } 174 sc_uint<W> & 175 operator = (const sc_uint_base &a) 176 { 177 sc_uint_base::operator = (a); 178 return *this; 179 } 180 sc_uint<W> & 181 operator = (const sc_uint_subref_r &a) 182 { 183 sc_uint_base::operator = (a); 184 return *this; 185 } 186 sc_uint<W> & 187 operator = (const sc_uint<W> &a) 188 { 189 m_val = a.m_val; 190 return *this; 191 } 192 template<class T> 193 sc_uint<W> & 194 operator = (const sc_generic_base<T> &a) 195 { 196 sc_uint_base::operator = (a); 197 return *this; 198 } 199 sc_uint<W> & 200 operator = (const sc_signed &a) 201 { 202 sc_uint_base::operator = (a); 203 return *this; 204 } 205 sc_uint<W> & 206 operator = (const sc_unsigned &a) 207 { 208 sc_uint_base::operator = (a); 209 return *this; 210 } 211 sc_uint<W> & 212 operator = (const sc_fxval &a) 213 { 214 sc_uint_base::operator = (a); 215 return *this; 216 } 217 sc_uint<W> & 218 operator = (const sc_fxval_fast &a) 219 { 220 sc_uint_base::operator = (a); 221 return *this; 222 } 223 sc_uint<W> & 224 operator = (const sc_fxnum &a) 225 { 226 sc_uint_base::operator = (a); 227 return *this; 228 } 229 sc_uint<W> & 230 operator = (const sc_fxnum_fast &a) 231 { 232 sc_uint_base::operator = (a); 233 return *this; 234 } 235 sc_uint<W> & 236 operator = (const sc_bv_base &a) 237 { 238 sc_uint_base::operator = (a); 239 return *this; 240 } 241 sc_uint<W> & 242 operator = (const sc_lv_base &a) 243 { 244 sc_uint_base::operator = (a); 245 return *this; 246 } 247 sc_uint<W> & 248 operator = (const char* a) 249 { 250 sc_uint_base::operator = (a); 251 return *this; 252 } 253 sc_uint<W> & 254 operator = (unsigned long a) 255 { 256 sc_uint_base::operator = (a); 257 return *this; 258 } 259 sc_uint<W> & 260 operator = (long a) 261 { 262 sc_uint_base::operator = (a); 263 return *this; 264 } 265 sc_uint<W> & 266 operator = (unsigned int a) 267 { 268 sc_uint_base::operator = (a); 269 return *this; 270 } 271 sc_uint<W> & 272 operator = (int a) 273 { 274 sc_uint_base::operator = (a); 275 return *this; 276 } 277 sc_uint<W> & 278 operator = (int64 a) 279 { 280 sc_uint_base::operator = (a); 281 return *this; 282 } 283 sc_uint<W> & 284 operator = (double a) 285 { 286 sc_uint_base::operator = (a); 287 return *this; 288 } 289 290 // arithmetic assignment operators 291 sc_uint<W> & 292 operator += (uint_type v) 293 { 294 sc_uint_base::operator += (v); 295 return *this; 296 } 297 sc_uint<W> & 298 operator -= (uint_type v) 299 { 300 sc_uint_base::operator -= (v); 301 return *this; 302 } 303 sc_uint<W> & 304 operator *= (uint_type v) 305 { 306 sc_uint_base::operator *= (v); 307 return *this; 308 } 309 sc_uint<W> & 310 operator /= (uint_type v) 311 { 312 sc_uint_base::operator /= (v); 313 return *this; 314 } 315 sc_uint<W> & 316 operator %= (uint_type v) 317 { 318 sc_uint_base::operator %= (v); 319 return *this; 320 } 321 322 // bitwise assignment operators 323 sc_uint<W> & 324 operator &= (uint_type v) 325 { 326 sc_uint_base::operator &= (v); 327 return *this; 328 } 329 sc_uint<W> & 330 operator |= (uint_type v) 331 { 332 sc_uint_base::operator |= (v); 333 return *this; 334 } 335 sc_uint<W> & 336 operator ^= (uint_type v) 337 { 338 sc_uint_base::operator ^= (v); 339 return *this; 340 } 341 342 sc_uint<W> & 343 operator <<= (uint_type v) 344 { 345 sc_uint_base::operator <<= (v); 346 return *this; 347 } 348 sc_uint<W> & 349 operator >>= (uint_type v) 350 { 351 sc_uint_base::operator >>= (v); 352 return *this; 353 } 354 355 // prefix and postfix increment and decrement operators 356 sc_uint<W> & 357 operator ++ () // prefix 358 { 359 sc_uint_base::operator ++ (); 360 return *this; 361 } 362 const sc_uint<W> 363 operator ++ ( int ) // postfix 364 { 365 return sc_uint<W>(sc_uint_base::operator ++ (0)); 366 } 367 sc_uint<W> & 368 operator -- () // prefix 369 { 370 sc_uint_base::operator -- (); 371 return *this; 372 } 373 const sc_uint<W> 374 operator -- (int) // postfix 375 { 376 return sc_uint<W>(sc_uint_base::operator -- (0)); 377 } 378}; 379 380} // namespace sc_dt 381 382#endif // __SYSTEMC_EXT_DT_INT_SC_UINT_HH__ 383