FreeCalypso > hg > efr-experiments
diff src/count.c @ 0:56410792419a
src: original EFR source from ETSI
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 03 Apr 2024 05:31:37 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/count.c Wed Apr 03 05:31:37 2024 +0000 @@ -0,0 +1,153 @@ +/*********************************************************************** + * + * This file contains functions for the automatic complexity calculation + * +*************************************************************************/ + +#include <stdio.h> +#include "typedef.h" +#include "count.h" + +/* Global counter variable for calculation of complexity weight */ + +BASIC_OP counter; + +const BASIC_OP op_weight = +{ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 4, 15, 18, 30, 1, 2, 1, 2, 2 +}; + +/* local variable */ + +#define NbFuncMax 1024 + +static Word16 funcid, nbframe; +static Word32 glob_wc, wc[NbFuncMax]; +static float total_wmops; + +static Word32 LastWOper; + +Word32 TotalWeightedOperation () +{ + Word16 i; + Word32 tot, *ptr, *ptr2; + + tot = 0; + ptr = (Word32 *) &counter; + ptr2 = (Word32 *) &op_weight; + for (i = 0; i < (sizeof (counter) / sizeof (Word32)); i++) + + { + tot += ((*ptr++) * (*ptr2++)); + } + + return ((Word32) tot); +} + +Word32 DeltaWeightedOperation () +{ + Word32 NewWOper, delta; + + NewWOper = TotalWeightedOperation (); + delta = NewWOper - LastWOper; + LastWOper = NewWOper; + return (delta); +} + +void move16 (void) +{ + counter.DataMove16++; +} + +void move32 (void) +{ + counter.DataMove32++; +} + +void test (void) +{ + counter.Test++; +} + +void logic16 (void) +{ + counter.Logic16++; +} + +void logic32 (void) +{ + counter.Logic32++; +} + +void Init_WMOPS_counter (void) +{ + Word16 i; + + /* reset function weight operation counter variable */ + + for (i = 0; i < NbFuncMax; i++) + wc[i] = (Word32) 0; + glob_wc = 0; + nbframe = 0; + total_wmops = 0.0; + +} + +void Reset_WMOPS_counter (void) +{ + Word16 i; + Word32 *ptr; + + ptr = (Word32 *) &counter; + for (i = 0; i < (sizeof (counter) / sizeof (Word32)); i++) + + { + *ptr++ = 0; + } + LastWOper = 0; + + funcid = 0; /* new frame, set function id to zero */ +} + +Word32 fwc (void) /* function worst case */ +{ + Word32 tot; + + tot = DeltaWeightedOperation (); + if (tot > wc[funcid]) + wc[funcid] = tot; + + funcid++; + + return (tot); +} + +void WMOPS_output (Word16 dtx_mode) +{ + Word16 i; + Word32 tot, tot_wc; + + tot = TotalWeightedOperation (); + if (tot > glob_wc) + glob_wc = tot; + + fprintf (stderr, "WMOPS=%.2f", ((float) tot) * 0.00005); + + nbframe++; + total_wmops += ((float) tot) * 0.00005; + fprintf (stderr, " Average=%.2f", total_wmops / (float) nbframe); + + fprintf (stderr, " WorstCase=%.2f", ((float) glob_wc) * 0.00005); + + /* Worst worst case printed only when not in DTX mode */ + if (dtx_mode == 0) + { + tot_wc = 0L; + for (i = 0; i < funcid; i++) + tot_wc += wc[i]; + fprintf (stderr, " WorstWC=%.2f", ((float) tot_wc) * 0.00005); + } + fprintf (stderr, "\n"); +}