/***************************************************************************** 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_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" data type */ #include "systemc.h" typedef sc_logic std_ulogic; int sc_main(int ac, char *av[]) { // 1. DECLARATION SYNTAX std_ulogic s1; std_ulogic s2, s3, s4, s5, s6, s7, s8, s9, s10, s11; // 2. TYPE CONVERSION // std_ulogic <- std_ulogic s1 = 'U'; s2 = 'X'; s3 = '0'; s4 = '1'; s5 = 'Z'; s6 = 'W'; s7 = 'L'; s8 = 'H'; s9 = '-'; s10 = true; s11 = false; cout << "\nstd_ulogic \t<=\t\t std_ulogic" << "\n-------------------------------------------" << "\nUNINITIALIZED \t= " << s1 << "\t\t 'U'" << "\nUNKNOWN \t= " << s2 << "\t\t 'X'" << "\nZERO \t\t= " << s3 << "\t\t '0'" << "\nONE \t\t= " << s4 << "\t\t '1'" << "\nTRISTATE \t= " << s5 << "\t\t 'Z'" << "\nWEAK-UNKNOWN \t= " << s6 << "\t\t 'W'" << "\nWEAK-ZERO \t= " << s7 << "\t\t 'L'" << "\nWEAK-ONE \t= " << s8 << "\t\t 'H'" << "\nDONT-CARE \t= " << s9 << "\t\t '-'" << "\nTRUE \t\t= " << s10 << "\t\t true" << "\nFALSE \t\t= " << s11 << "\t\t false" << "\n" << endl; // std_ulogic <- literals std_ulogic a, b, c, d; a = true; b = false; c = 1; d = 0; cout << "std_ulogic <=\t literals" << "\n-------------------------" << "\nA = " << a << "\t\t true" << "\nB = " << b << "\t\t false" << "\nC = " << c << "\t\t 1" << "\nD = " << d << "\t\t 0" << "\n" << endl; // std_ulogic <- bool std_ulogic su1, su2, su3, su4; bool b1, b2, b3, b4; b1 = true; b2 = false; b3 = 1; b4 = 0; su1 = b1; su2 = b2; su3 = b3; su4 = b4; cout << "std_ulogic <=\t bool" << "\n---------------------" << "\nTRUE \t= " << su1 << "\t " << b1 << "\nFALSE \t= " << su2 << "\t " << b2 << "\n1 \t= " << su3 << "\t " << b3 << "\n0 \t= " << su4 << "\t " << b4 << "\n" << endl; // std_ulogic <- char std_ulogic sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8, sc9; std_ulogic sc10, sc11, sc12, sc13, sc14, sc15, sc16, sc17, sc18, sc19; char c1, c2, c3, c4, c5, c6, c7, c8, c9; char c10, c11, c12, c13, c14, c15, c16, c17, c18, c19; c1 = 'U'; c2 = 'u'; c3 = 'X'; c4 = 'x'; c5 = '0'; c6 = '1'; c7 = 'Z'; c8 = 'z'; c9 = 'W'; c10 = 'w'; c11 = 'L'; c12 = 'l'; c13 = 'H'; c14 = 'h'; c15 = '-'; c16 = 'D'; c17 = 'd'; c18 = 'B'; c19 = 'F'; sc1 = c1; sc2 = c2; sc3 = c3; sc4 = c4; sc5 = c5; sc6 = c6; sc7 = c7; sc8 = c8; sc9 = c9; sc10 = c10; sc11 = c11; sc12 = c12; sc13 = c13; sc14 = c14; sc15 = c15; sc16 = c16; sc17 = c17; sc18 = c18; sc19 = c19; cout << "std_ulogic <=\t char" << "\n---------------------" << "\nSC1 \t= " << sc1 << "\t '" << c1 << "'" << "\nSC2 \t= " << sc2 << "\t '" << c2 << "'" << "\nSC3 \t= " << sc3 << "\t '" << c3 << "'" << "\nSC4 \t= " << sc4 << "\t '" << c4 << "'" << "\nSC5 \t= " << sc5 << "\t '" << c5 << "'" << "\nSC6 \t= " << sc6 << "\t '" << c6 << "'" << "\nSC7 \t= " << sc7 << "\t '" << c7 << "'" << "\nSC8 \t= " << sc8 << "\t '" << c8 << "'" << "\nSC9 \t= " << sc9 << "\t '" << c9 << "'" << "\nSC10 \t= " << sc10 << "\t '" << c10 << "'" << "\nSC11 \t= " << sc11 << "\t '" << c11 << "'" << "\nSC12 \t= " << sc12 << "\t '" << c12 << "'" << "\nSC13 \t= " << sc13 << "\t '" << c13 << "'" << "\nSC14 \t= " << sc14 << "\t '" << c14 << "'" << "\nSC15 \t= " << sc15 << "\t '" << c15 << "'" << "\nSC16 \t= " << sc16 << "\t '" << c16 << "'" << "\nSC17 \t= " << sc17 << "\t '" << c17 << "'" << "\nSC18 \t= " << sc18 << "\t '" << c18 << "'" << "\nSC19 \t= " << sc19 << "\t '" << c19 << "'" << "\n" << endl; // 3. OPERATORS // Supported operators: ~ & ^ | &= ^= |= == != = #define VAL1 '1' #define VAL2 '1' std_ulogic op1 = sc_logic(VAL1); std_ulogic op2 = sc_logic(VAL2); std_ulogic r1, r2, r3, r4, r5, r6, r7, r8, r9; std_ulogic r10, r11, r12, r13, r14, r15, r16, r17, r18, r19; std_ulogic r20, r21, r22, r23, r24, r25, r26, r27, r28, r29; std_ulogic r30, r31, r32, r33, r34, r35; // 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; r21 = op1 ^= op2; // Compound bitwise XOR op1 = VAL1; op2 = VAL2; r22 = op1 |= op2; // Compound bitwise OR op1 = VAL1; op2 = VAL2; // 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 r34 = op1 ^ op2; // Bitwise XOR r35 = op1 | op2; // Bitwise OR cout << "op1 \t operator \t op2 \t result [All operands are std_ulogic]" << "\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\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 << endl; if (op1 == op2) // Equality cout << op1 << "\t == \t\t " << op2 << "\t -> true" << endl; else cout << 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 = 0; // Assignment operator concatenation cout << op1 << "\t = \t\t " << op2 << endl; // 4. OPERATOR DEFINITIONS // & | ^ ~ std_ulogic v1, v2, v3, v4, v5, v6, v7, v8, v9; std_ulogic uu, ux, u0, u1, uz, uw, ul, uh, ud; std_ulogic xu, xx, x0, x1, xz, xw, xl, xh, xd; std_ulogic _0u, _0x, _00, _01, _0z, _0w, _0l, _0h, _0d; std_ulogic _1u, _1x, _10, _11, _1z, _1w, _1l, _1h, _1d; std_ulogic zu, zx, z0, z1, zz, zw, zl, zh, zd; std_ulogic wu, wx, w0, w1, wz, ww, wl, wh, wd; std_ulogic lu, lx, l0, l1, lz, lw, ll, lh, ld; std_ulogic hu, hx, h0, h1, hz, hw, hl, hh, hd; std_ulogic du, dx, d0, d1, dz, dw, dl, dh, dd; v1 = 'U'; v2 = 'X'; v3 = '0'; v4 = '1'; v5 = 'Z'; v6 = 'W'; v7 = 'L'; v8 = 'H'; v9 = '-'; uu = v1 & v1; ux = v1 & v2; u0 = v1 & v3; u1 = v1 & v4; uz = v1 & v5; uw = v1 & v6; ul = v1 & v7; uh = v1 & v8; ud = v1 & v9; xu = v2 & v1; xx = v2 & v2; x0 = v2 & v3; x1 = v2 & v4; xz = v2 & v5; xw = v2 & v6; xl = v2 & v7; xh = v2 & v8; xd = v2 & v9; _0u = v3 & v1; _0x = v3 & v2; _00 = v3 & v3; _01 = v3 & v4; _0z = v3 & v5; _0w = v3 & v6; _0l = v3 & v7; _0h = v3 & v8; _0d = v3 & v9; _1u = v4 & v1; _1x = v4 & v2; _10 = v4 & v3; _11 = v4 & v4; _1z = v4 & v5; _1w = v4 & v6; _1l = v4 & v7; _1h = v4 & v8; _1d = v4 & v9; zu = v5 & v1; zx = v5 & v2; z0 = v5 & v3; z1 = v5 & v4; zz = v5 & v5; zw = v5 & v6; zl = v5 & v7; zh = v5 & v8; zd = v5 & v9; wu = v6 & v1; wx = v6 & v2; w0 = v6 & v3; w1 = v6 & v4; wz = v6 & v5; ww = v6 & v6; wl = v6 & v7; wh = v6 & v8; wd = v6 & v9; lu = v7 & v1; lx = v7 & v2; l0 = v7 & v3; l1 = v7 & v4; lz = v7 & v5; lw = v7 & v6; ll = v7 & v7; lh = v7 & v8; ld = v7 & v9; hu = v8 & v1; hx = v8 & v2; h0 = v8 & v3; h1 = v8 & v4; hz = v8 & v5; hw = v8 & v6; hl = v8 & v7; hh = v8 & v8; hd = v8 & v9; du = v9 & v1; dx = v9 & v2; d0 = v9 & v3; d1 = v9 & v4; dz = v9 & v5; dw = v9 & v6; dl = v9 & v7; dh = v9 & v8; dd = v9 & v9; cout << "\n+-------------------------+" << "\n| AND (&) | X | 0 | 1 | Z |" << "\n+-------------------------+" << "\n| X | " << xx << " | " << x0 << " | " << x1 << " | " << xz << " | " << "\n+-------------------------+" << "\n| 0 | " << _0x << " | " << _00 << " | " << _01 << " | " << _0z << " | " << "\n+-------------------------+" << "\n| 1 | " << _1x << " | " << _10 << " | " << _11 << " | " << _1z << " | " << "\n+-------------------------+" << "\n| Z | " << zx << " | " << z0 << " | " << z1 << " | " << zz << " | " << "\n+-------------------------+" << endl; uu = v1 | v1; ux = v1 | v2; u0 = v1 | v3; u1 = v1 | v4; uz = v1 | v5; uw = v1 | v6; ul = v1 | v7; uh = v1 | v8; ud = v1 | v9; xu = v2 | v1; xx = v2 | v2; x0 = v2 | v3; x1 = v2 | v4; xz = v2 | v5; xw = v2 | v6; xl = v2 | v7; xh = v2 | v8; xd = v2 | v9; _0u = v3 | v1; _0x = v3 | v2; _00 = v3 | v3; _01 = v3 | v4; _0z = v3 | v5; _0w = v3 | v6; _0l = v3 | v7; _0h = v3 | v8; _0d = v3 | v9; _1u = v4 | v1; _1x = v4 | v2; _10 = v4 | v3; _11 = v4 | v4; _1z = v4 | v5; _1w = v4 | v6; _1l = v4 | v7; _1h = v4 | v8; _1d = v4 | v9; zu = v5 | v1; zx = v5 | v2; z0 = v5 | v3; z1 = v5 | v4; zz = v5 | v5; zw = v5 | v6; zl = v5 | v7; zh = v5 | v8; zd = v5 | v9; wu = v6 | v1; wx = v6 | v2; w0 = v6 | v3; w1 = v6 | v4; wz = v6 | v5; ww = v6 | v6; wl = v6 | v7; wh = v6 | v8; wd = v6 | v9; lu = v7 | v1; lx = v7 | v2; l0 = v7 | v3; l1 = v7 | v4; lz = v7 | v5; lw = v7 | v6; ll = v7 | v7; lh = v7 | v8; ld = v7 | v9; hu = v8 | v1; hx = v8 | v2; h0 = v8 | v3; h1 = v8 | v4; hz = v8 | v5; hw = v8 | v6; hl = v8 | v7; hh = v8 | v8; hd = v8 | v9; du = v9 | v1; dx = v9 | v2; d0 = v9 | v3; d1 = v9 | v4; dz = v9 | v5; dw = v9 | v6; dl = v9 | v7; dh = v9 | v8; dd = v9 | v9; cout << "\n+-------------------------+" << "\n| OR (|) | X | 0 | 1 | Z |" << "\n+-------------------------+" << "\n| X | " << xx << " | " << x0 << " | " << x1 << " | " << xz << " | " << "\n+-------------------------+" << "\n| 0 | " << _0x << " | " << _00 << " | " << _01 << " | " << _0z << " | " << "\n+-------------------------+" << "\n| 1 | " << _1x << " | " << _10 << " | " << _11 << " | " << _1z << " | " << "\n+-------------------------+" << "\n| Z | " << zx << " | " << z0 << " | " << z1 << " | " << zz << " | " << "\n+-------------------------+" << endl; uu = v1 ^ v1; ux = v1 ^ v2; u0 = v1 ^ v3; u1 = v1 ^ v4; uz = v1 ^ v5; uw = v1 ^ v6; ul = v1 ^ v7; uh = v1 ^ v8; ud = v1 ^ v9; xu = v2 ^ v1; xx = v2 ^ v2; x0 = v2 ^ v3; x1 = v2 ^ v4; xz = v2 ^ v5; xw = v2 ^ v6; xl = v2 ^ v7; xh = v2 ^ v8; xd = v2 ^ v9; _0u = v3 ^ v1; _0x = v3 ^ v2; _00 = v3 ^ v3; _01 = v3 ^ v4; _0z = v3 ^ v5; _0w = v3 ^ v6; _0l = v3 ^ v7; _0h = v3 ^ v8; _0d = v3 ^ v9; _1u = v4 ^ v1; _1x = v4 ^ v2; _10 = v4 ^ v3; _11 = v4 ^ v4; _1z = v4 ^ v5; _1w = v4 ^ v6; _1l = v4 ^ v7; _1h = v4 ^ v8; _1d = v4 ^ v9; zu = v5 ^ v1; zx = v5 ^ v2; z0 = v5 ^ v3; z1 = v5 ^ v4; zz = v5 ^ v5; zw = v5 ^ v6; zl = v5 ^ v7; zh = v5 ^ v8; zd = v5 ^ v9; wu = v6 ^ v1; wx = v6 ^ v2; w0 = v6 ^ v3; w1 = v6 ^ v4; wz = v6 ^ v5; ww = v6 ^ v6; wl = v6 ^ v7; wh = v6 ^ v8; wd = v6 ^ v9; lu = v7 ^ v1; lx = v7 ^ v2; l0 = v7 ^ v3; l1 = v7 ^ v4; lz = v7 ^ v5; lw = v7 ^ v6; ll = v7 ^ v7; lh = v7 ^ v8; ld = v7 ^ v9; hu = v8 ^ v1; hx = v8 ^ v2; h0 = v8 ^ v3; h1 = v8 ^ v4; hz = v8 ^ v5; hw = v8 ^ v6; hl = v8 ^ v7; hh = v8 ^ v8; hd = v8 ^ v9; du = v9 ^ v1; dx = v9 ^ v2; d0 = v9 ^ v3; d1 = v9 ^ v4; dz = v9 ^ v5; dw = v9 ^ v6; dl = v9 ^ v7; dh = v9 ^ v8; dd = v9 ^ v9; cout << "\n+-------------------------+" << "\n| XOR (^) | X | 0 | 1 | Z |" << "\n+-------------------------+" << "\n| X | " << xx << " | " << x0 << " | " << x1 << " | " << xz << " | " << "\n+-------------------------+" << "\n| 0 | " << _0x << " | " << _00 << " | " << _01 << " | " << _0z << " | " << "\n+-------------------------+" << "\n| 1 | " << _1x << " | " << _10 << " | " << _11 << " | " << _1z << " | " << "\n+-------------------------+" << "\n| Z | " << zx << " | " << z0 << " | " << z1 << " | " << zz << " | " << "\n+-------------------------+" << endl; std_ulogic nu, nx, n0, n1, nz, nw, nl, nh, nd; nu = ~v1; nx = ~v2; n0 = ~v3; n1 = ~v4; nz = ~v5; nw = ~v6; nl = ~v7; nh = ~v8; nd = ~v9; cout << "\n+-------------------------+" << "\n| NOT (~) | X | 0 | 1 | Z |" << "\n+-------------------------+" << "\n| | " << nx << " | " << n0 << " | " << n1 << " | " << nz << " | " << "\n+-------------------------+" << endl; return 0; }