You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
2.7 KiB
119 lines
2.7 KiB
/**********
|
|
Copyright 1991 Regents of the University of California. All rights reserved.
|
|
**********/
|
|
|
|
#include "ngspice.h"
|
|
#include <stdio.h>
|
|
#include "ifsim.h"
|
|
#include "iferrmsg.h"
|
|
#include "cktdefs.h"
|
|
#include "sensdefs.h"
|
|
|
|
#include "analysis.h"
|
|
|
|
/* ARGSUSED */
|
|
int
|
|
SENSsetParam(CKTcircuit *ckt, void *anal, int which, IFvalue *value)
|
|
{
|
|
SENS_AN *sinfo = (SENS_AN *) anal;
|
|
|
|
switch(which) {
|
|
|
|
case SENS_POS:
|
|
sinfo->output_pos = (CKTnode *) value->nValue;
|
|
sinfo->output_neg = NULL;
|
|
sinfo->output_volt = 1;
|
|
sinfo->step_type = SENS_DC;
|
|
break;
|
|
|
|
case SENS_NEG:
|
|
sinfo->output_neg = (CKTnode *) value->nValue;
|
|
break;
|
|
|
|
case SENS_SRC:
|
|
sinfo->output_src = value->uValue;
|
|
sinfo->output_volt = 0;
|
|
sinfo->step_type = SENS_DC;
|
|
break;
|
|
|
|
case SENS_NAME:
|
|
sinfo->output_name = value->sValue;
|
|
break;
|
|
|
|
case SENS_START:
|
|
sinfo->start_freq = value->rValue;
|
|
break;
|
|
|
|
case SENS_STOP:
|
|
sinfo->stop_freq = value->rValue;
|
|
break;
|
|
|
|
case SENS_STEPS:
|
|
sinfo->n_freq_steps = value->iValue;
|
|
break;
|
|
|
|
case SENS_DEC:
|
|
sinfo->step_type = SENS_DECADE;
|
|
break;
|
|
|
|
case SENS_OCT:
|
|
sinfo->step_type = SENS_OCTAVE;
|
|
break;
|
|
|
|
case SENS_LIN:
|
|
sinfo->step_type = SENS_LINEAR;
|
|
break;
|
|
|
|
case SENS_DC:
|
|
sinfo->step_type = SENS_DC;
|
|
break;
|
|
|
|
case SENS_DEFTOL:
|
|
sinfo->deftol = value->rValue;
|
|
break;
|
|
|
|
case SENS_DEFPERTURB:
|
|
sinfo->defperturb = value->rValue;
|
|
break;
|
|
|
|
default:
|
|
return(E_BADPARM);
|
|
}
|
|
return(OK);
|
|
}
|
|
|
|
|
|
static IFparm SENSparms[] = {
|
|
/* TF like parameters */
|
|
{ "outpos", SENS_POS, IF_SET|IF_ASK|IF_NODE, "output positive node" },
|
|
{ "outneg", SENS_NEG, IF_SET|IF_ASK|IF_NODE, "output negative node" },
|
|
{ "outsrc", SENS_SRC, IF_SET|IF_ASK|IF_INSTANCE, "output current" },
|
|
{ "outname", SENS_NAME, IF_SET|IF_ASK|IF_STRING,
|
|
"Name of output variable" },
|
|
|
|
/* AC parameters */
|
|
{ "start", SENS_START, IF_SET|IF_ASK|IF_REAL, "starting frequency" },
|
|
{ "stop", SENS_STOP, IF_SET|IF_ASK|IF_REAL, "ending frequency" },
|
|
{ "numsteps", SENS_STEPS,IF_SET|IF_ASK|IF_INTEGER,
|
|
"number of frequencies"},
|
|
{ "dec", SENS_DEC, IF_SET|IF_FLAG, "step by decades" },
|
|
{ "oct", SENS_OCT, IF_SET|IF_FLAG, "step by octaves" },
|
|
{ "lin", SENS_LIN, IF_SET|IF_FLAG, "step linearly" },
|
|
{ "dc", SENS_DC, IF_SET|IF_FLAG, "analysis at DC" },
|
|
};
|
|
|
|
SPICEanalysis SENSinfo = {
|
|
{
|
|
"SENS",
|
|
"Sensitivity analysis",
|
|
sizeof(SENSparms)/sizeof(IFparm),
|
|
SENSparms
|
|
},
|
|
sizeof(SENS_AN),
|
|
FREQUENCYDOMAIN,
|
|
1,
|
|
SENSsetParam,
|
|
SENSask,
|
|
NULL,
|
|
sens_sens
|
|
};
|