sc_signal.h

Go to the documentation of this file.
00001 /*****************************************************************************
00002 
00003   The following code is derived, directly or indirectly, from the SystemC
00004   source code Copyright (c) 1996-2006 by all Contributors.
00005   All Rights reserved.
00006 
00007   The contents of this file are subject to the restrictions and limitations
00008   set forth in the SystemC Open Source License Version 2.4 (the "License");
00009   You may not use this file except in compliance with such restrictions and
00010   limitations. You may obtain instructions on how to receive a copy of the
00011   License at http://www.systemc.org/. Software distributed by Contributors
00012   under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
00013   ANY KIND, either express or implied. See the License for the specific
00014   language governing rights and limitations under the License.
00015 
00016  *****************************************************************************/
00017 
00018 /*****************************************************************************
00019 
00020   sc_signal.h -- The sc_signal<T> primitive channel class.
00021 
00022   Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21
00023 
00024   Modification log appears at the end of the file
00025  *****************************************************************************/
00026 
00027 
00028 #ifndef SC_SIGNAL_H
00029 #define SC_SIGNAL_H
00030 
00031 
00032 #include "sysc/communication/sc_port.h"
00033 #include "sysc/communication/sc_prim_channel.h"
00034 #include "sysc/communication/sc_signal_ifs.h"
00035 #include "sysc/utils/sc_string.h"
00036 #include "sysc/kernel/sc_event.h"
00037 #include "sysc/kernel/sc_process.h"
00038 #include "sysc/kernel/sc_reset.h"
00039 #include "sysc/kernel/sc_simcontext.h"
00040 #include "sysc/datatypes/bit/sc_logic.h"
00041 #include "sysc/tracing/sc_trace.h"
00042 #include <typeinfo>
00043 
00044 namespace sc_core {
00045 
00046 // to avoid code bloat in sc_signal<T>
00047 
00048 extern void sc_deprecated_get_data_ref();
00049 extern void sc_deprecated_get_new_value();
00050 extern void sc_deprecated_trace();
00051 
00052 extern
00053 void
00054 sc_signal_invalid_writer(
00055     sc_object* target, sc_object* first_writer, sc_object* second_writer );
00056 
00057 
00058 // ----------------------------------------------------------------------------
00059 //  CLASS : sc_signal<T>
00060 //
00061 //  The sc_signal<T> primitive channel class.
00062 // ----------------------------------------------------------------------------
00063 
00064 template <class T>
00065 class sc_signal
00066 : public sc_signal_inout_if<T>,
00067   public sc_prim_channel
00068 {
00069   public: // constructors and destructor:
00070 
00071     sc_signal()
00072     : sc_prim_channel( sc_gen_unique_name( "signal" ) ),
00073       m_change_event_p( 0 ), m_cur_val( T() ), 
00074       m_delta( ~sc_dt::UINT64_ONE ), m_new_val( T() ), m_output( 0 ), 
00075       m_writer( 0 ) 
00076     {}
00077 
00078     explicit sc_signal( const char* name_ )
00079     : sc_prim_channel( name_ ),
00080       m_change_event_p( 0 ), m_cur_val( T() ), 
00081       m_delta( ~sc_dt::UINT64_ONE ), m_new_val( T() ), m_output( 0 ), 
00082       m_writer( 0 ) 
00083     {}
00084 
00085 
00086     virtual ~sc_signal()
00087     {
00088         if ( !m_change_event_p ) delete m_change_event_p;
00089     }
00090 
00091 
00092     // interface methods
00093 
00094     virtual void register_port( sc_port_base&, const char* );
00095 
00096 
00097     // get the default event
00098     virtual const sc_event& default_event() const
00099     { 
00100         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00101         return *m_change_event_p; 
00102     }
00103 
00104 
00105     // get the value changed event
00106     virtual const sc_event& value_changed_event() const
00107     { 
00108         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00109         return *m_change_event_p; 
00110     }
00111 
00112 
00113     // read the current value
00114     virtual const T& read() const
00115     { return m_cur_val; }
00116 
00117     // get a reference to the current value (for tracing)
00118     virtual const T& get_data_ref() const
00119         { sc_deprecated_get_data_ref(); return m_cur_val; }
00120 
00121 
00122     // was there an event?
00123     virtual bool event() const
00124         { return simcontext()->event_occurred(m_delta); }
00125 
00126     // write the new value
00127     virtual void write( const T& );
00128 
00129 
00130     // other methods
00131 
00132     operator const T& () const
00133     { return read(); }
00134 
00135 
00136     sc_signal<T>& operator = ( const T& a )
00137     { write( a ); return *this; }
00138 
00139     sc_signal<T>& operator = ( const sc_signal<T>& a )
00140     { write( a.read() ); return *this; }
00141 
00142 
00143     const T& get_new_value() const
00144     { return m_new_val; }
00145 
00146 
00147     void trace( sc_trace_file* tf ) const
00148     { 
00149         sc_deprecated_trace();
00150 #           ifdef DEBUG_SYSTEMC
00151             sc_trace( tf, read(), name() ); 
00152 #       endif
00153     }
00154 
00155 
00156     virtual void print( ::std::ostream& = ::std::cout ) const;
00157     virtual void dump( ::std::ostream& = ::std::cout ) const;
00158 
00159     virtual const char* kind() const
00160         { return "sc_signal"; }
00161 
00162 protected:
00163 
00164     virtual void update();
00165 
00166 protected:
00167 
00168     mutable sc_event*  m_change_event_p;
00169     T                  m_cur_val;
00170     sc_dt::uint64      m_delta;   // delta of last event
00171     T                  m_new_val;
00172     sc_port_base*      m_output; // used for static design rule checking
00173     sc_object*         m_writer; // used for dynamic design rule checking
00174 
00175 
00176 
00177 private:
00178 
00179     // disabled
00180     sc_signal( const sc_signal<T>& );
00181 };
00182 
00183 
00184 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
00185 
00186 
00187 template <class T>
00188 inline
00189 void
00190 sc_signal<T>::register_port( sc_port_base& port_, const char* if_typename_ )
00191 {
00192     if ( sc_get_curr_simcontext()->write_check() )
00193     {
00194     std::string nm( if_typename_ );
00195     if( nm == typeid( sc_signal_inout_if<T> ).name() ) {
00196         // an out or inout port; only one can be connected
00197         if( m_output != 0) {
00198         sc_signal_invalid_writer( this, m_output, &port_ );
00199         }
00200         m_output = &port_;
00201     }
00202     }
00203 }
00204 
00205 
00206 // write the new value
00207 
00208 template <class T>
00209 inline
00210 void
00211 sc_signal<T>::write( const T& value_ )
00212 {
00213     sc_object* writer = sc_get_curr_simcontext()->get_current_writer();
00214     if( m_writer == 0 ) {
00215     m_writer = writer;
00216     } else if( m_writer != writer ) {
00217     sc_signal_invalid_writer( this, m_writer, writer );
00218     }
00219 
00220     m_new_val = value_;
00221     if( !( m_new_val == m_cur_val ) ) {
00222     request_update();
00223     }
00224 }
00225 
00226 
00227 template <class T>
00228 inline
00229 void
00230 sc_signal<T>::print( ::std::ostream& os ) const
00231 {
00232     os << m_cur_val;
00233 }
00234 
00235 template <class T>
00236 inline
00237 void
00238 sc_signal<T>::dump( ::std::ostream& os ) const
00239 {
00240     os << "     name = " << name() << ::std::endl;
00241     os << "    value = " << m_cur_val << ::std::endl;
00242     os << "new value = " << m_new_val << ::std::endl;
00243 }
00244 
00245 
00246 template <class T>
00247 inline
00248 void
00249 sc_signal<T>::update()
00250 {
00251     if( !( m_new_val == m_cur_val ) ) {
00252     m_cur_val = m_new_val;
00253     if ( m_change_event_p ) m_change_event_p->notify_next_delta();
00254     m_delta = delta_count();
00255     }
00256 }
00257 
00258 
00259 // ----------------------------------------------------------------------------
00260 //  CLASS : sc_signal<bool>
00261 //
00262 //  Specialization of sc_signal<T> for type bool.
00263 // ----------------------------------------------------------------------------
00264 
00265 class sc_reset;
00266 
00267 template <>
00268 class sc_signal<bool>
00269 : public sc_signal_inout_if<bool>,
00270   public sc_prim_channel
00271 {
00272 public: // constructors and destructor:
00273 
00274     sc_signal()
00275     : sc_prim_channel( sc_gen_unique_name( "signal" ) ),
00276       m_change_event_p( 0 ),
00277           m_cur_val( false ),
00278           m_delta( ~sc_dt::UINT64_ONE ),
00279       m_negedge_event_p( 0 ),
00280           m_new_val( false ),
00281           m_output( 0 ),
00282       m_posedge_event_p( 0 ),
00283           m_reset_p( 0 ),
00284           m_writer( 0 )
00285     {}
00286 
00287     explicit sc_signal( const char* name_ )
00288     : sc_prim_channel( name_ ),
00289       m_change_event_p( 0 ),
00290           m_cur_val( false ),
00291           m_delta( ~sc_dt::UINT64_ONE ),
00292       m_negedge_event_p( 0 ),
00293           m_new_val( false ),
00294           m_output( 0 ),
00295       m_posedge_event_p( 0 ),
00296           m_reset_p( 0 ),
00297           m_writer( 0 )
00298     {}
00299 
00300     virtual ~sc_signal();
00301 
00302 
00303     // interface methods
00304 
00305     virtual void register_port( sc_port_base&, const char* );
00306 
00307 
00308     // get the default event
00309     virtual const sc_event& default_event() const
00310     { 
00311         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00312         return *m_change_event_p; 
00313     }
00314 
00315 
00316     // get the value changed event
00317     virtual const sc_event& value_changed_event() const
00318     { 
00319         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00320         return *m_change_event_p; 
00321     }
00322 
00323     // get the positive edge event
00324     virtual const sc_event& posedge_event() const
00325     { 
00326         if ( !m_posedge_event_p )
00327             m_posedge_event_p = new sc_event; 
00328         return *m_posedge_event_p; 
00329     }
00330 
00331     // get the negative edge event
00332     virtual const sc_event& negedge_event() const
00333     { 
00334         if ( !m_negedge_event_p )
00335             m_negedge_event_p = new sc_event; 
00336         return *m_negedge_event_p; 
00337     }
00338 
00339 
00340     // read the current value
00341     virtual const bool& read() const
00342     { return m_cur_val; }
00343 
00344     // get a reference to the current value (for tracing)
00345     virtual const bool& get_data_ref() const
00346         { sc_deprecated_get_data_ref(); return m_cur_val; }
00347 
00348 
00349     // was there a value changed event?
00350     virtual bool event() const
00351         { return simcontext()->event_occurred(m_delta); }
00352 
00353     // was there a positive edge event?
00354     virtual bool posedge() const
00355     { return ( event() && m_cur_val ); }
00356 
00357     // was there a negative edge event?
00358     virtual bool negedge() const
00359     { return ( event() && ! m_cur_val ); }
00360 
00361     // reset creation
00362 
00363     virtual sc_reset* is_reset() const;
00364 
00365     // write the new value
00366     virtual void write( const bool& );
00367 
00368     // other methods
00369 
00370     operator const bool& () const
00371     { return read(); }
00372 
00373 
00374     sc_signal<bool>& operator = ( const bool& a )
00375     { write( a ); return *this; }
00376 
00377     sc_signal<bool>& operator = ( const sc_signal<bool>& a )
00378     { write( a.read() ); return *this; }
00379 
00380 
00381     const bool& get_new_value() const
00382     { return m_new_val; }
00383 
00384 
00385     void trace( sc_trace_file* tf ) const
00386     {
00387         sc_deprecated_trace();
00388 #           ifdef DEBUG_SYSTEMC
00389             sc_trace( tf, read(), name() ); 
00390 #           endif
00391     }
00392 
00393 
00394     virtual void print( ::std::ostream& = ::std::cout ) const;
00395     virtual void dump( ::std::ostream& = ::std::cout ) const;
00396 
00397     virtual const char* kind() const
00398         { return "sc_signal"; }
00399 
00400 protected:
00401 
00402     virtual void update();
00403 
00404     virtual bool is_clock() const { return false; }
00405 
00406 protected:
00407     mutable sc_event* m_change_event_p;  // value change event if present.
00408     bool              m_cur_val;         // current value of object.
00409     sc_dt::uint64     m_delta;           // delta of last event
00410     mutable sc_event* m_negedge_event_p; // negative edge event if present.
00411     bool              m_new_val;         // next value of object.
00412     sc_port_base*     m_output;          // used for static design rule checking
00413     mutable sc_event* m_posedge_event_p; // positive edge event if present.
00414     mutable sc_reset* m_reset_p;         // reset mechanism if present.
00415     sc_object*        m_writer;          // process writing this object's value.
00416 
00417 private:
00418 
00419     // disabled
00420     sc_signal( const sc_signal<bool>& );
00421 };
00422 
00423 
00424 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
00425 
00426 inline
00427 void
00428 sc_signal<bool>::register_port( sc_port_base& port_, const char* if_typename_ )
00429 {
00430     if ( sc_get_curr_simcontext()->write_check() )
00431     {
00432     std::string nm( if_typename_ );
00433     if( nm == typeid( sc_signal_inout_if<bool> ).name() ) {
00434         // an out or inout port; only one can be connected
00435         if( m_output != 0 ) {
00436         sc_signal_invalid_writer( this, m_output, &port_ );
00437         }
00438         m_output = &port_;
00439     }
00440     }
00441 }
00442 
00443 
00444 // write the new value
00445 
00446 inline
00447 void
00448 sc_signal<bool>::write( const bool& value_ )
00449 {
00450     sc_object* writer = sc_get_curr_simcontext()->get_current_writer();
00451     if( m_writer == 0 ) {
00452     m_writer = writer;
00453     } else if( m_writer != writer ) {
00454     sc_signal_invalid_writer( this, m_writer, writer );
00455     }
00456 
00457     m_new_val = value_;
00458     if( !( m_new_val == m_cur_val ) ) {
00459     request_update();
00460     }
00461 }
00462 
00463 
00464 inline
00465 void
00466 sc_signal<bool>::print( ::std::ostream& os ) const
00467 {
00468     os << m_cur_val;
00469 }
00470 
00471 inline
00472 void
00473 sc_signal<bool>::dump( ::std::ostream& os ) const
00474 {
00475     os << "     name = " << name() << ::std::endl;
00476     os << "    value = " << m_cur_val << ::std::endl;
00477     os << "new value = " << m_new_val << ::std::endl;
00478 }
00479 
00480 
00481 inline
00482 void
00483 sc_signal<bool>::update()
00484 {
00485     if( !( m_new_val == m_cur_val ) ) {
00486         // order of execution below is important, the notify_processes() call
00487         // must come after the update of m_cur_val for things to work properly!
00488         m_cur_val = m_new_val;
00489     if ( m_reset_p ) m_reset_p->notify_processes();
00490 
00491         if ( m_change_event_p ) m_change_event_p->notify_next_delta();
00492         if( m_cur_val ) {
00493             if ( m_posedge_event_p ) m_posedge_event_p->notify_next_delta();
00494         } else {
00495             if ( m_negedge_event_p ) m_negedge_event_p->notify_next_delta();
00496         }
00497         m_delta = delta_count();
00498     }
00499 }
00500 
00501 
00502 // ----------------------------------------------------------------------------
00503 //  CLASS : sc_signal<sc_dt::sc_logic>
00504 //
00505 //  Specialization of sc_signal<T> for type sc_dt::sc_logic.
00506 // ----------------------------------------------------------------------------
00507 
00508 template <>
00509 class sc_signal<sc_dt::sc_logic>
00510 : public sc_signal_inout_if<sc_dt::sc_logic>,
00511   public sc_prim_channel
00512 {
00513   public: // constructors and destructor:
00514 
00515     sc_signal()
00516     : sc_prim_channel( sc_gen_unique_name( "signal" ) ),
00517       m_change_event_p( 0 ),
00518       m_cur_val(),
00519           m_delta( ~sc_dt::UINT64_ONE ),
00520       m_negedge_event_p( 0 ),
00521       m_new_val(),
00522           m_output( 0 ),
00523       m_posedge_event_p( 0 ),
00524       m_writer( 0 )
00525     {}
00526 
00527     explicit sc_signal( const char* name_ )
00528     : sc_prim_channel( name_ ),
00529       m_change_event_p( 0 ),
00530       m_cur_val(),
00531           m_delta( ~sc_dt::UINT64_ONE ),
00532       m_negedge_event_p( 0 ),
00533       m_new_val(),
00534           m_output( 0 ),
00535       m_posedge_event_p( 0 ),
00536       m_writer( 0 )
00537     {}
00538 
00539     virtual ~sc_signal()
00540     {
00541         if ( !m_change_event_p ) delete m_change_event_p;
00542         if ( !m_negedge_event_p ) delete m_negedge_event_p;
00543         if ( !m_posedge_event_p ) delete m_posedge_event_p;
00544     }
00545 
00546 
00547     // interface methods
00548 
00549     virtual void register_port( sc_port_base&, const char* );
00550 
00551 
00552     // get the default event
00553     virtual const sc_event& default_event() const
00554     { 
00555         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00556         return *m_change_event_p; 
00557     }
00558 
00559 
00560     // get the value changed event
00561     virtual const sc_event& value_changed_event() const
00562     { 
00563         if ( !m_change_event_p ) m_change_event_p = new sc_event; 
00564         return *m_change_event_p; 
00565     }
00566 
00567     // get the positive edge event
00568     virtual const sc_event& posedge_event() const
00569     { 
00570         if ( !m_posedge_event_p )
00571             m_posedge_event_p = new sc_event; 
00572         return *m_posedge_event_p; 
00573     }
00574 
00575     // get the negative edge event
00576     virtual const sc_event& negedge_event() const
00577     { 
00578         if ( !m_negedge_event_p )
00579             m_negedge_event_p = new sc_event; 
00580         return *m_negedge_event_p; 
00581     }
00582 
00583 
00584     // read the current value
00585     virtual const sc_dt::sc_logic& read() const
00586     { return m_cur_val; }
00587 
00588     // get a reference to the current value (for tracing)
00589     virtual const sc_dt::sc_logic& get_data_ref() const
00590         { sc_deprecated_get_data_ref(); return m_cur_val; }
00591 
00592 
00593     // was there an event?
00594     virtual bool event() const
00595         { return simcontext()->event_occurred(m_delta); }
00596 
00597     // was there a positive edge event?
00598     virtual bool posedge() const
00599     { return ( event() && m_cur_val == sc_dt::SC_LOGIC_1 ); }
00600 
00601     // was there a negative edge event?
00602     virtual bool negedge() const
00603     { return ( event() && m_cur_val == sc_dt::SC_LOGIC_0 ); }
00604 
00605 
00606     // write the new value
00607     virtual void write( const sc_dt::sc_logic& );
00608 
00609 
00610     // other methods
00611 
00612     operator const sc_dt::sc_logic& () const
00613     { return read(); }
00614 
00615 
00616     sc_signal<sc_dt::sc_logic>& operator = ( const sc_dt::sc_logic& a )
00617     { write( a ); return *this; }
00618 
00619     sc_signal<sc_dt::sc_logic>& operator = (const sc_signal<sc_dt::sc_logic>& a)
00620     { write( a.read() ); return *this; }
00621 
00622 
00623     const sc_dt::sc_logic& get_new_value() const
00624     { return m_new_val; }
00625 
00626 
00627     void trace( sc_trace_file* tf ) const
00628     {
00629         sc_deprecated_trace();
00630 #           ifdef DEBUG_SYSTEMC
00631             sc_trace( tf, read(), name() ); 
00632 #           endif
00633     }
00634 
00635     virtual void print( ::std::ostream& = ::std::cout ) const;
00636     virtual void dump( ::std::ostream& = ::std::cout ) const;
00637 
00638     virtual const char* kind() const
00639         { return "sc_signal"; }
00640 
00641 protected:
00642 
00643     virtual void update();
00644 
00645 protected:
00646 
00647     mutable sc_event* m_change_event_p;  // value change event if present.
00648     sc_dt::sc_logic   m_cur_val;         // current value of object.
00649     sc_dt::uint64     m_delta;           // delta of last event
00650     mutable sc_event* m_negedge_event_p; // negative edge event if present.
00651     sc_dt::sc_logic   m_new_val;         // next value of object.
00652     sc_port_base*     m_output;          // used for static design rule checking
00653     mutable sc_event* m_posedge_event_p; // positive edge event if present.
00654     sc_object*        m_writer;          // process writing this object's value.
00655 
00656 private:
00657 
00658     // disabled
00659     sc_signal( const sc_signal<sc_dt::sc_logic>& );
00660 };
00661 
00662 
00663 // IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
00664 
00665 inline
00666 void
00667 sc_signal<sc_dt::sc_logic>::register_port( sc_port_base& port_,
00668                     const char* if_typename_ )
00669 {
00670     if ( sc_get_curr_simcontext()->write_check() )
00671     {
00672     std::string nm( if_typename_ );
00673     if( nm == typeid( sc_signal_inout_if<sc_dt::sc_logic> ).name() ) {
00674         // an out or inout port; only one can be connected
00675         if( m_output != 0 ) {
00676         sc_signal_invalid_writer( this, m_output, &port_ );
00677         }
00678         m_output = &port_;
00679     }
00680     }
00681 }
00682 
00683 
00684 // write the new value
00685 
00686 inline
00687 void
00688 sc_signal<sc_dt::sc_logic>::write( const sc_dt::sc_logic& value_ )
00689 {
00690     sc_object* writer = sc_get_curr_simcontext()->get_current_writer();
00691     if( m_writer == 0 ) {
00692     m_writer = writer;
00693     } else if( m_writer != writer ) {
00694     sc_signal_invalid_writer( this, m_writer, writer );
00695     }
00696 
00697     m_new_val = value_;
00698     if( !( m_new_val == m_cur_val ) ) {
00699     request_update();
00700     }
00701 }
00702 
00703 
00704 inline
00705 void
00706 sc_signal<sc_dt::sc_logic>::print( ::std::ostream& os ) const
00707 {
00708     os << m_cur_val;
00709 }
00710 
00711 inline
00712 void
00713 sc_signal<sc_dt::sc_logic>::dump( ::std::ostream& os ) const
00714 {
00715     os << "     name = " << name() << ::std::endl;
00716     os << "    value = " << m_cur_val << ::std::endl;
00717     os << "new value = " << m_new_val << ::std::endl;
00718 }
00719 
00720 
00721 inline
00722 void
00723 sc_signal<sc_dt::sc_logic>::update()
00724 {
00725     if( !( m_new_val == m_cur_val ) ) {
00726     m_cur_val = m_new_val;
00727     if ( m_change_event_p ) m_change_event_p->notify_next_delta();
00728     if( m_posedge_event_p && (m_cur_val == sc_dt::SC_LOGIC_1) ) {
00729         m_posedge_event_p->notify_next_delta();
00730     } else if( m_negedge_event_p && (m_cur_val == sc_dt::SC_LOGIC_0) ) {
00731         m_negedge_event_p->notify_next_delta();
00732     }
00733     m_delta = delta_count();
00734     }
00735 }
00736 
00737 // ----------------------------------------------------------------------------
00738 
00739 template <class T>
00740 inline
00741 ::std::ostream&
00742 operator << ( ::std::ostream& os, const sc_signal<T>& a )
00743 {
00744     return ( os << a.read() );
00745 }
00746 
00747 } // namespace sc_core
00748 
00749 /*****************************************************************************
00750 
00751   MODIFICATION LOG - modifiers, enter your name, affiliation, date and
00752   changes you are making here.
00753 
00754       Name, Affiliation, Date:
00755   Description of Modification:
00756     
00757  *****************************************************************************/
00758 //$Log: sc_signal.h,v $
00759 //Revision 1.1.1.1  2006/12/15 20:31:35  acg
00760 //SystemC 2.2
00761 //
00762 //Revision 1.12  2006/04/11 23:11:57  acg
00763 //  Andy Goodrich: Changes for reset support that only includes
00764 //  sc_cthread_process instances.
00765 //
00766 //Revision 1.11  2006/03/13 20:19:44  acg
00767 // Andy Goodrich: changed sc_event instances into pointers to sc_event instances
00768 // that are allocated as needed. This saves considerable storage for large
00769 // numbers of signals, etc.
00770 //
00771 //Revision 1.10  2006/01/26 21:00:50  acg
00772 // Andy Goodrich: conversion to use sc_event::notify(SC_ZERO_TIME) instead of
00773 // sc_event::notify_delayed()
00774 //
00775 //Revision 1.9  2006/01/24 20:45:41  acg
00776 //Andy Goodrich: converted notify_delayed() calls into notify_next_delta() calls
00777 //to eliminate deprecation warnings. notify_next_delta() is an implemenation-
00778 //dependent method of sc_event. It is simpler than notify_delayed(), and should
00779 //speed up simulation speeds.
00780 //
00781 //Revision 1.8  2006/01/19 19:18:25  acg
00782 //Andy Goodrich: eliminated check_writer in favor of inline code within the
00783 //write() method since we always execute the check_writer code even when
00784 //check writing is turned off.
00785 //
00786 //Revision 1.7  2006/01/19 00:30:57  acg
00787 //Andy Goodrich: Yet another implementation for disabling write checks on
00788 //signals. This version uses an environment variable, SC_SIGNAL_WRITE_CHECK,
00789 //that when set to DISABLE will turn off write checking.
00790 //
00791 //Revision 1.6  2006/01/18 21:42:26  acg
00792 //Andy Goodrich: Changes for check writer support, and tightening up sc_clock
00793 //port usage.
00794 //
00795 //Revision 1.5  2006/01/13 20:41:59  acg
00796 //Andy Goodrich: Changes to add port registration to the things that are
00797 //checked when SC_NO_WRITE_CHECK is not defined.
00798 //
00799 //Revision 1.4  2006/01/13 18:47:20  acg
00800 //Reversed sense of multiwriter signal check. It now defaults to ON unless the
00801 //user defines SC_NO_WRITE_CHEK before inclusion of the file.
00802 //
00803 //Revision 1.3  2006/01/03 23:18:26  acg
00804 //Changed copyright to include 2006.
00805 //
00806 //Revision 1.2  2005/12/20 21:58:18  acg
00807 //Removed Makefile.in, changed the event() methods to use sc_simcontext::event_occurred.
00808 //
00809 //Revision 1.1.1.1  2005/12/19 23:16:43  acg
00810 //First check in of SystemC 2.1 into its own archive.
00811 //
00812 //Revision 1.19  2005/09/15 23:01:51  acg
00813 //Added std:: prefix to appropriate methods and types to get around
00814 //issues with the Edison Front End.
00815 //
00816 //Revision 1.18  2005/06/10 22:43:55  acg
00817 //Added CVS change log annotation.
00818 //
00819 
00820 #endif
00821 
00822 // Taf!

Generated on Wed Jan 21 15:32:06 2009 for SystemC by  doxygen 1.5.5