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