- Timestamp:
- Jan 19, 2008, 12:09:01 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/IPs/systemC/processor/Morpheo/Common/include/BitManipulation.h
r63 r71 11 11 #include <stdint.h> 12 12 #include <iostream> 13 using namespace std;14 13 15 14 namespace morpheo { 16 15 16 //............................................................................ 17 17 // gen_mask .................................................................. 18 //............................................................................ 18 19 19 20 template <typename T> … … 29 30 }; 30 31 32 template <typename T> 33 T gen_mask (uint32_t index_max, uint32_t index_min) 34 { 35 return (gen_mask<T>(index_max-index_min+1)<<index_min); 36 }; 37 38 template <typename T> 39 T gen_mask_not (uint32_t index_max, uint32_t index_min) 40 { 41 return ~(gen_mask<T>(index_max-index_min+1)<<index_min); 42 }; 43 44 //............................................................................ 31 45 // mask, mask_not ............................................................ 32 template <typename T> 33 T mask (uint32_t data, uint32_t index_max, uint32_t index_min) 34 { 35 return (gen_mask<T>(index_max-index_min+1)<<index_min) & data; 36 } 37 38 template <typename T> 39 T mask_not (uint32_t data, uint32_t index_max, uint32_t index_min) 40 { 41 return (~(gen_mask<T>(index_max-index_min+1)<<index_min)) & data; 42 } 43 46 //............................................................................ 47 template <typename T> 48 T mask (T data, uint32_t index_max, uint32_t index_min) 49 { 50 return gen_mask <T>(index_max,index_min) & data; 51 } 52 53 template <typename T> 54 T mask_not (T data, uint32_t index_max, uint32_t index_min) 55 { 56 return gen_mask_not<T>(index_max,index_min) & data; 57 } 58 59 //............................................................................ 44 60 // shift_left_logic, shift_right_logic ....................................... 45 template <typename T> 46 T shift_logic_left (uint32_t size, uint32_t data, uint32_t value) 61 //............................................................................ 62 template <typename T> 63 T shift_logic_left (uint32_t size, T data, T value) 47 64 { 48 65 T mask = gen_mask<T> (size); … … 52 69 53 70 template <typename T> 54 T shift_logic_right (uint32_t size, uint32_t data, uint32_tvalue)71 T shift_logic_right (uint32_t size, T data, T value) 55 72 { 56 73 T mask = gen_mask<T> (size); … … 59 76 } 60 77 78 //............................................................................ 61 79 // shift_logic ............................................................... 62 template <typename T> 63 T shift_logic (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) 80 //............................................................................ 81 template <typename T> 82 T shift_logic (uint32_t size, T data, T value, bool is_direction_left) 64 83 { 65 84 if (is_direction_left == true) … … 69 88 } 70 89 90 //............................................................................ 71 91 // shift_left_arithmetic, shift_right_arithmetic ............................. 72 template <typename T> 73 T shift_arithmetic_left (uint32_t size, uint32_t data, uint32_t value) 92 //............................................................................ 93 template <typename T> 94 T shift_arithmetic_left (uint32_t size, T data, T value) 74 95 { 75 96 bool carry = (data&1) != 0; … … 89 110 90 111 template <typename T> 91 T shift_arithmetic_right (uint32_t size, uint32_t data, uint32_tvalue)112 T shift_arithmetic_right (uint32_t size, T data, T value) 92 113 { 93 114 bool carry = (data&(1<<(size-1))) != 0; … … 105 126 } 106 127 128 //............................................................................ 107 129 // shift_arithmetic .......................................................... 108 template <typename T> 109 T shift_arithmetic (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) 130 //............................................................................ 131 template <typename T> 132 T shift_arithmetic (uint32_t size, T data, T value, bool is_direction_left) 110 133 { 111 134 if (is_direction_left == true) … … 115 138 } 116 139 140 //............................................................................ 117 141 // shift ..................................................................... 118 template <typename T> 119 T shift (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left, bool is_shift_arithmetic) 142 //............................................................................ 143 template <typename T> 144 T shift (uint32_t size, T data, T value, bool is_direction_left, bool is_shift_arithmetic) 120 145 { 121 146 if (is_shift_arithmetic == true) … … 125 150 } 126 151 152 //............................................................................ 127 153 // rotate_left, rotate_right ................................................. 128 129 template <typename T> 130 T rotate_left (uint32_t size, uint32_t data, uint32_tvalue)154 //............................................................................ 155 template <typename T> 156 T rotate_left (uint32_t size, T data, T value) 131 157 { 132 158 T mask = gen_mask<T> (size); … … 137 163 138 164 template <typename T> 139 T rotate_right (uint32_t size, uint32_t data, uint32_tvalue)165 T rotate_right (uint32_t size, T data, T value) 140 166 { 141 167 T mask = gen_mask<T> (size); … … 145 171 } 146 172 173 //............................................................................ 147 174 // rotate .................................................................... 148 template <typename T> 149 T rotate (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) 175 //............................................................................ 176 template <typename T> 177 T rotate (uint32_t size, T data, T value, bool is_direction_left) 150 178 { 151 179 if (is_direction_left == true) … … 155 183 } 156 184 185 //............................................................................ 157 186 // range ..................................................................... 158 template <typename T> 159 T range (uint32_t data, uint32_t index_max, uint32_t index_min) 187 //............................................................................ 188 template <typename T> 189 T range (T data, uint32_t index_max, uint32_t index_min) 160 190 { 161 191 return gen_mask<T>(index_max-index_min+1) & (data << index_min); … … 163 193 164 194 template <typename T> 165 T range ( uint32_tdata, uint32_t nb_bits)195 T range (T data, uint32_t nb_bits) 166 196 { 167 197 return gen_mask<T>(nb_bits) & data; 168 198 } 199 200 //............................................................................ 201 // insert .................................................................... 202 //............................................................................ 203 template <typename T> 204 T insert (T data_old, T data_new, uint32_t index_max, uint32_t index_min) 205 { 206 return (mask<T>(data_new,index_max,index_min) | mask_not<T>(data_old,index_max,index_min)); 207 } 208 209 //............................................................................ 210 // extend .................................................................... 211 //............................................................................ 212 template <typename T> 213 T extend (uint32_t size, T data, bool extend_with_sign, uint32_t nb_bits_keep) 214 { 215 if (size < nb_bits_keep) 216 return data; 217 218 if (extend_with_sign and ((data>>(nb_bits_keep-1))&1)) 219 return data | (mask<T>(gen_mask<T>(size),size-1, nb_bits_keep)); 220 else 221 return data & (mask<T>(gen_mask<T>(size),nb_bits_keep-1, 0)); 222 } 223 224 //............................................................................ 225 // duplicate.................................................................. 226 //............................................................................ 227 228 template <typename T> 229 T duplicate (uint32_t size, T data_src, uint32_t nb_bits, uint32_t index_min) 230 { 231 T data_duplicate = mask<T>((data_src)>>index_min, nb_bits-1, 0); 232 T data_dest = 0; 233 234 for (uint32_t i=0; i < size; i+=nb_bits) 235 data_dest |= (data_duplicate<<i); 236 237 return data_dest; 238 } 239 240 template <typename T> 241 T duplicate (uint32_t size, T data_src, uint32_t nb_bits) 242 { 243 return duplicate<T> (size,data_src,nb_bits,0); 244 } 245 246 169 247 }; // end namespace morpheo 170 248
Note: See TracChangeset
for help on using the changeset viewer.