void ctrl() { count = 1; ph = sc_spawn(sc_bind(&Top::parent_proc, this)); wait(10, SC_NS); count = 2; ph.reset(SC_INCLUDE_DESCENDANTS); wait(10, SC_NS); count = 3; ev.notify(); wait(10, SC_NS); count = 4; ph.suspend(SC_INCLUDE_DESCENDANTS); wait(10, SC_NS); count = 5; ev.notify(); wait(10, SC_NS); count = 6; ph.resume(SC_INCLUDE_DESCENDANTS); wait(10, SC_NS); count = 7; ph.kill(SC_INCLUDE_DESCENDANTS); wait(10, SC_NS); }
void calling() { wait(15, SC_NS); // Target runs at time 10 NS due to notification sc_assert( count == 1 ); wait(10, SC_NS); // Target runs again at time 20 NS due to notification sc_assert( count == 2 ); t.reset(); // Target reset immediately at time 25 NS sc_assert( count == 0 ); wait(10, SC_NS); // Target runs again at time 30 NS due to notification sc_assert( count == 1 ); t.kill(); sc_assert( !killing_over ); killing_over = true; // Target killed immediately at time 35 NS sc_assert( t.terminated() ); sc_assert( k.terminated() ); sc_stop(); }
void T1() { wait(25, SC_NS); cout << "suspend at " << sc_time_stamp() << endl; h2.suspend(); wait(20, SC_NS); cout << "resume at " << sc_time_stamp() << endl; h2.resume(); wait(20, SC_NS); cout << "disable at " << sc_time_stamp() << endl; h2.disable(); wait(20, SC_NS); cout << "enable at " << sc_time_stamp() << endl; h2.enable(); wait(20, SC_NS); h2.reset(); wait(20, SC_NS); h2.kill(); wait(20, SC_NS); sc_pause(); wait(50, SC_NS); sc_stop(); end_of_T1 = true; }
void target() { cout << "Target called/reset at " << sc_time_stamp() << endl; count = 0; for (;;) { try { wait(ev); cout << "Target awoke at " << sc_time_stamp() << endl; ++count; } catch (const sc_unwind_exception& ex) { cout << "sc_unwind_exception caught by target" << endl; if (count == 2) sc_assert( ex.is_reset() ); else if (count == 1) { sc_assert( !ex.is_reset() ); sc_assert( !killing_over ); k.kill(); } else sc_assert( false ); throw ex; } } }
void target() { bomb local_obj(target_handle); wait(10, SC_NS); f0 = 1; target_handle.kill(); }
void second_bystander() // Gets reset by bystander { for (;;) { try { wait(ev); } catch (const sc_unwind_exception& ex) { cout << "sc_unwind_exception caught by second_bystander" << endl; sc_assert( sc_time_stamp() == sc_time(35, SC_NS) ); sc_assert( ex.is_reset() == true ); sc_assert( !killing_over ); sc_assert( v.is_unwinding() ); // sic sc_assert( b.is_unwinding() ); // sic sc_assert( sc_is_unwinding() ); b3.kill(); throw ex; } } }
void calling() { wait(15, SC_NS); // Target runs at time 10 NS due to notification sc_assert( count == 1 ); // The victim awakes every 1ns sc_assert( sc_time_to_pending_activity() <= sc_time(1, SC_NS) ); wait(10, SC_NS); // Target runs again at time 20 NS due to notification sc_assert( count == 2 ); t.reset(); // Target reset immediately at time 25 NS sc_assert( count == 0 ); wait(10, SC_NS); // Target runs again at time 30 NS due to notification sc_assert( count == 1 ); t.kill(); sc_assert( !killing_over ); killing_over = true; // Target killed immediately at time 35 NS if (t.valid()) sc_assert( t.terminated() ); if (k.valid()) sc_assert( k.terminated() ); if (v.valid()) sc_assert( v.terminated() ); sc_assert( b.valid() && !b.terminated() ); sc_assert( b2.valid() && !b2.terminated() ); if (b3.valid()) sc_assert( b3.terminated() ); sc_stop(); }
void ticker() { for (;;) { try { wait(10, SC_NS); ev.notify(); sc_assert( !sc_is_unwinding() ); } catch (const sc_unwind_exception& ex) { // ticker process killed by target cout << "sc_unwind_exception caught by ticker" << endl; sc_assert( !ex.is_reset() ); sc_assert( count == 1 ); sc_assert( !killing_over ); sc_assert( t.is_unwinding() ); sc_assert( sc_is_unwinding() ); v.kill(); throw ex; } } }
~bomb() { h.kill(); // Aborts !!!!!! }
void ctrl() { wait(SC_ZERO_TIME); sc_assert( sc_delta_count() == 1 ); count = 1; ev.notify(); wait(target_awoke_event); count = 2; ev.notify(); t.suspend(); yield(); count = 2; t.resume(); wait(target_awoke_event); count = 3; ev.notify(); t.disable(); wait(target_awoke_event); count = 4; ev.notify(); yield(); count = 5; t.enable(); yield(); count = 6; ev.notify(); wait(target_awoke_event); count = 7; t.suspend(); ev.notify(); yield(); count = 8; t.resume(); wait(target_awoke_event); count = 9; reset_count = 9; t.sync_reset_on(); ev.notify(); wait(target_awoke_event); count = 10; reset_count = 10; ev.notify(); wait(target_awoke_event); count = 11; t.sync_reset_off(); ev.notify(); wait(target_awoke_event); count = 12; t.resume(); t.enable(); t.sync_reset_off(); yield(); count = 13; ev.notify(); wait(target_awoke_event); count = 14; reset_count = 14; t.reset(); count = 15; ev.notify(); wait(target_awoke_event); count = 16; reset_count = 16; t.reset(); count = 17; t.throw_it(ex); count = 18; t.kill(); yield(); count = 19; m.enable(); ev.notify(); wait(target_awoke_event); count = 20; ev.notify(); m.suspend(); yield(); count = 21; m.resume(); wait(target_awoke_event); count = 22; m.suspend(); ev.notify(); yield(); count = 23; m.resume(); wait(target_awoke_event); count = 24; m.suspend(); ev.notify(); count = 25; m.resume(); wait(target_awoke_event); count = 26; reset_count = 26; m.sync_reset_on(); ev.notify(); wait(target_awoke_event); count = 27; m.disable(); ev.notify(); yield(); count = 28; reset_count = 28; m.enable(); ev.notify(); wait(target_awoke_event); count = 29; m.sync_reset_off(); m.enable(); m.resume(); yield(); count = 30; reset_count = 30; m.reset(); count = 31; m.kill(); yield(); sc_assert( sc_delta_count() == 1 ); f27 = 1; }