remove adms3 #2/2, files

This commit is contained in:
rlar 2012-10-25 18:53:29 +02:00
parent ba131a5077
commit 2142d39506
30 changed files with 0 additions and 16673 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,782 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
Tool 'prengspice.xml'
Copyright © 2011 Noovela - Author Laurent Lemaitre
This code IS to be used for non-commercial usage ONLY.
Note: publishing technical papers with the affiliation of a commercial company
which results are produced by the tool are typical commercial usage of the tool.
Commercial usage are subject to special fees.
Contact: r29173@noovela.com or www.noovela.com
-->
<!DOCTYPE admst PUBLIC "-//noovela//DTD_ADMST 2.3.0//FR" "admst.dtd">
<admst xmlns:admst="http://mot-adms.sourceforge.net/adms/admst.xml" version="2.3.0">
<admst:template match="adms.implicit.xml.module">
<admst:variable name="globalmodule" path="."/>
<admst:for-each select="modulenode">
<admst:value-to select="#module" path=".."/>
</admst:for-each>
<admst:apply-templates select="/items/tnode" match="godown"/>
<admst:apply-templates select="(modulefunctionp/functionpcode)|(modulecode)" match="init"/>
<admst:apply-templates select="(modulefunctionp/functionpcode)|(modulecode)" match="dependency"/>
<admst:for-each select="modulevariablep">
<admst:apply-templates select="default" match="e:init"/>
<admst:apply-templates select="default" match="e:#dependency"/>
</admst:for-each>
<admst:template match="modify">
<admst:choose>
<admst:when test="[datatypename='block']">
<admst:apply-templates select="reverse(blockcode)" match="modify"/>
<admst:value-to test="blockcode[#modifys=1]" select="#modifys" path="1"/>
<admst:value-to test="blockcode[#modifyd=1]" select="#modifyd" path="1"/>
<admst:value-to test="blockcode[#modifyfn=1]" select="#modifyfn" path="1"/>
<admst:value-to test="blockcode[#modifywn=1]" select="#modifywn" path="1"/>
<admst:value-to test="blockcode[#modifyc=1]" select="#modifyc" path="1"/>
</admst:when>
<admst:when test="[datatypename='conditional']">
<admst:apply-templates select="elsecode|thencode" match="modify"/>
<admst:value-to test="[thencode/#modifys=1 or elsecode/#modifys=1]" select="#modifys|ifcondition/@exvariable/#modifys" path="1"/>
<admst:value-to test="[thencode/#modifyd=1 or elsecode/#modifyd=1]" select="#modifyd|ifcondition/@exvariable/#modifyd" path="1"/>
<admst:value-to test="[thencode/#modifyfn=1 or elsecode/#modifyfn=1]" select="#modifyfn|ifcondition/@exvariable/#modifyfn" path="1"/>
<admst:value-to test="[thencode/#modifywn=1 or elsecode/#modifywn=1]" select="#modifywn|ifcondition/@exvariable/#modifywn" path="1"/>
<admst:value-to test="[thencode/#modifyc=1 or elsecode/#modifyc=1]" select="#modifyc|ifcondition/@exvariable/#modifyc" path="1"/>
</admst:when>
<admst:when test="[datatypename='whileloop']">
<admst:apply-templates select="whilecode" match="modify"/>
<admst:value-to test="[whilecode/#modifys=1]" select="#modifys|whilecondition/@exvariable/#modifys" path="1"/>
<admst:value-to test="[whilecode/#modifyd=1]" select="#modifyd|whilecondition/@exvariable/#modifyd" path="1"/>
<admst:value-to test="[whilecode/#modifyfn=1]" select="#modifyfn|whilecondition/@exvariable/#modifyfn" path="1"/>
<admst:value-to test="[whilecode/#modifywn=1]" select="#modifywn|whilecondition/@exvariable/#modifywn" path="1"/>
<admst:value-to test="[whilecode/#modifyc=1]" select="#modifyc|whilecondition/@exvariable/#modifyc" path="1"/>
<admst:apply-templates select="whilecode" match="modify"/>
</admst:when>
<admst:when test="[datatypename='forloop']">
<admst:apply-templates select="forcode" match="modify"/>
<admst:value-to test="[forcode/#modifys=1]" select="#modifys" path="1"/>
<admst:value-to test="[forcode/#modifyd=1]" select="#modifyd" path="1"/>
<admst:value-to test="[forcode/#modifyfn=1]" select="#modifyfn" path="1"/>
<admst:value-to test="[forcode/#modifywn=1]" select="#modifywn" path="1"/>
<admst:value-to test="[forcode/#modifyc=1]" select="#modifyc" path="1"/>
<admst:apply-templates select="forcode" match="modify"/>
</admst:when>
<admst:when test="[datatypename='case']">
<admst:apply-templates select="caseitem/casecode" match="modify"/>
<admst:for-each select="caseitem">
<admst:value-to test="[casecode/#modifys=1 and defaultcase='no']" select="#modifys|casealternative/@variable/#modifys" path="1"/>
<admst:value-to test="[casecode/#modifyd=1 and defaultcase='no']" select="#modifyd|casealternative/@variable/#modifyd" path="1"/>
<admst:value-to test="[casecode/#modifyfn=1 and defaultcase='no']" select="#modifyfn|casealternative/@variable/#modifyfn" path="1"/>
<admst:value-to test="[casecode/#modifywn=1 and defaultcase='no']" select="#modifywn|casealternative/@variable/#modifywn" path="1"/>
<admst:value-to test="[casecode/#modifyc=1 and defaultcase='no']" select="#modifyc|casealternative/@variable/#modifyc" path="1"/>
</admst:for-each>
<admst:value-to test="caseitem[#modifys=1]" select="#modifys|casecondition/@variable/#modifys" path="1"/>
<admst:value-to test="caseitem[#modifyd=1]" select="#modifyd|casecondition/@variable/#modifyd" path="1"/>
<admst:value-to test="caseitem[#modifyfn=1]" select="#modifyfn|casecondition/@variable/#modifyfn" path="1"/>
<admst:value-to test="caseitem[#modifywn=1]" select="#modifywn|casecondition/@variable/#modifywn" path="1"/>
<admst:value-to test="caseitem[#modifyc=1]" select="#modifyc|casecondition/@variable/#modifyc" path="1"/>
</admst:when>
<admst:when test="[datatypename='assignment']">
<admst:value-to test="lhs[exists(prototype/@protoinstance[#modifys=1])]" select="#modifys|rhs/@exvariable/#modifys" path="1"/>
<admst:value-to test="lhs[exists(prototype/@protoinstance[#modifyd=1])]" select="#modifyd|rhs/@exvariable/#modifyd" path="1"/>
<admst:value-to test="lhs[exists(prototype/@protoinstance[#modifyfn=1])]" select="#modifyfn|rhs/@exvariable/#modifyfn" path="1"/>
<admst:value-to test="lhs[exists(prototype/@protoinstance[#modifywn=1])]" select="#modifywn|rhs/@exvariable/#modifywn" path="1"/>
<admst:value-to test="lhs[exists(prototype/@protoinstance[#modifyc=1])]" select="#modifyc|rhs/@exvariable/#modifyc" path="1"/>
<admst:value-to test="lhs/prototype/@ddxprobe" select="#TOTOddxprobe" string="yes"/>
<admst:value-to test="lhs/prototype/@ddxprobe" select="#TOTOddxprobe" string="no"/>
<admst:push select="rhs/@exvariable/prototype/@ddxprobe" path="lhs/prototype/@ddxprobe" oncompare="nature|pnode|nnode"/>
</admst:when>
<admst:when test="[datatypename='contribution']">
<admst:choose>
<admst:when test="[#modifyd=1]">
<admst:value-to select="rhs/@exvariable/#modifyd" path="1"/>
</admst:when>
<admst:when test="[#modifyfn=1]">
<admst:value-to select="rhs/@exvariable/#modifyfn" path="1"/>
</admst:when>
<admst:when test="[#modifywn=1]">
<admst:value-to select="rhs/@exvariable/#modifywn" path="1"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="#modifys|(rhs|rhs/@exvariable)/#modifys" path="1"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='nilled']"/>
<admst:when test="[datatypename='function' and arity='callfunction']">
<admst:value-to select="#modifyc|arguments/@exvariable/#modifyc" path="1"/>
</admst:when>
<admst:otherwise>
<admst:fatal format="%(datatypename): case not handled\n"/>
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:apply-templates select="modulecode" match="modify"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifys=1])]/#modifys" path="1"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifyd=1])]/#modifyd" path="1"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifyfn=1])]/#modifyfn" path="1"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifywn=1])]/#modifywn" path="1"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifyc=1])]/#modifyc" path="1"/>
<admst:value-to select="modulevariablep[exists(@protoinstance[#modifys=1 or #modifyd=1 or #modifyfn=1 or #modifywn=1])]/#insource" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifys=1])]/#modifys" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifyd=1])]/#modifyd" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifyfn=1])]/#modifyfn" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifywn=1])]/#modifywn" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifyc=1])]/#modifyc" path="1"/>
<admst:value-to select="@allvariablecontainer/blockvariablep[exists(@protoinstance[#modifys=1 or #modifyd=1 or #modifyfn=1 or #modifywn=1])]/#insource" path="1"/>
</admst:template>
<admst:template match="init">
<admst:choose>
<admst:when test="[datatypename='function' and arity='callfunction']">
<admst:apply-templates select="arguments" match="e:init"/>
</admst:when>
<admst:when test="[datatypename='whileloop']">
<admst:apply-templates select="whilecondition" match="e:init"/>
<admst:apply-templates select="whilecode" match="init"/>
</admst:when>
<admst:when test="[datatypename='forloop']">
<admst:apply-templates select="forinitial|forupdate" match="init"/>
<admst:apply-templates select="forcondition" match="e:init"/>
<admst:apply-templates select="forcode" match="init"/>
</admst:when>
<admst:when test="[datatypename='case']">
<admst:apply-templates select="casecondition" match="e:init"/>
<admst:for-each select="caseitem">
<admst:for-each select="casealternative">
<admst:apply-templates select="." match="e:init"/>
</admst:for-each>
<admst:apply-templates select="casecode" match="init"/>
</admst:for-each>
</admst:when>
<admst:when test="[datatypename='conditional']">
<admst:apply-templates select="ifcondition" match="e:init"/>
<admst:apply-templates select="thencode|elsecode" match="init"/>
</admst:when>
<admst:when test="[datatypename='contribution']">
<admst:apply-templates select="rhs" match="e:init"/>
</admst:when>
<admst:when test="[datatypename='assignment']">
<admst:apply-templates select="rhs" match="e:init"/>
<admst:push select="lhs/prototype/@vpprobe" path="rhs/@exprobe" oncompare="nature|pnode|nnode"/>
<admst:push select="lhs/prototype/@protoinstance" path="lhs"/>
</admst:when>
<admst:when test="[datatypename='block']">
<admst:apply-templates select="blockcode" match="init"/>
</admst:when>
<admst:when test="[datatypename='nilled']"/>
<admst:otherwise>
<admst:fatal format="%(datatypename): case not handled\n"/>
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:template match="e:init">
<admst:choose>
<admst:when test="[datatypename='variable']">
<admst:push select="prototype/@protoinstance" path="."/>
</admst:when>
<admst:when test="[datatypename='function']">
<admst:apply-templates select="arguments" match="e:init"/>
<admst:value-to test="[name='ddt' and exists(#contribution)]" select="#contribution/#modifyd" path="1"/>
<admst:value-to test="[name='white_noise' and exists(#contribution)]" select="#contribution/#modifywn" path="1"/>
<admst:value-to test="[name='flicker_noise' and exists(#contribution)]" select="#contribution/#modifyfn" path="1"/>
</admst:when>
</admst:choose>
</admst:template>
<admst:template match="e:#dependency">
<admst:choose>
<admst:when test="caller()/template/textmatch[value='dependency']">
<admst:apply-templates select="." match="e:#dependency"/>
<admst:value-to select="tnode/#dependency[.='constant' and $globalopdependent='yes']" string="noprobe"/>
</admst:when>
<admst:when test="caller()/template/textmatch[value='adms.implicit.xml.module']">
<admst:apply-templates select="." match="e:#dependency"/>
<admst:value-to select="tnode/#dependency[.='constant' and $globalopdependent='yes']" string="noprobe"/>
</admst:when>
<admst:when test="[datatypename='probe']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[datatypename='variable']">
<admst:choose>
<admst:when test="[exists(prototype/@protoinstance[tnode/#dependency='linear'])]">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[exists(prototype/@protoinstance[tnode/#dependency='noprobe'])]">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[(datatypename='function' and arity='unary')]">
<admst:apply-templates select="arguments[1]" match="e:#dependency"/>
<admst:value-to select="tnode/#dependency" path="arguments[1]/tnode/#dependency"/>
</admst:when>
<admst:when test="[(datatypename='function' and arity='binary')]">
<admst:apply-templates select="arguments[1]|arguments[2]" match="e:#dependency"/>
<admst:choose>
<admst:when test="[arguments[1]/tnode/#dependency='linear' or arguments[2]/tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[arguments[1]/tnode/#dependency='noprobe' or arguments[2]/tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[(datatypename='function' and arity='ternary')]">
<admst:apply-templates select="arguments[1]|arguments[2]|arguments[3]" match="e:#dependency"/>
<admst:choose>
<admst:when test="[arguments[2]/tnode/#dependency='linear' or arguments[3]/tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[arguments[1]/tnode/#dependency!='constant' or arguments[2]/tnode/#dependency='noprobe' or arguments[3]/tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='function']">
<admst:choose>
<admst:when test="[name='ddx' or name='\$ddx']">
<admst:apply-templates select="arguments[1]" match="e:#dependency"/>
<admst:choose>
<admst:when test="arguments[1]/tnode/#dependency[.='constant' or .='noprobe']">
<admst:value-to select="tnode/#dependency" path="arguments[1]/tnode/#dependency"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:otherwise>
<admst:apply-templates select="arguments" match="e:#dependency"/>
<admst:choose>
<admst:when test="arguments[tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="arguments/tnode/#dependency[.='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='number']">
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:when>
<admst:when test="[datatypename='string']">
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:when>
<admst:otherwise>
<admst:fatal format="%(datatypename): case not handled\n"/>
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:template match="dependency">
<admst:choose>
<admst:when test="[datatypename='function' and arity='callfunction']">
<admst:apply-templates select="arguments" match="e:#dependency"/>
<admst:choose>
<admst:when test="arguments[tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="arguments[tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='whileloop']">
<admst:apply-templates select="whilecondition" match="e:#dependency"/>
<admst:apply-templates select="[$globalopdependent='yes' or whilecondition/tnode/#dependency='constant']/whilecode" match="dependency"/>
<admst:if test="[$globalopdependent='no']">
<admst:apply-templates select="whilecondition[tnode/#dependency='constant']" match="e:#dependency"/>
<admst:if test="[whilecondition/tnode/#dependency!='constant']">
<admst:variable name="globalopdependent" string="yes"/>
<admst:apply-templates select="whilecode" match="dependency"/>
<admst:variable name="globalopdependent" string="no"/>
</admst:if>
</admst:if>
<admst:choose>
<admst:when test="[whilecode/tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[whilecondition/tnode/#dependency!='constant' or whilecode/tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='forloop']">
<admst:apply-templates select="forinitial|forupdate" match="dependency"/>
<admst:apply-templates select="forcondition" match="e:#dependency"/>
<admst:apply-templates select="[$globalopdependent='yes' or nilled((forinitial|forcondition|forupdate)/[tnode/#dependency!='constant'])]/forcode" match="dependency"/>
<admst:if test="[$globalopdependent='no']">
<admst:apply-templates select="(forinitial|forupdate)/[tnode/#dependency='constant']" match="dependency"/>
<admst:apply-templates select="forcondition[tnode/#dependency='constant']" match="e:#dependency"/>
<admst:if test="[forcondition/tnode/#dependency!='constant' or forinitial/tnode/#dependency!='constant' or forupdate/tnode/#dependency!='constant']">
<admst:variable name="globalopdependent" string="yes"/>
<admst:apply-templates select="forcode" match="dependency"/>
<admst:variable name="globalopdependent" string="no"/>
</admst:if>
</admst:if>
<admst:choose>
<admst:when test="[forcode/tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[(forcondition!='constant' or forinitial!='constant' or forupdate!='constant') or forcode/tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='case']">
<admst:apply-templates select="casecondition" match="e:#dependency"/>
<admst:for-each select="caseitem">
<admst:for-each select="casealternative">
<admst:apply-templates select="." match="e:#dependency"/>
</admst:for-each>
<admst:apply-templates select="casecode" match="dependency"/>
</admst:for-each>
</admst:when>
<admst:when test="[datatypename='conditional']">
<admst:apply-templates select="ifcondition" match="e:#dependency"/>
<admst:choose>
<admst:when test="[$globalopdependent='no' and ifcondition/tnode/#dependency!='constant']">
<admst:variable name="globalopdependent" string="yes"/>
<admst:apply-templates select="thencode|elsecode" match="dependency"/>
<admst:variable name="globalopdependent" string="no"/>
</admst:when>
<admst:otherwise>
<admst:apply-templates select="thencode|elsecode" match="dependency"/>
</admst:otherwise>
</admst:choose>
<admst:choose>
<admst:when test="[thencode/tnode/#dependency='linear' or elsecode/tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[ifcondition/tnode/#dependency!='constant' or thencode/tnode/#dependency='noprobe' or elsecode/tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='contribution']">
<admst:apply-templates select="rhs" match="e:#dependency"/>
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[datatypename='assignment']">
<admst:apply-templates select="rhs" match="e:#dependency"/>
<admst:value-to select="tnode/#dependency" path="rhs/tnode/#dependency"/>
<admst:choose>
<admst:when test="[rhs/tnode/#dependency='linear' or exists(lhs/prototype/@protoinstance[tnode/#dependency='linear'])]">
<admst:value-to select="lhs/tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="[$globalopdependent='yes' or rhs/tnode/#dependency='noprobe' or exists(lhs/prototype/@protoinstance[tnode/#dependency='noprobe'])]">
<admst:value-to select="lhs/tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="lhs/tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='block']">
<admst:apply-templates select="blockcode" match="dependency"/>
<admst:choose>
<admst:when test="blockcode[tnode/#dependency='linear']">
<admst:value-to select="tnode/#dependency" string="linear"/>
</admst:when>
<admst:when test="blockcode[tnode/#dependency='noprobe']">
<admst:value-to select="tnode/#dependency" string="noprobe"/>
</admst:when>
<admst:otherwise>
<admst:value-to select="tnode/#dependency" string="constant"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="[datatypename='nilled']"/>
<admst:otherwise>
<admst:fatal format="%(datatypename): case not handled\n"/>
</admst:otherwise>
</admst:choose>
</admst:template>
<admst:variable name="globalmodule"/>
<admst:variable name="globalcontribution"/>
<admst:variable name="globalopdependent" string="no"/>
<admst:variable name="module"/>
<admst:value-to select="/#eol" string="\n"/>
<admst:value-to select="/#idx" path="0"/>
<admst:variable name="globalexpression"/>
<admst:variable name="globalwhileloop"/>
<admst:template match="godown">
<admst:variable test="value[datatypename='whileloop']" name="globalwhileloop" path="value"/>
<admst:variable test="value[datatypename='contribution']" name="globalcontribution" path="value"/>
<admst:value-to select="value[datatypename='function' and name='ddt.000000']/name" string="`%(value/name)"/>
<admst:value-to select="value[datatypename='function' and name='white_noise']/name" string="`%(value/name)"/>
<admst:value-to select="value[datatypename='function' and name='flicker_noise']/name" string="`%(value/name)"/>
<admst:value-to select="#module" path="$globalmodule"/>
<admst:value-to select="#contribution" path="$globalcontribution"/>
<admst:value-to select="#id" path="/#idx"/>
<admst:value-to test="[exists($globalwhileloop)]" select="#whileloop" path="1"/>
<admst:value-to select="/#idx" path="/#idx+1"/>
<admst:if
test="[aname='rhs' or aname='ifcondition' or aname='whilecondition' or
aname='forcondition' or aname='default' or aname='casecondition' or
(up/value/datatypename='function' and up/value/arity='callfunction' and aname='arguments')]">
<admst:variable name="globalexpression" path="."/>
<admst:push select="#module/@expression" path="."/>
<admst:value-to select="#isexpression" path="1"/>
</admst:if>
<admst:value-to test="$globalexpression" select="#expression" path="$globalexpression"/>
<admst:apply-templates select="down" match="godown"/>
<admst:value-to test="value[datatypename='block']" select="value/name" string=" blk%(#id)"/>
<admst:variable test="value[datatypename='whileloop']" name="globalwhileloop"/>
</admst:template>
<admst:variable name="af"/>
<admst:open file="mna.va">
<admst:for-each select="/items">
<admst:choose>
<admst:when test="[datatypename='discipline']">
<admst:text/>%(.)\n<admst:text/>
</admst:when>
<admst:when test="[datatypename='nature']">
<admst:value-to select="ddt_nature" path="/items[datatypename='nature' and name='%(../../ddt_name)']"/>
<admst:value-to select="idt_nature" path="/items[datatypename='nature' and name='%(../../idt_name)']"/>
<admst:text/>%(.)\n<admst:text/>
</admst:when>
<admst:when test="[datatypename='module']">
<admst:apply-templates select="." match="adms.implicit.xml.module"/>
<admst:apply-templates select="." match="domodule"/>
</admst:when>
</admst:choose>
</admst:for-each>
<admst:message format="mna.va: temporary file created\n"/>
</admst:open>
<admst:template match="domodule">
<admst:variable name="module" path="."/>
`define ddt(v) 0.0\n
`define flicker_noise(m,p,txt) 0.0\n
`define white_noise(m,txt) 0.0\n
<admst:if test="[exists(attribute)]">(*<admst:join select="attribute" separator=",">%(.)</admst:join>*)</admst:if>
module %(name)
<admst:if test="modulenode[location='external']">(<admst:join select="modulenode[location='external']" separator=", ">%(name)</admst:join>)</admst:if>;\n
<admst:for-each select="modulenode">
<admst:if test="[exists(attribute)]">(*<admst:join select="attribute" separator=",">%(.)</admst:join>*)</admst:if>
<admst:if test="[location='external']">inout %(name);\n</admst:if>
<admst:text test="[location!='ground']" format="%(discipline/name) %(name);\n"/>
<admst:text test="[location='ground']" format="ground %(name);\n"/>
</admst:for-each>
<admst:text/>%(pass0:tnode(modulecode/tnode))<admst:text/>
<admst:for-each select="$module/@mna/value">
<admst:text format="/*mna*/ (*pseudotype=&quot;mna&quot;*) electrical _%(pnode/name)%(nnode/name);\n"/>
</admst:for-each>
<admst:text select="$module/@expression/@ddtnode/[exists(#ddtnode) and up/value/datatypename!='contribution']" format="/*ddt*/ (*pseudotype=&quot;ddt&quot;*) electrical q%(#ddtnode/#id);\n"/>
<admst:for-each select="$module/@k">
<admst:if test="value[datatypename='block' or datatypename='conditional' or datatypename='assignment']">
<admst:for-each select="value/sort(@ass)">
<admst:push oncompare="." select="$module/@kkkk" path="'%(value/lhs/prototype/type) %(value/lhs/name)_%(../../#id)'"/>
</admst:for-each>
</admst:if>
</admst:for-each>
<admst:text select="$module/@kkkk" format="/*kstant*/%(.);\n"/>\n
<admst:for-each select="modulevariablep">%(.)</admst:for-each>
<admst:value-to select="/#eol" string=" \\\n"/>
<admst:for-each select="modulefunctionp">
<admst:variable name="af" path="."/>
<admst:variable name="name" path="name"/>
<admst:text/>`define _af$name(id,$name,<admst:text/>
<admst:join select="functionpvariable[(name!=$name)and(functionpscope='input' or functionpscope='inout')]" separator=",">%(name)</admst:join>
<admst:text/>) \\\n<admst:text/>
<admst:text format="begin : id \\\n"/>
<admst:for-each select="functionpvariable[(name!=$name)and functionpscope='local']">%(type|' '|name); \\\n</admst:for-each>
<!-- fixme admst:text/>%(pass0(functionpcode))<admst:text/ -->
<admst:text select="@af" format="/*af*/real %(value/name)%(#id); \\\n"/>%(pass2:tnode(value/functionpcode/tnode))<admst:text format="end /*end of af macro*/\n"/>
<admst:variable name="af"/>
</admst:for-each>
<admst:value-to select="/#eol" string="\n"/>
<admst:text format="analog\n"/>
<admst:text format="begin\n"/>
<admst:text format="begin : initial_instance\n"/>
<admst:apply-templates select="modulecode/tnode" match="pass1:%(datatypename)"/>
<admst:text format="end /* : initial_instance*/\n"/>
///////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////\n
<admst:text format="begin : load\n"/>
<admst:text select="$module/@mna/value"
format="/*mna*/ integer ff%(pnode/name)%(nnode/name), pp%(pnode/name)%(nnode/name); real f%(pnode/name)%(nnode/name), p%(pnode/name)%(nnode/name);\n"/>
<admst:text select="$module/@mna/value"
format="/*mna*/ ff%(pnode/name)%(nnode/name)=1; pp%(pnode/name)%(nnode/name)=1; f%(pnode/name)%(nnode/name)=0; p%(pnode/name)%(nnode/name)=0;\n"/>
<admst:text/>%(pass2:tnode(modulecode/tnode))<admst:text/>
<admst:text format="begin : mna\n"/>
<admst:for-each select="$module/@mna/value">
<admst:text format="/*mna*/ // \$debug(&quot;%(pnode/discipline/flow/access)(%(pnode/name)%(nnode[location!='ground']/(','|name))) f=%e p=%e\\n&quot;,f%(pnode/name)%(nnode/name),p%(pnode/name)%(nnode/name));\n"/>
<admst:text format="/*mna*/ %(pnode/discipline/flow/access)(%(pnode/name)%(nnode[location!='ground']/(','|name)))&lt;+"/>
<admst:text format="%(pnode/discipline/potential/access)(_%(pnode/name)%(nnode/name));\n"/>
<admst:text format="/*mna*/ if(ff%(pnode/name)%(nnode/name) &amp;&amp; pp%(pnode/name)%(nnode/name))\n"/>
<admst:text format="/*mna*/ %(pnode/discipline/flow/access)(_%(pnode/name)%(nnode/name))&lt;+"/>
<admst:text format="%(pnode/discipline/potential/access)(_%(pnode/name)%(nnode/name));\n"/>
<admst:text format="/*mna*/ else if(ff%(pnode/name)%(nnode/name))\n"/>
<admst:text format="/*mna*/ %(pnode/discipline/flow/access)(_%(pnode/name)%(nnode/name))&lt;+"/>
<admst:text format="f%(pnode/name)%(nnode/name)-%(pnode/discipline/potential/access)(_%(pnode/name)%(nnode/name));\n"/>
<admst:text format="/*mna*/ else if(pp%(pnode/name)%(nnode/name))\n"/>
<admst:text format="/*mna*/ %(pnode/discipline/flow/access)(_%(pnode/name)%(nnode/name))&lt;+"/>
<admst:text format="p%(pnode/name)%(nnode/name)-%(pnode/discipline/potential/access)(%(pnode/name)%(nnode[location!='ground']/(','|name)));\n"/>
</admst:for-each>
<admst:text format="end /* : mna*/\n"/>
<admst:text format="end /* : load*/\n"/>
<admst:text format="end\n"/>
<admst:text format="endmodule\n"/>
</admst:template>
<admst:template match="pass0:tnode">
<admst:apply-templates select="down" match="pass0:tnode"/>
<admst:variable name="tnode" path="."/>
<admst:push select="value/@ass" path="down/value/@ass[value/lhs/prototype/tnode/up!=$tnode]"/>
<admst:push select="value/@ass0" path="down/value/@ass[value/lhs/prototype/tnode/up=$tnode]"/>
<admst:push select="value[datatypename='assignment']/@ass" path="."/>
<admst:push test="[(#dependency='constant')and(../#dependency!='constant')]" select="$module/@k" path="."/>
<admst:push select="$module/@mna"
test="value[(datatypename='probe' and nature=pnode/discipline/flow) or (datatypename='contribution' and nature=pnode/discipline/potential)]"
path="." oncompare="value/(pnode|nnode)"/>
<admst:choose>
<admst:when test="value[datatypename='contribution']">
<admst:variable name="myklass" path="/@mnacontributionklass[pnode=../../value/pnode and nnode=../../value/nnode]"/>
<admst:if test="[nilled($myklass)]">
<admst:variable name="myklass" path="value"/>
<admst:push select="/@mnacontributionklass" path="value"/>
<admst:push select="value/@sw" path="value"/>
</admst:if>
<admst:value-to select="value/#zcontrib" path="$myklass"/>
<admst:value-to test="value[datatypename='contribution' and nature=pnode/discipline/potential]" select="value/#zcontrib/#psource" path="1"/>
<admst:push select="$myklass/@sw" path="value"/>
</admst:when>
<admst:when test="value[datatypename='assignment']">
<admst:choose>
<admst:when test="[up/#dependency='constant']"><admst:value-to select="#set" path="1"/></admst:when>
<admst:when test="[#dependency='constant']"><admst:value-to select="#set" path="1"/></admst:when>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='function']">
<admst:choose>
<admst:when test="value[arity='unary']">
<admst:value-to select="#ddtnode" path="value/arguments[1]/#ddtnode"/>
<admst:value-to select="value/arguments[1]/tnode/#ddtnode"/>
</admst:when>
<admst:when test="value[arity='binary']">
<admst:choose>
<admst:when test="value[name='addp' or name='addm']">
<admst:choose>
<admst:when test="value[exists(arguments[1]/tnode/#ddtnode) and exists(arguments[2]/tnode/#ddtnode)]">
<admst:value-to select="#ddtnode" path="value/arguments[1]/tnode/#ddtnode"/>
<admst:value-to select="value/(arguments[1]|arguments[2])/tnode/#ddtnode"/>
</admst:when>
</admst:choose>
</admst:when>
<admst:when test="value[name='multtime' or name='multdiv']">
<admst:choose>
<admst:when test="value[(arguments[1]/tnode/#dependency='constant' or arguments[1]/tnode/#dependency='noprobe') and exists(arguments[2]/tnode/#ddtnode)]">
<admst:value-to select="#ddtnode" path="value/arguments[2]/tnode/#ddtnode"/>
<admst:value-to select="value/arguments[2]/tnode/#ddtnode"/>
</admst:when>
<admst:when test="value[(arguments[2]/tnode/#dependency='constant' or arguments[2]/tnode/#dependency='noprobe') and exists(arguments[1]/tnode/#ddtnode)]">
<admst:value-to select="#ddtnode" path="value/arguments[1]/tnode/#ddtnode"/>
<admst:value-to select="value/arguments[1]/tnode/#ddtnode"/>
</admst:when>
</admst:choose>
</admst:when>
</admst:choose>
</admst:when>
<admst:when test="value[arity='ternary']">
<admst:if test="value[exists(arguments[2]/tnode/#ddtnode) and exists(arguments[3]/tnode/#ddtnode)]">
<admst:value-to select="#ddtnode" path="value/arguments[2]/tnode/#ddtnode"/>
<admst:value-to select="value/(arguments[2]|arguments[3])/tnode/#ddtnode"/>
</admst:if>
</admst:when>
<admst:when test="value[arity='nary' or arity='callfunction']">
<admst:if test="value[name='ddt']">
<admst:value-to select="#ddtnode" path="."/>
<admst:push select="#expression/@ddtnode" path="[#expression!=.]"/>
</admst:if>
<admst:if test="value[exists(definition)]">
<admst:push test="$af" select="$af/@af" path="."/>
<admst:push select="#expression/@af" path="."/>
</admst:if>
</admst:when>
</admst:choose>
<admst:push select="#expression/@ddtnode" path="value/arguments[exists(tnode/#ddtnode) and name!='ddt']/tnode[exists(#ddtnode)]"/>
<admst:push test="[#expression=. and exists(#ddtnode)]" select="@ddtnode" path="."/>
</admst:when>
</admst:choose>
</admst:template>
<admst:template match="pass1:tnode">
<admst:choose>
<admst:when test="value[datatypename='nilled' or datatypename='whileloop']">%(value)</admst:when>
<admst:when test="value[datatypename='contribution']">//%(value)</admst:when>
<admst:when test="value[datatypename='conditional']">
<admst:text/>%(([#dependency!='constant']/'//')|'if('|value/ifcondition|')'|/#eol)<admst:text/>
<admst:text/>%(pass1:tnode(value/thencode/tnode))<admst:text/>
<admst:if test="[exists(value/elsecode)]">%([#dependency!='constant']/'//')else%(/#eol)%(pass1:tnode(value/elsecode/tnode))</admst:if>
<admst:push oncompare="prototype" test="[#dependency='constant' and up/#dependency!='constant']" select="@assuniq" path="sort(value/@ass/value)/lhs"/>
<admst:text select="@assuniq" format="%(name)_%(../#id)=%(name);\n"/>
</admst:when>
<admst:when test="value[datatypename='assignment']">
<admst:choose>
<admst:when test="[up/#dependency='constant']">%(value)</admst:when>
<admst:when test="[#dependency='constant']">begin %(value/(lhs/name|'_'|../#id|'='|rhs)); %(value/lhs/(name|'='|name))_%(#id); end%(/#eol)</admst:when>
<admst:otherwise>//%(value)</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='function']">
<admst:choose>
<admst:when test="value[name='\$strobe' or name='\$debug']">;//aaaaaa %(value)</admst:when>
<admst:otherwise>
<admst:text test="[#dependency!='constant']" format=";// "/>%(value)<admst:text/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='block']">
<admst:push test="[#dependency='constant' and up/#dependency!='constant']" oncompare="prototype" select="@assuniq" path="sort(value/@ass/value)/lhs"/>
<admst:push oncompare="prototype" select="@dec0" path="value/@ass0[#set=1]/value/lhs"/>
<admst:text format="begin : blk%(#id)%(/#eol)"/>
<!--admst:text format="%(value/blockvariablep/(type|' '|name|';'|/#eol))"/-->
<admst:text select="@dec0/prototype" format="%((type|' '|name|';'|/#eol))"/>
<admst:text/>%(pass1:tnode(down))<admst:text/>
<admst:text select="@assuniq" format="%(name)_%(../#id)=%(name);\n"/>
<admst:text format="end%(/#eol)"/>
</admst:when>
</admst:choose>
</admst:template>
<admst:template match="pass2:tnode">
<admst:for-each select="down[#isexpression=1]">
<admst:text test="[nilled($af)and(exists(@af))]" format="begin : _%(tnode/@af[1]/#id)\n%(@af/'real %(name)%(tnode/#id);\n')"/>
<admst:for-each select="@af">
<admst:text/>`_af%(value/name)(id%(value/name)%(#id),%(value/name)%(#id),<admst:join select="value/arguments" separator=",">%(pass2:tnode(tnode))</admst:join>
<admst:text/>)%(/#eol)<admst:text/>
</admst:for-each>
<admst:for-each select="@ddtnode[nilled(#ddtnode)]">
<admst:value-to select="value[name='ddt']/name" string=""/>
</admst:for-each>
<admst:for-each select="@ddtnode[exists(#ddtnode) and up/value/datatypename!='contribution']">
<admst:value-to select="[#expression!=. or (#expression=. and value/name='ddt')]/value/name" string=""/>
<admst:text/>I(q%(#ddtnode/#id))&lt;+ddt(%(pass2:tnode(.)));\n<admst:text/>
<admst:text/>I(q%(#ddtnode/#id))&lt;+-V(q%(#ddtnode/#id));\n<admst:text/>
</admst:for-each>
<admst:for-each select="@ddtnode[exists(#ddtnode)]">
<admst:if test="[not(#expression=. and up/value/datatypename='contribution')]">
<admst:value-to select="value/#format" string="V(q%(#ddtnode/#id))"/>
</admst:if>
</admst:for-each>
</admst:for-each>
<admst:if test="[aname='attribute']">(*%(value)*)</admst:if>
<admst:choose>
<admst:when test="value[datatypename='variablep']"></admst:when>
<admst:when test="value[datatypename='conditional']">
<admst:choose>
<admst:when test="[(nilled($af))and(#dependency='constant')]">
<admst:push oncompare="prototype" select="@assuniq" path="sort(value/@ass/value)/lhs"/>
<admst:text select="@assuniq" format="%(name)=%(name)_%(../#id);\n"/>
</admst:when>
<admst:otherwise>
<admst:text format="if("/>%(pass2:tnode(value/ifcondition/tnode)))%(/#eol)<admst:text/>
<admst:text/>%(pass2:tnode(value/thencode/tnode))<admst:text/>
<admst:if test="value[exists(elsecode)]">else%(/#eol)<admst:text/>%(pass2:tnode(value/elsecode/tnode))<admst:text/></admst:if>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='assignment']">
<admst:choose>
<admst:when test="[#dependency='constant']">%(value/lhs/name)=%(value/lhs/name)_%(#id);%(/#eol)</admst:when>
<admst:otherwise>%(value/lhs/name)=%(pass2:tnode(value/rhs/tnode));%(/#eol)</admst:otherwise>
</admst:choose>
<admst:text test="value/rhs[nilled($af)and(exists(@af))]" format="end //%(@af[1]/#id)%(/#eol)"/>
</admst:when>
<admst:when test="value[datatypename='contribution']">
<admst:text format="begin%(/#eol)"/>
<admst:choose>
<admst:when test="value[exists(#zcontrib) and nature=pnode/discipline/potential]">ff%(value/pnode/name)%(value/nnode/name)=0;f%(value/pnode/name)%(value/nnode/name)=0;p%(value/pnode/name)%(value/nnode/name)=p%(value/pnode/name)%(value/nnode/name)+</admst:when>
<admst:when test="value[exists(#zcontrib) and exists(#zcontrib/#psource) and nature=pnode/discipline/flow]">ff%(value/pnode/name)%(value/nnode/name)=1;p%(value/pnode/name)%(value/nnode/name)=0;f%(value/pnode/name)%(value/nnode/name)=f%(value/pnode/name)%(value/nnode/name)+</admst:when>
<admst:otherwise>
<admst:choose>
<admst:when test="value/nnode[location='ground']">%(value/nature/access)(%(value/pnode/name))&lt;+</admst:when>
<admst:otherwise>%(value/nature/access)(%((value/pnode/name|','|value/nnode/name)))&lt;+</admst:otherwise>
</admst:choose>
</admst:otherwise>
</admst:choose>
<admst:choose>
<admst:when test="value/rhs[datatypename='function' and name='ddt']">
<admst:text/>%(value/rhs);%(/#eol)<admst:text/>
</admst:when>
<admst:when test="[exists(value/rhs/tnode/#ddtnode)]">
<admst:text/>ddt(%(value/rhs));%(/#eol)<admst:text/>
</admst:when>
<admst:otherwise>%(value/rhs);%(/#eol)</admst:otherwise>
</admst:choose>
<admst:text format="end%(/#eol)"/>
</admst:when>
<admst:when test="value[datatypename='case']">
<admst:text/>case (%(pass2:tnode(value/casecondition/tnode)))%(/#eol)<admst:text/>
<admst:for-each select="value/caseitem">
<admst:join select="value/casealternative" separator=",">%(value)</admst:join>
<admst:if test="value/[defaultcase='yes']">default</admst:if>: %(/#eol)%(pass2:tnode(value/casecode/tnode))</admst:for-each>endcase%(/#eol)<admst:text/>
</admst:when>
<admst:when test="value[datatypename='block']">
<admst:choose>
<admst:when test="[(nilled($af))and(#dependency='constant')]">
<admst:text format="begin /*blk%(#id) replaced*/\n"/>
<admst:push oncompare="prototype" select="@assuniq" path="sort(value/@ass/value)/lhs"/>
<admst:text select="@assuniq" format="%(name)=%(name)_%(../#id);\n"/>
<admst:text format="end\n"/>
</admst:when>
<admst:otherwise>
<admst:text format="begin : blk%(#id)%(/#eol)"/>
<admst:text/>%(value/blockvariablep/(type|' '|name|';'|/#eol))%(pass2:tnode(down))<admst:text/>
<admst:text format="end%(/#eol)"/>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='variable']">%(value/name)</admst:when>
<admst:when test="value[datatypename='string']">%(value)</admst:when>
<admst:when test="value[datatypename='number']">%(value)</admst:when>
<admst:when test="value[datatypename='probe']">
<admst:choose>
<admst:when test="value[nature=pnode/discipline/flow]">
<admst:text format="%(value/pnode/discipline/potential/access)(_%(value/pnode/name)%(value/nnode/name))"/>
</admst:when>
<admst:otherwise>
<admst:choose>
<admst:when test="value/nnode[location='ground']">%(value/nature/access)(%(value/pnode/name))</admst:when>
<admst:otherwise>%(value/nature/access)(%((value/pnode/name|','|value/nnode/name)))</admst:otherwise>
</admst:choose>
</admst:otherwise>
</admst:choose>
</admst:when>
<admst:when test="value[datatypename='function' and arity='nary' and exists(definition)]">%(value/name)%(#id)</admst:when>
<admst:when test="[value/datatypename='function' and value/arity='callfunction' and #dependency='constant']">//%(value)</admst:when>
<!--modulecode blockcode thencode elsecode: value est 0-->
<admst:when test="[aname='name']"/>
<admst:when test="[aname='first']"/>
<admst:otherwise>%(value)</admst:otherwise>
</admst:choose>
</admst:template>
</admst>

View File

@ -1,661 +0,0 @@
// EPFL-EKV version 2.6: A Verilog-A description.
// The intrinsic device is coded according to the official manual
// (revision II) available at http://legwww.epfl.ch/ekv.
// contribution of Ivan Riis Nielsen 11/2006, modified by Dietmar Warning 01/2009
//Default simulator: Spectre
`ifdef insideADMS
`define P(txt) (*txt*)
`define PGIVEN(p) $given(p)
`define INITIAL_MODEL @(initial_model)
`define INSTANCE @(initial_instance)
`define NOISE @(noise)
`else
`define P(txt) (txt)
`define PGIVEN(p) p
`define INITIAL_MODEL
`define INSTANCE
`define NOISE
`endif
//ADS
//`include "constants.vams"
//`include "disciplines.vams"
//`include "compact.vams"
//Spectre
`include "constants.h"
`include "discipline.h"
`define NMOS 1
`define PMOS -1
`define EPSSI `P_EPS0*11.7
`define EPSOX `P_EPS0*3.9
`define TREF 300.15
`define SQR(x) ((x)*(x))
`define VT(temp) (`P_K*temp/`P_Q)
`define EG(temp) (1.16-0.000702*`SQR(temp)/(temp+1108))
`define NI(temp) (1.45e16*(temp/`TREF)*exp(`EG(`TREF)/(2*`VT(`TREF))-`EG(temp)/(2*`VT(temp))))
`define oneThird 3.3333333333333333e-01
// Constants needed in safe exponential function (called "expl")
`define se05 2.3025850929940458e+02
`define ke05 1.0e-100
`define ke05inv 1.0e100
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation
// to avoid overflows and underflows and retain C-3 continuity
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < -`se05) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
module ekv (d,g,s,b);
// Node definitions
inout d,g,s,b;
electrical d,g,s,b,di,si;
// Model parameters
parameter integer nmos=1 from [0:1] `P(info="MOS type : nmos:0");
parameter integer pmos=1 from [0:1] `P(info="MOS type : pmos:0");
parameter integer MTYPE=(nmos==0 ? (pmos==0 ? 0 : 1) : (pmos==0 ? -1 : 1));
parameter real TNOM=27 from (-273.15:inf)
`P(info="Nominal temperature [degC]");
parameter real IMAX=1 from (0:inf)
`P(info="Maximum forward junction current before linearization [A]");
// - intrinsic model (optional, section 4.2.1)
parameter real TOX=0 from [0:inf)
`P(info="Oxide thickness [m]");
parameter real NSUB=0 from [0:inf)
`P(info="Channel doping [cm^-3]");
parameter real VFB=1001.0 from (-inf:inf) // use 1001V as "not specified"
`P(info="Flat-band voltage [V]");
parameter real UO=0 from [0:inf)
`P(info="Low-field mobility [cm^2/Vs]");
parameter real VMAX=0 from [0:inf)
`P(info="Saturation velocity [m/s]");
parameter real THETA=0 from [0:inf)
`P(info="Mobility reduction coefficient [V^-1]");
// - intrinsic model (process related, section 4.1)
parameter real COX=((TOX>0) ? (`EPSOX/TOX) : 0.7m) from [0:inf)
`P(info="Oxide capacitance [F/m^2]");
parameter real XJ=0.1u from [1n:inf)
`P(info="Junction depth [m]");
parameter real DL=0 from (-inf:inf)
`P(info="Length correction [m]");
parameter real DW=0 from (-inf:inf)
`P(info="Width correction [m]");
// - intrinsic model (basic, section 4.2)
parameter real GAMMA=((NSUB>0) ? (sqrt(2*`P_Q*`EPSSI*NSUB*1e6)/COX) : 1) from [0:inf)
`P(info="Body effect parameter [V^0.5]");
parameter real PHI=((NSUB>0) ? (2*`VT((TNOM+273.15))*ln(max(NSUB,1)*1e6/`NI((TNOM+273.15)))) : 0.7) from [0.1:inf)
`P(info="Bulk Fermi potential (*2) [V]");
parameter real VTO=((VFB<1000.0) ? (VFB+MTYPE*(PHI+GAMMA*sqrt(PHI))) : 0.5) from (-inf:inf)
`P(info="Long-channel threshold voltage [V]");
parameter real KP=((UO>0) ? (UO*1e-4*COX) : 50u) from (0:inf)
`P(info="Transconductance parameter [A/V^2]");
parameter real UCRIT=(((VMAX>0) && (UO>0)) ? (VMAX/(UO*1e-4)) : 2e6 ) from [100k:inf)
`P(info="Longitudinal critical field [V/m]");
parameter real E0=((THETA>0) ? 0 : 1e12) from [100k:inf)
`P(info="Mobility reduction coefficient [V/m]");
// - intrinsic model (channel length modulation and charge sharing, section 4.3)
parameter real LAMBDA=0.5 from [0:inf)
`P(info="Depletion length coefficient (CLM)");
parameter real WETA=0.25 from (-inf:inf)
`P(info="Narrow-channel effect coefficient");
parameter real LETA=0.1 from (-inf:inf)
`P(info="Short-channel effect coefficient");
// - intrinsic model (reverse short channel effect, section 4.4)
parameter real Q0=0 from (-inf:inf)
`P(info="RSCE peak charge density [C/m^2]");
parameter real LK=0.29u from [10n:inf)
`P(info="RSCE characteristic length [m]");
// - intrinsic model (impact ionization, section 4.5)
parameter real IBA=0 from (-inf:inf)
`P(info="First impact ionization coefficient [m^-1]");
parameter real IBB=3e8 from [1e8:inf)
`P(info="Second impact ionization coefficient [V/m]");
parameter real IBN=1 from [0.1:inf)
`P(info="Saturation voltage factor for impact ionization");
// - intrinsic model (temperature, section 4.6)
parameter real TCV=1m from (-inf:inf)
`P(info="Threshold voltage TC [V/K]");
parameter real BEX=-1.5 from (-inf:inf)
`P(info="Mobility temperature exponent");
parameter real UCEX=0.8 from (-inf:inf)
`P(info="Longitudinal critical field temperature exponent");
parameter real IBBT=9e-4 from (-inf:inf)
`P(info="Temperature coefficient for IBB [K^-1]");
// - intrinsic model (matching, section 4.7)
parameter real AVTO=0 from (-inf:inf)
`P(info="Area related VTO mismatch parameter [Vm]");
parameter real AKP=0 from (-inf:inf)
`P(info="Area related KP mismatch parameter [m]");
parameter real AGAMMA=0 from (-inf:inf)
`P(info="Area related GAMMA mismatch parameter [V^0.5*m]");
// - intrinsic model (flicker noise, section 4.8)
parameter real KF=0 from [0:inf)
`P(info="Flicker noise coefficient");
parameter real AF=1 from (-inf:inf)
`P(info="Flicker noise exponent");
// - intrinsic model (setup, section 4.9)
parameter real NQS=0 from [0:1]
`P(info="Non-quasi-static operation switch");
parameter real SATLIM=exp(4) from (0:inf)
`P(info="Saturation limit (if/ir)");
parameter real XQC=0.4 from [0:1]
`P(info="Charge/capacitance model selector");
// - external parasitic parameters
parameter real HDIF=0 from [0:inf)
`P(info="S/D diffusion length (/2) [m]");
parameter real RSH=0 from [0:inf)
`P(info="S/D sheet resistance [ohm]");
parameter real JS=0 from [0:inf)
`P(info="S/D junction saturation current density [A/m^2]");
parameter real JSW=0 from [0:inf)
`P(info="S/D junction sidewall saturation current density [A/m]");
parameter real XTI=0 from [0:inf)
`P(info="S/D diode saturation current temperature exponent");
parameter real N=1 from [0.5:10]
`P(info="S/D diode emission coefficient");
parameter real CJ=0 from [0:inf)
`P(info="S/D zero-bias junction capacitance per area [F/m^2]");
parameter real CJSW=0 from [0:inf)
`P(info="S/D zero-bias junction capacitance per perimeter [F/m]");
parameter real PB=0.8 from (0:inf)
`P(info="S/D bottom junction builtin potential [V]");
parameter real PBSW=PB from (0:inf)
`P(info="S/D sidewall junction builtin potential [V]");
parameter real MJ=0.5 from (0:inf)
`P(info="S/D bottom junction grading coefficient");
parameter real MJSW=0.333 from (0:inf)
`P(info="S/D sidewall junction grading coefficient");
parameter real FC=0.5 from (0:inf)
`P(info="S/D bottom junction forward-bias threshold");
parameter real FCSW=FC from (0:inf)
`P(info="S/D sidewall junction forward-bias threshold");
parameter real CGSO=0 from [0:inf)
`P(info="Gate-source overlap capacitance per width [F/m]");
parameter real CGDO=0 from [0:inf)
`P(info="Gate-drain overlap capacitance per width [F/m]");
parameter real CGBO=0 from [0:inf)
`P(info="Gate-bulk overlap capacitance per length [F/m]");
// Instance parameters
// - intrinsic model
parameter real L=10u from [0:inf]
`P(type="instance" info="Drawn length [m]" unit="m");
parameter real W=10u from [0:inf]
`P(type="instance" info="Drawn width [m]" unit="m");
parameter real M=1 from [0:inf]
`P(type="instance" info="Parallel multiplier" unit="m");
// parameter real N=1 from [0:inf]
// `P(type="instance" info="Series multiplier" unit="m");
// - external parasitics
parameter real AD=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
`P(info="Drain area [m^2]" type="instance");
parameter real AS=((HDIF>0) ? (2*HDIF*W) : 0) from [0:inf)
`P(info="Source area [m^2]" type="instance");
parameter real PD=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
`P(info="Drain perimeter [m]" type="instance");
parameter real PS=((HDIF>0) ? (4*HDIF+2*W) : 0) from [0:inf)
`P(info="Source perimeter [m]" type="instance");
parameter real NRD=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
`P(info="Drain no. squares" type="instance");
parameter real NRS=((HDIF>0) ? (HDIF/W) : 0) from [0:inf)
`P(info="Source no. squares" type="instance");
parameter real RS=((RSH>0) ? (RSH*NRS) : 0) from [0:inf)
`P(info="Source resistance [ohms]" type="instance");
parameter real RD=((RSH>0) ? (RSH*NRD) : 0) from [0:inf)
`P(info="Drain resistance [ohms]" type="instance");
// Declaration of variables
integer mode;
real lc,isat_s,vexp_s,gexp_s,isat_d,vexp_d,gexp_d,fact,
weff,leff,np,ns,lmin,rd,rs,ceps,ca,xsi,dvrsce,
tempk,vt,sqrt_A,vto_a,kp_a,gamma_a,ucrit,phi,ibb,vc,qb0,
vg,vd,vs,tmp,vgprime,vp0,vsprime,vdprime,gamma0,gammaprime,vp,n,ifwd,
vdss,vdssprime,dv,vds,vip,dl,lprime,leq,irprime,irev,beta0,nau,
nq,xf,xr,qd,qs,qi,qb,qg,beta0prime,beta,vpprime,is,ids,vib,
idb,ibdj,ibsj,coxt,qdt,qst,qgt,qbt,
cbs0,cbs0sw,cbs,cbd0,cbd0sw,cbd,
fv,z0,z1,y;
real cgso,cgdo,cgbo;
analog begin
`INITIAL_MODEL begin // Model Initialization
lc = sqrt(`EPSSI/COX*XJ);
end // INITIAL_MODEL
`INSTANCE begin // temperature independent device initialization
weff = W+DW;
leff = L+DL;
np = M;
ns = 1;
// eq. 54
lmin = 0.1*ns*leff;
rs = ns/np*RS;
rd = ns/np*RD;
ceps = 4*22e-3*22e-3;
ca = 0.028;
xsi = ca*(10*leff/LK-1);
dvrsce = 2*Q0/COX/`SQR(1+0.5*(xsi+sqrt(xsi*xsi+ceps)));
coxt = np*ns*COX*weff*leff;
end // temperature independent
`INSTANCE begin // temperature dependent device initialization
tempk = $temperature;
vt = `VT(tempk);
sqrt_A = sqrt(np*weff*ns*leff);
vto_a = MTYPE*(VTO+TCV*(tempk-(TNOM+273.15)))+AVTO/sqrt_A;
kp_a = KP*pow(tempk/(TNOM+273.15),BEX)*(1+AKP/sqrt_A);
gamma_a = GAMMA+AGAMMA/sqrt_A;
ucrit = UCRIT*pow(tempk/(TNOM+273.15),UCEX);
phi = PHI*tempk/(TNOM+273.15)-3*vt*ln(tempk/(TNOM+273.15))-`EG(TNOM+273.15)*tempk/(TNOM+273.15)+`EG(tempk);
ibb = IBB*(1+IBBT*(tempk-(TNOM+273.15)));
vc = ucrit*ns*leff;
// eq. 60
qb0 = gamma_a*sqrt(phi);
fact = (`EG(TNOM+273.15)/`VT(TNOM+273.15)-`EG(tempk)/vt) * pow(tempk/(TNOM+273.15),XTI);
`expl(fact,tmp)
isat_s = np*ns*(JS*AS+JSW*PS)*tmp;
isat_d = np*ns*(JS*AD+JSW*PD)*tmp;
if (isat_s>0) begin
vexp_s = vt*ln(IMAX/isat_s+1);
gexp_s = (IMAX+isat_s)/vt;
end else begin
vexp_s = -1e9;
gexp_s = 0;
end
if (isat_d>0) begin
vexp_d = vt*ln(IMAX/isat_d+1);
gexp_d = (IMAX+isat_d)/vt;
end else begin
vexp_d = -1e9;
gexp_d = 0;
end
cbs0 = np*ns*CJ*AS;
cbd0 = np*ns*CJ*AD;
cbs0sw = np*ns*CJSW*PS;
cbd0sw = np*ns*CJSW*PD;
cgso = np*ns*CGSO*weff;
cgdo = np*ns*CGDO*weff;
cgbo = np*ns*CGBO*leff;
end // temperature dependent
begin //Bias-dependent model evaluation
vg = MTYPE*V(g,b);
vd = MTYPE*V(di,b);
vs = MTYPE*V(si,b);
// $strobe("vg=%e vd=%e vs=%e",vg,vd,vs);
if (vd>=vs)
mode = 1;
else begin
mode = -1;
tmp = vs;
vs = vd;
vd = tmp;
end
// eq. 33
vgprime = vg-vto_a-dvrsce+phi+gamma_a*sqrt(phi);
// eq. 35
vsprime = 0.5*(vs+phi+sqrt(`SQR(vs+phi)+16*`SQR(vt)));
vdprime = 0.5*(vd+phi+sqrt(`SQR(vd+phi)+16*`SQR(vt)));
// $strobe("vgprime=%e vdprime=%e vsprime=%e",vgprime,vdprime,vsprime);
// eq. 34
if (vgprime>=0) begin
vp0 = vgprime-phi-gamma_a*(sqrt(vgprime+0.25*`SQR(gamma_a))-0.5*gamma_a);
// eq. 36
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime))-3*WETA/weff*sqrt(vp0+phi));
end else begin
vp0 = -phi;
// eq. 36 - skipped sqrt(vp0+phi) here, it produces inf on derivative
gamma0 = gamma_a-`EPSSI/COX*(LETA/leff*(sqrt(vsprime)+sqrt(vdprime)) );
end
// eq. 37
gammaprime = 0.5*(gamma0+sqrt(`SQR(gamma0)+0.1*vt));
// eq. 38
if (vgprime>=0)
vp = vgprime-phi-gammaprime*(sqrt(vgprime+0.25*`SQR(gammaprime))-0.5*gammaprime);
else
vp = -phi;
// $strobe("vp0=%e vp=%e gamma0=%e gammaprime=%e",vp0,vp,gamma0,gammaprime);
// eq. 39
n = 1+gamma_a*0.5/sqrt(vp+phi+4*vt);
// Forward current (43-44)
fv=(vp-vs)/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
ifwd = y*(1.0 + y);
z0 = 1;
z1 = 1;
// eq. 46
vdss = vc*(sqrt(0.25+vt/vc*sqrt(ifwd))-0.5);
// eq. 47
vdssprime = vc*(sqrt(0.25+vt/vc*(sqrt(ifwd)-0.75*ln(ifwd)))-0.5)+vt*(ln(0.5*vc/vt)-0.6);
// $strobe("ifwd=%e vdss=%e vdssprime=%e",ifwd,vdss,vdssprime);
// eq. 48
dv = 4*vt*sqrt(LAMBDA*(sqrt(ifwd)-vdss/vt)+1.0/64);
// eq. 49
vds = 0.5*(vd-vs);
// eq. 50
vip = sqrt(`SQR(vdss)+`SQR(dv))-sqrt(`SQR(vds-vdss)+`SQR(dv));
// eq. 52
dl = LAMBDA*lc*ln(1+(vds-vip)/(lc*ucrit));
// eq. 53
lprime = ns*leff-dl+(vds+vip)/ucrit;
// eq. 55
leq = 0.5*(lprime+sqrt(`SQR(lprime)+`SQR(lmin)));
// eq. 56
fv=(vp-vds-vs-sqrt(`SQR(vdssprime)+`SQR(dv))+sqrt(`SQR(vds-vdssprime)+`SQR(dv)))/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
irprime = y*(1.0 + y);
z0 = 1;
z1 = 1;
// eq. 57
fv=(vp-vd)/vt;
if (fv > -0.35) begin
z0 = 2.0/(1.3 + fv - ln(fv+1.6));
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -15) begin
`expl(-fv,tmp)
z0 = 1.55 + tmp;
z1 = (2.0 + z0) / (1.0 + fv + ln(z0));
y = (1.0 + fv + ln(z1)) / (2.0 + z1);
end
else if (fv > -23.0) begin
`expl(-fv,tmp)
y = 1.0 / (2.0 + tmp);
end
else begin
`expl(fv,tmp)
y = tmp + 1.0e-64;
end
irev = y*(1.0 + y);
// eq. 58
beta0 = kp_a*np*weff/leq;
// eq. 59
nau = (5+MTYPE)/12.0;
// eq. 69
nq = 1+0.5*gamma_a/sqrt(vp+phi+1e-6);
// eq. 70
xf = sqrt(0.25+ifwd);
// eq. 71
xr = sqrt(0.25+irev);
// eq. 72
qd = -nq*(4.0/15*(3*`SQR(xr)*(xr+2*xf)+2*`SQR(xf)*(xf+2*xr))/`SQR(xf+xr)-0.5);
// eq. 73
qs = -nq*(4.0/15*(3*`SQR(xf)*(xf+2*xr)+2*`SQR(xr)*(xr+2*xf))/`SQR(xf+xr)-0.5);
// eq. 74
qi = qs+qd;
// eq. 75
if (vgprime>=0)
qb = (-gamma_a*sqrt(vp+phi+1e-6))/vt-(nq-1)/nq*qi;
else
qb = -vgprime/vt;
// eq. 76 (qox removed since it is assumed to be zero)
qg = -qi-qb;
if (E0!=0) begin
// eq. 61
beta0prime = beta0*(1+COX/(E0*`EPSSI)*qb0);
// eq. 62
beta = beta0prime/(1+COX/(E0*`EPSSI)*vt*abs(qb+nau*qi));
end else begin
// eq. 63
vpprime = 0.5*(vp+sqrt(`SQR(vp)+2*`SQR(vt)));
// eq. 64
beta = beta0/(1+THETA*vpprime);
end // else: !if(e0!=0)
// eq. 65
is = 2*n*beta*`SQR(vt);
// $strobe("beta0=%e beta0prime=%e beta=%e E0=%e qb0=%e qb=%e qi=%e",beta0,beta0prime,beta,E0,qb0,qb,qi);
// eq. 66
ids = is*(ifwd-irprime);
// eq. 67
vib = vd-vs-IBN*2*vdss;
// eq. 68
if (vib>0) begin
`expl((-ibb*lc)/vib,tmp)
idb = ids*IBA/ibb*vib*tmp;
end else
idb = 0;
// $strobe("ids=%e idb=%e",ids,idb);
if (mode>1) begin
if (isat_s>0) begin
if (-vs>vexp_s)
ibsj = IMAX+gexp_s*(-vs-vexp_s);
else begin
`expl(-vs/(N*vt),tmp)
ibsj = isat_s*(tmp-1);
end
end else
ibsj = 0;
if (isat_d>0) begin
if (-vd>vexp_d)
ibdj = IMAX+gexp_d*(-vd-vexp_d);
else begin
`expl(-vd/(N*vt),tmp)
ibdj = isat_d*(tmp-1);
end
end else
ibdj = 0;
end else begin // if (mode>1)
if (isat_s>0) begin
if (-vd>vexp_s)
ibsj = IMAX+gexp_s*(-vd-vexp_s);
else begin
`expl(-vd/(N*vt),tmp)
ibsj = isat_s*(tmp-1);
end
end else
ibsj = 0;
if (isat_d>0) begin
if (-vs>vexp_d)
ibdj = IMAX+gexp_d*(-vs-vexp_d);
else begin
`expl(-vs/(N*vt),tmp)
ibdj = isat_d*(tmp-1);
end
end else
ibdj = 0;
end // else: !if(mode>1)
qdt = coxt*vt*qd;
qst = coxt*vt*qs;
qgt = coxt*vt*qg;
qbt = coxt*vt*qb;
cbs = 0;
cbd = 0;
if (cbs0>0) begin
if (MTYPE*V(b,si)>FC*PB)
cbs = cbs+cbs0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,si)-PB*FC))/(PB*(1-FC));
else
cbs = cbs+cbs0/pow(1-MTYPE*V(b,si),MJ);
end
if (cbd0>0) begin
if (MTYPE*V(b,di)>FC*PB)
cbd = cbd+cbd0/pow(1-FC,MJ)*(1+MJ*(MTYPE*V(b,di)-PB*FC))/(PB*(1-FC));
else
cbd = cbd+cbd0/pow(1-MTYPE*V(b,di),MJ);
end
if (cbs0sw>0) begin
if (MTYPE*V(b,si)>FCSW*PBSW)
cbs = cbs+cbs0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,si)-PBSW*FCSW))/(PBSW*(1-FCSW));
else
cbs = cbs+cbs0sw/pow(1-MTYPE*V(b,si),MJSW);
end
if (cbd0sw>0) begin
if (MTYPE*V(b,di)>FCSW*PBSW)
cbd = cbd+cbd0sw/pow(1-FCSW,MJSW)*(1+MJSW*(MTYPE*V(b,di)-PBSW*FCSW))/(PBSW*(1-FCSW));
else
cbd = cbd+cbd0sw/pow(1-MTYPE*V(b,di),MJSW);
end
end //Bias-dependent model evaluation
begin //Define branch sources
I(di,si) <+ MTYPE*mode*ids;
if (mode>0) begin
I(di,b) <+ MTYPE*idb;
I(di,g) <+ MTYPE*ddt(qdt);
I(si,g) <+ MTYPE*ddt(qst);
end else begin
I(si,b) <+ MTYPE*idb;
I(si,g) <+ MTYPE*ddt(qdt);
I(di,g) <+ MTYPE*ddt(qst);
end // else: !if(mode>0)
I(b,si) <+ MTYPE*ibsj;
I(b,di) <+ MTYPE*ibdj;
I(b,g) <+ MTYPE*ddt(qbt);
I(g,si) <+ cgso*ddt(V(g,si));
I(g,di) <+ cgdo*ddt(V(g,di));
I(g,b) <+ cgbo*ddt(V(g,b));
if (RD>0)
I(d,di) <+ V(d,di)/rd;
else
V(d,di) <+ 0.0;
if (RS>0)
I(s,si) <+ V(s,si)/rs;
else
V(s,si) <+ 0.0;
I(b,si) <+ cbs*ddt(V(b,si));
I(b,di) <+ cbd*ddt(V(b,di));
end // begin
// `NOISE begin //Define noise sources
//
// end // noise
end //analog
endmodule

View File

@ -1,851 +0,0 @@
// HICUM Level_0 Version_1.12: A Verilog-A description
// (A simplified version of HICUM Level2 model for BJT)
// ## It is modified after the first version of HICUM/L0 code ##
// 12/08: Modifications for ngspice and adms2.2.7 DW
// Changed VT0 in Vt0 to prevent conflict in compiled C version.
// Made a temporary variable cjei_i for cjei output purpose only.
// Minor code related changes
// 03/08: Quick Fix: Default value of TFH has been changed from infinity to zero and modified the default value limits to [0, inf) to include zero
// 12/06: Upper limit of FGEO is changed to infinity
// 06/06: Thermal node "tnode" set as external
// Flag FLSH introduced for controlling Self-heating calculation
// all if-else blocks marked with begin-end
// all series resistors and RTH are allowed to have a minimum value MIN_R
// 07/06: QCJMOD deleted, QJMODF introduced along with with HICJQ
// ddx() operator used with QJMOD and QJMODF wherever needed
// aj is kept at 2.4 except BE depletion charge
// Substrate transistor transfer current added.
// Gmin added to (bi,ei) and (bi,ci) branches.
// hyperbolic smoothing used in rbi computation to avoid devide-by-zero.
// *********************************************************************************
// 06/06: Comment on NODE COLLAPSING:
// Presently this verilog code permits a minimum of 1 milli-Ohm resistance for any
// series resistance as well as for thermal resistance RTH. If any of the resistance
// values drops below this minimum value, the corresponding nodes are shorted with
// zero voltage contribution. We want the model compilers/simulators deal this
// situation in such a manner that the corresponding node is COLLAPSED.
// We expect that the simulators should permit current contribution statement
// for any branch with resistance value more than (or equal to) 1 milli-Ohm without
// any convergence problem. In fact, we wish NOT to have to use a voltage contribution
// statement in our Verilog code, except as an indication for the model compiler/simulator
// to interprete a zero branch voltage as NODE-COLLAPSING action.
// **********************************************************************************
//Default simulator: Spectre
`ifdef insideADMS
`define P(p) (*p*)
`else
`define P(p)
`endif
//ADS
//`include "constants.vams"
//`include "disciplines.vams"
//`include "compact.vams"
//Spectre
`include "constants.h"
`include "discipline.h"
`define NPN +1
`define PNP -1
`define VPT_thresh 1.0e2
`define EXPLIM 80.0
`define INF 1.0e6
`define TMAX 326.85
`define TMIN -100.0
`define MIN_R 0.001
//`define Gmin 1.0e-12
`define QCMODF(vj,cj0,vd,z,aj,cjf)\
if(cj0 > 0.0) begin\
vf = vd*(1.0-exp(-ln(aj)/z));\
xvf = (vf-vj)/VT;\
xvf2 = sqrt(xvf*xvf+1.921812);\
v_j = vf-VT*(xvf+xvf2)*0.5;\
dvj = 0.5*(xvf+xvf2)/xvf2;\
cjf = cj0*exp(-z*ln(1-v_j/vd))*dvj+aj*cj0*(1-dvj);\
end else begin\
cjf = 0.0;\
end
// DEPLETION CHARGE CALCULATION
// Hyperbolic smoothing used; no punch-through
`define QJMODF(vj,cj0,vd,z,aj,qjf)\
if(cj0 > 0.0) begin\
vf = vd*(1.0-exp(-ln(aj)/z));\
xvf = (vf-vj)/VT;\
xvf2 = sqrt(xvf*xvf+1.921812);\
v_j = vf-VT*(xvf+xvf2)*0.5;\
x = 1.0-z;\
y = 1.0-exp(x*ln(1.0-v_j/vd));\
qjf = cj0*vd*y/x+aj*cj0*(vj-v_j);\
end else begin\
qjf = 0.0;\
end
// Depletion Charge : with punch through
`define QJMOD(vj,cj0,vd,z,vpt,aj,qjf)\
if(cj0 > 0.0) begin\
zr = z/4.0;\
vp = vpt-vd;\
vf = vd*(1.0-exp(-ln(aj)/z));\
cmax = aj*cj0;\
cr = cj0*exp((z-zr)*ln(vd/vpt));\
a = VT;\
ve = (vf-vj)/a;\
if (ve <= `EXPLIM) begin\
ex1 = exp(ve);\
ee1 = 1.0+ex1;\
vj1 = vf-a*ln(ee1);\
end else begin\
vj1 = vj;\
end\
a = 0.1*vp+4.0*VT;\
vr = (vp+vj1)/a;\
if (vr <= `EXPLIM) begin\
ex1 = exp(vr);\
ee1 = 1.0+ex1;\
vj2 = -vp+a*ln(ee1);\
end else begin\
vj2 = vj1;\
end\
vj4 = vj-vj1;\
ez = 1.0-z;\
ezr = 1.0-zr;\
vdj1 = ln(1.0-vj1/vd);\
vdj2 = ln(1.0-vj2/vd);\
qj1 = cj0*(1.0-exp(vdj2*ez))/ez;\
qj2 = cr*(1.0-exp(vdj1*ezr))/ezr;\
qj3 = cr*(1.0-exp(vdj2*ezr))/ezr;\
qjf = (qj1+qj2-qj3)*vd+cmax*vj4;\
end else begin\
qjf = 0.0;\
end
// DEPLETION CHARGE CALCULATION SELECTOR:
// Dependent on junction punch-through voltage
// Important for collector related junctions
`define HICJQ(vj,cj0,vd,z,vpt,qjf)\
if(vpt < `VPT_thresh) begin\
`QJMOD(vj,cj0,vd,z,vpt,2.4,qjf)\
end else begin\
`QJMODF(vj,cj0,vd,z,2.4,qjf)\
end
//Temperature dependence of depletion capacitance parameters
`define TMPHICJ(cj0,vd,z,vg,cj0_t,vd_t)\
arg = 0.5*vd/Vt0;\
vdj0 = 2*Vt0*ln(exp(arg)-exp(-arg));\
vdjt = vdj0*qtt0+vg*(1-qtt0)-mg*VT*ln_qtt0;\
vd_t = vdjt+2*VT*ln(0.5*(1+sqrt(1+4*exp(-vdjt/VT))));\
cj0_t = cj0*exp(z*ln(vd/vd_t));
//Limiting exponential
`define LIN_EXP(le, arg)\
if(arg > 80) begin\
le = (1 + ((arg) - 80));\
arg = 80;\
end else begin\
le=1;\
end\
le = le*limexp(arg);
// IDEAL DIODE (WITHOUT CAPACITANCE):
// conductance not calculated
// INPUT:
// IS, IST : saturation currents (model parameter related)
// UM1 : ideality factor
// U : branch voltage
// IMPLICIT INPUT:
// VT : thermal voltage
// OUTPUT:
// Iz : diode current
`define HICDIO(IS,IST,UM1,U,Iz)\
DIOY = U/(UM1*VT);\
if (IS > 0.0) begin\
if (DIOY > 80) begin\
le = (1 + ((DIOY) - 80));\
DIOY = 80;\
end else begin\
le = 1;\
end\
le = le*limexp(DIOY);\
Iz = IST*(le-1.0);\
if(DIOY <= -14.0) begin\
Iz = -IST;\
end\
end else begin\
Iz = 0.0;\
end
module hic0_full (c,b,e,s,tnode);
//Node definitions
inout c,b,e,s,tnode;
(*info="external collector node"*)electrical c;
(*info="external base node"*)electrical b;
(*info="external emitter node"*)electrical e;
(*info="external substrate node"*)electrical s;
(*info="internal collector node"*)electrical ci;
(*info="internal base node"*)electrical bi;
(*info="internal emitter node"*)electrical ei;
(*info="local temperature rise node"*)electrical tnode;
//Branch definitions
branch (ci,c) br_cic_i;
branch (ci,c) br_cic_v;
branch (ei,e) br_eie_i;
branch (ei,e) br_eie_v;
branch (bi,ei) br_biei;
branch (bi,ci) br_bici;
branch (ci,ei) br_ciei;
branch (b,bi) br_bbi_i;
branch (b,bi) br_bbi_v;
branch (b,e) br_be;
branch (b,ci) br_bci;
branch (b,s) br_bs;
branch (s,ci) br_sci;
branch (tnode ) br_sht;
//
// Parameter initialization with default values
// Collector current
(*spice_name="is", info="(Modified) saturation current", m_factor="yes", unit="A"*) parameter real is = 1.0e-16 from [0:1];
(*spice_name="mcf", info="Non-ideality coefficient of forward collector current"*) parameter real mcf = 1.00 from (0:10];
(*spice_name="mcr", info="Non-ideality coefficient of reverse collector current"*) parameter real mcr = 1.00 from (0:10];
(*spice_name="vef", info="forward Early voltage (normalization volt.)", unit="V", default_value="infinity"*) parameter real vef = `INF from (0:`INF];
(*spice_name="iqf", info="forward d.c. high-injection toll-off current", unit="A", m_factor="yes", default_value="infinity"*) parameter real iqf = `INF from (0:`INF];
(*spice_name="iqr", info="inverse d.c. high-injection roll-off current", unit="A", m_factor="yes", default_value="infinity"*) parameter real iqr = `INF from (0:`INF];
(*spice_name="iqfh", info="high-injection correction current", unit="A", m_factor="yes"*) parameter real iqfh = `INF from (0:`INF];
(*spice_name="tfh", info="high-injection correction factor", test_value="2e-9", m_factor="yes"*) parameter real tfh = 0.0 from [0:`INF);
// Base current
(*spice_name="ibes", info="BE saturation current", unit="A", m_factor="yes"*) parameter real ibes = 1e-18 from [0:1];
(*spice_name="mbe", info="BE non-ideality factor"*) parameter real mbe = 1.0 from (0:10];
(*spice_name="ires", info="BE recombination saturation current", test_value="1e-16", unit="A", m_factor="yes"*) parameter real ires = 0.0 from [0:1];
(*spice_name="mre", info="BE recombination non-ideality factor"*) parameter real mre = 2.0 from (0:10];
(*spice_name="ibcs", info="BC saturation current", test_value="1e-16", unit="A", m_factor="yes"*) parameter real ibcs = 0.0 from [0:1];
(*spice_name="mbc", info="BC non-ideality factor"*) parameter real mbc = 1.0 from (0:10];
// BE depletion cap
(*spice_name="cje0", info="Zero-bias BE depletion capacitance", unit="F", test_value="2e-14", m_factor="yes"*) parameter real cje0 = 1.0e-20 from (0:`INF);
(*spice_name="vde", info="BE built-in voltage", unit="V"*) parameter real vde = 0.9 from (0:10];
(*spice_name="ze", info="BE exponent factor"*) parameter real ze = 0.5 from (0:1];
(*spice_name="aje", info="Ratio of maximum to zero-bias value"*) parameter real aje = 2.5 from [1:`INF);
// Transit time
(*spice_name="t0", info="low current transit time at Vbici=0", test_value="5e-12", unit="s"*) parameter real t0 = 0.0 from [0:`INF);
(*spice_name="dt0h", info="Base width modulation contribution", test_value="2e-12", unit="s"*) parameter real dt0h = 0.0; // from [0:`INF) ;
(*spice_name="tbvl", info="SCR width modulation contribution", test_value="4e-12", unit="s"*) parameter real tbvl = 0.0 from [0:`INF);
(*spice_name="tef0", info="Storage time in neutral emitter", test_value="1e-12", unit="s"*) parameter real tef0 = 0.0 from [0:`INF);
(*spice_name="gte", info="Exponent factor for emmiter transit time"*) parameter real gte = 1.0 from (0:10];
(*spice_name="thcs", info="Saturation time at high current densities", test_value="3e-11", unit="s"*) parameter real thcs = 0.0 from [0:`INF);
(*spice_name="ahc", info="Smoothing facor for current dependence"*) parameter real ahc = 0.1 from (0:10];
(*spice_name="tr", info="Storage time at inverse operation", unit="s"*) parameter real tr = 0.0 from [0:`INF);
// Critical current
(*spice_name="rci0", info="Low-field collector resistance under emitter", test_value="50", unit="Ohm", m_inverse_factor="yes"*) parameter real rci0 = 150 from (0:`INF);
(*spice_name="vlim", info="Voltage dividing ohmic and satur.region", unit="V"*) parameter real vlim = 0.5 from (0:10];
(*spice_name="vpt", info="Punch-through voltage", test_value="10", unit="V", default="infinity"*) parameter real vpt = 100 from (0:100];
(*spice_name="vces", info="Saturation voltage", unit="V"*) parameter real vces = 0.1 from [0:1];
// BC depletion cap intern
(*spice_name="cjci0", info="Total zero-bias BC depletion capacitance", test_value="1e-15", unit="F", m_factor="yes"*) parameter real cjci0 = 1.0e-20 from (0:`INF);
(*spice_name="vdci", info="BC built-in voltage", test_value="0.7", unit="V"*) parameter real vdci = 0.7 from (0:10];
(*spice_name="zci", info="BC exponent factor", test_value="0.4"*) parameter real zci = 0.333 from (0:1];
(*spice_name="vptci", info="Punch-through voltage of BC junction", test_value="50", unit="V"*) parameter real vptci = 100 from (0:100];
// BC depletion cap extern
(*spice_name="cjcx0", info="Zero-bias external BC depletion capacitance", unit="F", test_value="1e-15", m_factor="yes"*) parameter real cjcx0 = 1.0e-20 from [0:`INF);
(*spice_name="vdcx", info="External BC built-in voltage", unit="V"*) parameter real vdcx = 0.7 from (0:10];
(*spice_name="zcx", info="External BC exponent factor"*) parameter real zcx = 0.333 from (0:1];
(*spice_name="vptcx", info="Punch-through voltage", unit="V", test_value="5.0", default="infinity"*) parameter real vptcx = 100 from (0:100];
(*spice_name="fbc", info="Split factor = Cjci0/Cjc0", test_value="0.5"*) parameter real fbc = 1.0 from [0:1];
// Base resistance
(*spice_name="rbi0", info="Internal base resistance at zero-bias", test_value="100", unit="Ohm", m_inverse_factor="yes"*) parameter real rbi0 = 0.0 from [0:`INF);
(*spice_name="vr0e", info="forward Early voltage (normalization volt.)", unit="V"*) parameter real vr0e = 2.5 from (0:`INF];
(*spice_name="vr0c", info="forward Early voltage (normalization volt.)", unit="V", default="infinity", test_value="25.0"*) parameter real vr0c = `INF from (0:`INF];
(*spice_name="fgeo", info="Geometry factor", test_value="0.73"*) parameter real fgeo = 0.656 from [0:`INF];
// Series resistances
(*spice_name="rbx", info="External base series resistance", test_value="8.8", unit="Ohm", m_inverse_factor="yes"*) parameter real rbx = 0.0 from [0:`INF);
(*spice_name="rcx", info="Emitter series resistance", test_value="12.5", unit="Ohm", m_inverse_factor="yes"*) parameter real rcx = 0.0 from [0:`INF);
(*spice_name="re", info="External collector series resistance", test_value="9.16", unit="Ohm", m_inverse_factor="yes"*) parameter real re = 0.0 from [0:`INF);
// Substrate transfer current, diode current and cap
(*spice_name="itss", info="Substrate transistor transfer saturation current", unit="A", test_value="1e-17", m_factor="yes"*) parameter real itss = 0.0 from [0:1.0];
(*spice_name="msf", info="Substrate transistor transfer current non-ideality factor"*) parameter real msf = 1.0 from (0:10];
(*spice_name="iscs", info="SC saturation current", unit="A", test_value="1e-17", m_factor="yes"*) parameter real iscs = 0.0 from [0:1.0];
(*spice_name="msc", info="SC non-ideality factor"*) parameter real msc = 1.0 from (0:10];
(*spice_name="cjs0", info="Zero-bias SC depletion capacitance", unit="F", test_value="1e-15", m_factor="yes"*) parameter real cjs0 = 1.0e-20 from [0:`INF);
(*spice_name="vds", info="SC built-in voltage", unit="V"*) parameter real vds = 0.3 from (0:10];
(*spice_name="zs", info="External SC exponent factor"*) parameter real zs = 0.3 from (0:1];
(*spice_name="vpts", info="SC punch-through voltage", unit="V", test_value="5.0", default="infinity"*) parameter real vpts = 100 from (0:100];
// Parasitic caps
(*spice_name="cbcpar", info="Collector-base isolation (overlap) capacitance", unit="F", m_factor="yes", test_value="1e-15"*) parameter real cbcpar = 0.0 from [0:`INF);
(*spice_name="cbepar", info="Emitter-base oxide capacitance", unit="F", m_factor="yes", test_value="2e-15"*) parameter real cbepar = 0.0 from [0:`INF);
// BC avalanche current
(*spice_name="eavl", info="Exponent factor", test_value="1e-14"*) parameter real eavl = 0.0 from [0:inf);
(*spice_name="kavl", info="Prefactor", test_value="1.19"*) parameter real kavl = 0.0 from [0:`INF);
// Flicker noise
(*spice_name="kf", info="flicker noise coefficient", unit="M^(1-AF)"*) parameter real kf = 0.0 from [0:`INF);
(*spice_name="af", info="flicker noise exponent factor"*) parameter real af = 2.0 from (0:10];
// Temperature dependance
(*spice_name="vgb", info="Bandgap-voltage", unit="V", test_value="1.17"*) parameter real vgb = 1.2 from (0:10];
(*spice_name="vge", info="Effective emitter bandgap-voltage", unit="V", test_value="1.07"*) parameter real vge = 1.17 from (0:10];
(*spice_name="vgc", info="Effective collector bandgap-voltage", unit="V", test_value="1.14"*) parameter real vgc = 1.17 from (0:10];
(*spice_name="vgs", info="Effective substrate bandgap-voltage", unit="V", test_value="1.17"*) parameter real vgs = 1.17 from (0:10];
(*spice_name="f1vg", info="Coefficient K1 in T-dependent bandgap equation", unit="V/K"*) parameter real f1vg =-1.02377e-4;
(*spice_name="f2vg", info="Coefficient K2 in T-dependent bandgap equation", unit="V/K"*) parameter real f2vg = 4.3215e-4;
(*spice_name="alt0", info="Frist-order TC of tf0", unit="1/K"*) parameter real alt0 = 0.0;
(*spice_name="kt0", info="Second-order TC of tf0", unit="1/K^2"*) parameter real kt0 = 0.0;
(*spice_name="zetact", info="Exponent coefficient in transfer current temperature dependence", test_value="3.5"*) parameter real zetact = 3.0;
(*spice_name="zetabet", info="Exponent coefficient in BE junction current temperature dependence", test_value="4.0"*) parameter real zetabet = 3.5;
(*spice_name="zetaci", info="TC of epi-collector diffusivity", test_value="1.6"*) parameter real zetaci = 0.0;
(*spice_name="alvs", info="Relative TC of satur.drift velocity", unit="1/K", test_value="1e-3"*) parameter real alvs = 0.0;
(*spice_name="alces", info="Relative TC of vces", unit="1/K", test_value="4e-4"*) parameter real alces = 0.0;
(*spice_name="zetarbi", info="TC of internal base resistance", test_value="0.6"*) parameter real zetarbi = 0.0;
(*spice_name="zetarbx", info="TC of external base resistance", test_value="0.2"*) parameter real zetarbx = 0.0;
(*spice_name="zetarcx", info="TC of external collector resistance", test_value="0.2"*) parameter real zetarcx = 0.0;
(*spice_name="zetare", info="TC of emitter resistances"*) parameter real zetare = 0.0;
(*spice_name="alkav", info="TC of avalanche prefactor", unit="1/K"*) parameter real alkav = 0.0;
(*spice_name="aleav", info="TC of avalanche exponential factor", unit="1/K"*) parameter real aleav = 0.0;
// Self-heating
(*spice_name="flsh", info="Flag for self-heating calculation", test_value="2"*) parameter integer flsh = 0 from [0:2];
(*spice_name="rth", info="Thermal resistance", test_value="200.0", unit="K/W", m_inverse_factor="yes"*) parameter real rth = 0.0 from [0:`INF);
(*spice_name="cth", info="Thermal capacitance", test_value="0.1", unit="Ws/K", m_factor="yes"*) parameter real cth = 0.0 from [0:`INF);
// Transistor type
(*spice_isflag="yes", info="model type flag for npn" *) parameter integer npn = 1 from [0:1];
(*info="model type flag for pnp" *) parameter integer pnp = 0 from [0:1];
//Circuit simulator specific parameters
(*spice_name="tnom", info="Temperature for which parameters are valid", unit="C"*) parameter real tnom = 27;
(*spice_name="dt", type="instance", info="Temperature change for particular transistor", unit="K"*) parameter real dt = 0.0;
// Declaration of the variables: begin
real _circuit_gmin;
real HICUMtype ;
// QCJMOD
real cj0,vd,z,aj;
real zr,vp;
real cmax,cr,ve;
real ee1,ez,ezr,vdj1,vdj2,ex1,vr,vj1,vj2,vj4;
real qj1,qj2,qj3,qjf;
//Cjfun *** VT, removed: BA
real cj1,cj2,cj3,cjf;
//cjtfun *** tnom,VT,mg,Vt0, removed: BA
real vg;
real vdj0,vdjt,cj0_t,vd_t,aj_t;
// temperature and drift
real VT,Tamb,Tdev,Tnom,dT,qtt0,ln_qtt0;
real vde_t,vdci_t,vdcx_t,vds_t;
real is_t,ires_t,ibes_t,ibcs_t;
real itss_t,iscs_t,cje0_t,cjci0_t,cjcx0_t;
real cjs0_t,rci0_t,vlim_t;
real vces_t,thcs_t,tef0_t,rbi0_t;
real rbx_t,rcx_t,re_t,t0_t,eavl_t,kavl_t;
real aje_t;
// bc charge and cap
(*ask="yes", info="B-C internal junction charge", unit="C"*) real qjci ;
real qjcx,qjcii,cjcii,qjcxi,qjciii; //cjcx
real cjci0_t_ii,cjcx0_t_ii,cjcx0_t_i,v_j;
// be junction
(*ask="yes", info="B-E internal junction charge", unit="C"*) real qjei ;
(*ask="yes", info="B-E internal junction capacitance", unit="F"*) real cjei_i ; // dw: adms2.2.7 problem
real cjei,vf,vj,x,y,e1,e2;
// transfer and internal base current
real cc,qj_2,facl;
real tf0,ickf,ickr,itfi,itri,qm;
real qpt,itf,itr;
(*ask="yes", info="Transfer Current", unit="A"*) real it ;
real ibe,ire,ibi;
real itfl,itrl,al,s3l,wl,d_qfh;
// be diffusion charge
real qf,qf0,dqfh,dqef;
real dtef,dtfh,tf,ick;
real vc,vceff,s3,w,a,tww;
// bc diffusion charge
real qr;
// avalanche current source
real v_bord,a_iavl,lncc;
// base resistance
real rb,eta,rbi,qje,Qz_nom,fQz;
// substrate transistor, diode and cap
real qjs,HSa,HSb,HSI_Tsu,HSUM;
// self heating
real pterm;
// new for temperature dependence
real mg,zetabci,zetasct,zetatef,avs;
real k1,k2,vgbe,vgbc,vgsc,dvg;
real xvf,xvf2,dvj,uvc,Vt0;
// noise
real flicker_Pwr,fourkt,twoq;
// LIN_EXP
real le,arg,le1,arg1,le2,arg2;
//HICDIO
real IS,IST,UM1,U,Iz,DIOY;
// branch voltages
real Vbci,Vbici,Vbiei,Vciei,Vsci,Veie,Vbbi,Vcic,Vbe,Vrth;
//Output to be seen
(*ask="yes", info="Base-collector diode current", unit="A"*) real ijbc ;
(*ask="yes", info="Avalanche current", unit="A"*) real iavl ;
(*ask="yes", info="Substrate-collector diode current", unit="A"*) real ijsc ;
(*ask="yes", info="Current through external to internal emitter node", unit="A"*) real Ieei ;
(*ask="yes", info="Current through external to internal collector node", unit="A"*) real Icci ;
(*ask="yes", info="Current through external to internal base node", unit="A"*) real Ibbi ;
(*ask="yes", info="Base-collector diode current minus the avalanche current", unit="A"*) real Ibici ;
(*ask="yes", info="Base-emitter diode current", unit="A"*) real ijbe ;
real Qbci,Qbe,Qbici,Qbiei;
//Declaration of the variables: end
//
//======================== calculation of the transistor ===================
//
analog begin
// assign voltages with regard to transistor type
begin : initial_model
if ($param_given(npn))
HICUMtype = `NPN;
else if ($param_given(pnp))
HICUMtype = `PNP;
else
HICUMtype = `NPN;
end
Vbci = HICUMtype*V(br_bci);
Vbici = HICUMtype*V(br_bici);
Vbiei = HICUMtype*V(br_biei);
Vciei = HICUMtype*V(br_ciei);
Vsci = HICUMtype*V(br_sci);
Veie = V(br_eie_v);
Vcic = V(br_cic_v);
Vbbi = V(br_bbi_v);
Vbe = HICUMtype*V(br_be);
Vrth = V(br_sht);
//
// temperature and resulting parameter drift
//
Tnom = tnom+273.15;
Tamb = $temperature;
Tdev = Tamb+dt+Vrth;
// Limit temperature to avoid FPE's in equations
if(Tdev < `TMIN + 273.15) begin
Tdev = `TMIN + 273.15;
end else begin
if (Tdev > `TMAX + 273.15) begin
Tdev = `TMAX + 273.15;
end
end
Vt0 = `P_K*Tnom /`P_Q;
VT = `P_K*Tdev /`P_Q;
dT = Tdev-Tnom;
qtt0 = Tdev/Tnom;
ln_qtt0 = ln(qtt0);
k1 = f1vg*Tnom;
k2 = f2vg*Tnom+k1*ln(Tnom);
avs = alvs*Tnom;
vgbe = (vgb+vge)/2;
vgbc = (vgb+vgc)/2;
vgsc = (vgs+vgc)/2;
mg = 3-`P_Q*f1vg/`P_K;
zetabci = mg+1-zetaci;
zetasct = mg-1.5; //+1-m_upS with m_upS=2.5
is_t = is*exp(zetact*ln_qtt0+vgb/VT*(qtt0-1));
ibes_t = ibes*exp(zetabet*ln_qtt0+vge/VT*(qtt0-1));
ires_t = ires*exp(0.5*mg*ln_qtt0+0.5*vgbe/VT*(qtt0-1));
ibcs_t = ibcs*exp(zetabci*ln_qtt0+vgc/VT*(qtt0-1));
itss_t = itss*exp(zetasct*ln_qtt0+vgc/VT*(qtt0-1));
iscs_t = iscs*exp(zetasct*ln_qtt0+vgs/VT*(qtt0-1));
`TMPHICJ(cje0,vde,ze,vgbe,cje0_t,vde_t)
aje_t = aje*vde_t/vde;
`TMPHICJ(cjci0,vdci,zci,vgbc,cjci0_t,vdci_t)
`TMPHICJ(cjcx0,vdcx,zcx,vgbc,cjcx0_t,vdcx_t)
`TMPHICJ(cjs0,vds,zs,vgsc,cjs0_t,vds_t)
rci0_t = rci0*exp(zetaci*ln_qtt0);
vlim_t = vlim*exp((zetaci-avs)*ln_qtt0);
vces_t = vces*(1+alces*dT);
t0_t = t0*(1+alt0*dT+kt0*dT*dT);
thcs_t = thcs*exp((zetaci-1)*ln_qtt0);
zetatef = zetabet-zetact-0.5;
dvg = vgb-vge;
tef0_t = tef0*exp(zetatef*ln_qtt0-dvg/VT*(qtt0-1));
rbx_t = rbx*exp(zetarbx*ln_qtt0);
rcx_t = rcx*exp(zetarcx*ln_qtt0);
rbi0_t = rbi0*exp(zetarbi*ln_qtt0);
re_t = re*exp(zetare*ln_qtt0);
eavl_t = eavl*exp(aleav*dT);
kavl_t = kavl*exp(alkav*dT);
//
// Calculation of intrinsic transistor elements
//
// BC charge and cap (internal and external)
// The cjcx0 value is used to switch between one (cjcx0=0) and two bc parameter sets
// 1. For one parameter set only the internal bc set is partitioned by fbc
// 2. For two independent sets only the external set is partitioned by fbc
if (cjcx0_t==0) begin
cjci0_t_ii = cjci0_t*fbc; // zero bias internal portion
qjcxi = 0;
cjcx0_t_i = cjci0_t*(1-fbc); // zero bias external portion
`HICJQ(Vbci,cjcx0_t_i,vdci_t,zci,vptci,qjcx)
end else begin
cjci0_t_ii = cjci0_t; // zero bias internal portion
cjcx0_t_ii = cjcx0_t*fbc;
`HICJQ(Vbici,cjcx0_t_ii,vdcx_t,zcx,vptcx,qjcxi)
cjcx0_t_i = cjcx0_t*(1-fbc); // zero bias external portion
`HICJQ(Vbci,cjcx0_t_i,vdcx_t,zcx,vptcx,qjcx)
end
`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,vptci,qjci)
qjcii = qjci+qjcxi;
//Internal bc cap without punch through for cc
//`HICJQ(Vbici,cjci0_t_ii,vdci_t,zci,100,qjciii)
`QCMODF(Vbici,cjci0_t_ii,vdci_t,zci,2.4,cjcii)
//cjcii = ddx(qjciii,V(bi));
//Internal be cap and charge
`QJMODF(Vbiei,cje0_t,vde_t,ze,aje_t,qjei)
cjei = ddx(qjei,V(bi));
cjei_i = cjei; // dw: adms2.2.7 problem
// Critical current: ick
vc = Vciei-vces_t;
uvc = vc/VT-1;
vceff = VT*(1+0.5*(uvc+sqrt(uvc*uvc+1.921812)));
x = (vceff-vlim_t)/vpt;
ick = vceff*(1+0.5*(x+sqrt(x*x+1e-3)))/rci0_t/sqrt(1+vceff*vceff/vlim_t/vlim_t);
// Transfer current
// Normalized BC cap and carge
cc = cjci0_t_ii/cjcii;
qjci = qjci/cjci0_t_ii;
qj_2 = (1+qjci/vef)/2;
// Minority charge transit time
tf0 = t0_t+dt0h*(cc-1)+tbvl*(1/cc-1);
// DC critical currents
ickf = iqf;
ickr = iqr;
// Ideal transfer currents
arg1 = Vbiei/(mcf*VT);
`LIN_EXP(le1,arg1)
itfi=is_t*le1;
arg2 = Vbici/(mcr*VT);
`LIN_EXP(le2,arg2)
itri=is_t*le2;
// Normalized minority charge
qm = (itfi/ickf+itri/ickr);
// Normalized total hole charge
qpt = qj_2+sqrt((qj_2)*(qj_2)+qm);
if (qpt<=1e-20) begin
qpt=1e-20;
end
// Low transfer current
itfl = itfi/qpt;
itrl = itri/qpt;
// Normalized injection width with low transfer current
// and normalized charge component
if (itfl<=1e-20) begin
itfl = 1e-20;
end
al = 1-ick/itfl;
s3l = sqrt(al*al+ahc);
wl = (al+s3l)/(1+sqrt(1+ahc));
d_qfh = (wl*wl+tfh*itfl/ick)*itfl/iqfh;
// Transfer current
facl = 1/(1+d_qfh/qpt);
itf = itfl*facl;
itr = itrl*facl;
if (itf<=1e-20) begin
itf = 1e-20;
end
it = itf-itr;
// BE diffusion charge
// Calculation of low-current portion
qf0 = tf0*itf;
// Current dependent component
a = 1-ick/itf;
s3 = sqrt(a*a+ahc);
w = (a+s3)/(1+sqrt(1+ahc));
tww = thcs_t*w*w;
dqfh = tww*itf;
dtfh = tww*(1+2*ick/itf/s3);
// Emitter component
dtef = tef0_t*exp(gte*ln(itf/ick));
dqef = dtef*itf/(gte+1.0);
// Total minority charge and transit time
qf = qf0+dqef+dqfh;
tf = tf0+dtfh+dtef;
// BC diffusion charge
qr = tr*itr;
// Internal base current
// BE diode
`HICDIO(ibes,ibes_t,mbe,Vbiei,ibe)
`HICDIO(ires,ires_t,mre,Vbiei,ire)
ijbe = ibe+ire;
// BC diode
`HICDIO(ibcs,ibcs_t,mbc,Vbici,ijbc)
// Total base current
ibi = ijbe+ijbc;
// Avalanche current
if (Vbici < 0) begin : HICAVL
v_bord = eavl_t*vdci_t;
if (vdci_t-Vbici>v_bord) begin
a_iavl = kavl_t/vdci_t*exp(-cc);
iavl = itf*a_iavl*(v_bord+(1+cc)*(vdci_t-Vbici-v_bord));
end else begin
lncc = ln(1/cc);
iavl = kavl_t*itf*exp(-1/zci*lncc-eavl_t*exp((1/zci-1)*lncc));
end
end else begin
iavl = 0;
end
//
// Additional elements for external transistor
//
// Base resistance
if(rbi0_t > 0.0) begin : HICRBI
// Conductivity modulation with hyperbolic smoothing
qje = qjei/cje0_t;
Qz_nom = 1+qje/vr0e+qjci/vr0c+itf/ickf+itr/ickr;
fQz = 0.5*(Qz_nom+sqrt(Qz_nom*Qz_nom+0.01));;
rbi = rbi0_t/fQz;
// Emitter current crowding
if (ibi > 0.0) begin
eta = fgeo*rbi*ibi/VT;
if (eta < 1e-6) begin
rbi = rbi*(1-0.5*eta);
end else begin
rbi = rbi*ln(eta+1)/eta;
end
end
end else begin
rbi = 0.0;
end
// Total base resistance
rb = rbi+rbx_t;
// Parasitic substrate transistor transfer current
if(itss > 0.0) begin : Sub_Transfer
HSUM = msf*VT;
HSa = limexp(Vbci/HSUM);
HSb = limexp(Vsci/HSUM);
HSI_Tsu = itss_t*(HSa-HSb);
end else begin
HSI_Tsu = 0.0;
end
// Substrate diode and cap and charge
`HICDIO(iscs,iscs_t,msc,Vsci,ijsc)
`HICJQ(Vsci,cjs0_t,vds_t,zs,vpts,qjs)
// Self heating
if (flsh == 1 && rth >= `MIN_R) begin
pterm = it*Vciei+iavl*(vdci_t-Vbici);
end else if (flsh == 2 && rth >= `MIN_R) begin
pterm = Vciei*it + (vdci_t-Vbici)*iavl + ijbe*Vbiei + ijbc*Vbici + ijsc*Vsci;
if (rb >= `MIN_R) begin
pterm = pterm + Vbbi*Vbbi/rb;
end
if (re_t >= `MIN_R) begin
pterm = pterm + Veie*Veie/re_t;
end
if (rcx_t >= `MIN_R) begin
pterm = pterm + Vcic*Vcic/rcx_t;
end
end
//
// Compute branch sources
//
Ibici = ijbc - iavl;
Qbci = cbcpar*Vbci;
Qbe = cbepar*Vbe;
Qbici = qjcii+qr;
Qbiei = qjei+qf;
ijsc = HICUMtype*ijsc;
qjs = HICUMtype*qjs;
qjcx = HICUMtype*qjcx;
Qbci = HICUMtype*Qbci;
Qbe = HICUMtype*Qbe;
Ibici = HICUMtype*Ibici;
Qbici = HICUMtype*Qbici;
ijbe = HICUMtype*ijbe;
Qbiei = HICUMtype*Qbiei;
it = HICUMtype*it;
//
// Define branch sources
//
I(br_biei) <+ _circuit_gmin*V(br_biei);
I(br_bici) <+ _circuit_gmin*V(br_bici);
I(br_bs) <+ HSI_Tsu;
I(br_sci) <+ ijsc + _circuit_gmin*V(br_sci); //`P(spectre_gmin="add", spectre_pwl_passive="1e10");
I(br_sci) <+ ddt(qjs);
I(br_bci) <+ ddt(qjcx);
I(br_bci) <+ ddt(Qbci);
I(br_be) <+ ddt(Qbe);
if (re >= `MIN_R) begin
I(br_eie_i) <+ Veie/re_t + _circuit_gmin*V(br_eie_i);//`P(spectre_gmin="add");
end else begin
V(br_eie_v) <+ 0.0;
end
if (rcx >= `MIN_R) begin
I(br_cic_i) <+ Vcic/rcx_t + _circuit_gmin*V(br_cic_i);//`P(spectre_gmin="add");
end else begin
V(br_cic_v) <+ 0.0;
end
if (rbi0 >= `MIN_R || rbx >= `MIN_R) begin
I(br_bbi_i) <+ Vbbi/rb + _circuit_gmin*V(br_bbi_i); //`P(spectre_gmin="add");
end else begin
V(br_bbi_v) <+ 0.0;
end
I(br_bici) <+ Ibici + _circuit_gmin*V(br_bici); //`P(spectre_gmin="add", spectre_pwl_sat_current="IMAX", spectre_pwl_sat_cond="imax/0.025", spectre_pwl_rev_current="imax", spectre_pwl_rev_cond="IMAX/0.025");
I(br_bici) <+ ddt(Qbici);
I(br_biei) <+ ijbe + _circuit_gmin*V(br_biei); //`P(spectre_gmin="add", spectre_pwl_fwd_current="IBEIS*exp(25.0)", spectre_pwl_fwd_node="bi", spectre_pwl_fwd_cond="IBEIS*exp(25.0)/0.025", spectre_pwl_sat_current="IMAX", spectre_pwl_sat_cond="IMAX/0.025", spectre_pwl_passive="1e10");
I(br_biei) <+ ddt(Qbiei);
I(br_ciei) <+ it; //`P(spectre_pwl_fwd_current="IS*exp(25.0)", spectre_pwl_fwd_node="bi", spectre_pwl_fwd_cond="IS*exp(25.0)/0.025", spectre_pwl_rev_current="IMAX", spectre_pwl_rev_cond="IMAX/0.025", spectre_pwl_passive="1e10")
// Following code is an intermediate solution:
// ******************************************
if(flsh == 0 || rth < `MIN_R) begin
I(br_sht) <+ Vrth/`MIN_R;
end else begin
I(br_sht) <+ Vrth/rth-pterm + _circuit_gmin*V(br_sht);//`P(spectre_gmin="add");
I(br_sht) <+ ddt(cth*Vrth);
end
// ******************************************
// For simulators having no problem with V(br_sht) <+ 0.0
// with external thermal node, follwing code may be used.
// This external thermal node should remain accessible.
// ********************************************
//if(flsh == 0 || rth < `MIN_R) begin
// V(br_sht) <+ 0.0;
//end else begin
// I(br_sht) <+ Vrth/rth-pterm `P(spectre_gmin="add");
// I(br_sht) <+ ddt(cth*Vrth);
//end
// ********************************************
// Noise sources
// Thermal noise
fourkt = 4.0 * `P_K * Tdev;
if(rbx >= `MIN_R || rbi0 >= `MIN_R) begin
I(br_bbi_i) <+ white_noise(fourkt/rb);
end
if(rcx >= `MIN_R) begin
I(br_cic_i) <+ white_noise(fourkt/rcx_t);
end
if(re >= `MIN_R) begin
I(br_eie_i) <+ white_noise(fourkt/re_t);
end
// Shot noise
twoq = 2.0 * `P_Q;
I(br_biei) <+ white_noise(twoq*ijbe);
I(br_ciei) <+ white_noise(twoq*it);
// Flicker noise
flicker_Pwr = kf*pow(ijbe,af);
I(br_biei) <+ flicker_noise(flicker_Pwr,1.0);
end // analog
endmodule

File diff suppressed because it is too large Load Diff

View File

@ -1,40 +0,0 @@
Verilog-A implementation of the Mextram Bipolar Transistor Model,
including variants of the Mextram model released by Delft University.
Copyright (c) 2006 Delft University of Technology
Licensed under the Educational Community License version 1.0
This Original Work, including software, source code, documents, or other related items,
is being provided by the copyright holder(s) subject to the terms of the Educational
Community License. By obtaining, using and/or copying this Original Work, you agree that
you have read, understand, and will comply with the following terms and conditions of
the Educational Community License:
Permission to use, copy, modify, merge, publish, distribute, and sublicense this Original
Work and its documentation, with or without modification, for any purpose, and without fee
or royalty to the copyright holder(s) is hereby granted, provided that you include the
following on ALL copies of the Original Work or portions thereof, including modifications
or derivatives, that you make:
The full text of the Educational Community License in a location viewable to users of the
redistributed or derivative work.
Any pre-existing intellectual property disclaimers, notices, or terms and conditions.
Notice of any changes or modifications to the Original Work, including the date the
changes were made.
Any modifications of the Original Work must be distributed in such a manner as to avoid
any confusion with the Original Work of the copyright holders.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
The name and trademarks of copyright holder(s) may NOT be used in advertising or publicity
pertaining to the Original or Derivative Works without specific, written prior permission.
Title to copyright in the Original Work and any associated documentation will at all times
remain with the copyright holders.

View File

@ -1,40 +0,0 @@
`include "frontdef.inc"
`define SELFHEATING
`define SUBSTRATE
module bjt504tva (c, b, e, s, dt);
// External ports
inout c, b, e, s, dt;
(*info="external collector node"*) electrical c;
(*info="external base node"*) electrical b;
(*info="external emitter node"*) electrical e;
(*info="external substrate node"*) electrical s;
(*info="external thermal node"*) electrical dt;
// Internal nodes
(*info="internal collector node 1"*) electrical c1;
(*info="internal emitter node"*) electrical e1;
(*info="internal base node 1"*) electrical b1;
(*info="internal base node 2"*) electrical b2;
(*info="internal collector node 2"*) electrical c2;
(*info="internal collector node 3"*) electrical c3;
(*info="internal collector node 4"*) electrical c4;
// For correlated noise implementation
(*info="internal noise node"*) electrical noi;
`include "parameters.inc"
`include "variables.inc"
`include "opvars.inc"
analog begin
`include "initialize.inc"
`include "tscaling.inc"
`include "evaluate.inc"
`include "opinfo.inc"
end // analog
endmodule

View File

@ -1,704 +0,0 @@
// Evaluate model equations
begin // Currents and sharges
// Nodal biases
Vb2c1 = TYPE * V(b2, c1);
Vb2c2 = TYPE * V(b2, c2);
Vb2e1 = TYPE * V(b2, e1);
Vb1e1 = TYPE * V(b1, e1);
Vb1b2 = TYPE * V(b1, b2);
`ifdef SUBSTRATE
Vsc1 = TYPE * V(s, c1);
`endif
Vc1c2 = TYPE * V(c1, c2);
Vee1 = TYPE * V(e, e1);
Vbb1 = TYPE * V(b, b1);
Vbe = TYPE * V(b, e);
Vbc = TYPE * V(b, c);
/* RvdT, 03-12-2007, voltage differences
associated with distributed parasitic collector.
Evaluated taking values of resistances into account:
in case of vanishing resistance corresponding node
is not addressed: */
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = TYPE * V(c3, c4);
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = TYPE * V(c3, c1);
end
end
else
begin
if (RCBLI > 0.0)
begin
Vc4c1 = TYPE * V(c4, c1);
Vc3c4 = 0 ;
end
else
begin
Vc4c1 = 0 ;
Vc3c4 = 0 ;
end
end
Vb1c4 = Vb1b2 + Vb2c2 - Vc1c2 - Vc4c1 ;
Vcc3 = - Vbc + Vbb1 + Vb1c4 - Vc3c4 ;
Vbc3 = Vbc + Vcc3 ;
`ifdef SUBSTRATE
Vsc4 = Vsc1 - Vc4c1 ;
Vsc3 = Vsc4 - Vc3c4 ;
`endif
// Exponential bias terms
`expLin(eVb2c2,Vb2c2 * VtINV)
`expLin(eVb2e1,Vb2e1 * VtINV)
`expLin(eVb1e1,Vb1e1 * VtINV)
`expLin(eVb1c4,Vb1c4 * VtINV)
`expLin(eVb1b2,Vb1b2 * VtINV)
`expLin(eVbc3,Vbc3 * VtINV)
`ifdef SUBSTRATE
`expLin(eVsc1,Vsc1 * VtINV)
`endif
`expLin(eVbc3VDC,(Vbc3 - VDC_T) * VtINV)
`expLin(eVb1c4VDC,(Vb1c4 - VDC_T) * VtINV)
`expLin(eVb2c2VDC,(Vb2c2 - VDC_T) * VtINV)
`expLin(eVb2c1VDC,(Vb2c1 - VDC_T) * VtINV)
// Governing equations
// Epilayer model
K0 = sqrt(1.0 + 4.0 * eVb2c2VDC);
Kw = sqrt(1.0 + 4.0 * eVb2c1VDC);
pW = 2.0 * eVb2c1VDC / (1.0 + Kw);
if (pW < `TEN_M40) pW = 0;
Ec = Vt * (K0 - Kw - ln((K0 + 1.0) / (Kw + 1.0)) );
Ic1c2 = (Ec + Vc1c2) / RCV_TM + _circuit_gmin * Vc1c2;
if (Ic1c2 > 0.0) begin
`linLog(tmpV,Vb2c1,100.0);
Vqs_th = VDC_T + 2.0 * Vt *
ln(0.5 * Ic1c2 * RCV_TM * VtINV + 1.0) - tmpV;
eps_VDC = 0.2 * VDC_T;
`max_hyp0(Vqs, Vqs_th, eps_VDC);
Iqs = Vqs * (Vqs + IHC_M * SCRCV_M) / (SCRCV_M * (Vqs + IHC_M * RCV_TM));
Ic1c2_Iqs = Ic1c2 / Iqs;
`max_logexp(alpha1, Ic1c2_Iqs, 1.0, AXI);
alpha = alpha1 / (1.0 + AXI * ln(1.0 + exp(-1.0 / AXI)));
vyi = Vqs / (IHC_M * SCRCV_M);
yi = (1.0 + sqrt(1.0 + 4.0 * alpha * vyi * (1.0 + vyi))) /
(2.0 * alpha * (1.0 + vyi));
xi_w = 1.0 - yi / (1.0 + pW * yi);
gp0 = 0.5 * Ic1c2 * RCV_TM * xi_w * VtINV;
gp0_help = 2.0 * gp0 + pW * (pW + gp0 + 1.0);
gp02 = 0.5 * (gp0 - 1.0);
sqr_arg = gp02 * gp02 + gp0_help;
if (gp0 >= 1.0)
p0star = gp02 + sqrt(sqr_arg);
else
p0star = gp0_help / (sqrt(sqr_arg) - gp02);
if (p0star < `TEN_M40) p0star = 0.0;
eVb2c2star = p0star * (p0star + 1.0) * exp(VDC_T * VtINV);
B1 = 0.5 * SCRCV_M * (Ic1c2 - IHC_M);
B2 = SCRCV_M * RCV_TM * IHC_M * Ic1c2;
Vxi0 = B1 + sqrt(B1 * B1 + B2);
Vch = VDC_T * (0.1 + 2.0 * Ic1c2 / (Ic1c2 + Iqs));
Icap = IHC_M * Ic1c2 / (IHC_M + Ic1c2);
Icap_IHC = IHC_M / (IHC_M + Ic1c2);
end else begin
p0star = 2.0 * eVb2c2VDC / (1.0 + K0);
eVb2c2star = eVb2c2;
if ((abs(Vc1c2) < 1.0e-5 * Vt) ||
(abs(Ec) < `TEN_M40 * Vt * (K0 + Kw)))
begin
pav = 0.5 * (p0star + pW);
xi_w = pav / (pav + 1.0);
end
else
begin
xi_w = Ec / (Ec + Vb2c2 - Vb2c1);
end
Vxi0 = Vc1c2;
Vch = 0.1 * VDC_T;
Icap = Ic1c2;
Icap_IHC = 1.0 - Icap / IHC_M;
end
// Effective emitter junction capacitance bias
Vfe = VDE_T * (1.0 - pow(`AJE , -1.0 / PE));
a_VDE = 0.1 * VDE_T;
`min_logexp(Vje, Vb2e1, Vfe, a_VDE);
// RvdT, November 2008, E0BE to be re-used in EB- Zener tunnel model:
E0BE = pow(1.0 - Vje * inv_VDE_T, 1.0 - PE) ;
Vte = VDE_T / (1.0 - PE) * (1.0 - E0BE) +
`AJE * (Vb2e1 - Vje);
// Effective collector junction capacitance bias
Vjunc = Vb2c1 + Vxi0;
bjc = (`AJC - XP_T) / (1.0 - XP_T);
Vfc = VDC_T * (1.0 - pow(bjc, -1.0 / PC));
`min_logexp(Vjc, Vjunc, Vfc, Vch);
fI = pow(Icap_IHC, MC);
Vcv = VDC_T / (1.0 - PC) * (1.0 - fI * pow(1.0 - Vjc / VDC_T, 1.0 - PC)) +
fI * bjc * (Vjunc - Vjc);
Vtc = (1.0 - XP_T) * Vcv + XP_T * Vb2c1;
// Transfer current
If0 = 4.0 * IS_TM / IK_TM;
f1 = If0 * eVb2e1;
n0 = f1 / (1.0 + sqrt(1.0 + f1));
f2 = If0 * eVb2c2star;
nB = f2 / (1.0 + sqrt(1.0 + f2));
if (DEG == 0.0)
q0I = 1.0 + Vte / VER_T + Vtc / VEF_T;
else
begin
termE = (Vte / VER_T + 1.0) * DEG_T * VtINV;
termC = -Vtc / VEF_T * DEG_T * VtINV;
q0I = (exp(termE) - exp(termC)) /
(exp(DEG_T * VtINV) - 1.0);
end
`max_hyp0(q1I, q0I, 0.1);
qBI = q1I * (1.0 + 0.5 * (n0 + nB));
Ir = IS_TM * eVb2c2star;
If = IS_TM * eVb2e1;
In = (If - Ir) / qBI;
// Base and substrate current(s)
Ibf0 = IS_TM / BF_T;
if (XREC == 0.0)
Ib1 = (1.0 - XIBI) * Ibf0 * (eVb2e1 - 1.0);
else
Ib1 = (1.0 - XIBI) * Ibf0 * ((1.0 - XREC) * (eVb2e1 - 1.0) +
XREC * (eVb2e1 + eVb2c2star - 2.0) * (1.0 + Vtc / VEF_T));
Ib1_s = XIBI * Ibf0 * (eVb1e1 - 1.0);
`expLin(tmpExp,Vb2e1 * VtINV / MLF)
Ib2 = IBF_TM * (tmpExp - 1.0) + _circuit_gmin * Vb2e1;
`expLin(tmpExp,0.5 * Vb1c4 * VtINV)
Ib3 = IBR_TM * (eVb1c4 - 1.0) /
(tmpExp + exp(0.5 * VLR * VtINV)) +
_circuit_gmin * Vb1c4;
// begin RvdT, November 2008, MXT504.8_alpha
// Base-emitter tunneling current
// max E-field E0BE calculated in BE depletion charge model:
if (IZEB > 0.0 && NZEB > 0.0 && Vb2e1 < 0)
begin
`expLin(eZEB, nZEB_T * (1 - (pow2_2mPE/(2.0*E0BE))))
// Force all derivatives at Vb2e1=0 to zero by using in DZEB a
// modified dE0BE expression for E0BE:
x = Vb2e1 * inv_VDE_T ;
dE0BE = pow(- x, -2.0-PE)*(PE*(1-PE*PE-3*x*(PE-1))-6*x*x*(PE-1+x)) * `one_sixth ;
`expLin(edZEB, Vb2e1 * pow2_2mPE * nZEB_T / (VGZEB_T * dE0BE ))
DZEB = - Vb2e1 - VGZEB_T * dE0BE * (1 - edZEB) / (pow2_2mPE * nZEB_T) ;
Izteb = 2.0 * IZEB_TM * DZEB * E0BE * eZEB * inv_VDE_T * pow2_PEm2 ;
end
else
begin
DZEB = 0 ;
Izteb = 0 ;
end
// end RvdT, November 2008, MXT504.8_alpha
// Iex, Isub (XIex, XIsub)
g1 = If0 * eVb1c4;
g2 = 4.0 * eVb1c4VDC;
nBex = g1 / (1.0 + sqrt(1.0 + g1));
pWex = g2 / (1.0 + sqrt(1.0 + g2));
Iex = (1.0 / BRI_T) * (0.5 * IK_TM * nBex - IS_TM);
`ifdef SUBSTRATE
Isub = 2.0 * ISS_TM * (eVb1c4 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * (IS_TM / IKS_TM) * eVb1c4));
// until504.8: Isf = ISS_TM * (eVsc1 - 1.0);
// New 504.9:
if (ICSS < 0.0)
// this clause is to implement backwards compatibility
begin
Isf = ISS_TM * (eVsc1 - 1.0);
end
else
begin
Isf = ICSS_TM * (eVsc1 - 1.0);
end
// End: New 504.9.
`endif
XIex =0.0;
`ifdef SUBSTRATE
XIsub = 0.0;
`endif
if (EXMOD == 1)
begin
Iex = Iex * Xext1;
`ifdef SUBSTRATE
Isub = Isub * Xext1;
`endif
Xg1 = If0 * eVbc3;
XnBex = Xg1 / (1.0 + sqrt(1.0 + Xg1));
XIMex = XEXT * (0.5 * IK_TM * XnBex - IS_TM) / BRI_T;
`ifdef SUBSTRATE
XIMsub = XEXT * 2.0 * ISS_TM * (eVbc3 - 1.0) /
(1.0 + sqrt(1.0 + 4.0 * IS_T / IKS_T * eVbc3));
Vex_bias = XEXT * (IS_TM / BRI_T + ISS_TM) * RCCxx_TM;
`else
XIMsub = 0.0;
Vex_bias = XEXT * (IS_TM / BRI_T) * RCCxx_TM;
`endif
Vex = Vt * (2.0 - ln( Vex_bias * VtINV));
vdif = Vbc3 - Vex;
`max_hyp0(VBex, vdif, 0.11);
Fex = VBex /(Vex_bias + (XIMex + XIMsub) * RCCxx_TM + VBex);
XIex = Fex * XIMex;
`ifdef SUBSTRATE
XIsub = Fex * XIMsub;
`endif
end
else
begin
Fex = 0;
XnBex = 0 ;
end
// Variable base resistance
q0Q = 1.0 + Vte / VER_T + Vtc / VEF_T;
`max_hyp0(q1Q, q0Q, 0.1);
qBQ = q1Q * (1.0 + 0.5 * (n0 + nB));
Rb2 = 3.0 * RBV_TM / qBQ;
Ib1b2 = (2.0 * Vt * (eVb1b2 - 1.0) + Vb1b2) / Rb2 + _circuit_gmin * Vb1b2;
// Weak-avalanche current
Iavl = 0.0;
Gem = 0.0;
if ((Ic1c2 > 0.0) && (Vb2c1 < VDC_T)) begin
dEdx0 = 2.0 * VAVL / (WAVL * WAVL);
sqr_arg = (VDC_T - Vb2c1) / Icap_IHC;
xd = sqrt(2.0 * sqr_arg / dEdx0);
if (EXAVL == 0.0)
Weff = WAVL;
else
begin
xi_w1 = 1.0 - 0.5 * xi_w;
Weff = WAVL * xi_w1 * xi_w1;
end
Wd = xd * Weff / sqrt(xd * xd + Weff * Weff);
Eav = (VDC_T - Vb2c1) / Wd;
E0 = Eav + 0.5 * Wd * dEdx0 * Icap_IHC;
if (EXAVL == 0)
Em = E0;
else
begin
SHw = 1.0 + 2.0 * SFH * (1.0 + 2.0 * xi_w);
Efi = (1.0 + SFH) / (1.0 + 2.0 * SFH);
Ew = Eav - 0.5 * Wd * dEdx0 * (Efi - Ic1c2 / (IHC_M * SHw));
sqr_arg = (Ew - E0) * (Ew - E0) + 0.1 * Eav * Eav * Icap / IHC_M;
Em = 0.5 * (Ew + E0 + sqrt(sqr_arg));
end
EmEav_Em = (Em - Eav) / Em;
if (abs(EmEav_Em) > `TEN_M07)
begin
lambda = 0.5 * Wd / EmEav_Em;
Gem = An / BnT * Em * lambda *
(exp(-BnT / Em) - exp(-BnT / Em * (1.0 + Weff / lambda)) );
end
else
Gem = An * Weff * exp(-BnT / Em);
Gmax = Vt / (Ic1c2 * (RBC_TM + Rb2)) + qBI / BF_T +
RE_TM / (RBC_TM + Rb2);
Iavl = Ic1c2 * Gem / (Gem +Gem / Gmax + 1.0);
end
if (eVb2c2star > 0.0)
Vb2c2star = Vt * ln(eVb2c2star);
else
Vb2c2star = Vb2c2;
`ifdef SELFHEATING
// Power dissipation
// RvdT 03-12-2007, modified power equation due to distribution collector resistance
power = In * (Vb2e1 - Vb2c2star) +
Ic1c2 * (Vb2c2star - Vb2c1) -
Iavl * Vb2c2star +
Vee1 * Vee1 / RE_TM +
Vcc3 * Vcc3 * GCCxx_TM +
Vc3c4 * Vc3c4 * GCCex_TM +
Vc4c1 * Vc4c1 * GCCin_TM +
Vbb1 * Vbb1 / RBC_TM +
Ib1b2 * Vb1b2 +
// 504.8: Nov. 2008, RvdT, TU_Delft: Zener current contribution added:
// Izteb > 0 for Vb2e1 < 0, hence the minus sign:
(Ib1 + Ib2 - Izteb) * Vb2e1 +
Ib1_s * Vb1e1 +
`ifdef SUBSTRATE
(Iex + Ib3) * Vb1c4 + XIex * Vbc3 +
Isub * (Vb1c4 - Vsc4) +
XIsub * (Vbc3 - Vsc3) +
Isf * Vsc1;
`else
(Iex + Ib3) * Vb1c4 + XIex * Vbc3;
`endif
`endif
// Charges
Qte = (1.0 - XCJE) * CJE_TM * Vte;
`min_logexp(Vje_s, Vb1e1, Vfe, a_VDE);
Qte_s = XCJE * CJE_TM * (VDE_T / (1.0 - PE) *
(1.0 - pow(1.0 - Vje_s * inv_VDE_T, 1.0 - PE)) +
`AJE * (Vb1e1 - Vje_s));
Qtc = XCJC * CJC_TM * Vtc;
Qb0 = TAUB_T * IK_TM;
Qbe_qs = 0.5 * Qb0 * n0 * q1Q;
Qbc_qs = 0.5 * Qb0 * nB * q1Q;
a_VDC = 0.1 * VDC_T;
`min_logexp(Vjcex, Vb1c4, Vfc, a_VDC);
Vtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - Vjcex / VDC_T, 1.0 - PC)) +
bjc * (Vb1c4 - Vjcex);
Qtex = CJC_TM * ((1.0 - XP_T) * Vtexv + XP_T * Vb1c4) *
(1.0 - XCJC) * (1.0 - XEXT);
`min_logexp(XVjcex, Vbc3, Vfc, a_VDC);
XVtexv = VDC_T / (1.0 - PC) * (1.0 - pow(1.0 - XVjcex / VDC_T, 1.0 - PC)) +
bjc * (Vbc3 - XVjcex);
XQtex = CJC_TM * ((1.0 - XP_T) * XVtexv + XP_T * Vbc3) *
(1.0 - XCJC) * XEXT;
`ifdef SUBSTRATE
a_VDS = 0.1 * VDS_T;
Vfs = VDS_T * (1.0 - pow(`AJS , -1.0 / PS));
`min_logexp(Vjs, Vsc1, Vfs, a_VDS);
Qts = CJS_TM * (VDS_T / (1.0 - PS) *
(1.0 - pow(1.0 - Vjs / VDS_T, 1.0 - PS)) + `AJS * (Vsc1 - Vjs));
`endif
Qe0 = TAUE_T * IK_TM * pow(IS_TM / IK_TM, 1.0 / MTAU);
`expLin(tmpExp,Vb2e1 / (MTAU * Vt))
Qe = Qe0 * (tmpExp - 1.0);
Qepi0 = 4.0 * TEPI_T * Vt / RCV_TM;
Qepi = 0.5 * Qepi0 * xi_w * (p0star + pW + 2.0);
Qex = TAUR_T * 0.5 * (Qb0 * nBex + Qepi0 * pWex) / (TAUB_T + TEPI_T);
XQex = 0.0;
if (EXMOD == 1) begin
Qex = Qex * (1.0 - XEXT);
Xg2 = 4.0 * eVbc3VDC;
XpWex = Xg2 / (1.0 + sqrt(1.0 + Xg2));
XQex = 0.5 * Fex * XEXT * TAUR_T *
(Qb0 * XnBex + Qepi0 * XpWex) / (TAUB_T + TEPI_T);
end
Qb1b2 = 0.0;
if (EXPHI == 1)
begin
dVteVje = pow(1.0 - Vje * inv_VDE_T, -PE) - `AJE;
Vb2e1Vfe = (Vb2e1 - Vfe) / a_VDE;
if (Vb2e1Vfe < 0.0)
dVjeVb2e1 = 1.0 / (1.0 + exp(Vb2e1Vfe));
else
dVjeVb2e1 = exp(- Vb2e1Vfe) / (1.0 + exp(- Vb2e1Vfe));
dVteVb2e1 = dVteVje * dVjeVb2e1 + `AJE;
dQteVb2e1 = (1.0 - XCJE) * CJE_TM * dVteVb2e1;
dn0Vb2e1 = If0 * eVb2e1 * VtINV * (0.5 / sqrt(1.0 + f1));
dQbeVb2e1 = 0.5 * Qb0 * q1Q * dn0Vb2e1;
dQeVb2e1 = (Qe + Qe0) / (MTAU * Vt);
Qb1b2 = 0.2 * Vb1b2 * (dQteVb2e1 + dQbeVb2e1 + dQeVb2e1);
Qbc = Qbe_qs * `one_third + Qbc_qs;
Qbe = 2.0 * Qbe_qs * `one_third ;
end
else
begin
Qbe = Qbe_qs;
Qbc = Qbc_qs;
end
// Add branch current contributions
// Static currents
I(c1, c2) <+ TYPE * Ic1c2;
I(c2, e1) <+ TYPE * In;
I(b1, e1) <+ TYPE * Ib1_s;
// begin RvdT, 28-10-2008, MXT504.8_alpha
// contribution tunnel current added
I(b2, e1) <+ TYPE * (Ib1 + Ib2 - Izteb);
`ifdef SUBSTRATE
I(b1, s) <+ TYPE * Isub;
I(b, s) <+ TYPE * XIsub;
I(s, c1) <+ TYPE * Isf;
`endif
I(b1, b2) <+ TYPE * Ib1b2;
I(b2, c2) <+ TYPE * (-1.0 * Iavl);
I(e, e1) <+ TYPE * Vee1 / RE_TM;
I(b, b1) <+ TYPE * Vbb1 / RBC_TM;
`ifdef SELFHEATING
// Electrical equivalent for the thermal network
I(dt) <+ V(dt) / RTH_Tamb_M;
I(dt) <+ ddt(CTH_M * V(dt));
I(dt) <+ -1.0 * power;
`endif
// Electrical equivalent for the correlated noise
I(noi, e1) <+ V(noi, e1);
cor_exp_1 = sqrt(1.0 + 2.0 * Gem) * V(noi,e1);
I(b2, e1) <+ cor_exp_1;
cor_exp_2 = (2.0 + 2.0 * Gem) / sqrt(1.0 + 2.0 * Gem) * V(noi, e1);
I(e1, c2) <+ cor_exp_2;
// Dynamic currents
I(b2, e1) <+ ddt(TYPE * (Qte + Qbe + Qe));
I(b1, e1) <+ ddt(TYPE * (Qte_s));
I(b2, c2) <+ ddt(TYPE * (Qtc + Qbc + Qepi));
`ifdef SUBSTRATE
I(s, c1) <+ ddt(TYPE * Qts);
`endif
I(b1, b2) <+ ddt(TYPE * Qb1b2);
I(b, e) <+ ddt(TYPE * CBEO_M * Vbe);
I(b, c) <+ ddt(TYPE * CBCO_M * Vbc);
end // Currents and charges
/* RvdT, Delft Univ. Tech. 03-12-2007.
Distribution of parasitic collector resistance.
This construct supports the case
RCBLI = 0.0 and or RCBLX = 0.0 .
It is up to the compiler to adjust the circuit topology
and perform a node-collapse in such cases. */
if (RCBLX > 0.0)
begin
I(b, c3) <+ TYPE * XIex;
I(c, c3) <+ TYPE * Vcc3 * GCCxx_TM ;
I(b, c3) <+ ddt(TYPE * (XQtex + XQex));
if (RCBLI > 0.0)
begin
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(c3, c4) <+ TYPE * Vc3c4 * GCCex_TM ;
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
end
else
begin
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
else
begin
V(c3, c4) <+ 0 ;
if (RCBLI > 0.0)
begin
I(b, c4) <+ TYPE * XIex;
I(c, c4) <+ TYPE * Vcc3 * GCCxx_TM ;
I(c4, c1) <+ TYPE * Vc4c1 * GCCin_TM;
I(b1, c4) <+ TYPE * (Ib3 + Iex);
I(b1, c4) <+ ddt(TYPE * (Qtex + Qex));
I(b, c4) <+ ddt(TYPE * (XQtex + XQex));
end
else
begin
I(b, c1) <+ TYPE * XIex;
I(c, c1) <+ TYPE * Vcc3 * GCCxx_TM ;
V(c4, c1) <+ 0.0 ;
I(b1, c1) <+ TYPE * (Ib3 + Iex);
I(b1, c1) <+ ddt(TYPE * (Qtex + Qex));
I(b, c1) <+ ddt(TYPE * (XQtex + XQex));
I(c3, c1) <+ TYPE * Vc3c4 * GCCex_TM ;
end
end
// Noise sources
`NOISE begin
// Thermal noise
common = 4.0 * `KB * Tk;
powerREC = common / RE_TM; // Emitter resistance
powerRBC = common / RBC_TM; // Base resistance
// RvdT, 03-12-2007: distributed collector resistance
powerRCCxx = common * GCCxx_TM; // Collector resistance
powerRCCex = common * GCCex_TM; // Collector resistance
powerRCCin = common * GCCin_TM; // Collector resistance
powerRBV = common / Rb2 * (4.0 * eVb1b2 + 5.0) * `one_third ; // Variable base resistance
// Collector current shot noise
powerCCS = 2.0 * `QQ * (If + Ir) / qBI;
// Forward base current shot noise and 1/f noise
// 504.8, Nov. 2008, RvdT, TU-Delft: added Zener current to shot noise
powerFBCS = 2.0 * `QQ * (abs(Ib1) + abs(Ib2) + abs(Izteb));
powerFBC1fB1 = (1.0 - XIBI) * pow((abs(Ib1) / (1 - XIBI)), AF) * KF_M;
exponentFBC1fB2 = (2.0 * (MLF - 1.0)) + (AF * (2.0 - MLF));
powerFBC1fB2 = KFN_M * pow(abs(Ib2), exponentFBC1fB2);
// Emitter-base sidewall current shot and 1/f noise
powerEBSCS = 2.0 * `QQ * abs(Ib1_s);
if (XIBI == 0)
powerEBSC1f = 0.0;
else
powerEBSC1f = KF_M * XIBI * pow((abs(Ib1_s / XIBI)), AF);
// Reverse base current shot noise and 1/f noise
powerRBCS = 2.0 * `QQ * abs(Ib3);
powerRBC1f = KF_M * pow(abs(Ib3), AF);
// Extrinsic current shot noise and 1/f noise
powerExCS = 2.0 * `QQ * abs(Iex);
powerExC1f = KF_M * (1 - (EXMOD * XEXT)) *
pow((abs(Iex) / (1 - (EXMOD * XEXT))), AF);
powerExCSMOD = 2.0 * `QQ * abs(XIex) * EXMOD;
if (XEXT == 0.0)
powerExC1fMOD = 0.0;
else
powerExC1fMOD = KF_M * EXMOD * XEXT * pow((abs(XIex) / XEXT), AF);
`ifdef SUBSTRATE
// Substrate current shot noise (between nodes B1 and S, resp. B and S)
powerSubsCS_B1S = 2.0 * `QQ * abs(Isub);
powerSubsCS_BS = 2.0 * `QQ * abs(XIsub);
`endif
// Noise due to the avalanche
// twoqIavl = KAVL * 2.0 * `QQ * Iavl;
twoqIavl = KAVL*Gem*powerCCS;
powerCCS_A = powerCCS + twoqIavl * (3.0 + 2.0 * Gem
- (2.0 + 2.0 * Gem)*(2.0 + 2.0 * Gem)/(1.0 + 2.0 * Gem) );
// Add noise sources
I(e, e1) <+ white_noise(powerREC); // "emitter resistance"
I(b, b1) <+ white_noise(powerRBC); // "base resistance"
I(b1, b2) <+ white_noise(powerRBV); // "variable baseresistance"
I(noi, e1) <+ white_noise(twoqIavl); // "avalanche"
I(c2, e1) <+ white_noise(powerCCS_A); // "col_emi_shot"
I(b2, e1) <+ white_noise(powerFBCS); // "bas_emi_forw"
I(b2, e1) <+ flicker_noise(powerFBC1fB1, 1); // "bas_emi_forw"
I(b2, e1) <+ flicker_noise(powerFBC1fB2, 1); // "bas_emi_forw"
I(e1, b1) <+ white_noise(powerEBSCS); // "emi_bas_side"
I(e1, b1) <+ flicker_noise(powerEBSC1f, 1); // "emi_bas_side"
I(b1, c4) <+ white_noise(powerRBCS); // "bas_col_reve"
I(b1, c4) <+ flicker_noise(powerRBC1f, 1); // "bas_col_reve"
I(b1, c4) <+ white_noise(powerExCS); // "Ext_bas_col"
I(b1, c4) <+ flicker_noise(powerExC1f, 1); // "Ext_bas_col"
I(b, c3) <+ white_noise(powerExCSMOD); // "Ext_bas_col"
I(b, c3) <+ flicker_noise(powerExC1fMOD, 1); // "Ext_bas_col"
`ifdef SUBSTRATE
I(b1, s) <+ white_noise(powerSubsCS_B1S); // "bas_sub_current"
I(b, s) <+ white_noise(powerSubsCS_BS); // "bas_sub_current"
`endif
/* RvdT, Delft University of Technology 03-12-2007,
Noise voltage associated with distributed parasitic collector.
In case of vanishing resistance corresponding node
is not addressed: */
// RvdT, 31-01-2007: distributed collector resistance
if (RCBLX > 0.0)
begin
if (RCBLI > 0.0)
begin /* all branches exist */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c4) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* only Rcblx exists */
I(c, c3) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c3, c1) <+ white_noise(powerRCCex); // "extrinsic collector BL resistance"
end
end
else
begin
if (RCBLI > 0.0)
begin /* only Rcbli exists */
I(c, c4) <+ white_noise(powerRCCxx); // "collector plug resistance"
I(c4, c1) <+ white_noise(powerRCCin); // "intrinsic collector BL resistance"
end
else
begin /* neither Rcblx nor Rcbli exists */
I(c, c1) <+ white_noise(powerRCCxx); // "collector plug resistance"
end
end
end // Noise sources

View File

@ -1,84 +0,0 @@
// Front definitions
`include "discipline.h"
// Numerical, physical and model constants
`define TEN_M40 1.0e-40
`define TEN_M07 1.0e-7
`define C2K 273.15
`define KB 1.3806226e-23
`define QQ 1.6021918e-19
`define KBdivQQ 8.61708691805812512584e-5
`define one_third 0.33333333333333333333
`define one_sixth 0.16666666666666666667
`define VDLOW 0.05
`define AJE 3.0
`define AJC 2.0
`define AJS 2.0
`define VEXLIM 200.0
`define PI 3.1415926
// Desriptions and units
`ifdef __VAMS_COMPACT_MODELING__
`define OPP(nam,uni,des) (* desc="des", units="uni" *) real nam;
`define PAR(des,uni) (* desc="des", units="uni" *) parameter real
`define PAI(des,uni) (* desc="des", units="uni" *) parameter integer
`else
`define OPP(nam,uni,des)
`define PAR(des,uni) parameter real
`define PAI(des,uni) parameter integer
`endif
// ADMS specific definitions
`ifdef insideADMS
`define MODEL @(initial_model)
`define INSTANCE @(initial_instance)
`define NOISE @(noise)
`define ATTR(txt) (*txt*)
`else
`define MODEL
`define INSTANCE
`define NOISE
`define ATTR(txt)
`endif
// Smooth limitting functions
`define max_hyp0(result, x, epsilon)\
eps2 = epsilon * epsilon;\
x2 = x * x;\
if (x < 0.0)\
result = 0.5 * eps2 / (sqrt(x2 + eps2) - x);\
else\
result = 0.5 * (sqrt(x2 + eps2) + x);\
result=result
`define min_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0)\
result = x - a * ln(1.0 + exp(dxa));\
else\
result = x0 - a * ln(1.0 + exp(-dxa));\
result=result
`define max_logexp(result, x, x0, a)\
dxa = (x - x0) / (a);\
if (x < x0)\
result = x0 + a * ln(1.0 + exp(dxa));\
else\
result = x + a * ln(1.0 + exp(-dxa));\
result=result
`define expLin(result, x)\
if (x < `VEXLIM)\
result = exp(x);\
else begin\
expl = exp(`VEXLIM);\
result = expl * (1.0 + (x - `VEXLIM));\
end
`define linLog(result, x, vlim)\
if (x < vlim)\
result = x;\
else\
result = vlim + ln(1.0 + (x - vlim));\
result=result

View File

@ -1,74 +0,0 @@
// Initialze model constants
// Impact ionization constants (NPN - PNP)
if (TYPE == 1) begin
An = 7.03e7;
Bn = 1.23e8;
end else begin
An = 1.58e8;
Bn = 2.04e8;
end
Xext1 = 1.0 - XEXT;
// Temperature independent MULT scaling
`ifdef SELFHEATING
CTH_M = CTH * MULT;
`endif
CBEO_M = CBEO * MULT;
CBCO_M = CBCO * MULT;
invMULT = 1.0 / MULT;
SCRCV_M = SCRCV * invMULT;
KF_M = KF * pow(MULT, 1.0 - AF);
KFN_M = KFN * pow(MULT, 1.0 - (2.0 * (MLF - 1.0) + AF * (2.0 - MLF)));
// begin: RvdT, November 2008 ; Zener tunneling current model
pow2_2mPE = pow(2.0, 2.0 - PE);
pow2_PEm2 = 1.0 / pow2_2mPE;
// Reference Temperature expressed in Kelvin:
Trk = TREF + `C2K;
// begin: RvdT, November 2008 ; Zener tunneling current model
//
// Comment added March 2009: this assumes VGZEBOK as a model parameter.
//
// Bandgap for Zener tunnel current model at reference temperature in eV:
// VGZEB_Tr = VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB) ;
// `max_logexp(VGZEB_Tr, VGZEBOK - AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1) ;
// end: RvdT, November 2008
// begin: RvdT March 2009:
// to decrease parameter interdependency,
// use VGZEB as a parameter, instead of VGZEBOK:
// VGZEB : bandgap for Zener tunneling at T = Tref,
// VGZEBOK : bandgap for Zener tunneling at T = 0 K.
// `max_logexp(VGZEBOK, VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB), 0.05, 0.1);
//dw can't expand the macro `max_logexp here - using the code
_x = VGZEB + AVGEB*Trk*Trk / (Trk + TVGEB);
_x0 = 0.05;
_a = 0.1;
_dxa = (_x - _x0) / (_a);
if (_x < _x0)
VGZEBOK = _x0 + _a * ln(1.0 + exp(_dxa));
else
VGZEBOK = _x + _a * ln(1.0 + exp(-_dxa));
VGZEB_Tr = VGZEB;
// end: RvdT March 2009: use VGZEB as a parameter, instead of VGZEBOK:
inv_VGZEB_Tr = 1.0 / VGZEB_Tr;
inv_VDE = 1.0 / VDE;
// end: RvdT, November 2008 ; Zener tunneling current model

View File

@ -1,231 +0,0 @@
// Evaluate the operating point (outout) variables
begin
`ifdef __VAMS_COMPACT_MODELING__
// The external currents and the current gain
OP_ic = I(<c>); // External DC collector current
OP_ib = I(<b>); // External DC base Current
OP_betadc = OP_ic / OP_ib; // External DC Current gain
// begin added in MXT 504.9:
OP_ie = I(<e>); // External DC emitter current
OP_vbe = V(b, e); // External base-emitter bias
OP_vce = V(c, e); // External collector-emitter bias
OP_vbc = V(b, c); // External base-collector bias
`ifdef SUBSTRATE
OP_is = I(<s>); // External DC emitter current
OP_vse = V(s, e); // External substrate-emitter bias
OP_vbs = V(b, s); // External base-substrate bias
OP_vsc = V(s, c); // External substrate-collector bias
`endif
// end added in MXT 504.9:
// The internal voltage differences
OP_vb2e1 = Vb2e1; // Internal base-emiter bias
OP_vb2c2 = Vb2c2; // Internal base-emiter bias
OP_vb2c1 = Vb2c1; // Internal base-collector bias including epilayer
OP_vb1c1 = Vb1b2 + Vb2c1; // External base-collector bias without contact resistances
OP_vc4c1 = Vc4c1; // Bias over intrinsic buried layer
OP_vc3c4 = Vc3c4; // Bias over extrinsic buried layer
OP_ve1e = - Vee1; // Bias over emiter resistance
// The branch currents
OP_in = In; // Main current
OP_ic1c2 = Ic1c2; // Epilayer current
OP_ib1b2 = Ib1b2; // Pinched-base current
OP_ib1 = Ib1; // Ideal forward base current
OP_sib1 = Ib1_s; // Ideal side-wall base current
//
// 504.8, RvdT, TU-Delft April. 2009:
//
OP_izteb = Izteb ; // Zener tunneling current
//
OP_ib2 = Ib2; // Non-ideal forward base current
OP_ib3 = Ib3; // Non-ideal reverse base current
OP_iavl = Iavl; // Avalanche current
OP_iex = Iex; // Extrinsic reverse base current
OP_xiex = XIex; // Extrinsic reverse base current
`ifdef SUBSTRATE
OP_isub = Isub; // Substrate current
OP_xisub = XIsub; // Substrate current
OP_isf = Isf; // Substrate-collector current
`endif
OP_ire = - Vee1 / RE_TM; // Current through emiter resistance
OP_irbc = Vbb1 / RBC_TM; // Current through constant base resistance
OP_ircc = Vcc3 * GCCxx_TM; // Current through collector contact resistance
OP_ircblx = Vc3c4 * GCCex_TM; // Current through extrinsic buried layer resistance
OP_ircbli = Vc4c1 * GCCin_TM; // Current through extrinsic buried layer resistance
// The branch charges
OP_qe = Qe; // Emitter charge or emitter neutral charge
OP_qte = Qte; // Base-emiter depletion charge
OP_sqte = Qte_s; // Sidewall base-emiter depletion charge
OP_qbe = Qbe; // Base-emiter diffusion charge
OP_qbc = Qbc; // Base-collector diffusion charge
OP_qtc = Qtc; // Base-colector depletion charge
OP_qepi = Qepi; // Epilayer diffusion charge
OP_qb1b2 = Qb1b2; // AC current crowding charge
OP_qtex = Qtex; // Extrinsic base-collector depletion charge
OP_xqtex = XQtex; // Extrinsic base-collector depletion charge
OP_qex = Qex; // Extrinsic base-collector diffusion charge
OP_xqex = XQex; // Extrinsic base-collector diffusion charge
`ifdef SUBSTRATE
OP_qts = Qts; // Collector substrate depletion charge
`endif
// Small signal equivalent circuit conductances and resistances
OP_gx = - ddx(In, V(e1)); // Forward transconductance
OP_gy = - ddx(In, V(c2)); // Reverse transconductance
OP_gz = - ddx(In, V(c1)); // Reverse transconductance
OP_sgpi = - ddx(Ib1_s, V(e))
- ddx(Ib1_s, V(e1)); // Conductance sidewal b-e junction
OP_gpix = - ddx(Ib1+Ib2, V(e1)); // Conductance floor b-e junction
OP_gpiy = - ddx(Ib1, V(c2)); // Early effect on recombination base current
OP_gpiz = - ddx(Ib1, V(c1)); // Early effect on recombination base current
OP_gmux = ddx( Iavl, V(e1)); // Early effect on avalanche current limitting
OP_gmuy = ddx( Iavl, V(c2)); // Conductance of avalanche current
OP_gmuz = - ddx(- Iavl, V(c1)); // Conductance of avalanche current
// Conductance extrinsic b-c current :
OP_gmuex = ddx(Iex+Ib3, V(e))
+ ddx(Iex+Ib3, V(b1))
+ ddx(Iex+Ib3, V(b2))
+ ddx(Iex+Ib3, V(e1))
+ ddx(Iex+Ib3, V(c2));
OP_xgmuex = ddx(XIex, V(b)) ; // Conductance extrinsic b-c current
OP_grcvy = - ddx(Ic1c2, V(c2)); // Conductance of epilayer current
OP_grcvz = - ddx(Ic1c2, V(c1)); // Conductance of epilayer current
OP_rbv = 1.0 / (- ddx(Ib1b2, V(b2)) - ddx(Ib1b2, V(c2))); // Base resistance
OP_grbvx = - ddx(Ib1b2, V(e)) - ddx(Ib1b2, V(e1)); // Early effect on base resistance
OP_grbvy = - ddx(Ib1b2, V(c2)); // Early effect on base resistance
OP_grbvz = - ddx(Ib1b2, V(c1)); // Early effect on base resistance
OP_re = RE_TM; // Emiter resistance
OP_rbc = RBC_TM; // Constant base resistance
OP_rcc = RCCxx_TM; // Collector Contact resistance
OP_rcblx = RCCex_TM; // Extrinsic buried layer resistance
OP_rcbli = RCCin_TM; // Extrinsic buried layer resistance
`ifdef SUBSTRATE
OP_gs = ddx(Isub, V(b)) + ddx(Isub, V(b1)); // Conductance parasitic PNP transitor
OP_xgs = ddx(XIsub, V(b)) ; // Conductance parasitic PNP transistor
OP_gsf = ddx(Isf, V(s)) ; // Conductance substrate-collector current
`endif
// Small signal equivalent circuit capacitances
OP_scbe = - ddx(Qte_s, V(e)) - ddx(Qte_s, V(e1)); // Capacitance sidewall b-e junction
OP_cbex = - ddx(Qte + Qbe + Qe, V(e1)) ; // Capacitance floor b-e junction
OP_cbey = - ddx(Qbe, V(c2)); // Early effect on b-e diffusion junction
OP_cbez = - ddx(Qbe, V(c1)); // Early effect on b-e diffusion junction
OP_cbcx = - ddx(Qbc, V(e)) - ddx(Qbc, V(e1)); // Early effect on b-c diffusion junction
OP_cbcy = - ddx(Qtc + Qbc + Qepi, V(c2)); // Capacitance floor b-c junction
OP_cbcz = - ddx(Qtc + Qbc + Qepi, V(c1)); // Capacitance floor b-c junction
// Capacitance extrinsic b-c junction :
OP_cbcex = ddx(Qtex + Qex,V(e))
+ ddx(Qtex + Qex,V(b1 ))
+ ddx(Qtex + Qex,V(b2))
+ ddx(Qtex + Qex,V(e1))
+ ddx(Qtex + Qex,V(c2)) ;
// Capacitance extrinsic b-c junction :
OP_xcbcex = ddx(XQtex + XQex, V(b)) ;
OP_cb1b2 = - ddx(Qb1b2, V(b2)) - ddx(Qb1b2, V(c2)); // Capacitance AC current crowding
OP_cb1b2x = - ddx(Qb1b2, V(e)) - ddx(Qb1b2, V(e1)); // Cross-capacitance AC current crowding
OP_cb1b2y = - ddx(Qb1b2, V(c2)); // Cross-capacitance AC current crowding
OP_cb1b2z = - ddx(Qb1b2, V(c1)) ; // Cross-capacitance AC current crowding
`ifdef SUBSTRATE
OP_cts = ddx(Qts, V(s)) ; // Capacitance s-c junction
`endif
// Approximate small signal equivalent circuit
dydx = (OP_gx - OP_gmux) / (OP_grcvy + OP_gmuy - OP_gy);
dydz = (OP_gz - OP_grcvz - OP_gmuz) / (OP_grcvy + OP_gmuy - OP_gy);
gpi = OP_sgpi + OP_gpix + OP_gmux + OP_gpiz + OP_gmuz +
(OP_gpiy + OP_gmuy) * (dydx + dydz);
OP_gm = (OP_grcvy * (OP_gx - OP_gmux + // Transconductance
OP_gz - OP_gmuz) - OP_grcvz *
(OP_gy - OP_gmuy)) / (OP_grcvy + OP_gmuy - OP_gy);
OP_beta = OP_gm / gpi; // Current amplification
OP_gout = ((OP_gy - OP_gmuy) * OP_grcvz - // Output conductance
(OP_gz - OP_gmuz) * OP_grcvy) /
(OP_grcvy + OP_gmuy - OP_gy);
OP_gmu = OP_gpiz + OP_gmuz + (OP_gpiy + OP_gmuy) * dydz + // Feedback transconductance
OP_gmuex + OP_xgmuex;
OP_rb = RBC_TM + OP_rbv; // Base resistance
OP_rc = OP_rcc + OP_rcblx + OP_rcbli; // Collector resistance
OP_cbe = OP_cbex + OP_scbe + OP_cbcx + // Base-emitter capacitance
(OP_cbey + OP_cbcy) * dydx + CBEO_M;
OP_cbc = (OP_cbey + OP_cbcy) * dydz + OP_cbcz + // Base-collector capacitance
OP_cbcex + OP_xcbcex + CBCO_M;
// Quantities to describe internal state of the model
gammax = (OP_gpix + OP_gmux - OP_grbvx) * OP_rbv;
gammay = (OP_gpiy + OP_gmuy - OP_grbvy) * OP_rbv;
gammaz = (OP_gpiz + OP_gmuz - OP_grbvz) * OP_rbv;
gbfx = OP_gpix + OP_sgpi * (1.0 + gammax);
gbfy = OP_gpiy + OP_sgpi * gammay;
gbfz = OP_gpiz + OP_sgpi * gammaz;
// RvdT March 2008:
alpha_ft = (1.0 + (OP_grcvy * dydx * OP_rc) +
(OP_gx + gbfx + (OP_gy + gbfy) * dydx) * RE_TM)/
(1.0 - (OP_grcvz + OP_grcvy * dydz) * OP_rc -
(OP_gz + gbfz + (OP_gy + gbfy) * dydz) * RE_TM);
rx = pow((OP_grcvy * dydx + alpha_ft * (OP_grcvz + OP_grcvy * dydz)), -1);
rz = alpha_ft * rx;
ry = (1.0 - OP_grcvz * rz) / OP_grcvy;
rb1b2 = gammax * rx + gammay * ry + gammaz * rz;
rex = rz + rb1b2 - OP_rcbli;
xrex = rex + RBC_TM * ((gbfx + OP_gmux) * rx + (gbfy + OP_gmuy) * ry +
(gbfz + OP_gmuz) * rz) - OP_rcbli - OP_rcblx;
taut = OP_scbe * (rx + rb1b2) + (OP_cbex + OP_cbcx) * rx + (OP_cbey + OP_cbcy) *
ry + (OP_cbez + OP_cbcz) * rz + OP_cbcex * rex + OP_xcbcex * xrex +
(CBEO_M + CBCO_M) * (xrex - RCCxx_TM);
OP_ft = 1.0 / (2.0 * `PI * taut); // Good approximation for cut-off frequency
OP_iqs = Iqs; // Current at onset of quasi-saturation
OP_xiwepi = xi_w; // Thickness of injection layer
OP_vb2c2star = Vb2c2star; // Physical value of internal base-collector bias
//self-heating
`ifdef SELFHEATING
OP_pdiss = power; // Dissipation
`endif
OP_tk = Tk; // Actual temperature
`endif
end

View File

@ -1,152 +0,0 @@
//
// Operation point (output) variables
//
// The external currents and current gain
`OPP(OP_ic, A, External DC collector current)
`OPP(OP_ib, A, External DC base current)
`OPP(OP_betadc, , External DC current gain Ic/Ib)
// begin added in MXT 504.9:
`OPP(OP_ie, A, External DC emitter current)
// The external biases
`OPP(OP_vbe, V, External base-emitter bias)
`OPP(OP_vce, V, External collector-emitter bias)
`OPP(OP_vbc, V, External base-collector bias)
`ifdef SUBSTRATE
`OPP(OP_is, A, External DC substrate current)
`OPP(OP_vse, V, External substrate-emitter bias)
`OPP(OP_vbs, V, External base-substrate bias)
`OPP(OP_vsc, V, External substrate-collector bias)
`endif
// end added in MXT 504.9
// The internal biases
`OPP(OP_vb2e1, V, Internal base-emitter bias)
`OPP(OP_vb2c2, V, Internal base-collector bias)
`OPP(OP_vb2c1, V, Internal base-collector bias including epilayer)
`OPP(OP_vb1c1, V, External base-collector bias without contact resistances)
`OPP(OP_vc4c1, V, Bias over intrinsic buried layer)
`OPP(OP_vc3c4, V, Bias over extrinsic buried layer)
`OPP(OP_ve1e, V, Bias over emitter resistance)
// The actual currents
`OPP(OP_in, A, Main current)
`OPP(OP_ic1c2, A, Epilayer current)
`OPP(OP_ib1b2, A, Pinched-base current)
`OPP(OP_ib1, A, Ideal forward base current)
`OPP(OP_sib1, A, Ideal side-wall base current)
//
// 504.8, RvdT, TU-Delft April. 2009, Zener tunneling current:
//
`OPP(OP_izteb, A, Zener tunneling current in the emitter base junction)
//
`OPP(OP_ib2, A, Non-ideal forward base current)
`OPP(OP_ib3, A, Non-ideal reverse base current)
`OPP(OP_iavl, A, Avalanche current)
`OPP(OP_iex, A, Extrinsic reverse base current)
`OPP(OP_xiex, A, Extrinsic reverse base current)
`ifdef SUBSTRATE
`OPP(OP_isub, A, Substrate current)
`OPP(OP_xisub, A, Substrate current)
`OPP(OP_isf, A, Substrate failure current)
`endif
`OPP(OP_ire, A, Current through emitter resistance)
`OPP(OP_irbc, A, Current through constant base resistance)
`OPP(OP_ircblx, A, Current through extrinsic buried layer resistance)
`OPP(OP_ircbli, A, Current through intrinsic buried layer resistance)
`OPP(OP_ircc, A, Current through collector contact resistance)
//The actual charges
`OPP(OP_qe, C, Emitter charge or emitter neutral charge)
`OPP(OP_qte, C, Base-emitter depletion charge)
`OPP(OP_sqte, C, Sidewall base-emitter depletion charge)
`OPP(OP_qbe, C, Base-emitter diffusion charge)
`OPP(OP_qbc, C, Base_collector diffusion charge)
`OPP(OP_qtc, C, Base-collector depletion charge)
`OPP(OP_qepi, C, Epilayer diffusion charge)
`OPP(OP_qb1b2, C, AC current crowding charge)
`OPP(OP_qtex, C, Extrinsic base-collector depletion charge)
`OPP(OP_xqtex, C, Extrinsic base-collector depletion charge)
`OPP(OP_qex, C, Extrinsic base-collector diffusion charge)
`OPP(OP_xqex, C, Extrinsic base-collector diffusion charge)
`ifdef SUBSTRATE
`OPP(OP_qts, C, Collector-substrate depletion charge)
`endif
//Small signal equivalent circuit conductances and resistances
`OPP(OP_gx, S, Forward transconductance)
`OPP(OP_gy, S, Reverse transconductance)
`OPP(OP_gz, S, Reverse transconductance)
`OPP(OP_sgpi, S, Conductance sidewall b-e junction)
`OPP(OP_gpix, S, Conductance floor b-e junction)
`OPP(OP_gpiy, S, Early effect on recombination base current)
`OPP(OP_gpiz, S, Early effect on recombination base current)
`OPP(OP_gmux, S, Early effect on avalanche current limiting)
`OPP(OP_gmuy, S, Conductance of avalanche current)
`OPP(OP_gmuz, S, Conductance of avalanche current)
`OPP(OP_gmuex, S, Conductance of extrinsic b-c junction)
`OPP(OP_xgmuex, S, Conductance of extrinsic b-c junction)
`OPP(OP_grcvy, S, Conductance of epilayer current)
`OPP(OP_grcvz, S, Conductance of epilayer current)
`OPP(OP_rbv, Ohm, Base resistance)
`OPP(OP_grbvx, S, Early effect on base resistance)
`OPP(OP_grbvy, S, Early effect on base resistance)
`OPP(OP_grbvz, S, Early effect on base resistance)
`OPP(OP_re, Ohm, Emitter resistance)
`OPP(OP_rbc, Ohm, Constant base resistance)
`OPP(OP_rcc, Ohm, Collector contact resistance)
`OPP(OP_rcblx, Ohm, Extrinsic buried layer resistance)
`OPP(OP_rcbli, Ohm, Intrinsic buried layer resistance)
`ifdef SUBSTRATE
`OPP(OP_gs, S, Conductance parasistic PNP transistor)
`OPP(OP_xgs, S, Conductance parasistic PNP transistor)
`OPP(OP_gsf, S, Conductance substrate failure current)
`endif
//Small signal equivalent circuit capacitances
`OPP(OP_scbe, F, Capacitance sidewall b-e junction)
`OPP(OP_cbex, F, Capacitance floor b-e junction)
`OPP(OP_cbey, F, Early effect on b-e diffusion charge)
`OPP(OP_cbez, F, Early effect on b-e diffusion charge)
`OPP(OP_cbcx, F, Early effect on b-c diffusion charge)
`OPP(OP_cbcy, F, Capacitance floor b-c junction)
`OPP(OP_cbcz, F, Capacitance floor b-c junction)
`OPP(OP_cbcex, F, Capacitance extrinsic b-c junction)
`OPP(OP_xcbcex, F, Capacitance extrinsic b-c junction)
`OPP(OP_cb1b2, F, Capacitance AC current crowding)
`OPP(OP_cb1b2x, F, Cross-capacitance AC current crowding)
`OPP(OP_cb1b2y, F, Cross-capacitance AC current crowding)
`OPP(OP_cb1b2z, F, Cross-capacitance AC current crowding)
`ifdef SUBSTRATE
`OPP(OP_cts, F, Capacitance s-c junction)
`endif
//Approximate small signal equivalent circuit
`OPP(OP_gm, S,transconductance)
`OPP(OP_beta, , Current amplification)
`OPP(OP_gout, S, Output conductance)
`OPP(OP_gmu, S, Feedback transconductance)
`OPP(OP_rb, Ohm, Base resistance)
`OPP(OP_rc, Ohm, Collector resistance)
`OPP(OP_cbe, C, Base-emitter capacitance)
`OPP(OP_cbc, C, Base-collector capacitance)
//quantities to describe internal state of the model
`OPP(OP_ft, , Good approximation for cut-off frequency)
`OPP(OP_iqs, A, Current at onset of quasi-saturation)
`OPP(OP_xiwepi, m, Thickness of injection layer)
`OPP(OP_vb2c2star, V, Physical value of internal base-collector bias)
//self-heating
`ifdef SELFHEATING
`OPP(OP_pdiss, W, Dissipation)
`endif
`OPP(OP_tk, K, Actual temperature)
//help variables
real dydx, dydz, gpi;
real gammax, gammay, gammaz, gbfx, gbfy, gbfz, alpha_ft;
real rx, ry, rz, rb1b2, rex, xrex, taut;

View File

@ -1,209 +0,0 @@
// Mextram parameters
parameter integer LEVEL = 504 from [504:505)
`ATTR(info="Model level");
parameter real TREF = 25.0 from [-273.0:inf)
`ATTR(info="Reference temperature");
parameter real DTA = 0.0
`ATTR(info="Difference between the local and global ambient temperatures");
parameter integer EXMOD = 1 from [0:1]
`ATTR(info="Flag for extended modeling of the reverse current gain");
parameter integer EXPHI = 1 from [0:1]
`ATTR(info="Flag for the distributed high-frequency effects in transient");
parameter integer EXAVL = 0 from [0:1]
`ATTR(info="Flag for extended modeling of avalanche currents");
parameter real IS = 22.0a from (0.0:inf)
`ATTR(info="Collector-emitter saturation current");
parameter real IK = 0.1 from [1.0p:inf)
`ATTR(info="Collector-emitter high injection knee current");
parameter real VER = 2.5 from [0.01:inf)
`ATTR(info="Reverse Early voltage");
parameter real VEF = 44.0 from [0.01:inf)
`ATTR(info="Forward Early voltage");
parameter real BF = 215.0 from [0.1m:inf)
`ATTR(info="Ideal forward current gain");
parameter real IBF = 2.7f from [0.0:inf)
`ATTR(info="Saturation current of the non-ideal forward base current");
parameter real MLF = 2.0 from [0.1:inf)
`ATTR(info="Non-ideality factor of the non-ideal forward base current");
parameter real XIBI = 0.0 from [0.0:1.0]
`ATTR(info="Part of ideal base current that belongs to the sidewall");
// begin: RvdT, November 2008, BE tunneling current parameters:
parameter real IZEB = 0.0 from [0.0:inf)
`ATTR(info="Pre-factor of emitter-base Zener tunneling current");
parameter real NZEB = 22.0 from [0.0:inf)
`ATTR(info="Coefficient of emitter-base Zener tunneling current");
// end: RvdT, November 2008, EB tunneling current parameters:
parameter real BRI = 7.0 from [1.0e-4:inf)
`ATTR(info="Ideal reverse current gain");
parameter real IBR = 1.0f from [0.0:inf)
`ATTR(info="Saturation current of the non-ideal reverse base current");
parameter real VLR = 0.2
`ATTR(info="Cross-over voltage of the non-ideal reverse base current");
parameter real XEXT = 0.63 from [0.0:1.0]
`ATTR(info="Part of currents and charges that belong to extrinsic region");
parameter real WAVL = 1.1u from [1.0n:inf)
`ATTR(info="Epilayer thickness used in weak-avalanche model");
parameter real VAVL = 3.0 from [0.01:inf)
`ATTR(info="Voltage determining curvature of avalanche current");
parameter real SFH = 0.3 from [0.0:inf)
`ATTR(info="Current spreading factor of avalanche model when EXAVL=1");
// RvdT, 22-02-2008: for MXT 504.7
// increased lower clipping values RE, RBC, RBV, RCC, RCV, SCRCV
// from 1u to 1m:
parameter real RE = 5.0 from [1.0m:inf)
`ATTR(info="Emitter resistance");
parameter real RBC = 23.0 from [1.0m:inf)
`ATTR(info="Constant part of the base resistance");
parameter real RBV = 18.0 from [1.0m:inf)
`ATTR(info="Zero-bias value of the variable part of the base resistance");
parameter real RCC = 12.0 from [1.0m:inf)
`ATTR(info="Constant part of the collector resistance");
parameter real RCV = 150.0 from [1.0m:inf)
`ATTR(info="Resistance of the un-modulated epilayer");
parameter real SCRCV = 1250.0 from [1.0m:inf)
`ATTR(info="Space charge resistance of the epilayer");
parameter real IHC = 4.0m from [1.0p:inf)
`ATTR(info="Critical current for velocity saturation in the epilayer");
parameter real AXI = 0.3 from [0.02:inf)
`ATTR(info="Smoothness parameter for the onset of quasi-saturation");
parameter real CJE = 73.0f from [0.0:inf)
`ATTR(info="Zero-bias emitter-base depletion capacitance");
parameter real VDE = 0.95 from [0.05:inf)
`ATTR(info="Emitter-base diffusion voltage");
parameter real PE = 0.4 from [0.01:0.99)
`ATTR(info="Emitter-base grading coefficient");
parameter real XCJE = 0.4 from [0.0:1.0]
`ATTR(info="Sidewall fraction of the emitter-base depletion capacitance");
parameter real CBEO = 0.0 from [0.0:inf)
`ATTR(info="Emitter-base overlap capacitance");
parameter real CJC = 78.0f from [0.0:inf)
`ATTR(info="Zero-bias collector-base depletion capacitance");
parameter real VDC = 0.68 from [0.05:inf)
`ATTR(info="Collector-base diffusion voltage");
parameter real PC = 0.5 from [0.01:0.99)
`ATTR(info="Collector-base grading coefficient");
parameter real XP = 0.35 from [0.0:0.99)
`ATTR(info="Constant part of Cjc");
parameter real MC = 0.5 from [0.0:1.0)
`ATTR(info="Coefficient for current modulation of CB depletion capacitance");
parameter real XCJC = 32.0m from [0.0:1.0]
`ATTR(info="Fraction of CB depletion capacitance under the emitter");
// RvdT, 30-11-2007: introduced RCBLX and RCBLI:
parameter real RCBLX = 0.0 from [0.0:inf)
`ATTR(info="Resistance Collector Buried Layer eXtrinsic");
parameter real RCBLI = 0.0 from [0.0:inf)
`ATTR(info="Resistance Collector Buried Layer Intrinsic");
parameter real CBCO = 0.0 from [0.0:inf)
`ATTR(info="Collector-base overlap capacitance");
parameter real MTAU = 1.0 from [0.1:inf)
`ATTR(info="Non-ideality factor of the emitter stored charge");
parameter real TAUE = 2.0p from [0.0:inf)
`ATTR(info="Minimum transit time of stored emitter charge");
parameter real TAUB = 4.2p from (0.0:inf)
`ATTR(info="Transit time of stored base sharge");
parameter real TEPI = 41.0p from [0.0:inf)
`ATTR(info="Transit time of stored epilayer charge");
parameter real TAUR = 520.0p from [0.0:inf)
`ATTR(info="Transit time of reverse extrinsic stored base charge");
parameter real DEG = 0.0
`ATTR(info="Bandgap difference over the base");
parameter real XREC = 0.0 from [0.0:inf)
`ATTR(info="Pre-factor of the recombination part of Ib1");
parameter real AQBO = 0.3
`ATTR(info="Temperature coefficient of the zero-bias base charge");
parameter real AE = 0.0
`ATTR(info="Temperature coefficient of the resistivity of the emitter");
parameter real AB = 1.0
`ATTR(info="Temperature coefficient of the resistivity of the base");
parameter real AEPI = 2.5
`ATTR(info="Temperature coefficient of the resistivity of the epilayer");
parameter real AEX = 0.62
`ATTR(info="Temperature coefficient of the resistivity of the extrinsic base");
parameter real AC = 2.0
`ATTR(info="Temperature coefficient of the resistivity of the collector contact");
// RvdT, 30-01-2007: introduced ACBL
parameter real ACBL = 2.0 from [0.0:inf)
`ATTR(info="Temperature coefficient of the resistivity of the collector buried layer");
parameter real DVGBF = 50.0m
`ATTR(info="Band-gap voltage difference of the forward current gain");
parameter real DVGBR = 45.0m
`ATTR(info="Band-gap voltage difference of the reverse current gain");
parameter real VGB = 1.17 from [0.1:inf)
`ATTR(info="Band-gap voltage of the base");
parameter real VGC = 1.18 from [0.1:inf)
`ATTR(info="Band-gap voltage of the collector");
parameter real VGJ = 1.15 from [0.1:inf)
`ATTR(info="Band-gap voltage recombination emitter-base junction");
parameter real VGZEB = 1.15 from [0.1:inf)
`ATTR(info="Band-gap voltage at Tref of Zener effect emitter-base junction");
parameter real AVGEB = 4.73e-4 from (-inf:inf)
`ATTR(info="Temperature coefficient band-gap voltage for Zener effect emitter-base junction");
parameter real TVGEB = 636.0 from [0.0:inf)
`ATTR(info="Temperature coefficient band-gap voltage for Zener effect emitter-base junction");
parameter real DVGTE = 0.05
`ATTR(info="Band-gap voltage difference of emitter stored charge");
parameter real DAIS = 0.0
`ATTR(info="Fine tuning of temperature dependence of C-E saturation current");
parameter real AF = 2.0 from [0.01:inf)
`ATTR(info="Exponent of the Flicker-noise");
parameter real KF = 20.0p from [0.0:inf)
`ATTR(info="Flicker-noise coefficient of the ideal base current");
parameter real KFN = 20.0p from [0.0:inf)
`ATTR(info="Flicker-noise coefficient of the non-ideal base current");
parameter integer KAVL = 0 from [0:1]
`ATTR(info="Switch for white noise contribution due to avalanche");
`ifdef SUBSTRATE
parameter real ISS = 48.0a from [0.0:inf)
`ATTR(info="Base-substrate saturation current");
parameter real ICSS = -1.0 from (-inf:inf)
`ATTR(info="Collector-substrate ideal saturation current");
parameter real IKS = 250.0u from [1.0p:inf)
`ATTR(info="Base-substrate high injection knee current");
parameter real CJS = 315.0f from [0:inf)
`ATTR(info="Zero-bias collector-substrate depletion capacitance");
parameter real VDS = 0.62 from (0.05:inf)
`ATTR(info="Collector-substrate diffusion voltage");
parameter real PS = 0.34 from (0.01:0.99)
`ATTR(info="Collector-substrate grading coefficient");
parameter real VGS = 1.20 from [0.1:inf)
`ATTR(info="band-gap voltage of the substrate");
parameter real AS = 1.58
`ATTR(info="Substrate temperature coefficient");
parameter real ASUB = 2.0
`ATTR(info="Temperature coefficient for mobility of minorities in the substrate");
`endif
`ifdef SELFHEATING
parameter real RTH = 300.0 from (0.0:inf)
`ATTR(info="Thermal resistance");
parameter real CTH = 3.0n from [0.0:inf)
`ATTR(info="Thermal capacitance");
parameter real ATH = 0.0
`ATTR(info="Temperature coefficient of the thermal resistance");
`endif
parameter real MULT = 1.0 from (0.0:inf)
`ATTR(info="Multiplication factor");
// Non-standard (additional) model parameters
// (introduced for the users' convenience)
`ifdef insideADMS
parameter integer TYPE = 1 from [-1:1]
`ATTR(info="Flag for NPN (1) or PNP (-1) transistor type");
`else
parameter integer TYPE = 1 from [-1:1] exclude 0;
`endif
parameter real GMIN = 1.0e-13 from (0:1e-10]
`ATTR(info="Minimum conductance");

View File

@ -1,242 +0,0 @@
// Temperature scaling of parameters
// The excess transistor temperature due to the self-heating
`ifdef SELFHEATING
Tki = V(dt);
// *** Convergence related smoothing ***
if (Tki < 0.0) begin
Tki = - ln(1.0 - Tki);
end
`linLog(Vdt, Tki, 200.0);
// `min_logexp(Vdt, Tki, 200.0, 10.0);
`else
Vdt = 0.0;
`endif
// Temperature variables
`ifdef insideADMS
Tk = Trk + DTA + Vdt;
Tamb = Trk + DTA;
`else
Tk = $temperature + DTA + Vdt;
Tamb = $temperature + DTA;
`endif
tN = Tk / Trk;
Vt = `KBdivQQ * Tk;
Vtr = `KBdivQQ * Trk;
VtINV = 1.0 / Vt;
VtrINV = 1.0 / Vtr;
VdtINV = VtINV - VtrINV;
lntN = ln(tN) ;
// begin: RvdT, November 2008, "Zener tunneling model"
// VGZEB_T = VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB) ;
`max_logexp(VGZEB_T, VGZEBOK - AVGEB*Tk*Tk / (Tk + TVGEB), 0.05, 0.1) ;
// end: RvdT, November 2008, "Zener tunneling model"
// Depletion capacitances
UdeT = -3.0 * Vt * ln(tN) + VDE * tN + (1.0 - tN) * VGB;
`max_logexp(VDE_T, `VDLOW, UdeT, Vt);
UdcT = -3.0 * Vt * ln(tN) + VDC * tN + (1.0 - tN) * VGC;
`max_logexp(VDC_T, `VDLOW, UdcT, Vt);
`ifdef SUBSTRATE
UdsT = -3.0 * Vt * ln(tN) + VDS * tN + (1.0 - tN) * VGS;
`max_logexp(VDS_T, `VDLOW, UdsT, Vt);
`endif
inv_VDE_T = 1.0 / VDE_T ;
CJE_T_div_CJE = pow(VDE * inv_VDE_T, PE);
CJE_T = CJE * CJE_T_div_CJE ;
`ifdef SUBSTRATE
CJS_T = CJS * pow(VDS / VDS_T, PS);
`endif
CJCscale = ((1.0 - XP) * pow(VDC / VDC_T, PC) + XP);
CJCscaleINV = 1.0 / CJCscale;
CJC_T = CJC * CJCscale;
XP_T = XP * CJCscaleINV;
// Resistances
// RvdT, November 2008:
// Instead of the following definition
// RE_T = RE * pow(tN, AE);
// we use, here, and in all following powers of tN,
// the following computationally cheaper implementation:
RE_T = RE * exp(lntN * AE);
// This is based on the observation that exp() is faster than pow().
// Acknowledgement due to Geoffrey Coram.
RBV_T = RBV * exp(lntN * (AB - AQBO));
RBC_T = RBC * exp(lntN * AEX);
// RvdT, 30-11-2007: new collector resistances RCCxx_T, RCCex_T, RCCin_T
RCCxx_T = RCC * exp(lntN * AC);
RCCex_T = RCBLX * exp(lntN * ACBL);
RCCin_T = RCBLI * exp(lntN * ACBL);
RCV_T = RCV * exp(lntN * AEPI);
// Current gains
BF_T = BF * exp(lntN * (AE - AB - AQBO)) * exp(-DVGBF * VdtINV);
BRI_T = BRI * exp(-DVGBR * VdtINV);
// Currents and voltages
IS_T = IS * exp(lntN * (4.0 - AB - AQBO + DAIS)) * exp(-VGB * VdtINV);
IK_T = IK * exp(lntN * (1.0 - AB));
IBF_T = IBF * exp(lntN * (6.0 - 2.0 * MLF)) * exp(-VGJ * VdtINV / MLF);
IBR_T = IBR * tN * tN * exp(-VGC * VdtINV / 2.0);
// begin RvdT, November 2008, MXT504.8_alpha
// T-scaling BE tunneling:
//
x = pow(VGZEB_T * inv_VGZEB_Tr, -0.5) ;
// y = pow(VDE_T * inv_VDE, PE) ;
// more efficient, because we need both y and 1.0 / y:
y = 1.0 / CJE_T_div_CJE ;
// definition:
// nZEB_T = NZEB* pow(VGZEB_T/VGZEB_Tr, 1.5) * pow(VDE_T / VDE, PE-1) ;
// more efficient implementation:
// nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE /(VDE_T*VGZEB_Tr*VGZEB_Tr) ;
nZEB_T = NZEB* VGZEB_T * VGZEB_T * x * y * VDE * inv_VDE_T*inv_VGZEB_Tr*inv_VGZEB_Tr ;
// definition:
// IZEB_T = IZEB* pow(VGZEB_T/VGZEB_Tr, -0.5) * pow(VDE_T / VDE, 2-PE) * exp(NZEB-nZEB_T);
// more efficient implementation:
IZEB_T = IZEB* x * VDE_T * VDE_T * inv_VDE * inv_VDE * CJE_T_div_CJE * exp(NZEB-nZEB_T) ;
//
// end RvdT, November 2008, MXT504.8_alpha
x = exp(lntN * AQBO) ;
VEF_T = VEF * x * CJCscaleINV;
// VER_T = VER * x * pow(VDE / VDE_T, -PE);
VER_T = VER * x * y;
`ifdef SUBSTRATE
ISS_T = ISS * exp(lntN * (4.0 - AS)) * exp(-VGS * VdtINV);
// New 504.9:
ICSS_T = ICSS * exp(lntN * (3.5 - 0.5 * ASUB)) * exp(-VGS * VdtINV);
// End New 504.9.
if ((ISS_T > 0.0))
IKS_T = IKS * exp(lntN * (1.0 - AS)) * (IS_T / IS) * (ISS / ISS_T);
else
IKS_T = IKS * exp(lntN * (1.0 - AS));
`endif
// Transit times
TAUE_T = TAUE * exp(lntN * (AB - 2.0)) * exp(-DVGTE * VdtINV);
TAUB_T = TAUB * exp(lntN * (AQBO + AB - 1.0));
TEPI_T = TEPI * exp(lntN * (AEPI - 1.0));
TAUR_T = TAUR * (TAUB_T + TEPI_T) / (TAUB + TEPI);
// Avalanche constant
Tk300 = Tk - 300.0;
// RvdT, 15-02-2008: prevent division by zero and overflow at high temperatures:
if (Tk < 525.0)
begin
BnT = Bn * (1.0 + 7.2e-4 * Tk300 - 1.6e-6 * Tk300 * Tk300) ;
end
else
begin
BnT = Bn * 1.081 ;
end
// Heterojunction features
DEG_T = DEG * exp(lntN * AQBO);
`ifdef SELFHEATING
// Tempearature scaling of the thermal resistance
RTH_Tamb = RTH * pow(Tamb / Trk, ATH);
`endif
// MULT - scaling
IS_TM = IS_T * MULT;
IK_TM = IK_T * MULT;
IBF_TM = IBF_T * MULT;
IBR_TM = IBR_T * MULT;
// RvdT: November 2008, Zener tunneling parameters
IZEB_TM = IZEB_T * MULT ;
// end Zener tunneling parameters
IHC_M = IHC * MULT;
`ifdef SUBSTRATE
ISS_TM = ISS_T * MULT;
// New: 504.9
ICSS_TM = ICSS_T * MULT;
IKS_TM = IKS_T * MULT;
`endif
CJE_TM = CJE_T * MULT;
CJC_TM = CJC_T * MULT;
// begin RvdT, 28-10-2008, MXT504.8_alpha
// Base-emitter tunneling current Mult scaling:
// BTJE_TM = BTJE_T * MULT;
// end RvdT, 28-10-2008, MXT504.8_alpha
`ifdef SUBSTRATE
CJS_TM = CJS_T * MULT;
`endif
RE_TM = RE_T * invMULT;
RBC_TM = RBC_T * invMULT;
RBV_TM = RBV_T * invMULT;
// RvdT, 30-01-2007: new collector resistances:
RCCxx_TM = RCCxx_T * invMULT;
RCCex_TM = RCCex_T * invMULT;
RCCin_TM = RCCin_T * invMULT;
RCV_TM = RCV_T * invMULT;
// RvdT, 03-12-2007: new collector conductances
if (RCC > 0.0)
begin
GCCxx_TM = 1.0 / RCCxx_TM ;
end
else
begin
GCCxx_TM = 0 ;
end
if (RCBLX > 0.0)
begin
GCCex_TM = 1.0 / RCCex_TM ;
end
else
begin
GCCex_TM = 0 ;
end
if (RCBLI > 0.0)
begin
GCCin_TM = 1.0 / RCCin_TM ;
end
else
begin
GCCin_TM = 0 ;
end
`ifdef SELFHEATING
RTH_Tamb_M = RTH_Tamb * invMULT;
`endif

View File

@ -1,197 +0,0 @@
// Declaration of variables
real _x, _x0, _a, _dxa;
real _circuit_gmin;
// Model constants
real An, Bn;
// Temperature scaling variables
real Tk, Trk, tN, Tamb;
real Vt, Vtr, VtINV, VtrINV, VdtINV;
real Vdt;
real UdeT, VDE_T, UdcT, VDC_T;
real CJE_T, CJC_T, XP_T;
real CJCscale, CJCscaleINV;
real RE_T, RBV_T, RBC_T, RCV_T;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_T, RCCex_T, RCCin_T;
real BF_T, BRI_T;
real IS_T, IK_T, IBF_T, IBR_T, VEF_T, VER_T;
// RvdT: November 2008, Zener tunneling parameters and variables:
real Izteb, IZEB_T, E0BE, dE0BE,nZEB_T, pow2_2mPE, pow2_PEm2, inv_VDE, inv_VDE_T;
real eZEB, edZEB, DZEB, VGZEB_T, VGZEB_Tr, inv_VGZEB_Tr, CJE_T_div_CJE ;
// RvdT: March 2009, Zener tunneling parameters and variables:
real VGZEBOK;
// end Zener tunneling parameters
real TAUE_T, TAUB_T, TEPI_T, TAUR_T;
real BnT, DEG_T, Tk300;
`ifdef SELFHEATING
real RTH_Tamb;
`endif
`ifdef SUBSTRATE
real UdsT, VDS_T, CJS_T, ISS_T, ICSS_T, IKS_T;
`endif
// MULT - scaling variables
real invMULT;
real IS_TM, IK_TM, IBF_TM, IBR_TM, IHC_M;
// RvdT: November 2008, Zener tunneling parameters
real IZEB_TM ;
// end Zener tunneling parameters
real CJE_TM, CJC_TM;
real RE_TM, RBC_TM, RBV_TM, RCV_TM, SCRCV_M;
// RvdT: 30-01-2007, new collector resistances:
real RCCxx_TM, RCCex_TM, RCCin_TM;
// RvdT: 03-12-2007, new collector conductances:
real GCCxx_TM, GCCex_TM, GCCin_TM;
real KF_M, KFN_M;
`ifdef SELFHEATING
real RTH_Tamb_M, CTH_M;
`endif
`ifdef SUBSTRATE
real ISS_TM, ICSS_TM, IKS_TM, CJS_TM;
`endif
// Epilayer model variables
real K0, Kw, pW, Ec, Ic1c2;
real Vqs_th, Vqs, Iqs;
real alpha, vyi, yi, xi_w, xi_w1;
real gp0, gp02, p0star, Vb2c2star, eVb2c2star;
real B1, B2, Vxi0, Vch, Icap, pav;
// Effective emitter and collector junction bias variables
real Vfe, Vje, Vte;
real Vjunc, bjc, Vfc, Vjc, fI, Vcv, Vtc;
// Transfer current variables
real If0, f1, f2, n0, nB;
real q0I, q1I, qBI, Ir, If, In;
// Base and substrate current(s) variables
real Xext1;
real Ib1, Ib1_s, Ib2, Ib3;
real Ibf0, Iex;
real g1, g2, pWex, nBex;
real Xg1, XnBex, XIMex, XIMsub, Vex, VBex, Fex, XIex;
`ifdef SUBSTRATE
real Isub, XIsub, Isf;
`endif
// Distributed base effects variables
real q0Q, q1Q, qBQ, Rb2, Ib1b2;
real dVteVb2e1, dVteVje, dVjeVb2e1;
real dQteVb2e1, dQbeVb2e1, dQeVb2e1;
real dn0Vb2e1;
// Weak-avalanche current variables
real dEdx0, xd, Weff, Wd, Eav, E0, Em, SHw, Efi, Ew;
real lambda, Gem, Gmax, Iavl;
real Icap_IHC;
`ifdef SELFHEATING
real Tki, power;
`endif
// Charges and capacitances variables
real Qte, Vje_s, Qte_s;
real Qtc;
real Qb0, Qbe, Qbc, Qb1b2;
real Qbe_qs, Qbc_qs;
real Vjcex, Vtexv, Qtex, XVjcex, XVtexv, XQtex;
`ifdef SUBSTRATE
real Vfs, Vjs, Qts;
`endif
real Qe0, Qe;
real Qepi0, Qepi, Xg2, XpWex, XQex;
real Qex;
real CBEO_M, CBCO_M;
// Biases and exponential terms variables
real Vb2c1, Vb2c2, Vb2e1, Vb1e1, Vb1b2, Vb1c4, Vc1c2;
// RvdT, 30-01-2007: new variables Vc3c4, Vc4c1
real Vc3c4, Vc4c1;
// RvdT, 25-02-2008: new variables Vsc3, Vsc4
`ifdef SUBSTRATE
real Vsc1, Vsc3, Vsc4, eVsc1;
`endif
real Vee1, Vbb1, Vbc3, Vcc3, Vbe, Vbc;
real eVb2c2, eVb2e1, eVb1e1, eVb1b2, eVb1c4, eVbc3;
real eVb1c4VDC, eVb2c2VDC, eVbc3VDC, eVb2c1VDC;
// Help variables
// RvdT, November 2008, lntN introduced to speed up T-scaling:
// Acknowledgements due to Geoffrey Coram
real lntN ;
// RvdT, November 2008 variables for local use; may be re-used globally:
real x, y ;
real dxa, sqr_arg;
real eps2, x2;
real alpha1, vdif, Ic1c2_Iqs, gp0_help;
real EmEav_Em, Vb2e1Vfe, termE, termC;
real Vex_bias;
real eps_VDC, a_VDE, a_VDC;
real expl, tmpExp, tmpV;
`ifdef SUBSTRATE
real a_VDS;
`endif
// Noise variables
real common;
real powerREC, powerRBC, powerRCCxx, powerRCCex, powerRCCin, powerRBV;
real powerCCS;
real powerFBCS, powerFBC1fB1, exponentFBC1fB2, powerFBC1fB2;
real powerEBSCS, powerEBSC1f;
real powerRBCS, powerRBC1f;
real powerExCS, powerExCSMOD, powerExC1f, powerExC1fMOD;
`ifdef SUBSTRATE
real powerSubsCS_B1S, powerSubsCS_BS;
`endif
//real twoqIavl, powerCCS_A, powerFBCS_A, powerAVL_B2C2;
real twoqIavl, cor_exp_1, cor_exp_2, powerCCS_A;

View File

@ -1,184 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_InitModel.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////////////////////////
//
// Calculation of internal paramters which are independent
// on instance parameters
//
//////////////////////////////////////////////////////////////
TRJ_i = `CLIP_LOW( TRJ , `TRJ_cliplow);
IMAX_i = `CLIP_LOW( IMAX , `IMAX_cliplow);
CJORBOT_i = `CLIP_LOW( CJORBOT , `CJORBOT_cliplow);
CJORSTI_i = `CLIP_LOW( CJORSTI , `CJORSTI_cliplow);
CJORGAT_i = `CLIP_LOW( CJORGAT , `CJORGAT_cliplow);
VBIRBOT_i = `CLIP_LOW( VBIRBOT , `VBIR_cliplow);
VBIRSTI_i = `CLIP_LOW( VBIRSTI , `VBIR_cliplow);
VBIRGAT_i = `CLIP_LOW( VBIRGAT , `VBIR_cliplow);
PBOT_i = `CLIP_BOTH(PBOT , `P_cliplow,`P_cliphigh);
PSTI_i = `CLIP_BOTH(PSTI , `P_cliplow,`P_cliphigh);
PGAT_i = `CLIP_BOTH(PGAT , `P_cliplow,`P_cliphigh);
IDSATRBOT_i = `CLIP_LOW( IDSATRBOT , `IDSATR_cliplow);
IDSATRSTI_i = `CLIP_LOW( IDSATRSTI , `IDSATR_cliplow);
IDSATRGAT_i = `CLIP_LOW( IDSATRGAT , `IDSATR_cliplow);
CSRHBOT_i = `CLIP_LOW( CSRHBOT , `CSRH_cliplow);
CSRHSTI_i = `CLIP_LOW( CSRHSTI , `CSRH_cliplow);
CSRHGAT_i = `CLIP_LOW( CSRHGAT , `CSRH_cliplow);
XJUNSTI_i = `CLIP_LOW( XJUNSTI , `XJUN_cliplow);
XJUNGAT_i = `CLIP_LOW( XJUNGAT , `XJUN_cliplow);
CTATBOT_i = `CLIP_LOW( CTATBOT , `CTAT_cliplow);
CTATSTI_i = `CLIP_LOW( CTATSTI , `CTAT_cliplow);
CTATGAT_i = `CLIP_LOW( CTATGAT , `CTAT_cliplow);
MEFFTATBOT_i = `CLIP_LOW( MEFFTATBOT, `MEFFTAT_cliplow);
MEFFTATSTI_i = `CLIP_LOW( MEFFTATSTI, `MEFFTAT_cliplow);
MEFFTATGAT_i = `CLIP_LOW( MEFFTATGAT, `MEFFTAT_cliplow);
CBBTBOT_i = `CLIP_LOW( CBBTBOT , `CBBT_cliplow);
CBBTSTI_i = `CLIP_LOW( CBBTSTI , `CBBT_cliplow);
CBBTGAT_i = `CLIP_LOW( CBBTGAT , `CBBT_cliplow);
VBRBOT_i = `CLIP_LOW( VBRBOT , `VBR_cliplow);
VBRSTI_i = `CLIP_LOW( VBRSTI , `VBR_cliplow);
VBRGAT_i = `CLIP_LOW( VBRGAT , `VBR_cliplow);
PBRBOT_i = `CLIP_LOW( PBRBOT , `PBR_cliplow);
PBRSTI_i = `CLIP_LOW( PBRSTI , `PBR_cliplow);
PBRGAT_i = `CLIP_LOW( PBRGAT , `PBR_cliplow);
tkr = `KELVINCONVERSION + TRJ_i;
tkd = max($temperature + DTA, `KELVINCONVERSION + `MINTEMP);
auxt = tkd / tkr;
KBOL_over_QELE = `KBOL / `QELE;
phitr = KBOL_over_QELE * tkr;
phitrinv = 1.0 / phitr;
phitd = KBOL_over_QELE * tkd;
phitdinv = 1.0 / phitd;
// bandgap voltages at reference temperature
deltaphigr = -(7.02e-4 * tkr * tkr) / (1108.0 + tkr);
phigrbot = PHIGBOT + deltaphigr;
phigrsti = PHIGSTI + deltaphigr;
phigrgat = PHIGGAT + deltaphigr;
// bandgap voltages at device temperature
deltaphigd = -(7.02e-4 * tkd * tkd) / (1108.0 + tkd);
phigdbot = PHIGBOT + deltaphigd;
phigdsti = PHIGSTI + deltaphigd;
phigdgat = PHIGGAT + deltaphigd;
// factors ftd for ideal-current model
ftdbot = (pow(auxt, 1.5)) * exp(0.5 * ((phigrbot * phitrinv) - (phigdbot * phitdinv)));
ftdsti = (pow(auxt, 1.5)) * exp(0.5 * ((phigrsti * phitrinv) - (phigdsti * phitdinv)));
ftdgat = (pow(auxt, 1.5)) * exp(0.5 * ((phigrgat * phitrinv) - (phigdgat * phitdinv)));
// temperature-scaled saturation current for ideal-current model
idsatbot = IDSATRBOT_i * ftdbot * ftdbot;
idsatsti = IDSATRSTI_i * ftdsti * ftdsti;
idsatgat = IDSATRGAT_i * ftdgat * ftdgat;
// built-in voltages before limiting
ubibot = VBIRBOT_i * auxt - 2 * phitd * ln(ftdbot);
ubisti = VBIRSTI_i * auxt - 2 * phitd * ln(ftdsti);
ubigat = VBIRGAT_i * auxt - 2 * phitd * ln(ftdgat);
// built-in voltages limited to phitd
vbibot = ubibot + phitd * ln(1 + exp((`vbilow - ubibot) * phitdinv));
vbisti = ubisti + phitd * ln(1 + exp((`vbilow - ubisti) * phitdinv));
vbigat = ubigat + phitd * ln(1 + exp((`vbilow - ubigat) * phitdinv));
// inverse values of built-in voltages
vbiinvbot = 1.0 / vbibot;
vbiinvsti = 1.0 / vbisti;
vbiinvgat = 1.0 / vbigat;
// one minus the grading coefficient
one_minus_PBOT = 1 - PBOT_i;
one_minus_PSTI = 1 - PSTI_i;
one_minus_PGAT = 1 - PGAT_i;
// one over "one minus the grading coefficient"
one_over_one_minus_PBOT = 1 / one_minus_PBOT;
one_over_one_minus_PSTI = 1 / one_minus_PSTI;
one_over_one_minus_PGAT = 1 / one_minus_PGAT;
// temperature-scaled zero-bias capacitance
cjobot = CJORBOT_i * pow((VBIRBOT_i * vbiinvbot), PBOT_i);
cjosti = CJORSTI_i * pow((VBIRSTI_i * vbiinvsti), PSTI_i);
cjogat = CJORGAT_i * pow((VBIRGAT_i * vbiinvgat), PGAT_i);
// prefactor in physical part of charge model
qprefbot = cjobot * vbibot * one_over_one_minus_PBOT;
qprefsti = cjosti * vbisti * one_over_one_minus_PSTI;
qprefgat = cjogat * vbigat * one_over_one_minus_PGAT;
// prefactor in mathematical extension of charge model
qpref2bot = `a * cjobot;
qpref2sti = `a * cjosti;
qpref2gat = `a * cjogat;
// zero-bias depletion widths at reference temperature, needed in SRH and TAT model
wdepnulrbot = `EPSSI / CJORBOT_i;
wdepnulrsti = XJUNSTI_i * `EPSSI / CJORSTI_i;
wdepnulrgat = XJUNGAT_i * `EPSSI / CJORGAT_i;
// inverse values of "wdepnulr", used in BBT model
wdepnulrinvbot = 1 / wdepnulrbot;
wdepnulrinvsti = 1 / wdepnulrsti;
wdepnulrinvgat = 1 / wdepnulrgat;
// inverse values of built-in voltages at reference temperature, needed in SRH and BBT model
VBIRBOTinv = 1 / VBIRBOT_i;
VBIRSTIinv = 1 / VBIRSTI_i;
VBIRGATinv = 1 / VBIRGAT_i;
// some constants needed in erfc-approximation, needed in TAT model
perfc = (`SQRTPI * `aerfc);
berfc = ((-5 * (`aerfc) + 6 - pow((perfc), -2)) / 3);
cerfc = (1.0 - (`aerfc) - (berfc));
// half the bandgap energy, limited to values > phitd, needed in TAT model
deltaEbot = max(0.5 * phigdbot, phitd);
deltaEsti = max(0.5 * phigdsti, phitd);
deltaEgat = max(0.5 * phigdgat, phitd);
// values of atat, needed in TAT model
atatbot = deltaEbot * phitdinv;
atatsti = deltaEsti * phitdinv;
atatgat = deltaEgat * phitdinv;
// values of btatpart, needed in TAT model
btatpartbot = sqrt(32 * MEFFTATBOT_i * `MELE * `QELE * (deltaEbot * deltaEbot * deltaEbot)) / (3 * `HBAR);
btatpartsti = sqrt(32 * MEFFTATSTI_i * `MELE * `QELE * (deltaEsti * deltaEsti * deltaEsti)) / (3 * `HBAR);
btatpartgat = sqrt(32 * MEFFTATGAT_i * `MELE * `QELE * (deltaEgat * deltaEgat * deltaEgat)) / (3 * `HBAR);
// temperature-scaled values of FBBT, needed in BBT model
fbbtbot = FBBTRBOT * (1 + STFBBTBOT * (tkd - tkr));
fbbtsti = FBBTRSTI * (1 + STFBBTSTI * (tkd - tkr));
fbbtgat = FBBTRGAT * (1 + STFBBTGAT * (tkd - tkr));
// values of fstop, needed in avalanche/breakdown model
fstopbot = 1 / (1 - pow(`alphaav, PBRBOT_i));
fstopsti = 1 / (1 - pow(`alphaav, PBRSTI_i));
fstopgat = 1 / (1 - pow(`alphaav, PBRGAT_i));
// inverse values of breakdown voltages, needed in avalanche/breakdown model
VBRinvbot = 1 / VBRBOT_i;
VBRinvsti = 1 / VBRSTI_i;
VBRinvgat = 1 / VBRGAT_i;
// slopes for linear extraploation close to and beyond breakdown, needed in avalanche/breakdown model
slopebot = -(fstopbot * fstopbot * pow(`alphaav, (PBRBOT_i - 1))) * PBRBOT_i * VBRinvbot;
slopesti = -(fstopsti * fstopsti * pow(`alphaav, (PBRSTI_i - 1))) * PBRSTI_i * VBRinvsti;
slopegat = -(fstopgat * fstopgat * pow(`alphaav, (PBRGAT_i - 1))) * PBRGAT_i * VBRinvgat;

View File

@ -1,285 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////
//
// Macros and constants used in JUNCAP2
//
///////////////////////////////////////////
// Other constants
`define MINTEMP -250
`define vbilow 0.050
`define a 2
`define epsch 0.1
`define dvbi 0.050
`define epsav 1E-6
`define vbrmax 1000
`define alphaav 0.999
`define vmaxlarge 1E8
`define aerfc 0.29214664
`define twothirds 0.666666666666667
// Clipping values
`define levelnumber 200
`define AB_cliplow 0
`define LS_cliplow 0
`define LG_cliplow 0
`define MULT_cliplow 0
`define TRJ_cliplow `MINTEMP
`define IMAX_cliplow 1E-12
`define CJORBOT_cliplow 1E-12
`define CJORSTI_cliplow 1E-18
`define CJORGAT_cliplow 1E-18
`define VBIR_cliplow `vbilow
`define P_cliplow 0.05
`define P_cliphigh 0.95
`define IDSATR_cliplow 0
`define CSRH_cliplow 0
`define XJUN_cliplow 1E-9
`define CTAT_cliplow 0
`define MEFFTAT_cliplow 0.01
`define CBBT_cliplow 0
`define VBR_cliplow 0.1
`define PBR_cliplow 0.1
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables.
//
/////////////////////////////////////////////////////////////////////////////
// Instance parameter dependent initialization
`define JuncapInitInstance(AB_i, LS_i, LG_i, VMAX, vbimin, vch, vfmin, vbbtlim) \
if (idsatbot * AB_i > 0) begin \
vmaxbot = phitd * ln(IMAX_i / (idsatbot * AB_i) + 1); \
end else begin \
vmaxbot = `vmaxlarge; \
end \
if (idsatsti * LS_i > 0) begin \
vmaxsti = phitd * ln(IMAX_i / (idsatsti * LS_i) + 1); \
end else begin \
vmaxsti = `vmaxlarge; \
end \
if (idsatgat * LG_i > 0) begin \
vmaxgat = phitd * ln(IMAX_i / (idsatgat * LG_i) + 1); \
end else begin \
vmaxgat = `vmaxlarge; \
end \
VMAX = min(min(vmaxbot, vmaxsti), vmaxgat); \
\
/* determination of minimum value of the relevant built-in voltages */ \
vbibot2 = vbibot; \
vbisti2 = vbisti; \
vbigat2 = vbigat; \
if (AB_i == 0) begin vbibot2 = vbisti + vbigat; end \
if (LS_i == 0) begin vbisti2 = vbibot + vbigat; end \
if (LG_i == 0) begin vbigat2 = vbibot + vbisti; end \
vbimin = min(min(vbibot2, vbisti2), vbigat2); \
vch = vbimin * `epsch; \
if (vbimin == vbibot) begin vfmin = vbibot * (1 - (pow(`a, (-1.0 / PBOT_i)))); end \
if (vbimin == vbisti) begin vfmin = vbisti * (1 - (pow(`a, (-1.0 / PSTI_i)))); end \
if (vbimin == vbigat) begin vfmin = vbigat * (1 - (pow(`a, (-1.0 / PGAT_i)))); end \
\
/* determination of limiting value of conditioned voltage for BBT calculation */ \
vbibot2r = VBIRBOT_i; \
vbisti2r = VBIRSTI_i; \
vbigat2r = VBIRGAT_i; \
if (AB_i == 0) begin vbibot2r = VBIRSTI_i + VBIRGAT_i; end \
if (LS_i == 0) begin vbisti2r = VBIRBOT_i + VBIRGAT_i; end \
if (LG_i == 0) begin vbigat2r = VBIRBOT_i + VBIRSTI_i; end \
vbbtlim = min(min(vbibot2r, vbisti2r), vbigat2r) - `dvbi; \
// Special power-functions
`define mypower(x,power,result) \
if (power == 0.5) begin \
result = sqrt(x); \
end else begin \
result = pow(x, power); \
end
`define mypower2(x,power,result) \
if (power == -1) begin \
result = 1 / (x); \
end else begin \
result = pow(x, power); \
end
`define mypower3(x,power,result) \
if (power == 4) begin \
result = (x) * (x) * (x) * (x); \
end else begin \
result = pow(x, power); \
end
// Smoothing functions
`define hypfunction2(x,x0,eps,hyp2) \
hyp2 = 0.5 * ((x) + (x0) - sqrt(((x) - (x0)) * ((x) - (x0)) + 4 * (eps) * (eps)));
`define hypfunction5(x,x0,eps,hyp5) \
h1 = 4.0 * (eps) * (eps); \
h2 = (eps) / (x0); \
h2d = (x) + (eps) * h2; \
h3 = (x0) + h2d; \
h4 = (x0) - h2d; \
h5 = sqrt(h4 * h4 + h1); \
hyp5 = 2.0 * ((x) * (x0) / (h3 + h5));
// A special function used to calculate TAT-currents,
// including an approximation of the erfc-function
`define calcerfcexpmtat(y,m,result) \
ysq = y * y; \
if (y > 0) begin \
terfc = 1 / (1 + perfc * y); \
end else begin \
terfc = 1 / (1 - perfc * y); \
end \
`expl_low(-ysq + m, tmp) \
erfcpos = (`aerfc * terfc + berfc * (terfc * terfc) + cerfc * (terfc * terfc * terfc)) * tmp; \
if (y > 0) begin \
result = erfcpos; \
end else begin\
`expl_low(m, tmp) \
result = 2 * tmp - erfcpos; \
end
// This is the main function of the JUNCAP2-model. It returns the current and charge
// for a single diode
`define juncapfunction(qpref,qpref2,vbiinv,one_minus_P,idsat,CSRH,CTAT,vbi,wdepnulr,VBIRinv,P,ftd,btatpart,atat,one_over_one_minus_P,CBBT,VBIR,wdepnulrinv,fbbt,VBR,VBRinv,PBR,fstop,slope,Ijprime,Qjprime) \
`mypower((1 - vj * vbiinv), one_minus_P, tmp) \
Qjprime = qpref * (1 - tmp) + qpref2 * (VAK - vj); \
id = idsat * idmult; \
if ((CSRH == 0) && (CTAT == 0)) begin \
isrh = 0; \
end else begin \
vbi_minus_vjsrh = vbi-vjsrh; \
wsrhstep = 1 - sqrt(1 - two_psistar / vbi_minus_vjsrh); \
if (P == 0.5) begin \
dwsrh = 0; \
end else begin \
dwsrh = ((wsrhstep * wsrhstep * ln(wsrhstep) / (1 - wsrhstep)) + wsrhstep) * (1 - 2 * P); \
end \
wsrh = wsrhstep + dwsrh; \
`mypower(vbi_minus_vjsrh * VBIRinv, P, tmp) \
wdep = wdepnulr * tmp; \
asrh = ftd * ((zinv - 1) * wdep); \
isrh = CSRH * (asrh * wsrh); \
end \
if (CTAT == 0) begin \
itat = 0; \
end else begin \
btat = btatpart * ((wdep * one_minus_P) / vbi_minus_vjsrh); \
twoatatoverthreebtat = (`twothirds * atat) / btat; \
umaxbeforelimiting = twoatatoverthreebtat * twoatatoverthreebtat; \
umax = sqrt(umaxbeforelimiting * umaxbeforelimiting / (umaxbeforelimiting * umaxbeforelimiting + 1)); \
sqrtumax = sqrt(abs(umax)); \
umaxpoweronepointfive = umax * sqrtumax; \
`mypower2((1 + btat * umaxpoweronepointfive), (-P * one_over_one_minus_P), wgamma) \
wtat = wsrh * wgamma / (wsrh + wgamma); \
ktat = sqrt(0.375 * (btat / sqrtumax)); \
ltat = 2 * (twoatatoverthreebtat * sqrtumax) - umax; \
mtat = atat * twoatatoverthreebtat * sqrtumax - atat * umax + 0.5 * (btat * umaxpoweronepointfive); \
xerfc = (ltat - 1) * ktat; \
`calcerfcexpmtat(xerfc, mtat, erfctimesexpmtat) \
gammamax = `SQRTPI * 0.5 * (atat * erfctimesexpmtat / ktat); \
itat = CTAT * (asrh * gammamax * wtat); \
end \
if (CBBT == 0) begin \
ibbt = 0; \
end else begin \
`mypower(((VBIR - vbbt) * VBIRinv), P, tmp) \
Fmaxr = one_over_one_minus_P * ((VBIR - vbbt) * wdepnulrinv / tmp); \
`expl(-fbbt / Fmaxr, tmp) \
ibbt = CBBT * (VAK * Fmaxr * Fmaxr * tmp); \
end \
if (VBR > `vbrmax) begin \
fbreakdown = 1; \
end else begin \
if (vav > -`alphaav * VBR) begin \
`mypower3(abs(vav * VBRinv), PBR, tmp) \
fbreakdown = 1 / (1 - tmp); \
end else begin \
fbreakdown = fstop + (vav + `alphaav * VBR) * slope; \
end \
end \
Ijprime = (id + isrh + itat + ibbt) * fbreakdown;
// The following code is written as a macro because the naming of the instance parameters is
// different for JUNCAP2 stand-alone and JUNCAP2-in-PSP: AB, LS, LG for JUNCAP2 stand-alone,
// ABSOURCE, LSSOURCE, LGSOURCE for source junction in PSP and ABDRAIN, LSDRAIN, LGDRAIN for
// drain junction in PSP
`define juncapcommon(AB_i,LS_i,LG_i,ijunbot,qjunbot,ijunsti,qjunsti,ijungat,qjungat) \
vbbt = 0.0; \
two_psistar = 0.0; \
if ( !( ((AB_i) == 0) && ((LS_i) == 0) && ((LG_i) == 0) ) ) begin \
`hypfunction5(VAK, vfmin, vch, vj) \
if (VAK < VMAX) begin \
`expl(0.5 * (VAK * phitdinv), zinv) \
idmult = zinv * zinv; \
end else begin \
`expl(VMAX * phitdinv, exp_VMAX_over_phitd) \
idmult = (1 + (VAK - VMAX) * phitdinv) * exp_VMAX_over_phitd; \
zinv = sqrt(idmult); \
end \
idmult = idmult - 1.0; \
z = 1 / zinv; \
if (VAK > 0) begin \
two_psistar = 2.0 * (phitd * ln(2.0 + z + sqrt((z + 1.0) * (z + 3.0)))); \
end else begin \
two_psistar = -VAK + 2.0 * (phitd * ln(2 * zinv + 1 + sqrt((1 + zinv) * (1 + 3 * zinv)))); \
end \
vjlim = vbimin - two_psistar; \
`hypfunction2(VAK, vjlim, phitd, vjsrh) \
`hypfunction2(VAK, vbbtlim, phitr, vbbt) \
`hypfunction2(VAK, 0, `epsav, vav) \
end \
if ((AB_i) == 0) begin \
ijunbot = 0; \
qjunbot = 0; \
end else begin \
`juncapfunction(qprefbot,qpref2bot,vbiinvbot,one_minus_PBOT,idsatbot,CSRHBOT_i,CTATBOT_i,vbibot,wdepnulrbot,VBIRBOTinv,PBOT_i,ftdbot,btatpartbot,atatbot,one_over_one_minus_PBOT,CBBTBOT_i,VBIRBOT_i,wdepnulrinvbot,fbbtbot,VBRBOT_i,VBRinvbot,PBRBOT_i,fstopbot,slopebot,ijunbot, qjunbot) \
end \
if ((LS_i) == 0) begin \
ijunsti = 0; \
qjunsti = 0; \
end else begin \
`juncapfunction(qprefsti,qpref2sti,vbiinvsti,one_minus_PSTI,idsatsti,CSRHSTI_i,CTATSTI_i,vbisti,wdepnulrsti,VBIRSTIinv,PSTI_i,ftdsti,btatpartsti,atatsti,one_over_one_minus_PSTI,CBBTSTI_i,VBIRSTI_i,wdepnulrinvsti,fbbtsti,VBRSTI_i,VBRinvsti,PBRSTI_i,fstopsti,slopesti,ijunsti, qjunsti) \
end \
if ((LG_i) == 0) begin \
ijungat = 0; \
qjungat = 0; \
end else begin \
`juncapfunction(qprefgat,qpref2gat,vbiinvgat,one_minus_PGAT,idsatgat,CSRHGAT_i,CTATGAT_i,vbigat,wdepnulrgat,VBIRGATinv,PGAT_i,ftdgat,btatpartgat,atatgat,one_over_one_minus_PGAT,CBBTGAT_i,VBIRGAT_i,wdepnulrinvgat,fbbtgat,VBRGAT_i,VBRinvgat,PBRGAT_i,fstopgat,slopegat,ijungat, qjungat) \
end

View File

@ -1,65 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_parlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////
//
// JUNCAP2 - Reduced parameterlist
//
//////////////////////////////////////////
(*info="Maximum current up to which forward current behaves exponentially", unit="A" *) parameter real IMAX = 1000 `from(`IMAX_cliplow ,inf );
(*info="Zero-bias capacitance per unit-of-area of bottom component", unit="Fm^-2" *) parameter real CJORBOT = 1E-3 `from(`CJORBOT_cliplow ,inf );
(*info="Zero-bias capacitance per unit-of-length of STI-edge component", unit="Fm^-1" *) parameter real CJORSTI = 1E-9 `from(`CJORSTI_cliplow ,inf );
(*info="Zero-bias capacitance per unit-of-length of gate-edge component", unit="Fm^-1" *) parameter real CJORGAT = 1E-9 `from(`CJORGAT_cliplow ,inf );
(*info="Built-in voltage at the reference temperature of bottom component", unit="V" *) parameter real VBIRBOT = 1 `from(`VBIR_cliplow ,inf );
(*info="Built-in voltage at the reference temperature of STI-edge component", unit="V" *) parameter real VBIRSTI = 1 `from(`VBIR_cliplow ,inf );
(*info="Built-in voltage at the reference temperature of gate-edge component", unit="V" *) parameter real VBIRGAT = 1 `from(`VBIR_cliplow ,inf );
(*info="Grading coefficient of bottom component", unit="" *) parameter real PBOT = 0.5 `from(`P_cliplow ,`P_cliphigh );
(*info="Grading coefficient of STI-edge component", unit="" *) parameter real PSTI = 0.5 `from(`P_cliplow ,`P_cliphigh );
(*info="Grading coefficient of gate-edge component", unit="" *) parameter real PGAT = 0.5 `from(`P_cliplow ,`P_cliphigh );
(*info="Zero-temperature bandgap voltage of bottom component", unit="V" *) parameter real PHIGBOT = 1.16 ;
(*info="Zero-temperature bandgap voltage of STI-edge component", unit="V" *) parameter real PHIGSTI = 1.16 ;
(*info="Zero-temperature bandgap voltage of gate-edge component", unit="V" *) parameter real PHIGGAT = 1.16 ;
(*info="Saturation current density at the reference temperature of bottom component", unit="Am^-2" *) parameter real IDSATRBOT = 1E-12 `from(`IDSATR_cliplow ,inf );
(*info="Saturation current density at the reference temperature of STI-edge component", unit="Am^-1" *) parameter real IDSATRSTI = 1E-18 `from(`IDSATR_cliplow ,inf );
(*info="Saturation current density at the reference temperature of gate-edge component", unit="Am^-1" *) parameter real IDSATRGAT = 1E-18 `from(`IDSATR_cliplow ,inf );
(*info="Shockley-Read-Hall prefactor of bottom component", unit="Am^-3" *) parameter real CSRHBOT = 1E2 `from(`CSRH_cliplow ,inf );
(*info="Shockley-Read-Hall prefactor of STI-edge component", unit="Am^-2" *) parameter real CSRHSTI = 1E-4 `from(`CSRH_cliplow ,inf );
(*info="Shockley-Read-Hall prefactor of gate-edge component", unit="Am^-2" *) parameter real CSRHGAT = 1E-4 `from(`CSRH_cliplow ,inf );
(*info="Junction depth of STI-edge component", unit="m" *) parameter real XJUNSTI = 100E-9 `from(`XJUN_cliplow ,inf );
(*info="Junction depth of gate-edge component", unit="m" *) parameter real XJUNGAT = 100E-9 `from(`XJUN_cliplow ,inf );
(*info="Trap-assisted tunneling prefactor of bottom component", unit="Am^-3" *) parameter real CTATBOT = 1E2 `from(`CTAT_cliplow ,inf );
(*info="Trap-assisted tunneling prefactor of STI-edge component", unit="Am^-2" *) parameter real CTATSTI = 1E-4 `from(`CTAT_cliplow ,inf );
(*info="Trap-assisted tunneling prefactor of gate-edge component", unit="Am^-2" *) parameter real CTATGAT = 1E-4 `from(`CTAT_cliplow ,inf );
(*info="Effective mass (in units of m0) for trap-assisted tunneling of bottom component", unit="" *) parameter real MEFFTATBOT = 0.25 `from(`MEFFTAT_cliplow ,inf );
(*info="Effective mass (in units of m0) for trap-assisted tunneling of STI-edge component", unit="" *) parameter real MEFFTATSTI = 0.25 `from(`MEFFTAT_cliplow ,inf );
(*info="Effective mass (in units of m0) for trap-assisted tunneling of gate-edge component", unit="" *) parameter real MEFFTATGAT = 0.25 `from(`MEFFTAT_cliplow ,inf );
(*info="Band-to-band tunneling prefactor of bottom component", unit="AV^-3" *) parameter real CBBTBOT = 1E-12 `from(`CBBT_cliplow ,inf );
(*info="Band-to-band tunneling prefactor of STI-edge component", unit="AV^-3m" *) parameter real CBBTSTI = 1E-18 `from(`CBBT_cliplow ,inf );
(*info="Band-to-band tunneling prefactor of gate-edge component", unit="AV^-3m" *) parameter real CBBTGAT = 1E-18 `from(`CBBT_cliplow ,inf );
(*info="Normalization field at the reference temperature for band-to-band tunneling of bottom component", unit="Vm^-1" *) parameter real FBBTRBOT = 1E9 ;
(*info="Normalization field at the reference temperature for band-to-band tunneling of STI-edge component", unit="Vm^-1" *) parameter real FBBTRSTI = 1E9 ;
(*info="Normalization field at the reference temperature for band-to-band tunneling of gate-edge component", unit="Vm^-1" *) parameter real FBBTRGAT = 1E9 ;
(*info="Temperature scaling parameter for band-to-band tunneling of bottom component", unit="K^-1" *) parameter real STFBBTBOT = -1E-3 ;
(*info="Temperature scaling parameter for band-to-band tunneling of STI-edge component", unit="K^-1" *) parameter real STFBBTSTI = -1E-3 ;
(*info="Temperature scaling parameter for band-to-band tunneling of gate-edge component", unit="K^-1" *) parameter real STFBBTGAT = -1E-3 ;
(*info="Breakdown voltage of bottom component", unit="V" *) parameter real VBRBOT = 10 `from(`VBR_cliplow ,inf );
(*info="Breakdown voltage of STI-edge component", unit="V" *) parameter real VBRSTI = 10 `from(`VBR_cliplow ,inf );
(*info="Breakdown voltage of gate-edge component", unit="V" *) parameter real VBRGAT = 10 `from(`VBR_cliplow ,inf );
(*info="Breakdown onset tuning parameter of bottom component", unit="V" *) parameter real PBRBOT = 4 `from(`PBR_cliplow ,inf );
(*info="Breakdown onset tuning parameter of STI-edge component", unit="V" *) parameter real PBRSTI = 4 `from(`PBR_cliplow ,inf );
(*info="Breakdown onset tuning parameter of gate-edge component", unit="V" *) parameter real PBRGAT = 4 `from(`PBR_cliplow ,inf );

View File

@ -1,67 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: JUNCAP200_varlist.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1 (PSP), 200.2 (JUNCAP), April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
// declaration of variables needed in macro "calcerfcexpmtat"
real ysq, terfc, erfcpos;
// declaration of variables needed in hypfunction 5
real h1, h2, h2d, h3, h4, h5;
// declaration of variables used within macro "juncapfunction"
real tmp, id;
real isrh, vbi_minus_vjsrh, wsrhstep, dwsrh, wsrh, wdep, asrh;
real itat, btat, twoatatoverthreebtat, umaxbeforelimiting, umax, sqrtumax, umaxpoweronepointfive;
real wgamma, wtat, ktat, ltat, mtat, xerfc, erfctimesexpmtat, gammamax;
real ibbt, Fmaxr;
real fbreakdown;
// declaration of clipped parameters
real TRJ_i, IMAX_i;
real CJORBOT_i, CJORSTI_i, CJORGAT_i, VBIRBOT_i, VBIRSTI_i, VBIRGAT_i;
real PBOT_i, PSTI_i, PGAT_i;
real IDSATRBOT_i, IDSATRSTI_i, IDSATRGAT_i, XJUNSTI_i, XJUNGAT_i;
real CSRHBOT_i, CSRHSTI_i, CSRHGAT_i, CTATBOT_i, CTATSTI_i, CTATGAT_i;
real MEFFTATBOT_i, MEFFTATSTI_i, MEFFTATGAT_i;
real CBBTBOT_i, CBBTSTI_i, CBBTGAT_i;
real VBRBOT_i, VBRSTI_i, VBRGAT_i, PBRBOT_i, PBRSTI_i, PBRGAT_i;
// declaration of variables calculated outside macro "juncapfunction", voltage-independent part
real tkr, tkd, auxt, KBOL_over_QELE, phitr, phitrinv, phitd, phitdinv;
real deltaphigr, phigrbot, phigrsti, phigrgat, deltaphigd, phigdbot, phigdsti, phigdgat;
real ftdbot, ftdsti, ftdgat, idsatbot, idsatsti, idsatgat, exp_VMAX_over_phitd;
real ubibot, ubisti, ubigat, vbibot, vbisti, vbigat;
real vbibot2, vbisti2, vbigat2, vbibot2r, vbisti2r, vbigat2r;
real vbiinvbot, vbiinvsti, vbiinvgat;
real one_minus_PBOT, one_minus_PSTI, one_minus_PGAT;
real one_over_one_minus_PBOT, one_over_one_minus_PSTI, one_over_one_minus_PGAT;
real cjobot, cjosti, cjogat, qprefbot, qprefsti, qprefgat;
real vbimin, vch, vfmin, vbbtlim;
real qpref2bot, qpref2sti, qpref2gat;
real wdepnulrbot, wdepnulrsti, wdepnulrgat, wdepnulrinvbot, wdepnulrinvsti, wdepnulrinvgat;
real VBIRBOTinv, VBIRSTIinv, VBIRGATinv;
real perfc, berfc, cerfc;
real deltaEbot, deltaEsti, deltaEgat, atatbot, atatsti, atatgat;
real btatpartbot, btatpartsti, btatpartgat;
real fbbtbot, fbbtsti, fbbtgat;
real fstopbot, fstopsti, fstopgat, VBRinvbot, VBRinvsti, VBRinvgat;
real slopebot, slopesti, slopegat;
real vmaxbot, vmaxsti, vmaxgat, VMAX;
// declaration of variables calculated outside macro "juncapfunction", voltage-dependent part
real VAK, idmult, vj, z, zinv, two_psistar, vjlim, vjsrh, vbbt, vav;

View File

@ -1,303 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_ChargesNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////////
//
// Calculate NQS-charge contributions
//
///////////////////////////////////////////////
Qp1 = vnorm * V(SPLINE1);
Qp2 = vnorm * V(SPLINE2);
Qp3 = vnorm * V(SPLINE3);
Qp4 = vnorm * V(SPLINE4);
Qp5 = vnorm * V(SPLINE5);
Qp6 = vnorm * V(SPLINE6);
Qp7 = vnorm * V(SPLINE7);
Qp8 = vnorm * V(SPLINE8);
Qp9 = vnorm * V(SPLINE9);
Tnorm = 0.0;
if (SWNQS_i != 0) begin
// Dimension and mobility information is included in Tnorm
Tnorm = MUNQS_i * phit1 * BET_i / (COX_qm * Gmob_dL);
thesat2 = thesat1 * thesat1 * phit1 * phit1;
if (SWNQS_i == 1) begin
dQy = QpN - Qp0;
d2Qy = 6.0 * (Qp0 + QpN) - 12.0 * Qp1;
end else if (SWNQS_i == 2) begin
dQy = (-7.0 * Qp0 - 3.0 * Qp1 + 12.0 * Qp2 - 2.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * Qp0 + 9.0 * Qp1 - 6.0 * Qp2 + QpN);
end else if (SWNQS_i == 3) begin
dQy = (-13.0 * Qp0 - 6.0 * Qp1 + 24.0 * Qp2 - 6.0 * Qp3 + QpN) / 7.0;
d2Qy = (180.0 * Qp0 - 408.0 * Qp1 + 288.0 * Qp2 - 72.0 * Qp3 + 12.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-181.0 * Qp0 - 84.0 * Qp1 + 24.0 * Qp4 - 6.0 * Qp5 - 90.0 * Qp3 + QpN
+ 336.0 * Qp2) / 65.0;
d2Qy = (432.0 * Qp4 - 108.0 * Qp5 - 1620.0 * Qp3 + 18.0 * QpN + 3762.0 * Qp0
- 8532.0 * Qp1 + 6048.0 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * Qp6 + 23400.0 * Qp4 + 5.0 * QpN - 87330.0 * Qp3 + 120.0 * Qp8
- 450.0 * Qp7 - 81480.0 * Qp1 + 325920.0 * Qp2
-175565.0 * Qp0 - 30.0 * Qp9) / 37829.0 - 30.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp7 + 702000.0 * Qp4 - 2619900 * Qp3 - 13793100.0 * Qp1
+ 9777600.0 * Qp2 + 6081750.0 * Qp0 + 150.0 * QpN + 3600.0 * Qp8
- 900.0 * Qp9 + 50400 * Qp6) / 37829.0 - 900.0 / 181.0 * Qp5;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp1, xg, dQy, d2Qy, fk1)
end
if (SWNQS_i >= 2) begin
if (SWNQS_i == 2) begin
dQy = (2.0 * Qp0 - 12.0 * Qp1 + 3.0 * Qp2 + 7.0 * QpN) / 5.0;
d2Qy = -18.0 / 5.0 * (-4.0 * QpN + 9.0 * Qp2 - 6.0 * Qp1 + Qp0);
end else if (SWNQS_i == 3) begin
dQy = 0.5 * Qp0 - 3.0 * Qp1 + 3.0 * Qp3 - 0.5 * QpN;
d2Qy = (-48.0 * Qp0 + 288.0 * Qp1 - 480.0 * Qp2 + 288.0 * Qp3 - 48.0 * QpN) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (-291.0 * Qp1 - 6.0 * Qp2 - 84.0 * Qp4 + 21.0 * Qp5) / 65.0
+ (630.0 * Qp3 - 7.0 * QpN + 97.0 * Qp0) / 130.0;
d2Qy = (-1728.0 * Qp4 + 432.0 * Qp5 + 6480.0 * Qp3 - 72.0 * QpN - 1008 * Qp0
+ 6048 * Qp1 - 10152 * Qp2) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (-5880.0 * Qp6 - 81900.0 * Qp4 + 305655.0 * Qp3 - 420.0 * Qp8
+ 105.0 * Qp9 - 282255.0 * Qp1 + 1575.0 * Qp7 - 5850.0 * Qp2) / 37829.0
+ 105.0 / 181.0 * Qp5 + (94085.0 * Qp0 - 35.0 * QpN) / 75658.0;
d2Qy = (9777600.0 * Qp1 + 54000.0 * Qp7 - 2808000.0 * Qp4 + 10479600.0 * Qp3
- 16413000.0 * Qp2 - 1629600.0 * Qp0 - 600.0 * QpN - 14400.0 * Qp8
+ 3600.0 * Qp9 - 201600.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp2, xg, dQy, d2Qy, fk2)
end
if (SWNQS_i >= 3) begin
if (SWNQS_i == 3) begin
dQy = (13.0 * QpN + 6.0 * Qp3 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 7.0;
d2Qy = (180.0 * QpN - 408.0 * Qp3 + 288.0 * Qp2 - 72.0 * Qp1 + 12.0 * Qp0) / 7.0;
end else if (SWNQS_i == 5) begin
dQy = (QpN - 6.0 * Qp5 + 24.0 * Qp4 - 24.0 * Qp2 + 6.0 * Qp1 - Qp0) / 5.0;
d2Qy = (1296.0 * (Qp4 + Qp2) - 324.0 * (Qp5 + Qp1) - 2052.0 * Qp3
+ 54.0 * (QpN + Qp0)) / 13.0;
end else if (SWNQS_i == 9) begin
dQy = (21840.0 * Qp6 + 304200.0 * Qp4 + 65.0 * QpN - 420.0 * Qp3 + 1560.0 * Qp8
- 12605.0 * Qp0-390.0 * Qp9 + 75630.0 * Qp1 - 5850.0 * Qp7
- 302520.0 * Qp2) / 37829.0 - 390.0 / 181.0 * Qp5;
d2Qy = (-2619900.0 * Qp1 - 202500.0 * Qp7 + 10530000.0 * Qp4 - 16601100.0 * Qp3
+ 10479600.0 * Qp2 + 436650.0 * Qp0 + 2250.0 * QpN + 54000.0 * Qp8
- 13500.0 * Qp9 + 756000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp3, xg, dQy, d2Qy, fk3)
end
if (SWNQS_i >= 4) begin
if (SWNQS_i == 5) begin
dQy = (-630.0 * Qp3 + 12.0 * Qp4 + 582.0 * Qp5 - 97.0 * QpN + 7.0 * Qp0
- 42.0 * Qp1 + 168.0 * Qp2)/130.0;
d2Qy = (-10152.0 * Qp4 + 6048.0 * Qp5 + 6480.0 * Qp3 - 1008.0 * QpN
- 72.0 * Qp0 + 432.0 * Qp1 - 1728.0 * Qp2) / 65.0;
end
else if (SWNQS_i == 9) begin
dQy = (-81480.0 * Qp6 - 30.0 * Qp4 - 303975.0 * Qp3 - 5820.0 * Qp8
+ 1455.0 * Qp9 - 20265.0 * Qp1 + 21825.0 * Qp7 + 81060.0 * Qp2) / 37829.0
- 485.0 / 75658.0 * QpN + 1455.0 * Qp5 / 181.0 + 6755.0 * Qp0 / 75658.0;
d2Qy = (702000.0 * Qp1 + 756000.0 * Qp7 - 16614600.0 * Qp4 + 10530000.0 * Qp3
- 2808000.0 * Qp2 - 117000.0 * Qp0 - 8400.0 * QpN - 201600.0 * Qp8
+ 50400.0 * Qp9 - 2822400.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp4, xg, dQy, d2Qy, fk4)
end
if (SWNQS_i >= 5) begin
if (SWNQS_i == 5) begin
dQy = (-336.0 * Qp4 + 84.0 * Qp5 + 90.0 * Qp3 + 181.0 * QpN - Qp0 + 6.0 * Qp1
- 24.0 * Qp2) / 65.0;
d2Qy = (18.0 * Qp0 + 3762.0 * QpN + 6048.0 * Qp4 + 432.0 * Qp2 - 1620.0 * Qp3
- 108.0 * Qp1 - 8532.0 * Qp5) / 65.0;
end else if (SWNQS_i == 9) begin
dQy = (1680.0 * (Qp6 - Qp4) + 5.0 * (QpN - Qp0) + 450.0 * (Qp3 - Qp7)
+ 120.0 * (Qp8 - Qp2) - 30.0 * (Qp9 - Qp1)) / 209.0;
d2Qy = (-900.0 * (Qp1 + Qp9) - 13500.0 * (Qp7 + Qp3) - 79500.0 * Qp5
+ 50400.0 * (Qp4 + Qp6) + 3600.0 * (Qp2 + Qp8) + 150.0 * (Qp0 + QpN)) / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp5, xg, dQy, d2Qy, fk5)
end
if (SWNQS_i >= 6) begin
if (SWNQS_i == 9) begin
dQy = (30.0 * Qp6 + 81480.0 * Qp4 - 21825.0 * Qp3 - 81060.0 * Qp8 + 20265.0 * Qp9
- 1455.0 * Qp1 + 303975.0 * Qp7 + 5820.0 * Qp2) / 37829.0
-(6755.0 * QpN - 485.0 * Qp0) / 75658.0 - 1455.0 / 181.0 * Qp5;
d2Qy = (50400.0 * Qp1 + 10530000.0 * Qp7 - 2822400.0 * Qp4 + 756000.0 * Qp3
- 201600.0 * Qp2 - 8400.0 * Qp0 - 117000.0 * QpN - 2808000.0 * Qp8
+ 702000.0 * Qp9 - 16614600.0 * Qp6) / 37829.0 + 50400.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp6, xg, dQy, d2Qy, fk6)
end
if (SWNQS_i >= 7) begin
if (SWNQS_i == 9) begin
dQy = (-304200.0 * Qp6 - 21840.0 * Qp4 + 12605.0 * QpN + 5850.0 * Qp3
+ 302520.0 * Qp8 - 65.0 * Qp0 - 75630.0 * Qp9 + 390.0 * Qp1 + 420.0 * Qp7
- 1560.0 * Qp2) / 37829.0 + 390.0 / 181.0 * Qp5;
d2Qy = (-13500.0 * Qp1 - 16601100.0 * Qp7 + 756000.0 * Qp4 - 202500.0 * Qp3
+ 54000.0 * Qp2 + 2250.0 * Qp0 + 436650.0 * QpN + 10479600.0 * Qp8
- 2619900.0 * Qp9 + 10530000.0 * Qp6) / 37829.0 - 13500.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp7, xg, dQy, d2Qy, fk7)
end
if (SWNQS_i >= 8) begin
if (SWNQS_i == 9) begin
dQy = (81900.0 * Qp6 + 5880.0 * Qp4 - 1575.0 * Qp3 + 5850.0 * Qp8 + 282255.0 * Qp9
- 105.0 * Qp1 - 305655.0 * Qp7 + 420.0 * Qp2) / 37829.0 + (35.0 * Qp0
- 94085.0 * QpN) / 75658.0 - 105.0 / 181.0 * Qp5;
d2Qy = (3600.0 * Qp1 + 10479600.0 * Qp7 - 201600.0 * Qp4 + 54000.0 * Qp3
- 14400.0 * Qp2 - 600.0 * Qp0 - 1629600.0 * QpN - 16413000.0 * Qp8
+ 9777600.0 * Qp9 - 2808000.0 * Qp6) / 37829.0 + 3600.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp8, xg, dQy, d2Qy, fk8)
end
if (SWNQS_i >= 9) begin
if (SWNQS_i == 9) begin
dQy = (-23400.0 * Qp6 - 1680.0 * Qp4 + 175565.0 * QpN + 450.0 * Qp3
- 325920.0 * Qp8 - 5.0 * Qp0 + 81480.0 * Qp9 + 30.0 * Qp1
+ 87330.0 * Qp7 - 120.0 * Qp2) / 37829.0 + 30.0 * Qp5 / 181.0;
d2Qy = (-900.0 * Qp1 - 2619900.0 * Qp7 + 50400.0 * Qp4 - 13500.0 * Qp3
+ 3600.0 * Qp2 + 150.0 * Qp0 + 6081750.0 * QpN + 9777600.0 * Qp8
- 13793100.0 * Qp9 + 702000.0 * Qp6) / 37829.0 - 900.0 * Qp5 / 181.0;
end else begin
dQy = 0;
d2Qy = 0;
end
`fq(Qp9, xg, dQy, d2Qy, fk9)
end
//--------------------------------------------------------------------
// Terminal charges for NQS
if (SWNQS_i != 0) begin
if (SWNQS_i == 1) begin
QS_NQS = (17.0 * Qp0 + 30.0 * Qp1 + QpN) / 96.0;
QD_NQS = (Qp0 + 30.0 * Qp1 + 17.0 * QpN) / 96.0;
`QiToPhi(Qp1,xg, temp1)
QG_NQS = xg - (x_sp + 4.0 * temp1 + x_dp) * `oneSixth;
end else if (SWNQS_i == 2) begin
QS_NQS = (11.0 * Qp0 + 24.0 * Qp1 + 9.0 * Qp2 + QpN) / 90.0;
QD_NQS = (11.0 * QpN + 24.0 * Qp2 + 9.0 * Qp1 + Qp0) / 90.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
QG_NQS = xg - (x_sp + 3.0 * (temp1 + temp2) + x_dp) * 0.125;
end else if (SWNQS_i == 3) begin
QS_NQS = (251.0 * Qp0 + 594.0 * Qp1 + 312.0 * Qp2 + 174.0 * Qp3 + 13.0 * QpN) / 2688.0;
QD_NQS = (251.0 * QpN + 594.0 * Qp3 + 312.0 * Qp2 + 174.0 * Qp1 + 13.0 * Qp0) / 2688.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
QG_NQS = xg - (x_sp + 4.0 * temp1 + 2.0 * temp2 + 4.0 * temp3 + x_dp) / 12.0;
end else if (SWNQS_i == 5) begin
QS_NQS = (1187.0 * Qp0 + 43.0 * QpN) / 18720.0 + (503.0 * Qp1 + 172.0 * Qp4
+ 87.0 * Qp5 + 265.0 * Qp3 + 328.0 * Qp2) / 3120.0;
QD_NQS = (1187.0 * QpN + 43.0 * Qp0) / 18720.0 + (503.0 * Qp5 + 172.0 * Qp2
+ 87.0 * Qp1 + 265.0 * Qp3 + 328.0 * Qp4) / 3120.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
`QiToPhi(Qp4, xg, temp4)
`QiToPhi(Qp5, xg, temp5)
QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5) + 2.0 * (temp2 + temp4) + x_dp) / 18.0;
end else if (SWNQS_i == 9) begin
QS_NQS = (75653.0 * Qp8 + 225999.0 * Qp4) / 3782900.0 + (151321.0 * Qp9
+ 454023.0 * Qp7 + 1073767.0 * Qp3 + 1564569.0 * Qp1) / 15131600.0
+ 75623.0 * Qp6 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp2 / 945725.0
+ (3504517.0 * Qp0 + 75653.0 * QpN) / 90789600.0;
QD_NQS = (75653.0 * Qp2 + 225999.0 * Qp6) / 3782900.0 + (151321.0 * Qp1
+ 454023.0 * Qp3 + 1073767.0 * Qp7 + 1564569.0 * Qp9) / 15131600.0
+ 75623.0 * Qp4 / 1891450.0 + 145.0 * Qp5 / 2896.0 + 72263.0 * Qp8 / 945725.0
+ (3504517.0 * QpN + 75653.0 * Qp0) / 90789600.0;
`QiToPhi(Qp1, xg, temp1)
`QiToPhi(Qp2, xg, temp2)
`QiToPhi(Qp3, xg, temp3)
`QiToPhi(Qp4, xg, temp4)
`QiToPhi(Qp5, xg, temp5)
`QiToPhi(Qp6, xg, temp6)
`QiToPhi(Qp7, xg, temp7)
`QiToPhi(Qp8, xg, temp8)
`QiToPhi(Qp9, xg, temp9)
QG_NQS = xg - (x_sp + 4.0 * (temp1 + temp3 + temp5 + temp7 + temp9)
+ 2.0 * (temp2 + temp4 + temp6 + temp8) + x_dp) / 30.0;
end
QG_NQS = pd * QG_NQS;
if (sigVds > 0) begin
Qs = COX_qm * phit1 * QS_NQS;
Qd = COX_qm * phit1 * QD_NQS;
end else begin
Qs = COX_qm * phit1 * QD_NQS;
Qd = COX_qm * phit1 * QS_NQS;
end
Qg = COX_qm * phit1 * QG_NQS;
Qb = -Qg - Qs - Qd;
end
// Update internal nodes
V(RES1) <+ vnorm_inv * I(RES1) * r_nqs;
V(SPLINE1) <+ idt(-vnorm_inv * Tnorm * fk1, Qp1_0);
V(RES2) <+ vnorm_inv * I(RES2) * r_nqs;
V(SPLINE2) <+ idt(-vnorm_inv * Tnorm * fk2, Qp2_0);
V(RES3) <+ vnorm_inv * I(RES3) * r_nqs;
V(SPLINE3) <+ idt(-vnorm_inv * Tnorm * fk3, Qp3_0);
V(RES4) <+ vnorm_inv * I(RES4) * r_nqs;
V(SPLINE4) <+ idt(-vnorm_inv * Tnorm * fk4, Qp4_0);
V(RES5) <+ vnorm_inv * I(RES5) * r_nqs;
V(SPLINE5) <+ idt(-vnorm_inv * Tnorm * fk5, Qp5_0);
V(RES6) <+ vnorm_inv * I(RES6) * r_nqs;
V(SPLINE6) <+ idt(-vnorm_inv * Tnorm * fk6, Qp6_0);
V(RES7) <+ vnorm_inv * I(RES7) * r_nqs;
V(SPLINE7) <+ idt(-vnorm_inv * Tnorm * fk7, Qp7_0);
V(RES8) <+ vnorm_inv * I(RES8) * r_nqs;
V(SPLINE8) <+ idt(-vnorm_inv * Tnorm * fk8, Qp8_0);
V(RES9) <+ vnorm_inv * I(RES9) * r_nqs;
V(SPLINE9) <+ idt(-vnorm_inv * Tnorm * fk9, Qp9_0);

View File

@ -1,190 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_InitNQS.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
/////////////////////////////////////////////////////////////////////////////
//
// Computing initial (dc) values for internal nodes.
// This code is independent of internal-node voltages
//
/////////////////////////////////////////////////////////////////////////////
Qp1_0 = 0.0;
Qp2_0 = 0.0;
Qp3_0 = 0.0;
Qp4_0 = 0.0;
Qp5_0 = 0.0;
Qp6_0 = 0.0;
Qp7_0 = 0.0;
Qp8_0 = 0.0;
Qp9_0 = 0.0;
fk1 = 0.0;
fk2 = 0.0;
fk3 = 0.0;
fk4 = 0.0;
fk5 = 0.0;
fk6 = 0.0;
fk7 = 0.0;
fk8 = 0.0;
fk9 = 0.0;
if (SWNQS_i != 0) begin
dQis = 0.0;
dQy = 0.0;
dfQi = 0.0;
fQi = 0.0;
d2Qy = 0.0;
Qp1 = 0.0;
Qp2 = 0.0;
Qp3 = 0.0;
Qp4 = 0.0;
Qp5 = 0.0;
Qp6 = 0.0;
Qp7 = 0.0;
Qp8 = 0.0;
Qp9 = 0.0;
phi_p1 = 0.0;
phi_p2 = 0.0;
phi_p3 = 0.0;
phi_p4 = 0.0;
phi_p5 = 0.0;
phi_p6 = 0.0;
phi_p7 = 0.0;
phi_p8 = 0.0;
phi_p9 = 0.0;
// Setting initial values for charge along the channel
// from interpolated DC-solution
if (xg > 0) begin
if (SWNQS_i == 1) begin
phi_p1 = `Phiy(0.5);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
end else if (SWNQS_i == 2) begin
phi_p1 = `Phiy(`oneThird);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`twoThirds);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp2_0)
end
end else if (SWNQS_i == 3) begin
phi_p1 = `Phiy(0.25);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.5);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.75);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp3_0)
end
end else if (SWNQS_i == 5) begin
phi_p1 = `Phiy(`oneSixth);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(`oneThird);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.5);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(`twoThirds);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.8333333333333333);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp5_0)
`swap(Qp2_0, Qp4_0)
end
end else if (SWNQS_i == 9) begin
phi_p1 = `Phiy(0.1);
`PhiToQb(phi_p1,Qb_tmp)
Qp1_0 = -pd * (xg - phi_p1) - Qb_tmp;
phi_p2 = `Phiy(0.2);
`PhiToQb(phi_p2,Qb_tmp)
Qp2_0 = -pd * (xg - phi_p2) - Qb_tmp;
phi_p3 = `Phiy(0.3);
`PhiToQb(phi_p3,Qb_tmp)
Qp3_0 = -pd * (xg - phi_p3) - Qb_tmp;
phi_p4 = `Phiy(0.4);
`PhiToQb(phi_p4,Qb_tmp)
Qp4_0 = -pd * (xg - phi_p4) - Qb_tmp;
phi_p5 = `Phiy(0.5);
`PhiToQb(phi_p5,Qb_tmp)
Qp5_0 = -pd * (xg - phi_p5) - Qb_tmp;
phi_p6 = `Phiy(0.6);
`PhiToQb(phi_p6,Qb_tmp)
Qp6_0 = -pd * (xg - phi_p6) - Qb_tmp;
phi_p7 = `Phiy(0.7);
`PhiToQb(phi_p7,Qb_tmp)
Qp7_0 = -pd * (xg - phi_p7) - Qb_tmp;
phi_p8 = `Phiy(0.8);
`PhiToQb(phi_p8,Qb_tmp)
Qp8_0 = -pd * (xg - phi_p8) - Qb_tmp;
phi_p9 = `Phiy(0.9);
`PhiToQb(phi_p9,Qb_tmp)
Qp9_0 = -pd * (xg - phi_p9) - Qb_tmp;
if (sigVds < 0) begin
`swap(Qp1_0, Qp9_0)
`swap(Qp2_0, Qp8_0)
`swap(Qp3_0, Qp7_0)
`swap(Qp4_0, Qp6_0)
end
end
end // (x_g >0)
end // (SWNQS_i != 0)
x_sp = 0.0;
x_dp = 0.0;
Qp0 = 0.0;
QpN = 0.0;
if (SWNQS_i != 0.0) begin
x_sp = x_m - sigVds * 0.5 * dps * inv_phit1;
x_dp = x_m + sigVds * 0.5 * dps * inv_phit1;
Qp0 = 0.0;
QpN = 0.0;
if (x_sp > 0) begin
`PhiToQb(x_sp, QbSIGN)
Qp0 = -pd * (xg - x_sp) - QbSIGN;
end
if (x_dp > 0) begin
`PhiToQb(x_dp, QbSIGN)
QpN = -pd * (xg - x_dp) - QbSIGN;
end
end

View File

@ -1,127 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_binning.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
// auxiliary variables
iLEWE = iLE * iWE;
iiLE = LE / LEN;
iiWE = WE / WEN;
iiLEWE = iiLE * iiWE;
iiiLEWE = iiWE / iiLE;
// auxiliary variables for COX only
iiLEcv = LEcv / LEN;
iiWEcv = WEcv / WEN;
iiLEWEcv = iiLEcv * iiWEcv;
// auxiliary variables for CGOV only
iLEcv = LEN / LEcv;
iiiLEWEcv = iiWEcv / iiLEcv;
// auxiliary variables for CGBOV only
iiLcv = Lcv / LEN;
iiWcv = Wcv / WEN;
iiLWcv = iiLcv * iiWcv;
// auxiliary variables for CFR only
iLcv = LEN / Lcv;
iiiLWcv = iiWcv / iiLcv;
// Process parameters
VFB = POVFB + iLE * PLVFB + iWE * PWVFB + iLEWE * PLWVFB;
STVFB = POSTVFB + iLE * PLSTVFB + iWE * PWSTVFB + iLEWE * PLWSTVFB;
TOX = POTOX;
NEFF = PONEFF + iLE * PLNEFF + iWE * PWNEFF + iLEWE * PLWNEFF;
VNSUB = POVNSUB;
NSLP = PONSLP;
DNSUB = PODNSUB;
DPHIB = PODPHIB + iLE * PLDPHIB + iWE * PWDPHIB + iLEWE * PLWDPHIB;
NP = PONP + iLE * PLNP + iWE * PWNP + iLEWE * PLWNP;
CT = POCT + iLE * PLCT + iWE * PWCT + iLEWE * PLWCT;
TOXOV = POTOXOV;
NOV = PONOV + iLE * PLNOV + iWE * PWNOV + iLEWE * PLWNOV;
// DIBL parameters
CF = POCF + iLE * PLCF + iWE * PWCF + iLEWE * PLWCF;
CFB = POCFB;
// Mobility parameters
BETN = POBETN + iLE * PLBETN + iiWE * PWBETN + iiiLEWE * PLWBETN;
STBET = POSTBET + iLE * PLSTBET + iWE * PWSTBET + iLEWE * PLWSTBET;
MUE = POMUE + iLE * PLMUE + iWE * PWMUE + iLEWE * PLWMUE;
STMUE = POSTMUE;
THEMU = POTHEMU;
STTHEMU = POSTTHEMU;
CS = POCS + iLE * PLCS + iWE * PWCS + iLEWE * PLWCS;
STCS = POSTCS;
XCOR = POXCOR + iLE * PLXCOR + iWE * PWXCOR + iLEWE * PLWXCOR;
STXCOR = POSTXCOR;
FETA = POFETA;
// Series resistance parameters
RS = PORS + iLE * PLRS + iWE * PWRS + iLEWE * PLWRS;
STRS = POSTRS;
RSB = PORSB;
RSG = PORSG;
// Velocity saturation parameters
THESAT = POTHESAT + iLE * PLTHESAT + iWE * PWTHESAT + iLEWE * PLWTHESAT;
STTHESAT = POSTTHESAT + iLE * PLSTTHESAT + iWE * PWSTTHESAT + iLEWE * PLWSTTHESAT;
THESATB = POTHESATB + iLE * PLTHESATB + iWE * PWTHESATB + iLEWE * PLWTHESATB;
THESATG = POTHESATG + iLE * PLTHESATG + iWE * PWTHESATG + iLEWE * PLWTHESATG;
// Saturation voltage parameters
AX = POAX + iLE * PLAX + iWE * PWAX + iLEWE * PLWAX;
// Channel length modulation (CLM) parameters
ALP = POALP + iLE * PLALP + iWE * PWALP + iLEWE * PLWALP;
ALP1 = POALP1 + iLE * PLALP1 + iWE * PWALP1 + iLEWE * PLWALP1;
ALP2 = POALP2 + iLE * PLALP2 + iWE * PWALP2 + iLEWE * PLWALP2;
VP = POVP;
// Impact ionization parameters
A1 = POA1 + iLE * PLA1 + iWE * PWA1 + iLEWE * PLWA1;
A2 = POA2;
STA2 = POSTA2;
A3 = POA3 + iLE * PLA3 + iWE * PWA3 + iLEWE * PLWA3;
A4 = POA4 + iLE * PLA4 + iWE * PWA4 + iLEWE * PLWA4;
GCO = POGCO;
// Gate current parameters
IGINV = POIGINV + iiLE * PLIGINV + iiWE * PWIGINV + iiLEWE * PLWIGINV;
IGOV = POIGOV + iLE * PLIGOV + iiWE * PWIGOV + iiiLEWE * PLWIGOV;
STIG = POSTIG;
GC2 = POGC2;
GC3 = POGC3;
CHIB = POCHIB;
// Gate-induced drain leakage (GIDL) parameters
AGIDL = POAGIDL + iLE * PLAGIDL + iiWE * PWAGIDL + iiiLEWE * PLWAGIDL;
BGIDL = POBGIDL;
STBGIDL = POSTBGIDL;
CGIDL = POCGIDL;
// Charge model parameters
COX = POCOX + iiLEcv * PLCOX + iiWEcv * PWCOX + iiLEWEcv * PLWCOX;
CGOV = POCGOV + iLEcv * PLCGOV + iiWEcv * PWCGOV + iiiLEWEcv * PLWCGOV;
CGBOV = POCGBOV + iiLcv * PLCGBOV + iiWcv * PWCGBOV + iiLWcv * PLWCGBOV;
CFR = POCFR + iLcv * PLCFR + iiWcv * PWCFR + iiiLWcv * PLWCFR;
// Noise model parameters
FNT = POFNT;
NFA = PONFA + iLE * PLNFA + iWE * PWNFA + iLEWE * PLWNFA;
NFB = PONFB + iLE * PLNFB + iWE * PWNFB + iLEWE * PLWNFB;
NFC = PONFC + iLE * PLNFC + iWE * PWNFC + iLEWE * PLWNFC;

View File

@ -1,233 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_binpars.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
///////////////////////////////////////////////////
// PSP global model parameters (binning)
///////////////////////////////////////////////////
parameter real LEVEL = 1021 `P(info="Model level" unit="" );
parameter real TYPE = 1 `from( -1.0,1.0 ) `P(info="Channel type parameter, +1=NMOS -1=PMOS" unit="" );
parameter real TR = 21 `from( -273.0,inf ) `P(info="nominal (reference) temperature" unit="C" );
// Switch parameters
parameter real SWIGATE = 0 `from( 0.0,1.0 ) `P(info="Flag for gate current, 0=turn off IG" unit="" );
parameter real SWIMPACT = 0 `from( 0.0,1.0 ) `P(info="Flag for impact ionization current, 0=turn off II" unit="" );
parameter real SWGIDL = 0 `from( 0.0,1.0 ) `P(info="Flag for GIDL current, 0=turn off IGIDL" unit="" );
parameter real SWJUNCAP = 0 `from( 0.0,3.0 ) `P(info="Flag for juncap, 0=turn off juncap" unit="" );
parameter real QMC = 1 `from( 0.0,inf ) `P(info="Quantum-mechanical correction factor" unit="" );
// Process parameters
parameter real LVARO = 0 `P(info="Geometry independent difference between actual and programmed poly-silicon gate length" unit="m" );
parameter real LVARL = 0 `P(info="Length dependence of difference between actual and programmed poly-silicon gate length" unit="" );
parameter real LAP = 0 `P(info="Effective channel length reduction per side due to lateral diffusion of source/drain dopant ions" unit="m" );
parameter real WVARO = 0 `P(info="Geometry independent difference between actual and programmed field-oxide opening" unit="m" );
parameter real WVARW = 0 `P(info="Width dependence of difference between actual and programmed field-oxide opening" unit="" );
parameter real WOT = 0 `P(info="Effective reduction of channel width per side due to lateral diffusion of channel-stop dopant ions" unit="m" );
parameter real DLQ = 0 `P(info="Effective channel length reduction for CV" unit="m" );
parameter real DWQ = 0 `P(info="Effective channel width reduction for CV" unit="m" );
parameter real POVFB = -1 `P(info="Coefficient for the geometry independent part of VFB" unit="V" );
parameter real PLVFB = 0.0 `P(info="Coefficient for the length dependence of VFB" unit="V" );
parameter real PWVFB = 0.0 `P(info="Coefficient for the width dependence of VFB" unit="V" );
parameter real PLWVFB = 0.0 `P(info="Coefficient for the length times width dependence of VFB" unit="V" );
parameter real POSTVFB = 0.0005 `P(info="Coefficient for the geometry independent part of STVFB" unit="V/K" );
parameter real PLSTVFB = 0.0 `P(info="Coefficient for the length dependence of STVFB" unit="V/K" );
parameter real PWSTVFB = 0.0 `P(info="Coefficient for the width dependence of STVFB" unit="V/K" );
parameter real PLWSTVFB = 0.0 `P(info="Coefficient for the length times width dependence of STVFB" unit="V/K" );
parameter real POTOX = 2E-09 `P(info="Coefficient for the geometry independent part of TOX" unit="m" );
parameter real PONEFF = 5E+23 `P(info="Coefficient for the geometry independent part of NEFF" unit="m^-3" );
parameter real PLNEFF = 0.0 `P(info="Coefficient for the length dependence of NEFF" unit="m^-3" );
parameter real PWNEFF = 0.0 `P(info="Coefficient for the width dependence of NEFF" unit="m^-3" );
parameter real PLWNEFF = 0.0 `P(info="Coefficient for the length times width dependence of NEFF" unit="m^-3" );
parameter real POVNSUB = 0 `P(info="Coefficient for the geometry independent part of VNSUB" unit="V" );
parameter real PONSLP = 0.05 `P(info="Coefficient for the geometry independent part of NSLP" unit="V" );
parameter real PODNSUB = 0 `P(info="Coefficient for the geometry independent part of DNSUB" unit="V^-1" );
parameter real PODPHIB = 0 `P(info="Coefficient for the geometry independent part of DPHIB" unit="V" );
parameter real PLDPHIB = 0.0 `P(info="Coefficient for the length dependence of DPHIB" unit="V" );
parameter real PWDPHIB = 0.0 `P(info="Coefficient for the width dependence of DPHIB" unit="V" );
parameter real PLWDPHIB = 0.0 `P(info="Coefficient for the length times width dependence of DPHIB" unit="V" );
parameter real PONP = 1E+26 `P(info="Coefficient for the geometry independent part of NP" unit="m^-3" );
parameter real PLNP = 0.0 `P(info="Coefficient for the length dependence of NP" unit="m^-3" );
parameter real PWNP = 0.0 `P(info="Coefficient for the width dependence of NP" unit="m^-3" );
parameter real PLWNP = 0.0 `P(info="Coefficient for the length times width dependence of NP" unit="m^-3" );
parameter real POCT = 0 `P(info="Coefficient for the geometry independent part of CT" unit="" );
parameter real PLCT = 0.0 `P(info="Coefficient for the length dependence of CT" unit="" );
parameter real PWCT = 0.0 `P(info="Coefficient for the width dependence of CT" unit="" );
parameter real PLWCT = 0.0 `P(info="Coefficient for the length times width dependence of CT" unit="" );
parameter real POTOXOV = 2E-09 `P(info="Coefficient for the geometry independent part of TOXOV" unit="m" );
parameter real PONOV = 5E+25 `P(info="Coefficient for the geometry independent part of NOV" unit="m^-3" );
parameter real PLNOV = 0.0 `P(info="Coefficient for the length dependence of NOV" unit="m^-3" );
parameter real PWNOV = 0.0 `P(info="Coefficient for the width dependence of NOV" unit="m^-3" );
parameter real PLWNOV = 0.0 `P(info="Coefficient for the length times width dependence of NOV" unit="m^-3" );
// DIBL parameters
parameter real POCF = 0 `P(info="Coefficient for the geometry independent part of CF" unit="V^-1" );
parameter real PLCF = 0.0 `P(info="Coefficient for the length dependence of CF" unit="V^-1" );
parameter real PWCF = 0.0 `P(info="Coefficient for the width dependence of CF" unit="V^-1" );
parameter real PLWCF = 0.0 `P(info="Coefficient for the length times width dependence of CF" unit="V^-1" );
parameter real POCFB = 0 `P(info="Coefficient for the geometry independent part of CFB" unit="V^-1" );
// Mobility parameters
parameter real POBETN = 0.07 `P(info="Coefficient for the geometry independent part of BETN" unit="m^2/V/s" );
parameter real PLBETN = 0.0 `P(info="Coefficient for the length dependence of BETN" unit="m^2/V/s" );
parameter real PWBETN = 0.0 `P(info="Coefficient for the width dependence of BETN" unit="m^2/V/s" );
parameter real PLWBETN = 0.0 `P(info="Coefficient for the length times width dependence of BETN" unit="m^2/V/s" );
parameter real POSTBET = 1 `P(info="Coefficient for the geometry independent part of STBET" unit="" );
parameter real PLSTBET = 0.0 `P(info="Coefficient for the length dependence of STBET" unit="" );
parameter real PWSTBET = 0.0 `P(info="Coefficient for the width dependence of STBET" unit="" );
parameter real PLWSTBET = 0.0 `P(info="Coefficient for the length times width dependence of STBET" unit="" );
parameter real POMUE = 0.5 `P(info="Coefficient for the geometry independent part of MUE" unit="m/V" );
parameter real PLMUE = 0.0 `P(info="Coefficient for the length dependence of MUE" unit="m/V" );
parameter real PWMUE = 0.0 `P(info="Coefficient for the width dependence of MUE" unit="m/V" );
parameter real PLWMUE = 0.0 `P(info="Coefficient for the length times width dependence of MUE" unit="m/V" );
parameter real POSTMUE = 0 `P(info="Coefficient for the geometry independent part of STMUE" unit="" );
parameter real POTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of THEMU" unit="" );
parameter real POSTTHEMU = 1.5 `P(info="Coefficient for the geometry independent part of STTHEMU" unit="" );
parameter real POCS = 0 `P(info="Coefficient for the geometry independent part of CS" unit="" );
parameter real PLCS = 0.0 `P(info="Coefficient for the length dependence of CS" unit="" );
parameter real PWCS = 0.0 `P(info="Coefficient for the width dependence of CS" unit="" );
parameter real PLWCS = 0.0 `P(info="Coefficient for the length times width dependence of CS" unit="" );
parameter real POSTCS = 0 `P(info="Coefficient for the geometry independent part of STCS" unit="" );
parameter real POXCOR = 0 `P(info="Coefficient for the geometry independent part of XCOR" unit="V^-1" );
parameter real PLXCOR = 0.0 `P(info="Coefficient for the length dependence of XCOR" unit="V^-1" );
parameter real PWXCOR = 0.0 `P(info="Coefficient for the width dependence of XCOR" unit="V^-1" );
parameter real PLWXCOR = 0.0 `P(info="Coefficient for the length times width dependence of XCOR" unit="V^-1" );
parameter real POSTXCOR = 0 `P(info="Coefficient for the geometry independent part of STXCOR" unit="" );
parameter real POFETA = 1 `P(info="Coefficient for the geometry independent part of FETA" unit="" );
// Series resistance parameters
parameter real PORS = 30 `P(info="Coefficient for the geometry independent part of RS" unit="Ohm" );
parameter real PLRS = 0.0 `P(info="Coefficient for the length dependence of RS" unit="Ohm" );
parameter real PWRS = 0.0 `P(info="Coefficient for the width dependence of RS" unit="Ohm" );
parameter real PLWRS = 0.0 `P(info="Coefficient for the length times width dependence of RS" unit="Ohm" );
parameter real POSTRS = 1 `P(info="Coefficient for the geometry independent part of STRS" unit="" );
parameter real PORSB = 0 `P(info="Coefficient for the geometry independent part of RSB" unit="V^-1" );
parameter real PORSG = 0 `P(info="Coefficient for the geometry independent part of RSG" unit="V^-1" );
// Velocity saturation parameters
parameter real POTHESAT = 1 `P(info="Coefficient for the geometry independent part of THESAT" unit="V^-1" );
parameter real PLTHESAT = 0.0 `P(info="Coefficient for the length dependence of THESAT" unit="V^-1" );
parameter real PWTHESAT = 0.0 `P(info="Coefficient for the width dependence of THESAT" unit="V^-1" );
parameter real PLWTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of THESAT" unit="V^-1" );
parameter real POSTTHESAT = 1 `P(info="Coefficient for the geometry independent part of STTHESAT" unit="" );
parameter real PLSTTHESAT = 0.0 `P(info="Coefficient for the length dependence of STTHESAT" unit="" );
parameter real PWSTTHESAT = 0.0 `P(info="Coefficient for the width dependence of STTHESAT" unit="" );
parameter real PLWSTTHESAT = 0.0 `P(info="Coefficient for the length times width dependence of STTHESAT" unit="" );
parameter real POTHESATB = 0 `P(info="Coefficient for the geometry independent part of THESATB" unit="V^-1" );
parameter real PLTHESATB = 0.0 `P(info="Coefficient for the length dependence of THESATB" unit="V^-1" );
parameter real PWTHESATB = 0.0 `P(info="Coefficient for the width dependence of THESATB" unit="V^-1" );
parameter real PLWTHESATB = 0.0 `P(info="Coefficient for the length times width dependence of THESATB" unit="V^-1" );
parameter real POTHESATG = 0 `P(info="Coefficient for the geometry independent part of THESATG" unit="V^-1" );
parameter real PLTHESATG = 0.0 `P(info="Coefficient for the length dependence of THESATG" unit="V^-1" );
parameter real PWTHESATG = 0.0 `P(info="Coefficient for the width dependence of THESATG" unit="V^-1" );
parameter real PLWTHESATG = 0.0 `P(info="Coefficient for the length times width dependence of THESATG" unit="V^-1" );
// Saturation voltage parameters
parameter real POAX = 3 `P(info="Coefficient for the geometry independent part of AX" unit="" );
parameter real PLAX = 0.0 `P(info="Coefficient for the length dependence of AX" unit="" );
parameter real PWAX = 0.0 `P(info="Coefficient for the width dependence of AX" unit="" );
parameter real PLWAX = 0.0 `P(info="Coefficient for the length times width dependence of AX" unit="" );
// Channel length modulation (CLM) parameters
parameter real POALP = 0.01 `P(info="Coefficient for the geometry independent part of ALP" unit="" );
parameter real PLALP = 0.0 `P(info="Coefficient for the length dependence of ALP" unit="" );
parameter real PWALP = 0.0 `P(info="Coefficient for the width dependence of ALP" unit="" );
parameter real PLWALP = 0.0 `P(info="Coefficient for the length times width dependence of ALP" unit="" );
parameter real POALP1 = 0 `P(info="Coefficient for the geometry independent part of ALP1" unit="V" );
parameter real PLALP1 = 0.0 `P(info="Coefficient for the length dependence of ALP1" unit="V" );
parameter real PWALP1 = 0.0 `P(info="Coefficient for the width dependence of ALP1" unit="V" );
parameter real PLWALP1 = 0.0 `P(info="Coefficient for the length times width dependence of ALP1" unit="V" );
parameter real POALP2 = 0 `P(info="Coefficient for the geometry independent part of ALP2" unit="V^-1" );
parameter real PLALP2 = 0.0 `P(info="Coefficient for the length dependence of ALP2" unit="V^-1" );
parameter real PWALP2 = 0.0 `P(info="Coefficient for the width dependence of ALP2" unit="V^-1" );
parameter real PLWALP2 = 0.0 `P(info="Coefficient for the length times width dependence of ALP2" unit="V^-1" );
parameter real POVP = 0.05 `P(info="Coefficient for the geometry independent part of VP" unit="V" );
// Impact ionization parameters
parameter real POA1 = 1 `P(info="Coefficient for the geometry independent part of A1" unit="" );
parameter real PLA1 = 0.0 `P(info="Coefficient for the length dependence of A1" unit="" );
parameter real PWA1 = 0.0 `P(info="Coefficient for the width dependence of A1" unit="" );
parameter real PLWA1 = 0.0 `P(info="Coefficient for the length times width dependence of A1" unit="" );
parameter real POA2 = 10 `P(info="Coefficient for the geometry independent part of A2" unit="V" );
parameter real POSTA2 = 0 `P(info="Coefficient for the geometry independent part of STA2" unit="V" );
parameter real POA3 = 1 `P(info="Coefficient for the geometry independent part of A3" unit="" );
parameter real PLA3 = 0.0 `P(info="Coefficient for the length dependence of A3" unit="" );
parameter real PWA3 = 0.0 `P(info="Coefficient for the width dependence of A3" unit="" );
parameter real PLWA3 = 0.0 `P(info="Coefficient for the length times width dependence of A3" unit="" );
parameter real POA4 = 0 `P(info="Coefficient for the geometry independent part of A4" unit="V^-0.5" );
parameter real PLA4 = 0.0 `P(info="Coefficient for the length dependence of A4" unit="V^-0.5" );
parameter real PWA4 = 0.0 `P(info="Coefficient for the width dependence of A4" unit="V^-0.5" );
parameter real PLWA4 = 0.0 `P(info="Coefficient for the length times width dependence of A4" unit="V^-0.5" );
parameter real POGCO = 0 `P(info="Coefficient for the geometry independent part of GCO" unit="" );
// Gate current parameters
parameter real POIGINV = 0 `P(info="Coefficient for the geometry independent part of IGINV" unit="A" );
parameter real PLIGINV = 0.0 `P(info="Coefficient for the length dependence of IGINV" unit="A" );
parameter real PWIGINV = 0.0 `P(info="Coefficient for the width dependence of IGINV" unit="A" );
parameter real PLWIGINV = 0.0 `P(info="Coefficient for the length times width dependence of IGINV" unit="A" );
parameter real POIGOV = 0 `P(info="Coefficient for the geometry independent part of IGOV" unit="A" );
parameter real PLIGOV = 0.0 `P(info="Coefficient for the length dependence of IGOV" unit="A" );
parameter real PWIGOV = 0.0 `P(info="Coefficient for the width dependence of IGOV" unit="A" );
parameter real PLWIGOV = 0.0 `P(info="Coefficient for the length times width dependence of IGOV" unit="A" );
parameter real POSTIG = 2 `P(info="Coefficient for the geometry independent part of STIG" unit="" );
parameter real POGC2 = 0.375 `P(info="Coefficient for the geometry independent part of GC2" unit="" );
parameter real POGC3 = 0.063 `P(info="Coefficient for the geometry independent part of GC3" unit="" );
parameter real POCHIB = 3.1 `P(info="Coefficient for the geometry independent part of CHIB" unit="V" );
// Gate-induced drain leakage (GIDL) parameters
parameter real POAGIDL = 0 `P(info="Coefficient for the geometry independent part of AGIDL" unit="A/V^3" );
parameter real PLAGIDL = 0.0 `P(info="Coefficient for the length dependence of AGIDL" unit="A/V^3" );
parameter real PWAGIDL = 0.0 `P(info="Coefficient for the width dependence of AGIDL" unit="A/V^3" );
parameter real PLWAGIDL = 0.0 `P(info="Coefficient for the length times width dependence of AGIDL" unit="A/V^3" );
parameter real POBGIDL = 41 `P(info="Coefficient for the geometry independent part of BGIDL" unit="V" );
parameter real POSTBGIDL = 0 `P(info="Coefficient for the geometry independent part of STBGIDL" unit="V/K" );
parameter real POCGIDL = 0 `P(info="Coefficient for the geometry independent part of CGIDL" unit="" );
// Charge model parameters
parameter real POCOX = 1E-14 `P(info="Coefficient for the geometry independent part of COX" unit="F" );
parameter real PLCOX = 0.0 `P(info="Coefficient for the length dependence of COX" unit="F" );
parameter real PWCOX = 0.0 `P(info="Coefficient for the width dependence of COX" unit="F" );
parameter real PLWCOX = 0.0 `P(info="Coefficient for the length times width dependence of COX" unit="F" );
parameter real POCGOV = 1E-15 `P(info="Coefficient for the geometry independent part of CGOV" unit="F" );
parameter real PLCGOV = 0.0 `P(info="Coefficient for the length dependence of CGOV" unit="F" );
parameter real PWCGOV = 0.0 `P(info="Coefficient for the width dependence of CGOV" unit="F" );
parameter real PLWCGOV = 0.0 `P(info="Coefficient for the length times width dependence of CGOV" unit="F" );
parameter real POCGBOV = 0 `P(info="Coefficient for the geometry independent part of CGBOV" unit="F" );
parameter real PLCGBOV = 0.0 `P(info="Coefficient for the length dependence of CGBOV" unit="F" );
parameter real PWCGBOV = 0.0 `P(info="Coefficient for the width dependence of CGBOV" unit="F" );
parameter real PLWCGBOV = 0.0 `P(info="Coefficient for the length times width dependence of CGBOV" unit="F" );
parameter real POCFR = 0 `P(info="Coefficient for the geometry independent part of CFR" unit="F" );
parameter real PLCFR = 0.0 `P(info="Coefficient for the length dependence of CFR" unit="F" );
parameter real PWCFR = 0.0 `P(info="Coefficient for the width dependence of CFR" unit="F" );
parameter real PLWCFR = 0.0 `P(info="Coefficient for the length times width dependence of CFR" unit="F" );
// Noise model parameters
parameter real POFNT = 1 `P(info="Coefficient for the geometry independent part of FNT" unit="" );
parameter real PONFA = 8E+22 `P(info="Coefficient for the geometry independent part of NFA" unit="V^-1/m^4" );
parameter real PLNFA = 0.0 `P(info="Coefficient for the length dependence of NFA" unit="V^-1/m^4" );
parameter real PWNFA = 0.0 `P(info="Coefficient for the width dependence of NFA" unit="V^-1/m^4" );
parameter real PLWNFA = 0.0 `P(info="Coefficient for the length times width dependence of NFA" unit="V^-1/m^4" );
parameter real PONFB = 3E+07 `P(info="Coefficient for the geometry independent part of NFB" unit="V^-1/m^2" );
parameter real PLNFB = 0.0 `P(info="Coefficient for the length dependence of NFB" unit="V^-1/m^2" );
parameter real PWNFB = 0.0 `P(info="Coefficient for the width dependence of NFB" unit="V^-1/m^2" );
parameter real PLWNFB = 0.0 `P(info="Coefficient for the length times width dependence of NFB" unit="V^-1/m^2" );
parameter real PONFC = 0 `P(info="Coefficient for the geometry independent part of NFC" unit="V^-1" );
parameter real PLNFC = 0.0 `P(info="Coefficient for the length dependence of NFC" unit="V^-1" );
parameter real PWNFC = 0.0 `P(info="Coefficient for the width dependence of NFC" unit="V^-1" );
parameter real PLWNFC = 0.0 `P(info="Coefficient for the length times width dependence of NFC" unit="V^-1" );
// Other parameters
parameter real DTA = 0 `P(info="Temperature offset w.r.t. ambient temperature" unit="K" );

View File

@ -1,250 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
/////////////////////////////////////////////
//
// Macros and constants used in PSP
//
/////////////////////////////////////////////
// Explicit Gmin
`define GMIN 1E-15
`define PMOS -1
`define NMOS +1
// Some functions
`define MINA(x,y,a) 0.5*((x)+(y)-sqrt(((x)-(y))*((x)-(y))+(a)))
`define MAXA(x,y,a) 0.5*((x)+(y)+sqrt(((x)-(y))*((x)-(y))+(a)))
// Physical constants
`define EPSOX 3.453E-11
`define QMN 5.951993
`define QMP 7.448711
// Other constants (PSP-mos)
`define DELTA1 0.02
`define invSqrt2 7.0710678118654746e-01
`define oneSixth 1.6666666666666667e-01
`define exp80 5.5406223843935098e+34
`define exp160 3.0698496406442424e+69
`ifdef NQSmodel
`define Gint GP
`define Bint BP
`define Bjs BS
`define Bjd BD
`else // NQSmodel
`define Gint G
`define Bint B
`define Bjs B
`define Bjd B
`endif // NQSModel
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because at present locally scoped variables
// can only be in named blocks, the intermediate variables
// used in the macros below must be explicitly declared
// as variables in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// sigma function used in surface potential and other calculations
// (one call uses expressions for arguments so parentheses
// around the arguments in the expressions are necessary)
`define sigma(a,c,tau,eta,y) \
nu = (a) + (c); \
mu = nu * nu / (tau) + 0.5 * ((c) * (c)) - (a); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a)));
// modified version of sigma, which takes 4 arguments
`define sigma2(a,b,c,tau,eta,y) \
nu = (a) + (c); \
if (abs(tau) < 1e-120) begin /*sometimes tau is extremely small...*/\
y = (eta); \
end else begin \
mu = (nu) * (nu) / (tau) + 0.5 * ((c) * (c)) - (a) * (b); \
y = (eta) + (a) * nu / (mu + (nu / mu) * (c) * ((c) * (c) * `oneThird - (a) * (b))); \
end
//
// sp_s surface potential calculation
//
`define sp_s(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
if (xg < -margin) begin \
SP_S_yg = -xg; \
SP_S_ysub = 1.25 * (SP_S_yg * inv_xi); \
SP_S_eta = 0.5 * (SP_S_ysub + 10 - sqrt((SP_S_ysub - 6.0) * (SP_S_ysub - 6.0) + 64.0)); \
SP_S_temp = SP_S_yg - SP_S_eta; \
SP_S_a = SP_S_temp * SP_S_temp + Gf2*(SP_S_eta + 1.0);\
SP_S_c = 2.0 * SP_S_temp - Gf2; \
SP_S_tau = -SP_S_eta + ln(SP_S_a * inv_Gf2); \
`sigma(SP_S_a, SP_S_c, SP_S_tau, SP_S_eta, SP_S_y0) \
`expl_high(SP_S_y0, SP_S_delta0) \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_temp = 1.0 / (2.0 + SP_S_y0 * SP_S_y0); \
SP_S_xi0 = SP_S_y0 * SP_S_y0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_y0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = SP_S_yg - SP_S_y0; \
SP_S_temp1 = (delta) * SP_S_delta1; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (SP_S_delta0 - 1.0 - SP_S_temp1 + (delta) * (1.0 - SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta0 - SP_S_y0 - 1.0 + SP_S_temp1 + (delta) * (SP_S_y0 - 1.0 - SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta0 + SP_S_temp1 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = -SP_S_y0 - 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end else begin \
SP_xg1 = 1.0 / (x1 + Gf * 7.324648775608221e-001); \
SP_S_A_fac= (xi * x1 * SP_xg1 - 1.0) * SP_xg1; \
SP_S_xbar = xg * inv_xi * (1.0 + SP_S_A_fac * xg); \
`expl_low(-SP_S_xbar, SP_S_temp) \
SP_S_w = 1.0 - SP_S_temp; \
SP_S_x1 = xg + Gf2 * 0.5 - Gf * sqrt(xg + Gf2 * 0.25 - SP_S_w); \
SP_S_bx = (xn) + 3.0; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp - 12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2 * (SP_S_delta1 + SP_S_delta0 - (delta) * SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp))); \
end \
end
//
// sp_s_d surface potential calculation at drain (subset of function sp_s)
//
`define sp_s_d(sp,xg,xn,delta) \
if (abs(xg) <= margin) begin \
SP_S_temp1 = inv_xi * inv_xi * `oneSixth * `invSqrt2; \
sp = xg * inv_xi * (1.0 + xg * (1.0 - (delta)) * Gf * SP_S_temp1); \
end else begin \
SP_S_bx = (xn) + 3; \
SP_S_eta = `MINA(SP_S_x1, SP_S_bx, 5.0) - 0.5 * (SP_S_bx - sqrt(SP_S_bx * SP_S_bx + 5.0)); \
SP_S_temp = xg - SP_S_eta; \
SP_S_temp1= exp(-SP_S_eta); \
SP_S_temp2= 1.0 / (2.0 + SP_S_eta * SP_S_eta); \
SP_S_xi0 = SP_S_eta * SP_S_eta * SP_S_temp2; \
SP_S_xi1 = 4.0 * (SP_S_eta * SP_S_temp2 * SP_S_temp2); \
SP_S_xi2 = (8.0 * SP_S_temp2 - 12.0 * SP_S_xi0) * SP_S_temp2 * SP_S_temp2; \
SP_S_a = max(1.0e-40, SP_S_temp * SP_S_temp - Gf2 * (SP_S_temp1 + SP_S_eta - 1.0 - (delta) * (SP_S_eta + 1.0 + SP_S_xi0))); \
SP_S_b = 1.0 - 0.5 * (Gf2 * (SP_S_temp1 - (delta) * SP_S_xi2)); \
SP_S_c = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_temp1 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_tau = (xn) - SP_S_eta + ln(SP_S_a / Gf2); \
`sigma2(SP_S_a, SP_S_b, SP_S_c, SP_S_tau, SP_S_eta, SP_S_x0) \
if (SP_S_x0 < `se05) begin \
SP_S_delta0 = exp(SP_S_x0); \
SP_S_delta1 = 1.0 / SP_S_delta0; \
SP_S_delta0 = (delta) * SP_S_delta0; \
end else begin \
if (SP_S_x0 > (xn) - `se05) begin \
SP_S_delta0 = exp(SP_S_x0 - (xn)); \
SP_S_delta1 = (delta) / SP_S_delta0; \
end else begin \
SP_S_delta0 = `ke05 / `P3((xn) - SP_S_x0 - `se05); \
SP_S_delta1 = `ke05 / `P3(SP_S_x0 - `se05); \
end \
end \
SP_S_temp = 1.0 / (2.0 + SP_S_x0 * SP_S_x0); \
SP_S_xi0 = SP_S_x0 * SP_S_x0 * SP_S_temp; \
SP_S_xi1 = 4.0 * (SP_S_x0 * SP_S_temp * SP_S_temp); \
SP_S_xi2 = (8.0 * SP_S_temp-12.0 * SP_S_xi0) * SP_S_temp * SP_S_temp; \
SP_S_temp = xg - SP_S_x0; \
SP_S_pC = 2.0 * SP_S_temp + Gf2 * (1.0 - SP_S_delta1 + SP_S_delta0 - (delta) * (1.0 + SP_S_xi1)); \
SP_S_qC = SP_S_temp * SP_S_temp - Gf2 * (SP_S_delta1 + SP_S_x0 - 1.0 + SP_S_delta0 - (delta) * (SP_S_x0 + 1.0 + SP_S_xi0)); \
SP_S_temp = 2.0 - Gf2*(SP_S_delta1+SP_S_delta0-(delta)*SP_S_xi2); \
SP_S_temp = SP_S_pC * SP_S_pC - 2.0 * (SP_S_qC * SP_S_temp); \
sp = SP_S_x0 + 2.0 * (SP_S_qC / (SP_S_pC + sqrt(SP_S_temp)));\
end
//
// sp_ov surface potential calculation for the overlap regions
//
`define sp_ov(sp,xg) \
if (abs(xg) <= x_mrg_ov) begin \
sp = (-(xg) * inv_xi_ov); \
end else begin \
if (xg < -x_mrg_ov) begin \
SP_OV_yg = -xg; \
SP_OV_z = x1 * SP_OV_yg * inv_xi_ov; \
SP_OV_eta = 0.5 * (SP_OV_z + 10.0 - sqrt((SP_OV_z - 6.0) * (SP_OV_z - 6.0) + 64.0)); \
SP_OV_a = (SP_OV_yg - SP_OV_eta) * (SP_OV_yg - SP_OV_eta) + GOV2 * (SP_OV_eta + 1.0); \
SP_OV_c = 2.0 * (SP_OV_yg - SP_OV_eta) - GOV2; \
SP_OV_tau = ln(SP_OV_a / GOV2) - SP_OV_eta; \
`sigma(SP_OV_a, SP_OV_c, SP_OV_tau, SP_OV_eta, SP_OV_y0) \
SP_OV_D0 = exp(SP_OV_y0); \
SP_OV_temp = SP_OV_yg - SP_OV_y0; \
SP_OV_p = 2.0 * SP_OV_temp + GOV2 * (SP_OV_D0 - 1.0); \
SP_OV_q = SP_OV_temp * SP_OV_temp + GOV2 * (SP_OV_y0 + 1.0 - SP_OV_D0); \
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
SP_OV_w = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
sp = -(SP_OV_y0 + SP_OV_w); \
end else begin \
SP_OV_Afac = (xi_ov * x1 * inv_xg1 - 1.0) * inv_xg1; \
SP_OV_xbar = xg * inv_xi_ov * (1.0 + SP_OV_Afac * xg); \
`expl_low(-SP_OV_xbar, SP_OV_temp) \
SP_OV_w = 1.0 - SP_OV_temp; \
SP_OV_x0 = xg + GOV2 * 0.5 - GOV * sqrt(xg + GOV2 * 0.25 - SP_OV_w); \
`expl_low(-SP_OV_x0, SP_OV_D0) \
SP_OV_p = 2.0 * (xg - SP_OV_x0) + GOV2 * (1 - SP_OV_D0); \
SP_OV_q = (xg - SP_OV_x0) * (xg - SP_OV_x0) - GOV2 * (SP_OV_x0 - 1.0 + SP_OV_D0); \
SP_OV_xi = 1.0 - GOV2 * 0.5 * SP_OV_D0; \
SP_OV_temp = SP_OV_p * SP_OV_p - 4.0 * (SP_OV_xi * SP_OV_q); \
SP_OV_u = 2.0 * (SP_OV_q / (SP_OV_p + sqrt(SP_OV_temp))); \
sp = SP_OV_x0 + SP_OV_u; \
end \
sp = -sp; \
end

File diff suppressed because it is too large Load Diff

View File

@ -1,117 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: PSP102_nqs_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////
//
// Macros used in PSP-NQS
//
//////////////////////////////////////////
// Function to calculate bulk charge from surface potential
`define PhiToQb(phi,Qb_tmp) \
if (abs(phi) <= margin) \
Qb_tmp = -0.70710678 * phi * Gf * (1.0 - `oneSixth * phi * (1.0 - `oneSixth * phi)); \
else begin \
`expl((-phi), temp) \
Qb_tmp = Gf * sqrt(temp + phi - 1.0); \
if (phi > margin) \
Qb_tmp = -Qb_tmp; \
end
// Function used in fq-macro
`define PhiTod2Qis(xphi,d2Qis) \
if (abs(xphi) <= margin) begin \
Qb_tmp = -0.70710678 * xphi * Gf * (1.0 - `oneSixth * xphi * (1.0 - `oneSixth * xphi)); \
dQbs = -0.70710678 * Gf * (1.0 - `oneThird * xphi * (1.0 - 0.25 * xphi)); \
d2Qis = -0.235702 * Gf * (1.0 - 0.5 * xphi); \
end else begin \
`expl((-xphi),temp) \
Qb_tmp = Gf * sqrt(temp + xphi - 1.0); \
if (xphi > margin) \
Qb_tmp = -Qb_tmp; \
dQbs = 0.5 * Gf2 * (1.0 - temp) / Qb_tmp; \
d2Qis = (dQbs * dQbs - 0.5 * Gf * Gf) / Qb_tmp + dQbs; \
end
// Function used in QiToPhi
`define sps(sp, xg) \
if (abs(xg) <= marginp) begin \
sp = xg / a_factrp; \
end else begin \
if (xg < -marginp) begin \
NQS_yg = -xg; \
NQS_z = 1.25 * NQS_yg / a_factrp; \
NQS_eta = (NQS_z + 10.0 - sqrt((NQS_z - 6.0) * (NQS_z - 6.0) + 64.0)) * 0.5; \
NQS_a = (NQS_yg - NQS_eta) * (NQS_yg - NQS_eta) + Gp2 * (NQS_eta + 1.0); \
NQS_c = 2.0 * (NQS_yg - NQS_eta) - Gp2; \
NQS_tau = ln(NQS_a / Gp2) - NQS_eta; \
`sigma(NQS_a, NQS_c, NQS_tau, NQS_eta, NQS_y0) \
`expl(NQS_y0, NQS_D0) \
NQS_xi = 1.0 - Gp2 * NQS_D0 * 0.5; \
NQS_p = 2.0 * (NQS_yg - NQS_y0) + Gp2 * (NQS_D0 - 1.0); \
NQS_q = (NQS_yg - NQS_y0) * (NQS_yg - NQS_y0) + Gp2 * (NQS_y0 + 1.0 - NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_w = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = -(NQS_y0 + NQS_w); \
end else begin \
NQS_xg1 = 1.0 / ( 1.25 + 7.32464877560822e-01 * Gp); \
NQS_A_fac = (1.25 * a_factrp * NQS_xg1 - 1.0) * NQS_xg1; \
NQS_xbar = xg / a_factrp * (1.0 + NQS_A_fac * xg); \
`expl(-NQS_xbar, NQS_temp) \
NQS_w = 1.0 - NQS_temp; \
NQS_x0 = xg + Gp2 * 0.5 - Gp * sqrt(xg + Gp2 * 0.25 - NQS_w); \
`expl((-NQS_x0), NQS_D0) \
NQS_xi = 1.0 - Gp2 * 0.5 * NQS_D0; \
NQS_p = 2.0 * (xg - NQS_x0) + Gp2 * (1.0 - NQS_D0); \
NQS_q = (xg - NQS_x0) * (xg - NQS_x0) - Gp2 * (NQS_x0 - 1.0 + NQS_D0); \
NQS_temp = NQS_p * NQS_p - 4.0 * NQS_xi * NQS_q; \
NQS_u = 2.0 * NQS_q / (NQS_p + sqrt(NQS_temp)); \
sp = NQS_x0 + NQS_u; \
end \
end
// Function to calculate surface potential from inversion charge
`define QiToPhi(Qi,xg,xphi) \
temp = Qi / pd + xg; \
`sps(xphi,temp)
// Calculation of fk
`define fq(Qi,xg,dQy,d2Qy,fk) \
`QiToPhi(Qi, xg, xphi) \
`PhiTod2Qis(xphi, d2Qis) \
dQis = pd - dQbs; \
dQis_1 = 1.0 / dQis; \
fQi = Qi * dQis_1 - 1.0; \
dfQi = (1.0 - Qi * d2Qis * dQis_1 * dQis_1) * dQis_1; \
fk0 = dfQi * dQy * dQy + fQi * d2Qy; \
dpsy2 = dQy * dQy * dQis_1 * dQis_1; \
zsat = thesat2 * dpsy2; \
if (CHNL_TYPE == `PMOS) \
zsat = zsat / (1.0 + thesat1 * dps); \
temp = sqrt(1.0 + 2.0 * zsat); \
Fvsat = 2.0 / (1.0 + temp); \
temp1 = d2Qy - dpsy2 * d2Qis; \
fk = Fvsat * (fk0 - zsat * fQi * temp1 * Fvsat / temp);
// Interpolation of surface potential along channel
`define Phiy(y) \
x_m + H * (1.0 - sqrt(1.0 - 2.0 * dps / H * ((y) - ym))) * inv_phit1

View File

@ -1,121 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: SIMKIT_macrodefs.include
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
//////////////////////////////////////////////////////////////
//
// General macros and constants for compact va-models
//
//////////////////////////////////////////////////////////////
`define VERS "0.0"
`define VREV "0.0"
`define VERSreal 0.0
`define VREVreal 0.0
`define CLIP_LOW(val,min) ((val)>(min)?(val):(min))
`define CLIP_HIGH(val,max) ((val)<(max)?(val):(max))
`define CLIP_BOTH(val,min,max) ((val)>(min)?((val)<(max)?(val):(max)):(min))
// Note 1: In this va-code, the `P-macro is defined such that its argument
// is ignored during compilation; in this source code it acts as
// a comment
// Note 2: In this va-code, the "from" keyword in the parameter
// list is not used. Silent clipping is used instead. One could enable
// the Verilog-A range checking by redefining the `from-macro below.
`define P(txt)
`define AT_MODEL
`define AT_INSTANCE
`define AT_NOISE
`define from(lower,upper)
// `define from(lower,upper) from[lower:upper]
// Some functions
`define MAX(x,y) ((x)>(y)?(x):(y))
`define MIN(x,y) ((x)<(y)?(x):(y))
// Mathematical constants
`define PI 3.1415926535897931
`define SQRTPI 1.77245385090551603
// Physical constants
`define KELVINCONVERSION 273.15
`define KBOL 1.3806505E-23
`define QELE 1.6021918E-19
`define HBAR 1.05457168E-34
`define MELE 9.1093826E-31
`define EPSSI 1.045E-10
// Other constants
`define oneThird 3.3333333333333333e-01
`define twoThirds 6.6666666666666667e-01
// Constants needed in safe exponential function (called "expl")
`define se 4.6051701859880916e+02
`define se05 2.3025850929940458e+02
`define ke 1.0e-200
`define ke05 1.0e-100
`define keinv 1.0e200
`define ke05inv 1.0e100
/////////////////////////////////////////////////////////////////////////////
//
// Macro definitions.
//
// Note that because variables in macros are not locally scoped,
// the intermediate variables used in the macros below must be
// explicitly declared in the main code.
//
/////////////////////////////////////////////////////////////////////////////
// P3 3rd order polynomial expansion of exp()
`define P3(u) (1.0 + (u) * (1.0 + 0.5 * ((u) * (1.0 + (u) * `oneThird))))
// expl exp() with 3rd order polynomial extrapolation
// for very low values (exp_low), very high
// values (exp_high), or both (expl), to avoid overflows
// and underflows and retain C-3 continuity
`define expl(x, res) \
if (abs(x) < `se05) begin\
res = exp(x); \
end else begin \
if ((x) < -`se05) begin\
res = `ke05 / `P3(-`se05 - (x)); \
end else begin\
res = `ke05inv * `P3((x) - `se05); \
end \
end
`define expl_low(x, res) \
if ((x) > -`se05) begin\
res = exp(x); \
end else begin\
res = `ke05 / `P3(-`se05 - (x)); \
end
`define expl_high(x, res) \
if ((x) < `se05) begin\
res = exp(x); \
end else begin \
res = `ke05inv * `P3((x) - `se05); \
end
`define swap(a, b) \
temp = a; \
a = b; \
b = temp;

View File

@ -1,48 +0,0 @@
//======================================================================================
//======================================================================================
// Filename: psp102.va
//======================================================================================
//======================================================================================
//
// (c) Copyright 2007, All Rights Reserved, NXP Semiconductors
//
//
// Version: 102.1, April 2007 (Simkit 2.5)
//
//======================================================================================
//======================================================================================
//
// Further information can be found in the file readme.txt
//
`include "discipline.h"
`include "SIMKIT_macrodefs.include"
`include "JUNCAP200_macrodefs.include"
`include "PSP102_macrodefs.include"
/////////////////////////////////////////////////////////////////////////////
//
// PSP global model code
//
/////////////////////////////////////////////////////////////////////////////
// `undef LocalModel
// `define Binning
module PSP102VA(D, G, S, B)
`P(
info = "PSP MOSFET Model"
version = `VERS
revision = `VREV
simkit:name = "psp1020"
simkit:desc = "psp_1020"
);
`include "PSP102_module.include"
endmodule

View File

@ -1,8 +0,0 @@
ngspice customizations of package psp102.1
------------------------------------------
- Mon Apr 30 15:28:25 WEDT 2007 (Berlin)
o renamed 'initializeModel/initializeInstance' to 'initial_model/initial_instance'.
(this issue should go away when auto-partionning done in adms.)
o redefined macro P(txt) in order to 'see' instance parameters
o status: psp code created by adms compiles

View File

@ -1,120 +0,0 @@
======================================================================================
======================================================================================
---------------------------
Verilog-A definition of PSP
---------------------------
(c) Copyright 2007, All Rights Reserved, NXP Semiconductors
Version: PSP 102.1 (including JUNCAP2 200.2), April 2007 (Simkit 2.5)
======================================================================================
======================================================================================
Authors: G.D.J. Smit, A.J. Scholten, and D.B.M. Klaassen (NXP Semiconductors Research)
R. van Langevelde (Philips Research)
G. Gildenblat, X. Li, and W. Wu (The Arizona State University)
The most recent version of the model code, the documentation, and contact information
can be found on:
http://PSPmodel.asu.edu/
or
http://www.nxp.com/Philips_Models/
======================================================================================
======================================================================================
This package consists of several files:
- readme.txt This file
- psp102.va Main file for global ("geometrical") model
- psp102b.va Main file for global binning model
- psp102e.va Main file for local ("electrical") model
- psp102_nqs.va Main file for global ("geometrical") model with NQS-effects
- psp102b_nqs.va Main file for global binning model with NQS-effects
- psp102e_nqs.va Main file for local ("electrical") model with NQS-effects
- juncap200.va Main file for JUNCAP2 stand-alone model
- SIMKIT_macrodefs.include Common macro definitions
- PSP102_macrodefs.include Macro definitions for PSP
- PSP102_module.include Actual model code for intrinsic MOS model
- PSP102_binning.include Geometry scaling equation for binning
- PSP102_binpars.include Parameterlist for global PSP binning model
- PSP102_nqs_macrodefs.include Macro definitions for PSP-NQS
- PSP102_InitNQS.include PSP-NQS initialization code
- PSP102_ChargesNQS.include Calculation of NQS-charge contributions
- JUNCAP200_macrodefs.include Macro definitions for JUNCAP2 model
- JUNCAP200_parlist.include JUNCAP2 parameter list
- JUNCAP200_varlist.include JUNCAP2 variable declarations
- JUNCAP200_InitModel.include JUNCAP2 model initialization code
======================================================================================
======================================================================================
Usage
-----
Depending which model one wants to use, one should compile one of the seven .va-files
(psp102.va, psp102b.va, psp102e.va, psp102_nqs.va, psp102b_nqs.va, psp102e_nqs.va, and
juncap200.va). The module names are "PSP102VA" and "PSPNQS102VA" for the global PSP-model
(QS and NQS, respectively), and similarly "PSP102BVA" and "PSPNQS102BVA" for the binning
PSP-model, "PSP102EVA" and "PSPNQS102EVA" for the local PSP-model, and "JUNCAP200" for
the JUNCAP2-model.
======================================================================================
======================================================================================
Release notes va-code of PSP 102.1, including JUNCAP2 200.2 (April 2007)
------------------------------------------------------------------------
Focus in this release has been on improving the simulation speed of PSP and JUNCAP2.
The model equations in this release of PSP 102.1 are identical to those in the
October 2006 release. This version features some minor impelementation changes
w.r.t. the previous release.
The main changes have been in the SiMKit version generated from this verilog-A
implementation: improvements in the automatic C-code generation process
and compilation of the C-code. The result is reflected in the SiMKit 2.5 version of
PSP, which shows a very significant simulation speed improvement w.r.t SiMKit 2.4.
The minor implementation changes in the verilog-A code will have some positive effect
on the simulation speed of the verilog-A version as well. Note, however, that the
simulation speed of the verilog-A version of PSP and the improvement w.r.t. the
previous version strongly depend on the verilog-A compiler used.
PSP 102.1 is backwards compatible with the previous version, PSP 102.0.
======================================================================================
======================================================================================
The functionality of the Verilog-A code in this package is the same as that of the
C-code, which is contained in SIMKIT version 2.5. Note that Operating Point information
is available only in the C-code, not in Verilog-A code.
The PSP-NQS model is provided as Verilog-A code. In SiMKit 2.5, a test version of
the PSP-NQS model is included (identical to that in SiMKit 2.4). This implementation
circumvents the problem of the SpectreVerilog-A-generated C-code being too large to
compile. Moreover, it is computationally more efficient as it uses less rows in the
simulator matrix. On the other hand, this implementation has some known limitations.
More information is available from the authors. Further improvements are expected in
future releases.
This Verilog-A code of PSP is primarily intended as a source for C-code generation
using ADMS. Most of the testing has been done on the C-code which was generated from it.
The authors want to thank Laurent Lemaitre and Colin McAndrew (Freescale)
for their help with ADMS and the implementation of the model code. Geoffrey
Coram (Analog Devices) is acknowledged for useful comments on the Verilog-A
code.