summaryrefslogtreecommitdiff
path: root/third_party/g7221/common/stl-files/count.h
blob: 5f2227ef4ef1483a2d14db77fae93cc747ab080b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*
 ===========================================================================
 COUNT.H
 ~~~~~~~

 Prototypes and definitions for counting operations

 These functions, and the ones in basop32.h, makes it possible to
 measure the wMOPS of a codec.

 All functions in this file, and in basop32.h, updates a structure
 so that it will be possible the see how many calls to add, mul mulAdd
 ... that the code made, and estimate the wMOPS (and MIPS) for a
 sertain part of code

 It is also possible to measure the wMOPS separatly for different
 parts of the codec.

 This is done by creating a counter group (getCounterId) for each part
 of the code that one wants a separte measure for. Before a part of
 the code is executed a call to the "setCounter" function is needed to
 identify which counter group to use.

 Currently there is a limit of 255 different counter groups.

 In the end of this file there is a pice of code illustration how the
 functions can be used.

 History
 ~~~~~~~
 09.Aug.1999 V1.0.0 Input to UGST from ETSI AMR (count.h); 
 26.Jan.2000 V1.1.0 Added counter entries for G.723.1's 
                    L_mls(), div_l(), i_mult() [from basop32.c]
 05.Jul.2000 V1.2.0 Added counter entries for 32bit shiftless 
                    operators L_mult0(), L_mac0(), L_msu0()
 ===========================================================================
*/
#ifndef COUNT_H
#define COUNT_H "$Id $"

#define MAXCOUNTERS 256

int getCounterId(char *objectName);
/*
 * Create a counter group, the "objectname" will be used when printing
 * statistics for this counter group.
 *
 * Returns 0 if no more counter groups are available.
 */

void setCounter(int counterId);
/*
 * Defines which counter group to use, default is zero.
 */

void Init_WMOPS_counter (void);
/*
 * Initiates the current counter group.
 */

void Reset_WMOPS_counter (void);
/*
 * Resets the current counter group.
 */

void WMOPS_output (Word16 notPrintWorstWorstCase);
/*
 * Prints the statistics to the screen, if the argument if non zero
 * the statistics for worst worst case will not be printed. This is typically
 * done for dtx frames.
 *
 */

Word32 fwc (void);
/*
 * worst worst case counter.
 *
 * This function calculates the worst possible case that can be reached.
 *
 * This is done by calling this function for each subpart of the calculations
 * for a frame. This function then stores the maximum wMOPS for each part.
 *
 * The WMOPS_output function add together all parts and presents the sum.
 */

void move16 (void);
void move32 (void);
void logic16 (void);
void logic32 (void);
void test (void);
/*
 * The functions above increases the corresponding operation counter for
 * the current counter group.
 */

typedef struct
{
    Word32 add;        /* Complexity Weight of 1 */
    Word32 sub;
    Word32 abs_s;
    Word32 shl;
    Word32 shr;
    Word32 extract_h;
    Word32 extract_l;
    Word32 mult;
    Word32 L_mult;
    Word32 negate;
    Word32 round;
    Word32 L_mac;
    Word32 L_msu;
    Word32 L_macNs;
    Word32 L_msuNs;
    Word32 L_add;      /* Complexity Weight of 2 */
    Word32 L_sub;
    Word32 L_add_c;
    Word32 L_sub_c;
    Word32 L_negate;
    Word32 L_shl;
    Word32 L_shr;
    Word32 mult_r;
    Word32 shr_r;
    Word32 shift_r;
    Word32 mac_r;
    Word32 msu_r;
    Word32 L_deposit_h;
    Word32 L_deposit_l;
    Word32 L_shr_r;    /* Complexity Weight of 3 */
    Word32 L_shift_r;
    Word32 L_abs;
    Word32 L_sat;      /* Complexity Weight of 4 */
    Word32 norm_s;     /* Complexity Weight of 15 */
    Word32 div_s;      /* Complexity Weight of 18 */
    Word32 norm_l;     /* Complexity Weight of 30 */
    Word32 DataMove16; /* Complexity Weight of 1 */
    Word32 DataMove32; /* Complexity Weight of 2 */
    Word32 Logic16;    /* Complexity Weight of 1 */
    Word32 Logic32;    /* Complexity Weight of 2 */
    Word32 Test;       /* Complexity Weight of 2 */
                       /* Counters for G.723.1 basic operators*/
    Word32 L_mls;      /* Complexity Weight of 1 */
    Word32 div_l;      /* Complexity Weight of 1 */
    Word32 i_mult;     /* Complexity Weight of 1 */
    Word32 L_mult0;    /* Complexity Weight of 1 */
    Word32 L_mac0;     /* Complexity Weight of 1 */
    Word32 L_msu0;     /* Complexity Weight of 1 */
                       /* Counters for G.722.1 basic operators*/
    Word32 LU_shl;     /* Complexity Weight of 1 */
    Word32 LU_shr;     /* Complexity Weight of 1 */
}
BASIC_OP;

#ifdef THISISANEXAMPLE_0123456789
/*
  -----------------------------------------------------------------------
  Example of how count.h could be used.
 
  In the example below it is assumed that the init_OBJECT functions
  does not use any calls to counter.h or basic_op.h. If this is the
  case a call to the function Reset_WMOPS_counter() must be done after
  each call to init_OBJECT if these operations is not to be included
  in the statistics.
  -----------------------------------------------------------------------
*/

int main()
{ 
  int spe1Id,spe2Id,cheId;
 
  /* initiate counters and objects */
  spe1Id=getCounterId("Spe 5k8"); 
  setCounter(spe1Id); 
  Init_WMOPS_counter (); 
  init_spe1(...);
 
  spe2Id=getCounterId("Spe 12k2"); 
  setCounter(spe2Id); 
  Init_WMOPS_counter (); 
  init_spe2(...);
 
  cheId=getCounterId("Channel encoder"); 
  setCounter(cheId); 
  Init_WMOPS_counter (); 
  init_che(...); 
  ...
 
  while(data)
  { 
    test();             /* Note this call to test(); */
    if(useSpe1)
      setCounter(spe1Id); 
    else 
      setCounter(spe2Id); 
    Reset_WMOPS_counter();
    speEncode(...);
    WMOPS_output(0);    /* Normal routine for displaying WMOPS info */
    
    setCounter(cheId); 
    Reset_WMOPS_counter();
    preChannelInter(...); fwc(); /* Note the call to fwc() for each part */
    convolve(...); fwc();        /* of the channel encoder. */
    interleave(...); fwc();
    WMOPS_output(0);    /* Normal routine for displaying WMOPS info */
  }
}
#endif /* Example */

#endif /* COUNT_H */