KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_library_spice.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2022-2023 KiCad Developers, see AUTHORS.TXT for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
25#include <eeschema_test_utils.h>
27
28#include <boost/algorithm/string/case_conv.hpp>
29#include <fmt/core.h>
30#include <locale_io.h>
31
32
34{
35public:
36 std::string GetLibraryPath( const std::string& aBaseName )
37 {
38 wxFileName fn( KI_TEST::GetEeschemaTestDataDir() );
39 fn.AppendDir( "spice_netlists" );
40 fn.AppendDir( "libraries" );
41 fn.SetName( aBaseName );
42 fn.SetExt( "lib.spice" );
43
44 return std::string( fn.GetFullPath().ToUTF8() );
45 }
46
47 void LoadLibrary( const std::string& aBaseName )
48 {
49 NULL_REPORTER devnull;
50 std::string path = GetLibraryPath( aBaseName );
51
52 m_library = std::make_unique<SIM_LIBRARY_SPICE>( true );
53 m_library->ReadFile( path, devnull );
54 }
55
56 void CompareToUsualDiodeModel( const SIM_MODEL& aModel, const std::string& aModelName, int aModelIndex )
57 {
58 BOOST_CHECK( aModel.GetType() == SIM_MODEL::TYPE::D );
59 BOOST_CHECK_EQUAL( aModelName,
60 fmt::format( "{}{}_Usual",
61 boost::to_upper_copy( aModel.GetSpiceInfo().modelType ),
62 aModelIndex ) );
63 BOOST_CHECK_EQUAL( aModel.FindParam( "bv" )->value, "1.1u" );
64 BOOST_CHECK_EQUAL( aModel.FindParam( "cjo" )->value, "2.2m" );
65 BOOST_CHECK_EQUAL( aModel.FindParam( "ibv" )->value, "3.3" );
66 BOOST_CHECK_EQUAL( aModel.FindParam( "is" )->value, "4.4k" );
67 BOOST_CHECK_EQUAL( aModel.FindParam( "m_" )->value, "5.5M" );
68 BOOST_CHECK_EQUAL( aModel.FindParam( "n" )->value, "6.6G" );
69 }
70
71 void CompareToEmptyModel( const SIM_MODEL& aModel, const std::string& aModelName, int aModelIndex )
72 {
73 BOOST_TEST_CONTEXT( "Model index: " << aModelIndex )
74 {
75 BOOST_CHECK_EQUAL( aModelName,
76 fmt::format( "{}{}_Empty",
77 boost::to_upper_copy( aModel.GetSpiceInfo().modelType ),
78 aModelIndex ) );
79
80 for( unsigned i = 0; i < aModel.GetParamCount(); ++i )
81 {
82 BOOST_TEST_CONTEXT( "Param name: " << aModel.GetParam( i ).info.name )
83 {
84 BOOST_CHECK_EQUAL( aModel.GetParamOverride( i ).value, "" );
85 }
86 }
87 }
88 }
89
90 void TestTransistor( const SIM_MODEL& aModel, const std::string& aModelName, int aModelIndex,
91 SIM_MODEL::TYPE aType, const std::vector<std::string>& aParamNames )
92 {
93 BOOST_TEST_CONTEXT( "Model index: " << aModelIndex
94 << ", Model name: " << aModelName
95 << ", Model device type: " << aModel.GetDeviceInfo().fieldValue
96 << ", Model type: " << aModel.GetTypeInfo().fieldValue )
97 {
98 BOOST_CHECK( aModel.GetType() == aType );
99
100 std::string modelType = aModel.GetSpiceInfo().modelType;
101 std::string fieldValue = aModel.GetTypeInfo().fieldValue;
102
103 // Special case for VDMOS because Ngspice parses it differently.
104 if( modelType == "VDMOS NCHAN" )
105 {
106 modelType = "NMOS";
107 fieldValue = "VD"; // Not "VDMOS" because Ngspice gives an error if this string is
108 // used in a model name (this is a bug in Ngspice, FIXME).
109 }
110
111 if( modelType == "VDMOS PCHAN" )
112 {
113 modelType = "PMOS";
114 fieldValue = "VD";
115 }
116
117 BOOST_CHECK_EQUAL( aModelName, fmt::format( "_{}_{}_{}",
118 aModelIndex,
119 modelType,
120 fieldValue ) );
121
122 for( int i = 0; i < aParamNames.size(); ++i )
123 {
124 std::string paramName = aParamNames.at( i );
125 const SIM_MODEL::PARAM* param = aModel.FindParam( paramName );
126
127 BOOST_TEST_CONTEXT( "Param name: " << paramName )
128 {
129 if( i % 10 == 0 )
130 {
131 BOOST_CHECK( param->value == "0M" || param->value == "0" );
132 }
133 else if( param->info.type == SIM_VALUE::TYPE_INT )
134 {
135 BOOST_CHECK_EQUAL( param->value, fmt::format( "{:d}", i % 10 ) );
136 }
138 {
139 BOOST_CHECK_EQUAL( param->value, "" );
140 }
141 else
142 {
143 BOOST_CHECK_EQUAL( param->value, fmt::format( "{}000.0{}M", i % 10, i % 10 ) );
144 }
145 }
146 }
147 }
148 }
149
150 std::unique_ptr<SIM_LIBRARY_SPICE> m_library;
151};
152
153
154BOOST_FIXTURE_TEST_SUITE( SimLibrarySpice, TEST_SIM_LIBRARY_SPICE_FIXTURE )
155
156
158{
159 LOCALE_IO toggle;
160
161 LoadLibrary( "subckts" );
162
163 const std::vector<SIM_LIBRARY::MODEL> models = m_library->GetModels();
164
165 BOOST_CHECK_EQUAL( models.size(), 7 );
166
167 for( int i = 0; i < models.size(); ++i )
168 {
169 const auto& [modelName, model] = models.at( i );
170
171 switch( i )
172 {
173 case 0:
174 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
175 BOOST_CHECK_EQUAL( modelName, "NO_PARAMS_0" );
176 break;
177
178 case 1:
179 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
180 BOOST_CHECK_EQUAL( modelName, "ONE_PARAM_1" );
181 BOOST_REQUIRE_EQUAL( model.GetParamCount(), 1 );
182 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "PARAM1" );
183 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1" );
184 BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
185 BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
186 BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
187 break;
188
189 case 2:
190 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
191 BOOST_CHECK_EQUAL( modelName, "ONE_PARAM_SHORT_FORM_2" );
192 BOOST_REQUIRE_EQUAL( model.GetParamCount(), 1 );
193 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "PARAM1" );
194 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.0" );
195 BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
196 BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
197 break;
198
199 case 3:
200 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
201 BOOST_CHECK_EQUAL( modelName, "two_params_3" );
202 BOOST_REQUIRE_EQUAL( model.GetParamCount(), 2 );
203 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "param1" );
204 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.1e+1" );
205 BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.name, "param2" );
206 BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.defaultValue, "2.2e+2" );
207 BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
208 BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
209 BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
210 break;
211
212 case 4:
213 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
214 BOOST_CHECK_EQUAL( modelName, "two_params_short_form_4" );
215 BOOST_REQUIRE_EQUAL( model.GetParamCount(), 2 );
216 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "param1" );
217 BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.1E+1" );
218 BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.name, "param2" );
219 BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.defaultValue, "2.2E+2" );
220 BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
221 BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
222 BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
223 break;
224
225 case 5:
226 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
227 BOOST_CHECK_EQUAL( modelName, "NOTHING_5" );
228 BOOST_CHECK_EQUAL( model.GetParamCount(), 0 );
229 BOOST_CHECK_EQUAL( model.GetPinCount(), 0 );
230 break;
231
232 case 6:
233 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
234 BOOST_CHECK_EQUAL( modelName, "Numparam_inside_6" );
235 BOOST_CHECK_EQUAL( model.GetParamCount(), 0 );
236 BOOST_CHECK_EQUAL( model.GetPinCount(), 2 );
237 break;
238 }
239 }
240}
241
242
244{
245 LOCALE_IO toggle;
246
247 LoadLibrary( "diodes" );
248
249 const std::vector<SIM_LIBRARY::MODEL> models = m_library->GetModels();
250
251 BOOST_CHECK_EQUAL( models.size(), 26 );
252
253 for( int i = 0; i < models.size(); ++i )
254 {
255 const auto& [modelName, model] = models.at( i );
256
257 switch( i )
258 {
259 case 0:
260 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
261 BOOST_CHECK_EQUAL( modelName, "1N4148" );
262 BOOST_CHECK_EQUAL( model.FindParam( "bv" )->value, "100" );
263 BOOST_CHECK_EQUAL( model.FindParam( "cjo" )->value, "4p" );
264 BOOST_CHECK_EQUAL( model.FindParam( "ibv" )->value, "100u" );
265 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "4n" );
266 BOOST_CHECK_EQUAL( model.FindParam( "m_" )->value, "0.33" );
267 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "2" );
268 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "0.5" );
269 BOOST_CHECK_EQUAL( model.FindParam( "tt" )->value, "10n" );
270 BOOST_CHECK_EQUAL( model.FindParam( "vj" )->value, "0.8" );
271 break;
272
273 case 1:
274 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
275 BOOST_CHECK_EQUAL( modelName, "D1" );
276 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "1.23n" );
277 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "1.23" );
278 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "0.789" );
279 BOOST_CHECK_EQUAL( model.FindParam( "ikf" )->value, "12.34m" );
280 BOOST_CHECK_EQUAL( model.FindParam( "xti" )->value, "3" );
281 BOOST_CHECK_EQUAL( model.FindParam( "eg" )->value, "1.23" );
282 BOOST_CHECK_EQUAL( model.FindParam( "cjo" )->value, "0.9p" );
283 BOOST_CHECK_EQUAL( model.FindParam( "m_" )->value, "0.56" );
284 BOOST_CHECK_EQUAL( model.FindParam( "vj" )->value, "0.78" );
285 BOOST_CHECK_EQUAL( model.FindParam( "fc" )->value, "0.9" );
286 BOOST_CHECK_EQUAL( model.FindParam( "isr" )->value, "12.34n" );
287 BOOST_CHECK_EQUAL( model.FindParam( "nr" )->value, "2.345" );
288 BOOST_CHECK_EQUAL( model.FindParam( "bv" )->value, "100" );
289 BOOST_CHECK_EQUAL( model.FindParam( "ibv" )->value, "100u" );
290 BOOST_CHECK_EQUAL( model.FindParam( "tt" )->value, "12.34n" );
291 break;
292
293 case 2:
294 case 3:
295 CompareToUsualDiodeModel( model, modelName, i );
296 break;
297
298 case 4:
299 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
300 BOOST_CHECK_EQUAL( modelName, "D4" );
301 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "0.1p" );
302 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "2" );
303 BOOST_CHECK_EQUAL( model.FindParam( "cjo" )->value, "3p" );
304 BOOST_CHECK_EQUAL( model.FindParam( "tt" )->value, "45n" );
305 BOOST_CHECK_EQUAL( model.FindParam( "bv" )->value, "678" );
306 BOOST_CHECK_EQUAL( model.FindParam( "ibv" )->value, "0.1p" );
307 break;
308
309 case 5:
310 case 6:
311 case 7:
312 case 8:
313 case 9:
314 CompareToEmptyModel( model, modelName, i );
315 break;
316
317 case 10:
318 case 11:
319 case 12:
320 case 13:
321 case 14:
322 case 15:
323 case 16:
324 case 17:
325 CompareToUsualDiodeModel( model, modelName, i );
326 break;
327
328 case 18:
329 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
330 BOOST_CHECK_EQUAL( modelName, "D<>/?:\\|[]!@#$%^&-_18" );
331 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "-1.1" );
332 BOOST_CHECK_EQUAL( model.FindParam( "m_" )->value, "2.2" );
333 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "-3.3m" );
334 BOOST_CHECK_EQUAL( model.FindParam( "ibv" )->value, "44k" );
335 BOOST_CHECK_EQUAL( model.FindParam( "cjo" )->value, "55u" );
336 BOOST_CHECK_EQUAL( model.FindParam( "bv" )->value, "6.6M" );
337 break;
338
339 case 19:
340 case 20:
341 case 21:
342 CompareToUsualDiodeModel( model, modelName, i );
343 break;
344
345 case 22:
346 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
347 BOOST_CHECK_EQUAL( modelName, "D22" );
348 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "11.1n" );
349 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "2.2" );
350 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "33.3m" );
351 BOOST_CHECK_EQUAL( model.FindParam( "ikf" )->value, "99.9" );
352 BOOST_CHECK_EQUAL( model.FindParam( "xti" )->value, "3" );
353 BOOST_CHECK_EQUAL( model.FindParam( "eg" )->value, "1.1" );
354 break;
355
356 case 23:
357 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
358 BOOST_CHECK_EQUAL( modelName, "D23" );
359 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "11.1n" );
360 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "2.2" );
361 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "33.3m" );
362 BOOST_CHECK_EQUAL( model.FindParam( "ikf" )->value, "111.1" );
363 BOOST_CHECK_EQUAL( model.FindParam( "xti" )->value, "3" );
364 BOOST_CHECK_EQUAL( model.FindParam( "eg" )->value, "2.2" );
365 BOOST_CHECK_EQUAL( model.FindParam( "m_" )->value, "0.3" );
366 break;
367
368 case 24:
369 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
370 BOOST_CHECK_EQUAL( modelName, "D24" );
371 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "11.1n" );
372 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "1.1" );
373 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "33.3m" );
374 BOOST_CHECK_EQUAL( model.FindParam( "ikf" )->value, "99.9" );
375 BOOST_CHECK_EQUAL( model.FindParam( "xti" )->value, "3" );
376 BOOST_CHECK_EQUAL( model.FindParam( "eg" )->value, "1.1" );
377 break;
378
379 case 25:
380 BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::D );
381 BOOST_CHECK_EQUAL( modelName, "D25" );
382 //level
383 BOOST_CHECK_EQUAL( model.FindParam( "is" )->value, "0M" );
384 //js
385 BOOST_CHECK_EQUAL( model.FindParam( "jsw" )->value, "1000.01M" );
386 BOOST_CHECK_EQUAL( model.FindParam( "tnom" )->value, "2000.02M" );
387 //tref
388 BOOST_CHECK_EQUAL( model.FindParam( "rs" )->value, "3000.03M" );
389 BOOST_CHECK_EQUAL( model.FindParam( "trs" )->value, "4000.04M" );
390 //trs1
391 BOOST_CHECK_EQUAL( model.FindParam( "trs2" )->value, "5000.05M" );
392 BOOST_CHECK_EQUAL( model.FindParam( "n" )->value, "6000.06M" );
393 BOOST_CHECK_EQUAL( model.FindParam( "ns" )->value, "7000.07M" );
394 BOOST_CHECK_EQUAL( model.FindParam( "tt" )->value, "8000.08M" );
395 BOOST_CHECK_EQUAL( model.FindParam( "ttt1" )->value, "9000.09M" );
396 BOOST_CHECK_EQUAL( model.FindParam( "ttt2" )->value, "0M" );
397 BOOST_CHECK_EQUAL( model.FindParam( "cjo" )->value, "1000.01M" );
398 //cj0
399 //cj
400 BOOST_CHECK_EQUAL( model.FindParam( "vj" )->value, "2000.02M" );
401 //pb
402 BOOST_CHECK_EQUAL( model.FindParam( "m_" )->value, "3000.03M" );
403 //mj
404 BOOST_CHECK_EQUAL( model.FindParam( "tm1" )->value, "4000.04M" );
405 BOOST_CHECK_EQUAL( model.FindParam( "tm2" )->value, "5000.05M" );
406 BOOST_CHECK_EQUAL( model.FindParam( "cjp" )->value, "6000.06M" );
407 //cjsw
408 BOOST_CHECK_EQUAL( model.FindParam( "php" )->value, "7000.07M" );
409 BOOST_CHECK_EQUAL( model.FindParam( "mjsw" )->value, "8000.08M" );
410 BOOST_CHECK_EQUAL( model.FindParam( "ikf" )->value, "9000.09M" );
411 //ik
412 BOOST_CHECK_EQUAL( model.FindParam( "ikr" )->value, "0M" );
413 BOOST_CHECK_EQUAL( model.FindParam( "nbv" )->value, "1000.01M" );
414 BOOST_CHECK_EQUAL( model.FindParam( "area_" )->value, "2000.02M" );
415 BOOST_CHECK_EQUAL( model.FindParam( "pj_" )->value, "3000.03M" );
416 BOOST_CHECK_EQUAL( model.FindParam( "tlev" )->value, "4" );
417 BOOST_CHECK_EQUAL( model.FindParam( "tlevc" )->value, "5" );
418 BOOST_CHECK_EQUAL( model.FindParam( "eg" )->value, "6000.06M" );
419 BOOST_CHECK_EQUAL( model.FindParam( "xti" )->value, "7000.07M" );
420 BOOST_CHECK_EQUAL( model.FindParam( "cta" )->value, "8000.08M" );
421 //ctc
422 BOOST_CHECK_EQUAL( model.FindParam( "ctp" )->value, "9000.09M" );
423 BOOST_CHECK_EQUAL( model.FindParam( "tpb" )->value, "0M" );
424 //tvj
425 BOOST_CHECK_EQUAL( model.FindParam( "tphp" )->value, "1000.01M" );
426 BOOST_CHECK_EQUAL( model.FindParam( "jtun" )->value, "2000.02M" );
427 BOOST_CHECK_EQUAL( model.FindParam( "jtunsw" )->value, "3000.03M" );
428 BOOST_CHECK_EQUAL( model.FindParam( "ntun" )->value, "4000.04M" );
429 BOOST_CHECK_EQUAL( model.FindParam( "xtitun" )->value, "5000.05M" );
430 BOOST_CHECK_EQUAL( model.FindParam( "keg" )->value, "6000.06M" );
431 BOOST_CHECK_EQUAL( model.FindParam( "kf" )->value, "7000.07M" );
432 BOOST_CHECK_EQUAL( model.FindParam( "af" )->value, "8000.08M" );
433 BOOST_CHECK_EQUAL( model.FindParam( "fc" )->value, "9000.09M" );
434 BOOST_CHECK_EQUAL( model.FindParam( "fcs" )->value, "0M" );
435 BOOST_CHECK_EQUAL( model.FindParam( "bv" )->value, "1000.01M" );
436 BOOST_CHECK_EQUAL( model.FindParam( "ibv" )->value, "2000.02M" );
437 //ib
438 BOOST_CHECK_EQUAL( model.FindParam( "tcv" )->value, "3000.03M" );
439 BOOST_CHECK_EQUAL( model.FindParam( "cond" )->value, "4000.04M" );
440 BOOST_CHECK_EQUAL( model.FindParam( "isr" )->value, "5000.05M" );
441 BOOST_CHECK_EQUAL( model.FindParam( "nr" )->value, "6000.06M" );
442 BOOST_CHECK_EQUAL( model.FindParam( "fv_max" )->value, "7000.07M" );
443 BOOST_CHECK_EQUAL( model.FindParam( "bv_max" )->value, "8000.08M" );
444 BOOST_CHECK_EQUAL( model.FindParam( "id_max" )->value, "9000.09M" );
445 BOOST_CHECK_EQUAL( model.FindParam( "te_max" )->value, "0M" );
446 BOOST_CHECK_EQUAL( model.FindParam( "pd_max" )->value, "1000.01M" );
447 BOOST_CHECK_EQUAL( model.FindParam( "rth0" )->value, "2000.02M" );
448 BOOST_CHECK_EQUAL( model.FindParam( "cth0" )->value, "3000.03M" );
449 BOOST_CHECK_EQUAL( model.FindParam( "lm_" )->value, "4000.04M" );
450 BOOST_CHECK_EQUAL( model.FindParam( "lp_" )->value, "5000.05M" );
451 BOOST_CHECK_EQUAL( model.FindParam( "wm_" )->value, "6000.06M" );
452 BOOST_CHECK_EQUAL( model.FindParam( "wp_" )->value, "7000.07M" );
453 BOOST_CHECK_EQUAL( model.FindParam( "xom" )->value, "8000.08M" );
454 BOOST_CHECK_EQUAL( model.FindParam( "xoi" )->value, "9000.09M" );
455 BOOST_CHECK_EQUAL( model.FindParam( "xm" )->value, "0M" );
456 BOOST_CHECK_EQUAL( model.FindParam( "xp" )->value, "1000.01M" );
457 //d
458 break;
459
460 default:
461 BOOST_FAIL( "Unknown parameter index" );
462 break;
463 }
464 }
465}
466
467
469{
470 LOCALE_IO toggle;
471
472 LoadLibrary( "bjts" );
473
474 const std::vector<SIM_LIBRARY::MODEL> models = m_library->GetModels();
475
476 BOOST_CHECK_EQUAL( models.size(), 8 );
477
478 for( int i = 0; i < models.size(); ++i )
479 {
480 const auto& [modelName, model] = models.at( i );
481
482 switch( i )
483 {
484
485 case 0:
486 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NPN_VBIC,
487 {
488 "rcx",
489 "rci",
490 "vo",
491 "gamm",
492 "hrcf",
493 "rbx",
494 "rbi",
495 "re",
496 "rs",
497 "rbp",
498 "is_",
499 "nf",
500 "nr",
501 "fc",
502 "cbeo",
503 "cje",
504 "pe",
505 "me",
506 "aje",
507 "cbco",
508 "cjc",
509 "qco",
510 "cjep",
511 "pc",
512 "mc",
513 "ajc",
514 "cjcp",
515 "ps",
516 "ms",
517 "ajs",
518 "ibei",
519 "wbe",
520 "nei",
521 "iben",
522 "nen",
523 "ibci",
524 "nci",
525 "ibcn",
526 "ncn",
527 "avc1",
528 "avc2",
529 "isp",
530 "wsp",
531 "nfp",
532 "ibeip",
533 "ibenp",
534 "ibcip",
535 "ncip",
536 "ibcnp",
537 "ncnp",
538 "vef",
539 "ver",
540 "ikf",
541 "ikr",
542 "ikp",
543 "tf",
544 "qtf",
545 "xtf",
546 "vtf",
547 "itf",
548 "tr",
549 "td",
550 "kfn",
551 "afn",
552 "bfn",
553 "xre",
554 "xrb",
555 "xrbi",
556 "xrc",
557 "xrci",
558 "xrs",
559 "xvo",
560 "ea",
561 "eaie",
562 "eaic",
563 "eais",
564 "eane",
565 "eanc",
566 "eans",
567 "xis",
568 "xii",
569 "xin",
570 "tnf",
571 "tavc",
572 "rth",
573 "cth",
574 "vrt",
575 "art",
576 "ccso",
577 "qbm",
578 "nkf",
579 "xikf",
580 "xrcx",
581 "xrbx",
582 "xrbp",
583 "isrr",
584 "xisr",
585 "dear",
586 "eap",
587 "vbbe",
588 "nbbe",
589 "ibbe",
590 "tvbbe1",
591 "tvbbe2",
592 "tnbbe",
593 "ebbe",
594 "dtemp_",
595 "vers",
596 "vref",
597 "vbe_max",
598 "vbc_max",
599 "vce_max"
600 } );
601 break;
602
603 case 1:
604 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PNP_VBIC,
605 {
606 "rcx",
607 "rci",
608 "vo",
609 "gamm",
610 "hrcf",
611 "rbx",
612 "rbi",
613 "re",
614 "rs",
615 "rbp",
616 "is_",
617 "nf",
618 "nr",
619 "fc",
620 "cbeo",
621 "cje",
622 "pe",
623 "me",
624 "aje",
625 "cbco",
626 "cjc",
627 "qco",
628 "cjep",
629 "pc",
630 "mc",
631 "ajc",
632 "cjcp",
633 "ps",
634 "ms",
635 "ajs",
636 "ibei",
637 "wbe",
638 "nei",
639 "iben",
640 "nen",
641 "ibci",
642 "nci",
643 "ibcn",
644 "ncn",
645 "avc1",
646 "avc2",
647 "isp",
648 "wsp",
649 "nfp",
650 "ibeip",
651 "ibenp",
652 "ibcip",
653 "ncip",
654 "ibcnp",
655 "ncnp",
656 "vef",
657 "ver",
658 "ikf",
659 "ikr",
660 "ikp",
661 "tf",
662 "qtf",
663 "xtf",
664 "vtf",
665 "itf",
666 "tr",
667 "td",
668 "kfn",
669 "afn",
670 "bfn",
671 "xre",
672 "xrb",
673 "xrbi",
674 "xrc",
675 "xrci",
676 "xrs",
677 "xvo",
678 "ea",
679 "eaie",
680 "eaic",
681 "eais",
682 "eane",
683 "eanc",
684 "eans",
685 "xis",
686 "xii",
687 "xin",
688 "tnf",
689 "tavc",
690 "rth",
691 "cth",
692 "vrt",
693 "art",
694 "ccso",
695 "qbm",
696 "nkf",
697 "xikf",
698 "xrcx",
699 "xrbx",
700 "xrbp",
701 "isrr",
702 "xisr",
703 "dear",
704 "eap",
705 "vbbe",
706 "nbbe",
707 "ibbe",
708 "tvbbe1",
709 "tvbbe2",
710 "tnbbe",
711 "ebbe",
712 "dtemp_",
713 "vers",
714 "vref",
715 "vbe_max",
716 "vbc_max",
717 "vce_max"
718 } );
719 break;
720
721 case 2:
722 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NPN_GUMMELPOON,
723 {
724 "is_",
725 "nf",
726 "ise",
727 "ne",
728 "bf",
729 "ikf",
730 "vaf",
731 "nr",
732 "isc",
733 "nc",
734 "br",
735 "ikr",
736 "var",
737 "rb",
738 "irb",
739 "rbm",
740 "re",
741 "rc",
742 "xtb",
743 "eg",
744 "xti",
745 "cje",
746 "vje",
747 "mje",
748 "tf",
749 "xtf",
750 "vtf",
751 "itf",
752 "ptf",
753 "cjc",
754 "vjc",
755 "mjc",
756 "xcjc",
757 "tr",
758 "cjs",
759 "vjs",
760 "mjs",
761 "fc"
762 } );
763 break;
764
765 case 3:
766 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PNP_GUMMELPOON,
767 {
768 "is_",
769 "nf",
770 "ise",
771 "ne",
772 "bf",
773 "ikf",
774 "vaf",
775 "nr",
776 "isc",
777 "nc",
778 "br",
779 "ikr",
780 "var",
781 "rb",
782 "irb",
783 "rbm",
784 "re",
785 "rc",
786 "xtb",
787 "eg",
788 "xti",
789 "cje",
790 "vje",
791 "mje",
792 "tf",
793 "xtf",
794 "vtf",
795 "itf",
796 "ptf",
797 "cjc",
798 "vjc",
799 "mjc",
800 "xcjc",
801 "tr",
802 "cjs",
803 "vjs",
804 "mjs",
805 "fc"
806 } );
807 break;
808
809 case 4:
810 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NPN_HICUM2,
811 {
812 "c10",
813 "qp0",
814 "ich",
815 "hf0",
816 "hfe",
817 "hfc",
818 "hjei",
819 "ahjei",
820 "rhjei",
821 "hjci",
822 "ibeis",
823 "mbei",
824 "ireis",
825 "mrei",
826 "ibeps",
827 "mbep",
828 "ireps",
829 "mrep",
830 "mcf",
831 "tbhrec",
832 "ibcis",
833 "mbci",
834 "ibcxs",
835 "mbcx",
836 "ibets",
837 "abet",
838 "tunode",
839 "favl",
840 "qavl",
841 "kavl",
842 "alfav",
843 "alqav",
844 "alkav",
845 "rbi0",
846 "rbx",
847 "fgeo",
848 "fdqr0",
849 "fcrbi",
850 "fqi",
851 "re",
852 "rcx",
853 "itss",
854 "msf",
855 "iscs",
856 "msc",
857 "tsf",
858 "rsu",
859 "csu",
860 "cjei0",
861 "vdei",
862 "zei",
863 "ajei",
864 //"aljei", Alias.
865 "cjep0",
866 "vdep",
867 "zep",
868 "ajep",
869 //"aljep", Alias.
870 "cjci0",
871 "vdci",
872 "zci",
873 "vptci",
874 "cjcx0",
875 "vdcx",
876 "zcx",
877 "vptcx",
878 "fbcpar",
879 //"fbc", Alias.
880 "fbepar",
881 //"fbe", Alias.
882 "cjs0",
883 "vds",
884 "zs",
885 "vpts",
886 "cscp0",
887 "vdsp",
888 "zsp",
889 "vptsp",
890 "t0",
891 "dt0h",
892 "tbvl",
893 "tef0",
894 "gtfe",
895 "thcs",
896 "ahc",
897 //"alhc", Alias.
898 "fthc",
899 "rci0",
900 "vlim",
901 "vces",
902 "vpt",
903 "aick",
904 "delck",
905 "tr",
906 "vcbar",
907 "icbar",
908 "acbar",
909 "cbepar",
910 //"ceox", Alias.
911 "cbcpar",
912 //"ccox", Alias.
913 "alqf",
914 "alit",
915 "flnqs",
916 "kf",
917 "af",
918 "cfbe",
919 "flcono",
920 "kfre",
921 "afre",
922 "latb",
923 "latl",
924 "vgb",
925 "alt0",
926 "kt0",
927 "zetaci",
928 "alvs",
929 "alces",
930 "zetarbi",
931 "zetarbx",
932 "zetarcx",
933 "zetare",
934 "zetacx",
935 "vge",
936 "vgc",
937 "vgs",
938 "f1vg",
939 "f2vg",
940 "zetact",
941 "zetabet",
942 "alb",
943 "dvgbe",
944 "zetahjei",
945 "zetavgbe",
946 "flsh",
947 "rth",
948 "zetarth",
949 "alrth",
950 "cth",
951 "flcomp",
952 "vbe_max",
953 "vbc_max",
954 "vce_max"
955 } );
956 break;
957
958 case 5:
959 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PNP_HICUM2,
960 {
961 "c10",
962 "qp0",
963 "ich",
964 "hf0",
965 "hfe",
966 "hfc",
967 "hjei",
968 "ahjei",
969 "rhjei",
970 "hjci",
971 "ibeis",
972 "mbei",
973 "ireis",
974 "mrei",
975 "ibeps",
976 "mbep",
977 "ireps",
978 "mrep",
979 "mcf",
980 "tbhrec",
981 "ibcis",
982 "mbci",
983 "ibcxs",
984 "mbcx",
985 "ibets",
986 "abet",
987 "tunode",
988 "favl",
989 "qavl",
990 "kavl",
991 "alfav",
992 "alqav",
993 "alkav",
994 "rbi0",
995 "rbx",
996 "fgeo",
997 "fdqr0",
998 "fcrbi",
999 "fqi",
1000 "re",
1001 "rcx",
1002 "itss",
1003 "msf",
1004 "iscs",
1005 "msc",
1006 "tsf",
1007 "rsu",
1008 "csu",
1009 "cjei0",
1010 "vdei",
1011 "zei",
1012 "ajei",
1013 //"aljei", Alias.
1014 "cjep0",
1015 "vdep",
1016 "zep",
1017 "ajep",
1018 //"aljep", Alias.
1019 "cjci0",
1020 "vdci",
1021 "zci",
1022 "vptci",
1023 "cjcx0",
1024 "vdcx",
1025 "zcx",
1026 "vptcx",
1027 "fbcpar",
1028 //"fbc", Alias.
1029 "fbepar",
1030 //"fbe", Alias.
1031 "cjs0",
1032 "vds",
1033 "zs",
1034 "vpts",
1035 "cscp0",
1036 "vdsp",
1037 "zsp",
1038 "vptsp",
1039 "t0",
1040 "dt0h",
1041 "tbvl",
1042 "tef0",
1043 "gtfe",
1044 "thcs",
1045 "ahc",
1046 //"alhc", Alias.
1047 "fthc",
1048 "rci0",
1049 "vlim",
1050 "vces",
1051 "vpt",
1052 "aick",
1053 "delck",
1054 "tr",
1055 "vcbar",
1056 "icbar",
1057 "acbar",
1058 "cbepar",
1059 //"ceox", Alias.
1060 "cbcpar",
1061 //"ccox", Alias.
1062 "alqf",
1063 "alit",
1064 "flnqs",
1065 "kf",
1066 "af",
1067 "cfbe",
1068 "flcono",
1069 "kfre",
1070 "afre",
1071 "latb",
1072 "latl",
1073 "vgb",
1074 "alt0",
1075 "kt0",
1076 "zetaci",
1077 "alvs",
1078 "alces",
1079 "zetarbi",
1080 "zetarbx",
1081 "zetarcx",
1082 "zetare",
1083 "zetacx",
1084 "vge",
1085 "vgc",
1086 "vgs",
1087 "f1vg",
1088 "f2vg",
1089 "zetact",
1090 "zetabet",
1091 "alb",
1092 "dvgbe",
1093 "zetahjei",
1094 "zetavgbe",
1095 "flsh",
1096 "rth",
1097 "zetarth",
1098 "alrth",
1099 "cth",
1100 "flcomp",
1101 "vbe_max",
1102 "vbc_max",
1103 "vce_max"
1104 } );
1105
1106 break;
1107
1108 case 6:
1109 case 7:
1110 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NPN_GUMMELPOON,
1111 { "is_", "nf", "ise", "ne", "bf", "ikf", "vaf", "nr", "isc", "nc" } );
1112 break;
1113 }
1114 }
1115}
1116
1117
1119{
1120 LOCALE_IO toggle;
1121
1122 LoadLibrary( "fets" );
1123
1124 const std::vector<SIM_LIBRARY::MODEL> models = m_library->GetModels();
1125
1126 BOOST_CHECK_EQUAL( models.size(), 46 );
1127
1128 for( int i = 0; i < models.size(); ++i )
1129 {
1130 const auto& [modelName, model] = models.at( i );
1131
1132 // TODO: Actually test ALL model parameters.
1133
1134 switch( i )
1135 {
1136 case 0:
1137 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NJFET_SHICHMANHODGES,
1138 { "vt0", "beta", "lambda", "rd", "rs", "cgs", "cgd", "pb", "is_",
1139 "fc" } );
1140 break;
1141
1142 case 1:
1143 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PJFET_SHICHMANHODGES,
1144 { "vt0", "beta", "lambda", "rd", "rs", "cgs", "cgd", "pb", "is_",
1145 "fc" } );
1146 break;
1147
1148 case 2:
1149 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NJFET_PARKERSKELLERN,
1150 { "vbi", "af", "beta", "cds", "cgd", "cgs", "delta", "hfeta", "mvst",
1151 "mxi" } );
1152 break;
1153
1154 case 3:
1155 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PJFET_PARKERSKELLERN,
1156 { "vbi", "af", "beta", "cds", "cgd", "cgs", "delta", "hfeta", "mvst",
1157 "mxi" } );
1158 break;
1159
1160 case 4:
1161 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMES_STATZ,
1162 { "vt0", "alpha", "beta", "lambda", "b", "rd", "rs", "cgs", "cgd_",
1163 "pb" } );
1164 break;
1165
1166 case 5:
1167 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMES_STATZ,
1168 { "vt0", "alpha", "beta", "lambda", "b", "rd", "rs", "cgs", "cgd_",
1169 "pb" } );
1170 break;
1171
1172 case 6:
1173 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMES_YTTERDAL,
1174 { "vto", "lambda", "lambdahf", "beta", "vs", "rd", "rs", "rg", "ri",
1175 "rf" } );
1176 break;
1177
1178 case 7:
1179 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMES_YTTERDAL,
1180 { "vto", "lambda", "lambdahf", "beta", "vs", "rd", "rs", "rg", "ri",
1181 "rf" } );
1182 break;
1183
1184 case 8:
1185 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMES_HFET1,
1186 { "vt0", "lambda", "rd", "rs", "rg", "rdi", "rsi", "rgs", "rgd",
1187 "eta" } );
1188 break;
1189
1190 case 9:
1191 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMES_HFET1,
1192 { "vt0", "lambda", "rd", "rs", "rg", "rdi", "rsi", "rgs", "rgd",
1193 "eta" } );
1194 break;
1195
1196 case 10:
1197 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMES_HFET2,
1198 { "vs", "ggr", "js", "del", "delta", "deltad", "di", "epsi", "eta",
1199 "eta1" } );
1200 break;
1201
1202 case 11:
1203 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMES_HFET2,
1204 { "vs", "ggr", "js", "del", "delta", "deltad", "di", "epsi", "eta",
1205 "eta1" } );
1206 break;
1207
1208 case 12:
1209 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_VDMOS,
1210 {
1211 //"type",
1212 "vto",
1213 //"vth0",
1214 "kp",
1215 "phi",
1216 "lambda",
1217 "theta",
1218 "rd_",
1219 "rs_",
1220 "rg",
1221 "tnom",
1222 "kf",
1223 "af",
1224 //"vdmosn",
1225 //"vdmosp",
1226 //"vdmos",
1227 "rq",
1228 "vq",
1229 "mtriode",
1230 "tcvth",
1231 //"vtotc",
1232 "mu",
1233 //"bex",
1234 "texp0",
1235 "texp1",
1236 "trd1",
1237 "trd2",
1238 "trg1",
1239 "trg2",
1240 "trs1",
1241 "trs2",
1242 "trb1",
1243 "trb2",
1244 "subshift",
1245 "ksubthres",
1246 "tksubthres1",
1247 "tksubthres2",
1248 "bv",
1249 "ibv",
1250 "nbv",
1251 "rds",
1252 "rb",
1253 "n",
1254 "tt",
1255 "eg",
1256 "xti",
1257 "is_",
1258 "vj",
1259 "cjo",
1260 "m_",
1261 "fc",
1262 "cgdmin",
1263 "cgdmax",
1264 "a",
1265 "cgs_",
1266 "rthjc",
1267 "rthca",
1268 "cthj",
1269 "vgs_max",
1270 "vgd_max",
1271 "vds_max",
1272 "vgsr_max",
1273 "vgdr_max",
1274 "pd_max",
1275 "id_max",
1276 "idr_max",
1277 "te_max",
1278 "rth_ext",
1279 "derating"
1280 } );
1281 break;
1282
1283 case 13:
1284 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_VDMOS,
1285 {
1286 //"type",
1287 "vto",
1288 //"vth0",
1289 "kp",
1290 "phi",
1291 "lambda",
1292 "theta",
1293 "rd_",
1294 "rs_",
1295 "rg",
1296 "tnom",
1297 "kf",
1298 "af",
1299 //"vdmosn",
1300 //"vdmosp",
1301 //"vdmos",
1302 "rq",
1303 "vq",
1304 "mtriode",
1305 "tcvth",
1306 //"vtotc",
1307 "mu",
1308 //"bex",
1309 "texp0",
1310 "texp1",
1311 "trd1",
1312 "trd2",
1313 "trg1",
1314 "trg2",
1315 "trs1",
1316 "trs2",
1317 "trb1",
1318 "trb2",
1319 "subshift",
1320 "ksubthres",
1321 "tksubthres1",
1322 "tksubthres2",
1323 "bv",
1324 "ibv",
1325 "nbv",
1326 "rds",
1327 "rb",
1328 "n",
1329 "tt",
1330 "eg",
1331 "xti",
1332 "is_",
1333 "vj",
1334 "cjo",
1335 "m_",
1336 "fc",
1337 "cgdmin",
1338 "cgdmax",
1339 "a",
1340 "cgs_",
1341 "rthjc",
1342 "rthca",
1343 "cthj",
1344 "vgs_max",
1345 "vgd_max",
1346 "vds_max",
1347 "vgsr_max",
1348 "vgdr_max",
1349 "pd_max",
1350 "id_max",
1351 "idr_max",
1352 "te_max",
1353 "rth_ext",
1354 "derating"
1355 } );
1356 break;
1357
1358 case 14:
1359 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_MOS1,
1360 { "vto", "kp", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1361 "is_" } );
1362 break;
1363
1364 case 15:
1365 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_MOS1,
1366 { "vto", "kp", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1367 "is_" } );
1368 break;
1369
1370 case 16:
1371 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_MOS2,
1372 { "vto", "kp", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1373 "is_" } );
1374 break;
1375
1376 case 17:
1377 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_MOS2,
1378 { "vto", "kp", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1379 "is_" } );
1380 break;
1381
1382 case 18:
1383 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_MOS3,
1384 { "vto", "theta", "gamma", "phi", "eta", "rd_", "rs_", "cbd_", "cbs_",
1385 "is_" } );
1386 break;
1387
1388 case 19:
1389 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_MOS3,
1390 { "vto", "theta", "gamma", "phi", "eta", "rd_", "rs_", "cbd_", "cbs_",
1391 "is_" } );
1392 break;
1393
1394 case 20:
1395 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_BSIM1,
1396 { "vfb", "lvfb", "wvfb", "phi", "lphi", "wphi", "k1", "lk1", "wk1",
1397 "k2" } );
1398 break;
1399
1400 case 21:
1401 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_BSIM1,
1402 { "vfb", "lvfb", "wvfb", "phi", "lphi", "wphi", "k1", "lk1", "wk1",
1403 "k2" } );
1404 break;
1405
1406 case 22:
1407 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_BSIM2,
1408 { "bib", "lbib", "wbib", "vghigh", "lvghigh", "wvghigh",
1409 "waib", "bi0", "lbi0", "wbi0" } );
1410 break;
1411
1412 case 23:
1413 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_BSIM2,
1414 { "bib", "lbib", "wbib", "vghigh", "lvghigh", "wvghigh",
1415 "waib", "bi0", "lbi0", "wbi0" } );
1416 break;
1417
1418 case 24:
1419 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_MOS6,
1420 { "vto", "nvth", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1421 "is_" } );
1422 break;
1423
1424 case 25:
1425 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_MOS6,
1426 { "vto", "nvth", "gamma", "phi", "lambda", "rd_", "rs_", "cbd_", "cbs_",
1427 "is_" } );
1428 break;
1429
1430 case 26:
1431 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_BSIM3,
1432 { "tox", "toxm", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "xj",
1433 "vsat", "at" } );
1434 break;
1435
1436 case 27:
1437 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_BSIM3,
1438 { "tox", "toxm", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "xj",
1439 "vsat", "at" } );
1440 break;
1441
1442 case 28:
1443 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_MOS9,
1444 { "vto", "theta", "gamma", "phi", "eta", "rd_", "rs_", "cbd_", "cbs_",
1445 "is_" } );
1446 break;
1447
1448 case 29:
1449 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_MOS9,
1450 { "vto", "theta", "gamma", "phi", "eta", "rd_", "rs_", "cbd_", "cbs_",
1451 "is_" } );
1452 break;
1453
1454 case 30:
1455 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_B4SOI,
1456 { "tox", "toxp", "toxm", "dtoxcv", "cdsc", "cdscb", "cdscd", "cit",
1457 "nfactor", "vsat" } );
1458 break;
1459
1460 case 31:
1461 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_B4SOI,
1462 { "tox", "toxp", "toxm", "dtoxcv", "cdsc", "cdscb", "cdscd", "cit",
1463 "nfactor", "vsat" } );
1464 break;
1465
1466 case 32:
1467 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_BSIM4,
1468 { "rbps0", "rbpsl", "rbpsw", "rbpsnf", "rbpd0", "rbpdl", "rbpdw", "rbpdnf",
1469 "rbpbx0", "rbpbxl" } );
1470 break;
1471
1472 case 33:
1473 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_BSIM4,
1474 { "rbps0", "rbpsl", "rbpsw", "rbpsnf", "rbpd0", "rbpdl", "rbpdw", "rbpdnf",
1475 "rbpbx0", "rbpbxl" } );
1476 break;
1477
1478 case 34:
1479 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_B3SOIFD,
1480 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1481 "ags" } );
1482 break;
1483
1484 case 35:
1485 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_B3SOIFD,
1486 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1487 "ags" } );
1488 break;
1489
1490 case 36:
1491 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_B3SOIDD,
1492 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1493 "ags" } );
1494 break;
1495
1496 case 37:
1497 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_B3SOIDD,
1498 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1499 "ags" } );
1500 break;
1501
1502 case 38:
1503 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_B3SOIPD,
1504 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1505 "ags" } );
1506 break;
1507
1508 case 39:
1509 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_B3SOIPD,
1510 { "tox", "cdsc", "cdscb", "cdscd", "cit", "nfactor", "vsat", "at", "a0",
1511 "ags" } );
1512 break;
1513
1514 case 40:
1515 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_HISIM2,
1516 { "depmue0", "depmue0l", "depmue0lp", "depmue1", "depmue1l",
1517 "depmue1lp", "depmueback0", "depmueback0l", "depmueback0lp",
1518 "depmueback1" } );
1519 break;
1520
1521 case 41:
1522 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_HISIM2,
1523 { "depmue0", "depmue0l", "depmue0lp", "depmue1", "depmue1l", "depmue1lp",
1524 "depmueback0", "depmueback0l", "depmueback0lp", "depmueback1" } );
1525 break;
1526
1527 case 42:
1528 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_HISIMHV1,
1529 { "prd", "prd22", "prd23", "prd24", "prdict1", "prdov13", "prdslp1",
1530 "prdvb", "prdvd", "prdvg11" } );
1531 break;
1532
1533 case 43:
1534 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_HISIMHV1,
1535 { "prd", "prd22", "prd23", "prd24", "prdict1", "prdov13", "prdslp1",
1536 "prdvb", "prdvd", "prdvg11" } );
1537 break;
1538
1539 case 44:
1540 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::NMOS_HISIMHV2,
1541 { "pjs0d", "pjs0swd", "pnjd", "pcisbkd", "pvdiffjd", "pjs0s", "pjs0sws",
1542 "prs", "prth0", "pvover" } );
1543 break;
1544
1545 case 45:
1546 TestTransistor( model, modelName, i, SIM_MODEL::TYPE::PMOS_HISIMHV2,
1547 { "pjs0d", "pjs0swd", "pnjd", "pcisbkd", "pvdiffjd", "pjs0s", "pjs0sws",
1548 "prs", "prth0", "pvover" } );
1549 break;
1550 }
1551 }
1552}
1553
1554
1555BOOST_AUTO_TEST_SUITE_END()
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Definition: locale_io.h:49
A singleton reporter that reports to nowhere.
Definition: reporter.h:223
virtual const PARAM & GetParam(unsigned aParamIndex) const
Definition: sim_model.cpp:779
int GetParamCount() const
Definition: sim_model.h:482
DEVICE_INFO GetDeviceInfo() const
Definition: sim_model.h:461
INFO GetTypeInfo() const
Definition: sim_model.h:462
const PARAM * FindParam(const std::string &aParamName) const
Definition: sim_model.cpp:808
const PARAM & GetParamOverride(unsigned aParamIndex) const
Definition: sim_model.cpp:827
SPICE_INFO GetSpiceInfo() const
Definition: sim_model.h:453
TYPE GetType() const
Definition: sim_model.h:465
@ TYPE_INT
Definition: sim_value.h:68
void LoadLibrary(const std::string &aBaseName)
void TestTransistor(const SIM_MODEL &aModel, const std::string &aModelName, int aModelIndex, SIM_MODEL::TYPE aType, const std::vector< std::string > &aParamNames)
std::string GetLibraryPath(const std::string &aBaseName)
void CompareToUsualDiodeModel(const SIM_MODEL &aModel, const std::string &aModelName, int aModelIndex)
std::unique_ptr< SIM_LIBRARY_SPICE > m_library
void CompareToEmptyModel(const SIM_MODEL &aModel, const std::string &aModelName, int aModelIndex)
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
SIM_VALUE::TYPE type
Definition: sim_model.h:380
std::string value
Definition: sim_model.h:401
const INFO & info
Definition: sim_model.h:402
std::string modelType
Definition: sim_model.h:297
BOOST_CHECK(box.ClosestPointTo(VECTOR2D(0, 0))==VECTOR2D(1, 2))
Test suite for KiCad math code.
BOOST_AUTO_TEST_CASE(Subckts)
#define BOOST_TEST_CONTEXT(A)