| /* |
| =========================================================================== |
| 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 */ |