9 #include <JANA/JException.h>
15 uint32_t
swap_bank(uint32_t *outbuff, uint32_t *inbuff, uint32_t len)
24 if(len < 2)
throw JException(
"Attempt to swap bank with len<2", __FILE__, __LINE__);
28 uint32_t bank_len = outbuff[0];
29 if((bank_len+1) > len){
31 ss <<
"WARNING: Bank length word exceeds valid words in buffer (" << bank_len+1 <<
" > " << len <<
")";
32 throw JException(ss.str(), __FILE__, __LINE__);
35 throw JException(
"EVIO bank length word is zero in swap_bank!", __FILE__, __LINE__);
38 uint32_t type = (outbuff[1]>>8) & 0xFF;
39 uint32_t Nwords = bank_len - 1;
40 uint32_t Nswapped = 2;
45 swap_block((uint64_t*)&inbuff[2], Nwords/2, (uint64_t*)&outbuff[2]);
56 swap_block((uint16_t*)&inbuff[2], Nwords*2, (uint16_t*)&outbuff[2]);
62 if( inbuff!=outbuff ) memcpy((uint8_t*)&outbuff[2], (uint8_t*)&inbuff[2], Nwords*
sizeof(uint32_t));
66 while(Nswapped < (Nwords+2)){
67 uint32_t N =
swap_tagsegment(&outbuff[Nswapped], &inbuff[Nswapped], (Nwords+2)-Nswapped);
68 if(N == 0)
return Nswapped;
74 while(Nswapped < (Nwords+2)){
75 uint32_t N =
swap_segment(&outbuff[Nswapped], &inbuff[Nswapped], (Nwords+2)-Nswapped);
76 if(N == 0)
return Nswapped;
82 while(Nswapped < (Nwords+2)){
83 uint32_t N =
swap_bank(&outbuff[Nswapped], &inbuff[Nswapped], (Nwords+2)-Nswapped);
84 if(N == 0)
return Nswapped;
90 ss <<
"WARNING: unknown bank type (0x" << hex << type << dec <<
")";
91 throw JException(ss.str(), __FILE__, __LINE__);
106 if(len < 1)
throw JException(
"Attempt to swap segment with len<1");
110 uint32_t bank_len = outbuff[0] & 0xFFFF;
111 if((bank_len) > len){
113 ss <<
"Segment length word exceeds valid words in buffer (" << bank_len <<
" > " << len <<
")";
114 throw JException(ss.str(), __FILE__, __LINE__);
117 uint32_t type = (outbuff[0]>>16) & 0x0F;
118 uint32_t Nwords = bank_len;
119 uint32_t Nswapped = 1;
124 swap_block((uint64_t*)&inbuff[1], Nwords/2, (uint64_t*)&outbuff[1]);
135 swap_block((uint16_t*)&inbuff[1], Nwords*2, (uint16_t*)&outbuff[1]);
141 if( inbuff!=outbuff ) memcpy((uint8_t*)&outbuff[1], (uint8_t*)&inbuff[1], Nwords*
sizeof(uint32_t));
152 uint32_t
swap_segment(uint32_t *outbuff, uint32_t *inbuff, uint32_t len)
156 if(len < 1)
throw JException(
"Attempt to swap segment with len<1");
160 uint32_t bank_len = outbuff[0] & 0xFFFF;
161 if((bank_len) > len){
163 ss <<
"Segment length word exceeds valid words in buffer (" << bank_len <<
" > " << len <<
")";
164 throw JException(ss.str(), __FILE__, __LINE__);
167 uint32_t type = (outbuff[0]>>16) & 0x3F;
168 uint32_t Nwords = bank_len;
169 uint32_t Nswapped = 1;
174 swap_block((uint64_t*)&inbuff[1], Nwords/2, (uint64_t*)&outbuff[1]);
185 swap_block((uint16_t*)&inbuff[1], Nwords*2, (uint16_t*)&outbuff[1]);
191 if( inbuff!=outbuff ) memcpy((uint8_t*)&outbuff[1], (uint8_t*)&inbuff[1], Nwords*
sizeof(uint32_t));
uint32_t swap_bank(uint32_t *outbuff, uint32_t *inbuff, uint32_t len)
void swap_block(uint16_t *inbuff, uint16_t len, uint16_t *outbuff)
uint32_t swap_tagsegment(uint32_t *outbuff, uint32_t *inbuff, uint32_t len)
uint32_t swap_segment(uint32_t *outbuff, uint32_t *inbuff, uint32_t len)