blob: 4d29381d56cc9a26c28600fa4aec16ae1de93124 [file] [log] [blame]
#include <systemc>
using namespace sc_core;
using namespace sc_dt;
using std::cout;
using std::endl;
// 34) event finder on multiport
struct i_f: virtual sc_interface
{
virtual const sc_event& event() const = 0;
};
struct Chan: i_f, sc_object
{
virtual const sc_event& event() const { return ev; }
sc_event ev;
};
struct SCPort: sc_port<i_f,0>
{
sc_event_finder& find_event() const
{
return *new sc_event_finder_t<i_f>( *this, &i_f::event );
}
};
SC_MODULE(M)
{
SCPort mp;
bool flag, flag2;
SC_CTOR(M)
: flag(false), flag2(false)
{
SC_THREAD(T);
sensitive << mp.find_event();
}
void T()
{
wait();
sc_assert(sc_time_stamp() == sc_time(1, SC_NS));
wait();
sc_assert(sc_time_stamp() == sc_time(11, SC_NS));
wait();
sc_assert(sc_time_stamp() == sc_time(111, SC_NS));
flag = true;
wait();
flag = false;
}
void end_of_elaboration()
{
SC_THREAD(T2);
for (int i = 0; i < mp.size(); i++)
sensitive << mp[i]->event();
}
void T2()
{
wait();
sc_assert(sc_time_stamp() == sc_time(1, SC_NS));
wait();
sc_assert(sc_time_stamp() == sc_time(11, SC_NS));
wait();
sc_assert(sc_time_stamp() == sc_time(111, SC_NS));
flag2 = true;
wait();
flag2 = false;
}
void end_of_simulation()
{
sc_assert( flag );
sc_assert( flag2 );
}
};
SC_MODULE(Top)
{
M *m;
Chan chan1, chan2, chan3;
SC_CTOR(Top)
{
m = new M("m");
m->mp(chan1);
m->mp(chan2);
m->mp(chan3);
SC_THREAD(T);
}
void T()
{
wait(1, SC_NS);
chan1.ev.notify();
wait(10, SC_NS);
chan2.ev.notify();
wait(100, SC_NS);
chan3.ev.notify();
wait(1, SC_NS);
sc_stop();
}
};
int sc_main(int argc, char* argv[])
{
cout << "Should be silent..." << endl;
Top top("top");
sc_start();
cout << endl << "Success" << endl;
return 0;
}