diff --git a/src/spicelib/devices/adms/admst/ngspice.xml b/src/spicelib/devices/adms/admst/ngspice.xml
new file mode 100644
index 000000000..e1f1043bd
--- /dev/null
+++ b/src/spicelib/devices/adms/admst/ngspice.xml
@@ -0,0 +1,7852 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #if defined(_DYNAMIC)\n
+
+ int %s;\n
+ double %s=0.0/0.0;\n
+ char* %s;\n
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #endif /*_DYNAMIC*/\n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int %(name);\n
+ double %(name);\n
+ char* %(name);\n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "smpdefs.h"
+#include "$(module)defs.h"
+#include "const.h"
+#include "sperror.h"
+#include "ifsim.h"
+#include "suffix.h"
+
+#define _STATIC
+#define _DYNAMIC
+
+int $(module)temp(GENmodel *inModel, CKTcircuit *ckt)
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+ for ( ; model != NULL; model = model->$(module)nextModel )
+ {
+
+
+ /* loop through all the instances of the model */
+ for (here = model->$(module)instances; here != NULL ; here = here->$(module)nextInstance)
+ {
+
+
+ } /* End of MOSFET Instance */
+ } /* End of Model Instance */
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifndef DEV_$(module)
+#define DEV_$(module)
+
+extern SPICEdev *get_$(module)_info(void);
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "config.h"
+
+#include "devdefs.h"
+
+
+
+
+#include "$(module)itf.h"
+#include "$(module)ext.h"
+#include "$(module)init.h"
+
+SPICEdev $(module)info = {
+ { "$module",
+ "$module created by adms",
+ &$(module)nSize,
+ &$(module)nSize,
+ $(module)names,
+ &$(module)pTSize,
+ $(module)pTable,
+ &$(module)mPTSize,
+ $(module)mPTable,
+#ifdef XSPICE
+/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/
+ NULL, /* This is a SPICE device, it has no MIF info data */
+
+ 0, /* This is a SPICE device, it has no MIF info data */
+ NULL, /* This is a SPICE device, it has no MIF info data */
+
+ 0, /* This is a SPICE device, it has no MIF info data */
+ NULL, /* This is a SPICE device, it has no MIF info data */
+
+ 0, /* This is a SPICE device, it has no MIF info data */
+ NULL, /* This is a SPICE device, it has no MIF info data */
+/*--------------------------- End of SDB fix -------------------------*/
+#endif
+ DEV_DEFAULT
+ },
+
+ $(module)par, /* DEVparam */
+ $(module)mParam, /* DEVmodParam */
+ $(module)load, /* DEVload */
+ $(module)setup, /* DEVsetup */
+ NULL, /* DEVunsetup */
+ $(module)setup, /* DEVpzSetup */
+ $(module)temp, /* DEVtemperature */
+ $(module)trunc, /* DEVtrunc */
+ NULL, /* DEVfindBranch */
+ $(module)acLoad, /* DEVacLoad */
+ NULL, /* DEVaccept */
+ $(module)destroy, /* DEVdestroy */
+ $(module)mDelete, /* DEVmodDelete */
+ $(module)delete, /* DEVdelete */
+ NULL, /* DEVsetic */
+ $(module)ask, /* DEVask */
+ $(module)mAsk, /* DEVmodAsk */
+ $(module)pzLoad, /* DEVpzLoad */
+ NULL, /* DEVconvTest */
+ NULL, /* DEVsenSetup */
+ NULL, /* DEVsenLoad */
+ NULL, /* DEVsenUpdate */
+ NULL, /* DEVsenAcLoad */
+ NULL, /* DEVsenPrint */
+ NULL, /* DEVsenTrunc */
+ NULL, /* DEVdisto */
+ NULL, /* DEVnoise */
+#ifdef CIDER
+ NULL, /* DEVdump */
+ NULL, /* DEVacct */
+#endif
+ &$(module)iSize, /* DEVinstSize */
+ &$(module)mSize /* DEVmodSize */
+
+};
+
+SPICEdev *
+get_$(module)_info(void)
+{
+ return &$(module)info;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifndef _$(module)INIT_H
+#define _$(module)INIT_H
+
+extern IFparm $(module)pTable[ ];
+extern IFparm $(module)mPTable[ ];
+extern char *$(module)names[ ];
+extern int $(module)pTSize;
+extern int $(module)mPTSize;
+extern int $(module)nSize;
+extern int $(module)iSize;
+extern int $(module)mSize;
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifndef __$(module)EXT_H
+#define __$(module)EXT_H
+
+
+
+
+#include "$(module)defs.h"
+
+extern int $(module)par(int,IFvalue*,GENinstance*,IFvalue*);
+extern int $(module)mParam(int,IFvalue*,GENmodel*);
+extern int $(module)load(GENmodel*,CKTcircuit*);
+extern int $(module)setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
+extern int $(module)guesstopology(SMPmatrix *, CKTcircuit *, $(module)model *, $(module)instance *);
+extern int $(module)temp(GENmodel*,CKTcircuit*);
+extern int $(module)ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
+extern int $(module)mAsk(CKTcircuit*,GENmodel *,int, IFvalue*);
+extern int $(module)acLoad(GENmodel *,CKTcircuit*);
+extern int $(module)convTest(GENmodel *,CKTcircuit*);
+extern int $(module)delete(GENmodel*,IFuid,GENinstance**);
+extern int $(module)getic(GENmodel*,CKTcircuit*);
+extern int $(module)mDelete(GENmodel**,IFuid,GENmodel*);
+extern int $(module)noise(int,int,GENmodel*,CKTcircuit*,Ndata*,double*);
+extern int $(module)pzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
+extern int $(module)trunc(GENmodel*,CKTcircuit*,double*);
+extern int $(module)unsetup(GENmodel*,CKTcircuit*);
+extern void $(module)destroy(GENmodel**);
+
+#endif
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#ifndef $(module)
+#define $(module)
+
+#include "cktdefs.h"
+#include "ifsim.h"
+#include "gendefs.h"
+#include "complex.h"
+#include "noisedef.h"
+
+
+
+
+#ifdef $(variable)
+ #warning conflict: $(variable) is declared as a variable of module '$(module)'.
+ #warning conflict: However in the API of ngspice '$(variable)' is also defined as a pragma.
+ #warning conflict: Pragma '$(variable)' will be undefined.
+ #warning conflict: You can solve the confict by renaming variable '$(variable)' in module '$(module)'.
+ #undef $(variable)
+#endif
+
+
+
+
+#ifdef $(variable)
+ #warning conflict: $(node) is declared as a node of module '$(module)'.
+ #warning conflict: However in the API of ngspice '$(node)' is also defined as a pragma.
+ #warning conflict: Pragma '$(node)' will be undefined.
+ #warning conflict: You can solve the confict by renaming variable '$(node)' in module '$(module)'.
+ #undef $(variable)
+#endif
+
+
+#ifdef NGSPICE_DEBUG_OK
+#define NGSPICE_DEBUG \\
+{ \\
+ if(getenv("ngspice_debug")) \\
+ $(module)debug(ckt,model,here); \\
+ else \\
+ { \\
+ printf(" To get more info run your simulation after setting shell variable ngspice_debug to 1\\n"); \\
+ printf(" For example in sh shell just type: export ngspice_debug=1\\n"); \\
+ } \\
+}
+#else
+#define NGSPICE_DEBUG
+#endif
+
+#define EXIT_IF_ISNAN(var) \\
+if(isnan((double) var)) \\
+{ \\
+ printf("%%s:%%i:bug:isnan:"#var"\\n",__FILE__,__LINE__); \\
+ printf("Please send this message to laurent.lemaitre@freescale.com\\n"); \\
+ NGSPICE_DEBUG \\
+ exit(1); /*__asm__ __volatile__ ("int \$03");*/ \\
+} \\
+if(isinf((double) var)) \\
+{ \\
+ printf("%%s:%%i:bug:isinf:"#var"\\n",__FILE__,__LINE__); \\
+ printf("Please send this message to laurent.lemaitre@freescale.com\\n"); \\
+ NGSPICE_DEBUG \\
+ exit(1); /*__asm__ __volatile__ ("int \$03");*/ \\
+}
+
+/* ngspice \$simparam variables
+ gdev (1/Ohms): Additional conductance to be added to nonlinear branches for conductance homotopy convergence algorithm.
+ gmin (1/Ohms): Minimum conductance placed in parallel with nonlinear branches.
+ imax (Amps) : Branch current threshold above which the constitutive relation of a nonlinear branch should be linearized.
+ imelt (Amps) : Branch current threshold indicating device failure.
+ iteration : Iteration number of the analog solver.
+ scale : Scale factor for device instance geometry parameters.
+ shrink : Optical linear shrink factor.
+ simulatorSubversion : The simulator sub-version.
+ simulatorVersion : The simulator version.
+ sourceScaleFactor : Multiplicative factor for independent sources for source stepping homotopy convergence algorithm.
+ tnom degrees (Celsius): Default value of temperature at which model parameters were extracted.
+*/
+
+#define _circuit_gdev ckt->CKTgmin
+#define _circuit_gmin ((ckt->CKTgmin)>(ckt->CKTdiagGmin))?(ckt->CKTgmin):(ckt->CKTdiagGmin)
+#define _circuit_imax 1.0
+#define _circuit_imelt 1.0
+#define _circuit_iteration 1.0
+#define _circuit_scale 1.0
+#define _circuit_shrink 1.0
+#define _circuit_simulatorSubversion 0
+#define _circuit_simulatorVersion 3.5
+#define _circuit_sourceScaleFactor 1.0
+#define _circuit_tnom ckt->CKTnomTemp
+
+#define _circuit_temp ckt->CKTtemp
+#define _scale 1.0
+
+#define _cos(val,arg) val = cos(arg);
+#define _d_cos(val,dval,arg) val = cos(arg); dval = (-sin(arg));
+#define _sin(val,arg) val = sin(arg);
+#define _d_sin(val,dval,arg) val = sin(arg); dval = (cos(arg));
+#define _tan(val,arg) val = tan(arg);
+#define _d_tan(val,dval,arg) val = tan(arg); dval = (1.0/cos(arg)/cos(arg));
+#define _hypot(xy,x,y) xy = sqrt((x)*(x)+(y)*(y));
+#define _dx_hypot(dx,xy,x,y) dx = (x)/(xy);
+#define _dy_hypot(dy,xy,x,y) dy = (y)/(xy);
+#define _max(xy,x,y) xy = ((x)>(y))?(x):(y);
+#define _dx_max(dx,xy,x,y) dx = ((x)>(y))?1.0:0.0;
+#define _dy_max(dy,xy,x,y) dy = ((x)>(y))?0.0:1.0;
+#define _min(xy,x,y) xy = ((x)<(y))?(x):(y);
+#define _dx_min(dx,xy,x,y) dx = ((x)<(y))?1.0:0.0;
+#define _dy_min(dy,xy,x,y) dy = ((x)<(y))?0.0:1.0;
+#define _cosh(val,arg) val = cosh(arg);
+#define _d_cosh(val,dval,arg) val = cosh(arg); dval = (sinh(arg));
+#define _sinh(val,arg) val = sinh(arg);
+#define _d_sinh(val,dval,arg) val = sinh(arg); dval = (cosh(arg));
+#define _tanh(val,arg) val = tanh(arg);
+#define _d_tanh(val,dval,arg) val = tanh(arg); dval = (1.0/cosh(arg)/cosh(arg));
+#define _acos(val,arg) val = acos(arg);
+#define _d_acos(val,dval,arg) val = acos(arg); dval = (-1.0/sqrt(1-arg*arg));
+#define _asin(val,arg) val = asin(arg);
+#define _d_asin(val,dval,arg) val = asin(arg); dval = (+1.0/sqrt(1-arg*arg));
+#define _atan(val,arg) val = atan(arg);
+#define _d_atan(val,dval,arg) val = atan(arg); dval = (+1.0/(1+arg*arg));
+#define _logE(val,arg) val = log(arg);
+#define _d_logE(val,dval,arg) val = log(arg); dval = (1.0/arg);
+#define _log10(val,arg) val = log10(arg);
+#define _d_log10(val,dval,arg) val = log10(arg); dval = (1.0/arg/log(10));
+#define _exp(val,arg) val = exp(arg);
+#define _d_exp(val,dval,arg) val = exp(arg); dval = val;
+#define _sqrt(val,arg) val = sqrt(arg);
+#define _d_sqrt(val,dval,arg) val = sqrt(arg); dval = (1.0/val/2.0);
+#define _pow(xy,x,y) xy = pow(x,y);
+#define _dx_pow(dx,xy,x,y) dx = (x==0.0)?0.0:((y/x)*xy);
+#define _dy_pow(dy,xy,x,y) dy = (x==0.0)?0.0:((log(x)/exp(0.0))*xy);
+
+#define _div1(x,y) ((x)/(y))
+#define _div0(xy,x,y) xy=(x)/(y);
+#define _div(xy,dx,x,y) dx=1/(y); xy=(x)*dx;
+#define _dx_div(dx,xy,x,y)
+#define _dy_div(dy,dx,xy,x,y) dy = -xy*dx;
+
+#define _limexp(val,arg) val = ((arg)<(90)) ? (exp(arg)) : (exp(90)*(1.0+(arg-90)));
+#define _d_limexp(val,dval,arg) val = ((arg)<(90)) ? (exp(arg)) : (exp(90)*(1.0+(arg-90))); dval = val;
+#define _fabs(val,arg) val = fabs(arg);
+#define _d_fabs(val,dval,arg) val = fabs(arg); dval = (((val)>=0)?(+1.0):(-1.0));
+#define _abs(val) ((val)<(0) ? (-(val)):(val))
+
+/* declarations for $(module) MOSFETs */
+
+/* information needed for each instance */
+typedef struct s$(module)instance {
+ struct s$(module)model *$(module)modPtr; /* pointer to model */
+ struct s$(module)instance *$(module)nextInstance; /* pointer to next instance of current model*/
+ IFuid $(module)name; /* pointer to character string naming this instance */
+ int $(module)owner; /* number of owner process */
+ int $(module)state; /* index into state table for this device */
+
+ /* node */
+
+
+
+
+
+
+
+
+
+ /* instance parameters */
+
+
+
+
+
+
+
+
+
+
+
+
+ // noise\n
+
+
+
+
+ /* variables */
+
+
+
+
+
+
+
+
+
+ /* states */
+
+
+
+
+
+ /* pointer to sparse matrix (+ values)*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#define $(module)numStates 0
+
+} $(module)instance ;
+
+
+/* per model data */
+
+typedef struct s$(module)model { /* model structure */
+ int $(module)modType; /* type index of this device type */
+ struct s$(module)model *$(module)nextModel; /* pointer to next possible model in linked list */
+ $(module)instance * $(module)instances; /* pointer to list of instances that have this model */
+ IFuid $(module)modName; /* pointer to the name of this model */
+
+ /* model parameters */
+
+
+
+
+
+
+
+
+
+
+
+
+ /* variable */
+
+
+
+
+
+
+
+
+
+
+} $(module)model;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "$(module)ext.h"
+
+#include "analogfunction.h"
+
+
+#endif /*$(module)*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "const.h"
+#include "cktdefs.h"
+#include "$(module)defs.h"
+#include "ifsim.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)ask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
+{
+ $(module)instance *instance = ($(module)instance*)inst;
+ switch (which) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default:
+ return(-1);
+ }
+ return(-1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "const.h"
+#include "ifsim.h"
+#include "cktdefs.h"
+#include "devdefs.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
+{
+ $(module)model *model = ($(module)model *)inst;
+ switch (which) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default:
+ return(-1);
+ }
+ return(-1);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "const.h"
+#include "ifsim.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)par(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
+{
+ $(module)instance *myinstance = ($(module)instance*)inst;
+ switch (param) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default:
+ return(-1);
+ }
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "const.h"
+#include "ifsim.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)mParam(int param, IFvalue *value, GENmodel *inMod)
+{
+ $(module)model *mod = ($(module)model*)inMod;
+ switch (param) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ default:
+ return(-1);
+ }
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#define NGSPICE_DEBUG_OK
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "$(module)defs.h"
+#include "const.h"
+#include "trandefs.h"
+#include "sperror.h"
+#include "devdefs.h"
+#include "suffix.h"
+
+/*fixme: noise not implemented in ngspice*/
+#define ngspice_flickernoise(p,n,mag,freq,info)\\
+{\\
+}
+#define ngspice_whitenoise(p,n,mag,info)\\
+{\\
+}
+
+#define NP(p) *(ckt->CKTrhsOld+here->p ## Node)
+#define BP(p,n) (NP(p)-NP(n))
+#define DBGNODE(p) printf(#p "=%i - v=%e\\n",here->p ## Node,NP(p));
+
+
+
+#define _STATIC
+#define _DYNAMIC
+#define _DERIVATE
+
+#define _load_static_residual2(p,n,v)\\
+ *(ckt->CKTrhs+here->p ## Node)-=v;\\
+ *(ckt->CKTrhs+here->n ## Node)+=v;
+#define _load_static_residual1(p,v)\\
+ *(ckt->CKTrhs+here->p ## Node)-=v;
+
+#define _load_static_jacobian4(Sp,Sn,Pp,Pn,v)\\
+ _load_static_residual2(Sp,Sn,-v*BP(Pp,Pn))\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pn)+=v;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pn)-=v;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pp)-=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JSVAL_ ## Sn ## _ ## Pn)+=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pn)-=v;\\
+ (here->JSVAL_ ## Sn ## _ ## Pp)-=v;
+#define _load_static_jacobian2s(Sp,Sn,Pp,v)\\
+ _load_static_residual2(Sp,Sn,-v*NP(Pp))\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pp)-=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JSVAL_ ## Sn ## _ ## Pp)-=v;
+#define _load_static_jacobian2p(Sp,Pp,Pn,v)\\
+ _load_static_residual1(Sp,-v*BP(Pp,Pn))\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pn)-=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pn)-=v;
+#define _load_static_jacobian1(Sp,Pp,v)\\
+ _load_static_residual1(Sp,-v*NP(Pp))\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JSVAL_ ## Sp ## _ ## Pp)+=v;
+
+#define _load_dynamic_residual2(p,n,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ int error;\\
+ double unused;\\
+ *(ckt->CKTstate0+here->state_##p##_##n)=v;\\
+ if(ckt->CKTmode & MODEINITTRAN)\\
+ *(ckt->CKTstate1+here->state_##p##_##n)=*(ckt->CKTstate0+here->state_##p##_##n);\\
+ error = NIintegrate(ckt,&unused,&unused,0.0,here->state_##p##_##n);\\
+ if(error) return(error);\\
+ if(ckt->CKTmode & MODEINITTRAN)\\
+ *(ckt->CKTstate1+here->state_##p##_##n+1) = *(ckt->CKTstate0+here->state_##p##_##n+1);\\
+ *(ckt->CKTrhs+here->p##Node)-=*(ckt->CKTstate0+here->state_##p##_##n+1);\\
+ *(ckt->CKTrhs+here->n##Node)+=*(ckt->CKTstate0+here->state_##p##_##n+1);\\
+}
+#define _load_dynamic_residual1(p,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ int error;\\
+ double unused;\\
+ *(ckt->CKTstate0+here->state_##p##_GND)=v;\\
+ if(ckt->CKTmode & MODEINITTRAN)\\
+ *(ckt->CKTstate1+here->state_##p##_GND)=*(ckt->CKTstate0+here->state_##p##_GND);\\
+ error = NIintegrate(ckt,&unused,&unused,0.0,here->state_##p##_GND);\\
+ if(error) return(error);\\
+ if(ckt->CKTmode & MODEINITTRAN)\\
+ *(ckt->CKTstate1+here->state_##p##_GND+1) = *(ckt->CKTstate0+here->state_##p##_GND+1);\\
+ *(ckt->CKTrhs+here->p##Node)-=*(ckt->CKTstate0+here->state_##p##_GND+1);\\
+}
+
+#define _load_dynamic_jacobian4(Sp,Sn,Pp,Pn,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ double geq=(v)*ckt->CKTag[0];\\
+ double ceq=geq*BP(Pp,Pn);\\
+ *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\
+ *(ckt->CKTrhs+here->Sn##Node)-=ceq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pn)+=geq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pn)-=geq;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pp)-=geq;\\
+}\\
+ (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JDVAL_ ## Sn ## _ ## Pn)+=v;\\
+ (here->JDVAL_ ## Sp ## _ ## Pn)-=v;\\
+ (here->JDVAL_ ## Sn ## _ ## Pp)-=v;
+#define _load_dynamic_jacobian2s(Sp,Sn,Pp,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ double geq=(v)*ckt->CKTag[0];\\
+ double ceq=geq*NP(Pp);\\
+ *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\
+ *(ckt->CKTrhs+here->Sn##Node)-=ceq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\
+ *(here->PTR_J_ ## Sn ## _ ## Pp)-=geq;\\
+}\\
+ (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JDVAL_ ## Sn ## _ ## Pp)-=v;
+#define _load_dynamic_jacobian2p(Sp,Pp,Pn,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ double geq=(v)*ckt->CKTag[0];\\
+ double ceq=geq*BP(Pp,Pn);\\
+ *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pn)-=geq;\\
+}\\
+ (here->JDVAL_ ## Sp ## _ ## Pp)+=v;\\
+ (here->JDVAL_ ## Sp ## _ ## Pn)-=v;
+#define _load_dynamic_jacobian1(Sp,Pp,v)\\
+if(ChargeComputationNeeded)\\
+{\\
+ double geq=(v)*ckt->CKTag[0];\\
+ double ceq=geq*NP(Pp);\\
+ *(ckt->CKTrhs+here->Sp##Node)+=ceq;\\
+ *(here->PTR_J_ ## Sp ## _ ## Pp)+=geq;\\
+}\\
+(here->JDVAL_ ## Sp ## _ ## Pp)+=v;
+
+int $(module)load(inModel,ckt)
+ GENmodel *inModel;
+ register CKTcircuit *ckt;
+ /* actually load the current value into the
+ * sparse matrix previously provided
+ */
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+ int ChargeComputationNeeded =
+ ((ckt->CKTmode & (MODEAC | MODETRAN | MODEINITSMSIG)) ||
+ ((ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)))
+ ? 1 : 0;
+
+ for ( ; model != NULL; model = model->$(module)nextModel )
+ {
+ /* loop through all the instances of the model */
+ for (here = model->$(module)instances; here != NULL ; here = here->$(module)nextInstance)
+ {
+{
+
+
+
+
+
+
+
+
+
+
+}
+{
+#include "$module.hxx"
+}
+ } /* End of Instance */
+ } /* End of Model */
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)acLoad(GENmodel *inModel, CKTcircuit *ckt)
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+ for ( ; model != NULL; model = model->$(module)nextModel )
+ {
+ /* loop through all the instances of the model */
+ for (here = model->$(module)instances; here != NULL ; here = here->$(module)nextInstance)
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ } /* End of MOSFET Instance */
+ } /* End of Model Instance */
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "complex.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+ for ( ; model != NULL; model = model->$(module)nextModel )
+ {
+ /* loop through all the instances of the model */
+ for (here = model->$(module)instances; here != NULL ; here = here->$(module)nextInstance)
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ } /* End of MOSFET Instance */
+ } /* End of Model Instance */
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+
+#ifdef STEPDEBUG
+ double debugtemp;
+#endif /* STEPDEBUG */
+
+ for ( ; model != NULL; model = model->$(module)nextModel )
+ {
+ /* loop through all the instances of the model */
+ for (here = model->$(module)instances; here != NULL ; here = here->$(module)nextInstance)
+ {
+#ifdef STEPDEBUG
+ debugtemp = *timeStep;
+#endif /* STEPDEBUG */
+
+
+
+
+ CKTterr(here->state_%s_%s, ckt, timeStep);
+
+
+
+#ifdef STEPDEBUG
+ if(debugtemp != *timeStep)
+ { printf("device %%s reduces step from %%g to %%g\\n",
+ here->$(module)name,debugtemp,*timeStep);
+ }
+#endif /* STEPDEBUG */
+
+ } /* End of Instance */
+ } /* End of Model */
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "smpdefs.h"
+#include "$(module)defs.h"
+#include "const.h"
+#include "sperror.h"
+#include "ifsim.h"
+#include "suffix.h"
+
+int $(module)setup (SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)
+ /* load the $(module) device structure with those pointers needed later
+ * for fast matrix loading
+ */
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance *here;
+
+ /* loop through all the $(module) device models */
+ for ( ;model != NULL ;model = model->$(module)nextModel )
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if(model->%s_Given == FALSE) model->%s=%s;
+
+
+
+
+ for ( here = model->$(module)instances ;here != NULL ; here = here->$(module)nextInstance )
+ {
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if(here->%s_Given == FALSE) here->%s=%s;
+
+
+
+
+
+ /* Internal Nodes */
+ {
+
+
+
+
+
+
+
+ here->%sNode = -1;
+
+ }
+
+ /* set states */
+
+
+
+ here->state_%s_%s = *states; *states += 2;
+
+ /* set Sparse Matrix Pointers */
+
+
+
+ here->PTR_J_%s_%s_required=0;
+
+
+ $(module)guesstopology(matrix,ckt,model,here);
+
+ /* Internal Nodes */
+ {
+ int error;
+ CKTnode *tmp;
+
+
+
+
+
+
+
+
+ if(here->%sNode == -1)
+ {
+ error=CKTmkVolt(ckt,&tmp,here->$(module)name,"$info");
+ if(error) return(error);
+ here->%sNode = tmp->number;
+ }
+
+ }
+
+
+
+ if(here->PTR_J_%s_%s_required==1)
+ {
+
+
+
+
+ here->PTR_J_%s_%s=SMPmakeElt(matrix,here->%sNode,here->%sNode);
+ }
+
+
+ }
+ }
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)delete(GENmodel *inModel, IFuid name, GENinstance **inInst)
+
+{
+ register $(module)model *model = ($(module)model*)inModel;
+ register $(module)instance **fast =($(module)instance**)inInst;
+
+ $(module)instance **prev = NULL;
+ $(module)instance *here;
+
+ for ( ; model ; model = model->$(module)nextModel ) {
+ prev = &(model->$(module)instances);
+ for (here = *prev; here ; here = *prev) {
+ if(here->$(module)name == name || (fast && here==*fast) ) {
+ *prev = here->$(module)nextInstance;
+ FREE(here);
+ return(OK);
+ }
+
+ }
+ }
+ return(E_NODEV);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "$(module)defs.h"
+#include "sperror.h"
+#include "suffix.h"
+
+int $(module)mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
+
+{
+ register $(module)model **model = ($(module)model**)inModel;
+ register $(module)model *modfast =($(module)model*)kill;
+ $(module)instance *here;
+ $(module)instance *prev = NULL;
+ $(module)model **oldmod;
+
+ oldmod = model;
+ for ( ; *model ; model = &((*model)->$(module)nextModel)) {
+ if ((*model)->$(module)modName == modname ||
+ (modfast && *model == modfast))
+ goto delgot;
+ oldmod = model;
+ }
+ return(E_NOMOD);
+
+ delgot:
+ *oldmod = (*model)->$(module)nextModel; /* cut deleted device out of list */
+ for (here = (*model)->$(module)instances; here; here = here->$(module)nextInstance)
+ { if(prev) FREE(prev);
+ prev = here;
+ }
+ if(prev) FREE(prev);
+ FREE(*model);
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "$(module)defs.h"
+#include "suffix.h"
+
+void $(module)destroy(GENmodel **inModel)
+
+{
+ register $(module)model **model = ($(module)model**)inModel;
+ register $(module)instance *here;
+ $(module)instance *prev = NULL;
+ $(module)model *mod = *model;
+ $(module)model *oldmod = NULL;
+
+ for ( ; mod ; mod = mod->$(module)nextModel ) {
+ if (oldmod) FREE(oldmod);
+ oldmod = mod;
+ prev = ($(module)instance *)NULL;
+ for (here = mod->$(module)instances; here ; here = here->$(module)nextInstance) {
+ if(prev) FREE(prev);
+ prev = here;
+ }
+ if(prev) FREE(prev);
+ }
+ if(oldmod) FREE(oldmod);
+ *model = NULL;
+ return;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "cktdefs.h"
+#include "smpdefs.h"
+#include "$(module)defs.h"
+#include "const.h"
+#include "sperror.h"
+#include "ifsim.h"
+#include "suffix.h"
+
+#define jacobian(a,b) here->PTR_J_##a##_##b##_required=1;
+#define static_jacobian4(p,q,r,s) jacobian(p,r) jacobian(p,s) jacobian(q,r) jacobian(q,s)
+#define static_jacobian2s(p,q,r) jacobian(p,r) jacobian(q,r)
+#define static_jacobian2p(p,r,s) jacobian(p,r) jacobian(p,s)
+#define static_jacobian1(p,r) jacobian(p,r)
+#define dynamic_jacobian4(p,q,r,s) jacobian(p,r) jacobian(p,s) jacobian(q,r) jacobian(q,s)
+#define dynamic_jacobian2s(p,q,r) jacobian(p,r) jacobian(q,r)
+#define dynamic_jacobian2p(p,r,s) jacobian(p,r) jacobian(p,s)
+#define dynamic_jacobian1(p,r) jacobian(p,r)
+#define whitenoise_jacobian4(p,q,r,s)
+#define whitenoise_jacobian2s(p,q,r)
+#define whitenoise_jacobian2p(p,r,s)
+#define whitenoise_jacobian1(p)
+#define flickernoise_jacobian4(p,q,r,s)
+#define flickernoise_jacobian2s(p,q,r)
+#define flickernoise_jacobian2p(p,r,s)
+#define flickernoise_jacobian1(p)
+
+
+int $(module)guesstopology (SMPmatrix *matrix, CKTcircuit *ckt, $(module)model *model, $(module)instance *here)
+ /* guess topology */
+{
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int %(name);\n
+ double %(name)=0.0/0.0;\n
+ char* %(name);\n
+
+
+
+
+
+
+ return(OK);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include "ngspice.h"
+#include "devdefs.h"
+#include "$(module)defs.h"
+#include "suffix.h"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+char *$(module)names[] = {
+
+
+
+
+
+
+
+
+
+
+
+
+
+};
+
+int $(module)nSize = NUMELEMS($(module)names);
+int $(module)pTSize = NUMELEMS($(module)pTable);
+int $(module)mPTSize = NUMELEMS($(module)mPTable);
+int $(module)iSize = sizeof($(module)instance);
+int $(module)mSize = sizeof($(module)model);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* arithmetics */
+#define EXP90 1.220403294317841e+039
+#define m00_hypot(v00,x,y) v00 = sqrt((x)*(x)+(y)*(y));
+#define m10_hypot(v10,v00,x,y) v10 = (x)/(v00);
+#define m11_hypot(v11,v00,x,y) v11 = (y)/(v00);
+#define m00_max(v00,x,y) v00 = ((x)>(y))?(x):(y);
+#define m10_max(v10,v00,x,y) v10 = ((x)>(y))?1.0:0.0;
+#define m11_max(v11,v00,x,y) v11 = ((x)>(y))?0.0:1.0;
+#define m00_min(v00,x,y) v00 = ((x)<(y))?(x):(y);
+#define m10_min(v10,v00,x,y) v10 = ((x)<(y))?1.0:0.0;
+#define m11_min(v11,v00,x,y) v11 = ((x)<(y))?0.0:1.0;
+#define m00_pow(v00,x,y) v00 = pow(x,y);
+#define m10_pow(v10,v00,x,y) v10 = (x==0.0)?0.0:(v00)*(y)/(x);
+#define m11_pow(v11,v00,x,y) v11 = (x==0.0)?0.0:(log(x)*(v00));
+#define m00_div(v00,v10,x,y) double v10=1/(y); double v00=(x)*v10;
+#define m10_div(v10,v00,vv,x,y)
+#define m11_div(v11,v00,vv,x,y) double v11 = -v00*vv;
+#define m00_mult(v00,v10,v11,x,y) double v10=(x); double v11=(y); double v00=v10*v11;
+#define m00_add(v00,x,y) double v00=(x)+(y);
+#define m00_cos(v00,x) v00 = cos(x);
+#define m10_cos(v10,v00,x) v10 = (-sin(x));
+#define m00_sin(v00,x) v00 = sin(x);
+#define m10_sin(v10,v00,x) v10 = (cos(x));
+#define m00_tan(v00,x) v00 = tan(x);
+#define m10_tan(v10,v00,x) v10 = (1.0/cos(x)/cos(x));
+#define m00_cosh(v00,x) v00 = cosh(x);
+#define m10_cosh(v10,v00,x) v10 = (sinh(x));
+#define m00_sinh(v00,x) v00 = sinh(x);
+#define m10_sinh(v10,v00,x) v10 = (cosh(x));
+#define m00_tanh(v00,x) v00 = tanh(x);
+#define m10_tanh(v10,v00,x) v10 = (1.0/cosh(x)/cosh(x));
+#define m00_acos(v00,x) v00 = acos(x);
+#define m10_acos(v10,v00,x) v10 = (-1.0/sqrt(1-x*x));
+#define m00_asin(v00,x) v00 = asin(x);
+#define m10_asin(v10,v00,x) v10 = (+1.0/sqrt(1-x*x));
+#define m00_atan(v00,x) v00 = atan(x);
+#define m10_atan(v10,v00,x) v10 = (+1.0/(1+x*x));
+#define m00_logE(v00,x) v00 = log(x);
+#define m10_logE(v10,v00,x) v10 = (1.0/x);
+#define m00_log10(v00,x) v00 = log10(x);
+#define m10_log10(v10,v00,x) v10 = (1.0/x/log(10));
+#define m00_sqrt(v00,x) v00 = sqrt(x);
+#define m10_sqrt(v10,v00,x) v10 = (0.5/v00);
+#define m00_fabs(v00,x) v00 = fabs(x);
+#define m10_fabs(v10,v00,x) v10 = (((x)>=0)?(+1.0):(-1.0));
+#define m00_exp(v00,x) v00 = exp(x);
+#define m10_exp(v10,v00,x) v10 = v00;
+#define m00_abs(v00) ((v00)<(0)?(-(v00)):(v00))
+#define m00_limexp(v00,x) v00 = ((x)<90.0?exp(x):EXP90*(x-89.0));
+#define m10_limexp(v10,v00,x) v10 = ((x)<90.0?(v00):EXP90);
+
+#define m20_logE(v00) (-1.0/v00/v00)
+#define m20_exp(v00) exp(v00)
+#define m20_limexp(v00) ((v00)<90.0?exp(v00):0.0)
+#define m20_sqrt(v00) (-0.25/(v00)/sqrt(v00))
+#define m20_fabs(v00) 0.0
+
+
+
+
+/*wrapper*/
+#define pModel model
+#define pInst here
+#define mint_get_circuit_tempK() _circuit_temp
+#define voltages(n) NP(n)
+#define _DDT(q) q
+#define _DDX
+#define _DERIVATEFORDDX
+
+#define _DERIVATE2
+
+
+
+
+
+inline double _cos(double arg) { return cos(arg); }
+inline double _d0_cos(double arg) { return (-sin(arg)); }
+inline double _sin(double arg) { return sin(arg); }
+inline double _d0_sin(double arg) { return (cos(arg)); }
+inline double _tan(double arg) { return tan(arg); }
+inline double _d0_tan(double arg) { return (1.0/cos(arg)/cos(arg)); }
+inline double _cosh(double arg) { return cosh(arg); }
+inline double _d0_cosh(double arg) { return (sinh(arg)); }
+inline double _sinh(double arg) { return sinh(arg); }
+inline double _d0_sinh(double arg) { return (cosh(arg)); }
+inline double _tanh(double arg) { return tanh(arg); }
+inline double _d0_tanh(double arg) { return (1.0/cosh(arg)/cosh(arg)); }
+inline double _acos(double arg) { return acos(arg); }
+inline double _d0_acos(double arg) { return (-1.0/sqrt(1-arg*arg)); }
+inline double _asin(double arg) { return asin(arg); }
+inline double _d0_asin(double arg) { return (+1.0/sqrt(1-arg*arg)); }
+inline double _atan(double arg) { return atan(arg); }
+inline double _d0_atan(double arg) { return (+1.0/(1+arg*arg)); }
+inline double _logE(double arg) { return log(arg); }
+inline double _d0_logE(double arg) { return (1.0/arg); }
+inline double _log10(double arg) { return log10(arg); }
+inline double _d0_log10(double arg) { return (1.0/arg/log(10)); }
+inline double _exp(double arg) { return exp(arg); }
+inline double _d0_exp(double arg) { return exp(arg); }
+inline double _sqrt(double arg) { return sqrt(arg); }
+inline double _d0_sqrt(double arg) { return (1.0/sqrt(arg)/2.0); }
+inline double _abs(double arg) { return fabs(arg); }
+inline double _d0_abs(double arg) { return (((arg)>=0)?(+1.0):(-1.0)); }
+
+inline double _hypot(double x,double y) { return sqrt((x)*(x)+(y)*(y)); }
+inline double _d0_hypot(double x,double y) { return (x)/sqrt((x)*(x)+(y)*(y)); }
+inline double _d1_hypot(double x,double y) { return (y)/sqrt((x)*(x)+(y)*(y)); }
+
+inline double _max(double x,double y) { return ((x)>(y))?(x):(y); }
+inline double _d0_max(double x,double y) { return ((x)>(y))?1.0:0.0; }
+inline double _d1_max(double x,double y) { return ((x)>(y))?0.0:1.0; }
+
+inline double _min(double x,double y) { return ((x)<(y))?(x):(y); }
+inline double _d0_min(double x,double y) { return ((x)<(y))?1.0:0.0; }
+inline double _d1_min(double x,double y) { return ((x)<(y))?0.0:1.0; }
+
+inline double _pow(double x,double y) { return pow(x,y); }
+inline double _d0_pow(double x,double y) { return (x==0.0)?0.0:((y/x)*pow(x,y)); }
+inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((log(x)/exp(0.0))*pow(x,y)); }
+
+#define _limexp(arg) _exp(val,arg)
+#define _d_limexp(arg) _d_exp(val,dval,arg)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ int
+ double
+ char*
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fabs
+ shrinkl
+ shrinka
+ log10
+ logE
+ limexp
+ limexp
+ %(name)
+
+
+
+
+ $e
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ printf(
+ _warning(
+ _error(
+ _finish(
+ _stop(
+
+
+
+
+
+ %(e(tree))
+ "\\n"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml b/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml
index 6cda44b90..bb289dff5 100644
--- a/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml
+++ b/src/spicelib/devices/adms/admst/ngspiceMakefile.am.xml
@@ -3,7 +3,10 @@