std_ulogic_vector_datatype.cpp revision 12855:588919e0e4aa
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  std_ulogic_vector_datatype.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/* Main file for "std_ulogic_vector" data type */
39
40#include "systemc.h"
41
42typedef sc_logic std_ulogic;
43
44#define std_ulogic_vector sc_lv
45#define bool_vector       sc_bv
46
47int sc_main(int ac, char *av[])
48{
49
50// 0. SIZE OF TYPES
51  int 		integer;
52  short		short_integer;
53  long		long_integer;
54  unsigned long	unsigned_long;
55  signed long	signed_long;
56
57  cout << "\nINTEGER SIZE \t\t= " 	<< sizeof integer	<< " bytes"
58       << "\nSHORT INTEGER SIZE \t= " 	<< sizeof short_integer	<< " bytes"
59       << "\nLONG INTEGER SIZE \t= " 	<< sizeof long_integer	<< " bytes"
60       << "\nUNSIGNED LONG SIZE \t= " 	<< sizeof unsigned_long	<< " bytes"
61       << "\nSIGNED LONG SIZE \t= " 	<< sizeof signed_long	<< " bytes"
62       << "\n" << endl;
63
64// 1. DECLARATION SYNTAX
65  std_ulogic_vector<9>		a;
66  std_ulogic_vector<9>		b;
67  std_ulogic_vector<68>		big;
68  std_ulogic_vector<1284>	huge_;
69
70// 2. TYPE CONVERSION
71
72  // std_ulogic_vector <- C++ string
73  a = "01XZUWLH-";
74  b = "ZZ1XX0UU1WWW";
75  big = "11110000111100001111000011110000111100001111000011110000111100001111";
76  huge_ = "111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111";
77
78  cout 	<< "std_ulogic_vector \t<=\t C++ string"
79	<< "\n-------------------------------------------"
80	<< "\nA = " << a << "\t\t \"01XZUWLH-\" "
81	<< "\nB = " << b << "\t\t \"ZZ1XX0UU1WWW\" "
82	<< "\nBIG  = " << big << "\n      "
83  <<"\"11110000111100001111000011110000111100001111000011110000111100001111\""
84	<< "\nHUGE = " << huge_.range(0,63) << "\n       "
85		       << huge_.range(64,127) << "\n       "
86		       << huge_.range(128,191) << "\n       "
87		       << huge_.range(192,255) << "\n       "
88		       << huge_.range(256,319) << "\n       "
89		       << huge_.range(320,383) << "\n       "
90		       << huge_.range(384,447) << "\n       "
91		       << huge_.range(448,511) << "\n       "
92		       << huge_.range(512,575) << "\n       "
93		       << huge_.range(576,639) << "\n       "
94		       << huge_.range(640,703) << "\n       "
95		       << huge_.range(704,767) << "\n       "
96		       << huge_.range(768,831) << "\n       "
97		       << huge_.range(832,895) << "\n       "
98		       << huge_.range(896,959) << "\n       "
99		       << huge_.range(960,1023) << "\n       "
100		       << huge_.range(1024,1087) << "\n       "
101		       << huge_.range(1088,1151) << "\n       "
102		       << huge_.range(1152,1215) << "\n       "
103		       << huge_.range(1216,1279) << "\n       "
104		       << huge_.range(1280,1283)
105	<< "\n" << endl;
106
107  // std_ulogic_vector <- std_ulogic_vector
108  std_ulogic_vector<9>	c;
109  std_ulogic_vector<68>	big2;
110
111  c = b;
112  big2 = big;
113
114  cout 	<< "std_ulogic_vector \t<=\t std_ulogic_vector"
115	<< "\n--------------------------------------------------"
116	<< "\nC = " << c << "\t\t ZZ1XX0XX1XXX"
117	<< "\nBIG2 = " << big2 << "\n      "
118  <<"\"11110000111100001111000011110000111100001111000011110000111100001111\""
119	<< "\n" << endl;
120
121  // std_ulogic_vector <- C++ array of std_ulogic
122  std_ulogic_vector<9>	d;
123  std_ulogic_vector<9>	e;
124  std_ulogic_vector<68>	big3;
125  std_ulogic	cb1[9]  = { sc_logic( 'U' ), sc_logic( 0 )  , sc_logic( 1 ),
126                            sc_logic( 'X' ), sc_logic( 'Z' ), sc_logic( 'W' ),
127                            sc_logic( 'H' ), sc_logic( 'L' ), sc_logic( '-' ) };
128  std_ulogic	cb2[12] = { sc_logic( 'U' ), sc_logic( 'U' ), sc_logic( 'X' ),
129                            sc_logic( 'X' ), sc_logic( 1 )  , sc_logic( 1 ),
130                            sc_logic( 0 )  , sc_logic( 0 )  , sc_logic( 1 ),
131                            sc_logic( 1 )  , sc_logic( 'X' ), sc_logic( 'X' ) };
132  std_ulogic	cb3[80] = { sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
133                            sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
134                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
135                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
136                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
137                            sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
138                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
139                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
140                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
141                            sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
142                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
143                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
144                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
145                            sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
146                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
147                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
148                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
149                            sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
150                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
151                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
152                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
153                            sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
154                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
155                            sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
156                            sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
157                            sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
158                            sc_logic( 0 ), sc_logic( 0 ) };
159
160  d = cb1;
161  e = cb2;
162  big3 = cb3;
163
164  cout 	<< "std_ulogic_vector \t<=\t C++ array of bool"
165	<< "\n--------------------------------------------------"
166        << "\nD = " << d << "\t\t -, L, H, W, Z, X, 1, 0, U"
167        << "\nE = " << e << "\t\t X, X, 1, 1, 0, 0, 1, 1, X, X, U, U"
168	<< "\nBIG3 = " << big3 << "\n      "
169    <<"\"11110000111100001111000011110000111100001111000011110000111100001111"
170  	<<"\n       000011110000\""
171	<< "\n" << endl;
172
173  // std_ulogic_vector <- bool_vector
174  std_ulogic_vector<4>	f;
175  bool_vector<4>	sv1;
176
177  sv1 = "1010";
178
179  f = sv1;
180
181  cout 	<< "std_ulogic_vector \t<=\t bool_vector"
182	<< "\n--------------------------------------------"
183	<< "\nF = " << f << "\t\t \"1010\" "
184	<< "\n" << endl;
185
186  // std_ulogic_vector <- unsigned long
187  std_ulogic_vector<4>	h;
188  std_ulogic_vector<32>	i;
189  std_ulogic_vector<40>	j;
190  unsigned long		ul1 = 137; 	// ...10001001
191  unsigned long		ul2 = 137; 	// ...10001001
192  unsigned long		ul3 = 137; 	// ...10001001
193
194  h = ul1;
195  i = ul2;
196  j = ul3;
197
198  cout 	<< "std_ulogic_vector \t<=\t unsigned long"
199	<< "\n----------------------------------------------"
200	<< "\nH = " << h << "\t\t\t\t\t ...10001001 (137)"
201	<< "\nI = " << i << "\t\t ...10001001 (137)"
202	<< "\nJ = " << j << "\t ...10001001 (137)"
203	<< "\n" << endl;
204
205  // std_ulogic_vector <- sc_unsigned
206  std_ulogic_vector<4>	k;
207  std_ulogic_vector<4>	l;
208  std_ulogic_vector<4>	m;
209  sc_biguint<2>		scu1;
210  sc_biguint<4>		scu2;
211  sc_biguint<8>		scu3;
212
213  scu1 = 3;	// .........11
214  scu2 = 13; 	// .......1101
215  scu3 = 137; 	// ...10001001
216
217  k = scu1;
218  l = scu2;
219  m = scu3;
220
221  cout 	<< "std_ulogic_vector \t<=\t sc_unsigned"
222	<< "\n--------------------------------------------"
223	<< "\nK = " << k << "\t\t       11 (3)"
224	<< "\nL = " << l << "\t\t     1101 (13)"
225	<< "\nM = " << m << "\t\t 10001001 (137)"
226	<< "\n" << endl;
227
228  // std_ulogic_vector <- signed long
229  std_ulogic_vector<5>	n;
230  std_ulogic_vector<32>	o;
231  std_ulogic_vector<40>	p;
232  std_ulogic_vector<5> 	q;
233  std_ulogic_vector<32>	r;
234  std_ulogic_vector<40>	s;
235  signed long		sl1 = 137;      // ...010001001
236  signed long		sl2 = 137;      // ...010001001
237  signed long		sl3 = 137;      // ...010001001
238  signed long		sl4 = -137;     // ...101110111
239  signed long		sl5 = -137;     // ...101110111
240  signed long		sl6 = -137;     // ...101110111
241
242  n = sl1;
243  o = sl2;
244  p = sl3;
245  q = sl4;
246  r = sl5;
247  s = sl6;
248
249  cout  << "std_ulogic_vector \t<=\t signed long"
250        << "\n--------------------------------------------"
251        << "\nN = " << n << "\t\t\t\t\t ...010001001 (137)"
252        << "\nO = " << o << "\t\t ...010001001 (137)"
253        << "\nP = " << p << "\t ...010001001 (137)"
254        << "\nQ = " << q << "\t\t\t\t\t ...101110111 (-137)"
255        << "\nR = " << r << "\t\t ...101110111 (-137)"
256        << "\nS = " << s << "\t ...101110111 (-137)"
257        << "\n" << endl;
258
259  // std_ulogic_vector <- sc_signed
260  std_ulogic_vector<5>   t;
261  std_ulogic_vector<5>   u;
262  std_ulogic_vector<5>   v;
263  std_ulogic_vector<5>   w;
264  std_ulogic_vector<5>   x;
265  std_ulogic_vector<5>   y;
266  sc_bigint<3>   scs1;
267  sc_bigint<5>   scs2;
268  sc_bigint<9>   scs3;
269  sc_bigint<3>   scs4;
270  sc_bigint<5>   scs5;
271  sc_bigint<9>   scs6;
272
273  scs1 = 3;     // ........011
274  scs2 = 13;    // ......01101
275  scs3 = 137;   // ..010001001
276  scs4 = -3;    // ........101
277  scs5 = -13;   // ......10011
278  scs6 = -137;  // ..101110111
279
280  t = scs1;
281  u = scs2;
282  v = scs3;
283  w = scs4;
284  x = scs5;
285  y = scs6;
286
287  cout  << "std_ulogic_vector \t<=\t sc_signed"
288        << "\n------------------------------------------"
289        << "\nT = " << t << "\t\t       011 (3)"
290        << "\nU = " << u << "\t\t     01101 (13)"
291        << "\nV = " << v << "\t\t 010001001 (137)"
292        << "\nW = " << w << "\t\t       101 (-3)"
293        << "\nX = " << x << "\t\t     10011 (-13)"
294        << "\nY = " << y << "\t\t 101110111 (-137)"
295        << "\n" << endl;
296
297  // std_ulogic_vector	.to_uint()
298  std_ulogic_vector<4> 	tu1;
299  std_ulogic_vector<32>	tu2;
300  std_ulogic_vector<40>	tu3;
301  std_ulogic_vector<4> 	tu4;
302  sc_biguint<2>		tu5;
303  sc_biguint<4>   	tu6;
304  sc_biguint<8>   	tu7;
305
306  tu1 =                                     "1001";	// 9
307  tu2 =         "10000000000000000000000000000001"; 	// 2147483649
308  tu3 = "0000000110000000000000000000000000000001"; 	// 6442450945
309  tu4 = "1101";
310  tu5 = tu4.to_uint();
311  tu6 = tu4.to_uint();
312  tu7 = tu4.to_uint();
313
314  cout  << "std_ulogic_vector \t\t<=\t\t to_uint()"
315        << "\n-----------------------------------------------------------------"
316        << "\nTU1 = \t\t\t\t          " << tu1 << "\t " << tu1.to_uint()
317        << "\nTU2 =         " << tu2 << "\t " << tu2.to_uint()
318        << "\nTU3 = " << tu3 << "\t " << tu3.to_uint()
319        << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu5 << "\t      ("
320	   << tu5[1] << tu5[0] << ")"
321        << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu6 << "\t    ("
322	   << tu6[3] << tu6[2] << tu6[1] << tu6[0] << ")"
323        << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu7 << "\t("
324	   << tu7[7] << tu7[6] << tu7[5] << tu7[4]
325	   << tu7[3] << tu7[2] << tu7[1] << tu7[0] << ")"
326      	<< "\n" << endl;
327
328  // std_ulogic_vector	.to_int()
329  std_ulogic_vector<4> 	ts1;
330  std_ulogic_vector<32>	ts2;
331  std_ulogic_vector<40>	ts3;
332  std_ulogic_vector<5> 	ts4;
333  sc_bigint<3>	ts5;
334  sc_bigint<5> 	ts6;
335  sc_bigint<9> 	ts7;
336
337  ts1 =                                     "1001";     // -7
338  ts2 =         "11111111111111111111101111111001";     // -1031
339  ts3 = "0000000111111111111111111111101111111001";     // 8589933561
340  ts4 = "11001";
341  ts5 = ts4.to_int();
342  ts6 = ts4.to_int();
343  ts7 = ts4.to_int();
344
345  cout  << "std_ulogic_vector \t\t<=\t\t to_int()"
346        << "\n-----------------------------------------------------------------"
347        << "\nTS1 = \t\t\t\t          " << ts1 << "\t " << ts1.to_int()
348        << "\nTS2 =         " << ts2 << "\t " << ts2.to_int()
349        << "\nTS3 = " << ts3 << "\t " << ts3.to_int()
350        << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts5 << "\t      ("
351           << ts5[2] << ts5[1] << ts5[0] << ")"
352        << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts6 << "\t    ("
353           << ts6[4] << ts6[3] << ts6[2] << ts6[1] << ts6[0] << ")"
354        << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts7 << "\t("
355           << ts7[8] << ts7[7] << ts7[6] << ts7[5]
356           << ts7[4] << ts7[3] << ts7[2] << ts7[1] << ts7[0] << ")"
357        << "\n" << endl;
358
359  // std_ulogic_vector       Typecasted to sc_unsigned
360  std_ulogic_vector<4> 	tcu1;
361  sc_biguint<2>   	tcu2;
362  sc_biguint<4>   	tcu3;
363  sc_biguint<8>   	tcu4;
364
365  tcu1 = "1101";
366  tcu2 = tcu1;
367  tcu3 = tcu1;
368  tcu4 = tcu1;
369
370  cout  << "std_ulogic_vector \t\t<=\t\t Typecast sc_unsigned"
371        << "\n-----------------------------------------------------------------"
372        << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu2 << "\t      ("
373           << tcu2[1] << tcu2[0] << ")"
374        << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu3 << "\t    ("
375           << tcu3[3] << tcu3[2] << tcu3[1] << tcu3[0] << ")"
376        << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu4 << "\t("
377           << tcu4[7] << tcu4[6] << tcu4[5] << tcu4[4]
378           << tcu4[3] << tcu4[2] << tcu4[1] << tcu4[0] << ")"
379        << "\n" << endl;
380
381  // std_ulogic_vector       Typecasted to sc_signed
382  std_ulogic_vector<5> 	tcs1;
383  sc_bigint<3> 		tcs2;
384  sc_bigint<5> 		tcs3;
385  sc_bigint<9> 		tcs4;
386
387  tcs1 = "11001";
388  tcs2 = sc_bigint<3>(tcs1);
389  tcs3 = sc_bigint<5>(tcs1);
390  tcs4 = sc_bigint<9>(tcs1);
391
392  cout  << "std_ulogic_vector \t\t<=\t\t Typecast sc_signed"
393        << "\n-----------------------------------------------------------------"
394        << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs2 << "\t      ("
395           << tcs2[2] << tcs2[1] << tcs2[0] << ")"
396        << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs3 << "\t    ("
397           << tcs3[4] << tcs3[3] << tcs3[2] << tcs3[1] << tcs3[0] << ")"
398        << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs4 << "\t("
399           << tcs4[8] << tcs4[7] << tcs4[6] << tcs4[5]
400           << tcs4[4] << tcs4[3] << tcs4[2] << tcs4[1] << tcs4[0] << ")"
401        << "\n" << endl;
402
403  // std_ulogic_vector     .to_string()
404  std_ulogic_vector<9>	tstr;
405  std::string           str;
406
407  tstr = "UXZ01WLH-";
408  str  = tstr.to_string();
409
410  cout  << "std_ulogic_vector \t<=\t to_string()"
411        << "\n--------------------------------------------"
412        << "\nTSTR = " << tstr << " \t\t " << str
413        << endl;
414
415
416// 3. OPERATORS
417//    Supported operators:      ~ & ^ | &= ^= |= = [] range()
418//				and_reduce() or_reduce() xor_reduce()
419  std_ulogic_vector<4>	ra;
420  std_ulogic_vector<4>	rb;
421  std_ulogic_vector<4>	rc;
422  std_ulogic_vector<9>	rd;
423  std_ulogic_vector<4>	re;
424  std_ulogic_vector<4>	rf;
425  std_ulogic_vector<4>	rg;
426  std_ulogic_vector<9>	rh;
427  std_ulogic_vector<4>	ri;
428  std_ulogic_vector<4>	rj;
429  std_ulogic_vector<4>	rl;
430
431  std_ulogic_vector<4>	rdata4;
432  std_ulogic_vector<9>	rdata9;
433
434  rdata4 = "1000";
435  rdata9 = "UXZ01WHL-";
436
437  ra.range(0,3) = rdata4;
438  rb.range(3,0) = rdata4;
439  ( rc.range(1,3), rc.range(0,0) ) = rdata4;
440  ( rd.range(8,6), rd.range(5,0) ) = rdata9;
441  re = "1111";
442  re.range(2,2) = std_ulogic_vector<1>( rdata4[1] );
443
444  rf = rdata4.range(0,3);
445  rg = rdata4.range(3,0);
446  rh = ( rdata9.range(8,6), rdata9.range(5,0) );
447  ri = ( rdata4.range(0,1), rdata4.range(2,3) );
448  rj = "1111";
449  rj[1] = rdata4.range(2,2)[0];
450  rl = ( rdata4.range(1,1), rdata4.range(3,3),
451        rdata4.range(0,0), rdata4.range(2,2) );
452
453  cout.precision(15);
454  cout  << "\nrange() tests"
455        << "\n-----------------------------------------------------------------"
456        << "\nINITIAL 4-BIT \t" << rdata4
457        << "\nINITIAL 9-BIT \t" << rdata9 << "\n"
458        << "\nLVALUE RISE \t"
459                << ra[0] << "\t" << ra[1] << "\t" << ra[2] << "\t" << ra[3]
460        << "\nLVALUE FALL \t"
461                << rb[0] << "\t" << rb[1] << "\t" << rb[2] << "\t" << rb[3]
462        << "\nLVALUE SUB RISE "
463                << rc[0] << "\t" << rc[1] << "\t" << rc[2] << "\t" << rc[3]
464        << "\nLVALUE SUB FALL "
465                << rd[0] << "\t" << rd[1] << "\t" << rd[2] << "\t"
466                << rd[3] << "\t" << rd[4] << "\t" << rd[5] << "\t"
467                << rd[6] << "\t" << rd[7] << "\t" << rd[8]
468        << "\nLVALUE BIT \t"
469                << re[0] << "\t" << re[1] << "\t" << re[2] << "\t" << re[3]
470        << "\n\nRVALUE RISE \t"
471                << rf[0] << "\t" << rf[1] << "\t" << rf[2] << "\t" << rf[3]
472        << "\nRVALUE FALL \t"
473                << rg[0] << "\t" << rg[1] << "\t" << rg[2] << "\t" << rg[3]
474        << "\nRVALUE SUB FALL "
475                << rh[0] << "\t" << rh[1] << "\t" << rh[2] << "\t"
476                << rh[3] << "\t" << rh[4] << "\t" << rh[5] << "\t"
477                << rh[6] << "\t" << rh[7] << "\t" << rh[8]
478        << "\nRVALUE SUB RISE "
479                << ri[0] << "\t" << ri[1] << "\t" << ri[2] << "\t" << ri[3]
480        << "\nRVALUE BIT [] \t"
481                << rj[0] << "\t" << rj[1] << "\t" << rj[2] << "\t" << rj[3]
482        << "\nRVALUE BIT \t"
483                << rl[0] << "\t" << rl[1] << "\t" << rl[2] << "\t" << rl[3]
484        << endl;
485
486#define VAL1	"1010"
487#define VAL2	"1000"
488#define VAL3	"111011"
489
490  std_ulogic_vector<4> 	op1;
491  op1 = VAL1;
492  std_ulogic_vector<4>	op2;
493  op2 = VAL2;
494  std_ulogic_vector<4> 	r1, r2, r3, r4, r5, r6, r7, r8;
495  std_ulogic_vector<4> 	r9,  r10, r11, r12, r13, r14;
496  std_ulogic_vector<4>	r15, r16, r17, r18, r19;
497  std_ulogic_vector<4> 	r20, r21, r22, r23, r24;
498  std_ulogic_vector<4>	r25, r26, r27, r28, r29;
499  std_ulogic_vector<4>	r30, r31, r32, r33, r34, r35;
500  std_ulogic_vector<4>	r36, r37, r38, r39, r40, r41;
501  std_ulogic 		r42, r43, r44;
502
503//  r1 = op1 * op2;			// Multiplication
504
505//  r2 = op1 / op2;			// Division
506
507//  r3 = op1 % op2;			// Modulus
508
509//  r4 = op1 + op2;			// Addition
510
511//  r5 = op1 - op2;			// Subtraction
512
513//  r6 = !op1;				// Logical NOT
514
515//  r7 = op1 && op2;			// Logical AND
516
517//  r8 = op1 || op2;			// Logical OR
518
519//  r9 = op1 < op2;			// Less than
520
521//  r10 = op1 <= op2;			// Less than or equal
522
523//  r11 = op1 > op2;			// Greater than
524
525//  r12 = op1 >= op2;			// Greater than or equal
526
527//  r13 = op1 += op2;			// Compound addition
528//    op1 = VAL1; op2 = VAL2;
529
530//  r14 = op1 -= op2;			// Compound subtraction
531//    op1 = VAL1; op2 = VAL2;
532
533//  r15 = op1 *= op2;			// Compound multiplication
534//    op1 = VAL1; op2 = VAL2;
535
536//  r16 = op1 /= op2;			// Compound division
537//    op1 = VAL1; op2 = VAL2;
538
539//  r17 = op1 %= op2;			// Compound modulus
540//    op1 = VAL1; op2 = VAL2;
541
542//  r18 = op1 <<= op2;			// Compound shift left
543//    op1 = VAL1; op2 = VAL2;
544
545//  r19 = op1 >>= op2;			// Compound shift right
546//    op1 = VAL1; op2 = VAL2;
547
548  r20 = op1 &= op2;			// Compound bitwise AND
549    op1 = VAL1; op2 = VAL2;
550  r36 = op1 &= VAL3;
551    op1 = VAL1;
552
553  r21 = op1 ^= op2;			// Compound bitwise XOR
554    op1 = VAL1; op2 = VAL2;
555  r37 = op1 ^= VAL3;
556    op1 = VAL1;
557
558  r22 = op1 |= op2;			// Compound bitwise OR
559    op1 = VAL1; op2 = VAL2;
560  r38 = op1 |= VAL3;
561    op1 = VAL1;
562
563//  r23 = op2++;				// Postfix increment
564//    op1 = VAL1; op2 = VAL2;
565
566//  r24 = ++op2;				// Prefix increment
567//    op1 = VAL1; op2 = VAL2;
568
569//  r25 = op2--;				// Postfix decrement
570//    op1 = VAL1; op2 = VAL2;
571
572//  r26 = --op2;				// Prefix decrement
573//    op1 = VAL1; op2 = VAL2;
574
575//  r27 = (op1 > op2) ? true : false;	// Arithmetic if
576//  r28 = (op1 < op2) ? true : false;	// Arithmetic if
577
578//  r29 = op1, r29 = op2;		 	// Comma
579
580  r30 = ~op1;				// Bitwise NOT
581
582//  r31 = op1 << op2;			// Left shift
583//    op1 = VAL1; op2 = VAL2;
584
585//  r32 = op1 >> op2;			// Right shift
586//    op1 = VAL1; op2 = VAL2;
587
588  r33 = op1 & op2;			// Bitwise AND
589  r39 = op1 & VAL3;
590
591  r34 = op1 ^ op2;			// Bitwise XOR
592  r40 = op1 ^ VAL3;
593
594  r35 = op1 | op2;			// Bitwise OR
595  r41 = op1 | VAL3;
596
597  r42 = and_reduce(op1);		// AND reduction
598
599  r43 = or_reduce(op1);			// OR reduction
600
601  r44 = xor_reduce(op1);		// XOR reduction
602
603cout << "\nop1\t operator\t op2\t result  [All operands are std_ulogic_vector]"
604	<< "\n----------------------------------------------------------------"
605// 	<< "\n" << op1 << "\t    * \t\t " << op2 << "\t = " << r1
606// 	<< "\n" << op1 << "\t    / \t\t " << op2 << "\t = " << r2
607// 	<< "\n" << op1 << "\t    % \t\t " << op2 << "\t = " << r3
608// 	<< "\n" << op1 << "\t    + \t\t " << op2 << "\t = " << r4
609// 	<< "\n" << op1 << "\t    - \t\t " << op2 << "\t = " << r5
610//  	<< "\n!(" << op1 << ") \t\t\t\t = " << r6
611//  	<< "\n" << op1 << "\t    && \t\t " << op2 << "\t = " << r7
612//  	<< "\n" << op1 << "\t    || \t\t " << op2 << "\t = " << r8
613//  	<< "\n" << op1 << "\t    < \t\t "  << op2 << "\t = " << r9
614//  	<< "\n" << op1 << "\t    <= \t\t " << op2 << "\t = " << r10
615//  	<< "\n" << op1 << "\t    > \t\t "  << op2 << "\t = " << r11
616//  	<< "\n" << op1 << "\t    >= \t\t " << op2 << "\t = " << r12
617//  	<< "\n" << op1 << "\t    += \t\t " << op2 << "\t = " << r13
618//  	<< "\n" << op1 << "\t    -= \t\t " << op2 << "\t = " << r14
619//  	<< "\n" << op1 << "\t    *= \t\t " << op2 << "\t = " << r15
620//  	<< "\n" << op1 << "\t    /= \t\t " << op2 << "\t = " << r16
621//  	<< "\n" << op1 << "\t    %= \t\t " << op2 << "\t = " << r17
622//  	<< "\n" << op1 << "\t    <<=\t\t " << op2 << "\t = " << r18
623//  	<< "\n" << op1 << "\t    >>=\t\t " << op2 << "\t = " << r19
624  	<< "\n" << op1 << "\t    &= \t\t " << op2 << "\t = " << r20
625  	<< "\n" << op1 << "\t    ^= \t\t " << op2 << "\t = " << r21
626  	<< "\n" << op1 << "\t    |= \t\t " << op2 << "\t = " << r22
627//  	<< "\n" << "\t    ()++ \t " << op2 << "\t = " << r23
628//  	<< "\n" << "\t    ++() \t " << op2 << "\t = " << r24
629//  	<< "\n" << "\t    ()-- \t " << op2 << "\t = " << r25
630//  	<< "\n" << "\t    --() \t " << op2 << "\t = " << r26
631//  	<< "\n" << op1 << "\t    > ?: \t " << op2 << "\t = " << r27
632//  	<< "\n" << op1 << "\t    < ?: \t " << op2 << "\t = " << r28
633//  	<< "\n" << op1 << "\t    , \t\t " << op2 << "\t = " << r29
634  	<< "\n~(" << op1 << ") \t\t\t = " << r30
635//  	<< "\n" << op1 << "\t    << \t\t " << op2 << "\t = " << r31
636//  	<< "\n" << op1 << "\t    >> \t\t " << op2 << "\t = " << r32
637  	<< "\n" << op1 << "\t    & \t\t " << op2 << "\t = " << r33
638  	<< "\n" << op1 << "\t    ^ \t\t " << op2 << "\t = " << r34
639  	<< "\n" << op1 << "\t    | \t\t " << op2 << "\t = " << r35
640  	<< "\n\n" << op1 << "\t    &= \t\t " << VAL3 << "\t = " << r36
641  	<< "\n" << op1 << "\t    ^= \t\t " << VAL3 << "\t = " << r37
642  	<< "\n" << op1 << "\t    |= \t\t " << VAL3 << "\t = " << r38
643  	<< "\n" << op1 << "\t    & \t\t " << VAL3 << "\t = " << r39
644  	<< "\n" << op1 << "\t    ^ \t\t " << VAL3 << "\t = " << r40
645  	<< "\n" << op1 << "\t    | \t\t " << VAL3 << "\t = " << r41
646  	<< "\n\n" << op1 << "\t    and_reduce() \t = " << r42
647  	<< "\n" << op1 << "\t    or_reduce() \t = " << r43
648  	<< "\n" << op1 << "\t    xor_reduce() \t = " << r44
649 	<< endl;
650
651  if (op1 == op2)			// Equality
652   cout << "\n" << op1 << "\t    == \t\t " << op2 << "\t -> true" << endl;
653  else
654   cout << "\n" << op1 << "\t    == \t\t " << op2 << "\t -> false" << endl;
655
656  if (op1 != op2)			// Inequality
657   cout << op1 << "\t    != \t\t " << op2 << "\t -> true" << endl;
658  else
659   cout << op1 << "\t    != \t\t " << op2 << "\t -> false" << endl;
660
661  op1 = op2 = "1111";		// Assignment operator concatenation
662   cout << "\n" << op1 << "\t    = \t\t " << op2 << endl;
663
664
665// 4. OPERATOR DEFINITIONS
666//      & | ^ ~
667  std_ulogic_vector<9> 	suv;
668  std_ulogic_vector<9>	vu;
669  std_ulogic_vector<9>	vx;
670  std_ulogic_vector<9>	v0;
671  std_ulogic_vector<9>	v1;
672  std_ulogic_vector<9>	vz;
673  std_ulogic_vector<9>	vw;
674  std_ulogic_vector<9>	vl;
675  std_ulogic_vector<9>	vh;
676  std_ulogic_vector<9>	vd;
677  std_ulogic_vector<9>	bang;
678
679  suv = "UX01ZWLH-";
680
681  vu = "UUUUUUUUU" & suv;
682  vx = "XXXXXXXXX" & suv;
683  v0 = "000000000" & suv;
684  v1 = "111111111" & suv;
685  vz = "ZZZZZZZZZ" & suv;
686  vw = "WWWWWWWWW" & suv;
687  vl = "LLLLLLLLL" & suv;
688  vh = "HHHHHHHHH" & suv;
689  vd = "---------" & suv;
690
691  cout	<< "\n+-------------------------+"
692  << "\n| AND (&) | X | 0 | 1 | Z |"
693  << "\n+-------------------------+"
694  << "\n|    X    | " << vx[7] << " | " << vx[6] << " | "
695  << vx[5] << " | " << vx[4] << " | "
696  << "\n+-------------------------+"
697  << "\n|    0    | " << v0[7] << " | " << v0[6] << " | "
698  << v0[5] << " | " << v0[4] << " | "
699  << "\n+-------------------------+"
700  << "\n|    1    | " << v1[7] << " | " << v1[6] << " | "
701  << v1[5] << " | " << v1[4] << " | "
702  << "\n+-------------------------+"
703  << "\n|    Z    | " << vz[7] << " | " << vz[6] << " | "
704  << vz[5] << " | " << vz[4] << " | "
705  << "\n+-------------------------+"
706  << endl;
707
708  vu = "UUUUUUUUU" | suv;
709  vx = "XXXXXXXXX" | suv;
710  v0 = "000000000" | suv;
711  v1 = "111111111" | suv;
712  vz = "ZZZZZZZZZ" | suv;
713  vw = "WWWWWWWWW" | suv;
714  vl = "LLLLLLLLL" | suv;
715  vh = "HHHHHHHHH" | suv;
716  vd = "---------" | suv;
717
718  cout  << "\n+-------------------------+"
719  << "\n| OR  (|) | X | 0 | 1 | Z |"
720  << "\n+-------------------------+"
721  << "\n|    X    | " << vx[7] << " | " << vx[6] << " | "
722  << vx[5] << " | " << vx[4] << " | "
723  << "\n+-------------------------+"
724  << "\n|    0    | " << v0[7] << " | " << v0[6] << " | "
725  << v0[5] << " | " << v0[4] << " | "
726  << "\n+-------------------------+"
727  << "\n|    1    | " << v1[7] << " | " << v1[6] << " | "
728  << v1[5] << " | " << v1[4] << " | "
729  << "\n+-------------------------+"
730  << "\n|    Z    | " << vz[7] << " | " << vz[6] << " | "
731  << vz[5] << " | " << vz[4] << " | "
732  << "\n+-------------------------+"
733  << endl;
734
735  vu = "UUUUUUUUU" ^ suv;
736  vx = "XXXXXXXXX" ^ suv;
737  v0 = "000000000" ^ suv;
738  v1 = "111111111" ^ suv;
739  vz = "ZZZZZZZZZ" ^ suv;
740  vw = "WWWWWWWWW" ^ suv;
741  vl = "LLLLLLLLL" ^ suv;
742  vh = "HHHHHHHHH" ^ suv;
743  vd = "---------" ^ suv;
744
745  cout  << "\n+-------------------------+"
746  << "\n| XOR (^) | X | 0 | 1 | Z |"
747  << "\n+-------------------------+"
748  << "\n|    X    | " << vx[7] << " | " << vx[6] << " | "
749  << vx[5] << " | " << vx[4] << " | "
750  << "\n+-------------------------+"
751  << "\n|    0    | " << v0[7] << " | " << v0[6] << " | "
752  << v0[5] << " | " << v0[4] << " | "
753  << "\n+-------------------------+"
754  << "\n|    1    | " << v1[7] << " | " << v1[6] << " | "
755  << v1[5] << " | " << v1[4] << " | "
756  << "\n+-------------------------+"
757  << "\n|    Z    | " << vz[7] << " | " << vz[6] << " | "
758  << vz[5] << " | " << vz[4] << " | "
759  << "\n+-------------------------+"
760  << endl;
761
762  bang = ~suv;
763
764  cout	<< "\n+-------------------------+"
765  << "\n| NOT (~) | X | 0 | 1 | Z |"
766  << "\n+-------------------------+"
767  << "\n|         | " << bang[7] << " | " << bang[6] << " | "
768  << bang[5] << " | " << bang[4] << " | "
769  << "\n+-------------------------+"
770  << endl;
771  return 0;
772}
773