/*****************************************************************************

  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.

 *****************************************************************************/

/*****************************************************************************

  test_int.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:

 *****************************************************************************/

#include "systemc.h"


int sc_main( int ac, char *av[] )
{
  sc_int_base a(8),b(8);
  int x;

  

  x = 8;
  a = 8;
  sc_assert( x == a);
  
  cout << "x + a = " << x + a << endl;
  cout << "++a = " << ++a << endl;
  cout << "a-- = " << a-- << endl;
  
  // bit-select on L.H.S.
  a[0] = 1;
  cout << "a = " << a << endl;

  // bitselect on R.H.S.
  cout << "a[3] = " << a[3] << endl;


  // part-select on R.H.S
  cout << "a.range(4,0) = " << a.range(4,0) << endl;
  cout << "a = " << a << endl;  
  
  sc_int_base c(5);
  c = a.range(4,0);
  cout << "c = " << c << endl;

  // part-select on L.H.S.
  a.range(2,0) = 7;
  cout << "a = " << a << endl;

  a.range(4,2) = 5;
  cout << "a = " << a << endl;

  a.range(7,4) = 8;
  cout << "a = " << a << endl;

  // concat on R.H.S.
  sc_int_base sx(4); 
  sx = 1;
  sc_int_base sy(4);
  sy = 3;
  a = ( sx, sy );

  cout << "a = " << a << endl;
  
  sc_int_base sb(8);
  // concat of part-selects
  sb = ( a.range(7,4), a.range(3,0) );
  
  cout << "sb = " << sb << endl;

  ( sx, sy ) = 17;

  cout << "sx = " << sx << endl;
  cout << "sy = " << sy << endl;
  
  // concat and part-selects
  ( sx, sy ) = ( a.range(7,4), a.range(3,0) );
  
  cout << "sx = " << sx << endl;
  cout << "sy = " << sy << endl;
  
  sc_int_base  s5(5);

  s5 = ( sx , a[4] );
  
  cout << "s5 = " << s5 << endl;

  s5 = (a[4],sx);
  cout << "s5 = " << s5 << endl;

  sc_bv<8> sc8;
  sc_bv<4> sc4;
  
  // ( sc8.range(7,4), sc4 ) = 17; 
  ( sc8.range(7,4), sc4 ) = "00010001"; 

  cout << "sc8 = " << sc8.to_int() << endl;
  cout << "sc4 = " << sc4.to_int() << endl;
  
  sc_int_base sia(8);


  sc_uint_base u4(4);
  
  // part-select on sc_uint
  u4 = sx.range(3,0);

  cout << "u4 = " << u4 << endl;

  u4[3] = sx[0];

  cout << "u4 = " << u4 << endl;

  sx = (u4.range(1,0), u4.range(3,2));

  cout << "sx = " << sx << endl;

  sc_bv<8> bva;
  sc_lv<8> lva;

  // Mixing bv, lv on the RHS

  bva = "10000000";
  lva = "10000001";

  b = bva & "1010";
  cout << "b = " << b << endl;

  // b = lva ^ bva;
  b = sc_bv<8>( lva ^ bva );
  cout << "b = " << b << endl;

  //Mixing bv, lv on the LHS

  bva = b;
  lva = b;

  cout << "bva = " << bva << endl;
  cout << "lva = " << lva << endl;

  bva = b & lva.to_int();
  
  cout << "bva = " << bva << endl;
  

  //Mixing sc_signed on LHS
  
  sc_signed ss8(8);
  ss8 = b;
  cout << "ss8 = " << ss8 << endl;

  ss8 = u4;
  cout << "ss8 = " << ss8 << endl;
 
  // Mixing sc_signed/sc_unsigned on RHS
  sc_unsigned su8(8);

  su8 = 8;
  b = su8 + 1;
  
  cout << "b = " << b << endl;

  b = ss8 * su8;
  b = ss8 ^ su8;
  su8 = bva.to_int() | ss8;
 
  cout << "b = " << b << endl;

  // Having more than two concats

  sc_int_base ai2(2);
  sc_int_base bi4(4);
  sc_int_base ci2(2);
  sc_int_base di2(2);
  sc_int_base ei8(8);
  sc_int_base ei10(10);

  ai2 = 2;
  bi4 = 2;
  ci2 = 2;
  di2 = 2;
  
  ei8 = (ai2, bi4, ci2 );

  cout << "ei8 = " << ei8 << endl;

  ei10 = (ai2, bi4, ci2 , di2);
  
  cout << "ei10 = " << ei10 << endl;
  
  // bit-true behavior
  sc_int_base bs4(4);
  sc_signed ds4(4);

  bs4[3] = 1;
  bs4[2] = 0;
  bs4[1] = 0;
  bs4[0] = 0;

  ds4[3] = 1;
  ds4[2] = 0;
  ds4[1] = 0;
  ds4[0] = 0;
  
  
  cout << "bs4  = " << bs4 << endl;
  cout << "ds4 =  " << ds4 << endl;

  return 0;

}
