blob: 5f2227ef4ef1483a2d14db77fae93cc747ab080b [file] [log] [blame]
/*
===========================================================================
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 */