annotate extra/ocs/src/Mshichmanhodgesmosfet.cc @ 12676:a8f02c1adca6 octave-forge

work around clang bug
author cdf
date Mon, 17 Aug 2015 17:02:20 +0000
parents 3ce60a1159f8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
1 /*
94452cb02314 Added src directory
culpo
parents:
diff changeset
2
94452cb02314 Added src directory
culpo
parents:
diff changeset
3 Copyright (C) 2009 Massimiliano Culpo
94452cb02314 Added src directory
culpo
parents:
diff changeset
4
94452cb02314 Added src directory
culpo
parents:
diff changeset
5 This file is part of:
94452cb02314 Added src directory
culpo
parents:
diff changeset
6 OCS - A Circuit Simulator for Octave
94452cb02314 Added src directory
culpo
parents:
diff changeset
7
94452cb02314 Added src directory
culpo
parents:
diff changeset
8 OCS is free software; you can redistribute it and/or modify
94452cb02314 Added src directory
culpo
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
94452cb02314 Added src directory
culpo
parents:
diff changeset
10 the Free Software Foundation.
94452cb02314 Added src directory
culpo
parents:
diff changeset
11
94452cb02314 Added src directory
culpo
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
94452cb02314 Added src directory
culpo
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
94452cb02314 Added src directory
culpo
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
94452cb02314 Added src directory
culpo
parents:
diff changeset
15 GNU General Public License for more details.
94452cb02314 Added src directory
culpo
parents:
diff changeset
16
94452cb02314 Added src directory
culpo
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
94452cb02314 Added src directory
culpo
parents:
diff changeset
18 along with this program (see the file LICENSE); if not,
94452cb02314 Added src directory
culpo
parents:
diff changeset
19 see <http://www.gnu.org/licenses/>.
94452cb02314 Added src directory
culpo
parents:
diff changeset
20
94452cb02314 Added src directory
culpo
parents:
diff changeset
21 author: Massimiliano Culpo <culpo@math.uni-wuppertal.de>
94452cb02314 Added src directory
culpo
parents:
diff changeset
22
94452cb02314 Added src directory
culpo
parents:
diff changeset
23 */
94452cb02314 Added src directory
culpo
parents:
diff changeset
24
94452cb02314 Added src directory
culpo
parents:
diff changeset
25 #include <octave/oct.h>
94452cb02314 Added src directory
culpo
parents:
diff changeset
26 #include <octave/parse.h>
94452cb02314 Added src directory
culpo
parents:
diff changeset
27 #include <octave/str-vec.h>
94452cb02314 Added src directory
culpo
parents:
diff changeset
28 #include <string>
94452cb02314 Added src directory
culpo
parents:
diff changeset
29 #include <octave/pager.h>
94452cb02314 Added src directory
culpo
parents:
diff changeset
30
94452cb02314 Added src directory
culpo
parents:
diff changeset
31 using namespace std;
94452cb02314 Added src directory
culpo
parents:
diff changeset
32
94452cb02314 Added src directory
culpo
parents:
diff changeset
33 /* Print parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
34 void print_parameters(double rd, double W, double L, double mu0, double Vth,
94452cb02314 Added src directory
culpo
parents:
diff changeset
35 double Cox, double Cgs, double Cgd, double Cgb, double Csb,
94452cb02314 Added src directory
culpo
parents:
diff changeset
36 double Cdb, double Tshift)
94452cb02314 Added src directory
culpo
parents:
diff changeset
37 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
38 octave_stdout << "PARAMETER TABLE: Simplified Shichman-Hodges MOS-FET\n\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
39 octave_stdout << "Name\t\tValue\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
40 octave_stdout << "rd\t\t" << rd << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
41 octave_stdout << "W\t\t" << W << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
42 octave_stdout << "L\t\t" << L << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
43 octave_stdout << "mu0\t\t" << mu0 << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
44 octave_stdout << "Vth\t\t" << Vth << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
45 octave_stdout << "Cox\t\t" << Cox << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
46 octave_stdout << "Cgs\t\t" << Cgs << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
47 octave_stdout << "Cgd\t\t" << Cgd << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
48 octave_stdout << "Cgb\t\t" << Cgb << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
49 octave_stdout << "Csb\t\t" << Csb << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
50 octave_stdout << "Cdb\t\t" << Cdb << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
51 octave_stdout << "Tshift\t\t" << Tshift << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
52 octave_stdout << "\n\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
53 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
54
94452cb02314 Added src directory
culpo
parents:
diff changeset
55 /* Print computed values */
94452cb02314 Added src directory
culpo
parents:
diff changeset
56 void print_values(double gm, double gd, double ids, double didT,
94452cb02314 Added src directory
culpo
parents:
diff changeset
57 double P, double dPdT, double dPdvgs, double dPdvds)
94452cb02314 Added src directory
culpo
parents:
diff changeset
58 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
59 octave_stdout << "COMPUTED VALUES TABLE: Simplified Shichman-Hodges MOS-FET\n\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
60 octave_stdout << "Name\t\tValue\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
61 octave_stdout << "gm\t\t" << gm << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
62 octave_stdout << "gd\t\t" << gd << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
63 octave_stdout << "ids\t\t" << ids << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
64 octave_stdout << "didT\t\t" << didT << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
65 octave_stdout << "P\t\t" << P << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
66 octave_stdout << "dPdT\t\t" << dPdT << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
67 octave_stdout << "dPdvgs\t\t" << dPdvgs << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
68 octave_stdout << "dPdvds\t\t" << dPdvds << "\n" ;
94452cb02314 Added src directory
culpo
parents:
diff changeset
69 octave_stdout << "\n\n";
94452cb02314 Added src directory
culpo
parents:
diff changeset
70 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
71
94452cb02314 Added src directory
culpo
parents:
diff changeset
72 /* Set the parameters of the simplified Shichman-Hodges MOS-FET */
94452cb02314 Added src directory
culpo
parents:
diff changeset
73 void set_parameters(ColumnVector parameters, string_vector parameternames,
94452cb02314 Added src directory
culpo
parents:
diff changeset
74 double *rd, double* W, double* L, double* mu0, double* Vth,
94452cb02314 Added src directory
culpo
parents:
diff changeset
75 double* Cox, double* Cgs, double* Cgd, double* Cgb, double* Csb,
94452cb02314 Added src directory
culpo
parents:
diff changeset
76 double* Cdb, double* Tshift)
94452cb02314 Added src directory
culpo
parents:
diff changeset
77 {
12660
8c85ee67be16 fix warnings
cdf
parents: 9730
diff changeset
78 octave_idx_type nnames = parameternames.numel ();
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
79 octave_idx_type niter = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
80 //FIXME: it should be better to use Octave_map<string,value> for parameters
94452cb02314 Added src directory
culpo
parents:
diff changeset
81 while (niter < nnames)
94452cb02314 Added src directory
culpo
parents:
diff changeset
82 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
83 if (parameternames[niter] == "rd")
94452cb02314 Added src directory
culpo
parents:
diff changeset
84 *rd = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
85 else if (parameternames[niter] == "W")
94452cb02314 Added src directory
culpo
parents:
diff changeset
86 *W = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
87 else if (parameternames[niter] == "L")
94452cb02314 Added src directory
culpo
parents:
diff changeset
88 *L = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
89 else if (parameternames[niter] == "mu0")
94452cb02314 Added src directory
culpo
parents:
diff changeset
90 *mu0 = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
91 else if (parameternames[niter] == "Vth")
94452cb02314 Added src directory
culpo
parents:
diff changeset
92 *Vth = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
93 else if (parameternames[niter] == "Cox")
94452cb02314 Added src directory
culpo
parents:
diff changeset
94 *Cox = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
95 else if (parameternames[niter] == "Cgs")
94452cb02314 Added src directory
culpo
parents:
diff changeset
96 *Cgs = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
97 else if (parameternames[niter] == "Cgd")
94452cb02314 Added src directory
culpo
parents:
diff changeset
98 *Cgd = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
99 else if (parameternames[niter] == "Cgb")
94452cb02314 Added src directory
culpo
parents:
diff changeset
100 *Cgb = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
101 else if (parameternames[niter] == "Csb")
94452cb02314 Added src directory
culpo
parents:
diff changeset
102 *Csb = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
103 else if (parameternames[niter] == "Cdb")
94452cb02314 Added src directory
culpo
parents:
diff changeset
104 *Cdb = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
105 else if (parameternames[niter] == "Tshift")
94452cb02314 Added src directory
culpo
parents:
diff changeset
106 *Tshift = parameters(niter);
94452cb02314 Added src directory
culpo
parents:
diff changeset
107 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
108 warning ((string("Mshichmanhodgesmosfet: unknown parameter").append (parameternames[niter])).c_str ());
94452cb02314 Added src directory
culpo
parents:
diff changeset
109
94452cb02314 Added src directory
culpo
parents:
diff changeset
110 niter++;
94452cb02314 Added src directory
culpo
parents:
diff changeset
111 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
112 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
113
94452cb02314 Added src directory
culpo
parents:
diff changeset
114 /* Compute values for n-mos model*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
115 void nmos(ColumnVector extvar, double mu0, double Cox, double W,
94452cb02314 Added src directory
culpo
parents:
diff changeset
116 double L, double Vth, double rd, double Tshift,
94452cb02314 Added src directory
culpo
parents:
diff changeset
117 double *gm, double *gd, double *ids, double *didT,
94452cb02314 Added src directory
culpo
parents:
diff changeset
118 double *P, double *dPdT, double *dPdvgs, double *dPdvds)
94452cb02314 Added src directory
culpo
parents:
diff changeset
119 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
120 double vg = extvar(0); // V-gate
94452cb02314 Added src directory
culpo
parents:
diff changeset
121 double vs = extvar(1); // V-source
94452cb02314 Added src directory
culpo
parents:
diff changeset
122 double vd = extvar(2); // V-drain
94452cb02314 Added src directory
culpo
parents:
diff changeset
123 double vb = extvar(3); // V-bulk
94452cb02314 Added src directory
culpo
parents:
diff changeset
124 double T = extvar(4); // Temperature
94452cb02314 Added src directory
culpo
parents:
diff changeset
125
94452cb02314 Added src directory
culpo
parents:
diff changeset
126 double k = mu0*Cox*pow((T + Tshift)/300.0,-3.0/2.0)*W/L;
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
127 double dkdT = mu0*Cox*W*(-3.0/2)*std::pow((T + Tshift)/300.0,-5.0/2.0 )*(1.0/300.0)/L;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
128
94452cb02314 Added src directory
culpo
parents:
diff changeset
129 double vgs = vg - vs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
130 double vds = vd - vs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
131
94452cb02314 Added src directory
culpo
parents:
diff changeset
132 if (vgs < Vth)
94452cb02314 Added src directory
culpo
parents:
diff changeset
133 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
134 *gm = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
135 *gd = 1/rd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
136 *ids = vds*(*gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
137 *didT = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
138 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
139 else if ( ( (vgs-Vth)>= vds ) && (vds>=0))
94452cb02314 Added src directory
culpo
parents:
diff changeset
140 {
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
141 *ids = k*((vgs-Vth)*vds - std::pow(vds,2)/2 ) + vds/rd;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
142 *gm = k*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
143 *gd = k*(vgs-Vth-vds) + (1/rd);
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
144 *didT = dkdT*((vgs-Vth)*vds-(std::pow(vds,2))/2);
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
145 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
146 else if (((vgs-Vth)>=(vds))&&(vds<0))
94452cb02314 Added src directory
culpo
parents:
diff changeset
147 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
148 *gm = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
149 *gd = 1/rd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
150 *ids = vds*(*gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
151 *didT= 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
152 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
153 else // (i.e. if 0 <= vgs-vth <= vds)
94452cb02314 Added src directory
culpo
parents:
diff changeset
154 {
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
155 *ids = (k/2)*std::pow((vgs-Vth),2) + vds/rd;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
156 *gm = k*(vgs-Vth);
94452cb02314 Added src directory
culpo
parents:
diff changeset
157 *gd = 1/rd;
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
158 *didT= (dkdT/(2))*std::pow((vgs-Vth),2);
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
159 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
160
94452cb02314 Added src directory
culpo
parents:
diff changeset
161 *P = -(*ids)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
162 *dPdT = -(*didT)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
163 *dPdvgs = -(*gm)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
164 *dPdvds = -((*gd)*vds + (*ids));
94452cb02314 Added src directory
culpo
parents:
diff changeset
165
94452cb02314 Added src directory
culpo
parents:
diff changeset
166 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
167
94452cb02314 Added src directory
culpo
parents:
diff changeset
168 /* Compute values for p-mos model*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
169 void pmos(ColumnVector extvar, double mu0, double Cox, double W,
94452cb02314 Added src directory
culpo
parents:
diff changeset
170 double L, double Vth, double rd, double Tshift,
94452cb02314 Added src directory
culpo
parents:
diff changeset
171 double *gm, double *gd, double *ids, double *didT,
94452cb02314 Added src directory
culpo
parents:
diff changeset
172 double *P, double *dPdT, double *dPdvgs, double *dPdvds)
94452cb02314 Added src directory
culpo
parents:
diff changeset
173 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
174 double vg = extvar(0); // V-gate
94452cb02314 Added src directory
culpo
parents:
diff changeset
175 double vs = extvar(1); // V-source
94452cb02314 Added src directory
culpo
parents:
diff changeset
176 double vd = extvar(2); // V-drain
94452cb02314 Added src directory
culpo
parents:
diff changeset
177 double vb = extvar(3); // V-bulk
94452cb02314 Added src directory
culpo
parents:
diff changeset
178 double T = extvar(4); // Temperature
94452cb02314 Added src directory
culpo
parents:
diff changeset
179
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
180 double k = - mu0*Cox*std::pow((T + Tshift)/300.0,-3.0/2.0)*W/L;
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
181 double dkdT = - mu0*Cox*W*(-3.0/2.0)*std::pow((T + Tshift)/300.0,-5.0/2.0 )*(1.0/300.0)/L;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
182
94452cb02314 Added src directory
culpo
parents:
diff changeset
183 double vgs = vg - vs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
184 double vds = vd - vs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
185
94452cb02314 Added src directory
culpo
parents:
diff changeset
186 if (vgs > Vth)
94452cb02314 Added src directory
culpo
parents:
diff changeset
187 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
188 *gm = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
189 *gd = 1/rd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
190 *ids = vds*(*gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
191 *didT = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
192 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
193 else if ( ( (vgs-Vth)<= vds ) && (vds<=0))
94452cb02314 Added src directory
culpo
parents:
diff changeset
194 {
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
195 *ids = k*((vgs-Vth)*vds - std::pow(vds,2)/2 ) + vds/rd;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
196 *gm = k*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
197 *gd = k*(vgs-Vth-vds) + (1/rd);
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
198 *didT = dkdT*((vgs-Vth)*vds-(std::pow(vds,2))/2);
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
199 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
200 else if (((vgs-Vth)<=(vds))&&(vds>0))
94452cb02314 Added src directory
culpo
parents:
diff changeset
201 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
202 *gm = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
203 *gd = 1/rd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
204 *ids = vds*(*gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
205 *didT= 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
206 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
207 else // (i.e. if 0 <= vgs-vth <= vds)
94452cb02314 Added src directory
culpo
parents:
diff changeset
208 {
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
209 *ids = (k/2)*std::pow((vgs-Vth),2) + vds/rd;
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
210 *gm = k*(vgs-Vth);
94452cb02314 Added src directory
culpo
parents:
diff changeset
211 *gd = 1/rd;
12676
a8f02c1adca6 work around clang bug
cdf
parents: 12674
diff changeset
212 *didT= (dkdT/(2))*std::pow((vgs-Vth),2);
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
213 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
214
94452cb02314 Added src directory
culpo
parents:
diff changeset
215 *P = -(*ids)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
216 *dPdT = -(*didT)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
217 *dPdvgs = -(*gm)*vds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
218 *dPdvds = -((*gd)*vds + (*ids));
94452cb02314 Added src directory
culpo
parents:
diff changeset
219
94452cb02314 Added src directory
culpo
parents:
diff changeset
220 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
221
94452cb02314 Added src directory
culpo
parents:
diff changeset
222 DEFUN_DLD(Mshichmanhodgesmosfet,args,nargout,
94452cb02314 Added src directory
culpo
parents:
diff changeset
223 "-*- texinfo -*-\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
224 \n\
9730
4db1fc229c42 help text: functions in oct files are {Loadable Functions}, not {Function Files}. Fixing help texts accordingly
carandraug
parents: 6667
diff changeset
225 @deftypefn{Loadable Function} @\n\
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
226 {[@var{a},@var{b},@var{c}]=} Mshichmanhodgesmosfet@\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
227 (@var{string}, @var{parameters}, @var{parameternames}, @\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
228 @var{extvar},@var{intvar},@var{t})\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
229 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
230 SBN file implementing Schichman-Hodges MOSFETs model.\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
231 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
232 @var{string} is used to select among models. Possible models are:\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
233 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
234 @enumerate\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
235 @item @var{string} = NMOS (Simplified Shichman-Hodges n-MOSFET)\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
236 @item @var{string} = PMOS (Simplified Shichman-Hodges p-MOSFET)\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
237 @end enumerate\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
238 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
239 Parameters for all the above models are:\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
240 @itemize\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
241 @item rd -> parasitic resistance between drain and source\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
242 @item W -> MOSFET width\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
243 @item L -> channel length\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
244 @item mu0 -> reference value for mobility\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
245 @item Vth -> threshold voltage\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
246 @item Cox -> oxide capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
247 @item Cgs -> gate-source capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
248 @item Cgd -> gate-drain capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
249 @item Cgb -> gate-bulk capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
250 @item Csb -> source-bulk capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
251 @item Cdb -> drain-bulk capacitance\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
252 @item Tshift -> shift for reference temperature on MOSFETs\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
253 @end itemize\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
254 See the @cite{IFF file format specifications} for details about\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
255 the output structures.\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
256 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
257 @seealso{prs_iff,asm_initialize_system,asm_build_system}\n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
258 \n\
94452cb02314 Added src directory
culpo
parents:
diff changeset
259 @end deftypefn\n \
94452cb02314 Added src directory
culpo
parents:
diff changeset
260 ")
94452cb02314 Added src directory
culpo
parents:
diff changeset
261 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
262
94452cb02314 Added src directory
culpo
parents:
diff changeset
263 octave_value_list retval; // Contain returned values
94452cb02314 Added src directory
culpo
parents:
diff changeset
264 octave_idx_type nargin = args.length();
94452cb02314 Added src directory
culpo
parents:
diff changeset
265
94452cb02314 Added src directory
culpo
parents:
diff changeset
266 /* Input parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
267 string eltype;
94452cb02314 Added src directory
culpo
parents:
diff changeset
268 ColumnVector parameters;
94452cb02314 Added src directory
culpo
parents:
diff changeset
269 string_vector parameternames;
94452cb02314 Added src directory
culpo
parents:
diff changeset
270 ColumnVector extvar;
94452cb02314 Added src directory
culpo
parents:
diff changeset
271 ColumnVector intvar(5,0.0);
94452cb02314 Added src directory
culpo
parents:
diff changeset
272 double t;
94452cb02314 Added src directory
culpo
parents:
diff changeset
273
94452cb02314 Added src directory
culpo
parents:
diff changeset
274 /* Model parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
275 double rd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
276 double W,L;
94452cb02314 Added src directory
culpo
parents:
diff changeset
277 double mu0,Vth,Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
278 double Cgs,Cgd,Cgb,Csb,Cdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
279 double Tshift;
94452cb02314 Added src directory
culpo
parents:
diff changeset
280
94452cb02314 Added src directory
culpo
parents:
diff changeset
281 /* Model variables */
94452cb02314 Added src directory
culpo
parents:
diff changeset
282 double vg; // V-gate
94452cb02314 Added src directory
culpo
parents:
diff changeset
283 double vs; // V-source
94452cb02314 Added src directory
culpo
parents:
diff changeset
284 double vd; // V-drain
94452cb02314 Added src directory
culpo
parents:
diff changeset
285 double vb; // V-bulk
94452cb02314 Added src directory
culpo
parents:
diff changeset
286 double T ; // Temperature
94452cb02314 Added src directory
culpo
parents:
diff changeset
287
94452cb02314 Added src directory
culpo
parents:
diff changeset
288 double Qgb;// Charges
94452cb02314 Added src directory
culpo
parents:
diff changeset
289 double Qgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
290 double Qgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
291 double Qsb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
292 double Qdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
293
94452cb02314 Added src directory
culpo
parents:
diff changeset
294 double gm; // Conductances et similia
94452cb02314 Added src directory
culpo
parents:
diff changeset
295 double gd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
296 double ids;
94452cb02314 Added src directory
culpo
parents:
diff changeset
297 double didT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
298 double P;
94452cb02314 Added src directory
culpo
parents:
diff changeset
299 double dPdT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
300 double dPdvgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
301 double dPdvds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
302
94452cb02314 Added src directory
culpo
parents:
diff changeset
303 /* Output values */
94452cb02314 Added src directory
culpo
parents:
diff changeset
304 Matrix a(10,10,0.0), b(10,10,0.0);
94452cb02314 Added src directory
culpo
parents:
diff changeset
305 ColumnVector c(10,0.0);
94452cb02314 Added src directory
culpo
parents:
diff changeset
306
94452cb02314 Added src directory
culpo
parents:
diff changeset
307 /* Check and retrieve input */
94452cb02314 Added src directory
culpo
parents:
diff changeset
308 if (nargin != 6)
94452cb02314 Added src directory
culpo
parents:
diff changeset
309 error("Mshichmanhodgesmosfet: wrong number of input parameters.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
310 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
311 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
312 /* Retrieve input parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
313 // Type of MOS-FET
94452cb02314 Added src directory
culpo
parents:
diff changeset
314 if (args(0).is_string())
94452cb02314 Added src directory
culpo
parents:
diff changeset
315 eltype = args(0).string_value();
94452cb02314 Added src directory
culpo
parents:
diff changeset
316 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
317 error("Mshichmanhodgesmosfet: argument #1 is expected to be a string.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
318 // Parameters and parameter names
94452cb02314 Added src directory
culpo
parents:
diff changeset
319 if (args(1).length() == args(2).length())
94452cb02314 Added src directory
culpo
parents:
diff changeset
320 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
321 parameters = args(1).column_vector_value();
94452cb02314 Added src directory
culpo
parents:
diff changeset
322 parameternames = args(2).all_strings();
94452cb02314 Added src directory
culpo
parents:
diff changeset
323 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
324 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
325 error("Mshichmanhodgesmosfet: parameters and parameternames are expected to have the same length.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
326 // External pins
94452cb02314 Added src directory
culpo
parents:
diff changeset
327 if (args(3).length() == 5)
94452cb02314 Added src directory
culpo
parents:
diff changeset
328 extvar = args(3).column_vector_value();
94452cb02314 Added src directory
culpo
parents:
diff changeset
329 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
330 error("Mshichmanhodgesmosfet: five external values expected.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
331 // Internal variables
94452cb02314 Added src directory
culpo
parents:
diff changeset
332 if (args(4).is_empty())
94452cb02314 Added src directory
culpo
parents:
diff changeset
333 {}
94452cb02314 Added src directory
culpo
parents:
diff changeset
334 else if (args(4).length() == 5)
94452cb02314 Added src directory
culpo
parents:
diff changeset
335 intvar = args(4).column_vector_value();
94452cb02314 Added src directory
culpo
parents:
diff changeset
336 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
337 error("Mshichmanhodgesmosfet: five internal values expected.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
338 // Time point
94452cb02314 Added src directory
culpo
parents:
diff changeset
339 if (args(5).is_real_scalar())
94452cb02314 Added src directory
culpo
parents:
diff changeset
340 t = args(5).double_value();
94452cb02314 Added src directory
culpo
parents:
diff changeset
341 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
342 error("Mshichmanhodgesmosfet: double type value expected as time instant.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
343 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
344
94452cb02314 Added src directory
culpo
parents:
diff changeset
345 if (!error_state)
94452cb02314 Added src directory
culpo
parents:
diff changeset
346 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
347 //FIXME: create enum of cases and use switch?
94452cb02314 Added src directory
culpo
parents:
diff changeset
348 if (eltype == "NMOS")
94452cb02314 Added src directory
culpo
parents:
diff changeset
349 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
350 //FIXME: change parameters to a single map or Octave_map
94452cb02314 Added src directory
culpo
parents:
diff changeset
351 /* Default n-MOS parameters*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
352 rd = 1e6;
94452cb02314 Added src directory
culpo
parents:
diff changeset
353 W = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
354 L = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
355 mu0 = 1e-5;
94452cb02314 Added src directory
culpo
parents:
diff changeset
356 Vth = .5;
94452cb02314 Added src directory
culpo
parents:
diff changeset
357 Cox = 1e-9;
94452cb02314 Added src directory
culpo
parents:
diff changeset
358 Cgb = Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
359 Cgs = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
360 Cgd = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
361 Csb = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
362 Cdb = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
363 Tshift = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
364
94452cb02314 Added src directory
culpo
parents:
diff changeset
365 /* Overwrite parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
366 set_parameters(parameters, parameternames, &rd, &W, &L, &mu0, &Vth, &Cox, &Cgs, &Cgd, &Cgb, &Csb, &Cdb, &Tshift);
94452cb02314 Added src directory
culpo
parents:
diff changeset
367 //FIXME: debug
94452cb02314 Added src directory
culpo
parents:
diff changeset
368 //print_parameters(rd, W, L, mu0, Vth, Cox, Cgs, Cgd, Cgb, Csb, Cdb, Tshift);
94452cb02314 Added src directory
culpo
parents:
diff changeset
369
94452cb02314 Added src directory
culpo
parents:
diff changeset
370 /* Compute model conductance and capacitance */
94452cb02314 Added src directory
culpo
parents:
diff changeset
371 nmos(extvar,mu0,Cox,W,L,Vth,rd,Tshift,&gm,&gd,&ids,&didT,&P,&dPdT,&dPdvgs,&dPdvds);
94452cb02314 Added src directory
culpo
parents:
diff changeset
372 //FIXME: debug
94452cb02314 Added src directory
culpo
parents:
diff changeset
373 //print_values(gm, gd, ids, didT, P, dPdT, dPdvgs, dPdvds);
94452cb02314 Added src directory
culpo
parents:
diff changeset
374
94452cb02314 Added src directory
culpo
parents:
diff changeset
375 /* Assemble output values*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
376 vg = extvar(0); // V-gate
94452cb02314 Added src directory
culpo
parents:
diff changeset
377 vs = extvar(1); // V-source
94452cb02314 Added src directory
culpo
parents:
diff changeset
378 vd = extvar(2); // V-drain
94452cb02314 Added src directory
culpo
parents:
diff changeset
379 vb = extvar(3); // V-bulk
94452cb02314 Added src directory
culpo
parents:
diff changeset
380 T = extvar(4); // Temperature
94452cb02314 Added src directory
culpo
parents:
diff changeset
381
94452cb02314 Added src directory
culpo
parents:
diff changeset
382 Qgb = intvar(0);
94452cb02314 Added src directory
culpo
parents:
diff changeset
383 Qgs = intvar(1);
94452cb02314 Added src directory
culpo
parents:
diff changeset
384 Qgd = intvar(2);
94452cb02314 Added src directory
culpo
parents:
diff changeset
385 Qsb = intvar(3);
94452cb02314 Added src directory
culpo
parents:
diff changeset
386 Qdb = intvar(4);
94452cb02314 Added src directory
culpo
parents:
diff changeset
387
94452cb02314 Added src directory
culpo
parents:
diff changeset
388 //FIXME: probably a better way to initialize Matrix exist!
94452cb02314 Added src directory
culpo
parents:
diff changeset
389 /* Dynamic matrix (constant) */
94452cb02314 Added src directory
culpo
parents:
diff changeset
390 a(0,5) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
391 a(0,6) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
392 a(0,7) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
393 a(1,6) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
394 a(1,8) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
395 a(2,7) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
396 a(2,9) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
397 a(3,5) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
398 a(3,8) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
399 a(3,9) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
400
94452cb02314 Added src directory
culpo
parents:
diff changeset
401 /* Algebraic part (non-linear) */
94452cb02314 Added src directory
culpo
parents:
diff changeset
402 b(1,0) = -gm;
94452cb02314 Added src directory
culpo
parents:
diff changeset
403 b(1,1) = (gm+gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
404 b(1,2) = -gd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
405 b(1,4) = -didT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
406 b(2,0) = gm;
94452cb02314 Added src directory
culpo
parents:
diff changeset
407 b(2,1) = -(gm+gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
408 b(2,2) = gd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
409 b(2,4) = didT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
410 b(4,0) = dPdvgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
411 b(4,1) = -(dPdvgs+dPdvds);
94452cb02314 Added src directory
culpo
parents:
diff changeset
412 b(4,2) = dPdvds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
413 b(4,4) = dPdT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
414
94452cb02314 Added src directory
culpo
parents:
diff changeset
415 b(5,0) = Cgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
416 b(5,3) = -Cgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
417 b(6,0) = Cgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
418 b(6,1) = -Cgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
419 b(7,0) = Cgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
420 b(7,2) = -Cgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
421 b(8,1) = Csb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
422 b(8,3) = -Csb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
423 b(9,2) = Cdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
424 b(9,3) = -Cdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
425
94452cb02314 Added src directory
culpo
parents:
diff changeset
426 b(5,5) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
427 b(6,6) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
428 b(7,7) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
429 b(8,8) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
430 b(9,9) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
431
94452cb02314 Added src directory
culpo
parents:
diff changeset
432 /* Residual */
94452cb02314 Added src directory
culpo
parents:
diff changeset
433 c(0) = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
434 c(1) = -ids;
94452cb02314 Added src directory
culpo
parents:
diff changeset
435 c(2) = ids;
94452cb02314 Added src directory
culpo
parents:
diff changeset
436 c(4) = P;
94452cb02314 Added src directory
culpo
parents:
diff changeset
437 c(5) = Cgb*(vg - vb) - Qgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
438 c(6) = Cgs*(vg - vs) - Qgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
439 c(7) = Cgd*(vg - vd) - Qgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
440 c(8) = Csb*(vs - vb) - Qsb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
441 c(9) = Cdb*(vd - vb) - Qdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
442
94452cb02314 Added src directory
culpo
parents:
diff changeset
443 /* Return values */
94452cb02314 Added src directory
culpo
parents:
diff changeset
444 retval(0) = octave_value(a);
94452cb02314 Added src directory
culpo
parents:
diff changeset
445 retval(1) = octave_value(b);
94452cb02314 Added src directory
culpo
parents:
diff changeset
446 retval(2) = octave_value(c);
94452cb02314 Added src directory
culpo
parents:
diff changeset
447
94452cb02314 Added src directory
culpo
parents:
diff changeset
448 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
449 else if (eltype == "PMOS")
94452cb02314 Added src directory
culpo
parents:
diff changeset
450 {
94452cb02314 Added src directory
culpo
parents:
diff changeset
451 /* Default p-MOS parameters*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
452 rd = 1e6;
94452cb02314 Added src directory
culpo
parents:
diff changeset
453 W = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
454 L = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
455 mu0 = 1e-5;
94452cb02314 Added src directory
culpo
parents:
diff changeset
456 Vth = -.5;
94452cb02314 Added src directory
culpo
parents:
diff changeset
457 Cox = 1e-9;
94452cb02314 Added src directory
culpo
parents:
diff changeset
458 Cgb = Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
459 Cgs = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
460 Cgd = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
461 Csb = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
462 Cdb = .1*Cox;
94452cb02314 Added src directory
culpo
parents:
diff changeset
463 Tshift = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
464
94452cb02314 Added src directory
culpo
parents:
diff changeset
465 /* Overwrite parameters */
94452cb02314 Added src directory
culpo
parents:
diff changeset
466 set_parameters(parameters, parameternames, &rd, &W, &L, &mu0, &Vth, &Cox, &Cgs, &Cgd, &Cgb, &Csb, &Cdb, &Tshift);
94452cb02314 Added src directory
culpo
parents:
diff changeset
467
94452cb02314 Added src directory
culpo
parents:
diff changeset
468 /* Compute model conductance and capacitance */
94452cb02314 Added src directory
culpo
parents:
diff changeset
469 pmos(extvar,mu0,Cox,W,L,Vth,rd,Tshift,&gm,&gd,&ids,&didT,&P,&dPdT,&dPdvgs,&dPdvds);
94452cb02314 Added src directory
culpo
parents:
diff changeset
470
94452cb02314 Added src directory
culpo
parents:
diff changeset
471 /* Assemble output values*/
94452cb02314 Added src directory
culpo
parents:
diff changeset
472 vg = extvar(0); // V-gate
94452cb02314 Added src directory
culpo
parents:
diff changeset
473 vs = extvar(1); // V-source
94452cb02314 Added src directory
culpo
parents:
diff changeset
474 vd = extvar(2); // V-drain
94452cb02314 Added src directory
culpo
parents:
diff changeset
475 vb = extvar(3); // V-bulk
94452cb02314 Added src directory
culpo
parents:
diff changeset
476 T = extvar(4); // Temperature
94452cb02314 Added src directory
culpo
parents:
diff changeset
477
94452cb02314 Added src directory
culpo
parents:
diff changeset
478 Qgb = intvar(0);
94452cb02314 Added src directory
culpo
parents:
diff changeset
479 Qgs = intvar(1);
94452cb02314 Added src directory
culpo
parents:
diff changeset
480 Qgd = intvar(2);
94452cb02314 Added src directory
culpo
parents:
diff changeset
481 Qsb = intvar(3);
94452cb02314 Added src directory
culpo
parents:
diff changeset
482 Qdb = intvar(4);
94452cb02314 Added src directory
culpo
parents:
diff changeset
483
94452cb02314 Added src directory
culpo
parents:
diff changeset
484 /* Dynamic matrix (constant) */
94452cb02314 Added src directory
culpo
parents:
diff changeset
485 a(0,5) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
486 a(0,6) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
487 a(0,7) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
488 a(1,6) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
489 a(1,8) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
490 a(2,7) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
491 a(2,9) = 1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
492 a(3,5) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
493 a(3,8) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
494 a(3,9) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
495
94452cb02314 Added src directory
culpo
parents:
diff changeset
496 /* Algebraic part (non-linear) */
94452cb02314 Added src directory
culpo
parents:
diff changeset
497 b(1,0) = -gm;
94452cb02314 Added src directory
culpo
parents:
diff changeset
498 b(1,1) = (gm+gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
499 b(1,2) = -gd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
500 b(1,4) = -didT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
501 b(2,0) = gm;
94452cb02314 Added src directory
culpo
parents:
diff changeset
502 b(2,1) = -(gm+gd);
94452cb02314 Added src directory
culpo
parents:
diff changeset
503 b(2,2) = gd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
504 b(2,4) = didT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
505 b(4,0) = dPdvgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
506 b(4,1) = -(dPdvgs+dPdvds);
94452cb02314 Added src directory
culpo
parents:
diff changeset
507 b(4,2) = dPdvds;
94452cb02314 Added src directory
culpo
parents:
diff changeset
508 b(4,4) = dPdT;
94452cb02314 Added src directory
culpo
parents:
diff changeset
509
94452cb02314 Added src directory
culpo
parents:
diff changeset
510 b(5,0) = Cgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
511 b(5,3) = -Cgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
512 b(6,0) = Cgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
513 b(6,1) = -Cgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
514 b(7,0) = Cgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
515 b(7,2) = -Cgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
516 b(8,1) = Csb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
517 b(8,3) = -Csb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
518 b(9,2) = Cdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
519 b(9,3) = -Cdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
520
94452cb02314 Added src directory
culpo
parents:
diff changeset
521 b(5,5) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
522 b(6,6) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
523 b(7,7) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
524 b(8,8) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
525 b(9,9) = -1;
94452cb02314 Added src directory
culpo
parents:
diff changeset
526
94452cb02314 Added src directory
culpo
parents:
diff changeset
527 /* Residual */
94452cb02314 Added src directory
culpo
parents:
diff changeset
528 c(0) = 0;
94452cb02314 Added src directory
culpo
parents:
diff changeset
529 c(1) = -ids;
94452cb02314 Added src directory
culpo
parents:
diff changeset
530 c(2) = ids;
94452cb02314 Added src directory
culpo
parents:
diff changeset
531 c(4) = P;
94452cb02314 Added src directory
culpo
parents:
diff changeset
532 c(5) = Cgb*(vg - vb) - Qgb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
533 c(6) = Cgs*(vg - vs) - Qgs;
94452cb02314 Added src directory
culpo
parents:
diff changeset
534 c(7) = Cgd*(vg - vd) - Qgd;
94452cb02314 Added src directory
culpo
parents:
diff changeset
535 c(8) = Csb*(vs - vb) - Qsb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
536 c(9) = Cdb*(vd - vb) - Qdb;
94452cb02314 Added src directory
culpo
parents:
diff changeset
537
94452cb02314 Added src directory
culpo
parents:
diff changeset
538 /* Return values */
94452cb02314 Added src directory
culpo
parents:
diff changeset
539 retval(0) = octave_value(a);
94452cb02314 Added src directory
culpo
parents:
diff changeset
540 retval(1) = octave_value(b);
94452cb02314 Added src directory
culpo
parents:
diff changeset
541 retval(2) = octave_value(c);
94452cb02314 Added src directory
culpo
parents:
diff changeset
542 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
543 else
94452cb02314 Added src directory
culpo
parents:
diff changeset
544 error("Mshichmanhodgesmosfet: unknown element type.\n");
94452cb02314 Added src directory
culpo
parents:
diff changeset
545
94452cb02314 Added src directory
culpo
parents:
diff changeset
546 }
94452cb02314 Added src directory
culpo
parents:
diff changeset
547
12674
3ce60a1159f8 fix bug in documentation
cdf
parents: 12660
diff changeset
548 return (retval);
6667
94452cb02314 Added src directory
culpo
parents:
diff changeset
549 }