1/*****************************************************************************
2
3  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4  more contributor license agreements.  See the NOTICE file distributed
5  with this work for additional information regarding copyright ownership.
6  Accellera licenses this file to you under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with the
8  License.  You may obtain a copy of the License at
9
10    http://www.apache.org/licenses/LICENSE-2.0
11
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  implied.  See the License for the specific language governing
16  permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22  stab3.cpp --
23
24  Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
25
26 *****************************************************************************/
27
28/*****************************************************************************
29
30  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
31  changes you are making here.
32
33      Name, Affiliation, Date:
34  Description of Modification:
35
36 *****************************************************************************/
37
38#include "systemc.h"
39
40int
41sc_main( int argc, char* argv[] )
42{
43    int i;
44    sc_bv<325> x;
45    sc_lv<142> y;
46
47    sc_signed z(103);
48    sc_unsigned w(291);
49
50    for (i = 0; i < 325; ++i) {
51        x[i] = ((i & 1) ^ ((i >> 1) & 1));
52    };
53    for (i = 0; i < 325; ++i) {
54        sc_assert( x[i] == ((i & 1) ^ ((i >> 1) & 1)) );
55    };
56    for (i = 0; i < 142; ++i) {
57        y[i] = ((i & 1) ^ ((i >> 2) & 1));
58    }
59    for (i = 0; i < 142; ++i) {
60        // sc_assert( y[i] == char((i & 1) ^ ((i >> 2) & 1)) );
61        sc_assert( y[i] == ((i & 1) ^ ((i >> 2) & 1)) );
62    }
63    for (i = 0; i < 103; ++i) {
64        z[i] = (((i >> 2) & 1) ^ ((i >> 1) & 1));
65    }
66    for (i = 0; i < 103; ++i) {
67        sc_assert( (bool) z[i] == (((i >> 2) & 1) ^ ((i >> 1) & 1)) );
68    }
69    for (i = 0; i < 291; ++i) {
70        w[i] = (((i >> 3) & 1) ^ ((i >> 1) & 1));
71    }
72    for (i = 0; i < 291; ++i) {
73        sc_assert( (bool) (w[i] == (((i >> 3) & 1) ^ ((i >> 1) & 1))) );
74    }
75
76    cout << x << endl;
77    cout << x.to_string() << endl;
78    cout << y << endl;
79    cout << y.to_string() << endl;
80    cout << z << endl;
81    cout << w << endl;
82
83    for (int k = 0; k < 10; ++k) {
84        cerr << "k = " << k << endl;
85
86        for (i = 0; i < 100; ++i) {
87            int j;
88
89            if (k == 0) {
90                cout << "i = " << i << endl;
91                cout << x.range(i + 224, i) << endl;
92                cout << x.range(i + 224, i).to_string() << endl;
93                cout << y.range(i + 41, i) << endl;
94                cout << y.range(i + 41, i).to_string() << endl;
95                cout << sc_signed(z.range(i + 2, i)) << endl;
96                cout << sc_unsigned(w.range(i + 190, i)) << endl;
97                cout << x.range(i, i + 224) << endl;
98                cout << x.range(i, i + 224).to_string() << endl;
99                cout << y.range(i, i + 41) << endl;
100                cout << y.range(i, i + 41).to_string() << endl;
101                cout << sc_signed(z.range(i, i + 2)) << endl;
102                cout << sc_unsigned(w.range(i, i + 190)) << endl;
103            } else {
104                (void) x.range(i + 224, i);
105                (void) y.range(i + 41, i);
106                (void) sc_signed(z.range(i + 2, i));
107                (void) sc_unsigned(w.range(i + 190, i));
108            }
109
110            sc_bv<225> foo;
111            sc_bv<225> foo1;
112            sc_bv<450> foo2;
113            foo = x.range(i + 224, i);
114            foo1 = x.range(i, i + 224);
115            foo2 = (foo1, foo);
116            for (j = 0; j < 225; ++j) {
117                sc_assert( foo[j] == x[i + j] );
118                sc_assert( foo1[224 - j] == x[i + j] );
119                sc_assert( foo2.range(449,225) == foo1 );
120                sc_assert( foo2.range(224,0) == foo );
121            }
122            // (foo, foo1) = (foo1, foo);
123            (foo, foo1) = foo2;
124            for (j = 0; j < 225; ++j) {
125                sc_assert( foo1[j] == x[i + j] );
126                sc_assert( foo[224 - j] == x[i + j] );
127                sc_assert( foo2.range(449,225) == foo );
128                sc_assert( foo2.range(224,0) == foo1 );
129            }
130
131            sc_bv<230> foo3;
132            foo3 = (foo1, "01101");
133            sc_assert( foo3.range(4,0) == "01101" );
134            foo3.range(3,1) = "011";
135            sc_assert( foo3.range(4,0) == "00111" );
136            for (j = 0; j < 225; ++j) {
137                sc_assert(foo3[j + 5] == foo1[j]);
138            }
139            if (k == 0) {
140                cout << foo3 << endl;
141            }
142            foo3 = ("10100", foo);
143            sc_assert( foo3.range(229,225) == "10100" );
144            foo3.range(228,226) = "111";
145            sc_assert( foo3.range(229,225) == "11110" );
146            for (j = 0; j < 225; ++j) {
147                sc_assert(foo3[j] == foo[j]);
148            }
149            if (k == 0) {
150                cout << foo3 << endl;
151            }
152            foo3 = ("110", foo3.range(229,5), "01");
153            sc_assert( foo3.range(229,227) == "110" );
154            sc_assert( foo3.range(1,0) == "01" );
155
156            sc_lv<42> bar;
157            sc_lv<42> bar1;
158            sc_lv<84> bar2;
159            bar = y.range(i + 41, i);
160            bar1 = y.range(i, i + 41);
161            bar2 = (bar1, bar);
162            for (j = 0; j < 42; ++j) {
163                sc_assert( bar[j] == y[i + j] );
164                sc_assert( bar1[41 - j] == y[i + j] );
165                sc_assert( bar2.range(83,42) == bar1 );
166                sc_assert( bar2.range(41,0) == bar );
167            }
168            // (bar, bar1) = (bar1, bar);
169            (bar, bar1) = bar2;
170            for (j = 0; j < 42; ++j) {
171                sc_assert( bar1[j] == y[i + j] );
172                sc_assert( bar[41 - j] == y[i + j] );
173                sc_assert( bar2.range(83,42) == bar );
174                sc_assert( bar2.range(41,0) == bar1 );
175            }
176
177            sc_bv<47> bar3;
178            bar3 = (bar1, "01101");
179            sc_assert( bar3.range(4,0) == "01101" );
180            bar3.range(3,1) = "011";
181            sc_assert( bar3.range(4,0) == "00111" );
182            for (j = 0; j < 42; ++j) {
183                sc_assert(bar3[j + 5] == bar1[j]);
184            }
185            if (k == 0) {
186                cout << bar3 << endl;
187            }
188            bar3 = ("10100", bar);
189            sc_assert( bar3.range(46,42) == "10100" );
190            bar3.range(45,43) = "111";
191            sc_assert( bar3.range(46,42) == "11110" );
192            for (j = 0; j < 42; ++j) {
193                sc_assert(bar3[j] == bar[j]);
194            }
195            if (k == 0) {
196                cout << bar3 << endl;
197            }
198            bar3 = ("101", bar3.range(46,5), "10");
199            sc_assert( bar3.range(46,44) == "101" );
200            sc_assert( bar3.range(1,0) == "10" );
201
202
203            sc_signed baz(3);
204            sc_signed baz1(3);
205            baz = z.range(i + 2, i);
206            baz1 = z.range(i, i + 2);
207            for (j = 0; j < 3; ++j) {
208                sc_assert( baz[j] == z[i + j] );
209                sc_assert( baz1[2 - j] == z[i + j] );
210            }
211
212            sc_unsigned quux(191);
213            sc_unsigned quux1(191);
214            quux = w.range(i + 190, i);
215            quux1 = w.range(i, i + 190);
216            for (j = 0; j < 191; ++j) {
217                sc_assert( quux[j] == w[i + j] );
218                sc_assert( quux1[190 - j] == w[i + j] );
219            }
220        }
221    }
222    return 0;
223}
224