sharedspice.c, .h: fcn to initialize Sync, fcn to set breakpoint, callback fcn to read vsrc external inputs
This commit is contained in:
parent
89ae9e36a6
commit
e929275cdf
|
|
@ -209,6 +209,18 @@ typedef int (BGThreadRunning)(bool, void*);
|
||||||
void* return pointer received from caller
|
void* return pointer received from caller
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* callback functions
|
||||||
|
addresses received from caller with ngSpice_Init_Sync() function
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ask for VSRC EXTERNAL value */
|
||||||
|
typedef int (GetVSRCData)(double*, double, char*, void*);
|
||||||
|
/*
|
||||||
|
double* return voltage value
|
||||||
|
double actual time
|
||||||
|
char* node name
|
||||||
|
void* return pointer received from caller
|
||||||
|
*/
|
||||||
|
|
||||||
/* ngspice initialization,
|
/* ngspice initialization,
|
||||||
printfcn: pointer to callback function for reading printf, fprintf
|
printfcn: pointer to callback function for reading printf, fprintf
|
||||||
|
|
@ -223,6 +235,12 @@ IMPEXP
|
||||||
int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit,
|
int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit,
|
||||||
SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData);
|
SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData);
|
||||||
|
|
||||||
|
/* initialization of synchronizing functions
|
||||||
|
vsrcdat: pointer to callback function for retrieving a voltage source value
|
||||||
|
ident: pointer to integer unique to this shared library (defaults to 0)
|
||||||
|
*/
|
||||||
|
IMPEXP
|
||||||
|
int ngSpice_Init_Sync(GetVSRCData *vsrcdat, int *ident, void *userData);
|
||||||
|
|
||||||
/* Caller may send ngspice commands to ngspice.dll.
|
/* Caller may send ngspice commands to ngspice.dll.
|
||||||
Commands are executed immediately */
|
Commands are executed immediately */
|
||||||
|
|
@ -263,6 +281,10 @@ char** ngSpice_AllVecs(char* plotname);
|
||||||
IMPEXP
|
IMPEXP
|
||||||
bool ngSpice_running(void);
|
bool ngSpice_running(void);
|
||||||
|
|
||||||
|
/* set a breakpoint in ngspice */
|
||||||
|
IMPEXP
|
||||||
|
bool ngSpice_SetBkpt(double time);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,7 @@ int sh_vfprintf(FILE *f, const char *fmt, va_list args);
|
||||||
int sh_fputsll(const char *input, FILE* outf);
|
int sh_fputsll(const char *input, FILE* outf);
|
||||||
|
|
||||||
int sh_ExecutePerLoop(void);
|
int sh_ExecutePerLoop(void);
|
||||||
|
double getvsrcval(double, char*);
|
||||||
int sh_vecinit(runDesc *run);
|
int sh_vecinit(runDesc *run);
|
||||||
|
|
||||||
void shared_exit(int status);
|
void shared_exit(int status);
|
||||||
|
|
@ -200,6 +201,8 @@ void sighandler_sharedspice(int num);
|
||||||
|
|
||||||
void wl_delete_first(wordlist **wlstart, wordlist **wlend);
|
void wl_delete_first(wordlist **wlstart, wordlist **wlend);
|
||||||
|
|
||||||
|
int add_bkpt(void);
|
||||||
|
|
||||||
#if !defined(low_latency)
|
#if !defined(low_latency)
|
||||||
static char* outstorage(char*, bool);
|
static char* outstorage(char*, bool);
|
||||||
static void printsend(void);
|
static void printsend(void);
|
||||||
|
|
@ -214,6 +217,7 @@ static ControlledExit* ngexit;
|
||||||
static SendData* datfcn;
|
static SendData* datfcn;
|
||||||
static SendInitData* datinitfcn;
|
static SendInitData* datinitfcn;
|
||||||
static BGThreadRunning* bgtr;
|
static BGThreadRunning* bgtr;
|
||||||
|
static GetVSRCData* getvdat;
|
||||||
static pvector_info myvec = NULL;
|
static pvector_info myvec = NULL;
|
||||||
char **allvecs = NULL;
|
char **allvecs = NULL;
|
||||||
char **allplots = NULL;
|
char **allplots = NULL;
|
||||||
|
|
@ -222,6 +226,7 @@ static bool nostatuswanted = FALSE;
|
||||||
static bool nodatawanted = FALSE;
|
static bool nodatawanted = FALSE;
|
||||||
static bool nodatainitwanted = FALSE;
|
static bool nodatainitwanted = FALSE;
|
||||||
static bool nobgtrwanted = FALSE;
|
static bool nobgtrwanted = FALSE;
|
||||||
|
static bool wantvdat = FALSE;
|
||||||
static bool immediate = FALSE;
|
static bool immediate = FALSE;
|
||||||
static bool coquit = FALSE;
|
static bool coquit = FALSE;
|
||||||
static jmp_buf errbufm, errbufc;
|
static jmp_buf errbufm, errbufc;
|
||||||
|
|
@ -241,6 +246,9 @@ mutexType fputsMutex;
|
||||||
static bool is_initialized = FALSE;
|
static bool is_initialized = FALSE;
|
||||||
static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first";
|
static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first";
|
||||||
|
|
||||||
|
/* identifier for this ngspice invocation */
|
||||||
|
static int ng_ident = 0;
|
||||||
|
|
||||||
|
|
||||||
static struct plot *
|
static struct plot *
|
||||||
get_plot_byname(char* plotname)
|
get_plot_byname(char* plotname)
|
||||||
|
|
@ -477,6 +485,26 @@ ngSpice_running (void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Initialise external voltage source */
|
||||||
|
IMPEXP
|
||||||
|
int
|
||||||
|
ngSpice_Init_Sync(GetVSRCData* vsrcdat, int *ident, void *userData)
|
||||||
|
{
|
||||||
|
getvdat = vsrcdat;
|
||||||
|
/* set userdata, but don't overwrite with NULL */
|
||||||
|
if (userData)
|
||||||
|
userptr = userData;
|
||||||
|
/* set ngspice shared lib identification number */
|
||||||
|
ng_ident = *ident;
|
||||||
|
/* if caller sends NULL, don't try to retrieve voltage */
|
||||||
|
if (getvdat) {
|
||||||
|
wantvdat = TRUE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Initialise ngspice and setup native methods */
|
/* Initialise ngspice and setup native methods */
|
||||||
IMPEXP
|
IMPEXP
|
||||||
int
|
int
|
||||||
|
|
@ -803,6 +831,67 @@ char** ngSpice_AllVecs(char* plotname)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static double *bkpttmp = NULL;
|
||||||
|
static int bkpttmpsize = 0;
|
||||||
|
|
||||||
|
/* set a breakpoint in ngspice */
|
||||||
|
IMPEXP
|
||||||
|
bool ngSpice_SetBkpt(double time)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
CKTcircuit *ckt = NULL;
|
||||||
|
|
||||||
|
if (!ft_curckt || !ft_curckt->ci_ckt) {
|
||||||
|
fprintf(cp_err, "Error: no circuit loaded.\n");
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ckt = ft_curckt->ci_ckt;
|
||||||
|
if (ckt->CKTbreakSize == 0) {
|
||||||
|
/* breakpoints have not yet been set up, so store here preliminary
|
||||||
|
and add with fcn add_bkpt() called from DCTran() */
|
||||||
|
if (bkpttmp == NULL) {
|
||||||
|
bkpttmp = TMALLOC(double, bkpttmpsize + 1);
|
||||||
|
if(bkpttmp == NULL)
|
||||||
|
return(FALSE);
|
||||||
|
bkpttmpsize++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bkpttmp = TREALLOC(double, bkpttmp, bkpttmpsize + 1);
|
||||||
|
bkpttmpsize++;
|
||||||
|
}
|
||||||
|
bkpttmp[bkpttmpsize-1] = time;
|
||||||
|
error = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
error = CKTsetBreak(ckt, time);
|
||||||
|
if(error)
|
||||||
|
return(FALSE);
|
||||||
|
return(TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* add the preliminary breakpoints to the list.
|
||||||
|
called from dctran.c */
|
||||||
|
int
|
||||||
|
add_bkpt(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int error = 0;
|
||||||
|
CKTcircuit *ckt = ft_curckt->ci_ckt;
|
||||||
|
|
||||||
|
if((bkpttmp) && (bkpttmpsize > 0)) {
|
||||||
|
for (i = 0; i < bkpttmpsize; i++)
|
||||||
|
error = CKTsetBreak(ckt, bkpttmp[i]);
|
||||||
|
FREE(bkpttmp);
|
||||||
|
bkpttmpsize = 0;
|
||||||
|
}
|
||||||
|
if(error)
|
||||||
|
return(error);
|
||||||
|
return(OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*------------------------------------------------------*/
|
/*------------------------------------------------------*/
|
||||||
/* Redefine the vfprintf() functions for callback */
|
/* Redefine the vfprintf() functions for callback */
|
||||||
/*------------------------------------------------------*/
|
/*------------------------------------------------------*/
|
||||||
|
|
@ -1591,3 +1680,20 @@ int sh_vecinit(runDesc *run)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* issue callback to request external voltage data for source vname */
|
||||||
|
double
|
||||||
|
getvsrcval(double time, char *vname)
|
||||||
|
{
|
||||||
|
double vval;
|
||||||
|
if (!wantvdat) {
|
||||||
|
fprintf(stderr, "Error: No callback supplied for source %s\n", vname);
|
||||||
|
shared_exit(EXIT_BAD);
|
||||||
|
return(EXIT_BAD);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* callback fcn */
|
||||||
|
getvdat(&vval, time, vname, userptr);
|
||||||
|
return vval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue