From e98da264e173b2c12ff1c5d1529d3e83f057d184 Mon Sep 17 00:00:00 2001 From: gdiso Date: Tue, 1 May 2007 03:34:34 +0000 Subject: [PATCH] Numerical Device Interface --- src/spicelib/devices/ndev/Makefile.am | 30 +++++ src/spicelib/devices/ndev/ndev.c | 39 ++++++ src/spicelib/devices/ndev/ndevaccept.c | 70 +++++++++++ src/spicelib/devices/ndev/ndevacld.c | 26 ++++ src/spicelib/devices/ndev/ndevask.c | 28 +++++ src/spicelib/devices/ndev/ndevdefs.h | 75 ++++++++++++ src/spicelib/devices/ndev/ndevdel.c | 38 ++++++ src/spicelib/devices/ndev/ndevdest.c | 36 ++++++ src/spicelib/devices/ndev/ndevdump.c | 40 ++++++ src/spicelib/devices/ndev/ndevexch.h | 69 +++++++++++ src/spicelib/devices/ndev/ndevext.h | 29 +++++ src/spicelib/devices/ndev/ndevinit.c | 85 +++++++++++++ src/spicelib/devices/ndev/ndevinit.h | 13 ++ src/spicelib/devices/ndev/ndevitf.h | 10 ++ src/spicelib/devices/ndev/ndevload.c | 104 ++++++++++++++++ src/spicelib/devices/ndev/ndevmdel.c | 20 +++ src/spicelib/devices/ndev/ndevmpar.c | 38 ++++++ src/spicelib/devices/ndev/ndevparm.c | 30 +++++ src/spicelib/devices/ndev/ndevpzld.c | 22 ++++ src/spicelib/devices/ndev/ndevset.c | 161 +++++++++++++++++++++++++ src/spicelib/devices/ndev/ndevtemp.c | 27 +++++ src/spicelib/devices/ndev/ndevtrun.c | 23 ++++ 22 files changed, 1013 insertions(+) create mode 100644 src/spicelib/devices/ndev/Makefile.am create mode 100644 src/spicelib/devices/ndev/ndev.c create mode 100644 src/spicelib/devices/ndev/ndevaccept.c create mode 100644 src/spicelib/devices/ndev/ndevacld.c create mode 100644 src/spicelib/devices/ndev/ndevask.c create mode 100644 src/spicelib/devices/ndev/ndevdefs.h create mode 100644 src/spicelib/devices/ndev/ndevdel.c create mode 100644 src/spicelib/devices/ndev/ndevdest.c create mode 100644 src/spicelib/devices/ndev/ndevdump.c create mode 100644 src/spicelib/devices/ndev/ndevexch.h create mode 100644 src/spicelib/devices/ndev/ndevext.h create mode 100644 src/spicelib/devices/ndev/ndevinit.c create mode 100644 src/spicelib/devices/ndev/ndevinit.h create mode 100644 src/spicelib/devices/ndev/ndevitf.h create mode 100644 src/spicelib/devices/ndev/ndevload.c create mode 100644 src/spicelib/devices/ndev/ndevmdel.c create mode 100644 src/spicelib/devices/ndev/ndevmpar.c create mode 100644 src/spicelib/devices/ndev/ndevparm.c create mode 100644 src/spicelib/devices/ndev/ndevpzld.c create mode 100644 src/spicelib/devices/ndev/ndevset.c create mode 100644 src/spicelib/devices/ndev/ndevtemp.c create mode 100644 src/spicelib/devices/ndev/ndevtrun.c diff --git a/src/spicelib/devices/ndev/Makefile.am b/src/spicelib/devices/ndev/Makefile.am new file mode 100644 index 000000000..1067f9972 --- /dev/null +++ b/src/spicelib/devices/ndev/Makefile.am @@ -0,0 +1,30 @@ +## Process this file with automake to produce Makefile.in + +noinst_LIBRARIES = libndev.a + +libndev_a_SOURCES = \ + ndev.c \ + ndevacld.c \ + ndevaccept.c \ + ndevask.c \ + ndevdefs.h \ + ndevdel.c \ + ndevdest.c \ + ndevdump.c \ + ndevext.h \ + ndevinit.c \ + ndevinit.h \ + ndevitf.h \ + ndevload.c \ + ndevmdel.c \ + ndevmpar.c \ + ndevparm.c \ + ndevpzld.c \ + ndevset.c \ + ndevtemp.c \ + ndevtrun.c + + +INCLUDES = -I$(top_srcdir)/src/include + +MAINTAINERCLEANFILES = Makefile.in diff --git a/src/spicelib/devices/ndev/ndev.c b/src/spicelib/devices/ndev/ndev.c new file mode 100644 index 000000000..66bcd4998 --- /dev/null +++ b/src/spicelib/devices/ndev/ndev.c @@ -0,0 +1,39 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + +#include "ngspice.h" +#include "devdefs.h" +#include "ndevdefs.h" +#include "suffix.h" + + +IFparm NDEVpTable[] = { /* parameters */ + /* numerical-device models no longer have parameters */ + /* one is left behind to keep the table from being empty */ + IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), +}; + +IFparm NDEVmPTable[] = { /* model parameters */ + IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), + IP("remote", NDEV_REMOTE, IF_STRING, "Remote computer run device simulation"), + IP("port", NDEV_PORT, IF_INTEGER, "Remote port") +}; + +char *NDEVnames[] = { + "pin1", + "pin2", + "pin3", + "pin4", + "pin5", + "pin6", + "pin7" +}; + +int NDEVnSize = NUMELEMS(NDEVnames); +int NDEVpTSize = NUMELEMS(NDEVpTable); +int NDEVmPTSize = NUMELEMS(NDEVmPTable); +int NDEViSize = sizeof(NDEVinstance); +int NDEVmSize = sizeof(NDEVmodel); diff --git a/src/spicelib/devices/ndev/ndevaccept.c b/src/spicelib/devices/ndev/ndevaccept.c new file mode 100644 index 000000000..9796b3b50 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevaccept.c @@ -0,0 +1,70 @@ +/********** +Copyright 1990 Regents of the University of California. All rights reserved. +Author: 1987 Thomas L. Quarles +**********/ + +#include "ngspice.h" +#include "const.h" +#include "ifsim.h" +#include "cktdefs.h" +#include "devdefs.h" +#include "ndevdefs.h" +#include "complex.h" +#include "sperror.h" +#include "suffix.h" + + + +int NDEVaccept(CKTcircuit *ckt, GENmodel *inModel) +{ + NDEVmodel *model = (NDEVmodel *)inModel; + NDEVinstance *here; + /* loop through all the ndev models */ + for( ; model != NULL; model = model->NDEVnextModel ) + { + /* loop through all the instances of the model */ + for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) + { + + if (here->NDEVowner != ARCHme) continue; + + /* set ckt accept_flag */ + here->CKTInfo.DEV_CALL = NDEV_ACCEPT; + here->CKTInfo.CKTmode = ckt->CKTmode; + here->CKTInfo.time = ckt->CKTtime; + here->CKTInfo.dt = ckt->CKTdelta; + here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; + here->CKTInfo.accept_flag = 1; + send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); + } + } + return (OK); + /* NOTREACHED */ +} + + +int NDEVconvTest(GENmodel *inModel, CKTcircuit *ckt) +{ + NDEVmodel *model = (NDEVmodel *)inModel; + NDEVinstance *here; + + for( ; model != NULL; model = model->NDEVnextModel) { + for(here=model->NDEVinstances;here!=NULL;here = here->NDEVnextInstance){ + if (here->NDEVowner != ARCHme) continue; + /* + * get convergence information from ndev + */ + here->CKTInfo.DEV_CALL = NDEV_CONVERGINCE_TEST; + send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); + recv(model->sock,&here->CKTInfo,sizeof(sCKTinfo),MSG_WAITALL); + + if (here->CKTInfo.convergence_flag<0) { + /* no reason to continue - we've failed... */ + ckt->CKTnoncon++; + ckt->CKTtroubleElt = (GENinstance *) here; + return(OK); + } + } + } + return(OK); +} diff --git a/src/spicelib/devices/ndev/ndevacld.c b/src/spicelib/devices/ndev/ndevacld.c new file mode 100644 index 000000000..e33f0a878 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevacld.c @@ -0,0 +1,26 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +/* + * Function to load the COMPLEX circuit matrix using the small signal + * parameters saved during a previous DC operating point analysis. + */ + +#include "ngspice.h" +#include "cktdefs.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "complex.h" +#include "suffix.h" + + +int +NDEVacLoad(inModel, ckt) + GENmodel *inModel; + CKTcircuit *ckt; +{ + + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevask.c b/src/spicelib/devices/ndev/ndevask.c new file mode 100644 index 000000000..cc3e6618e --- /dev/null +++ b/src/spicelib/devices/ndev/ndevask.c @@ -0,0 +1,28 @@ +/********** +Copyright 1990 Regents of the University of California. All rights reserved. +Author: 1987 Thomas L. Quarles +**********/ + +#include "ngspice.h" +#include "const.h" +#include "ifsim.h" +#include "cktdefs.h" +#include "devdefs.h" +#include "ndevdefs.h" +#include "complex.h" +#include "sperror.h" +#include "suffix.h" + + +/* ARGSUSED */ +int +NDEVask(ckt, inInst, which, value, select) + CKTcircuit *ckt; + GENinstance *inInst; + int which; + IFvalue *value; + IFvalue *select; +{ + return (OK); + /* NOTREACHED */ +} diff --git a/src/spicelib/devices/ndev/ndevdefs.h b/src/spicelib/devices/ndev/ndevdefs.h new file mode 100644 index 000000000..0a17c00bd --- /dev/null +++ b/src/spicelib/devices/ndev/ndevdefs.h @@ -0,0 +1,75 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + +#ifndef NDEV_H +#define NDEV_H + + +/* circuit level includes */ +#include "ifsim.h" +#include "inpmacs.h" +#include "cktdefs.h" +#include "gendefs.h" +#include "ndevexch.h" + +/* network function */ +#include +#include /* IPv4 socket address structres. */ +#include /* Access to DNS lookups. */ +#include /* inet_ntop function. */ +#include /* Socket functions. */ + +/* information needed per instance */ +typedef struct sNDEVinstance { + struct sNDEVmodel *NDEVmodPtr;/* back pointer to model */ + struct sNDEVinstance *NDEVnextInstance; /* pointer to next instance + * of current model */ + IFuid NDEVname; /* pointer to character string naming this + * instance */ + int NDEVowner; /* number of owner process */ + int NDEVstate; /* pointer to start of state vector for diode */ + int pin[7]; /* max 7 terminals are allowed */ + int term; /* the real number of terminals */ + void *node[7]; /* the array of CKT node's node pointer */ + char *bname[7]; /* the electrode boundary label for numerical solver */ + sCKTinfo CKTInfo; + sDeviceinfo Ndevinfo; + sPINinfo PINinfos[7]; + double * mat_pointer[49]; /* the pointer array to matrix */ +} NDEVinstance; + + +/* per model data */ + +typedef struct sNDEVmodel { /* model structure for a diode */ + /* the following 4 entries should always exist */ + int NDEVmodType; /* type index of this device type */ + struct sNDEVmodel *NDEVnextModel; /* pointer to next possible model in linked list */ + NDEVinstance *NDEVinstances; /* pointer to list of instances that have this model */ + IFuid NDEVmodName; /* pointer to character string naming this model */ + /* here can be freely defined as your wish*/ + + char * NDEVmodelfile; + char * host; + int port; /* Port number. */ + int sock; /* Our connection socket. */ + +} NDEVmodel; + + + + +/* device parameters */ +#define NDEV_MODEL_FILE 1 +/* model parameters */ +#define NDEV_MOD_NDEV 101 +#define NDEV_REMOTE 102 +#define NDEV_PORT 103 + +#include "ndevext.h" + + +#endif /* NDEV_H */ diff --git a/src/spicelib/devices/ndev/ndevdel.c b/src/spicelib/devices/ndev/ndevdel.c new file mode 100644 index 000000000..eea8d953e --- /dev/null +++ b/src/spicelib/devices/ndev/ndevdel.c @@ -0,0 +1,38 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + +#include "ngspice.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "suffix.h" + +int +NDEVdelete(inModel, name, kill) + GENmodel *inModel; + IFuid name; + GENinstance **kill; + +{ + NDEVmodel *model = (NDEVmodel *)inModel; + NDEVinstance **fast = (NDEVinstance **)kill; + NDEVinstance **prev = NULL; + NDEVinstance *here; + + for( ; model ; model = model->NDEVnextModel) { + prev = &(model->NDEVinstances); + for(here = *prev; here ; here = *prev) { + if(here->NDEVname == name || (fast && here==*fast) ) { + *prev= here->NDEVnextInstance; + FREE(here); + return(OK); + } + prev = &(here->NDEVnextInstance); + } + } + return(E_NODEV); + + return (E_NODEV); +} diff --git a/src/spicelib/devices/ndev/ndevdest.c b/src/spicelib/devices/ndev/ndevdest.c new file mode 100644 index 000000000..43bfeb2bd --- /dev/null +++ b/src/spicelib/devices/ndev/ndevdest.c @@ -0,0 +1,36 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + + +#include "ngspice.h" +#include "ndevdefs.h" +#include "suffix.h" + +void +NDEVdestroy(GENmodel **inModel) +{ + + NDEVmodel **model = (NDEVmodel **)inModel; + NDEVinstance *here; + NDEVinstance *prev = NULL; + NDEVmodel *mod = *model; + NDEVmodel *oldmod = NULL; + + for( ; mod ; mod = mod->NDEVnextModel) { + if(oldmod) FREE(oldmod); + oldmod = mod; + prev = (NDEVinstance *)NULL; + for(here = mod->NDEVinstances ; here ; here = here->NDEVnextInstance) { + if(prev) FREE(prev); + prev = here; + } + if(prev) FREE(prev); + close(mod->sock); + fprintf(stdout,"Disconnect to remote NDEV server %s:%d\n",mod->host,mod->port); + } + if(oldmod) FREE(oldmod); + *model = NULL; +} diff --git a/src/spicelib/devices/ndev/ndevdump.c b/src/spicelib/devices/ndev/ndevdump.c new file mode 100644 index 000000000..6bbd3da1f --- /dev/null +++ b/src/spicelib/devices/ndev/ndevdump.c @@ -0,0 +1,40 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +Author: 1991 David A. Gates, U. C. Berkeley CAD Group +**********/ + +/* + * This is a simple routine to dump the internal device states. It produces + * states for .OP, .DC, & .TRAN simulations. + */ + +#include "ngspice.h" +#include "cktdefs.h" +#include "ndevdefs.h" +#include "suffix.h" + + +/* State Counter */ +static int state_numOP = 0; +static int state_numDC = 0; +static int state_numTR = 0; + +void +NDEV_dump(inModel, ckt) + GENmodel *inModel; + CKTcircuit *ckt; +{ + +} + + + +void +NDEV_acct(inModel, ckt, file) + GENmodel *inModel; + CKTcircuit *ckt; + FILE *file; +{ + +} diff --git a/src/spicelib/devices/ndev/ndevexch.h b/src/spicelib/devices/ndev/ndevexch.h new file mode 100644 index 000000000..fbf846855 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevexch.h @@ -0,0 +1,69 @@ +#ifndef _netexchange_h_ +#define _netexchange_h_ + +#define NG_QUERY "This is ngspice. Are you ready?" +#define NDEV_REPLY "Waiting orders!" +#define NG_STOP "Ngspice finished, goodbye." + +#define NDEV_LOAD 0x0001 +#define NDEV_ACCEPT 0x0002 +#define NDEV_CONVERGINCE_TEST 0x0004 +#define NDEV_TRUNCATION_ERROR 0x0008 + +#define NDEV_TEMPERATURE 0x1000 +#define NDEV_AC_LOAD 0x0010 +#define NDEV_PZ_LOAD 0x0020 + +#ifndef CKT +/* defines for CKTmode */ +/* this should be the same as cktdefs.h */ +/* old 'mode' parameters */ +#define MODE 0x3 +#define MODETRAN 0x1 +#define MODEAC 0x2 + +/* old 'modedc' parameters */ +#define MODEDC 0x70 +#define MODEDCOP 0x10 +#define MODETRANOP 0x20 +#define MODEDCTRANCURVE 0x40 + +/* old 'initf' parameters */ +#define INITF 0x3f00 +#define MODEINITFLOAT 0x100 +#define MODEINITJCT 0x200 +#define MODEINITFIX 0x400 +#define MODEINITSMSIG 0x800 +#define MODEINITTRAN 0x1000 +#define MODEINITPRED 0x2000 + +/* old 'nosolv' paramater */ +#define MODEUIC 0x10000l +#endif + +typedef struct { +char NDEVname[32]; +int term; +}sDeviceinfo; + + +typedef struct { +int pin; +char name[32]; +double V,I; +double V_old; +double dI_dV[7]; +} sPINinfo; + +typedef struct { +long DEV_CALL; +long CKTmode; +double time; +double dt; +double dt_old; +double omega; +int accept_flag; +int convergence_flag; +}sCKTinfo; + +#endif diff --git a/src/spicelib/devices/ndev/ndevext.h b/src/spicelib/devices/ndev/ndevext.h new file mode 100644 index 000000000..c751b5bdc --- /dev/null +++ b/src/spicelib/devices/ndev/ndevext.h @@ -0,0 +1,29 @@ +/********** +Copyright 1990 Regents of the University of California. All rights reserved. +Author: 1987 Karti Mayaram +**********/ + +#ifndef NDEVEXT_H +#define NDEVEXT_H + + +extern int NDEVacLoad(GENmodel *, CKTcircuit *); +extern int NDEVask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); +extern int NDEVdelete(GENmodel *, IFuid, GENinstance **); +extern void NDEVdestroy(GENmodel **); +extern int NDEVgetic(GENmodel *, CKTcircuit *); +extern int NDEVload(GENmodel *, CKTcircuit *); +extern int NDEVaccept(CKTcircuit *, GENmodel *); +extern int NDEVconvTest(GENmodel *, CKTcircuit *); +extern int NDEVmDelete(GENmodel **, IFuid, GENmodel *); +extern int NDEVmParam(int, IFvalue *, GENmodel *); +extern int NDEVparam(int, IFvalue *, GENinstance *, IFvalue *); +extern int NDEVpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); +extern int NDEVsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); +extern int NDEVtemp(GENmodel *, CKTcircuit *); +extern int NDEVtrunc(GENmodel *, CKTcircuit *, double *); + +extern void NDEV_dump(GENmodel *, CKTcircuit *); +extern void NDEV_acct(GENmodel *, CKTcircuit *, FILE *); + +#endif /* NDEVEXT_H */ diff --git a/src/spicelib/devices/ndev/ndevinit.c b/src/spicelib/devices/ndev/ndevinit.c new file mode 100644 index 000000000..6d755b23d --- /dev/null +++ b/src/spicelib/devices/ndev/ndevinit.c @@ -0,0 +1,85 @@ +#include + +#include + +#include "ndevitf.h" +#include "ndevext.h" +#include "ndevinit.h" + + +SPICEdev NDEVinfo = { + { + "NDEV", + "Numerical Device", + + &NDEVnSize, /* number of terminals */ + &NDEVnSize, + NDEVnames, /* the name of terminals*/ + + &NDEVpTSize, /*number of instance parameters */ + NDEVpTable, /*the array of instance parameters */ + + &NDEVmPTSize, /* number of model parameter, NDEV does not have this parameter */ + NDEVmPTable, /*the array of model parameters */ + +#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 + }, + + DEVparam : NDEVparam, + DEVmodParam : NDEVmParam, + DEVload : NDEVload, + DEVsetup : NDEVsetup, + DEVunsetup : NULL, + DEVpzSetup : NDEVsetup, + DEVtemperature: NDEVtemp, + DEVtrunc : NDEVtrunc, + DEVfindBranch : NULL, + DEVacLoad : NDEVacLoad, + DEVaccept : NDEVaccept, + DEVdestroy : NDEVdestroy, + DEVmodDelete : NDEVmDelete, + DEVdelete : NDEVdelete, + DEVsetic : NDEVgetic, + DEVask : NDEVask, + DEVmodAsk : NULL, + DEVpzLoad : NDEVpzLoad, + DEVconvTest : NDEVconvTest, + DEVsenSetup : NULL, + DEVsenLoad : NULL, + DEVsenUpdate : NULL, + DEVsenAcLoad : NULL, + DEVsenPrint : NULL, + DEVsenTrunc : NULL, + DEVdisto : NULL, + DEVnoise : NULL, +#ifdef CIDER + DEVdump : NULL, + DEVacct : NULL, +#endif + + DEVinstSize : &NDEViSize, + DEVmodSize : &NDEVmSize + +}; + + +SPICEdev * +get_ndev_info(void) +{ + return &NDEVinfo; +} diff --git a/src/spicelib/devices/ndev/ndevinit.h b/src/spicelib/devices/ndev/ndevinit.h new file mode 100644 index 000000000..6ce2397de --- /dev/null +++ b/src/spicelib/devices/ndev/ndevinit.h @@ -0,0 +1,13 @@ +#ifndef _NDEVINIT_H +#define _NDEVINIT_H + +extern IFparm NDEVpTable[ ]; +extern IFparm NDEVmPTable[ ]; +extern char *NDEVnames[ ]; +extern int NDEVpTSize; +extern int NDEVmPTSize; +extern int NDEVnSize; +extern int NDEViSize; +extern int NDEVmSize; + +#endif diff --git a/src/spicelib/devices/ndev/ndevitf.h b/src/spicelib/devices/ndev/ndevitf.h new file mode 100644 index 000000000..f347f3998 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevitf.h @@ -0,0 +1,10 @@ +/********** +Copyright 1991 Regents of the University of California. All rights reserved. +**********/ + +#ifndef DEV_NDEV +#define DEV_NDEV + +extern SPICEdev *get_ndev_info(void); + +#endif diff --git a/src/spicelib/devices/ndev/ndevload.c b/src/spicelib/devices/ndev/ndevload.c new file mode 100644 index 000000000..9d18eee49 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevload.c @@ -0,0 +1,104 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + +#include "ngspice.h" +#include "devdefs.h" +#include "cktdefs.h" +#include "ndevdefs.h" +#include "numenum.h" +#include "trandefs.h" +#include "complex.h" +#include "sperror.h" +#include "suffix.h" + + +int +NDEVload(GENmodel * inModel, CKTcircuit * ckt) +{ + NDEVmodel *model = (NDEVmodel *)inModel; + NDEVinstance *here; + int i,j; + + /* loop through all the ndev models */ + for( ; model != NULL; model = model->NDEVnextModel ) + { + + /* loop through all the instances of the model */ + for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) + { + + if (here->NDEVowner != ARCHme) continue; + + /* sent ckt information to device simulator */ + here->CKTInfo.DEV_CALL = NDEV_LOAD; + here->CKTInfo.CKTmode = ckt->CKTmode; + here->CKTInfo.time = ckt->CKTtime; + here->CKTInfo.dt = ckt->CKTdelta; + here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; + here->CKTInfo.accept_flag = 0; + send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); + + /* send terminal voltage to device simulator */ + for(i=0;iterm;i++) + { + here->PINinfos[i].V_old = here->PINinfos[i].V; + here->PINinfos[i].V = *(ckt->CKTrhsOld+here->pin[i]); + send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); + } + } + } + + /* loop through all the ndev models */ + + for(model = (NDEVmodel *)inModel; model != NULL; model = model->NDEVnextModel ) + { + + /* loop through all the instances of the model */ + for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) + { + if (here->NDEVowner != ARCHme) continue; + /* reveive terminal current and conductional matrix from device simulator */ + for(i=0;iterm;i++) + { + recv(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),MSG_WAITALL); + *(ckt->CKTrhs+here->pin[i]) += here->PINinfos[i].I; + for(j=0;jterm;j++) + *(here->mat_pointer[i*here->term+j]) += here->PINinfos[i].dI_dV[j]; + } + } + } + + return(OK); +} + +int NDEVgetic(GENmodel *inModel, CKTcircuit *ckt) +{ + NDEVmodel *model = (NDEVmodel*)inModel; + NDEVinstance *here; + /* + * grab initial conditions out of rhs array. User specified, so use + * external nodes to get values + */ + + printf("set ic\n"); + + for( ; model ; model = model->NDEVnextModel) { + for(here = model->NDEVinstances; here ; here = here->NDEVnextInstance) { + if (here->NDEVowner != ARCHme) continue; +/* + if(!here->DIOinitCondGiven) { + here->DIOinitCond = + *(ckt->CKTrhs + here->DIOposNode) - + *(ckt->CKTrhs + here->DIOnegNode); + + } +*/ + } + } + return(OK); +} + + diff --git a/src/spicelib/devices/ndev/ndevmdel.c b/src/spicelib/devices/ndev/ndevmdel.c new file mode 100644 index 000000000..c6095b6a6 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevmdel.c @@ -0,0 +1,20 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +#include "ngspice.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "suffix.h" + +int +NDEVmDelete(inModel, modname, kill) + GENmodel **inModel; + IFuid modname; + GENmodel *kill; +{ + + + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevmpar.c b/src/spicelib/devices/ndev/ndevmpar.c new file mode 100644 index 000000000..fc89f363d --- /dev/null +++ b/src/spicelib/devices/ndev/ndevmpar.c @@ -0,0 +1,38 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +/* + * This routine sets model parameters for NDEVs in the circuit. + */ + +#include "ngspice.h" +#include "const.h" +#include "ifsim.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "suffix.h" + +int +NDEVmParam(int param, IFvalue * value, GENmodel * inModel) +{ + + NDEVmodel *model = (NDEVmodel *) inModel; + switch (param) { + case NDEV_REMOTE: + model->host = value->sValue; + break; + case NDEV_PORT: + model->port = value->iValue; + break; + case NDEV_MOD_NDEV: + /* no action , but this */ + /* makes life easier for spice-2 like parsers */ + break; + default: + return (E_BADPARM); + } + + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevparm.c b/src/spicelib/devices/ndev/ndevparm.c new file mode 100644 index 000000000..e68ae3117 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevparm.c @@ -0,0 +1,30 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +#include "ngspice.h" +#include "ifsim.h" +#include "const.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "suffix.h" + +int +NDEVparam(param, value, inInst, select) + int param; + IFvalue *value; + GENinstance *inInst; + IFvalue *select; +{ + NDEVinstance *inst = (NDEVinstance *) inInst; + switch (param) { + case NDEV_MOD_NDEV: + /* no action , but this */ + /* makes life easier for spice-2 like parsers */ + break; + default: + return (E_BADPARM); + } + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevpzld.c b/src/spicelib/devices/ndev/ndevpzld.c new file mode 100644 index 000000000..f4d3362d0 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevpzld.c @@ -0,0 +1,22 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "complex.h" +#include "sperror.h" +#include "ndevdefs.h" +#include "suffix.h" + + +int +NDEVpzLoad(inModel, ckt, s) + GENmodel *inModel; + register CKTcircuit *ckt; + SPcomplex *s; +{ + + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevset.c b/src/spicelib/devices/ndev/ndevset.c new file mode 100644 index 000000000..bfb0fe5c3 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevset.c @@ -0,0 +1,161 @@ +/********** +Permit to use it as your wish. +Author: 2007 Gong Ding, gdiso@ustc.edu +University of Science and Technology of China +**********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "smpdefs.h" +#include "ndevdefs.h" +#include "numconst.h" +#include "numenum.h" +#include "sperror.h" +#include "suffix.h" + +#define NIL(type) ((type *)0) +#define TSCALLOC(var, size, type)\ +if (size && (!(var =(type *)calloc(1, (unsigned)(size)*sizeof(type))))) {\ + return(E_NOMEM);\ +} + +int NDEVmodelConnect(GENmodel *inModel); + + +int NDEVsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) +/* + * load the structure with those pointers needed later for fast matrix + * loading + */ +{ + NDEVmodel *model = (NDEVmodel *)inModel; + NDEVinstance *here; + int i,j; + CKTnode *node; + + /* loop through all the ndev models */ + for( ; model != NULL; model = model->NDEVnextModel ) { + + /* connect to remote device simulator */ + if(NDEVmodelConnect(model)) return E_PRIVATE; + + /* loop through all the instances of the model */ + for (here = model->NDEVinstances; here != NULL ; + here=here->NDEVnextInstance) { + + here->Ndevinfo.term = here->term; + strncpy(here->Ndevinfo.NDEVname,here->NDEVname,32); + send(model->sock,&(here->Ndevinfo),sizeof(here->Ndevinfo),0); +/* macro to make elements with built in test for out of memory */ +#define TSTALLOC(ptr,first,second) \ +if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ + return(E_NOMEM);\ +} + + for(i=0;iterm;i++) + for(j=0;jterm;j++) + { + TSTALLOC(mat_pointer[i*here->term+j], pin[i], pin[j]); + } + + for(i=0;iterm;i++) + { + node = (CKTnode *)here->node[i]; + here->PINinfos[i].pin=node->number; + strncpy(here->PINinfos[i].name,here->bname[i],32); + here->PINinfos[i].V = 0.0; + send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); + } + + } + } + return(OK); + +} + +int NDEVmodelConnect(GENmodel *inModel) +{ + NDEVmodel *model = (NDEVmodel *)inModel; + struct hostent *hostlist; /* List of hosts returned by gethostbyname. */ + char dotted_ip[15]; /* Buffer for converting + the resolved address to + a readable format. */ + struct sockaddr_in sa; /* Connection address. */ + void * buf = malloc(128); + + /* Look up the hostname with DNS. gethostbyname + (at least most UNIX versions of it) properly + handles dotted IP addresses as well as hostnames. */ + hostlist = gethostbyname(model->host); + if (hostlist == NULL) + { + fprintf(stderr,"NDEV: Unable to resolve host %s.\n", model->host); + return E_PRIVATE; + } + /* Good, we have an address. However, some sites + are moving over to IPv6 (the newer version of + IP), and we're not ready for it (since it uses + a new address format). It's a good idea to check + for this. */ + if (hostlist->h_addrtype != AF_INET) + { + fprintf(stderr,"NDEV: Host %s doesn't seem to be an IPv4 address.\n",model->host); + return E_PRIVATE; + } + + /* inet_ntop converts a 32-bit IP address to + the dotted string notation (suitable for printing). + hostlist->h_addr_list is an array of possible addresses + (in case a name resolves to more than on IP). In most + cases we just want the first. */ + inet_ntop(AF_INET, hostlist->h_addr_list[0], dotted_ip, 15); + /* Create a socket for the connection. */ + model->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); + + if (model->sock < 0) + { + fprintf(stderr, "NDEV: Unable to create a socket %s.\n", strerror(errno)); + return E_PRIVATE; + } + /* Fill in the sockaddr_in structure. The address is + already in network byte order (from the gethostbyname + call). We need to convert the port number with the htons + macro. Before we do anything else, we'll zero out the + entire structure. */ + + memset(&sa, 0, sizeof(struct sockaddr_in)); + sa.sin_port = htons(model->port); + /* The IP address was returned as a char * for + various reasons. + Just memcpy it into the sockaddr_in structure. */ + memcpy(&sa.sin_addr, hostlist->h_addr_list[0], + hostlist->h_length); + /* This is an Internet socket. */ + sa.sin_family = AF_INET; + /* Connect! */ + if (connect(model->sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) + { + fprintf(stderr, "NDEV: Unable to connect %s\n",strerror(errno)); + return E_PRIVATE; + } + + sprintf((char *)buf,NG_QUERY); + send(model->sock,buf,128,0); + if(recv(model->sock,buf,128,MSG_WAITALL)<128) + { + fprintf(stderr, "NDEV: Remote answer error. %s\n",strerror(errno)); + return E_PRIVATE; + } + + if(strncmp((char *)buf,NDEV_REPLY,sizeof(NDEV_REPLY))) + { + fprintf(stderr, "NDEV: Remote answer error. %s\n",(char *)buf); + return E_PRIVATE; + } + + + free(buf); + return (OK); +} + + diff --git a/src/spicelib/devices/ndev/ndevtemp.c b/src/spicelib/devices/ndev/ndevtemp.c new file mode 100644 index 000000000..9a9eb7bc5 --- /dev/null +++ b/src/spicelib/devices/ndev/ndevtemp.c @@ -0,0 +1,27 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +Author: 1992 David A. Gates, U. C. Berkeley CAD Group +**********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "ndevdefs.h" +#include "numenum.h" +#include "carddefs.h" +#include "sperror.h" +#include "suffix.h" + +#define NIL(type) ((type *)0) + +int +NDEVtemp(inModel, ckt) + GENmodel *inModel; + register CKTcircuit *ckt; +/* + * perform the temperature update to the diode + */ +{ + + return (OK); +} diff --git a/src/spicelib/devices/ndev/ndevtrun.c b/src/spicelib/devices/ndev/ndevtrun.c new file mode 100644 index 000000000..2bb861bcb --- /dev/null +++ b/src/spicelib/devices/ndev/ndevtrun.c @@ -0,0 +1,23 @@ +/********** +Copyright 1992 Regents of the University of California. All rights reserved. +Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group +**********/ + +#include "ngspice.h" +#include "cktdefs.h" +#include "ndevdefs.h" +#include "sperror.h" +#include "suffix.h" + + + +int +NDEVtrunc(inModel, ckt, timeStep) + GENmodel *inModel; + register CKTcircuit *ckt; + double *timeStep; + +{ + + return (OK); +}