278 lines
7.0 KiB
C
278 lines
7.0 KiB
C
/*----------------------------------------------------------------------------
|
|
|
|
H I S T S I M
|
|
|
|
A simulated histogram memory for regression tests.
|
|
|
|
All the counting error stuff is redirected to a regression counter; see
|
|
documentation there. This just adds data handling.
|
|
|
|
copyright: see file COPYRIGHT
|
|
|
|
Mark Koennecke, October 2006
|
|
----------------------------------------------------------------------------*/
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <math.h>
|
|
#include "fortify.h"
|
|
#include "sics.h"
|
|
#include "countdriv.h"
|
|
#include "counter.h"
|
|
#include "stringdict.h"
|
|
#include "HistMem.h"
|
|
#include "HistDriv.i"
|
|
#include "histsim.h"
|
|
|
|
static int iSet = 0;
|
|
static HistInt iSetVal = 0;
|
|
static HistMode eHistMode;
|
|
/*--------------------------------------------------------------------------*/
|
|
static int RegressConfig(pHistDriver self, SConnection * pCon,
|
|
pStringDict pOption, SicsInterp * pSics)
|
|
{
|
|
int i, iLength = 1, status;
|
|
char pData[132];
|
|
float fFail;
|
|
pCounterDriver count;
|
|
|
|
count = (pCounterDriver) self->pPriv;
|
|
|
|
if (eHistMode == eHTOF) {
|
|
for (i = 0; i < self->data->rank; i++) {
|
|
iLength *= self->data->iDim[i];
|
|
}
|
|
iLength *= self->data->nTimeChan;
|
|
}
|
|
|
|
/*
|
|
deal with error settings
|
|
*/
|
|
status = StringDictGet(pOption, "errortype", pData, 131);
|
|
if (status) {
|
|
|
|
fFail = atof(pData);
|
|
count->Set(count, "errortype", 1, fFail);
|
|
}
|
|
status = StringDictGet(pOption, "recover", pData, 131);
|
|
if (status) {
|
|
|
|
fFail = atof(pData);
|
|
count->Set(count, "recover", 1, fFail);
|
|
}
|
|
status = StringDictGet(pOption, "finish", pData, 131);
|
|
if (status) {
|
|
|
|
fFail = atof(pData);
|
|
count->Set(count, "finish", 1, fFail);
|
|
}
|
|
|
|
/*
|
|
configured test value
|
|
*/
|
|
status = StringDictGet(pOption, "testval", pData, 131);
|
|
if (status) {
|
|
iSet = 1;
|
|
iSetVal = atoi(pData);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressStart(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
pDriv->fPreset = self->fCountPreset;
|
|
pDriv->eMode = self->eCount;
|
|
return pDriv->Start(pDriv);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressPause(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
pDriv->fPreset = self->fCountPreset;
|
|
pDriv->eMode = self->eCount;
|
|
return pDriv->Pause(pDriv);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
static int RegressContinue(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
pDriv->fPreset = self->fCountPreset;
|
|
pDriv->eMode = self->eCount;
|
|
return pDriv->Continue(pDriv);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressHalt(pHistDriver self)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->Halt(pDriv);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressGetCountStatus(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
float fControl;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->GetStatus(pDriv, &fControl);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressGetError(pHistDriver self, int *iCode, char *pError,
|
|
int iLen)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->GetError(pDriv, iCode, pError, iLen);
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressTryAndFixIt(pHistDriver self, int iCode)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->TryAndFixIt(pDriv, iCode);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
static int RegressGetData(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
|
|
return pDriv->ReadValues(pDriv);
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
static int RegressGetHistogram(pHistDriver self, SConnection * pCon,
|
|
int i, int iStart, int iEnd,
|
|
HistInt * lData)
|
|
{
|
|
int ii;
|
|
|
|
if (i < 0) {
|
|
SCWrite(pCon, "ERROR: histogram out of range", eError);
|
|
return 0;
|
|
}
|
|
|
|
if (iSet == 1) {
|
|
for (ii = iStart; ii < iEnd; ii++) {
|
|
lData[ii - iStart] = iSetVal;
|
|
}
|
|
} else {
|
|
for (ii = iStart; ii < iEnd; ii++) {
|
|
lData[ii - iStart] = random();
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
static int RegressSetHistogram(pHistDriver self, SConnection * pCon,
|
|
int i, int iStart, int iEnd,
|
|
HistInt * lData)
|
|
{
|
|
iSet = 1;
|
|
iSetVal = lData[0];
|
|
return 1;
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
static int RegressPreset(pHistDriver self, SConnection * pCon,
|
|
HistInt iVal)
|
|
{
|
|
iSet = 1;
|
|
iSetVal = iVal;
|
|
return 1;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
static int RegressFreePrivate(pHistDriver self)
|
|
{
|
|
pCounterDriver pDriv;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
DeleteCounterDriver(pDriv);
|
|
return 1;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
static long RegressGetMonitor(pHistDriver self, int i, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
long lVal;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->lCounts[i];
|
|
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*/
|
|
static float RegressGetTime(pHistDriver self, SConnection * pCon)
|
|
{
|
|
pCounterDriver pDriv;
|
|
long lVal;
|
|
|
|
pDriv = (pCounterDriver) self->pPriv;
|
|
return pDriv->fTime;
|
|
|
|
}
|
|
|
|
/*-------------------------------------------------------------------------*/
|
|
pHistDriver CreateRegressHM(pStringDict pOpt)
|
|
{
|
|
pHistDriver pNew = NULL;
|
|
|
|
/* create the general driver */
|
|
pNew = CreateHistDriver(pOpt);
|
|
if (!pNew) {
|
|
return NULL;
|
|
}
|
|
|
|
/* put a Regresscounter in */
|
|
pNew->pPriv = (void *) NewRegressCounter("HistoRegress");
|
|
if (!pNew->pPriv) {
|
|
DeleteHistDriver(pNew);
|
|
return NULL;
|
|
}
|
|
|
|
/* configure all those functions */
|
|
pNew->Configure = RegressConfig;
|
|
pNew->Start = RegressStart;
|
|
pNew->Halt = RegressHalt;
|
|
pNew->GetCountStatus = RegressGetCountStatus;
|
|
pNew->GetError = RegressGetError;
|
|
pNew->TryAndFixIt = RegressTryAndFixIt;
|
|
pNew->GetData = RegressGetData;
|
|
pNew->GetHistogram = RegressGetHistogram;
|
|
pNew->SetHistogram = RegressSetHistogram;
|
|
pNew->GetMonitor = RegressGetMonitor;
|
|
pNew->GetTime = RegressGetTime;
|
|
pNew->Preset = RegressPreset;
|
|
pNew->FreePrivate = RegressFreePrivate;
|
|
pNew->Pause = RegressPause;
|
|
pNew->Continue = RegressContinue;
|
|
StringDictAddPair(pOpt, "errortype", "0");
|
|
StringDictAddPair(pOpt, "recover", "1");
|
|
StringDictAddPair(pOpt, "testval", "0");
|
|
|
|
return pNew;
|
|
}
|