Added support to analog functions on ADMS models

This commit is contained in:
Francesc Vila 2014-02-13 17:39:50 +01:00 committed by rlar
parent bcc4a11dfc
commit 4307188300
6 changed files with 300 additions and 21 deletions

View File

@ -253,19 +253,27 @@
<admst:when test="[name='ln']"><admst:return name="fname" value="logE"/></admst:when>
<admst:when test="[name='limexp']"><admst:return name="fname" value="limexp"/></admst:when>
<admst:when test="[name='\$limexp']"><admst:return name="fname" value="limexp"/></admst:when>
<admst:otherwise><admst:return name="fname" value="%(name)"/></admst:otherwise>
</admst:choose>
</admst:template>
<admst:template match="fname">
<admst:choose>
<admst:when test="[name='abs']">fabs</admst:when>
<admst:when test="[name='\$shrinkl']">shrinkl</admst:when>
<admst:when test="[name='\$shrinka']">shrinka</admst:when>
<admst:when test="[name='log']">log10</admst:when>
<admst:when test="[name='ln']">logE</admst:when>
<admst:when test="[name='limexp']">limexp</admst:when>
<admst:when test="[name='\$limexp']">limexp</admst:when>
<admst:otherwise>%(name)</admst:otherwise>
<admst:when test="[name='hypot']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='max']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='min']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='pow']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='div']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='mult']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='add']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='cos']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sin']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='tan']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='cosh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sinh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='tanh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='acos']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='asin']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='atan']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sqrt']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='exp']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:otherwise><admst:return name="fname" value="$(module)_%(name)"/></admst:otherwise>
</admst:choose>
</admst:template>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Written by Laurent Lemaitre - r29173@users.sourceforge.net
Written by Francesc Vila - francesc.vila@gmail.com
Documentation:
http://sourceforge.net/docman/display_doc.php?docid=18993&group_id=84289
Target Interface: ngspice
@ -23,7 +23,55 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
<!DOCTYPE admst SYSTEM "admst.dtd">
<admst version="2.3.0" xmlns:admst="http://mot-adms.sourceforge.net/xml-files/admst">
<admst:template match="c:analogfunction:math_h">
<admst:template match="c:analogfunction:math">
#undef _cos
#undef _d0_cos
#undef _sin
#undef _d0_sin
#undef _tan
#undef _d0_tan
#undef _cosh
#undef _d0_cosh
#undef _sinh
#undef _d0_sinh
#undef _tanh
#undef _d0_tanh
#undef _acos
#undef _d0_acos
#undef _asin
#undef _d0_asin
#undef _atan
#undef _d0_atan
#undef _logE
#undef _d0_logE
#undef _log10
#undef _d0_log10
#undef _exp
#undef _d0_exp
#undef _sqrt
#undef _d0_sqrt
#undef _abs
#undef _d0_abs
#undef _hypot
#undef _d0_hypot
#undef _d1_hypot
#undef _min
#undef _d0_min
#undef _d1_min
#undef _max
#undef _d0_max
#undef _d1_max
#undef _pow
#undef _d0_pow
#undef _d1_pow
#undef _limexp
#undef _d_limexp
static inline double _cos(double arg) { return cos(arg); }
static inline double _d0_cos(double arg) { return (-sin(arg)); }
static inline double _sin(double arg) { return sin(arg); }
@ -857,3 +905,109 @@ static inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((lo
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:template match="code">
<admst:value-of select="attribute[name='ngspicename']/value"/>
<admst:variable name="module" select="%s"/>
#include &quot;ngspice/ngspice.h&quot;
#include &quot;$(module)analogfunction.h&quot;
<admst:apply-templates select="." match="c:analogfunction:math" />
<admst:for-each select="/module/analogfunction">
<admst:value-of select="." />
<admst:variable name="globalanalogfunction" select="%p" />
<admst:value-of select="name" />
<admst:variable name="function" select="%s" />
<admst:apply-templates select="." match="dectype" />$(module)_$function(
<admst:join select="variable[input='yes']" separator=",">
<admst:value-of select="name" />
<admst:apply-templates select="." match="dectype"/>
<admst:text format="%s" />
</admst:join>)
<admst:text format="\n{\n" />
<admst:text format="double $function=0.0;\n"/>
<admst:for-each select="variable[input='no' and output='no']">
<admst:value-of select="name"/>
<admst:apply-templates select="." match="dectype"/>
<admst:text format="%s"/>
<admst:if test="[type='integer']">=0</admst:if>
<admst:if test="[type='real']">=0.0</admst:if>
<admst:text format=";\n"/>
</admst:for-each>
<admst:apply-templates select="tree" match="af:print">
<admst:value-of select="returned('x')/value"/>
<admst:text format="%s"/>
</admst:apply-templates>
<admst:text format="\nreturn $function;\n}\n" />
double d_$(module)_$(function)(
<admst:join select="variable[input='yes']" separator=",">
<admst:value-of select="name" />
<admst:apply-templates select="." match="dectype"/>
<admst:text format="%s" />
</admst:join>,
<admst:join select="variable[input='yes']" separator=",">
<admst:value-of select="name" />
<admst:apply-templates select="." match="dectype"/>
<admst:text format="d_%s" />
</admst:join>)
<admst:text format="\n{\n" />
<admst:text format="double $function=0.0;\n"/>
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
<admst:value-of select="name"/>
<admst:variable name="ddx" select="%s"/>
<admst:text format="double $(function)_$(ddx)=0.0;\n"/>
</admst:for-each>
<admst:for-each select="variable[input='no' and output='no']">
<admst:value-of select="name"/>
<admst:variable name="name" select="%s"/>
<admst:apply-templates select="." match="dectype"/>
<admst:text format=" $(name)"/>
<admst:if test="[type='integer']">=0</admst:if>
<admst:if test="[type='real']">=0.0</admst:if>
<admst:text format=";\n"/>
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
<admst:value-of select="name"/>
<admst:variable name="ddx" select="%s"/>
<admst:apply-templates select="." match="dectype"/>
<admst:text format=" $(name)_$(ddx)"/>
<admst:if test="[type='integer']">=0</admst:if>
<admst:if test="[type='real']">=0.0</admst:if>
<admst:text format=";\n"/>
</admst:for-each>
</admst:for-each>
<admst:apply-templates select="tree" match="af:print:derivate">
<admst:value-of select="returned('x')/value"/>
<admst:text format="%s"/>
</admst:apply-templates>
<admst:text format="\nreturn "/>
<admst:join select="$globalanalogfunction/variable[input='yes']" separator="+">
<admst:value-of select="name"/>
<admst:value-of select="name"/>
<admst:text format="$(function)_%s*d_%s"/>
</admst:join>
<admst:text format=";\n"/>
<admst:text format="}"/>
</admst:for-each>
</admst:template>
<admst:variable name="globalanalogfunction" />
<admst:for-each select="/module">
<admst:value-of select="attribute[name='ngspicename']/value" />
<admst:open file="%sanalogfunction.c">
<admst:value-of select="/simulator/package_string" />
<admst:text format="/***\n*** Interface: %s\n" />
<admst:value-of select="/simulator/currentdate" />
<admst:value-of select="/simulator/fullname" />
<admst:text format=" *** created by: %s - %s ***/\n" />
<admst:apply-templates select="." match="code" />
</admst:open>
<admst:value-of select="attribute[name='ngspicename']/value" />
<admst:message format="%sanalogfunction.c: file created\n" />
</admst:for-each>
</admst>

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Written by Francesc Vila - francesc.vila@gmail.com
Documentation:
http://sourceforge.net/docman/display_doc.php?docid=18993&group_id=84289
Target Interface: ngspice
Supported by adms-1.x.x
This file is used by adms - http://sourceforge.net/projects/mot-adms.
adms is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
adms is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with adms; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-->
<!DOCTYPE admst SYSTEM "admst.dtd">
<admst version="2.3.0" xmlns:admst="http://mot-adms.sourceforge.net/xml-files/admst">
<admst:template match="dectype">
<admst:choose>
<admst:when test="[type='real']">
<admst:text format="double " />
</admst:when>
<admst:when test="[type='integer']">
<admst:text format="int " />
</admst:when>
<admst:otherwise>
<admst:text format="char* " />
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:template match="code">
<admst:value-of select="attribute[name='ngspicename']/value" />
<admst:variable name="module" select="%s" />
#ifndef $(module)analogfunction
#define $(module)analogfunction
<admst:for-each select="analogfunction">
<admst:value-of select="name" />
<admst:variable name="function" value="%s" />
<admst:apply-templates select="." match="dectype" />
<admst:text format="$(module)_$function(" />
<admst:join select="variable[input='yes']" separator=", ">
<admst:value-of select="name"/>
<admst:apply-templates select="." match="dectype" />
<admst:text format="%s"/>
</admst:join>
<admst:text format=");\n" />
<admst:apply-templates select="." match="dectype" />
<admst:text format="d_$(module)_$function(" />
<admst:join select="variable[input='yes']" separator=", ">
<admst:value-of select="name"/>
<admst:apply-templates select="." match="dectype" />
<admst:text format="%s"/>
</admst:join>
<admst:text format="," />
<admst:join select="variable[input='yes']" separator=", ">
<admst:value-of select="name"/>
<admst:apply-templates select="." match="dectype" />
<admst:text format="d_%s"/>
</admst:join>
<admst:text format=");\n" />
</admst:for-each>
#endif /* $(module)analogfunction */
</admst:template>
<admst:for-each select="/module">
<admst:value-of select="attribute[name='ngspicename']/value" />
<admst:open file="%sanalogfunction.h">
<admst:value-of select="/simulator/package_string" />
<admst:text format="/***\n*** Interface: %s\n" />
<admst:value-of select="/simulator/currentdate" />
<admst:value-of select="/simulator/fullname" />
<admst:text format=" *** created by: %s - %s ***/\n" />
<admst:apply-templates select="." match="code" />
</admst:open>
<admst:value-of select="attribute[name='ngspicename']/value" />
<admst:message format="%sanalogfunction.h: file created\n" />
</admst:for-each>
</admst>

View File

@ -319,7 +319,7 @@ typedef struct s$(module)model { /* model structure */
#include &quot;$(module)ext.h&quot;
<admst:if test="[not(nilled(analogfunction))]">
#include &quot;analogfunction.h&quot;
#include &quot;$(module)analogfunction.h&quot;
</admst:if>
#endif /*$(module)*/

View File

@ -37,7 +37,26 @@
<admst:when test="[name='\$model']"><admst:return name="fname" value="_modelname"/></admst:when>
<admst:when test="[name='\$instance']"><admst:return name="fname" value="_instancename"/></admst:when>
<admst:when test="[name='\$temperature']"><admst:return name="fname" value="_circuit_temp"/></admst:when>
<admst:otherwise><admst:return name="fname" value="%(name)"/></admst:otherwise>
<admst:when test="[name='hypot']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='max']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='min']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='pow']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='mult']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='add']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='cos']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sin']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='tan']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='cosh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sinh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='tanh']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='acos']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='asin']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='atan']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='sqrt']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:when test="[name='exp']"><admst:return name="fname" value="%(name)" /></admst:when>
<admst:otherwise><admst:return name="fname" value="$(module)_%(name)"/></admst:otherwise>
</admst:choose>
</admst:template>

View File

@ -54,7 +54,9 @@ BUILT_SOURCES = \\
$(module)pzld.c \\
$(module)setup.c \\
$(module)temp.c \\
$(module)trunc.c
$(module)trunc.c \\
$(module)analogfunction.h \\
$(module)analogfunction.c
lib$(module)_la_SOURCES = \\
\$(BUILT_SOURCES)
@ -84,7 +86,7 @@ DISTCLEANFILES = Makefile.am \\
\%.c \%.hxx \\
\%acld.c \%ask.c \%defs.h \%del.c \%dest.c \%ext.h \%guesstopology.c \\
\%init.c \%init.h \%itf.h \%load.c \%mask.c \%mdel.c \%mpar.c \%par.c \\
\%pzld.c \%setup.c \%temp.c \%trunc.c \\
\%pzld.c \%setup.c \%temp.c \%trunc.c \%analogfunction.h \%analogfunction.c \\
: \$(srcdir)/admsva/\%.va \\
\$(ADMSXMLINTERFACE)/ngspiceVersion.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULEitf.h.xml \\
@ -108,7 +110,9 @@ DISTCLEANFILES = Makefile.am \\
\$(ADMSXMLINTERFACE)/ngspiceMODULEnoise.c.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULEguesstopology.c.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULE.hxx.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml
\$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULEanalogfunction.h.xml \\
\$(ADMSXMLINTERFACE)/ngspiceMODULEanalogfunction.c.xml
admsXml -I\$(srcdir) -I\$(srcdir)/admsva \$&lt; \\
-e \$(ADMSXMLINTERFACE)/ngspiceVersion.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULEitf.h.xml \\
@ -132,7 +136,9 @@ DISTCLEANFILES = Makefile.am \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULEnoise.c.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULEguesstopology.c.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULE.hxx.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml
-e \$(ADMSXMLINTERFACE)/ngspiceMODULE.c.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULEanalogfunction.h.xml \\
-e \$(ADMSXMLINTERFACE)/ngspiceMODULEanalogfunction.c.xml
</admst:template>