KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sim_model_ibis.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 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 3
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 * https://www.gnu.org/licenses/gpl-3.0.html
19 * or you may search the http://www.gnu.org website for the version 3 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
24#include <sim/kibis/kibis.h>
25#include <sim/sim_model_ibis.h>
27#include <fmt/core.h>
28#include <wx/filename.h>
29#include <kiway.h>
30#include "sim_lib_mgr.h"
31
32std::string SPICE_GENERATOR_IBIS::ModelName( const SPICE_ITEM& aItem ) const
33{
34 return fmt::format( "{}.{}", aItem.refName, aItem.baseModelName );
35}
36
37
38std::string SPICE_GENERATOR_IBIS::ModelLine( const SPICE_ITEM& aItem ) const
39{
40 return "";
41}
42
43std::vector<std::string> SPICE_GENERATOR_IBIS::CurrentNames( const SPICE_ITEM& aItem ) const
44{
45 std::vector<std::string> currentNames;
46
47 for( const SIM_MODEL_PIN& pin : GetPins() )
48 currentNames.push_back( fmt::format( "I({}:{})", ItemName( aItem ), pin.modelPinName ) );
49
50 return currentNames;
51}
52
53
54std::string SPICE_GENERATOR_IBIS::IbisDevice( const SPICE_ITEM& aItem, const PROJECT& aProject,
55 const wxString& aCacheDir,
56 REPORTER& aReporter ) const
57{
58 std::string ibisLibFilename = SIM_MODEL::GetFieldValue( &aItem.fields, SIM_LIBRARY::LIBRARY_FIELD );
59 std::string ibisCompName = SIM_MODEL::GetFieldValue( &aItem.fields, SIM_LIBRARY::NAME_FIELD );
60 std::string ibisPinName = SIM_MODEL::GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::PIN_FIELD );
61 std::string ibisModelName = SIM_MODEL::GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::MODEL_FIELD );
62 bool diffMode = SIM_MODEL::GetFieldValue( &aItem.fields, SIM_LIBRARY_IBIS::DIFF_FIELD ) == "1";
63
64 WX_STRING_REPORTER reporter;
65 wxString path = SIM_LIB_MGR::ResolveLibraryPath( ibisLibFilename, &aProject, reporter );
66
67 if( reporter.HasMessage() )
68 THROW_IO_ERROR( reporter.GetMessages() );
69
70 KIBIS kibis( std::string( path.c_str() ) );
71 kibis.m_cacheDir = std::string( aCacheDir.c_str() );
72 kibis.m_reporter = &aReporter;
73
74 if( !kibis.m_valid )
75 THROW_IO_ERROR( wxString::Format( _( "Invalid IBIS file '%s'" ), ibisLibFilename ) );
76
77 KIBIS_COMPONENT* kcomp = kibis.GetComponent( std::string( ibisCompName ) );
78
79 if( !kcomp )
80 THROW_IO_ERROR( wxString::Format( _( "Could not find IBIS component '%s'" ), ibisCompName ) );
81
82 KIBIS_PIN* kpin = kcomp->GetPin( ibisPinName );
83
84
85 if( !kcomp->m_valid )
86 THROW_IO_ERROR( wxString::Format( _( "Invalid IBIS component '%s'" ), ibisCompName ) );
87
88 if( !kpin )
89 {
90 THROW_IO_ERROR( wxString::Format( _( "Could not find IBIS pin '%s' in component '%s'" ),
91 ibisPinName,
92 ibisCompName ) );
93 }
94
95 if( !kpin->m_valid )
96 {
97 THROW_IO_ERROR( wxString::Format( _( "Invalid IBIS pin '%s' in component '%s'" ),
98 ibisPinName,
99 ibisCompName ) );
100 }
101
102 KIBIS_MODEL* kmodel = kibis.GetModel( ibisModelName );
103
104 if( !kmodel )
105 THROW_IO_ERROR( wxString::Format( _( "Could not find IBIS model '%s'" ), ibisModelName ) );
106
107 if( !kmodel->m_valid )
108 THROW_IO_ERROR( wxString::Format( _( "Invalid IBIS model '%s'" ), ibisModelName ) );
109
110 KIBIS_PARAMETER kparams;
111
112 if( const SIM_MODEL::PARAM* vcc = m_model.FindParam( "vcc" ) )
113 kparams.SetCornerFromString( kparams.m_supply, vcc->value );
114
115 if( const SIM_MODEL::PARAM* rpin = m_model.FindParam( "rpin" ) )
116 kparams.SetCornerFromString( kparams.m_Rpin, rpin->value );
117
118 if( const SIM_MODEL::PARAM* lpin = m_model.FindParam( "lpin" ) )
119 kparams.SetCornerFromString( kparams.m_Lpin, lpin->value );
120
121 if( const SIM_MODEL::PARAM* cpin = m_model.FindParam( "cpin" ) )
122 kparams.SetCornerFromString( kparams.m_Cpin, cpin->value );
123
124 //kparams.SetCornerFromString( kparams.m_Ccomp, FindParam( "ccomp" )->value );
125
126 std::string result;
127
128 switch( m_model.GetType() )
129 {
130 case SIM_MODEL::TYPE::KIBIS_DEVICE:
131 if( diffMode )
132 kpin->writeSpiceDiffDevice( result, aItem.modelName, *kmodel, kparams );
133 else
134 kpin->writeSpiceDevice( result, aItem.modelName, *kmodel, kparams );
135 break;
136
137 case SIM_MODEL::TYPE::KIBIS_DRIVER_DC:
138 {
139 std::string paramValue = "";
140
141 if( const SIM_MODEL::PARAM* dc = m_model.FindParam( "dc" ) )
142 paramValue = dc->value;
143
144 if( paramValue == "hi-Z" )
145 {
146 kparams.m_waveform = new KIBIS_WAVEFORM_HIGH_Z( kibis );
147 }
148 else if( paramValue == "low" )
149 {
150 kparams.m_waveform = new KIBIS_WAVEFORM_STUCK_LOW( kibis );
151 }
152 else if( paramValue == "high" )
153 {
154 kparams.m_waveform = new KIBIS_WAVEFORM_STUCK_HIGH( kibis );
155 }
156
157 if( diffMode )
158 kpin->writeSpiceDiffDriver( result, aItem.modelName, *kmodel, kparams );
159 else
160 kpin->writeSpiceDriver( result, aItem.modelName, *kmodel, kparams );
161 break;
162 }
163
164 case SIM_MODEL::TYPE::KIBIS_DRIVER_RECT:
165 {
167
168 if( const SIM_MODEL::PARAM* ton = m_model.FindParam( "ton" ) )
169 waveform->m_ton = SIM_VALUE::ToDouble( ton->value, 0 );
170
171 if( const SIM_MODEL::PARAM* toff = m_model.FindParam( "toff" ) )
172 waveform->m_toff = SIM_VALUE::ToDouble( toff->value, 0 );
173
174 if( const SIM_MODEL::PARAM* td = m_model.FindParam( "td" ) )
175 waveform->m_delay = SIM_VALUE::ToDouble( td->value, 0 );
176
177 if( const SIM_MODEL::PARAM* n = m_model.FindParam( "n" ) )
178 waveform->m_cycles = SIM_VALUE::ToInt( n->value, 1 );
179
180 kparams.m_waveform = waveform;
181
182 if( diffMode )
183 kpin->writeSpiceDiffDriver( result, aItem.modelName, *kmodel, kparams );
184 else
185 kpin->writeSpiceDriver( result, aItem.modelName, *kmodel, kparams );
186 break;
187 }
188
189 case SIM_MODEL::TYPE::KIBIS_DRIVER_PRBS:
190 {
191 KIBIS_WAVEFORM_PRBS* waveform = new KIBIS_WAVEFORM_PRBS( kibis );
192
193 if( const SIM_MODEL::PARAM* f0 = m_model.FindParam( "f0" ) )
194 waveform->m_bitrate = SIM_VALUE::ToDouble( f0->value, 0 );
195
196 if( const SIM_MODEL::PARAM* td = m_model.FindParam( "td" ) )
197 waveform->m_delay = SIM_VALUE::ToDouble( td->value, 0 );
198
199 if( const SIM_MODEL::PARAM* n = m_model.FindParam( "n" ) )
200 waveform->SetBits( SIM_VALUE::ToInt( n->value, 0 ) );
201
202 kparams.m_waveform = waveform;
203
204 if( diffMode )
205 kpin->writeSpiceDiffDriver( result, aItem.modelName, *kmodel, kparams );
206 else
207 kpin->writeSpiceDriver( result, aItem.modelName, *kmodel, kparams );
208 break;
209 }
210
211 default:
212 wxFAIL_MSG( "Unknown IBIS model type" );
213 return "";
214 }
215
216 return result;
217}
218
219
221 SIM_MODEL( aType, std::make_unique<SPICE_GENERATOR_IBIS>( *this ) ),
222 m_enableDiff( false ),
223 m_sourceModel( nullptr )
224{
225 static std::vector<PARAM::INFO> device = makeParamInfos( TYPE::KIBIS_DEVICE );
226 static std::vector<PARAM::INFO> dcDriver = makeParamInfos( TYPE::KIBIS_DRIVER_DC );
227 static std::vector<PARAM::INFO> rectDriver = makeParamInfos( TYPE::KIBIS_DRIVER_RECT );
228 static std::vector<PARAM::INFO> prbsDriver = makeParamInfos( TYPE::KIBIS_DRIVER_PRBS );
229
230 std::vector<PARAM::INFO>* paramInfos = nullptr;
231
232 switch( aType )
233 {
234 case SIM_MODEL::TYPE::KIBIS_DEVICE: paramInfos = &device; break;
235 case SIM_MODEL::TYPE::KIBIS_DRIVER_DC: paramInfos = &dcDriver; break;
236 case SIM_MODEL::TYPE::KIBIS_DRIVER_RECT: paramInfos = &rectDriver; break;
237 case SIM_MODEL::TYPE::KIBIS_DRIVER_PRBS: paramInfos = &prbsDriver; break;
238
239 default:
240 wxFAIL;
241 return;
242 }
243
244 for( const PARAM::INFO& paramInfo : *paramInfos )
245 AddParam( paramInfo );
246
247 SwitchSingleEndedDiff( false );
248}
249
250
252{
253 ClearPins();
254
255 if( aDiff )
256 {
257 AddPin( { "GND", "1" } );
258 AddPin( { "+", "2" } );
259 AddPin( { "-", "3" } );
260 }
261 else
262 {
263 AddPin( { "GND", "1" } );
264 AddPin( { "IN/OUT", "2" } );
265 }
266}
267
269 SIM_MODEL_IBIS( aType )
270{
271 for( PARAM& param1 : m_params )
272 {
273 for( int ii = 0; ii < aSource.GetParamCount(); ++ii )
274 {
275 const PARAM& param2 = aSource.GetParam( ii );
276
277 if( param1.info.name == param2.info.name )
278 param1.value = param2.value;
279 }
280 }
281
283
284 m_ibisPins = aSource.GetIbisPins();
285 m_ibisModels = aSource.GetIbisModels();
286
287 m_enableDiff = aSource.CanDifferential();
288}
289
290
291bool SIM_MODEL_IBIS::ChangePin( const SIM_LIBRARY_IBIS& aLib, const std::string& aPinNumber )
292{
293 KIBIS_COMPONENT* kcomp = aLib.m_kibis.GetComponent( std::string( GetComponentName() ) );
294
295 if( !kcomp )
296 return false;
297
298 KIBIS_PIN* kpin = kcomp->GetPin( aPinNumber );
299
300 if( !kpin )
301 return false;
302
303 m_ibisModels.clear();
304
305 for( KIBIS_MODEL* kmodel : kpin->m_models )
306 m_ibisModels.push_back( kmodel->m_name );
307
308 return true;
309}
310
311
313{
314 // Actual base models can only be of the same type, which is not the case here, as in addition
315 // to IBIS device model type we have multiple types of drivers available for the same sourced
316 // model. And we don't want to inherit the default values anyway. So we just store these models
317 // and use the only for Spice code generation.
318 m_sourceModel = dynamic_cast<const SIM_MODEL_IBIS*>( &aBaseModel );
319}
320
321
322std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_IBIS::makeParamInfos( TYPE aType )
323{
324 std::vector<PARAM::INFO> paramInfos;
325 PARAM::INFO paramInfo;
326
327 paramInfo.name = "vcc";
328 paramInfo.type = SIM_VALUE::TYPE_STRING;
329 paramInfo.unit = "";
331 paramInfo.defaultValue = "typ";
332 paramInfo.description = _( "Power supply" );
333 paramInfo.spiceModelName = "";
334 paramInfo.enumValues = { "typ", "min", "max" };
335 paramInfos.push_back( paramInfo );
336
337 paramInfo.name = "rpin";
338 paramInfo.type = SIM_VALUE::TYPE_STRING;
339 paramInfo.unit = "";
341 paramInfo.defaultValue = "typ";
342 paramInfo.description = _( "Parasitic pin resistance" );
343 paramInfo.spiceModelName = "";
344 paramInfo.enumValues = { "typ", "min", "max" };
345 paramInfos.push_back( paramInfo );
346
347 paramInfo.name = "lpin";
348 paramInfo.type = SIM_VALUE::TYPE_STRING;
349 paramInfo.unit = "";
351 paramInfo.defaultValue = "typ";
352 paramInfo.description = _( "Parasitic pin inductance" );
353 paramInfo.spiceModelName = "";
354 paramInfo.enumValues = { "typ", "min", "max" };
355 paramInfos.push_back( paramInfo );
356
357 paramInfo.name = "cpin";
358 paramInfo.type = SIM_VALUE::TYPE_STRING;
359 paramInfo.unit = "";
361 paramInfo.defaultValue = "typ";
362 paramInfo.description = _( "Parasitic pin capacitance" );
363 paramInfo.spiceModelName = "";
364 paramInfo.enumValues = { "typ", "min", "max" };
365 paramInfos.push_back( paramInfo );
366
367 std::vector<PARAM::INFO> dc = makeDcWaveformParamInfos();
368 std::vector<PARAM::INFO> rect = makeRectWaveformParamInfos();
369 std::vector<PARAM::INFO> prbs = makePrbsWaveformParamInfos();
370
371 switch( aType )
372 {
373 case TYPE::KIBIS_DRIVER_DC:
374 for( const PARAM::INFO& param : makeDcWaveformParamInfos() )
375 paramInfos.push_back( param );
376 break;
377
378 case TYPE::KIBIS_DRIVER_RECT:
379 for( const PARAM::INFO& param : makeRectWaveformParamInfos() )
380 paramInfos.push_back( param );
381 break;
382
383 case TYPE::KIBIS_DRIVER_PRBS:
384 for( const PARAM::INFO& param : makePrbsWaveformParamInfos() )
385 paramInfos.push_back( param );
386 break;
387
388 default:
389 break;
390 }
391
392 return paramInfos;
393}
394
395
396std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_IBIS::makeDcWaveformParamInfos()
397{
398 std::vector<PARAM::INFO> paramInfos;
399 PARAM::INFO paramInfo;
400
401 paramInfo.name = "dc";
402 paramInfo.type = SIM_VALUE::TYPE_STRING;
403 paramInfo.unit = "";
405 paramInfo.defaultValue = "hi-Z";
406 paramInfo.description = _( "DC Value" );
407 paramInfo.enumValues = { "hi-Z", "low", "high" };
408 paramInfos.push_back( paramInfo );
409
410 return paramInfos;
411}
412
413
414std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_IBIS::makeRectWaveformParamInfos()
415{
416 std::vector<PARAM::INFO> paramInfos;
417 PARAM::INFO paramInfo;
418
419 paramInfo.name = "ton";
420 paramInfo.type = SIM_VALUE::TYPE_FLOAT;
421 paramInfo.unit = "s";
423 paramInfo.defaultValue = "";
424 paramInfo.description = _( "ON time" );
425 paramInfos.push_back( paramInfo );
426
427 paramInfo.name = "toff";
428 paramInfo.type = SIM_VALUE::TYPE_FLOAT;
429 paramInfo.unit = "s";
431 paramInfo.defaultValue = "";
432 paramInfo.description = _( "OFF time" );
433 paramInfos.push_back( paramInfo );
434
435 paramInfo.name = "td";
436 paramInfo.type = SIM_VALUE::TYPE_FLOAT;
437 paramInfo.unit = "s";
439 paramInfo.defaultValue = "0";
440 paramInfo.description = _( "Delay" );
441 paramInfos.push_back( paramInfo );
442
443 paramInfo.name = "n";
444 paramInfo.type = SIM_VALUE::TYPE_INT;
445 paramInfo.unit = "";
447 paramInfo.defaultValue = "1";
448 paramInfo.description = _( "Number of cycles" );
449 paramInfos.push_back( paramInfo );
450
451 return paramInfos;
452}
453
454
455std::vector<SIM_MODEL::PARAM::INFO> SIM_MODEL_IBIS::makePrbsWaveformParamInfos()
456{
457 std::vector<PARAM::INFO> paramInfos;
458 PARAM::INFO paramInfo;
459
460 paramInfo.name = "f0";
461 paramInfo.type = SIM_VALUE::TYPE_FLOAT;
462 paramInfo.unit = "Hz";
464 paramInfo.defaultValue = "";
465 paramInfo.description = _( "Bitrate" );
466 paramInfos.push_back( paramInfo );
467
468 paramInfo.name = "td";
469 paramInfo.type = SIM_VALUE::TYPE_FLOAT;
470 paramInfo.unit = "s";
472 paramInfo.defaultValue = "";
473 paramInfo.description = _( "Delay" );
474 paramInfos.push_back( paramInfo );
475
476 paramInfo.name = "n";
477 paramInfo.type = SIM_VALUE::TYPE_INT;
478 paramInfo.unit = "";
480 paramInfo.defaultValue = "";
481 paramInfo.description = _( "Number of bits" );
482 paramInfos.push_back( paramInfo );
483
484 return paramInfos;
485}
486
REPORTER * m_reporter
Definition: ibis_parser.h:56
bool m_valid
Definition: kibis.h:57
KIBIS_PIN * GetPin(const std::string &aPinNumber)
Get a pin by its number ( 1, 2, A1, A2, ... )
Definition: kibis.cpp:327
std::string m_name
Definition: kibis.h:235
IBIS_CORNER m_supply
Definition: kibis.h:205
IBIS_CORNER m_Cpin
Definition: kibis.h:203
IBIS_CORNER m_Lpin
Definition: kibis.h:202
IBIS_CORNER m_Rpin
Definition: kibis.h:201
void SetCornerFromString(IBIS_CORNER &aCorner, const std::string &aString)
Definition: kibis.cpp:1415
KIBIS_WAVEFORM * m_waveform
Definition: kibis.h:206
bool writeSpiceDiffDriver(std::string &aDest, const std::string &aName, KIBIS_MODEL &aModel, const KIBIS_PARAMETER &aParam)
Definition: kibis.cpp:1298
bool writeSpiceDevice(std::string &aDest, const std::string &aName, KIBIS_MODEL &aModel, const KIBIS_PARAMETER &aParam)
Definition: kibis.cpp:1247
std::vector< KIBIS_MODEL * > m_models
Definition: kibis.h:350
bool writeSpiceDiffDevice(std::string &aDest, const std::string &aName, KIBIS_MODEL &aModel, const KIBIS_PARAMETER &aParam)
Definition: kibis.cpp:1349
bool writeSpiceDriver(std::string &aDest, const std::string &aName, KIBIS_MODEL &aModel, const KIBIS_PARAMETER &aParam)
Definition: kibis.cpp:1125
double m_delay
Definition: kibis.h:130
void SetBits(int aBits)
Definition: kibis.h:137
double m_bitrate
Definition: kibis.h:129
Definition: kibis.h:452
KIBIS_MODEL * GetModel(const std::string &aName)
Return the model with name aName .
Definition: kibis.cpp:1393
KIBIS_COMPONENT * GetComponent(const std::string &aName)
Return the component with name aName .
Definition: kibis.cpp:1404
std::string m_cacheDir
Absolute path of the directory that will be used for caching.
Definition: kibis.h:464
Container for project specific data.
Definition: project.h:64
A pure virtual class used to derive REPORTER objects from.
Definition: reporter.h:72
static constexpr auto MODEL_FIELD
static constexpr auto PIN_FIELD
static constexpr auto DIFF_FIELD
static constexpr auto LIBRARY_FIELD
Definition: sim_library.h:35
static constexpr auto NAME_FIELD
Definition: sim_library.h:36
static wxString ResolveLibraryPath(const wxString &aLibraryPath, const PROJECT *aProject, REPORTER &aReporter)
Definition: sim_lib_mgr.cpp:56
SIM_MODEL_IBIS(TYPE aType)
static std::vector< PARAM::INFO > makeDcWaveformParamInfos()
std::vector< std::pair< std::string, std::string > > m_ibisPins
std::vector< std::string > m_ibisModels
static std::vector< PARAM::INFO > makeRectWaveformParamInfos()
const PARAM & GetParam(unsigned aParamIndex) const override
static std::vector< PARAM::INFO > makePrbsWaveformParamInfos()
std::vector< std::pair< std::string, std::string > > GetIbisPins() const
void SwitchSingleEndedDiff(bool aDiff) override
const SIM_MODEL_IBIS * m_sourceModel
bool CanDifferential() const
std::vector< std::string > GetIbisModels() const
std::string m_componentName
void SetBaseModel(const SIM_MODEL &aBaseModel) override
bool ChangePin(const SIM_LIBRARY_IBIS &aLib, const std::string &aPinNumber)
update the list of available models based on the pin number.
static std::vector< PARAM::INFO > makeParamInfos(TYPE aType)
std::string GetComponentName() const
void AddParam(const PARAM::INFO &aInfo)
Definition: sim_model.cpp:729
void ClearPins()
Definition: sim_model.cpp:711
void AddPin(const SIM_MODEL_PIN &aPin)
Definition: sim_model.cpp:705
static std::string GetFieldValue(const std::vector< SCH_FIELD > *aFields, const wxString &aFieldName, bool aResolve=true)
Definition: sim_model.cpp:654
int GetParamCount() const
Definition: sim_model.h:481
const PARAM * FindParam(const std::string &aParamName) const
Definition: sim_model.cpp:816
std::vector< PARAM > m_params
Definition: sim_model.h:538
TYPE GetType() const
Definition: sim_model.h:464
@ TYPE_INT
Definition: sim_value.h:68
@ TYPE_FLOAT
Definition: sim_value.h:69
@ TYPE_STRING
Definition: sim_value.h:71
static double ToDouble(const std::string &aString, double aDefault=NAN)
Definition: sim_value.cpp:442
static int ToInt(const std::string &aString, int aDefault=-1)
Definition: sim_value.cpp:467
std::vector< std::string > CurrentNames(const SPICE_ITEM &aItem) const override
std::string IbisDevice(const SPICE_ITEM &aItem, const PROJECT &aProject, const wxString &aCacheDir, REPORTER &aReporter) const
std::string ModelLine(const SPICE_ITEM &aItem) const override
std::string ModelName(const SPICE_ITEM &aItem) const override
virtual std::string ItemName(const SPICE_ITEM &aItem) const
virtual std::vector< std::reference_wrapper< const SIM_MODEL_PIN > > GetPins() const
const SIM_MODEL & m_model
A wrapper for reporting to a wxString object.
Definition: reporter.h:171
bool HasMessage() const override
Returns true if the reporter client is non-empty.
Definition: reporter.cpp:97
const wxString & GetMessages() const
Definition: reporter.cpp:84
#define _(s)
#define THROW_IO_ERROR(msg)
Definition: ki_exception.h:39
STL namespace.
SIM_MODEL::TYPE TYPE
Definition: sim_model.cpp:57
std::string spiceModelName
Definition: sim_model.h:386
std::vector< std::string > enumValues
Definition: sim_model.h:388
SIM_VALUE::TYPE type
Definition: sim_model.h:379
std::string defaultValue
Definition: sim_model.h:382
std::string description
Definition: sim_model.h:383
std::string value
Definition: sim_model.h:400
const INFO & info
Definition: sim_model.h:401
std::string refName
std::vector< SCH_FIELD > fields
std::string modelName
std::string baseModelName