From fdda4ca4b7b9ee2b0fd677dc2e6c9b57d0419641 Mon Sep 17 00:00:00 2001 From: stefanjones Date: Fri, 1 Aug 2003 15:14:18 +0000 Subject: [PATCH] 2003-08-01 Stefan Jones * configure.in src/xspice/icm/* src/xspice/lib/*.cm src/xspice/Makefile.am : Added some easy to use makefiles for codemodels and reordered Removed binary files Added icm to build list --- ChangeLog | 7 + configure.in | 3 +- src/xspice/Makefile.am | 2 +- src/xspice/icm/Makefile | 85 ++++ src/xspice/icm/Makefile.am | 194 --------- src/xspice/icm/dlinfo.h | 9 - src/xspice/icm/dlmain.c | 408 ------------------ src/xspice/icm/icm_spice2poly/Makefile.am | 193 --------- src/xspice/icm/icm_spice2poly/cfunc.c | 305 ------------- src/xspice/icm/icm_spice2poly/ifspec.c | 187 -------- src/xspice/icm/icm_spice2poly/make.bat | 3 - src/xspice/icm/makedefs.in | 27 ++ src/xspice/icm/objects.inc | 1 - src/xspice/icm/poly/Makefile.am | 18 - src/xspice/icm/poly/cfunc.c | 307 ------------- src/xspice/icm/poly/cfunc.mod | 302 ------------- src/xspice/icm/poly/ifspec.c | 194 --------- src/xspice/icm/poly/ifspec.ifs | 75 ---- src/xspice/icm/poly/make.bat | 3 - src/xspice/icm/spice2poly.cm | Bin 18495 -> 0 bytes .../{ => spice2poly}/icm_spice2poly/README | 0 .../{ => spice2poly}/icm_spice2poly/cfunc.mod | 0 .../icm_spice2poly/ifspec.ifs | 0 src/xspice/icm/{ => spice2poly}/modpath.lst | 1 - src/xspice/icm/spice2poly/udnpath.lst | 0 src/xspice/lib/analog.cm | Bin 87839 -> 0 bytes src/xspice/lib/digital.cm | Bin 128503 -> 0 bytes src/xspice/lib/xtradev.cm | Bin 40481 -> 0 bytes src/xspice/lib/xtraevt.cm | Bin 25378 -> 0 bytes 29 files changed, 121 insertions(+), 2203 deletions(-) create mode 100644 src/xspice/icm/Makefile delete mode 100755 src/xspice/icm/Makefile.am delete mode 100644 src/xspice/icm/dlinfo.h delete mode 100644 src/xspice/icm/dlmain.c delete mode 100644 src/xspice/icm/icm_spice2poly/Makefile.am delete mode 100644 src/xspice/icm/icm_spice2poly/cfunc.c delete mode 100644 src/xspice/icm/icm_spice2poly/ifspec.c delete mode 100644 src/xspice/icm/icm_spice2poly/make.bat create mode 100644 src/xspice/icm/makedefs.in delete mode 100644 src/xspice/icm/objects.inc delete mode 100755 src/xspice/icm/poly/Makefile.am delete mode 100755 src/xspice/icm/poly/cfunc.c delete mode 100755 src/xspice/icm/poly/cfunc.mod delete mode 100755 src/xspice/icm/poly/ifspec.c delete mode 100755 src/xspice/icm/poly/ifspec.ifs delete mode 100755 src/xspice/icm/poly/make.bat delete mode 100755 src/xspice/icm/spice2poly.cm rename src/xspice/icm/{ => spice2poly}/icm_spice2poly/README (100%) rename src/xspice/icm/{ => spice2poly}/icm_spice2poly/cfunc.mod (100%) rename src/xspice/icm/{ => spice2poly}/icm_spice2poly/ifspec.ifs (100%) rename src/xspice/icm/{ => spice2poly}/modpath.lst (93%) create mode 100644 src/xspice/icm/spice2poly/udnpath.lst delete mode 100755 src/xspice/lib/analog.cm delete mode 100755 src/xspice/lib/digital.cm delete mode 100755 src/xspice/lib/xtradev.cm delete mode 100755 src/xspice/lib/xtraevt.cm diff --git a/ChangeLog b/ChangeLog index 827978ce8..f83e1845d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,13 @@ * src/frontend/{com_let.c,device.c,evaluate.c}: more memory leak fixes by Vera Albrecht + + * configure.in src/xspice/icm/* src/xspice/lib/*.cm + src/xspice/Makefile.am : + Added some easy to use makefiles for codemodels and reordered + Removed binary files + Added icm to build list + 2003-07-18 Vera Albrecht diff --git a/configure.in b/configure.in index d19aa2949..22076595b 100644 --- a/configure.in +++ b/configure.in @@ -498,8 +498,7 @@ src/maths/sparse/Makefile \ src/misc/Makefile \ src/xspice/Makefile \ src/xspice/cm/Makefile \ -src/xspice/icm/Makefile \ -src/xspice/icm/icm_spice2poly/Makefile \ +src/xspice/icm/makedefs \ src/xspice/mif/Makefile \ src/xspice/evt/Makefile \ src/xspice/enh/Makefile \ diff --git a/src/xspice/Makefile.am b/src/xspice/Makefile.am index 90ab4d779..975cbba93 100755 --- a/src/xspice/Makefile.am +++ b/src/xspice/Makefile.am @@ -9,7 +9,7 @@ EXTRA_DIST = README ## libs. It is currently compiled manually, last. ##SUBDIRS = mif cm enh evt ipc idn icm -SUBDIRS = mif cm enh evt ipc idn cmpp +SUBDIRS = mif cm enh evt ipc idn cmpp icm INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir) diff --git a/src/xspice/icm/Makefile b/src/xspice/icm/Makefile new file mode 100644 index 000000000..422641eed --- /dev/null +++ b/src/xspice/icm/Makefile @@ -0,0 +1,85 @@ +# The master makefile to make spiceopuse (TM) like codemodels +# Under the GPLV2 or later license +# 2003 - Stefan Jones + +include $(TOPDIR)makedefs + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include .deps/ifspec.P +-include .deps/cfunc.P +-include .deps/cm.P +-include .deps/dlmain.P + +UPMAKE = make -f $(TOPDIR)../Makefile TOPDIR=$(TOPDIR)../ + +MAKE = make -f $(TOPDIR)Makefile TOPDIR=$(TOPDIR) + +COMPILE = $(CC) $(INCLUDES) $(CFLAGS) + +all: + @for x in $(CMDIRS) ; do \ + ( cd $$x && $(UPMAKE) $$x-mods ) ; done + +clean: + @for x in $(CMDIRS) ; do \ + ( cd $$x && $(UPMAKE) $$x-mods-clean ) ; done + -rm -rf .deps + +ifspec.c: ifspec.ifs + -rm -f $@ + $(CMPP) -ifs + +cfunc.c: cfunc.mod + -rm -f $@ + $(CMPP) -mod + +dlmain.c: $(TOPDIR)/dlmain.c + -cp $(TOPDIR)/dlmain.c . + +objects.inc cmextrn.h cminfo.h udnextrn.h udninfo.h: modpath.lst udnpath.lst + -rm -f cmextrn.h cminfo.h objects.inc udnextrn.h udninfo.h + $(CMPP) -lst + +dlmain.o: cmextrn.h cminfo.h udnextrn.h udninfo.h + +%.cm: dlmain.o objects.inc + @echo $@: objects.inc dlmain.o \\ > .deps/cm.P ; \ + for x in `cat udnpath.lst` `cat modpath.lst ` ; do \ + echo $$x/cfunc.o $$x/ifspec.o \\ >> .deps/cm.P ; done ; \ + echo "" >> .deps/cm.P + $(COMPILE) $(LDFLAGS) -o $@ `cat objects.inc ` dlmain.o + +%-mods: modpath.lst udnpath.lst + @for x in `cat udnpath.lst` `cat modpath.lst ` ; do \ + ( cd $$x && $(UPMAKE) objs ) ; done + @target=`echo $@ | sed s/-mods//`; $(MAKE) $$target.cm + +%-mods-clean: + @target=`echo $@ | sed s/-mods-clean//` && rm -f $$target.cm && \ + for x in `cat udnpath.lst` `cat modpath.lst ` ; do \ + ( cd $$x && $(UPMAKE) objs-clean ) ; done + -rm -f cmextrn.h cminfo.h objects.inc udnextrn.h udninfo.h \ + dlmain.c dlmain.o + -rm -rf .deps + + +objs: ifspec.o cfunc.o + +objs-clean: + -rm -f cfunc.c ifspec.c cfunc.o ifspec.o + -rm -rf .deps + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +makedefs: $(srcdir)/makedefs.in $(top_builddir)/config.status + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status + diff --git a/src/xspice/icm/Makefile.am b/src/xspice/icm/Makefile.am deleted file mode 100755 index fbdd5a786..000000000 --- a/src/xspice/icm/Makefile.am +++ /dev/null @@ -1,194 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# Hacked on 5.23.2003 by SDB - - -SUBDIRS = icm_spice2poly - -INCLUDES = -I$(top_srcdir)/src/include - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = README modpath.lst udnpath.lst spice2poly.cm dlmain.c - - -# Edit these to point to your Opus installation -CMPPDIR = $(top_srcdir)/src/xspice/cmpp -OPUS_INCLUDE_DIR = $(top_srcdir)/src/include - - -##------ automake definitions below. ------ -## - -## Yes, listing all this stuff is ugly, but I wasn't clever enough to -## find a better way to make it work. - -SYSTEM_LIBS = -lm -lncurses -L/usr/X11R6/lib -lX11 -lXt -lXext -lXmu -lXaw -lSM -lICE - -LOCAL_LIBS = -lcmxsp,-levtxsp,-lidnxsp,-lipcxsp,-lenhxsp,-lmifxsp,-ldev,-lckt,-linp,-lparser,-lhlp,-linp,-lderiv,-lcmaths,-lpoly,-lni,-lsparse,-lmisc,-lfte,-lplotting - -DEVICE_LIBS = -lasrc,-lbjt,-lbsim1,-lbsim2,-lbsim3,-lbsim3v1,-lbsim3v2,-lbsim4,-lcap,-lbsim3soipd,-lbsim3soifd,-lbsim3soidd,-lcccs,-lccvs,-lccvs,-lcpl,-lcsw,-ldio,-lind,-lisrc,-lhfet,-lhfet2,-ljfet,-ljfet2,-lltra,-lmes,-lmesa,-lmos1,-lmos2,-lmos3,-lmos6,-lmos9,-lres,-lsoi3,-lsw,-ltxl,-ltra,-lurc,-lvccs,-lvcvs,-lvsrc - - - -LOCAL_LIB_DIRS = \ - -L$(top_srcdir)/src/xspice/cm/ \ - -L$(top_srcdir)/src/xspice/enh/ \ - -L$(top_srcdir)/src/xspice/evt/ \ - -L$(top_srcdir)/src/xspice/idn/ \ - -L$(top_srcdir)/src/xspice/ipc/ \ - -L$(top_srcdir)/src/xspice/mif/ \ - -L$(top_srcdir)/src/spicelib/devices/ \ - -L$(top_srcdir)/src/spicelib/analysis/ \ - -L$(top_srcdir)/src/spicelib/parser/ \ - \ - -L$(top_srcdir)/src/frontend/parser/ \ - -L$(top_srcdir)/src/frontend/help/ \ - -L$(top_srcdir)/src/maths/deriv/ \ - -L$(top_srcdir)/src/maths/cmaths/ \ - -L$(top_srcdir)/src/maths/poly/ \ - -L$(top_srcdir)/src/maths/ni/ \ - -L$(top_srcdir)/src/maths/sparse/ \ - -L$(top_srcdir)/src/misc/ \ - \ - -L$(top_srcdir)/src/frontend/ \ - -L$(top_srcdir)/src/frontend/plotting/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/asrc/ \ - -L$(top_srcdir)/src/spicelib/devices/bjt/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim1/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim2/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v1/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v2/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim4/ \ - -L$(top_srcdir)/src/spicelib/devices/cap/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_pd/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_fd/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_dd/ \ - -L$(top_srcdir)/src/spicelib/devices/cccs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/ \ - -L$(top_srcdir)/src/spicelib/devices/cpl/ \ - -L$(top_srcdir)/src/spicelib/devices/csw/ \ - -L$(top_srcdir)/src/spicelib/devices/dio/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/ind/ \ - -L$(top_srcdir)/src/spicelib/devices/isrc/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet1/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet2/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet2/ \ - -L$(top_srcdir)/src/spicelib/devices/ltra/ \ - -L$(top_srcdir)/src/spicelib/devices/mes/ \ - -L$(top_srcdir)/src/spicelib/devices/mesa/ \ - -L$(top_srcdir)/src/spicelib/devices/mos1/ \ - -L$(top_srcdir)/src/spicelib/devices/mos2/ \ - -L$(top_srcdir)/src/spicelib/devices/mos3/ \ - -L$(top_srcdir)/src/spicelib/devices/mos6/ \ - -L$(top_srcdir)/src/spicelib/devices/mos9/ \ - -L$(top_srcdir)/src/spicelib/devices/res/ \ - -L$(top_srcdir)/src/spicelib/devices/soi3/ \ - -L$(top_srcdir)/src/spicelib/devices/sw/ \ - -L$(top_srcdir)/src/spicelib/devices/txl/ \ - -L$(top_srcdir)/src/spicelib/devices/tra/ \ - -L$(top_srcdir)/src/spicelib/devices/urc/ \ - -L$(top_srcdir)/src/spicelib/devices/vccs/ \ - -L$(top_srcdir)/src/spicelib/devices/vcvs/ \ - -L$(top_srcdir)/src/spicelib/devices/vsrc/ - - -EXTRA_LIB_DIRS = \ - -L$(top_srcdir)/src/xspice/cm/.libs/ \ - -L$(top_srcdir)/src/xspice/enh/.libs/ \ - -L$(top_srcdir)/src/xspice/evt/.libs/ \ - -L$(top_srcdir)/src/xspice/idn/.libs/ \ - -L$(top_srcdir)/src/xspice/ipc/.libs/ \ - -L$(top_srcdir)/src/xspice/mif/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/.libs/ \ - -L$(top_srcdir)/src/spicelib/analysis/.libs/ \ - -L$(top_srcdir)/src/spicelib/parser/.libs/ \ - \ - -L$(top_srcdir)/src/frontend/parser/.libs/ \ - -L$(top_srcdir)/src/frontend/help/.libs/ \ - -L$(top_srcdir)/src/maths/deriv/.libs/ \ - -L$(top_srcdir)/src/maths/cmaths/.libs/ \ - -L$(top_srcdir)/src/maths/poly/.libs/ \ - -L$(top_srcdir)/src/maths/ni/.libs/ \ - -L$(top_srcdir)/src/maths/sparse/.libs \ - -L$(top_srcdir)/src/misc/.libs/ \ - \ - -L$(top_srcdir)/src/frontend/.libs/ \ - -L$(top_srcdir)/src/frontend/plotting/.libs/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/asrc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bjt/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim4/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cap/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_pd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_fd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_dd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cccs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cpl/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/csw/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/dio/.libs/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/ind/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/isrc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ltra/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mes/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mesa/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos6/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos9/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/res/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/soi3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/sw/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/txl/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/tra/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/urc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vccs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vcvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vsrc/.libs/ - -clean: clean-recursive - rm -f cmextrn.h cminfo.h udnextrn.h udninfo.h *.o - - -cmextrn.h: modpath.lst $(SUBDIRS)/cfunc.c $(SUBDIRS)/ifspec.c - $(CMPPDIR)/cmpp -lst - -cminfo.h: modpath.lst $(SUBDIRS)/cfunc.c $(SUBDIRS)/ifspec.c - $(CMPPDIR)/cmpp -lst - -udnextrn.h: udnpath.lst $(SUBDIRS)/cfunc.c $(SUBDIRS)/ifspec.c - $(CMPPDIR)/cmpp -lst - -udninfo.h: udnpath.lst $(SUBDIRS)/cfunc.c $(SUBDIRS)/ifspec.c - $(CMPPDIR)/cmpp -lst - -all: spice2poly.cm - -spice2poly.cm: $(SUBDIRS)/cfunc.o $(SUBDIRS)/ifspec.o dlmain.o - $(top_srcdir)/libtool --mode=link $(CC) -module -shared -fPIC -o spice2poly.cm \ - $(SUBDIRS)/cfunc.o $(SUBDIRS)/ifspec.o dlmain.o \ - $(SYSTEM_LIBS) $(LOCAL_LIB_DIRS) \ - -Wl,--start-group -Wl,$(LOCAL_LIBS) -Wl,--end-group -ldl \ - -Wl,--rpath,/usr/local/geda/lib/ng-spice-rework - -dlmain.o: dlmain.c cmextrn.h udnextrn.h cminfo.h udninfo.h - $(CC) -fPIC -I$(OPUS_INCLUDE_DIR) $(INCLUDES) $(CFLAGS) -DCM_LINUX -c dlmain.c - diff --git a/src/xspice/icm/dlinfo.h b/src/xspice/icm/dlinfo.h deleted file mode 100644 index f79261781..000000000 --- a/src/xspice/icm/dlinfo.h +++ /dev/null @@ -1,9 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Modify these to include general information about the library -////////////////////////////////////////////////////////////////////////////// -char inf_Title[]="icm_poly.cm"; -char inf_Version[]="0.1"; -char inf_Description[]="Code model implementation of SPICE2 poly."; -char inf_Author[]="Hacked together by SDB, June 2003."; -char inf_Copyright[]="Released under GPL"; - diff --git a/src/xspice/icm/dlmain.c b/src/xspice/icm/dlmain.c deleted file mode 100644 index 9472aab6c..000000000 --- a/src/xspice/icm/dlmain.c +++ /dev/null @@ -1,408 +0,0 @@ -////////////////////////////////////////////////////////////////////////////// -// Build cmextrn.h, cminfo.h, udnextrn.h and udninfo.h from udnpath.lst and -// modpath.lst using 'cmpp -lst'. Then compile this file and link it with -// cm and udn object files to produce a dll that can be loaded by the -// spice opus simulator at run-time. -// -// Author: Arpad Buermen -////////////////////////////////////////////////////////////////////////////// -#include "dlinfo.h" - -#include -#include -#include "port.h" -#include "misc.h" -#include "cmextrn.h" -#include "udnextrn.h" -#include "dllitf.h" - -// This one is automatically set by the compiler -char inf_Date[]=__DATE__; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// Do not modify anything below this line -////////////////////////////////////////////////////////////////////////////// - -SPICEdev *cmDEVices[] = { -#include "cminfo.h" - NULL -}; - -int cmDEVicesCNT = sizeof(cmDEVices)/sizeof(SPICEdev *)-1; - -Evt_Udn_Info_t *cmEVTudns[] = { -#include "udninfo.h" - NULL -}; - -int cmEVTudnCNT = sizeof(cmEVTudns)/sizeof(Evt_Udn_Info_t *)-1; - -// Pointer to core info structure containing pointers to core functions. -struct coreInfo_t *coreitf; - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// Functions that return pointers to structures. -////////////////////////////////////////////////////////////////////////////// -#ifdef CM_WINDOWS -#undef CM_EXPORT -#define CM_EXPORT __declspec(dllexport) -#endif - -#ifdef CM_LINUX -#undef CM_EXPORT -#define CM_EXPORT extern -#endif - -int cmopusvers = 2; - -// This one checks the opus dynamic link version. -CM_EXPORT void *CMsysvers() { - return (void *)&cmopusvers; -} - -// This one returns the title -CM_EXPORT void *CMtitle() { - return (void *)inf_Title; -} - -// This one returns the version -CM_EXPORT void *CMversion() { - return (void *)inf_Version; -} - -// This one returns the date -CM_EXPORT void *CMdate() { - return (void *)inf_Date; -} - -// This one returns the description -CM_EXPORT void *CMdescription() { - return (void *)inf_Description; -} - -// This one returns the author -CM_EXPORT void *CMauthor() { - return (void *)inf_Author; -} - -// This one returns the copyright -CM_EXPORT void *CMcopyright() { - return (void *)inf_Copyright; -} - -// This one returns the device table -CM_EXPORT void *CMdevs() { - return (void *)cmDEVices; -} - -// This one returns the device count -CM_EXPORT void *CMdevNum() { - return (void *)&cmDEVicesCNT; -} - -// This one returns the UDN table -CM_EXPORT void *CMudns() { - return (void *)cmEVTudns; -} - -// This one returns the UDN count -CM_EXPORT void *CMudnNum() { - return (void *)&cmEVTudnCNT; -} - -// This one returns the pointer to the pointer to the core interface structure -CM_EXPORT void *CMgetCoreItfPtr() { - return (void *)(&coreitf); -} - - -////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////// -// These functions call the real core functions of SPICE OPUS using the -// pointers in coreitf structure. -////////////////////////////////////////////////////////////////////////////// -void MIF_INP2A( - GENERIC *ckt, /* circuit structure to put mod/inst structs in */ - INPtables *tab, /* symbol table for node names, etc. */ - card *current /* the card we are to parse */ - ) { - (coreitf->dllitf_MIF_INP2A)(ckt,tab,current); -} - -char * MIFgetMod( - GENERIC *ckt, - char **name, - INPmodel **model, - INPtables *tab - ) { - return (coreitf->dllitf_MIFgetMod)(ckt,name,model,tab); -} - -IFvalue * MIFgetValue( - GENERIC *ckt, - char **line, - int type, - INPtables *tab, - char **err - ) { - return (coreitf->dllitf_MIFgetValue)(ckt,line,type,tab,err); -} - - -int MIFsetup( - SMPmatrix *matrix, - GENmodel *inModel, - CKTcircuit *ckt, - int *state - ) { - return (coreitf->dllitf_MIFsetup)(matrix,inModel,ckt,state); -} - -int MIFunsetup( - GENmodel *inModel, - CKTcircuit *ckt -) { - return (coreitf->dllitf_MIFunsetup)(inModel,ckt); -} - -int MIFload( - GENmodel *inModel, - CKTcircuit *ckt - ) { - return (coreitf->dllitf_MIFload)(inModel,ckt); -} - - -int MIFmParam( - int param_index, - IFvalue *value, - GENmodel *inModel - ) { - return (coreitf->dllitf_MIFmParam)(param_index,value,inModel); -} - -int MIFask( - CKTcircuit *ckt, - GENinstance *inst, - int param_index, - IFvalue *value, - IFvalue *select - ) { - return (coreitf->dllitf_MIFask)(ckt,inst,param_index,value,select); -} - -int MIFmAsk( - CKTcircuit *ckt, - GENmodel *inModel, - int param_index, - IFvalue *value - ) { - return (coreitf->dllitf_MIFmAsk)(ckt,inModel,param_index,value); -} - -int MIFtrunc( - GENmodel *inModel, - CKTcircuit *ckt, - double *timeStep - ) { - return (coreitf->dllitf_MIFtrunc)(inModel,ckt,timeStep); -} - -int MIFconvTest( - GENmodel *inModel, - CKTcircuit *ckt - ) { - return (coreitf->dllitf_MIFconvTest)(inModel,ckt); -} - -int MIFdelete( - GENmodel *inModel, - IFuid name, - GENinstance **inst - ) { - return (coreitf->dllitf_MIFdelete)(inModel,name,inst); -} - -int MIFmDelete( - GENmodel **inModel, - IFuid modname, - GENmodel *model - ) { - return (coreitf->dllitf_MIFmDelete)(inModel,modname,model); -} - -void MIFdestroy( - GENmodel **inModel - ) { - (coreitf->dllitf_MIFdestroy)(inModel); -} - -char *MIFgettok( - char **s - ) { - return (coreitf->dllitf_MIFgettok)(s); -} - - -char *MIFget_token( - char **s, - Mif_Token_Type_t *type - ) { - return (coreitf->dllitf_MIFget_token)(s,type); -} - - -Mif_Cntl_Src_Type_t MIFget_cntl_src_type( - Mif_Port_Type_t in_port_type, - Mif_Port_Type_t out_port_type - ) { - return (coreitf->dllitf_MIFget_cntl_src_type)(in_port_type,out_port_type); -} - -char *MIFcopy(char *c) { - return (coreitf->dllitf_MIFcopy)(c); -} - - -void cm_climit_fcn(double in, double in_offset, double cntl_upper, - double cntl_lower, double lower_delta, - double upper_delta, double limit_range, - double gain, int percent, double *out_final, - double *pout_pin_final, double *pout_pcntl_lower_final, - double *pout_pcntl_upper_final) { - (coreitf->dllitf_cm_climit_fcn)(in,in_offset,cntl_upper,cntl_lower,lower_delta, - upper_delta,limit_range,gain,percent,out_final, - pout_pin_final,pout_pcntl_lower_final, - pout_pcntl_upper_final); -} - - - -void cm_smooth_corner(double x_input, double x_center, double y_center, - double domain, double lower_slope, double upper_slope, - double *y_output, double *dy_dx) { - (coreitf->dllitf_cm_smooth_corner)(x_input,x_center,y_center,domain,lower_slope, - upper_slope,y_output,dy_dx); -} - -void cm_smooth_discontinuity(double x_input, double x_lower, double y_lower, - double x_upper, double y_upper, - double *y_output, double *dy_dx) { - (coreitf->dllitf_cm_smooth_discontinuity)(x_input,x_lower,y_lower,x_upper,y_upper, - y_output,dy_dx); -} - -double cm_smooth_pwl(double x_input, double *x, double *y, int size, - double input_domain, double *dout_din) { - return (coreitf->dllitf_cm_smooth_pwl)(x_input,x,y,size,input_domain,dout_din); -} - -double cm_analog_ramp_factor(void) { - return (coreitf->dllitf_cm_analog_ramp_factor)(); -} - -void *cm_analog_alloc(int tag, int bytes) { - return (coreitf->dllitf_cm_analog_alloc)(tag,bytes); -} - -void *cm_analog_get_ptr(int tag, int timepoint) { - return (coreitf->dllitf_cm_analog_get_ptr)(tag,timepoint); -} - -int cm_analog_integrate(double integrand, double *integral, double *partial) { - return (coreitf->dllitf_cm_analog_integrate)(integrand,integral,partial); -} - -int cm_analog_converge(double *state) { - return (coreitf->dllitf_cm_analog_converge)(state); -} - -int cm_analog_set_temp_bkpt(double time) { - return (coreitf->dllitf_cm_analog_set_temp_bkpt)(time); -} - -int cm_analog_set_perm_bkpt(double time) { - return (coreitf->dllitf_cm_analog_set_perm_bkpt)(time); -} - -void cm_analog_not_converged(void) { - (coreitf->dllitf_cm_analog_not_converged)(); -} - -void cm_analog_auto_partial(void) { - (coreitf->dllitf_cm_analog_auto_partial)(); -} - -void *cm_event_alloc(int tag, int bytes){ - return (coreitf->dllitf_cm_event_alloc)(tag,bytes); -} - -void *cm_event_get_ptr(int tag, int timepoint) { - return (coreitf->dllitf_cm_event_get_ptr)(tag,timepoint); -} - -int cm_event_queue(double time) { - return (coreitf->dllitf_cm_event_queue)(time); -} - -char *cm_message_get_errmsg(void) { - return (coreitf->dllitf_cm_message_get_errmsg)(); -} - -int cm_message_send(char *msg) { - return (coreitf->dllitf_cm_message_send)(msg); -} - -double cm_netlist_get_c(void) { - return (coreitf->dllitf_cm_netlist_get_c)(); -} - -double cm_netlist_get_l(void) { - return (coreitf->dllitf_cm_netlist_get_l)(); -} - -Complex_t cm_complex_set(double real, double imag) { - return (coreitf->dllitf_cm_complex_set)(real,imag); -} - -Complex_t cm_complex_add(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_add)(x,y); -} - -Complex_t cm_complex_subtract(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_subtract)(x,y); -} - -Complex_t cm_complex_multiply(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_multiply)(x,y); -} - -Complex_t cm_complex_divide(Complex_t x, Complex_t y) { - return (coreitf->dllitf_cm_complex_divide)(x,y); -} - -FILE * cm_stream_out(void) { - return (coreitf->dllitf_cm_stream_out)(); -} - -FILE * cm_stream_in(void) { - return (coreitf->dllitf_cm_stream_in)(); -} - -FILE * cm_stream_err(void) { - return (coreitf->dllitf_cm_stream_err)(); -} - -char * tmalloc_internal(size_t s, int clean, const char *f, int l, int sw) { - return (coreitf->dllitf_tmalloc)(s,clean,f,l,sw); -} - -char * trealloc_internal(char *ptr, size_t s, const char *f, int l, int sw) { - return (coreitf->dllitf_trealloc)(ptr,s,f,l,sw); -} - -void tfree_internal(char *ptr, const char *f, int l, int sw) { - (coreitf->dllitf_tfree)(ptr,f,l,sw); -} diff --git a/src/xspice/icm/icm_spice2poly/Makefile.am b/src/xspice/icm/icm_spice2poly/Makefile.am deleted file mode 100644 index 8c7ad1e4c..000000000 --- a/src/xspice/icm/icm_spice2poly/Makefile.am +++ /dev/null @@ -1,193 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# Makefile.am hand-crafted by SDB on 5.25.2003 to create POLY -# codemodel shared object. To enable simulation of POLY controlled sources, -# do the following: -# - -# Edit this to point to cmpp in your installation. -CMPPDIR = $(top_srcdir)/src/xspice/cmpp - -##------ automake definitions below. ------ -## - -## Yes, listing all this stuff is ugly, but I wasn't clever enough to -## find a better way to make it work. - -SYSTEM_LIBS = -lm -lncurses -L/usr/X11R6/lib -lX11 -lXt -lXext -lXmu -lXaw -lSM -lICE - -LOCAL_LIBS = -lcmxsp,-levtxsp,-lidnxsp,-lipcxsp,-lenhxsp,-lmifxsp,-ldev,-lckt,-linp,-lparser,-lhlp,-linp,-lderiv,-lcmaths,-lpoly,-lni,-lsparse,-lmisc,-lfte,-lplotting - -DEVICE_LIBS = -lasrc,-lbjt,-lbsim1,-lbsim2,-lbsim3,-lbsim3v1,-lbsim3v2,-lbsim4,-lcap,-lbsim3soipd,-lbsim3soifd,-lbsim3soidd,-lcccs,-lccvs,-lccvs,-lcpl,-lcsw,-ldio,-lind,-lisrc,-lhfet,-lhfet2,-ljfet,-ljfet2,-lltra,-lmes,-lmesa,-lmos1,-lmos2,-lmos3,-lmos6,-lmos9,-lres,-lsoi3,-lsw,-ltxl,-ltra,-lurc,-lvccs,-lvcvs,-lvsrc - - -LOCAL_LIB_DIRS = \ - -L$(top_srcdir)/src/xspice/cm/ \ - -L$(top_srcdir)/src/xspice/enh/ \ - -L$(top_srcdir)/src/xspice/evt/ \ - -L$(top_srcdir)/src/xspice/idn/ \ - -L$(top_srcdir)/src/xspice/ipc/ \ - -L$(top_srcdir)/src/xspice/mif/ \ - -L$(top_srcdir)/src/spicelib/devices/ \ - -L$(top_srcdir)/src/spicelib/analysis/ \ - -L$(top_srcdir)/src/spicelib/parser/ \ - \ - -L$(top_srcdir)/src/frontend/parser/ \ - -L$(top_srcdir)/src/frontend/help/ \ - -L$(top_srcdir)/src/maths/deriv/ \ - -L$(top_srcdir)/src/maths/cmaths/ \ - -L$(top_srcdir)/src/maths/poly/ \ - -L$(top_srcdir)/src/maths/ni/ \ - -L$(top_srcdir)/src/maths/sparse/ \ - -L$(top_srcdir)/src/misc/ \ - \ - -L$(top_srcdir)/src/frontend/ \ - -L$(top_srcdir)/src/frontend/plotting/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/asrc/ \ - -L$(top_srcdir)/src/spicelib/devices/bjt/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim1/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim2/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v1/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v2/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim4/ \ - -L$(top_srcdir)/src/spicelib/devices/cap/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_pd/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_fd/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_dd/ \ - -L$(top_srcdir)/src/spicelib/devices/cccs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/ \ - -L$(top_srcdir)/src/spicelib/devices/cpl/ \ - -L$(top_srcdir)/src/spicelib/devices/csw/ \ - -L$(top_srcdir)/src/spicelib/devices/dio/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/ind/ \ - -L$(top_srcdir)/src/spicelib/devices/isrc/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet1/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet2/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet2/ \ - -L$(top_srcdir)/src/spicelib/devices/ltra/ \ - -L$(top_srcdir)/src/spicelib/devices/mes/ \ - -L$(top_srcdir)/src/spicelib/devices/mesa/ \ - -L$(top_srcdir)/src/spicelib/devices/mos1/ \ - -L$(top_srcdir)/src/spicelib/devices/mos2/ \ - -L$(top_srcdir)/src/spicelib/devices/mos3/ \ - -L$(top_srcdir)/src/spicelib/devices/mos6/ \ - -L$(top_srcdir)/src/spicelib/devices/mos9/ \ - -L$(top_srcdir)/src/spicelib/devices/res/ \ - -L$(top_srcdir)/src/spicelib/devices/soi3/ \ - -L$(top_srcdir)/src/spicelib/devices/sw/ \ - -L$(top_srcdir)/src/spicelib/devices/txl/ \ - -L$(top_srcdir)/src/spicelib/devices/tra/ \ - -L$(top_srcdir)/src/spicelib/devices/urc/ \ - -L$(top_srcdir)/src/spicelib/devices/vccs/ \ - -L$(top_srcdir)/src/spicelib/devices/vcvs/ \ - -L$(top_srcdir)/src/spicelib/devices/vsrc/ - - -EXTRA_LIB_DIRS = \ - -L$(top_srcdir)/src/xspice/cm/.libs/ \ - -L$(top_srcdir)/src/xspice/enh/.libs/ \ - -L$(top_srcdir)/src/xspice/evt/.libs/ \ - -L$(top_srcdir)/src/xspice/idn/.libs/ \ - -L$(top_srcdir)/src/xspice/ipc/.libs/ \ - -L$(top_srcdir)/src/xspice/mif/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/.libs/ \ - -L$(top_srcdir)/src/spicelib/analysis/.libs/ \ - -L$(top_srcdir)/src/spicelib/parser/.libs/ \ - \ - -L$(top_srcdir)/src/frontend/parser/.libs/ \ - -L$(top_srcdir)/src/frontend/help/.libs/ \ - -L$(top_srcdir)/src/maths/deriv/.libs/ \ - -L$(top_srcdir)/src/maths/cmaths/.libs/ \ - -L$(top_srcdir)/src/maths/poly/.libs/ \ - -L$(top_srcdir)/src/maths/ni/.libs/ \ - -L$(top_srcdir)/src/maths/sparse/.libs \ - -L$(top_srcdir)/src/misc/.libs/ \ - \ - -L$(top_srcdir)/src/frontend/.libs/ \ - -L$(top_srcdir)/src/frontend/plotting/.libs/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/asrc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bjt/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3v2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim4/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cap/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_pd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_fd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/bsim3soi_dd/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cccs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ccvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/cpl/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/csw/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/dio/.libs/ \ - \ - -L$(top_srcdir)/src/spicelib/devices/ind/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/isrc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/hfet2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/jfet2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/ltra/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mes/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mesa/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos1/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos2/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos6/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/mos9/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/res/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/soi3/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/sw/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/txl/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/tra/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/urc/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vccs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vcvs/.libs/ \ - -L$(top_srcdir)/src/spicelib/devices/vsrc/.libs/ - - -INCLUDES = -I$(top_srcdir)/src/include -I$(top_srcdir) - -EXTRA_DIST = cfunc.mod ifspec.ifs README cfunc.c ifspec.c README - -MAINTAINERCLEANFILES = Makefile.in - -##------ Make targets listed below. ------ - -all: cfunc.o ifspec.o - -clean: - rm -f *.o *.cm *.la - rm -fR .libs - -cfunc.o: cfunc.c - $(CC) -fPIC $(INCLUDES) $(CFLAGS) -c cfunc.c - -ifspec.o: ifspec.c - $(CC) -fPIC $(INCLUDES) $(CFLAGS) -c ifspec.c - -# Don't use the below targets unless you know what you are doing! -# -# Hint: if you create ifspec.c using cmpp, you need to replace MIFunsetup -# with NULL in ifspec.c before making ifspec.o (compiling with gcc) because -# MIFunsetup is apparently unimplemented. -# -#cclean: clean -# rm -f cfunc.c ifspec.c -# -#cfunc.c: cfunc.mod -# $(CMPPDIR)/cmpp -mod cfunc.mod -# -#ifspec.c: ifspec.ifs -# $(CMPPDIR)/cmpp -ifs - - diff --git a/src/xspice/icm/icm_spice2poly/cfunc.c b/src/xspice/icm/icm_spice2poly/cfunc.c deleted file mode 100644 index 6afbb77ba..000000000 --- a/src/xspice/icm/icm_spice2poly/cfunc.c +++ /dev/null @@ -1,305 +0,0 @@ -#line 1 "cfunc.mod" -#include "cm.h" -#line 1 "cfunc.mod" -/* =========================================================================== -FILE cfunc.mod - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - spice2poly() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/* - -This code model implements the non-linear polynomial controlled sources -available in SPICE 2G6. An automatic translator added into the simulator -front end is used to map 2G6 syntax into a call to this model in the -required syntax. - -This model may also be called directly as follows: - - a1 [ ] xxx - .model xxx spice2poly ( coef = [ ] ) - -Refer to the 2G6 User Guide for an explanation of the coefficients. - - -This model is patterned after the FORTRAN code used in the 2G6 simulator. -Function cm_poly() below performs the functions of subroutines NLCSRC and -EVPOLY. Function evterm() performs the function of subroutine EVTERM, -and function nxtpwr() performs the function of subroutine NXTPWR. - -*/ - - - - -void *malloc(int); -void free(void *); - -/* SPICE 2G6 type utility functions */ -static double evterm(double x, int n); -static void nxtpwr(int *pwrseq, int pdim); - - - - -void spice2poly (Mif_Private_t *private) -{ - int num_inputs; /* Number of inputs to model */ - int num_coefs; /* Number of coefficients */ - int *exp; /* List of exponents in products */ - /* One for each input */ - - int i; /* Counter */ - int j; /* Counter */ - int k; /* Counter */ - - double *in; /* Values of inputs to model */ - double *coef; /* Values of coefficients */ - - double sum; /* Temporary for accumulating sum of terms */ - double product; /* Temporary for accumulating product */ - - double *acgains; /* Static variable holding AC gains for AC analysis */ - - - /* Get number of input values */ - - num_inputs = private->conn[0]->size; - - /* If this is the first call to the model, allocate the static variable */ - /* array */ - - if(private->circuit.init) { - acgains = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - acgains[i] = 0.0; - private->inst_var[0]->element[0].pvalue = acgains; - } - else - acgains = private->inst_var[0]->element[0].pvalue; - - /* If analysis type is AC, use the previously computed DC partials */ - /* for the AC gains */ - - if(private->circuit.anal_type == MIF_AC) { - for(i = 0; i < num_inputs; i++) { - acgains = private->inst_var[0]->element[0].pvalue; - private->conn[1]->port[0]->ac_gain[0].port[i].real = acgains[i]; - private->conn[1]->port[0]->ac_gain[0].port[i].imag = 0.0; - } - return; - } - - /* Get input values and coefficients to local storage for faster access */ - - in = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - in[i] = private->conn[0]->port[i]->input.rvalue; - - num_coefs = private->param[0]->size; - - coef = malloc(num_coefs * sizeof(double)); - for(i = 0; i < num_coefs; i++) - coef[i] = private->param[0]->element[i].rvalue; - - - /* Allocate the array of exponents used in computing the poly terms */ - exp = malloc(num_inputs * sizeof(int)); - - /* Initialize the exponents to zeros */ - for(i = 0; i < num_inputs; i++) - exp[i] = 0; - - - /* Compute the output of the source by summing the required products */ - for(i = 1, sum = coef[0]; i < num_coefs; i++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* Form the product of the inputs taken to the required powers */ - for(j = 0, product = 1.0; j < num_inputs; j++) - product *= evterm(in[j], exp[j]); - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[i] * product; - } - private->conn[1]->port[0]->output.rvalue = sum; - - - /* Compute and output the partials for each input */ - for(i = 0; i < num_inputs; i++) { - - /* Reinitialize the exponent list to zeros */ - for(j = 0; j < num_inputs; j++) - exp[j] = 0; - - /* Compute the partials by summing the required products */ - for(j = 1, sum = 0.0; j < num_coefs; j++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* If power for input for which partial is being evaluated */ - /* is zero, the term is a constant, so the partial is zero */ - if(exp[i] == 0) - continue; - - /* Form the product of the inputs taken to the required powers */ - for(k = 0, product = 1.0; k < num_inputs; k++) { - /* If input is not the one for which the partial is being taken */ - /* take the term to the specified exponent */ - if(k != i) - product *= evterm(in[k], exp[k]); - /* else, take the derivative of this term as n*x**(n-1) */ - else - product *= exp[k] * evterm(in[k], exp[k] - 1); - } - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[j] * product; - } - - private->conn[1]->port[0]->partial[0].port[i] = sum; - - /* If this is DC analysis, save the partial for use as AC gain */ - /* value in an AC analysis */ - - if(private->circuit.anal_type == MIF_DC) - acgains[i] = sum; - } - - /* Free the allocated items and return */ - free(in); - free(coef); - free(exp); - - return; -} - - -/* Function evterm computes the value of x**n */ - -static double evterm( - double x, - int n) -{ - double product; /* Temporary accumlator for forming the product */ - - product = 1.0; - while(n > 0) { - product *= x; - n--; - } - - return(product); -} - - - -/* - -This function is a literal translation of subroutine NXTPWR in SPICE 2G6. -This was done to guarantee compatibility with the ordering of -coefficients used by 2G6. The 2G6 User Guide does not completely define -the algorithm used and the GOTO loaded FORTRAN code is difficult to unravel. -Therefore, a one-to-one translation was deemed the safest approach. - -No attempt is made to document the function statements since no documentaton -is available in the 2G6 code. However, it can be noted that the code -appears to generate the exponents of the product terms in the sum-of-products -produced by the following expansion for two and three dimensional polynomials: - - 2D (a + b) ** n - 3D (a + (b + c)) ** n - -where n begins at 1 and increments as needed for as many terms as there are -coefficients on the polynomial source SPICE deck card, and where terms that -are identical under the laws of associativity are dropped. Thus, for example, -the exponents for the following sums are produced: - - 2D a + b + a**2 + ab + b**2 + c**3 + ... - 3D a + b + c + a**2 + a*b + a*c + b**2 + bc + c**2 + a**3 + ... - -*/ - -/* Define a macro to tranlate between FORTRAN-style array references */ -/* and C-style array references */ - -#define PWRSEQ(x) pwrseq[x - 1] - - -static void nxtpwr( - int *pwrseq, /* Array of exponents */ - int pdim) -{ - int i; - int k; - int km1; - int psum; - - if(pdim == 1) goto stmt80; - k = pdim; -stmt10: if(PWRSEQ(k) != 0) goto stmt20; - k = k - 1; - if(k != 0) goto stmt10; - goto stmt80; -stmt20: if(k == pdim) goto stmt30; - PWRSEQ(k) = PWRSEQ(k) - 1; - PWRSEQ(k+1) = PWRSEQ(k+1) + 1; - goto stmt100; -stmt30: km1 = k - 1; - for(i = 1; i <= km1; i++) - if(PWRSEQ(i) != 0) goto stmt50; -stmt40: PWRSEQ(1) = PWRSEQ(pdim) + 1; - PWRSEQ(pdim) = 0; - goto stmt100; -stmt50: psum = 1; - k = pdim; -stmt60: if(PWRSEQ(k-1) >= 1) goto stmt70; - psum = psum + PWRSEQ(k); - PWRSEQ(k) = 0; - k = k - 1; - goto stmt60; -stmt70: PWRSEQ(k) = PWRSEQ(k) + psum; - PWRSEQ(k-1) = PWRSEQ(k-1) - 1; - goto stmt100; -stmt80: PWRSEQ(1) = PWRSEQ(1) + 1; - -stmt100: return; - -} - diff --git a/src/xspice/icm/icm_spice2poly/ifspec.c b/src/xspice/icm/icm_spice2poly/ifspec.c deleted file mode 100644 index 016e00fde..000000000 --- a/src/xspice/icm/icm_spice2poly/ifspec.c +++ /dev/null @@ -1,187 +0,0 @@ - -/* - * Structures for model: spice2poly - * - * Automatically generated by cmpp preprocessor - * - * !!! DO NOT EDIT !!! - * - */ - - -// #include "prefix.h" -#include -#include "ngspice.h" -#include "devdefs.h" -#include "ifsim.h" -#include "mifdefs.h" -#include "mifproto.h" -#include "mifparse.h" -// #include "suffix.h" - - -static IFparm MIFmPTable[] = { - IOP("coef", 0, (IF_REAL|IF_VECTOR), "2g6 compatible spice card coefficient list"), -}; - - -static IFparm MIFpTable[] = { - OP("acgains", 1, IF_STRING, "partial derivatives from dc analysis used for ac gains"), -}; - - -static Mif_Port_Type_t MIFportEnum0[] = { - MIF_DIFF_VOLTAGE, - MIF_DIFF_CURRENT, - MIF_VSOURCE_CURRENT, -}; - - -static char *MIFportStr0[] = { - "vd", - "id", - "vnam", -}; - - -static Mif_Port_Type_t MIFportEnum1[] = { - MIF_DIFF_VOLTAGE, - MIF_DIFF_CURRENT, -}; - - -static char *MIFportStr1[] = { - "vd", - "id", -}; - - -static Mif_Conn_Info_t MIFconnTable[] = { - { - "in", - "input", - MIF_IN, - MIF_DIFF_VOLTAGE, - "vd", - 3, - MIFportEnum0, - MIFportStr0, - MIF_TRUE, - MIF_TRUE, - 1, - MIF_FALSE, - 0, - MIF_FALSE, - }, - { - "out", - "output", - MIF_OUT, - MIF_DIFF_VOLTAGE, - "vd", - 2, - MIFportEnum1, - MIFportStr1, - MIF_FALSE, - MIF_FALSE, - 0, - MIF_FALSE, - 0, - MIF_FALSE, - }, -}; - - -static Mif_Param_Info_t MIFparamTable[] = { - { - "coef", - "2g6 compatible spice card coefficient list", - MIF_REAL, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_TRUE, - MIF_FALSE, - 0, - MIF_TRUE, - 2, - MIF_FALSE, - 0, - MIF_FALSE, - }, -}; - - -static Mif_Inst_Var_Info_t MIFinst_varTable[] = { - { - "acgains", - "partial derivatives from dc analysis used for ac gains", - MIF_STRING, - MIF_FALSE, - }, -}; - - -extern void spice2poly(Mif_Private_t *); - -static int val_terms = 0; -static int val_numNames = 0; -static int val_numInstanceParms = 1; -static int val_numModelParms = 1; -static int val_sizeofMIFinstance = sizeof(MIFinstance); -static int val_sizeofMIFmodel = sizeof(MIFmodel); - -SPICEdev spice2poly_info = { - { "spice2poly", - "2g6 compatible polynomial controlled source", - &val_terms, - &val_numNames, - NULL, - &val_numInstanceParms, - MIFpTable, - &val_numModelParms, - MIFmPTable, - spice2poly, - 2, - MIFconnTable, - 1, - MIFparamTable, - 1, - MIFinst_varTable, - }, -NULL, -MIFmParam, -MIFload, -MIFsetup, - NULL, /* removed by sdb MIFunsetup, */ -NULL, -NULL, -MIFtrunc, -NULL, -MIFload, -NULL, -MIFdestroy, -MIFmDelete, -MIFdelete, -NULL, -MIFask, -MIFmAsk, -NULL, -MIFconvTest, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -&val_sizeofMIFinstance, -&val_sizeofMIFmodel, - -}; - diff --git a/src/xspice/icm/icm_spice2poly/make.bat b/src/xspice/icm/icm_spice2poly/make.bat deleted file mode 100644 index 19a341b81..000000000 --- a/src/xspice/icm/icm_spice2poly/make.bat +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cmpp -mod cfunc.mod -cmpp -ifs diff --git a/src/xspice/icm/makedefs.in b/src/xspice/icm/makedefs.in new file mode 100644 index 000000000..2879660ce --- /dev/null +++ b/src/xspice/icm/makedefs.in @@ -0,0 +1,27 @@ +# Edit this file to set global include paths, +# compiler info and subdirs + +# Directory sturcture +SHELL = @SHELL@ +srcdir = @srcdir@ +top_builddir = ../../.. +top_srcdir = @top_srcdir@ +subdir = src/xspice/icm + +# C compiler to use +CC = @CC@ + +# Spice header include path +INCLUDES = -I$(TOPDIR)$(top_srcdir)/src/include -I$(TOPDIR)$(top_builddir) + +# CFLAGS to use here +CFLAGS = @CFLAGS@ -fPIC -DCM_LINUX + +# Path to the cmpp utility +CMPP = $(TOPDIR)$(top_builddir)/src/xspice/cmpp/cmpp + +# Flags to use when linking shared library +LDFLAGS = -shared + +# The codemodels to make +CMDIRS = spice2poly diff --git a/src/xspice/icm/objects.inc b/src/xspice/icm/objects.inc deleted file mode 100644 index fc2fd16c8..000000000 --- a/src/xspice/icm/objects.inc +++ /dev/null @@ -1 +0,0 @@ -icm_spice2poly/*.o diff --git a/src/xspice/icm/poly/Makefile.am b/src/xspice/icm/poly/Makefile.am deleted file mode 100755 index 2490dc745..000000000 --- a/src/xspice/icm/poly/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -## Process this file with automake to produce Makefile.in -# -# JW 3/9/01 - had a go and makeing an autoconf script. - -noinst_LIBRARIES = libidnxsp.a - -libidnxsp_a_SOURCES = \ - ifspec.c \ - cfunc.c - -INCLUDES = -I$(top_srcdir)/src/include - -MAINTAINERCLEANFILES = Makefile.in - -ifspec.c: - cmpp -ifs -cfunc.c: - cmpp -mod cfunc.mod diff --git a/src/xspice/icm/poly/cfunc.c b/src/xspice/icm/poly/cfunc.c deleted file mode 100755 index c529d3851..000000000 --- a/src/xspice/icm/poly/cfunc.c +++ /dev/null @@ -1,307 +0,0 @@ -#line 1 "cfunc.mod" -#include "cm.h" -#line 1 "cfunc.mod" -/* =========================================================================== -FILE cfunc.mod - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - icm_poly() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/* - -This code model implements the non-linear polynomial controlled sources -available in SPICE 2G6. An automatic translator added into the simulator -front end is used to map 2G6 syntax into a call to this model in the -required syntax. - -This model may also be called directly as follows: - - a1 [ ] xxx - .model xxx poly ( coef = [ ] ) - -Refer to the 2G6 User Guide for an explanation of the coefficients. - - -This model is patterned after the FORTRAN code used in the 2G6 simulator. -Function cm_poly() below performs the functions of subroutines NLCSRC and -EVPOLY. Function evterm() performs the function of subroutine EVTERM, -and function nxtpwr() performs the function of subroutine NXTPWR. - -*/ - - - - -void *malloc(int); -void free(void *); - -/* SPICE 2G6 type utility functions */ -static double evterm(double x, int n); -static void nxtpwr(int *pwrseq, int pdim); - - - - -void icm_poly (Mif_Private_t *private) -{ - int num_inputs; /* Number of inputs to model */ - int num_coefs; /* Number of coefficients */ - int *exp; /* List of exponents in products */ - /* One for each input */ - - int i; /* Counter */ - int j; /* Counter */ - int k; /* Counter */ - - double *in; /* Values of inputs to model */ - double *coef; /* Values of coefficients */ - - double sum; /* Temporary for accumulating sum of terms */ - double product; /* Temporary for accumulating product */ - - double *acgains; /* Static variable holding AC gains for AC analysis */ - - /* debug statement */ - printf("In icm_poly!!! . . . .\n"); - - /* Get number of input values */ - - num_inputs = private->conn[0]->size; - - /* If this is the first call to the model, allocate the static variable */ - /* array */ - - if(private->circuit.init) { - acgains = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - acgains[i] = 0.0; - private->inst_var[0]->element[0].pvalue = acgains; - } - else - acgains = private->inst_var[0]->element[0].pvalue; - - /* If analysis type is AC, use the previously computed DC partials */ - /* for the AC gains */ - - if(private->circuit.anal_type == MIF_AC) { - for(i = 0; i < num_inputs; i++) { - acgains = private->inst_var[0]->element[0].pvalue; - private->conn[1]->port[0]->ac_gain[0].port[i].real = acgains[i]; - private->conn[1]->port[0]->ac_gain[0].port[i].imag = 0.0; - } - return; - } - - /* Get input values and coefficients to local storage for faster access */ - - in = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - in[i] = private->conn[0]->port[i]->input.rvalue; - - num_coefs = private->param[0]->size; - - coef = malloc(num_coefs * sizeof(double)); - for(i = 0; i < num_coefs; i++) - coef[i] = private->param[0]->element[i].rvalue; - - - /* Allocate the array of exponents used in computing the poly terms */ - exp = malloc(num_inputs * sizeof(int)); - - /* Initialize the exponents to zeros */ - for(i = 0; i < num_inputs; i++) - exp[i] = 0; - - - /* Compute the output of the source by summing the required products */ - for(i = 1, sum = coef[0]; i < num_coefs; i++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* Form the product of the inputs taken to the required powers */ - for(j = 0, product = 1.0; j < num_inputs; j++) - product *= evterm(in[j], exp[j]); - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[i] * product; - } - private->conn[1]->port[0]->output.rvalue = sum; - - - /* Compute and output the partials for each input */ - for(i = 0; i < num_inputs; i++) { - - /* Reinitialize the exponent list to zeros */ - for(j = 0; j < num_inputs; j++) - exp[j] = 0; - - /* Compute the partials by summing the required products */ - for(j = 1, sum = 0.0; j < num_coefs; j++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* If power for input for which partial is being evaluated */ - /* is zero, the term is a constant, so the partial is zero */ - if(exp[i] == 0) - continue; - - /* Form the product of the inputs taken to the required powers */ - for(k = 0, product = 1.0; k < num_inputs; k++) { - /* If input is not the one for which the partial is being taken */ - /* take the term to the specified exponent */ - if(k != i) - product *= evterm(in[k], exp[k]); - /* else, take the derivative of this term as n*x**(n-1) */ - else - product *= exp[k] * evterm(in[k], exp[k] - 1); - } - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[j] * product; - } - - private->conn[1]->port[0]->partial[0].port[i] = sum; - - /* If this is DC analysis, save the partial for use as AC gain */ - /* value in an AC analysis */ - - if(private->circuit.anal_type == MIF_DC) - acgains[i] = sum; - } - - /* Free the allocated items and return */ - free(in); - free(coef); - free(exp); - - return; -} - - -/* Function evterm computes the value of x**n */ - -static double evterm( - double x, - int n) -{ - double product; /* Temporary accumlator for forming the product */ - - product = 1.0; - while(n > 0) { - product *= x; - n--; - } - - return(product); -} - - - -/* - -This function is a literal translation of subroutine NXTPWR in SPICE 2G6. -This was done to guarantee compatibility with the ordering of -coefficients used by 2G6. The 2G6 User Guide does not completely define -the algorithm used and the GOTO loaded FORTRAN code is difficult to unravel. -Therefore, a one-to-one translation was deemed the safest approach. - -No attempt is made to document the function statements since no documentaton -is available in the 2G6 code. However, it can be noted that the code -appears to generate the exponents of the product terms in the sum-of-products -produced by the following expansion for two and three dimensional polynomials: - - 2D (a + b) ** n - 3D (a + (b + c)) ** n - -where n begins at 1 and increments as needed for as many terms as there are -coefficients on the polynomial source SPICE deck card, and where terms that -are identical under the laws of associativity are dropped. Thus, for example, -the exponents for the following sums are produced: - - 2D a + b + a**2 + ab + b**2 + c**3 + ... - 3D a + b + c + a**2 + a*b + a*c + b**2 + bc + c**2 + a**3 + ... - -*/ - -/* Define a macro to tranlate between FORTRAN-style array references */ -/* and C-style array references */ - -#define PWRSEQ(x) pwrseq[x - 1] - - -static void nxtpwr( - int *pwrseq, /* Array of exponents */ - int pdim) -{ - int i; - int k; - int km1; - int psum; - - if(pdim == 1) goto stmt80; - k = pdim; -stmt10: if(PWRSEQ(k) != 0) goto stmt20; - k = k - 1; - if(k != 0) goto stmt10; - goto stmt80; -stmt20: if(k == pdim) goto stmt30; - PWRSEQ(k) = PWRSEQ(k) - 1; - PWRSEQ(k+1) = PWRSEQ(k+1) + 1; - goto stmt100; -stmt30: km1 = k - 1; - for(i = 1; i <= km1; i++) - if(PWRSEQ(i) != 0) goto stmt50; -stmt40: PWRSEQ(1) = PWRSEQ(pdim) + 1; - PWRSEQ(pdim) = 0; - goto stmt100; -stmt50: psum = 1; - k = pdim; -stmt60: if(PWRSEQ(k-1) >= 1) goto stmt70; - psum = psum + PWRSEQ(k); - PWRSEQ(k) = 0; - k = k - 1; - goto stmt60; -stmt70: PWRSEQ(k) = PWRSEQ(k) + psum; - PWRSEQ(k-1) = PWRSEQ(k-1) - 1; - goto stmt100; -stmt80: PWRSEQ(1) = PWRSEQ(1) + 1; - -stmt100: return; - -} - diff --git a/src/xspice/icm/poly/cfunc.mod b/src/xspice/icm/poly/cfunc.mod deleted file mode 100755 index d7ec837ed..000000000 --- a/src/xspice/icm/poly/cfunc.mod +++ /dev/null @@ -1,302 +0,0 @@ -/* =========================================================================== -FILE cfunc.mod - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - icm_poly() - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -/* - -This code model implements the non-linear polynomial controlled sources -available in SPICE 2G6. An automatic translator added into the simulator -front end is used to map 2G6 syntax into a call to this model in the -required syntax. - -This model may also be called directly as follows: - - a1 [ ] xxx - .model xxx poly ( coef = [ ] ) - -Refer to the 2G6 User Guide for an explanation of the coefficients. - - -This model is patterned after the FORTRAN code used in the 2G6 simulator. -Function cm_poly() below performs the functions of subroutines NLCSRC and -EVPOLY. Function evterm() performs the function of subroutine EVTERM, -and function nxtpwr() performs the function of subroutine NXTPWR. - -*/ - - - - -void *malloc(int); -void free(void *); - -/* SPICE 2G6 type utility functions */ -static double evterm(double x, int n); -static void nxtpwr(int *pwrseq, int pdim); - - - - -void icm_poly (ARGS) -{ - int num_inputs; /* Number of inputs to model */ - int num_coefs; /* Number of coefficients */ - int *exp; /* List of exponents in products */ - /* One for each input */ - - int i; /* Counter */ - int j; /* Counter */ - int k; /* Counter */ - - double *in; /* Values of inputs to model */ - double *coef; /* Values of coefficients */ - - double sum; /* Temporary for accumulating sum of terms */ - double product; /* Temporary for accumulating product */ - - double *acgains; /* Static variable holding AC gains for AC analysis */ - - - /* Get number of input values */ - - num_inputs = PORT_SIZE(in); - - /* If this is the first call to the model, allocate the static variable */ - /* array */ - - if(INIT) { - acgains = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - acgains[i] = 0.0; - STATIC_VAR(acgains) = acgains; - } - else - acgains = STATIC_VAR(acgains); - - /* If analysis type is AC, use the previously computed DC partials */ - /* for the AC gains */ - - if(ANALYSIS == MIF_AC) { - for(i = 0; i < num_inputs; i++) { - acgains = STATIC_VAR(acgains); - AC_GAIN(out,in[i]).real = acgains[i]; - AC_GAIN(out,in[i]).imag = 0.0; - } - return; - } - - /* Get input values and coefficients to local storage for faster access */ - - in = malloc(num_inputs * sizeof(double)); - for(i = 0; i < num_inputs; i++) - in[i] = INPUT(in[i]); - - num_coefs = PARAM_SIZE(coef); - - coef = malloc(num_coefs * sizeof(double)); - for(i = 0; i < num_coefs; i++) - coef[i] = PARAM(coef[i]); - - - /* Allocate the array of exponents used in computing the poly terms */ - exp = malloc(num_inputs * sizeof(int)); - - /* Initialize the exponents to zeros */ - for(i = 0; i < num_inputs; i++) - exp[i] = 0; - - - /* Compute the output of the source by summing the required products */ - for(i = 1, sum = coef[0]; i < num_coefs; i++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* Form the product of the inputs taken to the required powers */ - for(j = 0, product = 1.0; j < num_inputs; j++) - product *= evterm(in[j], exp[j]); - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[i] * product; - } - OUTPUT(out) = sum; - - - /* Compute and output the partials for each input */ - for(i = 0; i < num_inputs; i++) { - - /* Reinitialize the exponent list to zeros */ - for(j = 0; j < num_inputs; j++) - exp[j] = 0; - - /* Compute the partials by summing the required products */ - for(j = 1, sum = 0.0; j < num_coefs; j++) { - - /* Get the list of powers for the product terms in this term of the sum */ - nxtpwr(exp, num_inputs); - - /* If power for input for which partial is being evaluated */ - /* is zero, the term is a constant, so the partial is zero */ - if(exp[i] == 0) - continue; - - /* Form the product of the inputs taken to the required powers */ - for(k = 0, product = 1.0; k < num_inputs; k++) { - /* If input is not the one for which the partial is being taken */ - /* take the term to the specified exponent */ - if(k != i) - product *= evterm(in[k], exp[k]); - /* else, take the derivative of this term as n*x**(n-1) */ - else - product *= exp[k] * evterm(in[k], exp[k] - 1); - } - - /* Add the product times the appropriate coefficient into the sum */ - sum += coef[j] * product; - } - - PARTIAL(out,in[i]) = sum; - - /* If this is DC analysis, save the partial for use as AC gain */ - /* value in an AC analysis */ - - if(ANALYSIS == MIF_DC) - acgains[i] = sum; - } - - /* Free the allocated items and return */ - free(in); - free(coef); - free(exp); - - return; -} - - -/* Function evterm computes the value of x**n */ - -static double evterm( - double x, - int n) -{ - double product; /* Temporary accumlator for forming the product */ - - product = 1.0; - while(n > 0) { - product *= x; - n--; - } - - return(product); -} - - - -/* - -This function is a literal translation of subroutine NXTPWR in SPICE 2G6. -This was done to guarantee compatibility with the ordering of -coefficients used by 2G6. The 2G6 User Guide does not completely define -the algorithm used and the GOTO loaded FORTRAN code is difficult to unravel. -Therefore, a one-to-one translation was deemed the safest approach. - -No attempt is made to document the function statements since no documentaton -is available in the 2G6 code. However, it can be noted that the code -appears to generate the exponents of the product terms in the sum-of-products -produced by the following expansion for two and three dimensional polynomials: - - 2D (a + b) ** n - 3D (a + (b + c)) ** n - -where n begins at 1 and increments as needed for as many terms as there are -coefficients on the polynomial source SPICE deck card, and where terms that -are identical under the laws of associativity are dropped. Thus, for example, -the exponents for the following sums are produced: - - 2D a + b + a**2 + ab + b**2 + c**3 + ... - 3D a + b + c + a**2 + a*b + a*c + b**2 + bc + c**2 + a**3 + ... - -*/ - -/* Define a macro to tranlate between FORTRAN-style array references */ -/* and C-style array references */ - -#define PWRSEQ(x) pwrseq[x - 1] - - -static void nxtpwr( - int *pwrseq, /* Array of exponents */ - int pdim) -{ - int i; - int k; - int km1; - int psum; - - if(pdim == 1) goto stmt80; - k = pdim; -stmt10: if(PWRSEQ(k) != 0) goto stmt20; - k = k - 1; - if(k != 0) goto stmt10; - goto stmt80; -stmt20: if(k == pdim) goto stmt30; - PWRSEQ(k) = PWRSEQ(k) - 1; - PWRSEQ(k+1) = PWRSEQ(k+1) + 1; - goto stmt100; -stmt30: km1 = k - 1; - for(i = 1; i <= km1; i++) - if(PWRSEQ(i) != 0) goto stmt50; -stmt40: PWRSEQ(1) = PWRSEQ(pdim) + 1; - PWRSEQ(pdim) = 0; - goto stmt100; -stmt50: psum = 1; - k = pdim; -stmt60: if(PWRSEQ(k-1) >= 1) goto stmt70; - psum = psum + PWRSEQ(k); - PWRSEQ(k) = 0; - k = k - 1; - goto stmt60; -stmt70: PWRSEQ(k) = PWRSEQ(k) + psum; - PWRSEQ(k-1) = PWRSEQ(k-1) - 1; - goto stmt100; -stmt80: PWRSEQ(1) = PWRSEQ(1) + 1; - -stmt100: return; - -} - diff --git a/src/xspice/icm/poly/ifspec.c b/src/xspice/icm/poly/ifspec.c deleted file mode 100755 index 707859a58..000000000 --- a/src/xspice/icm/poly/ifspec.c +++ /dev/null @@ -1,194 +0,0 @@ - -/* - * Structures for model: poly - * - * Automatically generated by cmpp preprocessor - * - * !!! DO NOT EDIT !!! - * - */ - - -// #include "prefix.h" -#include -#include "spice.h" -#include "devdefs.h" -#include "ifsim.h" -#include "mifdefs.h" -#include "mifproto.h" -#include "mifparse.h" -// #include "suffix.h" - - -static IFparm MIFmPTable[] = { - IOP("coef", 0, (IF_REAL|IF_VECTOR), "2g6 compatible spice card coefficient list"), -}; - - -static IFparm MIFpTable[] = { - OP("acgains", 1, IF_STRING, "partial derivatives from dc analysis used for ac gains"), -}; - - -static Mif_Port_Type_t MIFportEnum0[] = { - MIF_VOLTAGE, - MIF_DIFF_VOLTAGE, - MIF_CURRENT, - MIF_DIFF_CURRENT, - MIF_VSOURCE_CURRENT, -}; - - -static char *MIFportStr0[] = { - "v", - "vd", - "i", - "id", - "vnam", -}; - - -static Mif_Port_Type_t MIFportEnum1[] = { - MIF_VOLTAGE, - MIF_DIFF_VOLTAGE, - MIF_CURRENT, - MIF_DIFF_CURRENT, -}; - - -static char *MIFportStr1[] = { - "v", - "vd", - "i", - "id", -}; - - -static Mif_Conn_Info_t MIFconnTable[] = { - { - "in", - "input", - MIF_IN, - MIF_VOLTAGE, - "v", - 5, - MIFportEnum0, - MIFportStr0, - MIF_TRUE, - MIF_TRUE, - 1, - MIF_FALSE, - 0, - MIF_FALSE, - }, - { - "out", - "output", - MIF_OUT, - MIF_VOLTAGE, - "v", - 4, - MIFportEnum1, - MIFportStr1, - MIF_FALSE, - MIF_FALSE, - 0, - MIF_FALSE, - 0, - MIF_FALSE, - }, -}; - - -static Mif_Param_Info_t MIFparamTable[] = { - { - "coef", - "2g6 compatible spice card coefficient list", - MIF_REAL, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_FALSE, - {MIF_FALSE, 0, 0.0, {0.0, 0.0}, NULL}, - MIF_TRUE, - MIF_FALSE, - 0, - MIF_TRUE, - 2, - MIF_FALSE, - 0, - MIF_FALSE, - }, -}; - - -static Mif_Inst_Var_Info_t MIFinst_varTable[] = { - { - "acgains", - "partial derivatives from dc analysis used for ac gains", - MIF_STRING, - MIF_FALSE, - }, -}; - - -extern void icm_poly(Mif_Private_t *); - -static int val_terms = 0; -static int val_numNames = 0; -static int val_numInstanceParms = 1; -static int val_numModelParms = 1; -static int val_sizeofMIFinstance = sizeof(MIFinstance); -static int val_sizeofMIFmodel = sizeof(MIFmodel); - -SPICEdev icm_poly_info = { - { "poly", - "2g6 compatible polynomial controlled source", - &val_terms, - &val_numNames, - NULL, - &val_numInstanceParms, - MIFpTable, - &val_numModelParms, - MIFmPTable, - icm_poly, - 2, - MIFconnTable, - 1, - MIFparamTable, - 1, - MIFinst_varTable, - }, -NULL, -MIFmParam, -MIFload, -MIFsetup, -MIFunsetup, -NULL, -NULL, -MIFtrunc, -NULL, -MIFload, -NULL, -MIFdestroy, -MIFmDelete, -MIFdelete, -NULL, -MIFask, -MIFmAsk, -NULL, -MIFconvTest, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -NULL, -&val_sizeofMIFinstance, -&val_sizeofMIFmodel, - -}; - diff --git a/src/xspice/icm/poly/ifspec.ifs b/src/xspice/icm/poly/ifspec.ifs deleted file mode 100755 index 39a2aaef8..000000000 --- a/src/xspice/icm/poly/ifspec.ifs +++ /dev/null @@ -1,75 +0,0 @@ -/* =========================================================================== -FILE ifspec.ifs - -MEMBER OF process XSPICE - -Copyright 1991 -Georgia Tech Research Corporation -Atlanta, Georgia 30332 -All Rights Reserved - -PROJECT A-8503 - -AUTHORS - - 9/12/91 Bill Kuhn - -MODIFICATIONS - - - -SUMMARY - - This file contains the definition of a code model polynomial controlled - source compatible with SPICE 2G6 poly sources. - -INTERFACES - - None. - -REFERENCED FILES - - None. - -NON-STANDARD FEATURES - - None. - -=========================================================================== */ - -NAME_TABLE: - -Spice_Model_Name: poly -C_Function_Name: icm_poly -Description: "2G6 compatible polynomial controlled source" - - -PORT_TABLE: - -Port_Name: in out -Description: "input" "output" -Direction: in out -Default_Type: v v -Allowed_Types: [v,vd,i,id,vnam] [v,vd,i,id] -Vector: yes no -Vector_Bounds: [1 -] - -Null_Allowed: no no - - -PARAMETER_TABLE: - -Parameter_Name: coef -Description: "2G6 compatible spice card coefficient list" -Data_Type: real -Default_Value: - -Limits: - -Vector: yes -Vector_Bounds: [2 -] -Null_Allowed: no - - -STATIC_VAR_TABLE: - -Static_Var_Name: acgains -Data_Type: pointer -Description: "Partial derivatives from DC analysis used for AC gains" diff --git a/src/xspice/icm/poly/make.bat b/src/xspice/icm/poly/make.bat deleted file mode 100755 index 19a341b81..000000000 --- a/src/xspice/icm/poly/make.bat +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cmpp -mod cfunc.mod -cmpp -ifs diff --git a/src/xspice/icm/spice2poly.cm b/src/xspice/icm/spice2poly.cm deleted file mode 100755 index 1e67d1e959327de7c7533d1ed73827d9cf46e0ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18495 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 diff --git a/src/xspice/icm/icm_spice2poly/README b/src/xspice/icm/spice2poly/icm_spice2poly/README similarity index 100% rename from src/xspice/icm/icm_spice2poly/README rename to src/xspice/icm/spice2poly/icm_spice2poly/README diff --git a/src/xspice/icm/icm_spice2poly/cfunc.mod b/src/xspice/icm/spice2poly/icm_spice2poly/cfunc.mod similarity index 100% rename from src/xspice/icm/icm_spice2poly/cfunc.mod rename to src/xspice/icm/spice2poly/icm_spice2poly/cfunc.mod diff --git a/src/xspice/icm/icm_spice2poly/ifspec.ifs b/src/xspice/icm/spice2poly/icm_spice2poly/ifspec.ifs similarity index 100% rename from src/xspice/icm/icm_spice2poly/ifspec.ifs rename to src/xspice/icm/spice2poly/icm_spice2poly/ifspec.ifs diff --git a/src/xspice/icm/modpath.lst b/src/xspice/icm/spice2poly/modpath.lst similarity index 93% rename from src/xspice/icm/modpath.lst rename to src/xspice/icm/spice2poly/modpath.lst index 9ad9131c9..eba74545a 100644 --- a/src/xspice/icm/modpath.lst +++ b/src/xspice/icm/spice2poly/modpath.lst @@ -1,2 +1 @@ icm_spice2poly - diff --git a/src/xspice/icm/spice2poly/udnpath.lst b/src/xspice/icm/spice2poly/udnpath.lst new file mode 100644 index 000000000..e69de29bb diff --git a/src/xspice/lib/analog.cm b/src/xspice/lib/analog.cm deleted file mode 100755 index b46966130a71a9309b04fdcb42e7af435b5977a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87839 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 T2ah7!&&&L>m5mLJ_C)^|&I%31 diff --git a/src/xspice/lib/xtradev.cm b/src/xspice/lib/xtradev.cm deleted file mode 100755 index 46f3087170843ab1068d146f08844e49acbb70c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40481 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 M`P{b4HLiL850%+T>Hq)$ diff --git a/src/xspice/lib/xtraevt.cm b/src/xspice/lib/xtraevt.cm deleted file mode 100755 index fa135648d638b6933694eaffa8db4d2f1a01c34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25378 zcmeHv4|H6`dGFO9n~fukOjSojaDrnL17ehqCn!~rM9gx9z{H_uLyqa?hCjeU3~bpvhv z*!TO*d~@&YS|X%*NqFaEbVk4V&3rTS%{Oyr@6NsZeX^r-c|}EqV?vcv<&f37jK@gX& zvlelc@N&2V86UDTTdnj4q%T4IfR&d-x=A?q6gyxGa6CH$>HacKdX?l2PEvLc@@||Y z-_Ckah~C{C=Sa2AsB$V*V%vp=SE)o(o#9$A{M&|4Q;Cevrz^f)23+M_p!g#`4=Mhf z&)=hXt*Zcg>I{|G#mPgca^9=|SsB$h+SjSBdp^6(a zLW9p|Dc9!eemP9) z&eMA$`44H*D;?(rDSsL!ZMiy-{{reCKz;68l=sl?(#ssAG`}4tZ-jkj3;!YN_n&1=8XtDag1`X|j zF!w~Z-$y|N?uT;`e**al$n!IR}}Q8IQ89$@?NWcGwScQM*I7$_H)x?se?ZRd3fg-M z_FQST_dLq?qCH;8)ORoR-)7l!EBH!_&jja9iP7&5KpoWQ&cymh(SDuP{w(n7dBJ=& zLcgtZgZ1fRAR~~cy{PX&w7DP$%_QAfGGNoTXLj)&IFf=0sL>-qO0PGjhxFCWn)r6X^$_C^iyhGMY->odAs|vWbCY&P!w?{n_YH0>b@ipQ3}2S_2Gdzp)RxX{$tDK|JuMjZ5>9NWy<=T6 zmdH8z*ia-M@zUrxn$k)zOR;z&72Q&nHxNw@mt~>yW}W3X+qSv~eRQnr$;XG$N1RnW zsRk1CWrTEvbS9tMj6peVUAZkL<*D(ub+Le>YwL=02mouyZCz14;I^)qKU|7zW@CWW z`5`2fItnx&NO*1OY+{wy-|c0c7?Me^-|1SlJhEza_o8J?L8L1km(;pwDxY9Fm+Se7)mD6AB}lfO+junl}g7fPTevzpqWc-y6D@K@yhZuiR@5${&3pENOUuCOCHmoj%0A*C8J9F#O4H6 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