00001 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 00002 00003 /* ArchC Register Library for the ArchC architecture simulators 00004 Copyright (C) 2002-2004 The ArchC Team 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Lesser General Public 00008 License as published by the Free Software Foundation; either 00009 version 2.1 of the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, 00012 but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Lesser General Public License for more details. 00015 */ 00016 00017 /********************************************************/ 00018 /* Register class */ 00019 /* Author: Sandro Rigo */ 00020 /* */ 00021 /* */ 00022 /* The ArchC Team */ 00023 /* Computer Systems Laboratory (LSC) */ 00024 /* IC-UNICAMP */ 00025 /* http://www.lsc.ic.unicamp.br */ 00026 /********************************************************/ 00027 00029 00035 00036 #ifndef _AC_REG_H 00037 #define _AC_REG_H 00038 00039 #include "ac_storage.H" 00040 00044 template<class T>class ac_reg: public ac_storage { 00045 00046 protected: 00047 T Data; 00048 00049 public: 00050 00052 const T& read( ) const; 00053 00055 void write( T datum ); 00056 00058 ac_reg( char* name, T value=0 ):ac_storage(name,AC_WORDSIZE/8){ write(value);} 00059 00060 #ifdef AC_DELAY 00061 00063 void write( T datum, unsigned time ); 00064 00066 void commit_delays( double time ); 00067 00069 ac_reg& operator =( change_log data ){ 00070 00071 delays.push_back( data ); 00072 return *this; 00073 } 00074 00075 #endif //AC_DELAY 00076 00078 operator const T& () const { 00079 return read(); 00080 } 00081 00082 // //!Convertion operator 00083 // operator ac_word() { 00084 00085 // return read(); 00086 // } 00087 00088 // //!Convertion operator 00089 // operator int() { 00090 00091 // return read(); 00092 // } 00093 00094 // //!Convertion operator 00095 // operator unsigned int() { 00096 00097 // return read(); 00098 // } 00099 00100 00102 // OPERATORS !!! // 00104 00105 00106 00108 00109 //ac_reg<T> = ac_reg 00110 ac_reg<T>& operator = ( const ac_reg<T> &r ){ 00111 write( r.read() ); 00112 return *this; 00113 } 00114 00115 //ac_reg<T> = Type_T 00116 ac_reg<T> & operator = ( const T& d ){ 00117 00118 write( d ); 00119 return *this; 00120 } 00121 00123 ac_reg<T> & operator *= ( const T v ){ 00124 write( read() * (int)v ); 00125 return *this; 00126 } 00127 00129 ac_reg<T> & operator *= ( ac_reg<T> &r ){ 00130 write( read() * r.read() ); 00131 return *this; 00132 } 00133 00135 ac_reg<T> & operator /= ( const T d ){ 00136 write( read() / d ); 00137 return *this; 00138 } 00139 00141 ac_reg<T> & operator /= ( ac_reg<T> &r ){ 00142 write( read() / r.read() ); 00143 return *this; 00144 } 00145 00147 ac_reg<T> & operator %= ( const T d ){ 00148 write( read() % d ); 00149 return *this; 00150 } 00151 00153 ac_reg<T> & operator %= ( ac_reg<T> &r ){ 00154 write( read() % r.read() ); 00155 return *this; 00156 } 00157 00159 ac_reg<T> & operator += ( const T& d ){ 00160 write( read() + d ); 00161 return *this; 00162 } 00163 00165 ac_reg<T> & operator += ( ac_reg<T> &r ){ 00166 write( read() + r.read() ); 00167 return *this; 00168 } 00169 00171 ac_reg<T> & operator -= ( const T d ){ 00172 write( read() - d ); 00173 return *this; 00174 } 00175 00177 ac_reg<T> & operator -= ( ac_reg<T> &r ){ 00178 write( read() - r.read() ); 00179 return *this; 00180 } 00181 00183 ac_reg<T> & operator <<= ( const T d ){ 00184 write( read() << d ); 00185 return *this; 00186 } 00187 00189 ac_reg<T> & operator <<= ( ac_reg<T> &r ){ 00190 write( read() << r.read() ); 00191 return *this; 00192 } 00193 00195 ac_reg<T> & operator >>= ( const T d ){ 00196 write( read() >> d ); 00197 return *this; 00198 } 00199 00201 ac_reg<T> & operator >>= ( ac_reg<T> &r ){ 00202 write( read() >> r.read() ); 00203 return *this; 00204 } 00205 00207 ac_reg<T> & operator &= ( const T d ){ 00208 write( read() & d ); 00209 return *this; 00210 } 00211 00213 ac_reg<T> & operator &= ( ac_reg<T> &r ){ 00214 write( read() & r.read() ); 00215 return *this; 00216 } 00217 00219 ac_reg<T> & operator ^= ( const T d ){ 00220 write( read() ^ d ); 00221 return *this; 00222 } 00223 00225 ac_reg<T> & operator ^= ( ac_reg<T> &r ){ 00226 write( read() ^ r.read() ); 00227 return *this; 00228 } 00229 00231 ac_reg<T> & operator |= ( const T d ){ 00232 write( read() | d ); 00233 return *this; 00234 } 00235 00237 ac_reg<T> & operator |= ( ac_reg<T> &r ){ 00238 write( read() | r.read() ); 00239 return *this; 00240 } 00241 00242 00244 00245 // //ac_reg<T> == ac_reg 00246 // bool operator == ( ac_reg<T> &r ){ 00247 00248 // if( read() == r.read()) 00249 // return true; 00250 // else 00251 // return false; 00252 // } 00253 00254 // //ac_reg<T> != ac_reg 00255 // bool operator != ( ac_reg<T> &r ){ 00256 00257 // if( read() != r.read()) 00258 // return true; 00259 // else 00260 // return false; 00261 // } 00262 00263 // //ac_reg<T> >= ac_reg 00264 // bool operator >= ( ac_reg<T> &r ){ 00265 00266 // if( read() >= r.read()) 00267 // return true; 00268 // else 00269 // return false; 00270 // } 00271 00272 // //ac_reg<T> <= ac_reg 00273 // bool operator <= ( ac_reg<T> &r ){ 00274 00275 // if( read() <= r.read()) 00276 // return true; 00277 // else 00278 // return false; 00279 // } 00280 00281 // //ac_reg<T> > ac_reg 00282 // bool operator > ( ac_reg<T> &r ){ 00283 00284 // if( read() > r.read()) 00285 // return true; 00286 // else 00287 // return false; 00288 // } 00289 00290 // //ac_reg<T> < ac_reg 00291 // bool operator < ( ac_reg<T> &r ){ 00292 00293 // if( read() < r.read()) 00294 // return true; 00295 // else 00296 // return false; 00297 // } 00298 00299 00300 // //ac_reg<T> == Type_T 00301 // bool operator == ( const T &i ){ 00302 00303 // if( read() == i) 00304 // return true; 00305 // else 00306 // return false; 00307 // } 00308 00309 // //!ac_reg<T> == Type_T 00310 // bool operator != ( const T &i ){ 00311 00312 // if( read() != i) 00313 // return true; 00314 // else 00315 // return false; 00316 // } 00317 00318 // //!ac_reg<T> == Type_T 00319 // bool operator >= ( const T &i ){ 00320 00321 // if( read() >= i) 00322 // return true; 00323 // else 00324 // return false; 00325 // } 00326 // //!ac_reg<T> <= Type_T 00327 // bool operator <= ( const T &i ){ 00328 00329 // if( read() <= i) 00330 // return true; 00331 // else 00332 // return false; 00333 // } 00334 00335 // //!ac_reg<T> > Type_T 00336 // bool operator > ( const T &i ){ 00337 00338 // if( read() >= i) 00339 // return true; 00340 // else 00341 // return false; 00342 // } 00343 00344 // //!ac_reg<T> < Type_T 00345 // bool operator < ( const T &i ){ 00346 00347 // if( read() <= i) 00348 // return true; 00349 // else 00350 // return false; 00351 // } 00352 00353 // //!Overloaded and operator 00354 // unsigned operator & ( const T& d ){ 00355 00356 // return read() & d; 00357 // } 00358 00359 // //!Overloaded and operator 00360 // unsigned operator & ( ac_reg<T> &r ){ 00361 00362 // return read() & r.read(); 00363 // } 00364 00365 // //!Overloaded or operator 00366 // unsigned operator | ( const T& d ){ 00367 00368 // return read() | d; 00369 // } 00370 00371 // //!Overloaded or operator 00372 // unsigned operator | ( ac_reg<T> &r ){ 00373 00374 // return read() | r.read(); 00375 // } 00376 00377 // //!Overloaded xor operator 00378 // unsigned operator ^ ( const T& d ){ 00379 00380 // return read() ^ d; 00381 // } 00382 00383 // //!Overloaded xor operator 00384 // unsigned operator ^ ( ac_reg<T> &r ){ 00385 00386 // return read() ^ r.read(); 00387 // } 00388 00389 }; 00390 00391 #endif // AC_REG_H