|
|
|
@ -23,6 +23,7 @@ |
|
|
|
|
|
|
|
#include <qa_utils/wx_utils/unit_test_utils.h>
|
|
|
|
#include <sim/sim_model_ngspice.h>
|
|
|
|
#include <boost/algorithm/string/predicate.hpp>
|
|
|
|
|
|
|
|
class TEST_SIM_MODEL_NGSPICE_FIXTURE : public SIM_MODEL_NGSPICE |
|
|
|
{ |
|
|
|
@ -34,15 +35,79 @@ public: |
|
|
|
BOOST_FIXTURE_TEST_SUITE( SimModelNgspice, TEST_SIM_MODEL_NGSPICE_FIXTURE ) |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE( Models ) |
|
|
|
BOOST_AUTO_TEST_CASE( ParamDuplicates ) |
|
|
|
{ |
|
|
|
for( MODEL_TYPE type : MODEL_TYPE_ITERATOR() ) |
|
|
|
{ |
|
|
|
BOOST_TEST_CONTEXT( "Model name: " << ModelInfo( type ).name ) |
|
|
|
{ |
|
|
|
const std::vector<SIM_MODEL::PARAM::INFO> modelParams = ModelInfo( type ).modelParams; |
|
|
|
const std::vector<SIM_MODEL::PARAM::INFO> instanceParams = ModelInfo( type ).instanceParams; |
|
|
|
|
|
|
|
for( const SIM_MODEL::PARAM::INFO& modelParam : modelParams ) |
|
|
|
{ |
|
|
|
BOOST_TEST_CONTEXT( "Model param name: " << modelParam.name ) |
|
|
|
{ |
|
|
|
// Ensure there's no model parameters that have the same name.
|
|
|
|
BOOST_CHECK( std::none_of( modelParams.begin(), modelParams.end(), |
|
|
|
[modelParam]( const auto& aOtherModelParam ) |
|
|
|
{ |
|
|
|
return modelParam.id != aOtherModelParam.id |
|
|
|
&& modelParam.name == aOtherModelParam.name; |
|
|
|
} ) ); |
|
|
|
|
|
|
|
// Ensure there's no model parameters that have the same name as an instance parameter.
|
|
|
|
BOOST_CHECK( std::none_of( instanceParams.begin(), instanceParams.end(), |
|
|
|
[modelParam]( const auto& aInstanceParam ) |
|
|
|
{ |
|
|
|
return modelParam.name == aInstanceParam.name; |
|
|
|
} ) ); |
|
|
|
|
|
|
|
if( boost::ends_with( modelParam.name, "_" ) ) |
|
|
|
{ |
|
|
|
// Ensure that for each model parameter ending with a "_" there exists an
|
|
|
|
// instance parameter with the same name but without this final character.
|
|
|
|
// We append an "_" to model parameters to disambiguate from these
|
|
|
|
// corresponding instance parameters.
|
|
|
|
BOOST_CHECK( std::any_of( instanceParams.begin(), instanceParams.end(), |
|
|
|
[modelParam]( const auto& aInstanceParam ) |
|
|
|
{ |
|
|
|
return modelParam.name.substr( 0, modelParam.name.length() - 1 ) |
|
|
|
== aInstanceParam.name; |
|
|
|
} ) ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Ensure there's no instance parameters that have the same name.
|
|
|
|
for( const SIM_MODEL::PARAM::INFO& instanceParam : instanceParams ) |
|
|
|
{ |
|
|
|
BOOST_TEST_CONTEXT( "Instance param name: " << instanceParam.name ) |
|
|
|
{ |
|
|
|
BOOST_CHECK( std::none_of( instanceParams.begin(), instanceParams.end(), |
|
|
|
[instanceParam]( const auto& aOtherInstanceParam ) |
|
|
|
{ |
|
|
|
return instanceParam.id != aOtherInstanceParam.id |
|
|
|
&& instanceParam.dir != SIM_MODEL::PARAM::DIR_OUT |
|
|
|
&& aOtherInstanceParam.dir != SIM_MODEL::PARAM::DIR_OUT |
|
|
|
&& instanceParam.name == aOtherInstanceParam.name; |
|
|
|
} ) ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE( ParamCount ) |
|
|
|
{ |
|
|
|
// Count the total number of model and instance parameters for each model so that there will be
|
|
|
|
// an error if someone accidentally removes a parameter.
|
|
|
|
|
|
|
|
for( MODEL_TYPE type : MODEL_TYPE_ITERATOR() ) |
|
|
|
{ |
|
|
|
unsigned modelParamCount = ModelInfo( type ).modelParams.size(); |
|
|
|
unsigned instanceParamCount = ModelInfo( type ).instanceParams.size(); |
|
|
|
const std::vector<SIM_MODEL::PARAM::INFO> modelParams = ModelInfo( type ).modelParams; |
|
|
|
const std::vector<SIM_MODEL::PARAM::INFO> instanceParams = ModelInfo( type ).instanceParams; |
|
|
|
|
|
|
|
switch( type ) |
|
|
|
{ |
|
|
|
@ -51,183 +116,183 @@ BOOST_AUTO_TEST_CASE( Models ) |
|
|
|
break; |
|
|
|
|
|
|
|
/*case MODEL_TYPE::RESISTOR:
|
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 22 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 25 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 22 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 25 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::CAPACITOR: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 19 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 22 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 19 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 22 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::INDUCTOR: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 9 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 20 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 9 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 20 ); |
|
|
|
break;*/ |
|
|
|
|
|
|
|
/*case MODEL_TYPE::LTRA:
|
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 18 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 9 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 18 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 9 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::TRANLINE: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 0 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 17 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 0 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 17 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::URC: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 5 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 5 ); |
|
|
|
break;*/ |
|
|
|
|
|
|
|
/*case MODEL_TYPE::TRANSLINE:
|
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 6 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 3 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 6 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 3 ); |
|
|
|
break;*/ |
|
|
|
|
|
|
|
/*case MODEL_TYPE::SWITCH:
|
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 8 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 8 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::CSWITCH: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 7 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 7 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 7 ); |
|
|
|
break;*/ |
|
|
|
|
|
|
|
case MODEL_TYPE::DIODE: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 76 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 30 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 76 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 30 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::BJT: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 152 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 53 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 152 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 53 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::VBIC: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 117 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 45 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 117 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 45 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HICUM2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 149 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 61 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 149 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 61 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::JFET: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 28 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 28 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 28 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 28 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::JFET2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 46 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 30 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 46 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 30 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MES: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 22 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 25 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 22 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 25 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MESA: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 71 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 30 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 71 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 30 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HFET1: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 68 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 28 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 68 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 28 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HFET2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 40 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 28 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 40 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 28 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::VDMOS: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 69 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 36 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 69 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 36 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MOS1: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 35 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 76 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 35 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 76 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MOS2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 42 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 76 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 42 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 76 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MOS3: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 48 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 81 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 48 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 81 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::BSIM1: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 81 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 14 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 81 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 14 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::BSIM2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 137 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 14 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 137 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 14 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MOS6: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 42 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 78 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 42 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 78 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::BSIM3: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 429 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 46 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 429 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 46 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::MOS9: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 48 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 81 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 48 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 81 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::B4SOI: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 915 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 74 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 915 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 74 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::BSIM4: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 892 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 84 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 892 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 84 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::B3SOIFD: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 393 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 27 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 393 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 27 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::B3SOIDD: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 393 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 27 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 393 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 27 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::B3SOIPD: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 470 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 36 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 470 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 36 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HISIM2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 486 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 59 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 486 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 59 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HISIMHV1: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 610 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 72 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 610 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 72 ); |
|
|
|
break; |
|
|
|
|
|
|
|
case MODEL_TYPE::HISIMHV2: |
|
|
|
BOOST_CHECK_EQUAL( modelParamCount, 730 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParamCount, 74 ); |
|
|
|
BOOST_CHECK_EQUAL( modelParams.size(), 730 ); |
|
|
|
BOOST_CHECK_EQUAL( instanceParams.size(), 74 ); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|