is_unwinding_bug.cpp revision 12855
112855Sgabeblack@google.com// sync_reset_on/off 212855Sgabeblack@google.com 312855Sgabeblack@google.com#define SC_INCLUDE_DYNAMIC_PROCESSES 412855Sgabeblack@google.com 512855Sgabeblack@google.com#include <systemc> 612855Sgabeblack@google.com 712855Sgabeblack@google.comusing namespace sc_core; 812855Sgabeblack@google.comusing std::cout; 912855Sgabeblack@google.comusing std::endl; 1012855Sgabeblack@google.com 1112855Sgabeblack@google.comstruct M2: sc_module 1212855Sgabeblack@google.com{ 1312855Sgabeblack@google.com M2(sc_module_name _name) 1412855Sgabeblack@google.com { 1512855Sgabeblack@google.com SC_THREAD(ticker); 1612855Sgabeblack@google.com SC_THREAD(calling); 1712855Sgabeblack@google.com SC_THREAD(target); 1812855Sgabeblack@google.com t = sc_get_current_process_handle(); 1912855Sgabeblack@google.com } 2012855Sgabeblack@google.com 2112855Sgabeblack@google.com sc_process_handle t; 2212855Sgabeblack@google.com sc_event ev; 2312855Sgabeblack@google.com 2412855Sgabeblack@google.com void ticker() 2512855Sgabeblack@google.com { 2612855Sgabeblack@google.com for (;;) 2712855Sgabeblack@google.com { 2812855Sgabeblack@google.com wait(10, SC_NS); 2912855Sgabeblack@google.com ev.notify(); 3012855Sgabeblack@google.com } 3112855Sgabeblack@google.com } 3212855Sgabeblack@google.com 3312855Sgabeblack@google.com void calling() 3412855Sgabeblack@google.com { 3512855Sgabeblack@google.com wait(15, SC_NS); 3612855Sgabeblack@google.com 3712855Sgabeblack@google.com t.sync_reset_on(); 3812855Sgabeblack@google.com wait(10, SC_NS); 3912855Sgabeblack@google.com 4012855Sgabeblack@google.com t.sync_reset_off(); 4112855Sgabeblack@google.com wait(10, SC_NS); 4212855Sgabeblack@google.com 4312855Sgabeblack@google.com t.reset(); 4412855Sgabeblack@google.com wait(SC_ZERO_TIME); 4512855Sgabeblack@google.com 4612855Sgabeblack@google.com sc_stop(); 4712855Sgabeblack@google.com } 4812855Sgabeblack@google.com 4912855Sgabeblack@google.com void target() 5012855Sgabeblack@google.com { 5112855Sgabeblack@google.com cout << "Target called/reset at " << sc_time_stamp() << endl; 5212855Sgabeblack@google.com 5312855Sgabeblack@google.com for (;;) 5412855Sgabeblack@google.com { 5512855Sgabeblack@google.com try { 5612855Sgabeblack@google.com wait(ev); 5712855Sgabeblack@google.com cout << "Target awoke at " << sc_time_stamp() << endl; 5812855Sgabeblack@google.com } 5912855Sgabeblack@google.com catch (const sc_unwind_exception& ex) { 6012855Sgabeblack@google.com cout << "Unwinding at " << sc_time_stamp() << endl; 6112855Sgabeblack@google.com sc_assert( t.is_unwinding() ); 6212855Sgabeblack@google.com sc_assert( sc_is_unwinding() ); 6312855Sgabeblack@google.com throw ex; 6412855Sgabeblack@google.com } 6512855Sgabeblack@google.com } 6612855Sgabeblack@google.com } 6712855Sgabeblack@google.com 6812855Sgabeblack@google.com SC_HAS_PROCESS(M2); 6912855Sgabeblack@google.com}; 7012855Sgabeblack@google.com 7112855Sgabeblack@google.comint sc_main(int argc, char* argv[]) 7212855Sgabeblack@google.com{ 7312855Sgabeblack@google.com M2 m("m"); 7412855Sgabeblack@google.com 7512855Sgabeblack@google.com sc_start(); 7612855Sgabeblack@google.com 7712855Sgabeblack@google.com cout << endl << "Success" << endl; 7812855Sgabeblack@google.com return 0; 7912855Sgabeblack@google.com} 8012855Sgabeblack@google.com 81