summaryrefslogtreecommitdiff
path: root/src/systemc/tests/tlm/cancel_all/cancel_all.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/tests/tlm/cancel_all/cancel_all.cpp')
-rw-r--r--src/systemc/tests/tlm/cancel_all/cancel_all.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/systemc/tests/tlm/cancel_all/cancel_all.cpp b/src/systemc/tests/tlm/cancel_all/cancel_all.cpp
new file mode 100644
index 000000000..df97d8962
--- /dev/null
+++ b/src/systemc/tests/tlm/cancel_all/cancel_all.cpp
@@ -0,0 +1,164 @@
+#define SC_INCLUDE_DYNAMIC_PROCESSES
+#include "systemc"
+using namespace sc_core;
+using namespace sc_dt;
+using namespace std;
+
+#include "tlm.h"
+#include "tlm_utils/peq_with_cb_and_phase.h"
+#include "tlm_utils/peq_with_get.h"
+
+
+SC_MODULE(Test_peq_with_cb)
+{
+
+ SC_CTOR(Test_peq_with_cb)
+ : m_peq(this, &Test_peq_with_cb::peq_cb), flag1(true), flag2(true)
+ {
+ SC_THREAD(thread);
+ }
+
+ void thread()
+ {
+ section = 1;
+
+ tlm::tlm_generic_payload *trans;
+ tlm::tlm_phase phase;
+ for (int i = 0; i < 50; i++)
+ {
+ trans = new tlm::tlm_generic_payload;
+ trans->set_address(i);
+ m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) );
+ }
+ wait(50, SC_NS);
+
+ m_peq.cancel_all();
+ cout << "cancel_all\n";
+ section = 2;
+
+ for (int i = 100; i < 150; i++)
+ {
+ trans = new tlm::tlm_generic_payload;
+ trans->set_address(i);
+ m_peq.notify( *trans, phase, sc_time(rand() % 100, SC_NS) );
+ }
+ wait(50, SC_NS);
+ m_peq.cancel_all();
+ cout << "cancel_all\n";
+
+ wait(50, SC_NS);
+ }
+
+ void peq_cb(tlm::tlm_generic_payload& trans, const tlm::tlm_phase& phase)
+ {
+ sc_time t = sc_time_stamp();
+ sc_dt::uint64 adr = trans.get_address();
+ sc_assert( section == 1 || section == 2 );
+ if (section == 1)
+ {
+ if (flag1) cout << "Called peq_cb with section = " << section << "\n";
+ flag1 = false;
+ sc_assert( t >= sc_time(0, SC_NS) && t <= sc_time(50, SC_NS) );
+ sc_assert( adr >= 0 && adr < 50);
+ }
+ else if (section == 2)
+ {
+ if (flag2) cout << "Called peq_cb with section = " << section << "\n";
+ flag2 = false;
+ sc_assert( t >= sc_time(50, SC_NS) && t <= sc_time(100, SC_NS) );
+ sc_assert( adr >= 100 && adr < 150);
+ }
+ }
+
+ int section;
+ tlm_utils::peq_with_cb_and_phase<Test_peq_with_cb> m_peq;
+ bool flag1, flag2;
+};
+
+
+SC_MODULE(Test_peq_with_get)
+{
+
+ SC_CTOR(Test_peq_with_get)
+ : m_peq("foo"), flag3(true), flag4(true)
+ {
+ SC_THREAD(thread);
+ SC_THREAD(ass_end_thread);
+ }
+
+ void thread()
+ {
+ wait(1000, SC_NS);
+
+ section = 3;
+
+ tlm::tlm_generic_payload *trans;
+ for (int i = 0; i < 50; i++)
+ {
+ trans = new tlm::tlm_generic_payload;
+ trans->set_address(i);
+ m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) );
+ }
+ wait(50, SC_NS);
+
+ m_peq.cancel_all();
+ cout << "cancel_all\n";
+ section = 4;
+
+ for (int i = 100; i < 150; i++)
+ {
+ trans = new tlm::tlm_generic_payload;
+ trans->set_address(i);
+ m_peq.notify( *trans, sc_time(rand() % 100, SC_NS) );
+ }
+ wait(50, SC_NS);
+ m_peq.cancel_all();
+ cout << "cancel_all\n";
+
+ wait(50, SC_NS);
+ }
+
+ void ass_end_thread()
+ {
+ tlm::tlm_generic_payload *trans;
+ for(;;)
+ {
+ wait(m_peq.get_event());
+ while( (trans = m_peq.get_next_transaction()) )
+ {
+ sc_time t = sc_time_stamp();
+ sc_dt::uint64 adr = trans->get_address();
+ sc_assert( section == 3 || section == 4 );
+ if (section == 3)
+ {
+ if (flag3) cout << "Called get_next_transaction with section = " << section << "\n";
+ flag3 = false;
+ sc_assert( t >= sc_time(1000, SC_NS) && t <= sc_time(1050, SC_NS) );
+ sc_assert( adr >= 0 && adr < 50);
+ }
+ else if (section == 4)
+ {
+ if (flag4) cout << "Called get_next_transaction with section = " << section << "\n";
+ flag4 = false;
+ sc_assert( t >= sc_time(1050, SC_NS) && t <= sc_time(1100, SC_NS) );
+ sc_assert( adr >= 100 && adr < 150);
+ }
+ }
+ }
+ }
+
+ int section;
+ tlm_utils::peq_with_get<tlm::tlm_generic_payload> m_peq;
+ bool flag3, flag4;
+};
+
+
+int sc_main(int argc, char* argv[])
+{
+ cout << "Unit test for cancel_all()\n";
+ Test_peq_with_cb cb("test_peq_with_cb");
+ Test_peq_with_get get("test_peq_with_get");
+ sc_start();
+ return 0;
+}
+