Sim QA: Add Spice .subckt parsing tests

This commit is contained in:
Mikolaj Wielgus 2022-11-26 10:23:44 +01:00
parent 0b5814f98f
commit 08d37d2795
2 changed files with 230 additions and 115 deletions

View File

@ -0,0 +1,36 @@
*
* subckts.lib.spice
*
.SUBCKT NO_PARAMS_0 1 2
R1 1 2 1K
.ENDS
.subckt ONE_PARAM_1 1 2 PARAMS: PARAM1=1
R1 1 2 1K
.endsubckt
.SUBCKT ONE_PARAM_SHORT_FORM_2 1 2 PARAM1=1.0
R1 1 2 1K
.ENDSUBCKT
.subckt two_params_3 1 2 Params: param1=1.1e+1 param2=2.2e+2
R1 1 2 1K
.ends
.subckt two_params_short_form_4 1 2 param1=1.1E+1 param2=2.2E+2
R1 1 2 1K
.ends
.subckt NOTHING_5
R1 1 2 1K
.ends

View File

@ -125,9 +125,88 @@ public:
BOOST_FIXTURE_TEST_SUITE( SimLibrarySpice, TEST_SIM_LIBRARY_SPICE_FIXTURE )
BOOST_AUTO_TEST_CASE( Subckts )
{
LOCALE_IO toggle;
LoadLibrary( "subckts" );
const std::vector<SIM_LIBRARY::MODEL> models = m_library->GetModels();
BOOST_CHECK_EQUAL( models.size(), 6 );
for( int i = 0; i < models.size(); ++i )
{
const auto& [modelName, model] = models.at( i );
switch( i )
{
case 0:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "NO_PARAMS_0" );
break;
case 1:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "ONE_PARAM_1" );
BOOST_REQUIRE_EQUAL( model.GetParamCount(), 1 );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "PARAM1" );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1" );
BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
break;
case 2:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "ONE_PARAM_SHORT_FORM_2" );
BOOST_REQUIRE_EQUAL( model.GetParamCount(), 1 );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "PARAM1" );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.0" );
BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
break;
case 3:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "two_params_3" );
BOOST_REQUIRE_EQUAL( model.GetParamCount(), 2 );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "param1" );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.1e+1" );
BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.name, "param2" );
BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.defaultValue, "2.2e+2" );
BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
break;
case 4:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "two_params_short_form_4" );
BOOST_REQUIRE_EQUAL( model.GetParamCount(), 2 );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.name, "param1" );
BOOST_CHECK_EQUAL( model.GetParam( 0 ).info.defaultValue, "1.1E+1" );
BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.name, "param2" );
BOOST_CHECK_EQUAL( model.GetParam( 1 ).info.defaultValue, "2.2E+2" );
BOOST_REQUIRE_EQUAL( model.GetPinCount(), 2 );
BOOST_CHECK_EQUAL( model.GetPin( 0 ).name, "1" );
BOOST_CHECK_EQUAL( model.GetPin( 1 ).name, "2" );
break;
case 5:
BOOST_CHECK( model.GetType() == SIM_MODEL::TYPE::SUBCKT );
BOOST_CHECK_EQUAL( modelName, "NOTHING_5" );
BOOST_CHECK_EQUAL( model.GetParamCount(), 0 );
BOOST_CHECK_EQUAL( model.GetPinCount(), 0 );
break;
}
}
}
BOOST_AUTO_TEST_CASE( Diodes )
{
LOCALE_IO dummy;
LOCALE_IO toggle;
LoadLibrary( "diodes" );
@ -271,7 +350,7 @@ BOOST_AUTO_TEST_CASE( Diodes )
BOOST_AUTO_TEST_CASE( Bjts )
{
LOCALE_IO dummy;
LOCALE_IO toggle;
LoadLibrary( "bjts" );
@ -331,7 +410,7 @@ BOOST_AUTO_TEST_CASE( Bjts )
BOOST_AUTO_TEST_CASE( Fets )
{
LOCALE_IO dummy;
LOCALE_IO toggle;
LoadLibrary( "fets" );