-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathtest_member_array_unkwn.cpp
135 lines (103 loc) · 2.72 KB
/
test_member_array_unkwn.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/******************************************************************************
* Copyright (c) 2020, Intel Corporation. All rights reserved.
*
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception.
*
*****************************************************************************/
#include "sct_assert.h"
#include "systemc.h"
using namespace sc_core;
// Record array accessed at unknown index, check tuples removed from state in CPA
class A : public sc_module {
public:
sc_in_clk clk{"clk"};
sc_signal<bool> rst;
sc_signal<sc_uint<4>> sig;
SC_CTOR(A)
{
SC_CTHREAD(loc_rec_array_thread, clk.pos());
async_reset_signal_is(rst, true);
SC_METHOD(loc_rec_array_meth);
sensitive << sig;
SC_METHOD(loc_array_meth);
sensitive << sig;
SC_METHOD(loc_array2d_meth);
sensitive << sig;
}
struct ArrRec {
bool a[3];
sc_uint<4> b[3];
void setA(bool par, int i) {
a[i] = par;
}
bool getA(int i ) {
return a[i];
}
};
struct ArrRecRec {
ArrRec rec;
};
// Unknown index for record array
void loc_rec_array_thread()
{
wait();
while (true)
{
int j = sig.read();
ArrRec xarr[2]; // reg
xarr[1].b[1] = 1;
xarr[1].b[2] = 2;
xarr[j].b[2] = 0;
sct_assert_unknown(xarr[1].b[1]);
sct_assert_unknown(xarr[1].b[2]);
wait();
auto l = xarr[1].b[2];
}
}
sc_signal<int> t0;
void loc_rec_array_meth()
{
int j = sig.read();
ArrRec arr[2];
arr[1].b[1] = 1;
arr[1].b[2] = 2;
arr[j].b[2] = 0;
sct_assert_unknown(arr[1].b[1]);
sct_assert_unknown(arr[1].b[2]);
auto l = arr[1].b[2];
t0 = l;
}
sc_signal<int> t1;
void loc_array_meth()
{
int j = sig.read();
sc_uint<4> arr[2];
arr[0] = 1;
arr[1] = 2;
arr[j] = 0;
sct_assert_unknown(arr[0]);
sct_assert_unknown(arr[1]);
auto l = arr[1];
t1 = l;
}
sc_signal<int> t2;
void loc_array2d_meth()
{
int j = sig.read();
sc_uint<4> arr[2][3];
arr[1][1] = 1;
arr[1][2] = 2;
arr[j][1] = 0;
sct_assert_unknown(arr[1][1]);
sct_assert_unknown(arr[1][2]);
auto l = arr[1][1];
t2 = l;
}
};
int sc_main(int argc, char *argv[]) {
sc_clock clk("clk", 1, SC_NS);
A a{"a"};
a.clk(clk);
sc_start();
return 0;
}