move code from ngspiceMODULE.hxx.xml to ngspiceMODULEanalogfunction.c.xml
This commit is contained in:
parent
8499ef0428
commit
af22f83b8f
|
|
@ -85,58 +85,6 @@
|
|||
</admst:if>
|
||||
</admst:template>
|
||||
|
||||
<admst:template match="c:analogfunction:math_h">
|
||||
inline double _cos(double arg) { return cos(arg); }
|
||||
inline double _d0_cos(double arg) { return (-sin(arg)); }
|
||||
inline double _sin(double arg) { return sin(arg); }
|
||||
inline double _d0_sin(double arg) { return (cos(arg)); }
|
||||
inline double _tan(double arg) { return tan(arg); }
|
||||
inline double _d0_tan(double arg) { return (1.0/cos(arg)/cos(arg)); }
|
||||
inline double _cosh(double arg) { return cosh(arg); }
|
||||
inline double _d0_cosh(double arg) { return (sinh(arg)); }
|
||||
inline double _sinh(double arg) { return sinh(arg); }
|
||||
inline double _d0_sinh(double arg) { return (cosh(arg)); }
|
||||
inline double _tanh(double arg) { return tanh(arg); }
|
||||
inline double _d0_tanh(double arg) { return (1.0/cosh(arg)/cosh(arg)); }
|
||||
inline double _acos(double arg) { return acos(arg); }
|
||||
inline double _d0_acos(double arg) { return (-1.0/sqrt(1-arg*arg)); }
|
||||
inline double _asin(double arg) { return asin(arg); }
|
||||
inline double _d0_asin(double arg) { return (+1.0/sqrt(1-arg*arg)); }
|
||||
inline double _atan(double arg) { return atan(arg); }
|
||||
inline double _d0_atan(double arg) { return (+1.0/(1+arg*arg)); }
|
||||
inline double _logE(double arg) { return log(arg); }
|
||||
inline double _d0_logE(double arg) { return (1.0/arg); }
|
||||
inline double _log10(double arg) { return log10(arg); }
|
||||
inline double _d0_log10(double arg) { return (1.0/arg/log(10)); }
|
||||
inline double _exp(double arg) { return exp(arg); }
|
||||
inline double _d0_exp(double arg) { return exp(arg); }
|
||||
inline double _sqrt(double arg) { return sqrt(arg); }
|
||||
inline double _d0_sqrt(double arg) { return (1.0/sqrt(arg)/2.0); }
|
||||
inline double _abs(double arg) { return fabs(arg); }
|
||||
inline double _d0_abs(double arg) { return (((arg)>=0)?(+1.0):(-1.0)); }
|
||||
|
||||
inline double _hypot(double x,double y) { return sqrt((x)*(x)+(y)*(y)); }
|
||||
inline double _d0_hypot(double x,double y) { return (x)/sqrt((x)*(x)+(y)*(y)); }
|
||||
inline double _d1_hypot(double x,double y) { return (y)/sqrt((x)*(x)+(y)*(y)); }
|
||||
|
||||
inline double _max(double x,double y) { return ((x)>(y))?(x):(y); }
|
||||
inline double _d0_max(double x,double y) { return ((x)>(y))?1.0:0.0; }
|
||||
inline double _d1_max(double x,double y) { return ((x)>(y))?0.0:1.0; }
|
||||
|
||||
inline double _min(double x,double y) { return ((x)<(y))?(x):(y); }
|
||||
inline double _d0_min(double x,double y) { return ((x)<(y))?1.0:0.0; }
|
||||
inline double _d1_min(double x,double y) { return ((x)<(y))?0.0:1.0; }
|
||||
|
||||
inline double _pow(double x,double y) { return pow(x,y); }
|
||||
inline double _d0_pow(double x,double y) { return (x==0.0)?0.0:((y/x)*pow(x,y)); }
|
||||
inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((log(x)/exp(0.0))*pow(x,y)); }
|
||||
|
||||
#define _limexp(arg) _exp(val,arg)
|
||||
#define _d_limexp(arg) _d_exp(val,dval,arg)
|
||||
|
||||
</admst:template>
|
||||
|
||||
|
||||
<!-- compute node arguments of noise routines -->
|
||||
<admst:template match="noisebranch">
|
||||
<admst:variable name="n1" select=""/>
|
||||
|
|
@ -225,789 +173,6 @@ inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((log(x)/exp(0.
|
|||
<admst:otherwise><admst:value-of select="name"/><admst:return name="function:getname" value="%s"/></admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
<admst:template match="af:print:expression">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='expression']">
|
||||
<admst:apply-templates select="tree" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="expression" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dx_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="$expression"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="$(dx_%s)"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='probe']">
|
||||
<admst:fatal format="probe not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='variable']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="variable" select="%s"/>
|
||||
<admst:return name="x" value="$variable"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="ddx" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$variable='$ddx']">
|
||||
<admst:return name="dx.$ddx" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="../..[input='yes']">
|
||||
<admst:return name="dx.$ddx" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$ddx" value="$(variable)_$ddx"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_unary']">
|
||||
<admst:if test="[name='plus']">
|
||||
<admst:variable name="op" select="+"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='minus']">
|
||||
<admst:variable name="op" select="-"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='not']">
|
||||
<admst:variable name="op" select="!"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='bw_not']">
|
||||
<admst:variable name="op" select="~"/>
|
||||
</admst:if>
|
||||
<admst:apply-templates select="arg1" match="af:print:expression"><admst:value-of select="returned('x')/value"/><admst:variable name="arg1" select="%s"/></admst:apply-templates>
|
||||
<admst:return name="x" value="($op$arg1)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_binary']">
|
||||
<admst:apply-templates select="arg1" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="x" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dx_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg2" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="y" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dy_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:choose>
|
||||
<admst:when test="[name='addp']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="(+$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:return name="x" value="$x"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x+$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="(+$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx+$dy)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='addm']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="(-$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:return name="x" value="$x"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x-$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="(-$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx-$dy)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multtime']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' or $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:return name="x" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x*$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' or $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($x)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="($y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="($x*$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx*$y"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0' and $dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($x+$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0']">
|
||||
<admst:return name="dx.$df" value="($y+($dy*$x))"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($dx*$y)+$x"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0']">
|
||||
<admst:return name="dx.$df" value="$dy"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='1.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(($dx*$y)+($x*$dy))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multdiv']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:return name="x" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x/$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$(df))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(-1/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(-$dy/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(-$x/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(-($x*$dy)/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="(1/$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(($y-$x)/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(($y-($x*$dy))/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:choose>
|
||||
<admst:when test="[$y='1.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx/$y"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(($dx*$y)-$x)/($y*$y)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx*$y-$x*$dy)/($y*$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:choose>
|
||||
<admst:when test="[name='bw_equr']">
|
||||
<admst:return name="x" value="($x^~$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_equl']">
|
||||
<admst:return name="x" value="($x~^$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_xor']">
|
||||
<admst:return name="x" value="($x^$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_or']">
|
||||
<admst:return name="x" value="($x|$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_and']">
|
||||
<admst:return name="x" value="($x&$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='or']">
|
||||
<admst:return name="x" value="($x||$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='and']">
|
||||
<admst:return name="x" value="($x&&$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='equ']">
|
||||
<admst:return name="x" value="($x==$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multmod']">
|
||||
<admst:return name="x" value="((int)$x%%(int)$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='notequ']">
|
||||
<admst:return name="x" value="($x!=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='lt']">
|
||||
<admst:return name="x" value="($x<$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='lt_equ']">
|
||||
<admst:return name="x" value="($x<=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='gt']">
|
||||
<admst:return name="x" value="($x>$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='gt_equ']">
|
||||
<admst:return name="x" value="($x>=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='shiftr']">
|
||||
<admst:return name="x" value="($x>>$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='shiftl']">
|
||||
<admst:return name="x" value="($x<<$y)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:error format="%s: function not handled\n"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_ternary']">
|
||||
<admst:apply-templates select="arg1" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="x" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg2" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="y" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg3" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="z" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="[name='conditional']">
|
||||
<admst:return name="x" value="($x?$y:$z)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="($x?$dy_%s:$dz_%s)"/>
|
||||
</admst:for-each>
|
||||
</admst:if>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='function']">
|
||||
<admst:apply-templates select="." match="function:getname">
|
||||
<admst:value-of select="returned('function:getname')/value"/>
|
||||
<admst:variable name="function" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="arguments">
|
||||
<admst:if test="[not($args='')]">
|
||||
<admst:variable name="args" select="$args,"/>
|
||||
</admst:if>
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="arg$(index)_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:choose>
|
||||
<admst:when test="[ name='cos' or name='sin' or name='tan' or name='cosh' or name='sinh' or name='tanh' or name='acos' or name='asin'
|
||||
or name='atan' or name='ln' or name='log' or name='exp' or name='sqrt' or name='abs' or name='limexp'
|
||||
or name='div' or name='pow' or name='hypot' or name='min' or name='max' ]">
|
||||
<admst:return name="x" value="_$function($args)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/> <admst:variable name="name" select="%s"/>
|
||||
<admst:variable name="ret" select=""/>
|
||||
<admst:for-each select="../../arguments">
|
||||
<admst:if test="[not($ret='')]">
|
||||
<admst:variable name="ret" select="$ret+"/>
|
||||
</admst:if>
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:variable name="ret" select="$(ret)_d$(index)_$function($args)*($(arg$(index)_$name))"/>
|
||||
</admst:for-each>
|
||||
<admst:return name="dx.$name" value="$ret"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="$function($args)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/> <admst:variable name="name" select="%s"/>
|
||||
<admst:variable name="darg" select=""/>
|
||||
<admst:for-each select="../../arguments">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:variable name="darg" select="$darg,($(arg$(index)_$name))"/>
|
||||
</admst:for-each>
|
||||
<admst:return name="dx.$name" value="d_$function($args$darg)"/>
|
||||
</admst:for-each>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='string']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value=""%s""/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='number']">
|
||||
<admst:choose>
|
||||
<admst:when test="[scalingunit='1']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="%s"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='E']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+18)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='P']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+15)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='T']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+12)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='G']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+9)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='M']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+6)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='k']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+3)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='h']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+2)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='D']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+1)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='d']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-1)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='c']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-2)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='m']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-3)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='u']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-6)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='n']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-9)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='A']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-10)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='p']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-12)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='f']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-15)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='a']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-18)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:value-of select="scalingunit"/>
|
||||
<admst:fatal format="scaling unit not supported: %s\n"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
<admst:template match="af:print:derivate">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='callfunction']">
|
||||
<admst:choose>
|
||||
<admst:when test="function[name='\$strobe']">
|
||||
<admst:variable name="outputfile" select="stdout"/>
|
||||
</admst:when>
|
||||
</admst:choose>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="function/arguments">
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args,%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="fprintf($outputfile$args); fprintf($outputfile,"\n");\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='whileloop']">
|
||||
<admst:apply-templates select="whileblock" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="whileblock" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="while" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="while" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="while($whileblock)\n$while"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='conditional']">
|
||||
<admst:apply-templates select="if" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="if" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="then" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="else">
|
||||
<admst:apply-templates select="else" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="$(then)else\n%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:if>
|
||||
<admst:return name="x" value="if($if)\n$then"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='case']">
|
||||
<admst:apply-templates select="case" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="switch ((int)%s) {\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:for-each select="caseitem">
|
||||
<admst:variable name="condition" select=""/>
|
||||
<admst:for-each select="condition">
|
||||
<admst:value-of select="."/>
|
||||
<admst:variable name="condition" select="$condition case %s:"/>
|
||||
</admst:for-each>
|
||||
<admst:variable name="case" select="$case $condition"/>
|
||||
<admst:if test="[defaultcase='yes']">
|
||||
<admst:variable name="case" select="$case default:"/>
|
||||
</admst:if>
|
||||
<admst:variable name="case" select="$case \n"/>
|
||||
<admst:apply-templates select="code" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="$case%s break;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="$case }"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='contribution']">
|
||||
<admst:fatal format="contribution not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='assignment']">
|
||||
<admst:value-of select="lhs/name"/>
|
||||
<admst:variable name="lhs" select="%s"/>
|
||||
<admst:apply-templates select="rhs" match="af:print:expression">
|
||||
<admst:variable name="rhs" select=""/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="rhs" select="$rhs$(lhs)_%s=%s;\n"/>
|
||||
</admst:for-each>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="rhs" select="$rhs$lhs=%s;\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="{$rhs}\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='nilled']">
|
||||
<admst:return name="x" value=";"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='block']">
|
||||
<admst:variable name="block" select=""/>
|
||||
<admst:for-each select="item">
|
||||
<admst:apply-templates select="." match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="block" select="$block%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="{$block}"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
<admst:template match="af:print">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='callfunction']">
|
||||
<admst:choose>
|
||||
<admst:when test="function[name='\$strobe']">
|
||||
<admst:variable name="outputfile" select="stdout"/>
|
||||
</admst:when>
|
||||
</admst:choose>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="function/arguments">
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args,%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="fprintf($outputfile$args); fprintf($outputfile,"\n");\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='whileloop']">
|
||||
<admst:apply-templates select="whileblock" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="whileblock" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="while" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="while" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="while($whileblock)\n$while"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='conditional']">
|
||||
<admst:apply-templates select="if" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="if" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="then" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="else">
|
||||
<admst:apply-templates select="else" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="$(then)else\n%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:if>
|
||||
<admst:return name="x" value="if($if)\n$then"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='case']">
|
||||
<admst:apply-templates select="case" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="switch ((int)%s) {\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:for-each select="caseitem">
|
||||
<admst:variable name="condition" select=""/>
|
||||
<admst:for-each select="condition">
|
||||
<admst:value-of select="."/>
|
||||
<admst:variable name="condition" select="$condition case %s:"/>
|
||||
</admst:for-each>
|
||||
<admst:variable name="case" select="$case $condition"/>
|
||||
<admst:if test="[defaultcase='yes']">
|
||||
<admst:variable name="case" select="$case default:"/>
|
||||
</admst:if>
|
||||
<admst:variable name="case" select="$case \n"/>
|
||||
<admst:apply-templates select="code" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="$case%s break;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="$case }"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='contribution']">
|
||||
<admst:fatal format="contribution not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='assignment']">
|
||||
<admst:apply-templates select="rhs" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:value-of select="../lhs/name"/>
|
||||
<admst:return name="x" value="%s=%s;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='nilled']">
|
||||
<admst:return name="x" value=";"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='block']">
|
||||
<admst:variable name="block" select=""/>
|
||||
<admst:for-each select="item">
|
||||
<admst:apply-templates select="." match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="block" select="$block%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="{$block}"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
|
||||
<!--
|
||||
* Returns the type of a variable. The returned type
|
||||
|
|
|
|||
|
|
@ -0,0 +1,835 @@
|
|||
<admst:template match="c:analogfunction:math_h">
|
||||
inline double _cos(double arg) { return cos(arg); }
|
||||
inline double _d0_cos(double arg) { return (-sin(arg)); }
|
||||
inline double _sin(double arg) { return sin(arg); }
|
||||
inline double _d0_sin(double arg) { return (cos(arg)); }
|
||||
inline double _tan(double arg) { return tan(arg); }
|
||||
inline double _d0_tan(double arg) { return (1.0/cos(arg)/cos(arg)); }
|
||||
inline double _cosh(double arg) { return cosh(arg); }
|
||||
inline double _d0_cosh(double arg) { return (sinh(arg)); }
|
||||
inline double _sinh(double arg) { return sinh(arg); }
|
||||
inline double _d0_sinh(double arg) { return (cosh(arg)); }
|
||||
inline double _tanh(double arg) { return tanh(arg); }
|
||||
inline double _d0_tanh(double arg) { return (1.0/cosh(arg)/cosh(arg)); }
|
||||
inline double _acos(double arg) { return acos(arg); }
|
||||
inline double _d0_acos(double arg) { return (-1.0/sqrt(1-arg*arg)); }
|
||||
inline double _asin(double arg) { return asin(arg); }
|
||||
inline double _d0_asin(double arg) { return (+1.0/sqrt(1-arg*arg)); }
|
||||
inline double _atan(double arg) { return atan(arg); }
|
||||
inline double _d0_atan(double arg) { return (+1.0/(1+arg*arg)); }
|
||||
inline double _logE(double arg) { return log(arg); }
|
||||
inline double _d0_logE(double arg) { return (1.0/arg); }
|
||||
inline double _log10(double arg) { return log10(arg); }
|
||||
inline double _d0_log10(double arg) { return (1.0/arg/log(10)); }
|
||||
inline double _exp(double arg) { return exp(arg); }
|
||||
inline double _d0_exp(double arg) { return exp(arg); }
|
||||
inline double _sqrt(double arg) { return sqrt(arg); }
|
||||
inline double _d0_sqrt(double arg) { return (1.0/sqrt(arg)/2.0); }
|
||||
inline double _abs(double arg) { return fabs(arg); }
|
||||
inline double _d0_abs(double arg) { return (((arg)>=0)?(+1.0):(-1.0)); }
|
||||
|
||||
inline double _hypot(double x,double y) { return sqrt((x)*(x)+(y)*(y)); }
|
||||
inline double _d0_hypot(double x,double y) { return (x)/sqrt((x)*(x)+(y)*(y)); }
|
||||
inline double _d1_hypot(double x,double y) { return (y)/sqrt((x)*(x)+(y)*(y)); }
|
||||
|
||||
inline double _max(double x,double y) { return ((x)>(y))?(x):(y); }
|
||||
inline double _d0_max(double x,double y) { return ((x)>(y))?1.0:0.0; }
|
||||
inline double _d1_max(double x,double y) { return ((x)>(y))?0.0:1.0; }
|
||||
|
||||
inline double _min(double x,double y) { return ((x)<(y))?(x):(y); }
|
||||
inline double _d0_min(double x,double y) { return ((x)<(y))?1.0:0.0; }
|
||||
inline double _d1_min(double x,double y) { return ((x)<(y))?0.0:1.0; }
|
||||
|
||||
inline double _pow(double x,double y) { return pow(x,y); }
|
||||
inline double _d0_pow(double x,double y) { return (x==0.0)?0.0:((y/x)*pow(x,y)); }
|
||||
inline double _d1_pow(double x,double y) { return (x==0.0)?0.0:((log(x)/exp(0.0))*pow(x,y)); }
|
||||
|
||||
#define _limexp(arg) _exp(val,arg)
|
||||
#define _d_limexp(arg) _d_exp(val,dval,arg)
|
||||
|
||||
</admst:template>
|
||||
|
||||
|
||||
<admst:template match="af:print:expression">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='expression']">
|
||||
<admst:apply-templates select="tree" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="expression" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dx_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="$expression"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="$(dx_%s)"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='probe']">
|
||||
<admst:fatal format="probe not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='variable']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="variable" select="%s"/>
|
||||
<admst:return name="x" value="$variable"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="ddx" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$variable='$ddx']">
|
||||
<admst:return name="dx.$ddx" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="../..[input='yes']">
|
||||
<admst:return name="dx.$ddx" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$ddx" value="$(variable)_$ddx"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_unary']">
|
||||
<admst:if test="[name='plus']">
|
||||
<admst:variable name="op" select="+"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='minus']">
|
||||
<admst:variable name="op" select="-"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='not']">
|
||||
<admst:variable name="op" select="!"/>
|
||||
</admst:if>
|
||||
<admst:if test="[name='bw_not']">
|
||||
<admst:variable name="op" select="~"/>
|
||||
</admst:if>
|
||||
<admst:apply-templates select="arg1" match="af:print:expression"><admst:value-of select="returned('x')/value"/><admst:variable name="arg1" select="%s"/></admst:apply-templates>
|
||||
<admst:return name="x" value="($op$arg1)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_binary']">
|
||||
<admst:apply-templates select="arg1" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="x" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dx_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg2" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="y" select="%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="dy_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
<admst:choose>
|
||||
<admst:when test="[name='addp']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="(+$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:return name="x" value="$x"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x+$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="(+$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx+$dy)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='addm']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="(-$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:return name="x" value="$x"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x-$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='0.0']">
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="(-$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx-$dy)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multtime']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' or $y='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:return name="x" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x*$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' or $y='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$df)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0' and $y='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($x)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="($y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:return name="dx.$df" value="($x*$dy)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx*$y"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0' and $dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($x+$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0']">
|
||||
<admst:return name="dx.$df" value="($y+($dy*$x))"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="($dx*$y)+$x"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0']">
|
||||
<admst:return name="dx.$df" value="$dy"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$y='1.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(($dx*$y)+($x*$dy))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multdiv']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="x" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:return name="x" value="1.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="($x/$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/><admst:variable name="df" select="%s"/>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0' and $y='1.0']">
|
||||
<admst:variable name="dx" select="0.0"/>
|
||||
<admst:variable name="dy" select="0.0"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:variable name="dx" select="$(dx_$df)"/>
|
||||
<admst:variable name="dy" select="$(dy_$(df))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:choose>
|
||||
<admst:when test="[$x='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0' and $dy='0.0']">
|
||||
<admst:return name="dx.$df" value="0.0"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$x='1.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(-1/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(-$dy/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='0.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(-$x/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(-($x*$dy)/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="[$dx='1.0']">
|
||||
<admst:choose>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="(1/$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(($y-$x)/($y*$y))"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="(($y-($x*$dy))/($y*$y))"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:choose>
|
||||
<admst:when test="[$y='1.0']">
|
||||
<admst:return name="dx.$df" value="$dx"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='0.0']">
|
||||
<admst:return name="dx.$df" value="$dx/$y"/>
|
||||
</admst:when>
|
||||
<admst:when test="[$dy='1.0']">
|
||||
<admst:return name="dx.$df" value="(($dx*$y)-$x)/($y*$y)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="dx.$df" value="($dx*$y-$x*$dy)/($y*$y)"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:choose>
|
||||
<admst:when test="[name='bw_equr']">
|
||||
<admst:return name="x" value="($x^~$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_equl']">
|
||||
<admst:return name="x" value="($x~^$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_xor']">
|
||||
<admst:return name="x" value="($x^$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_or']">
|
||||
<admst:return name="x" value="($x|$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='bw_and']">
|
||||
<admst:return name="x" value="($x&$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='or']">
|
||||
<admst:return name="x" value="($x||$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='and']">
|
||||
<admst:return name="x" value="($x&&$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='equ']">
|
||||
<admst:return name="x" value="($x==$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='multmod']">
|
||||
<admst:return name="x" value="((int)$x%%(int)$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='notequ']">
|
||||
<admst:return name="x" value="($x!=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='lt']">
|
||||
<admst:return name="x" value="($x<$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='lt_equ']">
|
||||
<admst:return name="x" value="($x<=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='gt']">
|
||||
<admst:return name="x" value="($x>$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='gt_equ']">
|
||||
<admst:return name="x" value="($x>=$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='shiftr']">
|
||||
<admst:return name="x" value="($x>>$y)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[name='shiftl']">
|
||||
<admst:return name="x" value="($x<<$y)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:error format="%s: function not handled\n"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='mapply_ternary']">
|
||||
<admst:apply-templates select="arg1" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="x" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg2" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="y" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="arg3" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="z" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="[name='conditional']">
|
||||
<admst:return name="x" value="($x?$y:$z)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="($x?$dy_%s:$dz_%s)"/>
|
||||
</admst:for-each>
|
||||
</admst:if>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='function']">
|
||||
<admst:apply-templates select="." match="function:getname">
|
||||
<admst:value-of select="returned('function:getname')/value"/>
|
||||
<admst:variable name="function" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="arguments">
|
||||
<admst:if test="[not($args='')]">
|
||||
<admst:variable name="args" select="$args,"/>
|
||||
</admst:if>
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args%s"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="arg$(index)_%s" select="%s"/>
|
||||
</admst:for-each>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:choose>
|
||||
<admst:when test="[ name='cos' or name='sin' or name='tan' or name='cosh' or name='sinh' or name='tanh' or name='acos' or name='asin'
|
||||
or name='atan' or name='ln' or name='log' or name='exp' or name='sqrt' or name='abs' or name='limexp'
|
||||
or name='div' or name='pow' or name='hypot' or name='min' or name='max' ]">
|
||||
<admst:return name="x" value="_$function($args)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/> <admst:variable name="name" select="%s"/>
|
||||
<admst:variable name="ret" select=""/>
|
||||
<admst:for-each select="../../arguments">
|
||||
<admst:if test="[not($ret='')]">
|
||||
<admst:variable name="ret" select="$ret+"/>
|
||||
</admst:if>
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:variable name="ret" select="$(ret)_d$(index)_$function($args)*($(arg$(index)_$name))"/>
|
||||
</admst:for-each>
|
||||
<admst:return name="dx.$name" value="$ret"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:return name="x" value="$function($args)"/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/> <admst:variable name="name" select="%s"/>
|
||||
<admst:variable name="darg" select=""/>
|
||||
<admst:for-each select="../../arguments">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:variable name="darg" select="$darg,($(arg$(index)_$name))"/>
|
||||
</admst:for-each>
|
||||
<admst:return name="dx.$name" value="d_$function($args$darg)"/>
|
||||
</admst:for-each>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='string']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value=""%s""/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='number']">
|
||||
<admst:choose>
|
||||
<admst:when test="[scalingunit='1']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="%s"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='E']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+18)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='P']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+15)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='T']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+12)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='G']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+9)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='M']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+6)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='k']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+3)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='h']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+2)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='D']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e+1)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='d']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-1)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='c']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-2)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='m']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-3)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='u']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-6)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='n']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-9)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='A']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-10)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='p']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-12)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='f']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-15)"/>
|
||||
</admst:when>
|
||||
<admst:when test="[scalingunit='a']">
|
||||
<admst:value-of select="value"/>
|
||||
<admst:return name="x" value="(%s*1.0e-18)"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
<admst:value-of select="scalingunit"/>
|
||||
<admst:fatal format="scaling unit not supported: %s\n"/>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:return name="dx.%s" value="0.0"/>
|
||||
</admst:for-each>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
<admst:template match="af:print:derivate">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='callfunction']">
|
||||
<admst:choose>
|
||||
<admst:when test="function[name='\$strobe']">
|
||||
<admst:variable name="outputfile" select="stdout"/>
|
||||
</admst:when>
|
||||
</admst:choose>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="function/arguments">
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args,%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="fprintf($outputfile$args); fprintf($outputfile,"\n");\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='whileloop']">
|
||||
<admst:apply-templates select="whileblock" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="whileblock" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="while" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="while" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="while($whileblock)\n$while"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='conditional']">
|
||||
<admst:apply-templates select="if" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="if" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="then" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="else">
|
||||
<admst:apply-templates select="else" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="$(then)else\n%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:if>
|
||||
<admst:return name="x" value="if($if)\n$then"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='case']">
|
||||
<admst:apply-templates select="case" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="switch ((int)%s) {\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:for-each select="caseitem">
|
||||
<admst:variable name="condition" select=""/>
|
||||
<admst:for-each select="condition">
|
||||
<admst:value-of select="."/>
|
||||
<admst:variable name="condition" select="$condition case %s:"/>
|
||||
</admst:for-each>
|
||||
<admst:variable name="case" select="$case $condition"/>
|
||||
<admst:if test="[defaultcase='yes']">
|
||||
<admst:variable name="case" select="$case default:"/>
|
||||
</admst:if>
|
||||
<admst:variable name="case" select="$case \n"/>
|
||||
<admst:apply-templates select="code" match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="$case%s break;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="$case }"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='contribution']">
|
||||
<admst:fatal format="contribution not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='assignment']">
|
||||
<admst:value-of select="lhs/name"/>
|
||||
<admst:variable name="lhs" select="%s"/>
|
||||
<admst:apply-templates select="rhs" match="af:print:expression">
|
||||
<admst:variable name="rhs" select=""/>
|
||||
<admst:for-each select="$globalanalogfunction/variable[input='yes']">
|
||||
<admst:value-of select="name"/>
|
||||
<admst:value-of select="returned('dx.%s')/value"/>
|
||||
<admst:value-of select="name"/>
|
||||
<admst:variable name="rhs" select="$rhs$(lhs)_%s=%s;\n"/>
|
||||
</admst:for-each>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="rhs" select="$rhs$lhs=%s;\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="{$rhs}\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='nilled']">
|
||||
<admst:return name="x" value=";"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='block']">
|
||||
<admst:variable name="block" select=""/>
|
||||
<admst:for-each select="item">
|
||||
<admst:apply-templates select="." match="af:print:derivate">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="block" select="$block%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="{$block}"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
<admst:template match="af:print">
|
||||
<admst:choose>
|
||||
<admst:when test="adms[datatypename='callfunction']">
|
||||
<admst:choose>
|
||||
<admst:when test="function[name='\$strobe']">
|
||||
<admst:variable name="outputfile" select="stdout"/>
|
||||
</admst:when>
|
||||
</admst:choose>
|
||||
<admst:variable name="args" select=""/>
|
||||
<admst:for-each select="function/arguments">
|
||||
<admst:apply-templates select="." match="af:print:expression">
|
||||
<admst:value-of select="index(../arguments,.)"/>
|
||||
<admst:variable name="index" select="%s"/>
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="args" select="$args,%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="fprintf($outputfile$args); fprintf($outputfile,"\n");\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='whileloop']">
|
||||
<admst:apply-templates select="whileblock" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="whileblock" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="while" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="while" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:return name="x" value="while($whileblock)\n$while"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='conditional']">
|
||||
<admst:apply-templates select="if" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="if" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:apply-templates select="then" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="%s"/>
|
||||
</admst:apply-templates>
|
||||
<admst:if test="else">
|
||||
<admst:apply-templates select="else" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="then" select="$(then)else\n%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:if>
|
||||
<admst:return name="x" value="if($if)\n$then"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='case']">
|
||||
<admst:apply-templates select="case" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="switch ((int)%s) {\n"/>
|
||||
</admst:apply-templates>
|
||||
<admst:for-each select="caseitem">
|
||||
<admst:variable name="condition" select=""/>
|
||||
<admst:for-each select="condition">
|
||||
<admst:value-of select="."/>
|
||||
<admst:variable name="condition" select="$condition case %s:"/>
|
||||
</admst:for-each>
|
||||
<admst:variable name="case" select="$case $condition"/>
|
||||
<admst:if test="[defaultcase='yes']">
|
||||
<admst:variable name="case" select="$case default:"/>
|
||||
</admst:if>
|
||||
<admst:variable name="case" select="$case \n"/>
|
||||
<admst:apply-templates select="code" match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="case" select="$case%s break;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="$case }"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='contribution']">
|
||||
<admst:fatal format="contribution not allowed inside analog functions\n"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='assignment']">
|
||||
<admst:apply-templates select="rhs" match="af:print:expression">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:value-of select="../lhs/name"/>
|
||||
<admst:return name="x" value="%s=%s;\n"/>
|
||||
</admst:apply-templates>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='nilled']">
|
||||
<admst:return name="x" value=";"/>
|
||||
</admst:when>
|
||||
<admst:when test="adms[datatypename='block']">
|
||||
<admst:variable name="block" select=""/>
|
||||
<admst:for-each select="item">
|
||||
<admst:apply-templates select="." match="af:print">
|
||||
<admst:value-of select="returned('x')/value"/>
|
||||
<admst:variable name="block" select="$block%s"/>
|
||||
</admst:apply-templates>
|
||||
</admst:for-each>
|
||||
<admst:return name="x" value="{$block}"/>
|
||||
</admst:when>
|
||||
<admst:otherwise>
|
||||
</admst:otherwise>
|
||||
</admst:choose>
|
||||
</admst:template>
|
||||
Loading…
Reference in New Issue