source: branches/with_autoconf/test_regression/19122005/system3.cpp @ 23

Last change on this file since 23 was 1, checked in by buchmann, 17 years ago

Initial import from CVS repository

File size: 2.8 KB
Line 
1#include <systemc.h>
2
3#define ASSERT(x) \
4  { errnum++; \
5    if (!(x)) \
6    { \
7    cerr << "ASSERT : " #x "\n"; \
8    exit (errnum); \
9    } \
10  }
11
12using namespace std;
13
14struct inner : sc_module {
15        sc_in_clk       clk;
16  sc_in<int>      i1;
17  int reg;
18
19  void save_state (FILE *fic)
20  {
21    cerr << "saving " << name () << "\n";
22    fprintf (fic, "%d\n", reg);
23  }
24
25  void restore_state (FILE *fic)
26  {
27    cerr << "restoring " << name () << "\n";
28    int i;
29    fscanf (fic, "%d\n", &i);
30    reg = i;
31  }
32
33  void trans ()
34  {
35    reg = i1.read();
36  }
37
38  SC_HAS_PROCESS(inner);
39        inner (sc_module_name n) : sc_module (n),
40    clk("clk"),
41    i1("i1")
42  {
43                SC_METHOD(trans);
44                sensitive << clk.pos();
45    dont_initialize();
46#ifdef SYSTEMCASS_SPECIFIC
47    SAVE_HANDLER(save_state);
48#endif
49        };
50};
51
52struct test : sc_module {
53        sc_in_clk       clk;
54        sc_in<bool>     i1;
55        sc_in<int>      i2;
56        sc_in<int>      i3;
57  inner           inner1;
58
59  int  tab[16];
60  bool b;
61
62  void trans ()
63  {
64    b = i1.read() ^ b;
65    tab[i3.read() % 16] = i2;
66  }
67
68  void save_state (FILE *fic)
69  {
70    cerr << "saving " << name () << "\n";
71    fprintf (fic, "%c\n", ((b)?'1':'0'));
72    int i;
73    for (i = 0; i < 16; ++i)
74    {
75      fprintf (fic, "%d\n", tab[i]);
76    }
77  }
78
79  void restore_state (FILE *fic)
80  {
81    cerr << "restoring " << name () << "\n";
82    int j;
83    fscanf (fic, "%d\n", &j);
84    b = (j > 0);
85    int i;
86    for (i = 0; i < 16; ++i)
87    {
88      fscanf (fic, "%d\n", &j);
89      tab[i] = j;
90    }
91  }
92
93  SC_HAS_PROCESS(test);
94        test (sc_module_name n) : sc_module (n),
95    clk("clk"),
96    i1("i1"), i2("i2"), i3("i3"),
97    inner1 ("inner1")
98  {
99                SC_METHOD(trans);
100                sensitive << clk.pos();
101    dont_initialize();
102#ifdef SYSTEMCASS_SPECIFIC
103    SAVE_HANDLER(save_state);
104#endif
105        };
106};
107
108int
109usage (const char *com)
110{
111  cout << "Usage :\n" << com << " [#cycles]\n";
112  return EXIT_FAILURE;
113}
114
115sc_signal<bool>              s01 ("bool");
116sc_signal<int>               s02 ("tab_index"),
117                             s03 ("value_to_write_in_tab");
118
119void*
120func ()
121{
122  cerr << "func () at #" << sc_time_stamp () << endl;
123  int i = (int)(sc_time_stamp ().to_double ()) / 1000;
124  s01  = (i & 1) > 0;
125  s02  = (i + (i << 1)) << 6;
126  s03  = i;
127  ++i;
128  return 0;
129}
130
131int sc_main (int argc, char *argv[])
132{
133  int errnum = 0;
134        sc_clock                     signal_clk("my_clock",1, 0.5);
135
136  test test1("test1");
137  test1.clk (signal_clk);
138  test1.i1 (s01);
139  test1.i2 (s02);
140  test1.i3 (s03);
141  test1.inner1.clk (signal_clk);
142  test1.inner1.i1 (s02);
143
144        // Init & run
145        sc_start (0);
146
147#ifndef SOCVIEW
148  if (argc != 2)
149  {
150    return usage (argv[0]);
151  }
152
153        int nb = atoi(argv[1]);
154
155  if (nb == 0)
156  {
157    return usage (argv[0]);
158  } 
159
160  int i = 0;
161  while (i++ < nb)
162  {
163    func ();
164    sc_start (1);
165  }
166#else
167  debug(&func); 
168#endif
169
170        return EXIT_SUCCESS;
171}
172
Note: See TracBrowser for help on using the repository browser.