test206.cpp revision 12855:588919e0e4aa
1#define SC_INCLUDE_DYNAMIC_PROCESSES
2
3#include <systemc>
4#include <cstring>
5using namespace sc_core;
6using namespace sc_dt;
7using std::cout;
8using std::endl;
9
10// 6) sc_get_current_process_handle
11
12SC_MODULE(M)
13{
14  SC_CTOR(M)
15  {
16    sc_process_handle h;
17    sc_assert (!h.valid());
18    h = sc_get_current_process_handle();
19    sc_assert (!h.valid());
20    SC_THREAD(T);
21    h = sc_get_current_process_handle();
22    sc_assert (h.valid());
23    sc_assert (strcmp(h.name(),"top.m.T") == 0);
24    sc_assert (h.proc_kind()==SC_THREAD_PROC_);
25    sc_assert (h.dynamic()==false);
26    sc_assert (h.terminated()==false);
27    sc_assert (h.get_process_object() != 0);
28    sc_assert (h.get_parent_object() == this);
29
30    sc_spawn(sc_bind(&M::proc, this), "static_proc");
31    h = sc_get_current_process_handle();
32    sc_assert (h.valid());
33    sc_assert (strcmp(h.name(),"top.m.static_proc") == 0);
34    sc_assert (h.proc_kind()==SC_THREAD_PROC_);
35    sc_assert (h.dynamic()==false);
36    sc_assert (h.terminated()==false);
37    sc_assert (h.get_process_object() != 0);
38    sc_assert (h.get_parent_object() == this);
39  }
40  sc_object* obj;
41  void T()
42  {
43    sc_process_handle h;
44    sc_assert (!h.valid());
45    h = sc_get_current_process_handle();
46    sc_assert (h.valid());
47    sc_assert (strcmp(h.name(),"top.m.T") == 0);
48    sc_assert (h.proc_kind()==SC_THREAD_PROC_);
49    sc_assert (h.dynamic()==false);
50    sc_assert (h.terminated()==false);
51    sc_assert (h.get_process_object() != 0);
52    sc_assert (h.get_parent_object() == this);
53
54    obj = h.get_process_object();
55    sc_spawn_options opt;
56    opt.spawn_method();
57    sc_spawn(sc_bind(&M::proc, this), "dynamic_proc", &opt);
58    wait(1, SC_NS);
59  }
60  void proc()
61  {
62    sc_process_handle h = sc_get_current_process_handle();
63    sc_assert (h.valid());
64    if (h.dynamic())
65    {
66      sc_assert (strcmp(h.name(),"top.m.T.dynamic_proc") == 0);
67      sc_assert (h.proc_kind()==SC_METHOD_PROC_);
68      sc_assert (h.get_parent_object() == obj);
69    }
70    else
71    {
72      sc_assert (strcmp(h.name(),"top.m.static_proc") == 0);
73      sc_assert (h.proc_kind()==SC_THREAD_PROC_);
74      sc_assert (h.get_parent_object() == this);
75    }
76    sc_assert (h.terminated()==false);
77    sc_assert (h.get_process_object() != 0);
78  }
79};
80
81struct Top: sc_module
82{
83  M *m;
84  Top(sc_module_name)
85  {
86    m = new M("m");
87  }
88};
89
90int sc_main(int argc, char* argv[])
91{
92  cout << "Should be silent..." << endl;
93  sc_process_handle h;
94  sc_assert (!h.valid());
95  h = sc_get_current_process_handle();
96  sc_assert (!h.valid());
97
98  Top top("top");
99  sc_start();
100
101  cout << endl << "Success" << endl;
102  return 0;
103}
104