64 #ifndef __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__
65 #define __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__
67 #include "../int/sc_length_param.hh"
84 class sc_lv_base :
public sc_proxy<sc_lv_base>
104 const sc_logic &
a,
int length_=sc_length_param().
len()) :
117 init(
a.back_cast().length());
323 template <
class X,
class Y>
327 X &
x =
px.back_cast();
333 #define DEFN_BITWISE_AND_ASN_OP_T(tp) \
336 sc_proxy<X>::operator &= (tp b) \
338 X &x = back_cast(); \
339 sc_lv_base a(x.length()); \
341 return b_and_assign_(x, a); \
354 #undef DEFN_BITWISE_AND_ASN_OP_T
356 template <
class X,
class Y>
364 #define DEFN_BITWISE_AND_OP_T_A(tp) \
366 inline const sc_lv_base \
367 sc_proxy<X>::operator & (tp b) const \
369 sc_lv_base a(back_cast()); \
387 #undef DEFN_BITWISE_AND_OP_T_A
389 #define DEFN_BITWISE_AND_OP_T_B(tp) \
391 inline const sc_lv_base \
392 operator & (tp b, const sc_proxy<X> &px) \
411 #undef DEFN_BITWISE_AND_OP_T_B
414 template <
class X,
class Y>
418 X &
x =
px.back_cast();
419 sc_lv_base
a(
x.length());
424 #define DEFN_BITWISE_OR_ASN_OP_T(tp) \
427 sc_proxy<X>::operator |= (tp b) \
429 X &x = back_cast(); \
430 sc_lv_base a(x.length()); \
432 return b_or_assign_(x, a); \
445 #undef DEFN_BITWISE_OR_ASN_OP_T
447 template <
class X,
class Y>
448 inline const sc_lv_base
449 operator | (
const sc_proxy<X> &
px,
const sc_proxy<Y> &py)
452 return (
a |= py.back_cast());
455 #define DEFN_BITWISE_OR_OP_T_A(tp) \
457 inline const sc_lv_base \
458 sc_proxy<X>::operator | (tp b) const \
460 sc_lv_base a(back_cast()); \
478 #undef DEFN_BITWISE_OR_OP_T_A
480 #define DEFN_BITWISE_OR_OP_T_B(tp) \
482 inline const sc_lv_base \
483 operator | (tp b, const sc_proxy<X> &px) \
502 #undef DEFN_BITWISE_OR_OP_T_B
505 template <
class X,
class Y>
509 X &
x =
px.back_cast();
510 sc_lv_base
a(
x.length());
515 #define DEFN_BITWISE_XOR_ASN_OP_T(tp) \
518 sc_proxy<X>::operator ^= (tp b) \
520 X &x = back_cast(); \
521 sc_lv_base a(x.length()); \
523 return b_xor_assign_(x, a); \
536 #undef DEFN_BITWISE_XOR_ASN_OP_T
538 template <
class X,
class Y>
539 inline const sc_lv_base
540 operator ^ (
const sc_proxy<X> &
px,
const sc_proxy<Y> &py)
543 return (
a ^= py.back_cast());
546 #define DEFN_BITWISE_XOR_OP_T_A(tp) \
548 inline const sc_lv_base \
549 sc_proxy<X>::operator ^ (tp b) const \
551 sc_lv_base a(back_cast()); \
569 #undef DEFN_BITWISE_XOR_OP_T_A
571 #define DEFN_BITWISE_XOR_OP_T_B(tp) \
573 inline const sc_lv_base \
574 operator ^ (tp b, const sc_proxy<X> &px) \
593 #undef DEFN_BITWISE_XOR_OP_T_B
597 inline const sc_lv_base
600 sc_lv_base
a(back_cast().
length() +
n);
607 inline const sc_lv_base
610 sc_lv_base
a(back_cast());
622 "positive rotate values, rotate value = ",
n);
625 int len =
x.length();
628 sc_lv_base
a(
x <<
n);
629 sc_lv_base
b(
x >> (
len -
n));
631 for (
int i = 0;
i < sz; ++
i) {
632 x.set_word(
i,
a.get_word(
i) |
b.get_word(
i));
633 x.set_cword(
i,
a.get_cword(
i) |
b.get_cword(
i));
640 inline const sc_lv_base
655 "positive rotate values, rotate value = ",
n);
658 int len =
x.length();
664 for (
int i = 0;
i < sz; ++
i) {
665 x.set_word(
i,
a.get_word(
i) |
b.get_word(
i));
666 x.set_cword(
i,
a.get_cword(
i) |
b.get_cword(
i));
682 inline const sc_lv_base
690 template <
class X,
class Y>
694 const X &
x =
px.back_cast();
696 int x_len =
x.length();
697 int y_len = y.length();
698 if (x_len != y_len) {
702 for (
int i = 0;
i < sz; ++
i) {
703 if (
x.get_word(
i) != y.get_word(
i) ||
704 x.get_cword(
i) != y.get_cword(
i)) {
711 #define DEFN_REL_OP_T(tp) \
714 sc_proxy<X>::operator == (tp b) const \
716 const X &x = back_cast(); \
717 sc_lv_base y(x.length()); \
748 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
751 return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
752 *
a.clone(), *
new sc_lv_base(
b), 3);
756 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
759 return sc_concref_r<sc_lv_base, sc_bitref_r<T> >(
760 *
new sc_lv_base(
a), *
b.clone(), 3);
764 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
767 return sc_concref_r<sc_bitref_r<T>, sc_lv_base>(
768 *
a.clone(), *
new sc_lv_base(
b, 1), 3);
772 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
775 return sc_concref_r<sc_lv_base,sc_bitref_r<T> >(
776 *
new sc_lv_base(
a, 1), *
b.clone(), 3);
780 inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
788 inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
796 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
797 concat(sc_bitref_r<T>
a,
const char *
b)
804 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
805 concat(
const char *
a, sc_bitref_r<T>
b)
812 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
813 concat(sc_bitref_r<T>
a,
const sc_logic &
b)
820 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
821 concat(
const sc_logic &
a, sc_bitref_r<T>
b)
828 inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
836 inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
845 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
853 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
861 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
869 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
877 inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
885 inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
893 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
894 concat(sc_bitref<T>
a,
const char *
b)
901 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
902 concat(
const char *
a, sc_bitref<T>
b)
909 inline sc_concref_r<sc_bitref_r<T>, sc_lv_base>
910 concat(sc_bitref<T>
a,
const sc_logic &
b)
917 inline sc_concref_r<sc_lv_base, sc_bitref_r<T> >
918 concat(
const sc_logic &
a, sc_bitref<T>
b)
925 inline sc_concref_r<sc_bitref_r<T>, sc_bv_base>
933 inline sc_concref_r<sc_bv_base, sc_bitref_r<T> >
957 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
965 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
973 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
976 return sc_concref_r<sc_lv_base, sc_subref_r<T> >(
977 *
new sc_lv_base(
a, 1), *
b.clone(), 3);
981 inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
989 inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
997 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
998 concat(sc_subref_r<T>
a,
const char *
b)
1005 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1006 concat(
const char *
a, sc_subref_r<T>
b)
1013 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
1014 concat(sc_subref_r<T>
a,
const sc_logic &
b)
1021 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1022 concat(
const sc_logic &
a, sc_subref_r<T>
b)
1029 inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
1037 inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
1046 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
1054 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1062 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
1070 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1078 inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
1086 inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
1095 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
1096 concat(sc_subref<T>
a,
const char *
b)
1103 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1104 concat(
const char *
a, sc_subref<T>
b)
1111 inline sc_concref_r<sc_subref_r<T>, sc_lv_base>
1112 concat(sc_subref<T>
a,
const sc_logic &
b)
1119 inline sc_concref_r<sc_lv_base, sc_subref_r<T> >
1120 concat(
const sc_logic &
a, sc_subref<T>
b)
1127 inline sc_concref_r<sc_subref_r<T>, sc_bv_base>
1135 inline sc_concref_r<sc_bv_base, sc_subref_r<T> >
1155 if (!this->reversed()) {
1156 for (
int i =
len - 1;
i >= 0; --
i) {
1157 this->m_obj.set_bit(this->m_lo +
i,
t[
i].value());
1160 for (
int i =
len - 1;
i >= 0; --
i) {
1161 this->m_obj.set_bit(this->m_lo -
i,
t[
i].value());
1168 inline sc_subref<X> &
1173 if (!this->reversed()) {
1174 for (
int i =
len - 1;
i >= 0; --
i) {
1175 this->m_obj.set_bit(this->m_lo +
i,
t[
i].value());
1178 for (
int i =
len - 1;
i >= 0; --
i) {
1179 this->m_obj.set_bit(this->m_lo -
i,
t[
i].value());
1194 template <
class T1,
class T2>
1202 template <
class T1,
class T2>
1210 template <
class T1,
class T2>
1218 template <
class T1,
class T2>
1219 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1222 return sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >(
1223 *
new sc_lv_base(
a, 1), *
b.clone(), 3);
1226 template <
class T1,
class T2>
1227 inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
1234 template <
class T1,
class T2>
1235 inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
1242 template <
class T1,
class T2>
1243 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1244 concat(sc_concref_r<T1, T2>
a,
const char *
b)
1250 template <
class T1,
class T2>
1251 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1252 concat(
const char *
a, sc_concref_r<T1, T2>
b)
1258 template <
class T1,
class T2>
1259 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1260 concat(sc_concref_r<T1, T2>
a,
const sc_logic &
b)
1266 template <
class T1,
class T2>
1267 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1268 concat(
const sc_logic &
a, sc_concref_r<T1, T2>
b)
1274 template <
class T1,
class T2>
1275 inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
1276 concat(sc_concref_r<T1, T2>
a,
bool b)
1282 template <
class T1,
class T2>
1283 inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
1284 concat(
bool a, sc_concref_r<T1, T2>
b)
1291 template <
class T1,
class T2>
1292 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1299 template <
class T1,
class T2>
1300 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1307 template <
class T1,
class T2>
1308 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1315 template <
class T1,
class T2>
1316 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1323 template <
class T1,
class T2>
1324 inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
1331 template <
class T1,
class T2>
1332 inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
1339 template <
class T1,
class T2>
1340 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1341 concat(sc_concref<T1, T2>
a,
const char *
b)
1347 template <
class T1,
class T2>
1348 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1349 concat(
const char *
a, sc_concref<T1, T2>
b)
1355 template <
class T1,
class T2>
1356 inline sc_concref_r<sc_concref_r<T1, T2>, sc_lv_base>
1357 concat(sc_concref<T1, T2>
a,
const sc_logic &
b)
1363 template <
class T1,
class T2>
1364 inline sc_concref_r<sc_lv_base, sc_concref_r<T1, T2> >
1365 concat(
const sc_logic &
a, sc_concref<T1, T2>
b)
1371 template <
class T1,
class T2>
1372 inline sc_concref_r<sc_concref_r<T1, T2>, sc_bv_base>
1373 concat(sc_concref<T1, T2>
a,
bool b)
1379 template <
class T1,
class T2>
1380 inline sc_concref_r<sc_bv_base, sc_concref_r<T1, T2> >
1381 concat(
bool a, sc_concref<T1, T2>
b)
1405 inline sc_concref_r<sc_lv_base, T>
1412 inline sc_concref_r<T, sc_lv_base>
1420 inline sc_concref_r<sc_lv_base, T>
1423 return sc_concref_r<sc_lv_base, T>(
1424 *
new sc_lv_base(
a, 1),
b.back_cast(), 1);
1428 inline sc_concref_r<T, sc_bv_base>
1431 return sc_concref_r<T, sc_bv_base>(
1432 a.back_cast(), *
new sc_bv_base(
b, 1), 2);
1436 inline sc_concref_r<sc_bv_base, T>
1439 return sc_concref_r<sc_bv_base, T>(
1444 inline sc_concref_r<T, sc_lv_base>
1445 concat(
const sc_proxy<T> &
a,
const char *
b)
1451 inline sc_concref_r<sc_lv_base, T>
1452 concat(
const char *
a,
const sc_proxy<T> &
b)
1454 return sc_concref_r<sc_lv_base, T>(*
new sc_lv_base(
a),
b.back_cast(), 1);
1458 inline sc_concref_r<T, sc_lv_base>
1459 concat(
const sc_proxy<T> &
a,
const sc_logic &
b)
1461 return sc_concref_r<T, sc_lv_base>(
1462 a.back_cast(), *
new sc_lv_base(
b, 1), 2);
1466 inline sc_concref_r<sc_lv_base, T>
1467 concat(
const sc_logic &
a,
const sc_proxy<T> &
b)
1469 return sc_concref_r<sc_lv_base, T>(
1470 *
new sc_lv_base(
a, 1),
b.back_cast(), 1);
1474 inline sc_concref_r<T, sc_bv_base>
1475 concat(
const sc_proxy<T> &
a,
bool b)
1477 return sc_concref_r<T, sc_bv_base>(
1478 a.back_cast(), *
new sc_bv_base(
b, 1), 2);
1482 inline sc_concref_r<sc_bv_base, T>
1483 concat(
bool a,
const sc_proxy<T> &
b)
1485 return sc_concref_r<sc_bv_base, T>(
1491 inline sc_concref_r<T, sc_lv_base>
1498 inline sc_concref_r<sc_lv_base, T>
1505 inline sc_concref_r<T, sc_lv_base>
1508 return sc_concref_r<T, sc_lv_base>(
1513 inline sc_concref_r<sc_lv_base, T>
1516 return sc_concref_r<sc_lv_base, T>(
1521 inline sc_concref_r<T, sc_bv_base>
1524 return sc_concref_r<T, sc_bv_base>(
1525 a.back_cast(), *
new sc_bv_base(
b, 1), 2);
1529 inline sc_concref_r<sc_bv_base, T>
1532 return sc_concref_r<sc_bv_base, T>(
1538 inline sc_concref_r<T, sc_lv_base>
1539 concat(sc_proxy<T> &
a,
const char *
b)
1545 inline sc_concref_r<sc_lv_base, T>
1546 concat(
const char *
a, sc_proxy<T> &
b)
1552 inline sc_concref_r<T, sc_lv_base>
1553 concat(sc_proxy<T> &
a,
const sc_logic &
b)
1555 return sc_concref_r<T, sc_lv_base>(
1560 inline sc_concref_r<sc_lv_base, T>
1561 concat(
const sc_logic &
a, sc_proxy<T> &
b)
1563 return sc_concref_r<sc_lv_base, T>(
1568 inline sc_concref_r<T, sc_bv_base>
1571 return sc_concref_r<T, sc_bv_base>(
1572 a.back_cast(), *
new sc_bv_base(
b, 1), 2);
1576 inline sc_concref_r<sc_bv_base, T>
1579 return sc_concref_r<sc_bv_base, T>(
1584 extern template class sc_proxy<sc_lv_base>;
1585 extern template class sc_proxy<sc_bv_base>;
1589 #endif // __SYSTEMC_EXT_DT_BIT_SC_LV_BASE_HH__