blob: f3543377471f58305098a5a45c97e8514437ad2d [file] [log] [blame]
/*****************************************************************************
Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
more contributor license agreements. See the NOTICE file distributed
with this work for additional information regarding copyright ownership.
Accellera licenses this file to you under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
*****************************************************************************/
/*****************************************************************************
std_ulogic_vector_datatype.cpp --
Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
*****************************************************************************/
/*****************************************************************************
MODIFICATION LOG - modifiers, enter your name, affiliation, date and
changes you are making here.
Name, Affiliation, Date:
Description of Modification:
*****************************************************************************/
/* Main file for "std_ulogic_vector" data type */
#include "systemc.h"
typedef sc_logic std_ulogic;
#define std_ulogic_vector sc_lv
#define bool_vector sc_bv
int sc_main(int ac, char *av[])
{
// 0. SIZE OF TYPES
int integer;
short short_integer;
long long_integer;
unsigned long unsigned_long;
signed long signed_long;
cout << "\nINTEGER SIZE \t\t= " << sizeof integer << " bytes"
<< "\nSHORT INTEGER SIZE \t= " << sizeof short_integer << " bytes"
<< "\nLONG INTEGER SIZE \t= " << sizeof long_integer << " bytes"
<< "\nUNSIGNED LONG SIZE \t= " << sizeof unsigned_long << " bytes"
<< "\nSIGNED LONG SIZE \t= " << sizeof signed_long << " bytes"
<< "\n" << endl;
// 1. DECLARATION SYNTAX
std_ulogic_vector<9> a;
std_ulogic_vector<9> b;
std_ulogic_vector<68> big;
std_ulogic_vector<1284> huge_;
// 2. TYPE CONVERSION
// std_ulogic_vector <- C++ string
a = "01XZUWLH-";
b = "ZZ1XX0UU1WWW";
big = "11110000111100001111000011110000111100001111000011110000111100001111";
huge_ = "111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111";
cout << "std_ulogic_vector \t<=\t C++ string"
<< "\n-------------------------------------------"
<< "\nA = " << a << "\t\t \"01XZUWLH-\" "
<< "\nB = " << b << "\t\t \"ZZ1XX0UU1WWW\" "
<< "\nBIG = " << big << "\n "
<<"\"11110000111100001111000011110000111100001111000011110000111100001111\""
<< "\nHUGE = " << huge_.range(0,63) << "\n "
<< huge_.range(64,127) << "\n "
<< huge_.range(128,191) << "\n "
<< huge_.range(192,255) << "\n "
<< huge_.range(256,319) << "\n "
<< huge_.range(320,383) << "\n "
<< huge_.range(384,447) << "\n "
<< huge_.range(448,511) << "\n "
<< huge_.range(512,575) << "\n "
<< huge_.range(576,639) << "\n "
<< huge_.range(640,703) << "\n "
<< huge_.range(704,767) << "\n "
<< huge_.range(768,831) << "\n "
<< huge_.range(832,895) << "\n "
<< huge_.range(896,959) << "\n "
<< huge_.range(960,1023) << "\n "
<< huge_.range(1024,1087) << "\n "
<< huge_.range(1088,1151) << "\n "
<< huge_.range(1152,1215) << "\n "
<< huge_.range(1216,1279) << "\n "
<< huge_.range(1280,1283)
<< "\n" << endl;
// std_ulogic_vector <- std_ulogic_vector
std_ulogic_vector<9> c;
std_ulogic_vector<68> big2;
c = b;
big2 = big;
cout << "std_ulogic_vector \t<=\t std_ulogic_vector"
<< "\n--------------------------------------------------"
<< "\nC = " << c << "\t\t ZZ1XX0XX1XXX"
<< "\nBIG2 = " << big2 << "\n "
<<"\"11110000111100001111000011110000111100001111000011110000111100001111\""
<< "\n" << endl;
// std_ulogic_vector <- C++ array of std_ulogic
std_ulogic_vector<9> d;
std_ulogic_vector<9> e;
std_ulogic_vector<68> big3;
std_ulogic cb1[9] = { sc_logic( 'U' ), sc_logic( 0 ) , sc_logic( 1 ),
sc_logic( 'X' ), sc_logic( 'Z' ), sc_logic( 'W' ),
sc_logic( 'H' ), sc_logic( 'L' ), sc_logic( '-' ) };
std_ulogic cb2[12] = { sc_logic( 'U' ), sc_logic( 'U' ), sc_logic( 'X' ),
sc_logic( 'X' ), sc_logic( 1 ) , sc_logic( 1 ),
sc_logic( 0 ) , sc_logic( 0 ) , sc_logic( 1 ),
sc_logic( 1 ) , sc_logic( 'X' ), sc_logic( 'X' ) };
std_ulogic cb3[80] = { sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ),
sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ),
sc_logic( 0 ), sc_logic( 0 ) };
d = cb1;
e = cb2;
big3 = cb3;
cout << "std_ulogic_vector \t<=\t C++ array of bool"
<< "\n--------------------------------------------------"
<< "\nD = " << d << "\t\t -, L, H, W, Z, X, 1, 0, U"
<< "\nE = " << e << "\t\t X, X, 1, 1, 0, 0, 1, 1, X, X, U, U"
<< "\nBIG3 = " << big3 << "\n "
<<"\"11110000111100001111000011110000111100001111000011110000111100001111"
<<"\n 000011110000\""
<< "\n" << endl;
// std_ulogic_vector <- bool_vector
std_ulogic_vector<4> f;
bool_vector<4> sv1;
sv1 = "1010";
f = sv1;
cout << "std_ulogic_vector \t<=\t bool_vector"
<< "\n--------------------------------------------"
<< "\nF = " << f << "\t\t \"1010\" "
<< "\n" << endl;
// std_ulogic_vector <- unsigned long
std_ulogic_vector<4> h;
std_ulogic_vector<32> i;
std_ulogic_vector<40> j;
unsigned long ul1 = 137; // ...10001001
unsigned long ul2 = 137; // ...10001001
unsigned long ul3 = 137; // ...10001001
h = ul1;
i = ul2;
j = ul3;
cout << "std_ulogic_vector \t<=\t unsigned long"
<< "\n----------------------------------------------"
<< "\nH = " << h << "\t\t\t\t\t ...10001001 (137)"
<< "\nI = " << i << "\t\t ...10001001 (137)"
<< "\nJ = " << j << "\t ...10001001 (137)"
<< "\n" << endl;
// std_ulogic_vector <- sc_unsigned
std_ulogic_vector<4> k;
std_ulogic_vector<4> l;
std_ulogic_vector<4> m;
sc_biguint<2> scu1;
sc_biguint<4> scu2;
sc_biguint<8> scu3;
scu1 = 3; // .........11
scu2 = 13; // .......1101
scu3 = 137; // ...10001001
k = scu1;
l = scu2;
m = scu3;
cout << "std_ulogic_vector \t<=\t sc_unsigned"
<< "\n--------------------------------------------"
<< "\nK = " << k << "\t\t 11 (3)"
<< "\nL = " << l << "\t\t 1101 (13)"
<< "\nM = " << m << "\t\t 10001001 (137)"
<< "\n" << endl;
// std_ulogic_vector <- signed long
std_ulogic_vector<5> n;
std_ulogic_vector<32> o;
std_ulogic_vector<40> p;
std_ulogic_vector<5> q;
std_ulogic_vector<32> r;
std_ulogic_vector<40> s;
signed long sl1 = 137; // ...010001001
signed long sl2 = 137; // ...010001001
signed long sl3 = 137; // ...010001001
signed long sl4 = -137; // ...101110111
signed long sl5 = -137; // ...101110111
signed long sl6 = -137; // ...101110111
n = sl1;
o = sl2;
p = sl3;
q = sl4;
r = sl5;
s = sl6;
cout << "std_ulogic_vector \t<=\t signed long"
<< "\n--------------------------------------------"
<< "\nN = " << n << "\t\t\t\t\t ...010001001 (137)"
<< "\nO = " << o << "\t\t ...010001001 (137)"
<< "\nP = " << p << "\t ...010001001 (137)"
<< "\nQ = " << q << "\t\t\t\t\t ...101110111 (-137)"
<< "\nR = " << r << "\t\t ...101110111 (-137)"
<< "\nS = " << s << "\t ...101110111 (-137)"
<< "\n" << endl;
// std_ulogic_vector <- sc_signed
std_ulogic_vector<5> t;
std_ulogic_vector<5> u;
std_ulogic_vector<5> v;
std_ulogic_vector<5> w;
std_ulogic_vector<5> x;
std_ulogic_vector<5> y;
sc_bigint<3> scs1;
sc_bigint<5> scs2;
sc_bigint<9> scs3;
sc_bigint<3> scs4;
sc_bigint<5> scs5;
sc_bigint<9> scs6;
scs1 = 3; // ........011
scs2 = 13; // ......01101
scs3 = 137; // ..010001001
scs4 = -3; // ........101
scs5 = -13; // ......10011
scs6 = -137; // ..101110111
t = scs1;
u = scs2;
v = scs3;
w = scs4;
x = scs5;
y = scs6;
cout << "std_ulogic_vector \t<=\t sc_signed"
<< "\n------------------------------------------"
<< "\nT = " << t << "\t\t 011 (3)"
<< "\nU = " << u << "\t\t 01101 (13)"
<< "\nV = " << v << "\t\t 010001001 (137)"
<< "\nW = " << w << "\t\t 101 (-3)"
<< "\nX = " << x << "\t\t 10011 (-13)"
<< "\nY = " << y << "\t\t 101110111 (-137)"
<< "\n" << endl;
// std_ulogic_vector .to_uint()
std_ulogic_vector<4> tu1;
std_ulogic_vector<32> tu2;
std_ulogic_vector<40> tu3;
std_ulogic_vector<4> tu4;
sc_biguint<2> tu5;
sc_biguint<4> tu6;
sc_biguint<8> tu7;
tu1 = "1001"; // 9
tu2 = "10000000000000000000000000000001"; // 2147483649
tu3 = "0000000110000000000000000000000000000001"; // 6442450945
tu4 = "1101";
tu5 = tu4.to_uint();
tu6 = tu4.to_uint();
tu7 = tu4.to_uint();
cout << "std_ulogic_vector \t\t<=\t\t to_uint()"
<< "\n-----------------------------------------------------------------"
<< "\nTU1 = \t\t\t\t " << tu1 << "\t " << tu1.to_uint()
<< "\nTU2 = " << tu2 << "\t " << tu2.to_uint()
<< "\nTU3 = " << tu3 << "\t " << tu3.to_uint()
<< "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu5 << "\t ("
<< tu5[1] << tu5[0] << ")"
<< "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu6 << "\t ("
<< tu6[3] << tu6[2] << tu6[1] << tu6[0] << ")"
<< "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu7 << "\t("
<< tu7[7] << tu7[6] << tu7[5] << tu7[4]
<< tu7[3] << tu7[2] << tu7[1] << tu7[0] << ")"
<< "\n" << endl;
// std_ulogic_vector .to_int()
std_ulogic_vector<4> ts1;
std_ulogic_vector<32> ts2;
std_ulogic_vector<40> ts3;
std_ulogic_vector<5> ts4;
sc_bigint<3> ts5;
sc_bigint<5> ts6;
sc_bigint<9> ts7;
ts1 = "1001"; // -7
ts2 = "11111111111111111111101111111001"; // -1031
ts3 = "0000000111111111111111111111101111111001"; // 8589933561
ts4 = "11001";
ts5 = ts4.to_int();
ts6 = ts4.to_int();
ts7 = ts4.to_int();
cout << "std_ulogic_vector \t\t<=\t\t to_int()"
<< "\n-----------------------------------------------------------------"
<< "\nTS1 = \t\t\t\t " << ts1 << "\t " << ts1.to_int()
<< "\nTS2 = " << ts2 << "\t " << ts2.to_int()
<< "\nTS3 = " << ts3 << "\t " << ts3.to_int()
<< "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts5 << "\t ("
<< ts5[2] << ts5[1] << ts5[0] << ")"
<< "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts6 << "\t ("
<< ts6[4] << ts6[3] << ts6[2] << ts6[1] << ts6[0] << ")"
<< "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts7 << "\t("
<< ts7[8] << ts7[7] << ts7[6] << ts7[5]
<< ts7[4] << ts7[3] << ts7[2] << ts7[1] << ts7[0] << ")"
<< "\n" << endl;
// std_ulogic_vector Typecasted to sc_unsigned
std_ulogic_vector<4> tcu1;
sc_biguint<2> tcu2;
sc_biguint<4> tcu3;
sc_biguint<8> tcu4;
tcu1 = "1101";
tcu2 = tcu1;
tcu3 = tcu1;
tcu4 = tcu1;
cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_unsigned"
<< "\n-----------------------------------------------------------------"
<< "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu2 << "\t ("
<< tcu2[1] << tcu2[0] << ")"
<< "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu3 << "\t ("
<< tcu3[3] << tcu3[2] << tcu3[1] << tcu3[0] << ")"
<< "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu4 << "\t("
<< tcu4[7] << tcu4[6] << tcu4[5] << tcu4[4]
<< tcu4[3] << tcu4[2] << tcu4[1] << tcu4[0] << ")"
<< "\n" << endl;
// std_ulogic_vector Typecasted to sc_signed
std_ulogic_vector<5> tcs1;
sc_bigint<3> tcs2;
sc_bigint<5> tcs3;
sc_bigint<9> tcs4;
tcs1 = "11001";
tcs2 = sc_bigint<3>(tcs1);
tcs3 = sc_bigint<5>(tcs1);
tcs4 = sc_bigint<9>(tcs1);
cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_signed"
<< "\n-----------------------------------------------------------------"
<< "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs2 << "\t ("
<< tcs2[2] << tcs2[1] << tcs2[0] << ")"
<< "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs3 << "\t ("
<< tcs3[4] << tcs3[3] << tcs3[2] << tcs3[1] << tcs3[0] << ")"
<< "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs4 << "\t("
<< tcs4[8] << tcs4[7] << tcs4[6] << tcs4[5]
<< tcs4[4] << tcs4[3] << tcs4[2] << tcs4[1] << tcs4[0] << ")"
<< "\n" << endl;
// std_ulogic_vector .to_string()
std_ulogic_vector<9> tstr;
std::string str;
tstr = "UXZ01WLH-";
str = tstr.to_string();
cout << "std_ulogic_vector \t<=\t to_string()"
<< "\n--------------------------------------------"
<< "\nTSTR = " << tstr << " \t\t " << str
<< endl;
// 3. OPERATORS
// Supported operators: ~ & ^ | &= ^= |= = [] range()
// and_reduce() or_reduce() xor_reduce()
std_ulogic_vector<4> ra;
std_ulogic_vector<4> rb;
std_ulogic_vector<4> rc;
std_ulogic_vector<9> rd;
std_ulogic_vector<4> re;
std_ulogic_vector<4> rf;
std_ulogic_vector<4> rg;
std_ulogic_vector<9> rh;
std_ulogic_vector<4> ri;
std_ulogic_vector<4> rj;
std_ulogic_vector<4> rl;
std_ulogic_vector<4> rdata4;
std_ulogic_vector<9> rdata9;
rdata4 = "1000";
rdata9 = "UXZ01WHL-";
ra.range(0,3) = rdata4;
rb.range(3,0) = rdata4;
( rc.range(1,3), rc.range(0,0) ) = rdata4;
( rd.range(8,6), rd.range(5,0) ) = rdata9;
re = "1111";
re.range(2,2) = std_ulogic_vector<1>( rdata4[1] );
rf = rdata4.range(0,3);
rg = rdata4.range(3,0);
rh = ( rdata9.range(8,6), rdata9.range(5,0) );
ri = ( rdata4.range(0,1), rdata4.range(2,3) );
rj = "1111";
rj[1] = rdata4.range(2,2)[0];
rl = ( rdata4.range(1,1), rdata4.range(3,3),
rdata4.range(0,0), rdata4.range(2,2) );
cout.precision(15);
cout << "\nrange() tests"
<< "\n-----------------------------------------------------------------"
<< "\nINITIAL 4-BIT \t" << rdata4
<< "\nINITIAL 9-BIT \t" << rdata9 << "\n"
<< "\nLVALUE RISE \t"
<< ra[0] << "\t" << ra[1] << "\t" << ra[2] << "\t" << ra[3]
<< "\nLVALUE FALL \t"
<< rb[0] << "\t" << rb[1] << "\t" << rb[2] << "\t" << rb[3]
<< "\nLVALUE SUB RISE "
<< rc[0] << "\t" << rc[1] << "\t" << rc[2] << "\t" << rc[3]
<< "\nLVALUE SUB FALL "
<< rd[0] << "\t" << rd[1] << "\t" << rd[2] << "\t"
<< rd[3] << "\t" << rd[4] << "\t" << rd[5] << "\t"
<< rd[6] << "\t" << rd[7] << "\t" << rd[8]
<< "\nLVALUE BIT \t"
<< re[0] << "\t" << re[1] << "\t" << re[2] << "\t" << re[3]
<< "\n\nRVALUE RISE \t"
<< rf[0] << "\t" << rf[1] << "\t" << rf[2] << "\t" << rf[3]
<< "\nRVALUE FALL \t"
<< rg[0] << "\t" << rg[1] << "\t" << rg[2] << "\t" << rg[3]
<< "\nRVALUE SUB FALL "
<< rh[0] << "\t" << rh[1] << "\t" << rh[2] << "\t"
<< rh[3] << "\t" << rh[4] << "\t" << rh[5] << "\t"
<< rh[6] << "\t" << rh[7] << "\t" << rh[8]
<< "\nRVALUE SUB RISE "
<< ri[0] << "\t" << ri[1] << "\t" << ri[2] << "\t" << ri[3]
<< "\nRVALUE BIT [] \t"
<< rj[0] << "\t" << rj[1] << "\t" << rj[2] << "\t" << rj[3]
<< "\nRVALUE BIT \t"
<< rl[0] << "\t" << rl[1] << "\t" << rl[2] << "\t" << rl[3]
<< endl;
#define VAL1 "1010"
#define VAL2 "1000"
#define VAL3 "111011"
std_ulogic_vector<4> op1;
op1 = VAL1;
std_ulogic_vector<4> op2;
op2 = VAL2;
std_ulogic_vector<4> r1, r2, r3, r4, r5, r6, r7, r8;
std_ulogic_vector<4> r9, r10, r11, r12, r13, r14;
std_ulogic_vector<4> r15, r16, r17, r18, r19;
std_ulogic_vector<4> r20, r21, r22, r23, r24;
std_ulogic_vector<4> r25, r26, r27, r28, r29;
std_ulogic_vector<4> r30, r31, r32, r33, r34, r35;
std_ulogic_vector<4> r36, r37, r38, r39, r40, r41;
std_ulogic r42, r43, r44;
// r1 = op1 * op2; // Multiplication
// r2 = op1 / op2; // Division
// r3 = op1 % op2; // Modulus
// r4 = op1 + op2; // Addition
// r5 = op1 - op2; // Subtraction
// r6 = !op1; // Logical NOT
// r7 = op1 && op2; // Logical AND
// r8 = op1 || op2; // Logical OR
// r9 = op1 < op2; // Less than
// r10 = op1 <= op2; // Less than or equal
// r11 = op1 > op2; // Greater than
// r12 = op1 >= op2; // Greater than or equal
// r13 = op1 += op2; // Compound addition
// op1 = VAL1; op2 = VAL2;
// r14 = op1 -= op2; // Compound subtraction
// op1 = VAL1; op2 = VAL2;
// r15 = op1 *= op2; // Compound multiplication
// op1 = VAL1; op2 = VAL2;
// r16 = op1 /= op2; // Compound division
// op1 = VAL1; op2 = VAL2;
// r17 = op1 %= op2; // Compound modulus
// op1 = VAL1; op2 = VAL2;
// r18 = op1 <<= op2; // Compound shift left
// op1 = VAL1; op2 = VAL2;
// r19 = op1 >>= op2; // Compound shift right
// op1 = VAL1; op2 = VAL2;
r20 = op1 &= op2; // Compound bitwise AND
op1 = VAL1; op2 = VAL2;
r36 = op1 &= VAL3;
op1 = VAL1;
r21 = op1 ^= op2; // Compound bitwise XOR
op1 = VAL1; op2 = VAL2;
r37 = op1 ^= VAL3;
op1 = VAL1;
r22 = op1 |= op2; // Compound bitwise OR
op1 = VAL1; op2 = VAL2;
r38 = op1 |= VAL3;
op1 = VAL1;
// r23 = op2++; // Postfix increment
// op1 = VAL1; op2 = VAL2;
// r24 = ++op2; // Prefix increment
// op1 = VAL1; op2 = VAL2;
// r25 = op2--; // Postfix decrement
// op1 = VAL1; op2 = VAL2;
// r26 = --op2; // Prefix decrement
// op1 = VAL1; op2 = VAL2;
// r27 = (op1 > op2) ? true : false; // Arithmetic if
// r28 = (op1 < op2) ? true : false; // Arithmetic if
// r29 = op1, r29 = op2; // Comma
r30 = ~op1; // Bitwise NOT
// r31 = op1 << op2; // Left shift
// op1 = VAL1; op2 = VAL2;
// r32 = op1 >> op2; // Right shift
// op1 = VAL1; op2 = VAL2;
r33 = op1 & op2; // Bitwise AND
r39 = op1 & VAL3;
r34 = op1 ^ op2; // Bitwise XOR
r40 = op1 ^ VAL3;
r35 = op1 | op2; // Bitwise OR
r41 = op1 | VAL3;
r42 = and_reduce(op1); // AND reduction
r43 = or_reduce(op1); // OR reduction
r44 = xor_reduce(op1); // XOR reduction
cout << "\nop1\t operator\t op2\t result [All operands are std_ulogic_vector]"
<< "\n----------------------------------------------------------------"
// << "\n" << op1 << "\t * \t\t " << op2 << "\t = " << r1
// << "\n" << op1 << "\t / \t\t " << op2 << "\t = " << r2
// << "\n" << op1 << "\t % \t\t " << op2 << "\t = " << r3
// << "\n" << op1 << "\t + \t\t " << op2 << "\t = " << r4
// << "\n" << op1 << "\t - \t\t " << op2 << "\t = " << r5
// << "\n!(" << op1 << ") \t\t\t\t = " << r6
// << "\n" << op1 << "\t && \t\t " << op2 << "\t = " << r7
// << "\n" << op1 << "\t || \t\t " << op2 << "\t = " << r8
// << "\n" << op1 << "\t < \t\t " << op2 << "\t = " << r9
// << "\n" << op1 << "\t <= \t\t " << op2 << "\t = " << r10
// << "\n" << op1 << "\t > \t\t " << op2 << "\t = " << r11
// << "\n" << op1 << "\t >= \t\t " << op2 << "\t = " << r12
// << "\n" << op1 << "\t += \t\t " << op2 << "\t = " << r13
// << "\n" << op1 << "\t -= \t\t " << op2 << "\t = " << r14
// << "\n" << op1 << "\t *= \t\t " << op2 << "\t = " << r15
// << "\n" << op1 << "\t /= \t\t " << op2 << "\t = " << r16
// << "\n" << op1 << "\t %= \t\t " << op2 << "\t = " << r17
// << "\n" << op1 << "\t <<=\t\t " << op2 << "\t = " << r18
// << "\n" << op1 << "\t >>=\t\t " << op2 << "\t = " << r19
<< "\n" << op1 << "\t &= \t\t " << op2 << "\t = " << r20
<< "\n" << op1 << "\t ^= \t\t " << op2 << "\t = " << r21
<< "\n" << op1 << "\t |= \t\t " << op2 << "\t = " << r22
// << "\n" << "\t ()++ \t " << op2 << "\t = " << r23
// << "\n" << "\t ++() \t " << op2 << "\t = " << r24
// << "\n" << "\t ()-- \t " << op2 << "\t = " << r25
// << "\n" << "\t --() \t " << op2 << "\t = " << r26
// << "\n" << op1 << "\t > ?: \t " << op2 << "\t = " << r27
// << "\n" << op1 << "\t < ?: \t " << op2 << "\t = " << r28
// << "\n" << op1 << "\t , \t\t " << op2 << "\t = " << r29
<< "\n~(" << op1 << ") \t\t\t = " << r30
// << "\n" << op1 << "\t << \t\t " << op2 << "\t = " << r31
// << "\n" << op1 << "\t >> \t\t " << op2 << "\t = " << r32
<< "\n" << op1 << "\t & \t\t " << op2 << "\t = " << r33
<< "\n" << op1 << "\t ^ \t\t " << op2 << "\t = " << r34
<< "\n" << op1 << "\t | \t\t " << op2 << "\t = " << r35
<< "\n\n" << op1 << "\t &= \t\t " << VAL3 << "\t = " << r36
<< "\n" << op1 << "\t ^= \t\t " << VAL3 << "\t = " << r37
<< "\n" << op1 << "\t |= \t\t " << VAL3 << "\t = " << r38
<< "\n" << op1 << "\t & \t\t " << VAL3 << "\t = " << r39
<< "\n" << op1 << "\t ^ \t\t " << VAL3 << "\t = " << r40
<< "\n" << op1 << "\t | \t\t " << VAL3 << "\t = " << r41
<< "\n\n" << op1 << "\t and_reduce() \t = " << r42
<< "\n" << op1 << "\t or_reduce() \t = " << r43
<< "\n" << op1 << "\t xor_reduce() \t = " << r44
<< endl;
if (op1 == op2) // Equality
cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> true" << endl;
else
cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> false" << endl;
if (op1 != op2) // Inequality
cout << op1 << "\t != \t\t " << op2 << "\t -> true" << endl;
else
cout << op1 << "\t != \t\t " << op2 << "\t -> false" << endl;
op1 = op2 = "1111"; // Assignment operator concatenation
cout << "\n" << op1 << "\t = \t\t " << op2 << endl;
// 4. OPERATOR DEFINITIONS
// & | ^ ~
std_ulogic_vector<9> suv;
std_ulogic_vector<9> vu;
std_ulogic_vector<9> vx;
std_ulogic_vector<9> v0;
std_ulogic_vector<9> v1;
std_ulogic_vector<9> vz;
std_ulogic_vector<9> vw;
std_ulogic_vector<9> vl;
std_ulogic_vector<9> vh;
std_ulogic_vector<9> vd;
std_ulogic_vector<9> bang;
suv = "UX01ZWLH-";
vu = "UUUUUUUUU" & suv;
vx = "XXXXXXXXX" & suv;
v0 = "000000000" & suv;
v1 = "111111111" & suv;
vz = "ZZZZZZZZZ" & suv;
vw = "WWWWWWWWW" & suv;
vl = "LLLLLLLLL" & suv;
vh = "HHHHHHHHH" & suv;
vd = "---------" & suv;
cout << "\n+-------------------------+"
<< "\n| AND (&) | X | 0 | 1 | Z |"
<< "\n+-------------------------+"
<< "\n| X | " << vx[7] << " | " << vx[6] << " | "
<< vx[5] << " | " << vx[4] << " | "
<< "\n+-------------------------+"
<< "\n| 0 | " << v0[7] << " | " << v0[6] << " | "
<< v0[5] << " | " << v0[4] << " | "
<< "\n+-------------------------+"
<< "\n| 1 | " << v1[7] << " | " << v1[6] << " | "
<< v1[5] << " | " << v1[4] << " | "
<< "\n+-------------------------+"
<< "\n| Z | " << vz[7] << " | " << vz[6] << " | "
<< vz[5] << " | " << vz[4] << " | "
<< "\n+-------------------------+"
<< endl;
vu = "UUUUUUUUU" | suv;
vx = "XXXXXXXXX" | suv;
v0 = "000000000" | suv;
v1 = "111111111" | suv;
vz = "ZZZZZZZZZ" | suv;
vw = "WWWWWWWWW" | suv;
vl = "LLLLLLLLL" | suv;
vh = "HHHHHHHHH" | suv;
vd = "---------" | suv;
cout << "\n+-------------------------+"
<< "\n| OR (|) | X | 0 | 1 | Z |"
<< "\n+-------------------------+"
<< "\n| X | " << vx[7] << " | " << vx[6] << " | "
<< vx[5] << " | " << vx[4] << " | "
<< "\n+-------------------------+"
<< "\n| 0 | " << v0[7] << " | " << v0[6] << " | "
<< v0[5] << " | " << v0[4] << " | "
<< "\n+-------------------------+"
<< "\n| 1 | " << v1[7] << " | " << v1[6] << " | "
<< v1[5] << " | " << v1[4] << " | "
<< "\n+-------------------------+"
<< "\n| Z | " << vz[7] << " | " << vz[6] << " | "
<< vz[5] << " | " << vz[4] << " | "
<< "\n+-------------------------+"
<< endl;
vu = "UUUUUUUUU" ^ suv;
vx = "XXXXXXXXX" ^ suv;
v0 = "000000000" ^ suv;
v1 = "111111111" ^ suv;
vz = "ZZZZZZZZZ" ^ suv;
vw = "WWWWWWWWW" ^ suv;
vl = "LLLLLLLLL" ^ suv;
vh = "HHHHHHHHH" ^ suv;
vd = "---------" ^ suv;
cout << "\n+-------------------------+"
<< "\n| XOR (^) | X | 0 | 1 | Z |"
<< "\n+-------------------------+"
<< "\n| X | " << vx[7] << " | " << vx[6] << " | "
<< vx[5] << " | " << vx[4] << " | "
<< "\n+-------------------------+"
<< "\n| 0 | " << v0[7] << " | " << v0[6] << " | "
<< v0[5] << " | " << v0[4] << " | "
<< "\n+-------------------------+"
<< "\n| 1 | " << v1[7] << " | " << v1[6] << " | "
<< v1[5] << " | " << v1[4] << " | "
<< "\n+-------------------------+"
<< "\n| Z | " << vz[7] << " | " << vz[6] << " | "
<< vz[5] << " | " << vz[4] << " | "
<< "\n+-------------------------+"
<< endl;
bang = ~suv;
cout << "\n+-------------------------+"
<< "\n| NOT (~) | X | 0 | 1 | Z |"
<< "\n+-------------------------+"
<< "\n| | " << bang[7] << " | " << bang[6] << " | "
<< bang[5] << " | " << bang[4] << " | "
<< "\n+-------------------------+"
<< endl;
return 0;
}