source: trunk/IPs/systemC/processor/Morpheo/Include/BitManipulation.h @ 2

Last change on this file since 2 was 2, checked in by kane, 17 years ago

Import Morpheo

File size: 4.2 KB
Line 
1#ifndef morpheo_BitManipulation
2#define morpheo_BitManipulation
3
4/*
5 * $Id$
6 *
7 * [ Description ]
8 *
9 */
10
11#include <stdint.h>
12#include <iostream>
13using namespace std;
14
15namespace morpheo              {
16
17  // gen_mask .....................................
18
19  template <typename T>
20  T gen_mask       (uint32_t size) 
21  { 
22    T mask = 0; 
23    for (uint32_t i=0; i<size; i++)
24      {
25        mask <<= 1;
26        mask  |= 1;
27      }
28    return mask;
29  };
30
31  // shift_left_logic, shift_right_logic ..........
32  template <typename T>
33  T shift_logic_left (uint32_t size, uint32_t data, uint32_t value) 
34  {
35    T mask = gen_mask<T> (size);
36
37    return (mask & ((mask & data) << value));
38  }
39
40  template <typename T>
41  T shift_logic_right (uint32_t size, uint32_t data, uint32_t value) 
42  {
43    T mask = gen_mask<T> (size);
44
45    return (mask & ((mask & data) >> value));
46  }
47
48  // shift_logic ..................................
49  template <typename T>
50  T shift_logic      (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left)
51  {
52    if (is_direction_left == true)
53      return shift_logic_left  <T> (size, data, value);
54    else
55      return shift_logic_right <T> (size, data, value);
56  }
57
58  // shift_left_arithmetic, shift_right_arithmetic
59  template <typename T>
60  T shift_arithmetic_left (uint32_t size, uint32_t data, uint32_t value) 
61  {
62    bool carry = (data&1) != 0;
63
64    if (carry == false)
65      return shift_logic_left <T> (size,data,value);
66    else
67      {
68        if (value > size)
69          return gen_mask<T> (size);
70
71        T mask = gen_mask<T> (value);
72        return shift_logic_left <T> (size,data,value) | mask;
73      }
74  }
75
76
77  template <typename T>
78  T shift_arithmetic_right (uint32_t size, uint32_t data, uint32_t value) 
79  {
80    bool carry = (data&(1<<(size-1))) != 0;
81
82    if (carry == false)
83      return shift_logic_right <T> (size,data,value);
84    else
85      {
86        if (value > size)
87          return gen_mask<T> (size);
88       
89        T mask = gen_mask<T> (value) << (size-value);
90        return ((shift_logic_right <T> (size,data,value)) | mask);
91      }
92  }
93
94  // shift_arithmetic .............................
95  template <typename T>
96  T shift_arithmetic      (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left)
97  {
98    if (is_direction_left == true)
99      return shift_arithmetic_left  <T> (size, data, value);
100    else
101      return shift_arithmetic_right <T> (size, data, value);
102  }
103
104  // shift ........................................
105  template <typename T>
106  T shift            (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left, bool is_shift_arithmetic)
107  {
108    if (is_shift_arithmetic == true)
109      return shift_arithmetic <T> (size, data, value, is_direction_left);
110    else
111      return shift_logic      <T> (size, data, value, is_direction_left);
112  }
113
114  // rotate_left, rotate_right ....................
115
116  template <typename T>
117  T rotate_left    (uint32_t size, uint32_t data, uint32_t value) 
118  {
119    T mask        = gen_mask<T> (size);
120    T rotate_mask = gen_mask<T> (value);
121    T rotate      = rotate_mask & shift_logic_right<T>(size,data,size-value);
122    return (mask & (shift_logic_left <T> (size, data, value) | rotate));
123  }
124
125  template <typename T>
126  T rotate_right    (uint32_t size, uint32_t data, uint32_t value) 
127  {
128    T mask        = gen_mask<T> (size);
129    T rotate_mask = gen_mask<T> (value);
130    T rotate      = shift_logic_left <T> (size,rotate_mask & data,size-value);
131    return (mask & (shift_logic_right<T> (size, data, value) | rotate));
132  }
133
134  // rotate .......................................
135  template <typename T>
136  T rotate         (uint32_t size, uint32_t data, uint32_t value, bool is_direction_left) 
137  {
138    if (is_direction_left == true)
139      return rotate_left  <T> (size, data, value);
140    else
141      return rotate_right <T> (size, data, value);
142  }
143
144  // range ........................................
145  template <typename T>
146  T range          (uint32_t size, uint32_t data, uint32_t index_max, uint32_t index_min) 
147  {
148    return gen_mask<T>(index_max-index_min+1) & shift_logic_left<T> (size, data, index_min);
149  }
150
151  template <typename T>
152  T range          (uint32_t size, uint32_t data, uint32_t nb_bits) 
153  {
154    return gen_mask<T>(nb_bits) & data;
155  }
156
157
158}; // end namespace morpheo             
159
160#endif
Note: See TracBrowser for help on using the repository browser.