diff --git a/README.shared-xspice b/README.shared-xspice new file mode 100644 index 000000000..4fbbb1f11 --- /dev/null +++ b/README.shared-xspice @@ -0,0 +1,28 @@ +Enabling XSPICE data transfer over the shared ngspice api. + +This branch enhances shared ngspice capability to event driven XSPICE data transfer. + +The shared library (dll) exports three new function: +ngSpice_Init_Evt() provides addresses for two new callback functions. + To be called upon initialization. +ngGet_Evt_NodeInfo() provides info for a specific node. +ngSpice_AllEvtNodes() provides a list of all event nodes. + +There are two new callback functions + +sendinitevt() sends info upon the event nodes: name, type an dcorresponding index +and is calles once per event nodes upon initialization of the circuit. + +sendevt() is called each time, when for a given event node, that is determined +by index, a time step has been accepted and its value has changed. This allows +to immediately make use of that value in the calling process. + +For details on the definitions you may have a look at sharedspice.h. + +There is an example caller file (currently tested only under Windows, +and compiled with Visual Studio) in directory ngspice\visualc\ng_shared_xspice_v. + +There is also a new feature: The 'save' command accepts the flag none of run in +shared mode. Then there is no internal storage of analog output data, they are +still available with the callback function ng_data. The above mentioned example +file now includes a testrun2 to demonstrate this feature. diff --git a/src/frontend/outitf.c b/src/frontend/outitf.c index fcf4163fa..1047ca6d6 100644 --- a/src/frontend/outitf.c +++ b/src/frontend/outitf.c @@ -90,6 +90,8 @@ static bool shouldstop = FALSE; /* Tell simulator to stop next time it asks. */ static bool interpolated = FALSE; static double *valueold, *valuenew; +static bool savenone = FALSE; + /* The two "begin plot" routines share all their internals... */ int @@ -207,6 +209,16 @@ beginPlot(JOB *analysisPtr, CKTcircuit *circuitPtr, char *cktName, char *analNam saves[i].used = 1; continue; } +#ifdef SHARED_MODULE + /* this may happen if shared ngspice*/ + if (cieq(saves[i].name, "none")) { + savenone = TRUE; + saveall = TRUE; + savesused[i] = TRUE; + saves[i].used = 1; + continue; + } +#endif } } @@ -1065,6 +1077,11 @@ plotAddRealValue(dataDesc *desc, double value) { struct dvec *v = desc->vec; +#ifdef SHARED_MODULE + if(savenone) + v->v_length = 0; +#endif + if (v->v_length >= v->v_alloc_length) dvec_extend(v, v->v_length + vlength2delta(v->v_length)); @@ -1086,6 +1103,11 @@ plotAddComplexValue(dataDesc *desc, IFcomplex value) { struct dvec *v = desc->vec; +#ifdef SHARED_MODULE + if (savenone) + v->v_length = 0; +#endif + if (v->v_length >= v->v_alloc_length) dvec_extend(v, v->v_length + vlength2delta(v->v_length));