Main Page | Modules | Class Hierarchy | Class List | File List | Class Members | File Members | Related Pages | Examples

ac_reg.H

Go to the documentation of this file.
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

Generated on Thu Jun 24 08:30:05 2004 for ArchC by doxygen 1.3.4