00001 /******************************************************************************* 00002 00003 The following code is derived, directly or indirectly, from the SystemC 00004 source code Copyright (c) 1996-2014 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 (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.accellera.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_runnable_int.h -- For inline definitions of some utility functions. 00021 DO NOT EXPORT THIS INCLUDE FILE. Include this file 00022 after "sc_process_int.h" so that we can get the base 00023 class right. 00024 00025 Original Author: Bishnupriya Bhattacharya , Cadence Design, 28th July, 2003 00026 00027 CHANGE LOG AT THE END OF THE FILE 00028 ******************************************************************************/ 00029 00030 #ifndef SC_RUNNABLE_INT_H 00031 #define SC_RUNNABLE_INT_H 00032 00033 00034 #include "sysc/kernel/sc_runnable.h" 00035 #include "sysc/kernel/sc_method_process.h" 00036 #include "sysc/kernel/sc_thread_process.h" 00037 // 02/22/2016 ZC: to enable verbose display or not 00038 #ifndef _SYSC_PRINT_VERBOSE_MESSAGE_ENV_VAR 00039 #define _SYSC_PRINT_VERBOSE_MESSAGE_ENV_VAR "SYSC_PRINT_VERBOSE_MESSAGE" 00040 #endif 00041 // DEBUGGING MACROS: 00042 // 00043 // DEBUG_MSG(NAME,P,MSG) 00044 // MSG = message to print 00045 // NAME = name that must match the process for the message to print, or 00046 // null if the message should be printed unconditionally. 00047 // P = pointer to process message is for, or NULL in which case the 00048 // message will not print. 00049 #if 0 00050 # define DEBUG_NAME "" 00051 # define DEBUG_MSG(NAME,P,MSG) \ 00052 { \ 00053 if ( P && ( (strlen(NAME)==0) || !strcmp(NAME,P->name())) ) \ 00054 std::cout << "**** " << sc_time_stamp() << " (" \ 00055 << sc_get_current_process_name() << "): " << MSG \ 00056 << " - " << P->name() << std::endl; \ 00057 } 00058 #else 00059 # define DEBUG_MSG(NAME,P,MSG) 00060 #endif 00061 00062 namespace sc_core { 00063 00064 // The values below are used to indicate when a queue is empty. A non-zero 00065 // non-legal pointer value is used for this so that a zero value in the 00066 // m_execute_p field of an sc_process_b instance can be used to indicate 00067 // that is has not been queued for run. (If we did not use a non-zero 00068 // queue empty indicator then a sc_process_b instance that was queued 00069 // twice in a row might end up on the queue twice if it were the first 00070 // one that was queued!) 00071 00072 #define SC_NO_METHODS ((sc_method_handle)0xdb) 00073 #define SC_NO_THREADS ((sc_thread_handle)0xdb) 00074 00075 00076 //------------------------------------------------------------------------------ 00077 //"sc_runnable::dump" 00078 // 00079 // This method dumps the contents of this object instance. 00080 //------------------------------------------------------------------------------ 00081 inline void sc_runnable::dump() const 00082 { 00083 // Dump the thread queues: 00084 00085 std::cout << "thread pop queue: " << std::endl; 00086 for ( sc_thread_handle p = m_threads_pop; p != SC_NO_THREADS; 00087 p = p->next_runnable() ) 00088 { 00089 std::cout << " " << p << std::endl; 00090 } 00091 00092 std::cout << "thread push queue: " << std::endl; 00093 for ( sc_thread_handle p = m_threads_push_head->next_runnable(); 00094 p != SC_NO_THREADS; p = p->next_runnable() ) 00095 { 00096 std::cout << " " << p << std::endl; 00097 } 00098 } 00099 00100 //------------------------------------------------------------------------------ 00101 //"sc_runnable::execute_method_next" 00102 // 00103 // This method pushes the the supplied method to execute as the next process. 00104 // This is done by pushing it onto the front of the m_methods_pop. 00105 // method_h -> method process to add to the queue. 00106 //------------------------------------------------------------------------------ 00107 inline void sc_runnable::execute_method_next( sc_method_handle method_h ) 00108 { 00109 DEBUG_MSG(DEBUG_NAME,method_h,"pushing this method to execute next"); 00110 method_h->set_next_runnable( m_methods_pop ); 00111 m_methods_pop = method_h; 00112 } 00113 00114 //------------------------------------------------------------------------------ 00115 //"sc_runnable::execute_thread_next" 00116 // 00117 // This method pushes the the supplied thread to execute as the next process. 00118 // This is done by pushing it onto the front of the m_threads_pop. 00119 // thread_h -> thread process to add to the queue. 00120 //------------------------------------------------------------------------------ 00121 inline void sc_runnable::execute_thread_next( sc_thread_handle thread_h ) 00122 { 00123 DEBUG_MSG(DEBUG_NAME,thread_h,"pushing this thread to execute next"); 00124 thread_h->set_next_runnable( m_threads_pop ); 00125 m_threads_pop = thread_h; 00126 } 00127 00128 //------------------------------------------------------------------------------ 00129 //"sc_runnable::init" 00130 // 00131 // This method initializes this object instance. Note we allocate the queue 00132 // heads if necessary. This is done here rather than in the constructor for 00133 // this class to eliminate CTOR processing errors with gcc. 00134 //------------------------------------------------------------------------------ 00135 inline void sc_runnable::init() 00136 { 00137 m_methods_pop = SC_NO_METHODS; 00138 if ( !m_methods_push_head ) 00139 { 00140 m_methods_push_head = new sc_method_process("methods_push_head", true, 00141 (SC_ENTRY_FUNC)0, 0, 0); 00142 m_methods_push_head->dont_initialize(true); 00143 m_methods_push_head->detach(); 00144 } 00145 m_methods_push_tail = m_methods_push_head; 00146 m_methods_push_head->set_next_runnable(SC_NO_METHODS); 00147 00148 m_threads_pop = SC_NO_THREADS; 00149 if ( !m_threads_push_head ) 00150 { 00151 m_threads_push_head = new sc_thread_process("threads_push_head", true, 00152 (SC_ENTRY_FUNC)0, 0, 0); 00153 m_threads_push_head->dont_initialize(true); 00154 m_threads_push_head->detach(); 00155 } 00156 m_threads_push_head->set_next_runnable(SC_NO_THREADS); 00157 m_threads_push_tail = m_threads_push_head; 00158 } 00159 00160 00161 //------------------------------------------------------------------------------ 00162 //"sc_runnable::is_empty" 00163 // 00164 // This method returns true if the push queue is empty, or false if not. 00165 //------------------------------------------------------------------------------ 00166 inline bool sc_runnable::is_empty() const 00167 { 00168 return m_methods_push_head->next_runnable() == SC_NO_METHODS && 00169 m_methods_pop == SC_NO_METHODS && 00170 m_threads_push_head->next_runnable() == SC_NO_THREADS && 00171 m_threads_pop == SC_NO_THREADS; 00172 } 00173 00174 00175 //------------------------------------------------------------------------------ 00176 //"sc_runnable::is_initialized" 00177 // 00178 // This method returns true if the push queue is already initialized. 00179 //------------------------------------------------------------------------------ 00180 inline bool sc_runnable::is_initialized() const 00181 { 00182 return m_methods_push_head && m_threads_push_head; 00183 } 00184 00185 00186 //------------------------------------------------------------------------------ 00187 //"sc_runnable::push_back_method" 00188 // 00189 // This method pushes the supplied method process onto the back of the queue of 00190 // runnable method processes. 00191 // method_h -> method process to add to the queue. 00192 //------------------------------------------------------------------------------ 00193 inline void sc_runnable::push_back_method( sc_method_handle method_h ) 00194 { 00195 //ZC 11:01 2017/3/13 00196 method_h->m_process_state=1; 00197 sc_get_curr_simcontext()->remove_from_wait_queue((sc_process_b*)method_h); 00198 00199 // assert( method_h->next_runnable() == 0 ); // Can't queue twice. 00200 DEBUG_MSG(DEBUG_NAME,method_h,"pushing back method"); 00201 method_h->set_next_runnable(SC_NO_METHODS); 00202 m_methods_push_tail->set_next_runnable(method_h); 00203 m_methods_push_tail = method_h; 00204 } 00205 00206 00207 //------------------------------------------------------------------------------ 00208 //"sc_runnable::push_back_thread" 00209 // 00210 // This method pushes the supplied thread process onto the back of the queue of 00211 // runnable thread processes. 00212 // thread_h -> thread process to add to the queue. 00213 //------------------------------------------------------------------------------ 00214 inline void sc_runnable::push_back_thread( sc_thread_handle thread_h ) 00215 { 00216 //ZC 11:01 2017/3/13 00217 thread_h->m_process_state=1; 00218 sc_get_curr_simcontext()->remove_from_wait_queue((sc_process_b*)thread_h); 00219 00220 // assert( thread_h->next_runnable() == 0 ); // Can't queue twice. 00221 DEBUG_MSG(DEBUG_NAME,thread_h,"pushing back thread"); 00222 thread_h->set_next_runnable(SC_NO_THREADS); 00223 m_threads_push_tail->set_next_runnable(thread_h); 00224 m_threads_push_tail = thread_h; 00225 } 00226 00227 00228 //------------------------------------------------------------------------------ 00229 //"sc_runnable::push_front_method" 00230 // 00231 // This method pushes the supplied method process onto the front of the queue of 00232 // runnable method processes. If the queue is empty the process is the tail 00233 // also. 00234 // method_h -> method process to add to the queue. 00235 //------------------------------------------------------------------------------ 00236 inline void sc_runnable::push_front_method( sc_method_handle method_h ) 00237 { 00238 //ZC 11:01 2017/3/13 00239 method_h->m_process_state=1; 00240 sc_get_curr_simcontext()->remove_from_wait_queue((sc_process_b*)method_h); 00241 00242 // assert( method_h->next_runnable() == 0 ); // Can't queue twice. 00243 DEBUG_MSG(DEBUG_NAME,method_h,"pushing front method"); 00244 method_h->set_next_runnable(m_methods_push_head->next_runnable()); 00245 if ( m_methods_push_tail == m_methods_push_head ) // Empty queue. 00246 { 00247 m_methods_push_tail->set_next_runnable(method_h); 00248 m_methods_push_tail = method_h; 00249 } 00250 else // Non-empty queue. 00251 { 00252 m_methods_push_head->set_next_runnable(method_h); 00253 } 00254 } 00255 00256 00257 //------------------------------------------------------------------------------ 00258 //"sc_runnable::push_front_thread" 00259 // 00260 // This method pushes the supplied thread process onto the front of the queue of 00261 // runnable thread processes. If the queue is empty the process is the tail 00262 // also. 00263 // thread_h -> thread process to add to the queue. 00264 //------------------------------------------------------------------------------ 00265 inline void sc_runnable::push_front_thread( sc_thread_handle thread_h ) 00266 { 00267 //ZC 11:01 2017/3/13 00268 thread_h->m_process_state=1; 00269 sc_get_curr_simcontext()->remove_from_wait_queue((sc_process_b*)thread_h); 00270 00271 // assert( thread_h->next_runnable() == 0 ); // Can't queue twice. 00272 DEBUG_MSG(DEBUG_NAME,thread_h,"pushing front thread"); 00273 thread_h->set_next_runnable(m_threads_push_head->next_runnable()); 00274 if ( m_threads_push_tail == m_threads_push_head ) // Empty queue. 00275 { 00276 m_threads_push_tail->set_next_runnable(thread_h); 00277 m_threads_push_tail = thread_h; 00278 } 00279 else // Non-empty queue. 00280 { 00281 m_threads_push_head->set_next_runnable(thread_h); 00282 } 00283 } 00284 00285 //------------------------------------------------------------------------------ 00286 //"sc_runnable::pop_method" 00287 // 00288 // This method pops the next method process to be executed, or returns a null 00289 // if no method processes are available for execution. 00290 //------------------------------------------------------------------------------ 00291 inline sc_method_handle sc_runnable::pop_method() 00292 { 00293 sc_method_handle result_p; 00294 00295 result_p = m_methods_pop; 00296 if ( result_p != SC_NO_METHODS ) 00297 { 00298 m_methods_pop = result_p->next_runnable(); 00299 result_p->set_next_runnable(0); 00300 } 00301 else 00302 { 00303 result_p = 0; 00304 } 00305 DEBUG_MSG(DEBUG_NAME,result_p,"popping method"); 00306 return result_p; 00307 00308 } 00309 00310 //------------------------------------------------------------------------------ 00311 //"sc_runnable::pop_thread" 00312 // 00313 // This method pops the next thread process to be executed, or returns a null 00314 // if no thread processes are available for execution. 00315 //------------------------------------------------------------------------------ 00316 inline sc_thread_handle sc_runnable::pop_thread() 00317 { 00318 sc_thread_handle result_p; 00319 00320 result_p = m_threads_pop; 00321 if ( result_p != SC_NO_THREADS ) 00322 { 00323 m_threads_pop = result_p->next_runnable(); 00324 result_p->set_next_runnable(0); 00325 } 00326 else 00327 { 00328 result_p = 0; 00329 } 00330 DEBUG_MSG(DEBUG_NAME,result_p,"popping thread for execution"); 00331 return result_p; 00332 } 00333 00334 00335 //------------------------------------------------------------------------------ 00336 //"sc_runnable::remove_method" 00337 // 00338 // This method removes the supplied method process from the push queue if it is 00339 // present. Note we clear the method's next pointer so that it may be queued 00340 // again. 00341 // remove_p -> method process to remove from the run queue. 00342 //------------------------------------------------------------------------------ 00343 inline void sc_runnable::remove_method( sc_method_handle remove_p ) 00344 { 00345 sc_method_handle now_p; // Method now checking. 00346 sc_method_handle prior_p; // Method prior to now_p. 00347 00348 // Don't try to remove things if we have not been initialized. 00349 00350 if ( !is_initialized() ) return; 00351 00352 // Search the push queue: 00353 00354 prior_p = m_methods_push_head; 00355 for ( now_p = m_methods_push_head; now_p!= SC_NO_METHODS; 00356 now_p = now_p->next_runnable() ) 00357 { 00358 if ( remove_p == now_p ) 00359 { 00360 prior_p->set_next_runnable( now_p->next_runnable() ); 00361 if (now_p == m_methods_push_tail) { 00362 m_methods_push_tail = prior_p; 00363 } 00364 now_p->set_next_runnable(0); 00365 DEBUG_MSG(DEBUG_NAME,now_p,"removing method from push queue"); 00366 return; 00367 } 00368 prior_p = now_p; 00369 } 00370 00371 // Search the pop queue: 00372 00373 prior_p = NULL; 00374 for ( now_p = m_methods_pop; now_p != SC_NO_METHODS; 00375 now_p = now_p->next_runnable() ) 00376 { 00377 if ( remove_p == now_p ) 00378 { 00379 if ( prior_p ) 00380 prior_p->set_next_runnable( now_p->next_runnable() ); 00381 else 00382 m_methods_pop = now_p->next_runnable(); 00383 now_p->set_next_runnable(0); 00384 DEBUG_MSG(DEBUG_NAME,now_p,"removing method from pop queue"); 00385 return; 00386 } 00387 prior_p = now_p; 00388 } 00389 } 00390 00391 00392 //------------------------------------------------------------------------------ 00393 //"sc_runnable::remove_thread" 00394 // 00395 // This method removes the supplied thread process from the push or pop 00396 // queue if it is present. Note we clear the thread's next pointer so that it 00397 // may be queued again. 00398 // remove_p -> thread process to remove from the run queue. 00399 //------------------------------------------------------------------------------ 00400 inline void sc_runnable::remove_thread( sc_thread_handle remove_p ) 00401 { 00402 sc_thread_handle now_p; // Thread now checking. 00403 sc_thread_handle prior_p; // Thread prior to now_p. 00404 00405 // Don't try to remove things if we have not been initialized. 00406 00407 if ( !is_initialized() ) return; 00408 00409 // Search the push queue: 00410 00411 prior_p = m_threads_push_head; 00412 for ( now_p = m_threads_push_head; now_p != SC_NO_THREADS; 00413 now_p = now_p->next_runnable() ) 00414 { 00415 if ( remove_p == now_p ) 00416 { 00417 prior_p->set_next_runnable( now_p->next_runnable() ); 00418 if (now_p == m_threads_push_tail) { 00419 m_threads_push_tail = prior_p; 00420 } 00421 now_p->set_next_runnable(0); 00422 DEBUG_MSG(DEBUG_NAME,now_p,"removing thread from push queue"); 00423 return; 00424 } 00425 prior_p = now_p; 00426 } 00427 00428 // Search the pop queue: 00429 00430 prior_p = NULL; 00431 for ( now_p = m_threads_pop; now_p != SC_NO_THREADS; 00432 now_p = now_p->next_runnable() ) 00433 { 00434 if ( remove_p == now_p ) 00435 { 00436 if ( prior_p ) 00437 prior_p->set_next_runnable( now_p->next_runnable() ); 00438 else 00439 m_threads_pop = now_p->next_runnable(); 00440 now_p->set_next_runnable(0); 00441 DEBUG_MSG(DEBUG_NAME,now_p,"removing thread from pop queue"); 00442 return; 00443 } 00444 prior_p = now_p; 00445 } 00446 } 00447 00448 //------------------------------------------------------------------------------ 00449 //"sc_runnable::sc_runnable" 00450 // 00451 // This is the object instance constructor for this class. 00452 //------------------------------------------------------------------------------ 00453 inline sc_runnable::sc_runnable() : 00454 m_methods_push_head(0), m_methods_push_tail(0), m_methods_pop(SC_NO_METHODS), 00455 m_threads_push_head(0), m_threads_push_tail(0), m_threads_pop(SC_NO_THREADS) 00456 {} 00457 00458 //------------------------------------------------------------------------------ 00459 //"sc_runnable::~sc_runnable" 00460 // 00461 // This is the object instance destructor for this class. 00462 //------------------------------------------------------------------------------ 00463 inline sc_runnable::~sc_runnable() 00464 { 00465 delete m_methods_push_head; 00466 delete m_threads_push_head; 00467 } 00468 00469 00470 //------------------------------------------------------------------------------ 00471 //"sc_runnable::toggle_methods" 00472 // 00473 // This method moves the methods push queue to the pop queue and zeros the push 00474 // queue. This will only be done if the pop queue is presently empty. 00475 //------------------------------------------------------------------------------ 00476 inline void sc_runnable::toggle_methods() 00477 { 00478 if ( m_methods_pop == SC_NO_METHODS ) 00479 { 00480 m_methods_pop = m_methods_push_head->next_runnable(); 00481 m_methods_push_head->set_next_runnable(SC_NO_METHODS); 00482 m_methods_push_tail = m_methods_push_head; 00483 } 00484 } 00485 00486 00487 //------------------------------------------------------------------------------ 00488 //"sc_runnable::toggle_threads" 00489 // 00490 // This method moves the threads push queue to the pop queue and zeros the push 00491 // queue. This will only be done if the pop queue is presently empty. 00492 //------------------------------------------------------------------------------ 00493 inline void sc_runnable::toggle_threads() 00494 { 00495 if ( m_threads_pop == SC_NO_THREADS ) 00496 { 00497 m_threads_pop = m_threads_push_head->next_runnable(); 00498 m_threads_push_head->set_next_runnable(SC_NO_THREADS); 00499 m_threads_push_tail = m_threads_push_head; 00500 } 00501 } 00502 00503 00504 //------------------------------------------------------------------------------ 00505 //"sc_runnable::get_methods_push_first" 00506 // 00507 // This method returns the first method of methods push queue. 00508 //------------------------------------------------------------------------------ 00509 inline sc_method_handle sc_runnable::get_methods_push_first() 00510 { 00511 return m_methods_push_head->next_runnable(); 00512 } 00513 00514 00515 //------------------------------------------------------------------------------ 00516 //"sc_runnable::is_methods_push_end" 00517 // 00518 // This method checks whether method_h is the end of methods push queue. Return 00519 // true if method_h equals SC_NO_METHODS, which is right after the last method. 00520 //------------------------------------------------------------------------------ 00521 inline bool sc_runnable::is_methods_push_end( sc_method_handle method_h ) 00522 { 00523 return ( method_h == SC_NO_METHODS ); 00524 } 00525 00526 00527 //------------------------------------------------------------------------------ 00528 //"sc_runnable::get_methods_pop_first" 00529 // 00530 // This method returns the first method of methods pop queue. 00531 //------------------------------------------------------------------------------ 00532 inline sc_method_handle sc_runnable::get_methods_pop_first() 00533 { 00534 return m_methods_pop; 00535 } 00536 00537 00538 //------------------------------------------------------------------------------ 00539 //"sc_runnable::is_methods_pop_end" 00540 // 00541 // This method checks whether method_h is the end of methods pop queue. Return 00542 // true if method_h equals SC_NO_METHODS, which is right after the last method. 00543 //------------------------------------------------------------------------------ 00544 inline bool sc_runnable::is_methods_pop_end( sc_method_handle method_h ) 00545 { 00546 return ( method_h == SC_NO_METHODS ); 00547 } 00548 00549 00550 //------------------------------------------------------------------------------ 00551 //"sc_runnable::get_threads_push_first" 00552 // 00553 // This method returns the first thread of threads push queue. 00554 //------------------------------------------------------------------------------ 00555 inline sc_thread_handle sc_runnable::get_threads_push_first() 00556 { 00557 return m_threads_push_head->next_runnable(); 00558 } 00559 00560 00561 //------------------------------------------------------------------------------ 00562 //"sc_runnable::is_threads_push_end" 00563 // 00564 // This method checks whether thread_h is the end of threads push queue. Return 00565 // true if thread_h equals SC_NO_THREADS, which is right after the last thread. 00566 //------------------------------------------------------------------------------ 00567 inline bool sc_runnable::is_threads_push_end( sc_thread_handle thread_h ) 00568 { 00569 return ( thread_h == SC_NO_THREADS ); 00570 } 00571 00572 00573 //------------------------------------------------------------------------------ 00574 //"sc_runnable::get_threads_pop_first" 00575 // 00576 // This method returns the first thread of threads pop queue. 00577 //------------------------------------------------------------------------------ 00578 inline sc_thread_handle sc_runnable::get_threads_pop_first() 00579 { 00580 return m_threads_pop; 00581 } 00582 00583 00584 //------------------------------------------------------------------------------ 00585 //"sc_runnable::is_threads_pop_end" 00586 // 00587 // This method checks whether thread_h is the end of threads pop queue. Return 00588 // true if thread_h equals SC_NO_THREADS, which is right after the last thread. 00589 //------------------------------------------------------------------------------ 00590 inline bool sc_runnable::is_threads_pop_end( sc_thread_handle thread_h ) 00591 { 00592 return ( thread_h == SC_NO_THREADS ); 00593 } 00594 00595 #undef SC_NO_METHODS 00596 #undef SC_NO_THREADS 00597 #undef DEBUG_MSG 00598 00599 } // namespace sc_core 00600 00601 00602 /******************************************************************************* 00603 00604 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 00605 changes you are making here. 00606 Andy Goodrich, Forte Design Systems, 2 September 2003 00607 Changed queue heads to instances to eliminate the checks for null heads. 00608 00609 ******************************************************************************/ 00610 00611 // $Log: sc_runnable_int.h,v $ 00612 // Revision 1.19 2011/08/24 22:05:51 acg 00613 // Torsten Maehne: initialization changes to remove warnings. 00614 // 00615 // Revision 1.18 2011/08/07 19:08:04 acg 00616 // Andy Goodrich: moved logs to end of file so line number synching works 00617 // better between versions. 00618 // 00619 // Revision 1.17 2011/04/13 02:45:11 acg 00620 // Andy Goodrich: eliminated warning message that occurred if the DEBUG_MSG 00621 // macro was used. 00622 // 00623 // Revision 1.16 2011/04/10 22:18:23 acg 00624 // Andy Goodrich: debugging message clean up. 00625 // 00626 // Revision 1.15 2011/04/08 18:26:07 acg 00627 // Andy Goodrich: added execute_method_next() to handle method dispatch 00628 // for asynchronous notifications that occur outside the evaluation phase. 00629 // 00630 // Revision 1.14 2011/04/01 21:31:10 acg 00631 // Andy Goodrich: turn off diagnostic messages by default. 00632 // 00633 // Revision 1.13 2011/04/01 21:30:02 acg 00634 // Andy Goodrich: inserted conditional displays for queue manipulations. 00635 // 00636 // Revision 1.12 2011/03/30 00:01:34 acg 00637 // Philip A. Hartmann: change break to return in remove_method() to short 00638 // circuit the search the way remove_thread() works. 00639 // 00640 // Revision 1.11 2011/03/28 13:02:52 acg 00641 // Andy Goodrich: Changes for disable() interactions. 00642 // 00643 // Revision 1.10 2011/03/06 15:58:17 acg 00644 // Andy Goodrich: formatting changes. 00645 // 00646 // Revision 1.9 2011/02/18 20:27:14 acg 00647 // Andy Goodrich: Updated Copyrights. 00648 // 00649 // Revision 1.8 2011/02/13 21:47:38 acg 00650 // Andy Goodrich: update copyright notice. 00651 // 00652 // Revision 1.7 2011/02/02 06:37:03 acg 00653 // Andy Goodrich: removed toggle() method since it is no longer used. 00654 // 00655 // Revision 1.6 2011/02/01 21:09:13 acg 00656 // Andy Goodrich: addition of toggle_methods() and toggle_threads() calls. 00657 // 00658 // Revision 1.5 2011/01/25 20:50:37 acg 00659 // Andy Goodrich: changes for IEEE 1666 2011. 00660 // 00661 // Revision 1.4 2010/07/22 20:02:33 acg 00662 // Andy Goodrich: bug fixes. 00663 // 00664 // Revision 1.3 2009/02/28 00:26:58 acg 00665 // Andy Goodrich: changed boost name space to sc_boost to allow use with 00666 // full boost library applications. 00667 // 00668 // Revision 1.2 2008/05/22 17:06:26 acg 00669 // Andy Goodrich: updated copyright notice to include 2008. 00670 // 00671 // Revision 1.1.1.1 2006/12/15 20:20:05 acg 00672 // SystemC 2.3 00673 // 00674 // Revision 1.4 2006/04/20 17:08:17 acg 00675 // Andy Goodrich: 3.0 style process changes. 00676 // 00677 // Revision 1.3 2006/01/13 18:44:30 acg 00678 // Added $Log to record CVS changes into the source. 00679 // 00680 00681 #endif // SC_RUNNABLE_INT_H 00682 00683 // Taf!