Ibis: Coverity issues
This commit is contained in:
parent
9fd5ee5a2f
commit
bf62d6e9ee
|
@ -144,17 +144,17 @@ bool IbisComponentPackage::Check()
|
|||
{
|
||||
bool status = true;
|
||||
|
||||
if( !m_Rpkg->Check() )
|
||||
if( !m_Rpkg.Check() )
|
||||
{
|
||||
Report( _( "Invalid R_pkg value." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_Lpkg->Check() )
|
||||
if( !m_Lpkg.Check() )
|
||||
{
|
||||
Report( _( "Invalid L_pkg value." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_Cpkg->Check() )
|
||||
if( !m_Cpkg.Check() )
|
||||
{
|
||||
Report( _( "Invalid C_pkg value." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
|
@ -298,7 +298,7 @@ std::string IVtable::Spice( int aN, std::string aPort1, std::string aPort2, std:
|
|||
|
||||
for( IVtableEntry& entry : m_entries )
|
||||
{
|
||||
result += doubleToString( entry.I->value[aCorner] );
|
||||
result += doubleToString( entry.I.value[aCorner] );
|
||||
result += " ";
|
||||
}
|
||||
result += "]\n+ input_domain=0.05 fraction=TRUE)\n\n";
|
||||
|
@ -314,21 +314,21 @@ double IVtable::InterpolatedI( double aV, IBIS_CORNER aCorner )
|
|||
{
|
||||
if( aV >= m_entries.back().V )
|
||||
{
|
||||
return m_entries.back().I->value[aCorner];
|
||||
return m_entries.back().I.value[aCorner];
|
||||
}
|
||||
|
||||
if( aV <= m_entries.at( 0 ).V )
|
||||
{
|
||||
return m_entries.at( 0 ).I->value[aCorner];
|
||||
return m_entries.at( 0 ).I.value[aCorner];
|
||||
}
|
||||
|
||||
for( int i = 1; i < m_entries.size(); i++ )
|
||||
{
|
||||
if( m_entries.at( i ).V > aV )
|
||||
{
|
||||
return m_entries.at( i - 1 ).I->value[aCorner]
|
||||
+ ( m_entries.at( i ).I->value[aCorner]
|
||||
- m_entries.at( i - 1 ).I->value[aCorner] )
|
||||
return m_entries.at( i - 1 ).I.value[aCorner]
|
||||
+ ( m_entries.at( i ).I.value[aCorner]
|
||||
- m_entries.at( i - 1 ).I.value[aCorner] )
|
||||
/ ( m_entries.at( i ).V - m_entries.at( i - 1 ).V )
|
||||
* ( aV - m_entries.at( i - 1 ).V );
|
||||
}
|
||||
|
@ -356,7 +356,7 @@ bool IVtable::Check()
|
|||
break;
|
||||
}
|
||||
|
||||
if( !entry.I->Check() )
|
||||
if( !entry.I.Check() )
|
||||
{
|
||||
Report( _( "There is an invalid current in an IV table" ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
|
@ -403,12 +403,12 @@ bool IbisRamp::Check()
|
|||
status = false;
|
||||
Report( _( "Invalid R_load." ), RPT_SEVERITY_ERROR );
|
||||
}
|
||||
if( !m_falling->Check() )
|
||||
if( !m_falling.Check() )
|
||||
{
|
||||
Report( _( "Invalid falling dv/dt." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_rising->Check() )
|
||||
if( !m_rising.Check() )
|
||||
{
|
||||
Report( _( "Invalid rising dv/dt." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
|
@ -469,33 +469,33 @@ bool IbisModel::Check()
|
|||
Report( _( "Invalid V_meas value." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_C_comp->Check() )
|
||||
if( !m_C_comp.Check() )
|
||||
{
|
||||
Report( _( "C_comp is invalid." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_temperatureRange->Check() )
|
||||
if( !m_temperatureRange.Check() )
|
||||
{
|
||||
Report( _( "Temperature Range is invalid." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
|
||||
if( !m_voltageRange->Check() )
|
||||
if( !m_voltageRange.Check() )
|
||||
{
|
||||
// If the voltage range is not valid, it's ok, only if we have pulls and clamps
|
||||
if( !m_pulldownReference->Check() )
|
||||
if( !m_pulldownReference.Check() )
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
if( !m_pullupReference->Check() )
|
||||
if( !m_pullupReference.Check() )
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
if( !m_GNDClampReference->Check() )
|
||||
if( !m_GNDClampReference.Check() )
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
if( !m_POWERClampReference->Check() )
|
||||
if( !m_POWERClampReference.Check() )
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
|
@ -505,22 +505,22 @@ bool IbisModel::Check()
|
|||
}
|
||||
status = false;
|
||||
}
|
||||
if( !m_pulldown->Check() )
|
||||
if( !m_pulldown.Check() )
|
||||
{
|
||||
Report( _( "Invalid pulldown." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_pullup->Check() )
|
||||
if( !m_pullup.Check() )
|
||||
{
|
||||
Report( _( "Invalid pullup." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_POWERClamp->Check() )
|
||||
if( !m_POWERClamp.Check() )
|
||||
{
|
||||
Report( _( "Invalid POWER clamp." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
}
|
||||
if( !m_GNDClamp->Check() )
|
||||
if( !m_GNDClamp.Check() )
|
||||
{
|
||||
Report( _( "Invalid GND clamp." ), RPT_SEVERITY_ERROR );
|
||||
status = false;
|
||||
|
@ -529,7 +529,7 @@ bool IbisModel::Check()
|
|||
&& m_type != IBIS_MODEL_TYPE::TERMINATOR && m_type != IBIS_MODEL_TYPE::SERIES
|
||||
&& m_type != IBIS_MODEL_TYPE::SERIES_SWITCH )
|
||||
{
|
||||
if( !m_ramp->Check() )
|
||||
if( !m_ramp.Check() )
|
||||
{
|
||||
Report( _( "Invalid Ramp" ), RPT_SEVERITY_ERROR );
|
||||
}
|
||||
|
@ -1152,7 +1152,7 @@ bool IbisParser::changeContext( std::string& aKeyword )
|
|||
{
|
||||
switch( m_context )
|
||||
{
|
||||
case IBIS_PARSER_CONTEXT::HEADER: status &= m_ibisFile.m_header->Check(); break;
|
||||
case IBIS_PARSER_CONTEXT::HEADER: status &= m_ibisFile.m_header.Check(); break;
|
||||
case IBIS_PARSER_CONTEXT::COMPONENT: status &= m_currentComponent->Check(); break;
|
||||
case IBIS_PARSER_CONTEXT::MODEL: status &= m_currentModel->Check(); break;
|
||||
case IBIS_PARSER_CONTEXT::MODELSELECTOR: status &= m_currentModelSelector->Check(); break;
|
||||
|
@ -1171,10 +1171,9 @@ bool IbisParser::changeContext( std::string& aKeyword )
|
|||
//New context
|
||||
if( compareIbisWord( aKeyword.c_str(), "Component" ) )
|
||||
{
|
||||
IbisComponent comp( m_reporter );
|
||||
storeString( comp.m_name, false );
|
||||
m_ibisFile.m_components.push_back( comp );
|
||||
m_ibisFile.m_components.push_back( IbisComponent( m_reporter ) );
|
||||
m_currentComponent = &( m_ibisFile.m_components.back() );
|
||||
storeString( m_currentComponent->m_name, false );
|
||||
m_context = IBIS_PARSER_CONTEXT::COMPONENT;
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Model_Selector" ) )
|
||||
|
@ -1189,9 +1188,9 @@ bool IbisParser::changeContext( std::string& aKeyword )
|
|||
else if( compareIbisWord( aKeyword.c_str(), "Model" ) )
|
||||
{
|
||||
IbisModel model( m_reporter );
|
||||
model.m_temperatureRange->value[IBIS_CORNER::MIN] = 0;
|
||||
model.m_temperatureRange->value[IBIS_CORNER::TYP] = 50;
|
||||
model.m_temperatureRange->value[IBIS_CORNER::MAX] = 100;
|
||||
model.m_temperatureRange.value[IBIS_CORNER::MIN] = 0;
|
||||
model.m_temperatureRange.value[IBIS_CORNER::TYP] = 50;
|
||||
model.m_temperatureRange.value[IBIS_CORNER::MAX] = 100;
|
||||
storeString( model.m_name, false );
|
||||
m_ibisFile.m_models.push_back( model );
|
||||
m_currentModel = &( m_ibisFile.m_models.back() );
|
||||
|
@ -1303,7 +1302,7 @@ bool IbisParser::readRamp()
|
|||
|
||||
std::string keyword = std::string( "R_load " );
|
||||
|
||||
if( !readNumericSubparam( std::string( "R_load " ), m_currentModel->m_ramp->m_Rload ) )
|
||||
if( !readNumericSubparam( std::string( "R_load " ), m_currentModel->m_ramp.m_Rload ) )
|
||||
{
|
||||
std::string str;
|
||||
|
||||
|
@ -1311,11 +1310,11 @@ bool IbisParser::readRamp()
|
|||
{
|
||||
if( !strcmp( str.c_str(), "dV/dt_r" ) )
|
||||
{
|
||||
readRampdvdt( *( m_currentModel->m_ramp->m_rising ) );
|
||||
readRampdvdt( m_currentModel->m_ramp.m_rising );
|
||||
}
|
||||
else if( !strcmp( str.c_str(), "dV/dt_f" ) )
|
||||
{
|
||||
readRampdvdt( *( m_currentModel->m_ramp->m_falling ) );
|
||||
readRampdvdt( m_currentModel->m_ramp.m_falling );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1333,17 +1332,17 @@ bool IbisParser::parseModel( std::string& aKeyword )
|
|||
bool status = false;
|
||||
|
||||
if( compareIbisWord( aKeyword.c_str(), "Voltage_Range" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_voltageRange ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_voltageRange );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Temperature_Range" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_temperatureRange ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_temperatureRange );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "GND_Clamp" ) )
|
||||
status = readIVtableEntry( *( m_currentModel->m_GNDClamp ) );
|
||||
status = readIVtableEntry( m_currentModel->m_GNDClamp );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "POWER_Clamp" ) )
|
||||
status = readIVtableEntry( *( m_currentModel->m_POWERClamp ) );
|
||||
status = readIVtableEntry( m_currentModel->m_POWERClamp );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Pulldown" ) )
|
||||
status = readIVtableEntry( *( m_currentModel->m_pulldown ) );
|
||||
status = readIVtableEntry( m_currentModel->m_pulldown );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Pullup" ) )
|
||||
status = readIVtableEntry( *( m_currentModel->m_pullup ) );
|
||||
status = readIVtableEntry( m_currentModel->m_pullup );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Rising_Waveform" ) )
|
||||
status = readWaveform( nullptr, IBIS_WAVEFORM_TYPE::RISING );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Falling_Waveform" ) )
|
||||
|
@ -1351,21 +1350,21 @@ bool IbisParser::parseModel( std::string& aKeyword )
|
|||
else if( compareIbisWord( aKeyword.c_str(), "Ramp" ) )
|
||||
status = readRamp();
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Pullup_Reference" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_pullupReference ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_pullupReference );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Pulldown_Reference" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_pulldownReference ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_pulldownReference );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "POWER_Clamp_Reference" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_POWERClampReference ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_POWERClampReference );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "GND_Clamp_Reference" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_GNDClampReference ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_GNDClampReference );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Rac" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_Rac ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_Rac );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Cac" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_Cac ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_Cac );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Rpower" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_Rpower ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_Rpower );
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Rgnd" ) )
|
||||
status = readTypMinMaxValue( *( m_currentModel->m_Rgnd ) );
|
||||
status = readTypMinMaxValue( m_currentModel->m_Rgnd );
|
||||
else
|
||||
{
|
||||
status = changeContext( aKeyword );
|
||||
|
@ -1931,7 +1930,7 @@ bool IbisParser::readModel()
|
|||
else if( readNumericSubparam( std::string( "Vmeas" ), m_currentModel->m_vmeas ) )
|
||||
;
|
||||
else if( readTypMinMaxValueSubparam( std::string( "C_comp" ),
|
||||
*( m_currentModel->m_C_comp ) ) )
|
||||
m_currentModel->m_C_comp ) )
|
||||
;
|
||||
else
|
||||
{
|
||||
|
@ -1958,7 +1957,7 @@ bool IbisParser::parseHeader( std::string& aKeyword )
|
|||
|
||||
if( compareIbisWord( aKeyword.c_str(), "IBIS_Ver" ) )
|
||||
{
|
||||
status &= readDouble( m_ibisFile.m_header->m_ibisVersion );
|
||||
status &= readDouble( m_ibisFile.m_header.m_ibisVersion );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Comment_char" ) )
|
||||
{
|
||||
|
@ -1966,31 +1965,31 @@ bool IbisParser::parseHeader( std::string& aKeyword )
|
|||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "File_Name" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_fileName, false );
|
||||
storeString( m_ibisFile.m_header.m_fileName, false );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "File_Rev" ) )
|
||||
{
|
||||
status &= readDouble( m_ibisFile.m_header->m_fileRevision );
|
||||
status &= readDouble( m_ibisFile.m_header.m_fileRevision );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Source" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_source, true );
|
||||
storeString( m_ibisFile.m_header.m_source, true );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Notes" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_notes, true );
|
||||
storeString( m_ibisFile.m_header.m_notes, true );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Disclaimer" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_disclaimer, true );
|
||||
storeString( m_ibisFile.m_header.m_disclaimer, true );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Copyright" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_copyright, true );
|
||||
storeString( m_ibisFile.m_header.m_copyright, true );
|
||||
}
|
||||
else if( compareIbisWord( aKeyword.c_str(), "Date" ) )
|
||||
{
|
||||
storeString( m_ibisFile.m_header->m_date, false );
|
||||
storeString( m_ibisFile.m_header.m_date, false );
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2078,9 +2077,9 @@ bool IbisParser::readPackage()
|
|||
|
||||
std::vector<std::string> fields;
|
||||
|
||||
TypMinMaxValue* R = m_currentComponent->m_package.m_Rpkg;
|
||||
TypMinMaxValue* L = m_currentComponent->m_package.m_Lpkg;
|
||||
TypMinMaxValue* C = m_currentComponent->m_package.m_Cpkg;
|
||||
TypMinMaxValue* R = &( m_currentComponent->m_package.m_Rpkg );
|
||||
TypMinMaxValue* L = &( m_currentComponent->m_package.m_Lpkg );
|
||||
TypMinMaxValue* C = &( m_currentComponent->m_package.m_Cpkg );
|
||||
|
||||
readTableLine( fields );
|
||||
|
||||
|
@ -2300,7 +2299,7 @@ bool IbisParser::readDiffPin()
|
|||
}
|
||||
if( status && readWord( entry.pinB ) )
|
||||
{
|
||||
m_currentComponent->m_diffPin->m_entries.push_back( entry );
|
||||
m_currentComponent->m_diffPin.m_entries.push_back( entry );
|
||||
}
|
||||
}
|
||||
return status;
|
||||
|
@ -2321,7 +2320,7 @@ bool IbisParser::readIVtableEntry( IVtable& aDest )
|
|||
|
||||
status &= readDouble( entry.V );
|
||||
|
||||
if( status && readTypMinMaxValue( *( entry.I ) ) )
|
||||
if( status && readTypMinMaxValue( entry.I ) )
|
||||
{
|
||||
aDest.m_entries.push_back( entry );
|
||||
}
|
||||
|
@ -2345,7 +2344,7 @@ bool IbisParser::readVTtableEntry( VTtable& aDest )
|
|||
{
|
||||
std::string str;
|
||||
status &= readDouble( entry.t );
|
||||
status &= readTypMinMaxValue( *( entry.V ) );
|
||||
status &= readTypMinMaxValue( entry.V );
|
||||
}
|
||||
|
||||
m_continue = IBIS_PARSER_CONTINUE::IV_TABLE;
|
||||
|
@ -2410,7 +2409,7 @@ bool IbisParser::readWaveform( IbisWaveform* aDest, IBIS_WAVEFORM_TYPE aType )
|
|||
else if( readNumericSubparam( std::string( "C_dut" ), wf->m_C_fixture ) )
|
||||
;
|
||||
// The line is not a subparameter, then let's try to read a VT table entry
|
||||
else if( !readVTtableEntry( *( m_currentWaveform->m_table ) ) )
|
||||
else if( !readVTtableEntry( m_currentWaveform->m_table ) )
|
||||
{
|
||||
status = false;
|
||||
}
|
||||
|
@ -2473,12 +2472,8 @@ bool IbisParser::onNewLine()
|
|||
case IBIS_PARSER_CONTINUE::COMPONENT_DIFFPIN: status &= readDiffPin(); break;
|
||||
case IBIS_PARSER_CONTINUE::MODELSELECTOR: status &= readModelSelector(); break;
|
||||
case IBIS_PARSER_CONTINUE::MODEL: status &= readModel(); break;
|
||||
case IBIS_PARSER_CONTINUE::IV_TABLE:
|
||||
status &= readIVtableEntry( *( m_currentIVtable ) );
|
||||
break;
|
||||
case IBIS_PARSER_CONTINUE::VT_TABLE:
|
||||
status &= readVTtableEntry( *( m_currentVTtable ) );
|
||||
break;
|
||||
case IBIS_PARSER_CONTINUE::IV_TABLE: status &= readIVtableEntry( *m_currentIVtable ); break;
|
||||
case IBIS_PARSER_CONTINUE::VT_TABLE: status &= readVTtableEntry( *m_currentVTtable ); break;
|
||||
case IBIS_PARSER_CONTINUE::WAVEFORM:
|
||||
status &= readWaveform( m_currentWaveform, m_currentWaveform->m_type );
|
||||
break;
|
||||
|
|
|
@ -205,15 +205,16 @@ public:
|
|||
class IbisComponentPackage : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisComponentPackage( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
m_Rpkg = new TypMinMaxValue( m_reporter );
|
||||
m_Lpkg = new TypMinMaxValue( m_reporter );
|
||||
m_Cpkg = new TypMinMaxValue( m_reporter );
|
||||
};
|
||||
TypMinMaxValue* m_Rpkg;
|
||||
TypMinMaxValue* m_Lpkg;
|
||||
TypMinMaxValue* m_Cpkg;
|
||||
IbisComponentPackage( IBIS_REPORTER* aReporter ) :
|
||||
IBIS_INPUT( aReporter ),
|
||||
m_Rpkg( aReporter ),
|
||||
m_Lpkg( aReporter ),
|
||||
m_Cpkg( aReporter )
|
||||
{};
|
||||
|
||||
TypMinMaxValue m_Rpkg;
|
||||
TypMinMaxValue m_Lpkg;
|
||||
TypMinMaxValue m_Cpkg;
|
||||
|
||||
bool Check() override;
|
||||
};
|
||||
|
@ -252,22 +253,19 @@ public:
|
|||
std::string m_POWERClampRef;
|
||||
std::string m_extRef;
|
||||
|
||||
bool m_virtual;
|
||||
bool m_virtual = false;
|
||||
};
|
||||
|
||||
|
||||
class IbisDiffPinEntry : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisDiffPinEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
tdelay = new TypMinMaxValue( aReporter );
|
||||
};
|
||||
IbisDiffPinEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), tdelay( aReporter ){};
|
||||
|
||||
std::string pinA;
|
||||
std::string pinB;
|
||||
double Vdiff = 0.2; // ignored for input
|
||||
TypMinMaxValue* tdelay; // ignored for outputs
|
||||
TypMinMaxValue tdelay; // ignored for outputs
|
||||
};
|
||||
|
||||
|
||||
|
@ -281,10 +279,11 @@ public:
|
|||
class IbisComponent : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisComponent( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), m_package( aReporter )
|
||||
{
|
||||
m_diffPin = new IbisDiffPin( m_reporter );
|
||||
};
|
||||
IbisComponent( IBIS_REPORTER* aReporter ) :
|
||||
IBIS_INPUT( aReporter ),
|
||||
m_package( aReporter ),
|
||||
m_diffPin( aReporter )
|
||||
{};
|
||||
|
||||
std::string m_name = "";
|
||||
std::string m_manufacturer = "";
|
||||
|
@ -294,7 +293,7 @@ public:
|
|||
std::string m_packageModel;
|
||||
std::string m_busLabel;
|
||||
std::string m_dieSupplyPads;
|
||||
IbisDiffPin* m_diffPin;
|
||||
IbisDiffPin m_diffPin;
|
||||
|
||||
bool Check() override;
|
||||
};
|
||||
|
@ -322,12 +321,9 @@ public:
|
|||
class IVtableEntry : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IVtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
I = new TypMinMaxValue( m_reporter );
|
||||
};
|
||||
double V;
|
||||
TypMinMaxValue* I;
|
||||
IVtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), I( aReporter ){};
|
||||
double V = 0;
|
||||
TypMinMaxValue I;
|
||||
};
|
||||
|
||||
|
||||
|
@ -370,12 +366,9 @@ private:
|
|||
class VTtableEntry : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
VTtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
V = new TypMinMaxValue( m_reporter );
|
||||
};
|
||||
double t;
|
||||
TypMinMaxValue* V;
|
||||
VTtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), V( aReporter ){};
|
||||
double t = 0;
|
||||
TypMinMaxValue V;
|
||||
};
|
||||
|
||||
class VTtable : public IBIS_INPUT
|
||||
|
@ -424,8 +417,8 @@ enum class IBIS_MODEL_ENABLE
|
|||
class dvdt
|
||||
{
|
||||
public:
|
||||
double m_dv;
|
||||
double m_dt;
|
||||
double m_dv = 1;
|
||||
double m_dt = 1;
|
||||
};
|
||||
|
||||
class dvdtTypMinMax : public IBIS_INPUT
|
||||
|
@ -441,14 +434,14 @@ public:
|
|||
class IbisRamp : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisRamp( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
m_falling = new dvdtTypMinMax( m_reporter );
|
||||
m_rising = new dvdtTypMinMax( m_reporter );
|
||||
};
|
||||
IbisRamp( IBIS_REPORTER* aReporter ) :
|
||||
IBIS_INPUT( aReporter ),
|
||||
m_falling( aReporter ),
|
||||
m_rising( aReporter )
|
||||
{};
|
||||
|
||||
dvdtTypMinMax* m_falling;
|
||||
dvdtTypMinMax* m_rising;
|
||||
dvdtTypMinMax m_falling;
|
||||
dvdtTypMinMax m_rising;
|
||||
double m_Rload = 50; // The R_load subparameter is optional if the default 50 ohm load is used
|
||||
|
||||
bool Check() override;
|
||||
|
@ -463,15 +456,13 @@ enum class IBIS_WAVEFORM_TYPE
|
|||
class IbisWaveform : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisWaveform( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
m_table = new VTtable( m_reporter );
|
||||
};
|
||||
VTtable* m_table;
|
||||
IBIS_WAVEFORM_TYPE m_type;
|
||||
double m_R_dut;
|
||||
double m_C_dut;
|
||||
double m_L_dut;
|
||||
IbisWaveform( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), m_table( aReporter ){};
|
||||
|
||||
VTtable m_table;
|
||||
IBIS_WAVEFORM_TYPE m_type = IBIS_WAVEFORM_TYPE::RISING;
|
||||
double m_R_dut = 0;
|
||||
double m_C_dut = 0;
|
||||
double m_L_dut = 0;
|
||||
double m_R_fixture = 0;
|
||||
double m_C_fixture = 0;
|
||||
double m_L_fixture = 0;
|
||||
|
@ -490,25 +481,24 @@ enum class IBIS_MODEL_POLARITY
|
|||
class IbisModel : IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisModel( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
m_C_comp = new TypMinMaxValue( m_reporter );
|
||||
m_voltageRange = new TypMinMaxValue( m_reporter );
|
||||
m_temperatureRange = new TypMinMaxValue( m_reporter );
|
||||
m_pullupReference = new TypMinMaxValue( m_reporter );
|
||||
m_pulldownReference = new TypMinMaxValue( m_reporter );
|
||||
m_GNDClampReference = new TypMinMaxValue( m_reporter );
|
||||
m_POWERClampReference = new TypMinMaxValue( m_reporter );
|
||||
m_Rgnd = new TypMinMaxValue( m_reporter );
|
||||
m_Rpower = new TypMinMaxValue( m_reporter );
|
||||
m_Rac = new TypMinMaxValue( m_reporter );
|
||||
m_Cac = new TypMinMaxValue( m_reporter );
|
||||
m_GNDClamp = new IVtable( m_reporter );
|
||||
m_POWERClamp = new IVtable( m_reporter );
|
||||
m_pullup = new IVtable( m_reporter );
|
||||
m_pulldown = new IVtable( m_reporter );
|
||||
m_ramp = new IbisRamp( m_reporter );
|
||||
};
|
||||
IbisModel( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ),
|
||||
m_C_comp( aReporter ),
|
||||
m_voltageRange( aReporter ),
|
||||
m_temperatureRange( aReporter ),
|
||||
m_pullupReference( aReporter ),
|
||||
m_pulldownReference( aReporter ),
|
||||
m_GNDClampReference( aReporter ),
|
||||
m_POWERClampReference( aReporter ),
|
||||
m_Rgnd( aReporter ),
|
||||
m_Rpower( aReporter ),
|
||||
m_Rac( aReporter ),
|
||||
m_Cac( aReporter ),
|
||||
m_GNDClamp( aReporter ),
|
||||
m_POWERClamp( aReporter ),
|
||||
m_pullup( aReporter ),
|
||||
m_pulldown( aReporter ),
|
||||
m_ramp( aReporter )
|
||||
{};
|
||||
|
||||
std::string m_name;
|
||||
IBIS_MODEL_TYPE m_type = IBIS_MODEL_TYPE::UNDEFINED;
|
||||
|
@ -524,24 +514,24 @@ public:
|
|||
IBIS_MODEL_POLARITY m_polarity = IBIS_MODEL_POLARITY::UNDEFINED;
|
||||
// End of optional subparameters
|
||||
|
||||
TypMinMaxValue* m_C_comp;
|
||||
TypMinMaxValue* m_voltageRange;
|
||||
TypMinMaxValue* m_temperatureRange;
|
||||
TypMinMaxValue* m_pullupReference;
|
||||
TypMinMaxValue* m_pulldownReference;
|
||||
TypMinMaxValue* m_GNDClampReference;
|
||||
TypMinMaxValue* m_POWERClampReference;
|
||||
TypMinMaxValue* m_Rgnd;
|
||||
TypMinMaxValue* m_Rpower;
|
||||
TypMinMaxValue* m_Rac;
|
||||
TypMinMaxValue* m_Cac;
|
||||
IVtable* m_GNDClamp;
|
||||
IVtable* m_POWERClamp;
|
||||
IVtable* m_pullup;
|
||||
IVtable* m_pulldown;
|
||||
TypMinMaxValue m_C_comp;
|
||||
TypMinMaxValue m_voltageRange;
|
||||
TypMinMaxValue m_temperatureRange;
|
||||
TypMinMaxValue m_pullupReference;
|
||||
TypMinMaxValue m_pulldownReference;
|
||||
TypMinMaxValue m_GNDClampReference;
|
||||
TypMinMaxValue m_POWERClampReference;
|
||||
TypMinMaxValue m_Rgnd;
|
||||
TypMinMaxValue m_Rpower;
|
||||
TypMinMaxValue m_Rac;
|
||||
TypMinMaxValue m_Cac;
|
||||
IVtable m_GNDClamp;
|
||||
IVtable m_POWERClamp;
|
||||
IVtable m_pullup;
|
||||
IVtable m_pulldown;
|
||||
std::vector<IbisWaveform*> m_risingWaveforms;
|
||||
std::vector<IbisWaveform*> m_fallingWaveforms;
|
||||
IbisRamp* m_ramp;
|
||||
IbisRamp m_ramp;
|
||||
|
||||
bool Check() override;
|
||||
};
|
||||
|
@ -556,7 +546,7 @@ public:
|
|||
std::string m_manufacturer;
|
||||
std::string m_OEM;
|
||||
std::string m_description;
|
||||
int m_numberOfPins;
|
||||
int m_numberOfPins = 0;
|
||||
std::vector<std::string> m_pins;
|
||||
|
||||
std::shared_ptr<IBIS_MATRIX> m_resistanceMatrix;
|
||||
|
@ -569,12 +559,9 @@ public:
|
|||
class IbisFile : public IBIS_INPUT
|
||||
{
|
||||
public:
|
||||
IbisFile( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter )
|
||||
{
|
||||
m_header = new IbisHeader( m_reporter );
|
||||
};
|
||||
IbisFile( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), m_header( aReporter ){};
|
||||
|
||||
IbisHeader* m_header;
|
||||
IbisHeader m_header;
|
||||
std::vector<IbisComponent> m_components;
|
||||
std::vector<IbisModelSelector> m_modelSelectors;
|
||||
std::vector<IbisModel> m_models;
|
||||
|
@ -619,25 +606,25 @@ public:
|
|||
|
||||
bool m_parrot = true; // Write back all lines.
|
||||
|
||||
long m_lineCounter;
|
||||
long m_lineCounter = 0;
|
||||
char m_commentChar = '|';
|
||||
std::vector<char> m_buffer;
|
||||
int m_bufferIndex;
|
||||
int m_lineOffset;
|
||||
int m_lineIndex;
|
||||
int m_lineLength;
|
||||
int m_bufferIndex = 0;
|
||||
int m_lineOffset = 0;
|
||||
int m_lineIndex = 0;
|
||||
int m_lineLength = 0;
|
||||
|
||||
IbisFile m_ibisFile;
|
||||
IbisComponent* m_currentComponent;
|
||||
IbisModelSelector* m_currentModelSelector;
|
||||
IbisModel* m_currentModel;
|
||||
IbisPackageModel* m_currentPackageModel;
|
||||
IbisComponent* m_currentComponent = nullptr;
|
||||
IbisModelSelector* m_currentModelSelector = nullptr;
|
||||
IbisModel* m_currentModel = nullptr;
|
||||
IbisPackageModel* m_currentPackageModel = nullptr;
|
||||
std::shared_ptr<IBIS_MATRIX> m_currentMatrix;
|
||||
int m_currentMatrixRow;
|
||||
int m_currentMatrixRowIndex;
|
||||
IVtable* m_currentIVtable;
|
||||
VTtable* m_currentVTtable;
|
||||
IbisWaveform* m_currentWaveform;
|
||||
IVtable* m_currentIVtable = nullptr;
|
||||
VTtable* m_currentVTtable = nullptr;
|
||||
IbisWaveform* m_currentWaveform = nullptr;
|
||||
|
||||
/** @brief Parse a file
|
||||
*
|
||||
|
|
|
@ -94,18 +94,20 @@ KIBIS::KIBIS( std::string aFileName ) : KIBIS_ANY( this ), m_file( this )
|
|||
|
||||
KIBIS_FILE::KIBIS_FILE( KIBIS* aTopLevel ) : KIBIS_ANY( aTopLevel )
|
||||
{
|
||||
m_fileRev = -1;
|
||||
m_ibisVersion = -1;
|
||||
}
|
||||
|
||||
bool KIBIS_FILE::Init( IbisParser& aParser )
|
||||
{
|
||||
bool status = true;
|
||||
m_fileName = aParser.m_ibisFile.m_header->m_fileName;
|
||||
m_fileRev = aParser.m_ibisFile.m_header->m_fileRevision;
|
||||
m_ibisVersion = aParser.m_ibisFile.m_header->m_ibisVersion;
|
||||
m_date = aParser.m_ibisFile.m_header->m_date;
|
||||
m_notes = aParser.m_ibisFile.m_header->m_notes;
|
||||
m_disclaimer = aParser.m_ibisFile.m_header->m_disclaimer;
|
||||
m_copyright = aParser.m_ibisFile.m_header->m_copyright;
|
||||
m_fileName = aParser.m_ibisFile.m_header.m_fileName;
|
||||
m_fileRev = aParser.m_ibisFile.m_header.m_fileRevision;
|
||||
m_ibisVersion = aParser.m_ibisFile.m_header.m_ibisVersion;
|
||||
m_date = aParser.m_ibisFile.m_header.m_date;
|
||||
m_notes = aParser.m_ibisFile.m_header.m_notes;
|
||||
m_disclaimer = aParser.m_ibisFile.m_header.m_disclaimer;
|
||||
m_copyright = aParser.m_ibisFile.m_header.m_copyright;
|
||||
|
||||
m_valid = status;
|
||||
|
||||
|
@ -115,15 +117,17 @@ bool KIBIS_FILE::Init( IbisParser& aParser )
|
|||
KIBIS_PIN::KIBIS_PIN( KIBIS* aTopLevel, IbisComponentPin& aPin, IbisComponentPackage& aPackage,
|
||||
IbisParser& aParser, KIBIS_COMPONENT* aParent,
|
||||
std::vector<KIBIS_MODEL>& aModels ) :
|
||||
KIBIS_ANY( aTopLevel )
|
||||
KIBIS_ANY( aTopLevel ),
|
||||
m_Rpin( aTopLevel->m_reporter ), m_Lpin( aTopLevel->m_reporter ),
|
||||
m_Cpin( aTopLevel->m_reporter )
|
||||
{
|
||||
m_signalName = aPin.m_signalName;
|
||||
m_pinNumber = aPin.m_pinName;
|
||||
m_parent = aParent;
|
||||
|
||||
R_pin = aPackage.m_Rpkg;
|
||||
L_pin = aPackage.m_Lpkg;
|
||||
C_pin = aPackage.m_Cpkg;
|
||||
m_Rpin = aPackage.m_Rpkg;
|
||||
m_Lpin = aPackage.m_Lpkg;
|
||||
m_Cpin = aPackage.m_Cpkg;
|
||||
|
||||
// The values listed in the [Pin] description section override the default
|
||||
// values defined in [Package]
|
||||
|
@ -133,21 +137,21 @@ KIBIS_PIN::KIBIS_PIN( KIBIS* aTopLevel, IbisComponentPin& aPin, IbisComponentPac
|
|||
|
||||
if( !isnan( aPin.m_Lpin ) )
|
||||
{
|
||||
R_pin->value[IBIS_CORNER::TYP] = aPin.m_Rpin;
|
||||
R_pin->value[IBIS_CORNER::MIN] = aPin.m_Rpin;
|
||||
R_pin->value[IBIS_CORNER::MAX] = aPin.m_Rpin;
|
||||
m_Rpin.value[IBIS_CORNER::TYP] = aPin.m_Rpin;
|
||||
m_Rpin.value[IBIS_CORNER::MIN] = aPin.m_Rpin;
|
||||
m_Rpin.value[IBIS_CORNER::MAX] = aPin.m_Rpin;
|
||||
}
|
||||
if( !isnan( aPin.m_Lpin ) )
|
||||
{
|
||||
L_pin->value[IBIS_CORNER::TYP] = aPin.m_Lpin;
|
||||
L_pin->value[IBIS_CORNER::MIN] = aPin.m_Lpin;
|
||||
L_pin->value[IBIS_CORNER::MAX] = aPin.m_Lpin;
|
||||
m_Lpin.value[IBIS_CORNER::TYP] = aPin.m_Lpin;
|
||||
m_Lpin.value[IBIS_CORNER::MIN] = aPin.m_Lpin;
|
||||
m_Lpin.value[IBIS_CORNER::MAX] = aPin.m_Lpin;
|
||||
}
|
||||
if( !isnan( aPin.m_Cpin ) )
|
||||
{
|
||||
C_pin->value[IBIS_CORNER::TYP] = aPin.m_Cpin;
|
||||
C_pin->value[IBIS_CORNER::MIN] = aPin.m_Cpin;
|
||||
C_pin->value[IBIS_CORNER::MAX] = aPin.m_Cpin;
|
||||
m_Cpin.value[IBIS_CORNER::TYP] = aPin.m_Cpin;
|
||||
m_Cpin.value[IBIS_CORNER::MIN] = aPin.m_Cpin;
|
||||
m_Cpin.value[IBIS_CORNER::MAX] = aPin.m_Cpin;
|
||||
}
|
||||
|
||||
bool modelSelected = false;
|
||||
|
@ -184,7 +188,15 @@ KIBIS_PIN::KIBIS_PIN( KIBIS* aTopLevel, IbisComponentPin& aPin, IbisComponentPac
|
|||
}
|
||||
|
||||
KIBIS_MODEL::KIBIS_MODEL( KIBIS* aTopLevel, IbisModel& aSource, IbisParser& aParser ) :
|
||||
KIBIS_ANY( aTopLevel )
|
||||
KIBIS_ANY( aTopLevel ), m_C_comp( aTopLevel->m_reporter ),
|
||||
m_voltageRange( aTopLevel->m_reporter ), m_temperatureRange( aTopLevel->m_reporter ),
|
||||
m_pullupReference( aTopLevel->m_reporter ), m_pulldownReference( aTopLevel->m_reporter ),
|
||||
m_GNDClampReference( aTopLevel->m_reporter ),
|
||||
m_POWERClampReference( aTopLevel->m_reporter ), m_Rgnd( aTopLevel->m_reporter ),
|
||||
m_Rpower( aTopLevel->m_reporter ), m_Rac( aTopLevel->m_reporter ),
|
||||
m_Cac( aTopLevel->m_reporter ), m_GNDClamp( aTopLevel->m_reporter ),
|
||||
m_POWERClamp( aTopLevel->m_reporter ), m_pullup( aTopLevel->m_reporter ),
|
||||
m_pulldown( aTopLevel->m_reporter ), m_ramp( aTopLevel->m_reporter )
|
||||
{
|
||||
bool status = true;
|
||||
|
||||
|
@ -336,34 +348,34 @@ std::string KIBIS_MODEL::SpiceDie( IBIS_CORNER aSupply, IBIS_CORNER aParasitics,
|
|||
|
||||
result = "\n";
|
||||
result += "VPWR POWER GND ";
|
||||
result += doubleToString( m_voltageRange->value[aSupply] );
|
||||
result += doubleToString( m_voltageRange.value[aSupply] );
|
||||
result += "\n";
|
||||
result += "CCPOMP " + DIE + " GND ";
|
||||
result += doubleToString( m_C_comp->value[aParasitics] );
|
||||
result += doubleToString( m_C_comp.value[aParasitics] );
|
||||
result += "\n";
|
||||
|
||||
if( HasGNDClamp() )
|
||||
{
|
||||
result += m_GNDClamp->Spice( aIndex * 4 + 1, DIE, GC_GND, GC, aSupply );
|
||||
result += m_GNDClamp.Spice( aIndex * 4 + 1, DIE, GC_GND, GC, aSupply );
|
||||
result += "VmeasGC GND " + GC_GND + " 0\n";
|
||||
}
|
||||
|
||||
if( HasPOWERClamp() )
|
||||
{
|
||||
result += m_POWERClamp->Spice( aIndex * 4 + 2, "POWER", DIE, PC, aSupply );
|
||||
result += m_POWERClamp.Spice( aIndex * 4 + 2, "POWER", DIE, PC, aSupply );
|
||||
result += "VmeasPC POWER " + PC_PWR + " 0\n";
|
||||
}
|
||||
|
||||
if( HasPulldown() )
|
||||
{
|
||||
result += m_pulldown->Spice( aIndex * 4 + 3, DIEBUFF, PD_GND, PD, aSupply );
|
||||
result += m_pulldown.Spice( aIndex * 4 + 3, DIEBUFF, PD_GND, PD, aSupply );
|
||||
result += "VmeasPD GND " + PD_GND + " 0\n";
|
||||
result += "BKD GND " + DIE + " i=( -i(VmeasPU) * v(KU) )\n";
|
||||
}
|
||||
|
||||
if( HasPullup() )
|
||||
{
|
||||
result += m_pullup->Spice( aIndex * 4 + 4, PU_PWR, DIEBUFF, PU, aSupply );
|
||||
result += m_pullup.Spice( aIndex * 4 + 4, PU_PWR, DIEBUFF, PU, aSupply );
|
||||
result += "VmeasPU POWER " + PU_PWR + " 0\n";
|
||||
result += "BKU POWER " + DIE + " i=( i(VmeasPD) * v(KD) )\n";
|
||||
}
|
||||
|
@ -377,7 +389,7 @@ IbisWaveform KIBIS_MODEL::TrimWaveform( IbisWaveform& aIn )
|
|||
{
|
||||
IbisWaveform out( aIn.m_reporter );
|
||||
|
||||
int nbPoints = aIn.m_table->m_entries.size();
|
||||
int nbPoints = aIn.m_table.m_entries.size();
|
||||
|
||||
if( nbPoints < 2 )
|
||||
{
|
||||
|
@ -385,33 +397,30 @@ IbisWaveform KIBIS_MODEL::TrimWaveform( IbisWaveform& aIn )
|
|||
return out;
|
||||
}
|
||||
|
||||
double DCtyp = aIn.m_table->m_entries[0].V->value[IBIS_CORNER::TYP];
|
||||
double DCmin = aIn.m_table->m_entries[0].V->value[IBIS_CORNER::MIN];
|
||||
double DCmax = aIn.m_table->m_entries[0].V->value[IBIS_CORNER::MAX];
|
||||
double DCtyp = aIn.m_table.m_entries[0].V.value[IBIS_CORNER::TYP];
|
||||
double DCmin = aIn.m_table.m_entries[0].V.value[IBIS_CORNER::MIN];
|
||||
double DCmax = aIn.m_table.m_entries[0].V.value[IBIS_CORNER::MAX];
|
||||
|
||||
if( nbPoints == 2 )
|
||||
{
|
||||
return out;
|
||||
}
|
||||
|
||||
out.m_table->m_entries.clear();
|
||||
out.m_table.m_entries.clear();
|
||||
bool kept = false;
|
||||
|
||||
for( int i = 0; i < nbPoints; i++ )
|
||||
{
|
||||
VTtableEntry entry( out.m_reporter );
|
||||
|
||||
entry.t = aIn.m_table->m_entries.at( i ).t;
|
||||
entry.V->value[IBIS_CORNER::TYP] =
|
||||
aIn.m_table->m_entries.at( i ).V->value[IBIS_CORNER::TYP];
|
||||
entry.V->value[IBIS_CORNER::MIN] =
|
||||
aIn.m_table->m_entries.at( i ).V->value[IBIS_CORNER::MIN];
|
||||
entry.V->value[IBIS_CORNER::MAX] =
|
||||
aIn.m_table->m_entries.at( i ).V->value[IBIS_CORNER::MAX];
|
||||
out.m_table->m_entries.push_back( entry );
|
||||
out.m_table->m_entries.at( i ).V->value[IBIS_CORNER::TYP] -= DCtyp;
|
||||
out.m_table->m_entries.at( i ).V->value[IBIS_CORNER::MIN] -= DCmin;
|
||||
out.m_table->m_entries.at( i ).V->value[IBIS_CORNER::MAX] -= DCmax;
|
||||
entry.t = aIn.m_table.m_entries.at( i ).t;
|
||||
entry.V.value[IBIS_CORNER::TYP] = aIn.m_table.m_entries.at( i ).V.value[IBIS_CORNER::TYP];
|
||||
entry.V.value[IBIS_CORNER::MIN] = aIn.m_table.m_entries.at( i ).V.value[IBIS_CORNER::MIN];
|
||||
entry.V.value[IBIS_CORNER::MAX] = aIn.m_table.m_entries.at( i ).V.value[IBIS_CORNER::MAX];
|
||||
out.m_table.m_entries.push_back( entry );
|
||||
out.m_table.m_entries.at( i ).V.value[IBIS_CORNER::TYP] -= DCtyp;
|
||||
out.m_table.m_entries.at( i ).V.value[IBIS_CORNER::MIN] -= DCmin;
|
||||
out.m_table.m_entries.at( i ).V.value[IBIS_CORNER::MAX] -= DCmax;
|
||||
}
|
||||
|
||||
return out;
|
||||
|
@ -419,19 +428,19 @@ IbisWaveform KIBIS_MODEL::TrimWaveform( IbisWaveform& aIn )
|
|||
|
||||
bool KIBIS_MODEL::HasPulldown()
|
||||
{
|
||||
return m_pulldown->m_entries.size() > 0;
|
||||
return m_pulldown.m_entries.size() > 0;
|
||||
}
|
||||
bool KIBIS_MODEL::HasPullup()
|
||||
{
|
||||
return m_pullup->m_entries.size() > 0;
|
||||
return m_pullup.m_entries.size() > 0;
|
||||
}
|
||||
bool KIBIS_MODEL::HasGNDClamp()
|
||||
{
|
||||
return m_GNDClamp->m_entries.size() > 0;
|
||||
return m_GNDClamp.m_entries.size() > 0;
|
||||
}
|
||||
bool KIBIS_MODEL::HasPOWERClamp()
|
||||
{
|
||||
return m_POWERClamp->m_entries.size() > 0;
|
||||
return m_POWERClamp.m_entries.size() > 0;
|
||||
}
|
||||
|
||||
std::string KIBIS_MODEL::generateSquareWave( std::string aNode1, std::string aNode2,
|
||||
|
@ -444,10 +453,10 @@ std::string KIBIS_MODEL::generateSquareWave( std::string aNode1, std::string aNo
|
|||
IbisWaveform risingWF = TrimWaveform( *( aPair.first ) );
|
||||
IbisWaveform fallingWF = TrimWaveform( *( aPair.second ) );
|
||||
|
||||
double deltaR = risingWF.m_table->m_entries.back().V->value[aSupply]
|
||||
- risingWF.m_table->m_entries.at( 0 ).V->value[aSupply];
|
||||
double deltaF = fallingWF.m_table->m_entries.back().V->value[aSupply]
|
||||
- fallingWF.m_table->m_entries.at( 0 ).V->value[aSupply];
|
||||
double deltaR = risingWF.m_table.m_entries.back().V.value[aSupply]
|
||||
- risingWF.m_table.m_entries.at( 0 ).V.value[aSupply];
|
||||
double deltaF = fallingWF.m_table.m_entries.back().V.value[aSupply]
|
||||
- fallingWF.m_table.m_entries.at( 0 ).V.value[aSupply];
|
||||
|
||||
// Ideally, delta should be equal to zero.
|
||||
// It can be different from zero if the falling waveform does not start were the rising one ended.
|
||||
|
@ -475,8 +484,8 @@ std::string KIBIS_MODEL::generateSquareWave( std::string aNode1, std::string aNo
|
|||
if( i != 0 )
|
||||
{
|
||||
simul += "0 0 ";
|
||||
VTtableEntry entry0 = WF->m_table->m_entries.at( 0 );
|
||||
VTtableEntry entry1 = WF->m_table->m_entries.at( 1 );
|
||||
VTtableEntry entry0 = WF->m_table.m_entries.at( 0 );
|
||||
VTtableEntry entry1 = WF->m_table.m_entries.at( 1 );
|
||||
double deltaT = entry1.t - entry0.t;
|
||||
|
||||
simul += doubleToString( entry0.t + timing - deltaT );
|
||||
|
@ -485,11 +494,11 @@ std::string KIBIS_MODEL::generateSquareWave( std::string aNode1, std::string aNo
|
|||
simul += " ";
|
||||
}
|
||||
|
||||
for( VTtableEntry& entry : WF->m_table->m_entries )
|
||||
for( VTtableEntry& entry : WF->m_table.m_entries )
|
||||
{
|
||||
simul += doubleToString( entry.t + timing );
|
||||
simul += " ";
|
||||
simul += doubleToString( entry.V->value[aSupply] - delta );
|
||||
simul += doubleToString( entry.V.value[aSupply] - delta );
|
||||
simul += " ";
|
||||
}
|
||||
simul += ")\n";
|
||||
|
@ -514,11 +523,11 @@ std::string KIBIS_MODEL::generateSquareWave( std::string aNode1, std::string aNo
|
|||
// The DC value we add is the first value of the first bit.
|
||||
if( aBits[0].first == 0 )
|
||||
{
|
||||
simul += doubleToString( aPair.second->m_table->m_entries.at( 0 ).V->value[aSupply] );
|
||||
simul += doubleToString( aPair.second->m_table.m_entries.at( 0 ).V.value[aSupply] );
|
||||
}
|
||||
else
|
||||
{
|
||||
simul += doubleToString( aPair.first->m_table->m_entries.at( 0 ).V->value[aSupply] );
|
||||
simul += doubleToString( aPair.first->m_table.m_entries.at( 0 ).V.value[aSupply] );
|
||||
}
|
||||
|
||||
simul += ")\n";
|
||||
|
@ -554,22 +563,22 @@ std::string KIBIS_PIN::addDie( KIBIS_MODEL& aModel, IBIS_CORNER aSupply, int aIn
|
|||
|
||||
if( aModel.HasGNDClamp() )
|
||||
{
|
||||
simul += aModel.m_GNDClamp->Spice( aIndex * 4 + 1, DIE, GC_GND, GC, aSupply );
|
||||
simul += aModel.m_GNDClamp.Spice( aIndex * 4 + 1, DIE, GC_GND, GC, aSupply );
|
||||
}
|
||||
|
||||
if( aModel.HasPOWERClamp() )
|
||||
{
|
||||
simul += aModel.m_POWERClamp->Spice( aIndex * 4 + 2, PC_PWR, DIE, PC, aSupply );
|
||||
simul += aModel.m_POWERClamp.Spice( aIndex * 4 + 2, PC_PWR, DIE, PC, aSupply );
|
||||
}
|
||||
|
||||
if( aModel.HasPulldown() )
|
||||
{
|
||||
simul += aModel.m_pulldown->Spice( aIndex * 4 + 3, DIE, PD_GND, PD, aSupply );
|
||||
simul += aModel.m_pulldown.Spice( aIndex * 4 + 3, DIE, PD_GND, PD, aSupply );
|
||||
}
|
||||
|
||||
if( aModel.HasPullup() )
|
||||
{
|
||||
simul += aModel.m_pullup->Spice( aIndex * 4 + 4, PU_PWR, DIE, PU, aSupply );
|
||||
simul += aModel.m_pullup.Spice( aIndex * 4 + 4, PU_PWR, DIE, PU, aSupply );
|
||||
}
|
||||
|
||||
return simul;
|
||||
|
@ -581,8 +590,15 @@ void KIBIS_PIN::getKuKdFromFile( std::string* aSimul )
|
|||
// that's not the best way to do, but ¯\_(ツ)_/¯
|
||||
std::ifstream in( "temp_input.spice" );
|
||||
|
||||
std::remove( "temp_input.spice" );
|
||||
std::remove( "temp_output.spice" );
|
||||
if( std::remove( "temp_input.spice" ) )
|
||||
{
|
||||
Report( _( "Cannot remove temporary input file" ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
||||
if( std::remove( "temp_ouput.spice" ) )
|
||||
{
|
||||
Report( _( "Cannot remove temporary output file" ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
||||
std::ofstream file( "temp_input.spice" );
|
||||
|
||||
|
@ -635,8 +651,16 @@ void KIBIS_PIN::getKuKdFromFile( std::string* aSimul )
|
|||
{
|
||||
Report( _( "Error while creating temporary file" ), RPT_SEVERITY_ERROR );
|
||||
}
|
||||
std::remove( "temp_input.spice" );
|
||||
std::remove( "temp_output.spice" );
|
||||
|
||||
if( std::remove( "temp_input.spice" ) )
|
||||
{
|
||||
Report( _( "Cannot remove temporary input file" ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
||||
if( std::remove( "temp_ouput.spice" ) )
|
||||
{
|
||||
Report( _( "Cannot remove temporary output file" ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
||||
// @TODO : this is the end of the dirty code
|
||||
|
||||
|
@ -685,7 +709,7 @@ std::string KIBIS_PIN::KuKdDriver( KIBIS_MODEL& aMode
|
|||
|
||||
simul += "\n";
|
||||
simul += "CCPOMP 2 GND ";
|
||||
simul += doubleToString( aModel.m_C_comp->value[aParasitics] ); //@TODO: Check the corner ?
|
||||
simul += doubleToString( aModel.m_C_comp.value[aParasitics] ); //@TODO: Check the corner ?
|
||||
simul += "\n";
|
||||
switch( aWave->GetType() )
|
||||
{
|
||||
|
@ -697,12 +721,12 @@ std::string KIBIS_PIN::KuKdDriver( KIBIS_MODEL& aMode
|
|||
IbisWaveform* risingWF = aPair.first;
|
||||
IbisWaveform* fallingWF = aPair.second;
|
||||
|
||||
if( rectWave->m_ton < risingWF->m_table->m_entries.back().t )
|
||||
if( rectWave->m_ton < risingWF->m_table.m_entries.back().t )
|
||||
{
|
||||
Report( _( "Rising edge is longer than on time." ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
||||
if( rectWave->m_toff < fallingWF->m_table->m_entries.back().t )
|
||||
if( rectWave->m_toff < fallingWF->m_table.m_entries.back().t )
|
||||
{
|
||||
Report( _( "Falling edge is longer than off time." ), RPT_SEVERITY_WARNING );
|
||||
}
|
||||
|
@ -727,7 +751,7 @@ std::string KIBIS_PIN::KuKdDriver( KIBIS_MODEL& aMode
|
|||
{
|
||||
IbisWaveform* fallingWF = aPair.second;
|
||||
simul += "Vsig DIE0 GND ";
|
||||
simul += doubleToString( fallingWF->m_table->m_entries.at( 0 ).V->value[aSupply] );
|
||||
simul += doubleToString( fallingWF->m_table.m_entries.at( 0 ).V.value[aSupply] );
|
||||
simul += "\n";
|
||||
break;
|
||||
}
|
||||
|
@ -735,7 +759,7 @@ std::string KIBIS_PIN::KuKdDriver( KIBIS_MODEL& aMode
|
|||
{
|
||||
IbisWaveform* risingWF = aPair.first;
|
||||
simul += "Vsig DIE0 GND ";
|
||||
simul += doubleToString( risingWF->m_table->m_entries.at( 0 ).V->value[aSupply] );
|
||||
simul += doubleToString( risingWF->m_table.m_entries.at( 0 ).V.value[aSupply] );
|
||||
simul += "\n";
|
||||
break;
|
||||
}
|
||||
|
@ -772,7 +796,7 @@ void KIBIS_PIN::getKuKdOneWaveform( KIBIS_MODEL& aMod
|
|||
simul += "\n x1 3 0 1 DRIVER0 \n";
|
||||
|
||||
simul += "VCC 3 0 ";
|
||||
simul += doubleToString( aModel.m_voltageRange->value[aSupply] );
|
||||
simul += doubleToString( aModel.m_voltageRange.value[aSupply] );
|
||||
simul += "\n";
|
||||
//simul += "Vpin x1.DIE 0 1 \n"
|
||||
simul += "Lfixture 1 4 ";
|
||||
|
@ -859,7 +883,7 @@ void KIBIS_PIN::getKuKdNoWaveform( KIBIS_MODEL& aModel, KIBIS_WAVEFORM* aWave, I
|
|||
ku.push_back( 1 );
|
||||
kd.push_back( 0 );
|
||||
t.push_back( ( rectWave->m_ton + rectWave->m_toff ) * i
|
||||
+ aModel.m_ramp->m_rising->value[aSupply].m_dt
|
||||
+ aModel.m_ramp.m_rising.value[aSupply].m_dt
|
||||
/ 0.6 ); // 0.6 because ibis only gives 20%-80% time
|
||||
ku.push_back( 1 );
|
||||
kd.push_back( 0 );
|
||||
|
@ -867,7 +891,7 @@ void KIBIS_PIN::getKuKdNoWaveform( KIBIS_MODEL& aModel, KIBIS_WAVEFORM* aWave, I
|
|||
ku.push_back( 0 );
|
||||
kd.push_back( 1 );
|
||||
t.push_back( ( rectWave->m_ton + rectWave->m_toff ) * i + rectWave->m_toff
|
||||
+ aModel.m_ramp->m_falling->value[aSupply].m_dt / 0.6 );
|
||||
+ aModel.m_ramp.m_falling.value[aSupply].m_dt / 0.6 );
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -923,7 +947,7 @@ void KIBIS_PIN::getKuKdTwoWaveforms( KIBIS_MODEL& aMo
|
|||
simul += "\n x1 3 0 1 DRIVER0 \n";
|
||||
|
||||
simul += "VCC 3 0 ";
|
||||
simul += doubleToString( aModel.m_voltageRange->value[aSupply] );
|
||||
simul += doubleToString( aModel.m_voltageRange.value[aSupply] );
|
||||
simul += "\n";
|
||||
//simul += "Vpin x1.DIE 0 1 \n"
|
||||
simul += "Lfixture0 1 4 ";
|
||||
|
@ -1067,13 +1091,13 @@ bool KIBIS_PIN::writeSpiceDriver( std::string* aDest, std::string aName, KIBIS_M
|
|||
result += "\n";
|
||||
|
||||
result += "RPIN 1 PIN ";
|
||||
result += doubleToString( R_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Rpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
result += "LPIN DIE0 1 ";
|
||||
result += doubleToString( L_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Lpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
result += "CPIN PIN GND ";
|
||||
result += doubleToString( C_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Cpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
|
||||
std::vector<std::pair<IbisWaveform*, IbisWaveform*>> wfPairs = aModel.waveformPairs();
|
||||
|
@ -1162,13 +1186,13 @@ bool KIBIS_PIN::writeSpiceDevice( std::string* aDest, std::string aName, KIBIS_M
|
|||
result += "\n";
|
||||
result += "\n";
|
||||
result += "RPIN 1 PIN ";
|
||||
result += doubleToString( R_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Rpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
result += "LPIN DIE 1 ";
|
||||
result += doubleToString( L_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Lpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
result += "CPIN PIN GND ";
|
||||
result += doubleToString( C_pin->value[aParasitics] );
|
||||
result += doubleToString( m_Cpin.value[aParasitics] );
|
||||
result += "\n";
|
||||
|
||||
|
||||
|
|
|
@ -73,9 +73,9 @@ class KIBIS_WAVEFORM_RECTANGULAR : public KIBIS_WAVEFORM
|
|||
{
|
||||
public:
|
||||
KIBIS_WAVEFORM_RECTANGULAR() : KIBIS_WAVEFORM() { m_type = KIBIS_WAVEFORM_TYPE::RECTANGULAR; };
|
||||
double m_ton;
|
||||
double m_toff;
|
||||
int m_cycles;
|
||||
double m_ton = 1;
|
||||
double m_toff = 1;
|
||||
int m_cycles = 1;
|
||||
double m_delay = 0;
|
||||
};
|
||||
|
||||
|
@ -171,24 +171,24 @@ public:
|
|||
IBIS_MODEL_POLARITY m_polarity = IBIS_MODEL_POLARITY::UNDEFINED;
|
||||
// End of optional subparameters
|
||||
|
||||
TypMinMaxValue* m_C_comp;
|
||||
TypMinMaxValue* m_voltageRange;
|
||||
TypMinMaxValue* m_temperatureRange;
|
||||
TypMinMaxValue* m_pullupReference;
|
||||
TypMinMaxValue* m_pulldownReference;
|
||||
TypMinMaxValue* m_GNDClampReference;
|
||||
TypMinMaxValue* m_POWERClampReference;
|
||||
TypMinMaxValue* m_Rgnd;
|
||||
TypMinMaxValue* m_Rpower;
|
||||
TypMinMaxValue* m_Rac;
|
||||
TypMinMaxValue* m_Cac;
|
||||
IVtable* m_GNDClamp;
|
||||
IVtable* m_POWERClamp;
|
||||
IVtable* m_pullup;
|
||||
IVtable* m_pulldown;
|
||||
TypMinMaxValue m_C_comp;
|
||||
TypMinMaxValue m_voltageRange;
|
||||
TypMinMaxValue m_temperatureRange;
|
||||
TypMinMaxValue m_pullupReference;
|
||||
TypMinMaxValue m_pulldownReference;
|
||||
TypMinMaxValue m_GNDClampReference;
|
||||
TypMinMaxValue m_POWERClampReference;
|
||||
TypMinMaxValue m_Rgnd;
|
||||
TypMinMaxValue m_Rpower;
|
||||
TypMinMaxValue m_Rac;
|
||||
TypMinMaxValue m_Cac;
|
||||
IVtable m_GNDClamp;
|
||||
IVtable m_POWERClamp;
|
||||
IVtable m_pullup;
|
||||
IVtable m_pulldown;
|
||||
std::vector<IbisWaveform*> m_risingWaveforms;
|
||||
std::vector<IbisWaveform*> m_fallingWaveforms;
|
||||
IbisRamp* m_ramp;
|
||||
IbisRamp m_ramp;
|
||||
|
||||
/** @brief Return true if the model has a pulldown transistor */
|
||||
bool HasPulldown();
|
||||
|
@ -262,11 +262,11 @@ public:
|
|||
std::string m_pinNumber;
|
||||
|
||||
/** @brief Resistance from die to pin */
|
||||
TypMinMaxValue* R_pin;
|
||||
TypMinMaxValue m_Rpin;
|
||||
/** @brief Inductance from die to pin */
|
||||
TypMinMaxValue* L_pin;
|
||||
TypMinMaxValue m_Lpin;
|
||||
/** @brief Capacitance from pin to GND */
|
||||
TypMinMaxValue* C_pin;
|
||||
TypMinMaxValue m_Cpin;
|
||||
|
||||
KIBIS_COMPONENT* m_parent;
|
||||
|
||||
|
|
Loading…
Reference in New Issue