21 #ifndef __TLM_ENDIAN_CONV_H__ 22 #define __TLM_ENDIAN_CONV_H__ 146 #define uchar unsigned char 148 #define TLM_END_CONV_DONT_UNDEF_UCHAR 155 class tlm_endian_context;
171 if(dbuf_size > 0)
delete [] new_dbuf;
172 if(bebuf_size > 0)
delete [] new_bebuf;
190 if(len <= dbuf_size)
return;
191 if(dbuf_size > 0)
delete [] new_dbuf;
192 new_dbuf =
new uchar[len];
196 if(len <= bebuf_size)
return;
197 if(bebuf_size > 0)
delete [] new_bebuf;
198 new_bebuf =
new uchar[len];
204 global_tlm_endian_context_pool.
push(
this);
230 tc = global_tlm_endian_context_pool.
pop();
267 for(ptrdiff_t i=0; i!=
sizeof(D); i++) tmp[i] = c;
273 operator bool()
const {
return b;}
313 int orig_stream_width,
int sizeof_databus,
317 for(
int orig_sword = 0, new_sword = 0; new_sword < new_len;
318 new_sword += new_stream_width, orig_sword += orig_stream_width) {
321 for(
int orig_dword = orig_sword;
322 orig_dword < orig_sword + orig_stream_width; orig_dword +=
sizeof(D)) {
324 for(
int curr_byte = orig_dword +
sizeof(D) - 1;
325 curr_byte >= orig_dword; curr_byte--) {
327 ptrdiff_t he_index = ((ie_addr++) ^ (sizeof_databus - 1))
328 - new_start_address + new_sword;
329 COPY(ie_data+curr_byte,
330 ie_be+(curr_byte % be_length),
331 he_data+he_index, he_be+he_index);
340 template<
class DATAWORD>
inline void 354 template<
class DATAWORD>
inline void 357 tc->
from_f = &(tlm_from_hostendian_generic<DATAWORD>);
363 if(s_width >= length) s_width = length;
364 int nr_stream_words = length/s_width;
369 & ~(sizeof_databus - 1));
371 int new_stream_width = end_address - new_address + sizeof_databus;
372 int new_length = new_stream_width * nr_stream_words;
396 loop_generic0<DATAWORD, ©_dbtrue0>(new_length,
397 new_stream_width, s_width, sizeof_databus, tc->
address,
401 loop_generic0<DATAWORD, ©_db0>(new_length,
402 new_stream_width, s_width, sizeof_databus, tc->
address,
408 loop_generic0<DATAWORD, ©_btrue0>(new_length,
409 new_stream_width, s_width, sizeof_databus, tc->
address,
413 loop_generic0<DATAWORD, ©_b0>(new_length,
414 new_stream_width, s_width, sizeof_databus, tc->
address,
427 *((D *)dest1) = *((D *)src1);
428 *((D *)dest2) = tlm_bool<D>::TLM_TRUE;
433 *((D *)dest1) = *((D *)src1);
434 *((D *)dest2) = *((D *)src2);
439 *((D *)dest2) = tlm_bool<D>::TLM_TRUE;
444 *((D *)dest2) = *((D *)src2);
454 *((D *)src1) = *((D *)dest1);
458 *((D *)dest1) = tlm_bool<D>::TLM_FALSE;
467 void FILLFALSE(
uchar *dest1),
void FILLFALSEuchar(
uchar *dest1)>
469 int bytes_left,
int len0,
int lenN,
int sizeof_databus,
471 ptrdiff_t d2b_src = bsrc - src;
472 ptrdiff_t d2b_dest = bdest - dest;
473 uchar *original_dest = dest;
477 if((src >= start) && (src < end)) {
478 for(
int i=0; i<len0; i++) {
479 COPYuchar(src, src+d2b_src, dest, dest+d2b_dest);
484 if(bytes_left <= 0)
return int(dest - original_dest);
486 for(
int i=0; i<len0; i++) {
487 FILLFALSEuchar(dest+d2b_dest);
492 src -= 2 *
sizeof(D);
495 for(
unsigned int i=1; i<sizeof_databus/
sizeof(D); i++) {
496 if((src >= start) && (src < end)) {
497 COPY(src, src+d2b_src, dest, dest+d2b_dest);
498 bytes_left -=
sizeof(D);
500 FILLFALSE(dest+d2b_dest);
503 if(bytes_left <= 0)
return int(dest - original_dest);
508 if((src >= start) && (src < end)) {
509 for(
int i=0; i<lenN; i++) {
510 COPYuchar(src, src+d2b_src, dest, dest+d2b_dest);
515 if(bytes_left <= 0)
return int(dest - original_dest);
517 for(
int i=0; i<lenN; i++) {
518 FILLFALSEuchar(dest+d2b_dest);
523 src += 2 * sizeof_databus;
530 template<
class DATAWORD>
inline void 535 int d_mask =
sizeof(DATAWORD) - 1;
536 int a_offset =
static_cast<int>(tc->
address & b_mask);
537 int len0 = (sizeof_databus - a_offset) & d_mask;
538 int lenN =
sizeof(DATAWORD) - len0;
541 uchar *d = ptrdiff_t(((sizeof_databus - a_offset) & ~d_mask) + lenN) + d_start;
545 loop_word1<DATAWORD, ©_dbytrue1<DATAWORD>,
546 ©_dbytrue1<uchar>, &no_b1<DATAWORD>, &no_b1<uchar> >(
547 tc->
length, len0, lenN, sizeof_databus, d_start, d_end, d,
550 loop_word1<DATAWORD, ©_dbyb1<DATAWORD>,
551 ©_dbyb1<uchar>, &no_b1<DATAWORD>, &no_b1<uchar> >(
552 tc->
length, len0, lenN, sizeof_databus, d_start, d_end, d,
561 template<
class DATAWORD>
inline void 564 tc->
from_f = &(tlm_from_hostendian_word<DATAWORD>);
568 int d_mask =
sizeof(DATAWORD) - 1;
570 int a_offset =
static_cast<int>(txn->
get_address() & b_mask);
571 int len0 = (sizeof_databus - a_offset) & d_mask;
572 int lenN =
sizeof(DATAWORD) - len0;
575 uchar *d = ptrdiff_t(((sizeof_databus - a_offset) & ~d_mask) + lenN) + d_start;
592 &true_b1<uchar>, &false_b1<DATAWORD>, &false_b1<uchar> >(
594 d_start, d_end, d, 0, new_data, new_be));
598 ©_b1<uchar>, &false_b1<DATAWORD>, &false_b1<uchar> >(
607 ©_d1<uchar>, &false_b1<DATAWORD>, &false_b1<uchar> >(
609 d_start, d_end, d, 0, new_data, new_be));
613 ©_db1<uchar>, &false_b1<DATAWORD>, &false_b1<uchar> >(
629 template<
class D>
inline void copy_d2(D *src1, D *src2, D *dest1, D *dest2) {
633 template<
class D>
inline void copy_db2(D *src1, D *src2, D *dest1, D *dest2) {
639 inline void copy_dbyb2(D *src1, D *src2, D *dest1, D *dest2) {
643 template<
class D,
void COPY(D *src1, D *src2, D *dest1, D *dest2)>
645 int words,
int words_per_bus) {
646 ptrdiff_t src1to2 = (
char *)src2 - (
char *)src1;
647 ptrdiff_t dest1to2 = (
char *)dest2 - (
char *)dest1;
649 D *done = src1 + ptrdiff_t(words);
651 src1 += ptrdiff_t(words_per_bus - 1);
654 COPY(src1, (D *)(src1to2+(
char *)src1), dest1, (D *)(dest1to2+(
char *)dest1));
656 if((--src1) < bus_start) {
657 bus_start += ptrdiff_t(words_per_bus);
658 if(bus_start == done)
break;
659 src1 = bus_start + ptrdiff_t(words_per_bus - 1);
667 template<
class DATAWORD>
inline void 669 int words_per_bus = sizeof_databus/
sizeof(DATAWORD);
670 if(words_per_bus == 1)
return;
678 loop_aligned2<DATAWORD, ©_d2<DATAWORD> >(
680 0, (DATAWORD *)(tc->
data_ptr), 0, words, words_per_bus);
686 loop_aligned2<DATAWORD, ©_dbyb2<DATAWORD> >(
689 (DATAWORD *)(tc->
data_ptr), 0, words, words_per_bus);
697 template<
class DATAWORD>
inline void 700 tc->
from_f = &(tlm_from_hostendian_aligned<DATAWORD>);
703 int words_per_bus = sizeof_databus/
sizeof(DATAWORD);
704 if(words_per_bus == 1)
return;
708 DATAWORD *original_data = (DATAWORD *)(txn->
get_data_ptr());
714 if(original_be == 0) {
718 loop_aligned2<DATAWORD, ©_d2<DATAWORD> >(original_data, 0,
720 words, words_per_bus);
734 loop_aligned2<DATAWORD, ©_db2<DATAWORD> >(original_data, original_be,
741 loop_aligned2<DATAWORD, ©_d2<DATAWORD> >(original_be, 0,
743 words, words_per_bus);
752 template<
class DATAWORD>
inline void 760 template<
class DATAWORD>
inline void 763 tc->
from_f = &(tlm_from_hostendian_single<DATAWORD>);
770 (sizeof_databus - (a & mask) -
sizeof(DATAWORD)));
783 #ifndef TLM_END_CONV_DONT_UNDEF_UCHAR 790 #endif // multiple-inclusion protection
void tlm_from_hostendian(tlm_generic_payload *txn)
unsigned int get_byte_enable_length() const
void set_address(const sc_dt::uint64 address)
unsigned int get_data_length() const
void get_extension(T *&ext) const
void tlm_to_hostendian_aligned(tlm_generic_payload *txn, unsigned int sizeof_databus)
tlm_endian_context * establish_context(tlm_generic_payload *txn)
void tlm_from_hostendian_aligned(tlm_generic_payload *txn, unsigned int sizeof_databus)
void copy_from(tlm_extension_base const &)
unsigned char * get_byte_enable_ptr() const
void copy_d2(D *src1, D *src2, D *dest1, D *dest2)
void set_byte_enable_length(const unsigned int byte_enable_length)
void copy_dbyb0(uchar *src1, uchar *, uchar *dest1, uchar *dest2)
tlm_endian_context * next
void tlm_to_hostendian_generic(tlm_generic_payload *txn, unsigned int sizeof_databus)
void copy_b0(uchar *, uchar *src2, uchar *, uchar *dest2)
void copy_db0(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
void copy_dbytrue1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
void tlm_from_hostendian_word(tlm_generic_payload *txn, unsigned int sizeof_databus)
void set_data_ptr(unsigned char *data)
void copy_dbyb1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
tlm_endian_context * pop()
uint64 const sc_uint_base int b
void false_b1(uchar *dest1)
void copy_dbtrue0(uchar *src1, uchar *, uchar *dest1, uchar *dest2)
void establish_dbuf(int len)
void copy_d1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
sc_dt::uint64 new_address
void set_streaming_width(const unsigned int streaming_width)
void push(tlm_endian_context *c)
#define TLM_BYTE_DISABLED
void loop_aligned2(D *src1, D *src2, D *dest1, D *dest2, int words, int words_per_bus)
tlm_endian_context * first
void copy_db2(D *src1, D *src2, D *dest1, D *dest2)
void tlm_from_hostendian_generic(tlm_generic_payload *txn, unsigned int sizeof_databus)
void tlm_from_hostendian_single(tlm_generic_payload *txn, unsigned int sizeof_databus)
static D make_uchar_array(uchar c)
int loop_word1(int bytes_left, int len0, int lenN, int sizeof_databus, uchar *start, uchar *end, uchar *src, uchar *bsrc, uchar *dest, uchar *bdest)
void(* from_f)(tlm_generic_payload *txn, unsigned int sizeof_databus)
void copy_db1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
sc_dt::uint64 get_address() const
void tlm_to_hostendian_word(tlm_generic_payload *txn, unsigned int sizeof_databus)
void copy_btrue0(uchar *, uchar *, uchar *, uchar *dest2)
void tlm_to_hostendian_single(tlm_generic_payload *txn, unsigned int sizeof_databus)
void set_data_length(const unsigned int length)
void copy_dbyb2(D *src1, D *src2, D *dest1, D *dest2)
tlm_extension_base * clone() const
tlm_endian_context_pool()
void establish_bebuf(int len)
void copy_b1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
~tlm_endian_context_pool()
unsigned int get_streaming_width() const
void true_b1(uchar *src1, uchar *src2, uchar *dest1, uchar *dest2)
void set_byte_enable_ptr(unsigned char *byte_enable)
static tlm_endian_context_pool global_tlm_endian_context_pool
unsigned char * get_data_ptr() const
T * set_extension(T *ext)
void loop_generic0(int new_len, int new_stream_width, int orig_stream_width, int sizeof_databus, sc_dt::uint64 orig_start_address, sc_dt::uint64 new_start_address, int be_length, uchar *ie_data, uchar *ie_be, uchar *he_data, uchar *he_be)