view 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 source

/***********************************************************************
 *
 *   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");
}