committed by
Seth Hillbrand
15 changed files with 5933 additions and 0 deletions
-
9CMakeLists.txt
-
25LICENSE.3-CLAUSE-BSD
-
2LICENSE.README
-
2531pcbnew/signalIntegrity/ibisParser.cpp
-
765pcbnew/signalIntegrity/ibisParser.h
-
1238pcbnew/signalIntegrity/kibis.cpp
-
376pcbnew/signalIntegrity/kibis.h
-
3qa/CMakeLists.txt
-
84qa/signalIntegrity/CMakeLists.txt
-
89qa/signalIntegrity/ibis_v1_1.ibs
-
147qa/signalIntegrity/ibis_v2_1.ibs
-
110qa/signalIntegrity/ibis_v2_1.pkg
-
419qa/signalIntegrity/ibis_v3_2.ibs
-
46qa/signalIntegrity/ibis_v3_2.pkg
-
89qa/signalIntegrity/qaIbisParser.cpp
@ -0,0 +1,25 @@ |
|||||
|
Redistribution and use in source and binary forms, with or without modification, |
||||
|
are permitted provided that the following conditions are met: |
||||
|
|
||||
|
1. Redistributions of source code must retain the above copyright notice,this |
||||
|
list of conditions and the following disclaimer. |
||||
|
|
||||
|
2. Redistributions in binary form must reproduce the above copyright notice, |
||||
|
this list of conditions and the following disclaimer in the documentation |
||||
|
and/or other materials provided with the distribution. |
||||
|
|
||||
|
3. Neither the name of the copyright holder nor the names of its contributors |
||||
|
may be used to endorse or promote products derived from this software |
||||
|
without specific prior written permission. |
||||
|
|
||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
||||
|
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS |
||||
|
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
||||
|
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY |
||||
|
OF SUCH DAMAGE. |
2531
pcbnew/signalIntegrity/ibisParser.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,765 @@ |
|||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2022 Fabien Corona f.corona<at>laposte.net |
||||
|
* |
||||
|
* Redistribution and use in source and binary forms, with or without modification, |
||||
|
* are permitted provided that the following conditions are met: |
||||
|
* |
||||
|
* 1. Redistributions of source code must retain the above copyright notice, |
||||
|
* this list of conditions and the following disclaimer. |
||||
|
* |
||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
|
* this list of conditions and the following disclaimer in the documentation |
||||
|
* and/or other materials provided with the distribution. |
||||
|
* |
||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used |
||||
|
* to endorse or promote products derived from this software without specific |
||||
|
* prior written permission. |
||||
|
* |
||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS |
||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY |
||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef IBIS_PARSER_H |
||||
|
#define IBIS_PARSER_H |
||||
|
|
||||
|
#define _( x ) x |
||||
|
|
||||
|
#define NAN_NA "1" |
||||
|
#define NAN_INVALID "0" |
||||
|
|
||||
|
#define IBIS_MAX_VERSION 7.0 // Up to v7.0, IBIS is fully backward compatible |
||||
|
#define IBIS_MAX_LINE_LENGTH 2048 // official limit is 1024 |
||||
|
|
||||
|
#include <wx/string.h> |
||||
|
#include <reporter.h> |
||||
|
//#include "common.h" |
||||
|
#include <iostream> |
||||
|
#include <fstream> |
||||
|
#include <vector> |
||||
|
#include <math.h> |
||||
|
#include <cstring> |
||||
|
|
||||
|
|
||||
|
class IBIS_REPORTER |
||||
|
{ |
||||
|
public: |
||||
|
/** @brief Print a message |
||||
|
* |
||||
|
* In the future, this function could do more than just printing a message. |
||||
|
* All KIBIS messages are concentrated at a single point in the code. |
||||
|
* |
||||
|
* @param aMsg Message |
||||
|
* @param aSeverity Message sevirity |
||||
|
*/ |
||||
|
void Report( std::string aMsg, SEVERITY aSeverity ) { std::cout << aMsg << std::endl; }; |
||||
|
}; |
||||
|
|
||||
|
class IBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_ANY( IBIS_REPORTER* aReporter ) { m_reporter = aReporter; }; |
||||
|
IBIS_REPORTER* m_reporter; |
||||
|
|
||||
|
/** @brief Print a message |
||||
|
* |
||||
|
* Call m_reporter->Report if m_reporter exists. |
||||
|
* |
||||
|
* @param aMsg Message |
||||
|
* @param aSeverity Message sevirity |
||||
|
*/ |
||||
|
void Report( std::string aMsg, SEVERITY aSeverity = RPT_SEVERITY_INFO ) |
||||
|
{ |
||||
|
if( m_reporter ) |
||||
|
{ |
||||
|
m_reporter->Report( aMsg, aSeverity ); |
||||
|
} |
||||
|
}; |
||||
|
protected: |
||||
|
/** @brief Convert a double to string using scientific notation |
||||
|
* |
||||
|
* @param aNumber Number |
||||
|
* @return Output string |
||||
|
*/ |
||||
|
std::string doubleToString( double aNumber ); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IBIS_INPUT : public IBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_INPUT( IBIS_REPORTER* aReporter ) : IBIS_ANY( aReporter ){}; |
||||
|
/** @brief Check if the data held by the object is valid. |
||||
|
* |
||||
|
* @return true in case of success |
||||
|
*/ |
||||
|
bool virtual Check() { return false; }; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
enum IBIS_CORNER |
||||
|
{ |
||||
|
TYP = 0, |
||||
|
MIN, |
||||
|
MAX |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
enum class IBIS_MATRIX_TYPE |
||||
|
{ |
||||
|
// All matrices are supposed to be symmetrical, only upper right triangle is given |
||||
|
UNDEFINED, |
||||
|
BANDED, // Give the main diagonal + [bandwith] elements on the right |
||||
|
SPARSE, // Only give non-zero values. |
||||
|
FULL, // Give the whole upper triangle. |
||||
|
}; |
||||
|
|
||||
|
class IBIS_MATRIX : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_MATRIX( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
IBIS_MATRIX_TYPE m_type = IBIS_MATRIX_TYPE::UNDEFINED; |
||||
|
int m_dim = -5; |
||||
|
std::vector<double> m_data; |
||||
|
}; |
||||
|
|
||||
|
class IBIS_MATRIX_BANDED : public IBIS_MATRIX |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_MATRIX_BANDED( IBIS_REPORTER* aReporter ) : IBIS_MATRIX( aReporter ){}; |
||||
|
IBIS_MATRIX_TYPE m_type = IBIS_MATRIX_TYPE::BANDED; |
||||
|
int m_dim = -2; |
||||
|
int m_bandwidth = 0; |
||||
|
std::vector<double> m_data; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
class IBIS_MATRIX_SPARSE : public IBIS_MATRIX |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_MATRIX_SPARSE( IBIS_REPORTER* aReporter ) : IBIS_MATRIX( aReporter ){}; |
||||
|
IBIS_MATRIX_TYPE m_type = IBIS_MATRIX_TYPE::BANDED; |
||||
|
int m_dim = -3; |
||||
|
std::vector<double> m_data; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IBIS_MATRIX_FULL : public IBIS_MATRIX |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_MATRIX_FULL( IBIS_REPORTER* aReporter ) : IBIS_MATRIX( aReporter ){}; |
||||
|
IBIS_MATRIX_TYPE m_type = IBIS_MATRIX_TYPE::FULL; |
||||
|
int m_dim = -4; |
||||
|
std::vector<double> m_data; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IBIS_SECTION : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IBIS_SECTION( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisHeader : IBIS_SECTION |
||||
|
{ |
||||
|
public: |
||||
|
IbisHeader( IBIS_REPORTER* aReporter ) : IBIS_SECTION( aReporter ){}; |
||||
|
double m_ibisVersion = -1; |
||||
|
double m_fileRevision = -1; |
||||
|
std::string m_fileName; |
||||
|
std::string m_source; |
||||
|
std::string m_date; |
||||
|
std::string m_notes; |
||||
|
std::string m_disclaimer; |
||||
|
std::string m_copyright; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class TypMinMaxValue : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
TypMinMaxValue( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
double value[3]; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
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; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisComponentPin : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisComponentPin( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
|
||||
|
std::string m_pinName; |
||||
|
std::string m_signalName; |
||||
|
std::string m_modelName; |
||||
|
double m_Rpin = std::nan( NAN_NA ); |
||||
|
double m_Lpin = std::nan( NAN_NA ); |
||||
|
double m_Cpin = std::nan( NAN_NA ); |
||||
|
|
||||
|
int m_Rcol = 0; |
||||
|
int m_Lcol = 0; |
||||
|
int m_Ccol = 0; |
||||
|
|
||||
|
bool Check() override; |
||||
|
|
||||
|
bool m_dummy = false; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisComponentPinMapping : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisComponentPinMapping( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
std::string m_pinName; |
||||
|
std::string m_PDref; |
||||
|
std::string m_PUref; |
||||
|
std::string m_GNDClampRef; |
||||
|
std::string m_POWERClampRef; |
||||
|
std::string m_extRef; |
||||
|
|
||||
|
bool m_virtual; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisDiffPinEntry : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisDiffPinEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ) |
||||
|
{ |
||||
|
tdelay = new TypMinMaxValue( aReporter ); |
||||
|
}; |
||||
|
|
||||
|
std::string pinA; |
||||
|
std::string pinB; |
||||
|
double Vdiff = 0.2; // ignored for input |
||||
|
TypMinMaxValue* tdelay; // ignored for outputs |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisDiffPin : IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisDiffPin( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
std::vector<IbisDiffPinEntry> m_entries; |
||||
|
}; |
||||
|
|
||||
|
class IbisComponent : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisComponent( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), m_package( aReporter ) |
||||
|
{ |
||||
|
m_diffPin = new IbisDiffPin( m_reporter ); |
||||
|
}; |
||||
|
|
||||
|
std::string m_name = ""; |
||||
|
std::string m_manufacturer = ""; |
||||
|
IbisComponentPackage m_package; |
||||
|
std::vector<IbisComponentPin> m_pins; |
||||
|
std::vector<IbisComponentPinMapping> m_pinMappings; |
||||
|
std::string m_packageModel; |
||||
|
std::string m_busLabel; |
||||
|
std::string m_dieSupplyPads; |
||||
|
IbisDiffPin* m_diffPin; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisModelSelectorEntry |
||||
|
{ |
||||
|
public: |
||||
|
std::string m_modelName; |
||||
|
std::string m_modelDescription; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisModelSelector : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisModelSelector( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
std::string m_name; |
||||
|
std::vector<IbisModelSelectorEntry> m_models; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IVtableEntry : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IVtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ) |
||||
|
{ |
||||
|
I = new TypMinMaxValue( m_reporter ); |
||||
|
}; |
||||
|
double V; |
||||
|
TypMinMaxValue* I; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IVtable : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IVtable( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
std::vector<IVtableEntry> m_entries; |
||||
|
|
||||
|
bool Check() override; |
||||
|
|
||||
|
/** @brief Interpolate the IV table |
||||
|
* |
||||
|
* Linear interpolation to find the current for voltage aV |
||||
|
* |
||||
|
* @param aV voltage |
||||
|
* @param aCorner Power supply corner |
||||
|
* @return current |
||||
|
*/ |
||||
|
double InterpolatedI( double aV, IBIS_CORNER aCorner ); |
||||
|
|
||||
|
/** @brief Interpolate the IV table |
||||
|
* |
||||
|
* Generate the spice directive needed to define a model defined by its IV table. |
||||
|
* The order of aPort1 and aPort2 is important. ( Inverting them will reverse the component ) |
||||
|
* |
||||
|
* @param aN Index of the 'a' device |
||||
|
* @param aPort1 Spice node |
||||
|
* @param aPort2 Spice node |
||||
|
* @param aPort2 Name of the generated model |
||||
|
* @param aCorner Power supply corner |
||||
|
* @return Multline spice directives |
||||
|
*/ |
||||
|
std::string Spice( int aN, std::string aPort1, std::string aPort2, std::string aModelName, |
||||
|
IBIS_CORNER aCorner ); |
||||
|
|
||||
|
private: |
||||
|
}; |
||||
|
|
||||
|
class VTtableEntry : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
VTtableEntry( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ) |
||||
|
{ |
||||
|
V = new TypMinMaxValue( m_reporter ); |
||||
|
}; |
||||
|
double t; |
||||
|
TypMinMaxValue* V; |
||||
|
}; |
||||
|
|
||||
|
class VTtable : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
VTtable( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
std::vector<VTtableEntry> m_entries; |
||||
|
}; |
||||
|
|
||||
|
/* |
||||
|
Model_type must be one of the following: |
||||
|
Input, Output, I/O, 3-state, Open_drain, I/O_open_drain, Open_sink, I/O_open_sink, |
||||
|
Open_source, I/O_open_source, Input_ECL, Output_ECL, I/O_ECL, 3-state_ECL, Terminator, |
||||
|
Series, and Series_switch. |
||||
|
*/ |
||||
|
|
||||
|
enum class IBIS_MODEL_TYPE |
||||
|
{ |
||||
|
UNDEFINED, |
||||
|
INPUT, |
||||
|
OUTPUT, |
||||
|
IO, |
||||
|
THREE_STATE, |
||||
|
OPEN_DRAIN, |
||||
|
IO_OPEN_DRAIN, |
||||
|
OPEN_SINK, |
||||
|
IO_OPEN_SINK, |
||||
|
OPEN_SOURCE, |
||||
|
IO_OPEN_SOURCE, |
||||
|
INPUT_ECL, |
||||
|
OUTPUT_ECL, |
||||
|
IO_ECL, |
||||
|
THREE_STATE_ECL, |
||||
|
TERMINATOR, |
||||
|
SERIES, |
||||
|
SERIES_SWITCH |
||||
|
}; |
||||
|
|
||||
|
enum class IBIS_MODEL_ENABLE |
||||
|
{ |
||||
|
UNDEFINED, |
||||
|
ACTIVE_HIGH, |
||||
|
ACTIVE_LOW |
||||
|
}; |
||||
|
|
||||
|
class dvdt |
||||
|
{ |
||||
|
public: |
||||
|
double m_dv; |
||||
|
double m_dt; |
||||
|
}; |
||||
|
|
||||
|
class dvdtTypMinMax : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
dvdtTypMinMax( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
dvdt value[3]; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
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 ); |
||||
|
}; |
||||
|
|
||||
|
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; |
||||
|
}; |
||||
|
|
||||
|
enum class IBIS_WAVEFORM_TYPE |
||||
|
{ |
||||
|
RISING, |
||||
|
FALLING |
||||
|
}; |
||||
|
|
||||
|
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; |
||||
|
double m_R_fixture = 0; |
||||
|
double m_C_fixture = 0; |
||||
|
double m_L_fixture = 0; |
||||
|
double m_V_fixture = 0; |
||||
|
double m_V_fixture_min = 0; |
||||
|
double m_V_fixture_max = 0; |
||||
|
}; |
||||
|
|
||||
|
enum class IBIS_MODEL_POLARITY |
||||
|
{ |
||||
|
UNDEFINED, |
||||
|
INVERTING, |
||||
|
NON_INVERTING |
||||
|
}; |
||||
|
|
||||
|
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 ); |
||||
|
}; |
||||
|
|
||||
|
std::string m_name; |
||||
|
IBIS_MODEL_TYPE m_type = IBIS_MODEL_TYPE::UNDEFINED; |
||||
|
/* The Polarity, Enable, Vinl, Vinh, Vmeas, Cref, Rref, and Vref subparameters are optional. */ |
||||
|
/* the default values of Vinl = 0.8 V and Vinh = 2.0 V are assumed. */ |
||||
|
double m_vinl = 0.8; |
||||
|
double m_vinh = 2; |
||||
|
double m_vref = 0; |
||||
|
double m_rref = 0; |
||||
|
double m_cref = 0; |
||||
|
double m_vmeas = 0; |
||||
|
IBIS_MODEL_ENABLE m_enable = IBIS_MODEL_ENABLE::UNDEFINED; |
||||
|
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; |
||||
|
std::vector<IbisWaveform*> m_risingWaveforms; |
||||
|
std::vector<IbisWaveform*> m_fallingWaveforms; |
||||
|
IbisRamp* m_ramp; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class IbisPackageModel : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisPackageModel( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ){}; |
||||
|
|
||||
|
std::string m_name; |
||||
|
std::string m_manufacturer; |
||||
|
std::string m_OEM; |
||||
|
std::string m_description; |
||||
|
int m_numberOfPins; |
||||
|
std::vector<std::string> m_pins; |
||||
|
|
||||
|
std::shared_ptr<IBIS_MATRIX> m_resistanceMatrix; |
||||
|
std::shared_ptr<IBIS_MATRIX> m_capacitanceMatrix; |
||||
|
std::shared_ptr<IBIS_MATRIX> m_inductanceMatrix; |
||||
|
|
||||
|
bool Check() override; |
||||
|
}; |
||||
|
|
||||
|
class IbisFile : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisFile( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ) |
||||
|
{ |
||||
|
m_header = new IbisHeader( m_reporter ); |
||||
|
}; |
||||
|
|
||||
|
IbisHeader* m_header; |
||||
|
std::vector<IbisComponent> m_components; |
||||
|
std::vector<IbisModelSelector> m_modelSelectors; |
||||
|
std::vector<IbisModel> m_models; |
||||
|
std::vector<IbisPackageModel> m_packageModels; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
enum class IBIS_PARSER_CONTINUE |
||||
|
{ |
||||
|
NONE, |
||||
|
STRING, |
||||
|
COMPONENT_PACKAGE, |
||||
|
COMPONENT_PINMAPPING, |
||||
|
COMPONENT_DIFFPIN, |
||||
|
COMPONENT_DIESUPPLYPADS, |
||||
|
COMPONENT_PIN, |
||||
|
MATRIX, |
||||
|
MODELSELECTOR, |
||||
|
MODEL, |
||||
|
IV_TABLE, |
||||
|
VT_TABLE, |
||||
|
RAMP, |
||||
|
WAVEFORM, |
||||
|
PACKAGEMODEL_PINS |
||||
|
}; |
||||
|
|
||||
|
enum class IBIS_PARSER_CONTEXT |
||||
|
{ |
||||
|
HEADER, |
||||
|
COMPONENT, |
||||
|
MODELSELECTOR, |
||||
|
MODEL, |
||||
|
PACKAGEMODEL, |
||||
|
PACKAGEMODEL_MODELDATA, |
||||
|
END |
||||
|
}; |
||||
|
|
||||
|
class IbisParser : public IBIS_INPUT |
||||
|
{ |
||||
|
public: |
||||
|
IbisParser( IBIS_REPORTER* aReporter ) : IBIS_INPUT( aReporter ), m_ibisFile( aReporter ){}; |
||||
|
|
||||
|
bool m_parrot = true; // Write back all lines. |
||||
|
|
||||
|
long m_lineCounter; |
||||
|
char m_commentChar = '|'; |
||||
|
std::vector<char> m_buffer; |
||||
|
int m_bufferIndex; |
||||
|
int m_lineOffset; |
||||
|
int m_lineIndex; |
||||
|
int m_lineLength; |
||||
|
|
||||
|
IbisFile m_ibisFile; |
||||
|
IbisComponent* m_currentComponent; |
||||
|
IbisModelSelector* m_currentModelSelector; |
||||
|
IbisModel* m_currentModel; |
||||
|
IbisPackageModel* m_currentPackageModel; |
||||
|
std::shared_ptr<IBIS_MATRIX> m_currentMatrix; |
||||
|
int m_currentMatrixRow; |
||||
|
int m_currentMatrixRowIndex; |
||||
|
IVtable* m_currentIVtable; |
||||
|
VTtable* m_currentVTtable; |
||||
|
IbisWaveform* m_currentWaveform; |
||||
|
|
||||
|
/** @brief Parse a file |
||||
|
* |
||||
|
* This is the entry point to parse a file |
||||
|
* |
||||
|
* @param aFileName input file name |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool ParseFile( std::string& aFileName ); |
||||
|
|
||||
|
private: |
||||
|
std::string* m_continuingString; |
||||
|
|
||||
|
/** @brief compare two strings without being case sensitive |
||||
|
* |
||||
|
* Ibis: "The content of the files is case sensitive, except for reserved words and keywords." |
||||
|
* |
||||
|
* @param a string to compare |
||||
|
* @param b string to compare |
||||
|
* @return true if the string are equal |
||||
|
*/ |
||||
|
bool compareIbisWord( const std::string& a, const std::string& b ); |
||||
|
|
||||
|
/** @brief Parse a single keyword in the header context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parseHeader( std::string& aKeyword ); |
||||
|
/** @brief Parse a single keyword in the component context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parseComponent( std::string& aKeyword ); |
||||
|
/** @brief Parse a single keyword in the component context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parseModelSelector( std::string& aKeyword ); |
||||
|
/** @brief Parse a single keyword in the model selector context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parseModel( std::string& aKeyword ); |
||||
|
/** @brief Parse a single keyword in the model context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parsePackageModel( std::string& aKeyword ); |
||||
|
/** @brief Parse a single keyword in the package model context |
||||
|
* |
||||
|
* @param aKeyword Keyword |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parsePackageModelModelData( std::string& ); |
||||
|
/** @brief Parse a double according to the ibis standard |
||||
|
* |
||||
|
* @param aDest Where the double should be stored |
||||
|
* @param aStr The string to parse |
||||
|
* @param aAllowModifiers Allows modifiers ( p for pico, f for femto, k for kilo, ... ) |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool parseDouble( double& aDest, std::string& aStr, bool aAllowModifiers = false ); |
||||
|
|
||||
|
/** @brief Parse the current line |
||||
|
* |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool onNewLine(); // Gets rid of comments ( except on a comment character change command...) |
||||
|
/** @brief Load the next line |
||||
|
* |
||||
|
* @return True in case of success |
||||
|
*/ |
||||
|
bool getNextLine(); |
||||
|
/** @brief Print the current line */ |
||||
|
void printLine(); |
||||
|
|
||||
|
void skipWhitespaces(); |
||||
|
bool checkEndofLine(); // To be used when there cannot be any character left on the line |
||||
|
bool isLineEmptyFromCursor(); |
||||
|
std::string getKeyword(); |
||||
|
|
||||
|
bool readInt( int& aDest ); |
||||
|
bool readDouble( double& aDest ); |
||||
|
bool readWord( std::string& aDest ); |
||||
|
bool readDvdt( std::string& aString, dvdt& aDest ); |
||||
|
bool readMatrix( std::shared_ptr<IBIS_MATRIX> aDest ); |
||||
|
bool readMatrixBanded( std::string, IBIS_MATRIX_BANDED& aDest ); |
||||
|
bool readMatrixFull( std::string, IBIS_MATRIX_FULL& aDest ); |
||||
|
bool readMatrixSparse( std::string, IBIS_MATRIX_SPARSE& aDest ); |
||||
|
bool readRampdvdt( dvdtTypMinMax& aDest ); |
||||
|
bool readRamp(); |
||||
|
bool readWaveform( IbisWaveform* aDest, IBIS_WAVEFORM_TYPE aType ); |
||||
|
bool readString( std::string& aDest ); |
||||
|
bool storeString( std::string& aDest, bool aMultiline ); |
||||
|
bool readTableLine( std::vector<std::string>& aDest ); |
||||
|
|
||||
|
bool readNumericSubparam( std::string aSubparam, double& aDest ); |
||||
|
bool readIVtableEntry( IVtable& aTable ); |
||||
|
bool readVTtableEntry( VTtable& aTable ); |
||||
|
bool readTypMinMaxValue( TypMinMaxValue& aDest ); |
||||
|
bool readTypMinMaxValueSubparam( std::string aSubparam, TypMinMaxValue& aDest ); |
||||
|
//bool ReadDieSupplyPads(); |
||||
|
|
||||
|
bool readPackage(); |
||||
|
bool readPin(); |
||||
|
bool readPinMapping(); |
||||
|
bool readDiffPin(); |
||||
|
bool readModelSelector(); |
||||
|
bool readModel(); |
||||
|
bool readPackageModelPins(); |
||||
|
|
||||
|
/** @brief Ibis can change the character used for comments */ |
||||
|
bool changeCommentChar(); |
||||
|
bool changeContext( std::string& aKeyword ); |
||||
|
|
||||
|
IBIS_PARSER_CONTINUE m_continue = IBIS_PARSER_CONTINUE::NONE; |
||||
|
IBIS_PARSER_CONTEXT m_context = IBIS_PARSER_CONTEXT::HEADER; |
||||
|
}; |
||||
|
|
||||
|
#endif |
1238
pcbnew/signalIntegrity/kibis.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,376 @@ |
|||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2022 Fabien Corona f.corona<at>laposte.net |
||||
|
* |
||||
|
* Redistribution and use in source and binary forms, with or without modification, |
||||
|
* are permitted provided that the following conditions are met: |
||||
|
* |
||||
|
* 1. Redistributions of source code must retain the above copyright notice, |
||||
|
* this list of conditions and the following disclaimer. |
||||
|
* |
||||
|
* 2. Redistributions in binary form must reproduce the above copyright notice, |
||||
|
* this list of conditions and the following disclaimer in the documentation |
||||
|
* and/or other materials provided with the distribution. |
||||
|
* |
||||
|
* 3. Neither the name of the copyright holder nor the names of its contributors may be used |
||||
|
* to endorse or promote products derived from this software without specific |
||||
|
* prior written permission. |
||||
|
* |
||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS |
||||
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY |
||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR |
||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
||||
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
||||
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
#ifndef KIBIS_H |
||||
|
#define KIBIS_H |
||||
|
|
||||
|
#include "ibisParser.h" |
||||
|
|
||||
|
class KIBIS_PIN; |
||||
|
class KIBIS_FILE; |
||||
|
class KIBIS_MODEL; |
||||
|
class KIBIS_COMPONENT; |
||||
|
class KIBIS; |
||||
|
|
||||
|
class KIBIS_ANY : public IBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_ANY( KIBIS* aTopLevel ); |
||||
|
KIBIS* m_topLevel; |
||||
|
bool m_valid; |
||||
|
}; |
||||
|
|
||||
|
enum KIBIS_WAVEFORM_TYPE |
||||
|
{ |
||||
|
NONE = 0, // Used for three state |
||||
|
RECTANGULAR, |
||||
|
STUCK_HIGH, |
||||
|
STUCK_LOW, |
||||
|
HIGH_Z |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class KIBIS_WAVEFORM |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_WAVEFORM(){}; |
||||
|
KIBIS_WAVEFORM_TYPE GetType() { return m_type; }; |
||||
|
bool inverted = false; // Used for differential drivers |
||||
|
|
||||
|
protected: |
||||
|
KIBIS_WAVEFORM_TYPE m_type = KIBIS_WAVEFORM_TYPE::NONE; |
||||
|
}; |
||||
|
|
||||
|
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_delay = 0; |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_WAVEFORM_STUCK_HIGH : public KIBIS_WAVEFORM |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_WAVEFORM_STUCK_HIGH() : KIBIS_WAVEFORM() { m_type = KIBIS_WAVEFORM_TYPE::STUCK_HIGH; }; |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_WAVEFORM_STUCK_LOW : public KIBIS_WAVEFORM |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_WAVEFORM_STUCK_LOW() : KIBIS_WAVEFORM() { m_type = KIBIS_WAVEFORM_TYPE::STUCK_LOW; }; |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_WAVEFORM_HIGH_Z : public KIBIS_WAVEFORM |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_WAVEFORM_HIGH_Z() : KIBIS_WAVEFORM() { m_type = KIBIS_WAVEFORM_TYPE::HIGH_Z; }; |
||||
|
}; |
||||
|
|
||||
|
/** Accuracy level. |
||||
|
* |
||||
|
* Level 0 is faster, but not as accurate |
||||
|
* |
||||
|
* Level 0 : |
||||
|
* - Driver: Don't use waveform |
||||
|
* - Driver: Don't use _DUT info |
||||
|
* Level 1 : |
||||
|
* _ Driver: Use up to one waveform |
||||
|
* _ Driver: Don't use _DUT info |
||||
|
* Level 2 : |
||||
|
* _ Driver: Use up to two waveforms |
||||
|
* _ Driver: Don't use _DUT info |
||||
|
* |
||||
|
* Level 3 : ( not implemented, fallback to level 2 ) |
||||
|
* _ Driver: Use up to two waveforms |
||||
|
* _ Driver: Use _DUT info if at least one waveform |
||||
|
*/ |
||||
|
enum class KIBIS_ACCURACY |
||||
|
{ |
||||
|
LEVEL_0, |
||||
|
LEVEL_1, |
||||
|
LEVEL_2, |
||||
|
LEVEL_3, |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class KIBIS_FILE : KIBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_FILE( KIBIS* aTopLevel ); |
||||
|
|
||||
|
std::string m_fileName; |
||||
|
double m_fileRev; |
||||
|
double m_ibisVersion; |
||||
|
std::string m_date; |
||||
|
std::string m_source; |
||||
|
std::string m_notes; |
||||
|
std::string m_disclaimer; |
||||
|
std::string m_copyright; |
||||
|
|
||||
|
bool Init( IbisParser& aParser ); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class KIBIS : public KIBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS( std::string aFileName ); |
||||
|
std::vector<KIBIS_COMPONENT> m_components; |
||||
|
std::vector<KIBIS_MODEL> m_models; |
||||
|
KIBIS_FILE m_file; |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_MODEL : public KIBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_MODEL( KIBIS* aTopLevel, IbisModel& aSource, IbisParser& aParser ); |
||||
|
|
||||
|
std::string m_name; |
||||
|
std::string m_description; |
||||
|
IBIS_MODEL_TYPE m_type = IBIS_MODEL_TYPE::UNDEFINED; |
||||
|
/* The Polarity, Enable, Vinl, Vinh, Vmeas, Cref, Rref, and Vref subparameters are optional. */ |
||||
|
/* the default values of Vinl = 0.8 V and Vinh = 2.0 V are assumed. */ |
||||
|
double m_vinl = 0.8; |
||||
|
double m_vinh = 2; |
||||
|
double m_vref = 0; |
||||
|
double m_rref = 0; |
||||
|
double m_cref = 0; |
||||
|
double m_vmeas = 0; |
||||
|
IBIS_MODEL_ENABLE m_enable = IBIS_MODEL_ENABLE::UNDEFINED; |
||||
|
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; |
||||
|
std::vector<IbisWaveform*> m_risingWaveforms; |
||||
|
std::vector<IbisWaveform*> m_fallingWaveforms; |
||||
|
IbisRamp* m_ramp; |
||||
|
|
||||
|
/** @brief Return true if the model has a pulldown transistor */ |
||||
|
bool HasPulldown(); |
||||
|
/** @brief Return true if the model has a pullup transistor */ |
||||
|
bool HasPullup(); |
||||
|
/** @brief Return true if the model has a clamp diode to the gnd net */ |
||||
|
bool HasGNDClamp(); |
||||
|
/** @brief Return true if the model has a clamp diode to the power net */ |
||||
|
bool HasPOWERClamp(); |
||||
|
|
||||
|
/** @brief Generate the spice directive to simulate the die |
||||
|
* |
||||
|
* @param aSupply Power supply corner |
||||
|
* @param aParasitics Parasitics corner |
||||
|
* @param aIndex Index used to offset spice nodes / directives |
||||
|
* @return A multiline string with spice directives |
||||
|
*/ |
||||
|
std::string SpiceDie( IBIS_CORNER aSupply, IBIS_CORNER aParasitics, int aIndex ); |
||||
|
|
||||
|
/** @brief Create waveform pairs |
||||
|
* |
||||
|
* For maximum accuracy, we need a waveform pair. |
||||
|
* This function creates the pairs based on the fixture. |
||||
|
* The first element is the rising edge, the second is the falling edge. |
||||
|
* |
||||
|
* @return a vector of waveform pairs |
||||
|
*/ |
||||
|
std::vector<std::pair<IbisWaveform*, IbisWaveform*>> waveformPairs(); |
||||
|
|
||||
|
|
||||
|
/** @brief Generate a square waveform |
||||
|
* |
||||
|
* For maximum accuracy, we need a waveform pair. |
||||
|
* This function creates the pairs based on the fixture. |
||||
|
* |
||||
|
* @param aNode1 node where the voltage is applied |
||||
|
* @param aNode2 Reference node |
||||
|
* @param aBits The first member is the bit value ( 1 or 0 ). |
||||
|
* The second member is the time of the transition edge. |
||||
|
* @param aPair @see waveformPairs() |
||||
|
* @param aSupply Power supply corner |
||||
|
* @return A multiline string with spice directives |
||||
|
*/ |
||||
|
std::string generateSquareWave( std::string aNode1, std::string aNode2, |
||||
|
std::vector<std::pair<int, double>> aBits, |
||||
|
std::pair<IbisWaveform*, IbisWaveform*> aPair, |
||||
|
IBIS_CORNER aSupply ); |
||||
|
|
||||
|
|
||||
|
/** @brief Copy a waveform, and substract the first value to all samples |
||||
|
* |
||||
|
* |
||||
|
* @param aIn Input waveform |
||||
|
* @return Output waveform |
||||
|
*/ |
||||
|
IbisWaveform TrimWaveform( IbisWaveform& aIn ); |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_PIN : public KIBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_PIN( KIBIS* aTopLevel, IbisComponentPin& aPin, IbisComponentPackage& aPackage, |
||||
|
IbisParser& aParser, KIBIS_COMPONENT* aParent, std::vector<KIBIS_MODEL>& aModels ); |
||||
|
/** @brief Name of the pin |
||||
|
* Examples : "VCC", "GPIOA", "CLK", etc... |
||||
|
*/ |
||||
|
std::string m_signalName; |
||||
|
/** @brief Pin Number |
||||
|
* Examples : 1, 2, 3 ( or for BGA ), A1, A2, A3, etc... |
||||
|
*/ |
||||
|
std::string m_pinNumber; |
||||
|
|
||||
|
/** @brief Resistance from die to pin */ |
||||
|
TypMinMaxValue* R_pin; |
||||
|
/** @brief Inductance from die to pin */ |
||||
|
TypMinMaxValue* L_pin; |
||||
|
/** @brief Capacitance from pin to GND */ |
||||
|
TypMinMaxValue* C_pin; |
||||
|
|
||||
|
KIBIS_COMPONENT* m_parent; |
||||
|
|
||||
|
std::vector<double> m_t, m_Ku, m_Kd; |
||||
|
|
||||
|
std::vector<KIBIS_MODEL*> m_models; |
||||
|
|
||||
|
bool writeSpiceDriver( std::string* aDest, std::string aName, KIBIS_MODEL& aModel, |
||||
|
IBIS_CORNER aSupply, IBIS_CORNER aParasitics, KIBIS_ACCURACY aAccuracy, |
||||
|
KIBIS_WAVEFORM* aWave ); |
||||
|
bool writeSpiceDiffDriver( std::string* aDest, std::string aName, KIBIS_MODEL& aModel, |
||||
|
IBIS_CORNER aSupply, IBIS_CORNER aParasitics, |
||||
|
KIBIS_ACCURACY aAccuracy, KIBIS_WAVEFORM* aWave ); |
||||
|
bool writeSpiceDevice( std::string* aDest, std::string aName, KIBIS_MODEL& aModel, |
||||
|
IBIS_CORNER aSupply, IBIS_CORNER aParasitics ); |
||||
|
|
||||
|
/** @brief Update m_Ku, m_Kd using no falling / rising waveform inputs ( low accuracy ) |
||||
|
* @param aModel Model to be used |
||||
|
* @param aWave Waveform to generate |
||||
|
* @param aSupply Power supply corner |
||||
|
*/ |
||||
|
void getKuKdNoWaveform( KIBIS_MODEL& aModel, KIBIS_WAVEFORM* aWave, IBIS_CORNER aSupply ); |
||||
|
|
||||
|
/** @brief Update m_Ku, m_Kd using with a single waveform input |
||||
|
* @param aModel Model to be used |
||||
|
* @param aPair @see waveformPairs() |
||||
|
* @param aWave Waveform to generate |
||||
|
* @param aSupply Power supply corner |
||||
|
* @param aParasitics Parasitics corner |
||||
|
*/ |
||||
|
void getKuKdOneWaveform( KIBIS_MODEL& aModel, std::pair<IbisWaveform*, IbisWaveform*> aPair, |
||||
|
KIBIS_WAVEFORM* aWave, IBIS_CORNER aSupply, IBIS_CORNER aParasitics ); |
||||
|
|
||||
|
/** @brief Update m_Ku, m_Kd using with two waveform inputs |
||||
|
* |
||||
|
* The order of aPair1 and aPair2 is not important. |
||||
|
* @param aModel Model to be used |
||||
|
* @param aPair1 @see waveformPairs() |
||||
|
* @param aPair2 @see waveformPairs() |
||||
|
* @param aWave Waveform to generate |
||||
|
* @param aSupply Power supply corner |
||||
|
* @param aParasitics Parasitics corner |
||||
|
*/ |
||||
|
void getKuKdTwoWaveforms( KIBIS_MODEL& aModel, std::pair<IbisWaveform*, IbisWaveform*> aPair1, |
||||
|
std::pair<IbisWaveform*, IbisWaveform*> aPair2, KIBIS_WAVEFORM* aWave, |
||||
|
IBIS_CORNER aSupply, IBIS_CORNER aParasitics ); |
||||
|
|
||||
|
/** @brief Update m_Ku, m_Kd using with two waveform inputs |
||||
|
* |
||||
|
* The order of aPair1 and aPair2 is not important. |
||||
|
* @param aModel Model to be used |
||||
|
* @param aPair @see waveformPairs() |
||||
|
* @param aWave Waveform to generate |
||||
|
* @param aSupply Power supply corner |
||||
|
* @param aParasitics Parasitics corner |
||||
|
* @param aIndex Index for numbering spice .SUBCKT |
||||
|
* |
||||
|
* @return A multiline string with spice directives |
||||
|
*/ |
||||
|
std::string KuKdDriver( KIBIS_MODEL& aModel, std::pair<IbisWaveform*, IbisWaveform*> aPair, |
||||
|
KIBIS_WAVEFORM* aWave, IBIS_CORNER aSupply, IBIS_CORNER aParasitics, |
||||
|
int aIndex ); |
||||
|
|
||||
|
/** @brief Generate the spice directive to simulate the die for Ku/Kd estimation |
||||
|
* |
||||
|
* DO NOT use it in order to generate a model. |
||||
|
* It sole purpose is to run the internal simulation to get Ku/Kd |
||||
|
* |
||||
|
* @param aModel Model to be used |
||||
|
* @param aSupply Power supply corner |
||||
|
* @param aIndex Index for numbering ports |
||||
|
* @return A multiline string with spice directives |
||||
|
*/ |
||||
|
std::string addDie( KIBIS_MODEL& aModel, IBIS_CORNER aSupply, int aIndex ); |
||||
|
|
||||
|
|
||||
|
/** @brief Update m_Ku, m_Kd using with two waveform inputs |
||||
|
* |
||||
|
* Runs a simulation. The simulation creates a specific file with Ku/Kd values |
||||
|
* This function then reads the output file and updates m_Ku / m_Kd. |
||||
|
* This function probably needs a rewrite. |
||||
|
* |
||||
|
* @param aSimul The simulation to run, multiline spice directives |
||||
|
*/ |
||||
|
void getKuKdFromFile( std::string* aSimul ); |
||||
|
}; |
||||
|
|
||||
|
class KIBIS_COMPONENT : public KIBIS_ANY |
||||
|
{ |
||||
|
public: |
||||
|
KIBIS_COMPONENT( KIBIS* aToplevel, IbisComponent& aSource, IbisParser& aParser ); |
||||
|
/** @brief Name of the component */ |
||||
|
std::string m_name; |
||||
|
/** @brief Name of the manufacturer */ |
||||
|
std::string m_manufacturer; |
||||
|
|
||||
|
std::vector<KIBIS_PIN> m_pins; |
||||
|
|
||||
|
/** @brief Get a pin by its number ( 1, 2, A1, A2, ... ) |
||||
|
* |
||||
|
* @param aPinNumber pin number |
||||
|
* @return pointer to a KIBIS_PIN, or nullptr if there is no matching pin |
||||
|
*/ |
||||
|
KIBIS_PIN* getPin( std::string aPinNumber ); |
||||
|
}; |
||||
|
|
||||
|
#endif |
@ -0,0 +1,84 @@ |
|||||
|
# |
||||
|
# This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
# |
||||
|
# Copyright (C) 2017 CERN |
||||
|
# @author Alejandro García Montoro <alejandro.garciamontoro@gmail.com> |
||||
|
# |
||||
|
# This program is free software; you can redistribute it and/or |
||||
|
# modify it under the terms of the GNU General Public License |
||||
|
# as published by the Free Software Foundation; either version 2 |
||||
|
# of the License, or (at your option) any later version. |
||||
|
# |
||||
|
# This program is distributed in the hope that it will be useful, |
||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
# GNU General Public License for more details. |
||||
|
# |
||||
|
# You should have received a copy of the GNU General Public License |
||||
|
# along with this program; if not, you may find one here: |
||||
|
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
# or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
# or you may write to the Free Software Foundation, Inc., |
||||
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
|
||||
|
find_package(Boost COMPONENTS unit_test_framework REQUIRED) |
||||
|
find_package( wxWidgets 3.0.0 COMPONENTS gl aui adv html core net base xml stc REQUIRED ) |
||||
|
|
||||
|
|
||||
|
add_definitions(-DBOOST_TEST_DYN_LINK -DPCBNEW -DDRC_PROTO -DTEST_APP_NO_MAIN) |
||||
|
|
||||
|
add_executable( ibis_proto |
||||
|
qaIbisParser.cpp |
||||
|
../../pcbnew/signalIntegrity/ibisParser.cpp |
||||
|
../../pcbnew/signalIntegrity/kibis.cpp |
||||
|
) |
||||
|
|
||||
|
add_dependencies( ibis_proto pnsrouter pcbcommon ${PCBNEW_IO_LIBRARIES} ) |
||||
|
|
||||
|
include_directories( BEFORE ${INC_BEFORE} ) |
||||
|
include_directories( |
||||
|
${CMAKE_SOURCE_DIR} |
||||
|
${CMAKE_SOURCE_DIR}/include |
||||
|
${CMAKE_SOURCE_DIR}/3d-viewer |
||||
|
${CMAKE_SOURCE_DIR}/common |
||||
|
${CMAKE_SOURCE_DIR}/pcbnew |
||||
|
${CMAKE_SOURCE_DIR}/pcbnew/router |
||||
|
${CMAKE_SOURCE_DIR}/pcbnew/tools |
||||
|
${CMAKE_SOURCE_DIR}/pcbnew/dialogs |
||||
|
${CMAKE_SOURCE_DIR}/polygon |
||||
|
${CMAKE_SOURCE_DIR}/common/geometry |
||||
|
${CMAKE_SOURCE_DIR}/libs/kimath/include/math |
||||
|
${CMAKE_SOURCE_DIR}/qa/common |
||||
|
${CMAKE_SOURCE_DIR}/qa |
||||
|
${CMAKE_SOURCE_DIR}/qa/qa_utils |
||||
|
${CMAKE_SOURCE_DIR}/qa/qa_utils/include |
||||
|
${CMAKE_SOURCE_DIR}/qa/pcbnew_utils/include |
||||
|
${Boost_INCLUDE_DIR} |
||||
|
${INC_AFTER} |
||||
|
) |
||||
|
|
||||
|
target_link_libraries( ibis_proto |
||||
|
qa_pcbnew_utils |
||||
|
3d-viewer |
||||
|
connectivity |
||||
|
pcbcommon |
||||
|
pnsrouter |
||||
|
gal |
||||
|
common |
||||
|
gal |
||||
|
qa_utils |
||||
|
dxflib_qcad |
||||
|
tinyspline_lib |
||||
|
nanosvg |
||||
|
idf3 |
||||
|
${PCBNEW_IO_LIBRARIES} |
||||
|
${wxWidgets_LIBRARIES} |
||||
|
${GDI_PLUS_LIBRARIES} |
||||
|
${PYTHON_LIBRARIES} |
||||
|
${Boost_LIBRARIES} |
||||
|
${PCBNEW_EXTRA_LIBS} # -lrt must follow Boost |
||||
|
) |
||||
|
|
||||
|
configure_file( "ibis_v1_1.ibs" "ibis_v1_1.ibs" COPYONLY ) |
||||
|
configure_file( "ibis_v2_1.ibs" "ibis_v2_1.ibs" COPYONLY ) |
||||
|
configure_file( "ibis_v2_1.pkg" "ibis_v2_1.pkg" COPYONLY ) |
@ -0,0 +1,89 @@ |
|||||
|
[IBIS Ver] 1.1 |Let's test a comment |
||||
|
[Comment char] #_char |
||||
|
[File name] ibis_v1_1.ibs |
||||
|
[File Rev] 1.0 #Let's test a comment |
||||
|
[Date] 26/08/2021 |
||||
|
[Source] This is the |
||||
|
source for the files |
||||
|
[Notes] We can have some |
||||
|
Notes |
||||
|
[Disclaimer] |
||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 2 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
|
||||
|
[Component] Virtual |
||||
|
[Manufacturer] KiCad |
||||
|
[Package] |
||||
|
R_pkg 1m 0.8m NA |
||||
|
L_pkg 1m NA NA |
||||
|
C_pkg 1m NA NA |
||||
|
|
||||
|
[Pin] signal_name model_name R_pin L_pin C_pin |
||||
|
1 VCC POWER 1m 0.8m NA |
||||
|
2 GND GND 1m NA 2m |
||||
|
3 X Input 1m NA NA |
||||
|
4 Y Ouput 1m 0.8m 2m |
||||
|
|
||||
|
[Model] Input |
||||
|
Model_type Input |
||||
|
Polarity Non-Inverting |
||||
|
Enable Active-High |
||||
|
Vinl = 0.8V |
||||
|
Vinh = 2.0V |
||||
|
C_comp 10.0pF 8.0pF 15.0pF |
||||
|
|
||||
|
[Voltage range] 5.0V 4.5V 5.5V |
||||
|
[Pulldown] |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m -40.0m -60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V 50.0m 40.0m 60.0m |
||||
|
[Pullup] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m 40.0m 60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V -50.0m -40.0m -60.0m |
||||
|
[GND_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
[POWER_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
|
||||
|
[Ramp] |
||||
|
# variable typ min max |
||||
|
dV/dt_r 3.0/2n 2.8/3n NA |
||||
|
dV/dt_f 3.0/2n 2.8/3n 3.2/1n |
||||
|
|
||||
|
[END] |
@ -0,0 +1,147 @@ |
|||||
|
[IBIS Ver] 2.1 |Let's test a comment |
||||
|
[Comment char] #_char |
||||
|
[File name] ibis_v2_1.pkg |
||||
|
[File Rev] 1.0 #Let's test a comment |
||||
|
[Date] 26/08/2021 |
||||
|
[Source] This is the |
||||
|
source for the files |
||||
|
[Notes] We can have some |
||||
|
Notes |
||||
|
[Copyright] |
||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 2 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
[Disclaimer] This is NOT a valid component. |
||||
|
[Component] Virtual |
||||
|
[Manufacturer] KiCad |
||||
|
[Package] |
||||
|
R_pkg 1m 0.8m 2m |
||||
|
L_pkg 1m 0.8m 2m |
||||
|
C_pkg 1m 0.8m 2m |
||||
|
|
||||
|
[Pin] signal_name model_name R_pin L_pin C_pin |
||||
|
1 VCC POWER 1m 0.8m 2m |
||||
|
2 GND GND 1m 0.8m 2m |
||||
|
3 X Input 1m 0.8m 2m |
||||
|
4 Y Ouput 1m 0.8m 2m |
||||
|
5 YN Ouput 1m 0.8m 2m |
||||
|
6 Y Ouput 1m 0.8m 2m |
||||
|
7 YN Ouput 1m 0.8m 2m |
||||
|
|
||||
|
[Package Model] QS-SMT-cer-8-pin-pkgs |
||||
|
[Pin Mapping] pulldown_ref pullup_ref gnd_clamp_ref power_clamp_ref |
||||
|
1 GNDBUS NC |
||||
|
2 NC PWRBUS |
||||
|
3 GNDBUS PWRBUS |
||||
|
4 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
5 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
6 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
7 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
|
||||
|
[Diff Pin] inv_pin vdiff tdelay_typ tdelay_min tdelay_max |
||||
|
# |
||||
|
4 5 150mV -1ns 0ns -2ns |
||||
|
6 7 150mV -1ns 0ns -2ns |
||||
|
|
||||
|
|
||||
|
[Model] Input |
||||
|
Model_type Input |
||||
|
Polarity Non-Inverting |
||||
|
Enable Active-High |
||||
|
Vinl = 0.8V |
||||
|
Vinh = 2.0V |
||||
|
Vmeas= 1.5V |
||||
|
Cref =50pF |
||||
|
Rref=500 |
||||
|
Vref = 0 |
||||
|
|
||||
|
C_comp 10.0pF 8.0pF 15.0pF |
||||
|
|
||||
|
[Voltage range] 5.0V 4.5V 5.5V |
||||
|
[Temperature Range] 27.0 -50 130.0 |
||||
|
[Pullup Reference] 5.0V 4.5V 5.5V |
||||
|
[Pulldown Reference] 0V 0V 0V |
||||
|
[POWER Clamp Reference] 5.0V 4.5V 5.5V |
||||
|
[GND Clamp Reference] 0V 0V 0V |
||||
|
|
||||
|
[Pulldown] |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m -40.0m -60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V 50.0m 40.0m 60.0m |
||||
|
[Pullup] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m 40.0m 60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V -50.0m -40.0m -60.0m |
||||
|
[GND_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
[POWER_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
|
||||
|
[Rgnd] 1500hm 100Ohm 3600 |
||||
|
[Rpower] 150Ohm 100Ohm NA |
||||
|
[Rac] 30Ohm NA NA |
||||
|
[Cac] 50pF NA NA |
||||
|
|
||||
|
|
||||
|
[Ramp] |
||||
|
# variable typ min max |
||||
|
dV/dt_r 3.0/2n 2.8/3n 3.2/1n |
||||
|
dV/dt_f 3.0/2n 2.8/3n 3.2/1n |
||||
|
|
||||
|
[Rising Waveform] |
||||
|
R_fixture = 500 |
||||
|
V_fixture = 5.0 |
||||
|
C_fixture = 10p |
||||
|
L_fixture = 2n |
||||
|
C_dut = 7p |
||||
|
R_dut = 1m |
||||
|
L_dut = 1n |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 0 0 0 |
||||
|
1.0ns 1 0.5 1.5 |
||||
|
2.0ns 2 1 3 |
||||
|
# |
||||
|
[Falling Waveform] |
||||
|
R_fixture = 50 |
||||
|
V_fixture = 0 |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 2 1 NA |
||||
|
1.0ns 1 0.5 NA |
||||
|
2.0ns 0 0 NA |
||||
|
|
||||
|
|
||||
|
[END] |
@ -0,0 +1,110 @@ |
|||||
|
[IBIS Ver] 2.1 |Let's test a comment |
||||
|
[Comment char] |_char |
||||
|
[File name] ibis_v2_1.pkg |
||||
|
[File Rev] 1.0 #Let's test a comment |
||||
|
[Date] 26/08/2021 |
||||
|
[Source] This is the |
||||
|
source for the files |
||||
|
[Notes] We can have some |
||||
|
Notes |
||||
|
[Copyright] |
||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 2 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
[Define Package Model] QFN4 |
||||
|
[Manufacturer] Kicad |
||||
|
[OEM] Kicad Packaging Co. |
||||
|
[Description] A 4 pin QFN, really ? |
||||
|
[Number of Pins] 4 |
||||
|
[Pin Numbers] |
||||
|
A1 |
||||
|
A2 |
||||
|
A3 |
||||
|
A4 |
||||
|
|
||||
|
[Model Data] |
||||
|
| |
||||
|
| The resistance matrix for this package has no coupling |
||||
|
| |
||||
|
[Resistance Matrix] Banded_matrix |
||||
|
[Bandwidth] 3 |
||||
|
[Row] 1 |
||||
|
1 2 1 |
||||
|
[Row] 2 |
||||
|
2 3 2 |
||||
|
[Row] 3 |
||||
|
4 5 4 |
||||
|
[Row] 4 |
||||
|
5 6 5 |
||||
|
| |
||||
|
| The inductance matrix has loads of coupling |
||||
|
| |
||||
|
[Inductance Matrix] Full_matrix |
||||
|
[Row] 1 |
||||
|
3.04859e-07 4.73185e-08 1.3428e-08 |
||||
|
1.74022e-07 |
||||
|
[Row] 2 |
||||
|
3.04859e-07 4.73185e-08 1.3428e-08 |
||||
|
[Row] 3 |
||||
|
3.04859e-07 4.73185e-08 |
||||
|
[Row] 4 |
||||
|
3.04859e-07 |
||||
|
| |
||||
|
| The capacitance matrix has sparse coupling |
||||
|
| |
||||
|
[Capacitance Matrix] Sparse_matrix |
||||
|
[Row] 1 |
||||
|
1 2.48227e-10 |
||||
|
2 -1.56651e-11 |
||||
|
5 -9.54158e-11 |
||||
|
6 -7.15684e-12 |
||||
|
[Row] 2 |
||||
|
2 2.51798e-10 |
||||
|
3 -1.56552e-11 |
||||
|
5 -6.85199e-12 |
||||
|
6 -9.0486e-11 |
||||
|
7 -6.82003e-12 |
||||
|
[Row] 3 |
||||
|
3 2.51798e-10 |
||||
|
4 -1.56651e-11 |
||||
|
6 -6.82003e-12 |
||||
|
7 -9.0486e-11 |
||||
|
8 -6.85199e-12 |
||||
|
[Row] 4 |
||||
|
4 2.48227e-10 |
||||
|
7 -7.15684e-12 |
||||
|
8 -9.54158e-11 |
||||
|
[Row] 5 |
||||
|
5 1.73542e-10 |
||||
|
6 -3.38247e-11 |
||||
|
[Row] 6 |
||||
|
6 1.86833e-10 |
||||
|
7 -3.27226e-11 |
||||
|
[Row] 7 |
||||
|
7 1.86833e-10 |
||||
|
8 -3.38247e-11 |
||||
|
[Row] 8 |
||||
|
8 1.73542e-10 |
||||
|
| |
||||
|
[End Model Data] |
||||
|
[End Package Model] |
||||
|
[END] |
@ -0,0 +1,419 @@ |
|||||
|
[IBIS Ver] 3.2 |Let's test a comment |
||||
|
[Comment char] #_char |
||||
|
[File name] ibis_v2_1.pkg |
||||
|
[File Rev] 1.0 #Let's test a comment |
||||
|
[Date] 26/08/2021 |
||||
|
[Source] This is the |
||||
|
source for the files |
||||
|
[Notes] We can have some |
||||
|
Notes |
||||
|
[Copyright] |
||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 2 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
[Disclaimer] This is NOT a valid component. |
||||
|
[Component] Virtual |
||||
|
[Manufacturer] KiCad |
||||
|
[Package] |
||||
|
R_pkg 1m 0.8m 2m |
||||
|
L_pkg 1m 0.8m 2m |
||||
|
C_pkg 1m 0.8m 2m |
||||
|
|
||||
|
[Pin] signal_name model_name R_pin L_pin C_pin |
||||
|
1 VCC POWER 1m 0.8m 2m |
||||
|
2 GND GND 1m 0.8m 2m |
||||
|
3 X Input 1m 0.8m 2m |
||||
|
4 Y Ouput 1m 0.8m 2m |
||||
|
5 YN Ouput 1m 0.8m 2m |
||||
|
6 Y Ouput 1m 0.8m 2m |
||||
|
7 YN Ouput 1m 0.8m 2m |
||||
|
|
||||
|
[Package Model] QS-SMT-cer-8-pin-pkgs |
||||
|
[Pin Mapping] pulldown_ref pullup_ref gnd_clamp_ref power_clamp_ref |
||||
|
1 GNDBUS NC |
||||
|
2 NC PWRBUS |
||||
|
3 GNDBUS PWRBUS |
||||
|
4 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
5 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
6 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
7 GNDBUS PWRBUS GNDBUS PWRBUS |
||||
|
|
||||
|
[Diff Pin] inv_pin vdiff tdelay_typ tdelay_min tdelay_max |
||||
|
# |
||||
|
4 5 150mV -1ns 0ns -2ns |
||||
|
6 7 150mV -1ns 0ns -2ns |
||||
|
|
||||
|
[Series Pin Mapping] pin_2 model_name function_table_group |
||||
|
| |
||||
|
4 5 PinSeries 1 |
||||
|
6 7 PinSeries 2 |
||||
|
|
||||
|
[Series Switch Groups] |
||||
|
On 4 5 / |
||||
|
Off 4 5 / |
||||
|
On 4 5 6 7 / |
||||
|
Off 4 5 6 7 / |
||||
|
|
||||
|
|
||||
|
[Model] Input |
||||
|
Model_type Input |
||||
|
Polarity Non-Inverting |
||||
|
Enable Active-High |
||||
|
Vinl = 0.8V |
||||
|
Vinh = 2.0V |
||||
|
Vmeas= 1.5V |
||||
|
Cref =50pF |
||||
|
Rref=500 |
||||
|
Vref = 0 |
||||
|
|
||||
|
C_comp 10.0pF 8.0pF 15.0pF |
||||
|
|
||||
|
[Model Spec] |
||||
|
| Subparameter typ min max |
||||
|
Vinh 3.5 3.15 3.85 |
||||
|
Vinl 1.5 1.35 1.65 |
||||
|
Vinh+ 2.0 NA NA | Overrides the |
||||
|
Vinh- 1.6 NA NA | thresholds |
||||
|
Vinl+ 1.1 NA NA |
||||
|
Vinl- 0.6 NA NA | All 4 are required |
||||
|
S_overshoot_high 5.5 5.0 6.0 | Static overshoot |
||||
|
S_overshoot_low -0.5 NA NA |
||||
|
D_overshoot_high 6.0 5.5 6.5 | Dynamic overshoot |
||||
|
D_overshoot_low -1.0 -1.0 -1.0 |
||||
|
D_overshoot_time 20n 20n 20n | & static overshoot |
||||
|
Pulse_high 3V NA NA | Pulse immunity |
||||
|
Pulse_low 0 NA NA | requires |
||||
|
Pulse_time 3n NA NA | Pulse_time |
||||
|
Vmeas 3.68 3.18 4.68 | A 5 volt PECL |
||||
|
|
||||
|
[Add Submodel] |
||||
|
| Submodel_name Mode |
||||
|
Bus_Hold_1 Non-Driving |
||||
|
Dynamic_clamp_1 All |
||||
|
|
||||
|
[Driver Schedule] |
||||
|
| Model_name Rise_on_dly Rise_off_dly Fall_on_dly Fall_off_dly |
||||
|
MODEL_OUT 0.0ns NA 0.0ns NA |
||||
|
M_O_SOURCE1 0.5ns NA 0.5ns NA |
||||
|
| low (high-Z) to high high to low (high-Z) |
||||
|
M_O_SOURCE2 0.5n 1.5n NA NA |
||||
|
| low to high to low low (high-Z) |
||||
|
M_O_DRAIN1 1.0n NA 1.5n NA |
||||
|
| low to high (high-Z) high (high-Z) to low |
||||
|
M_O_DRAIN2 NA NA 1.5n 2.0n |
||||
|
| high (high-Z) high to low to high |
||||
|
|
||||
|
[Voltage range] 5.0V 4.5V 5.5V |
||||
|
[Temperature Range] 27.0 -50 130.0 |
||||
|
[Pullup Reference] 5.0V 4.5V 5.5V |
||||
|
[Pulldown Reference] 0V 0V 0V |
||||
|
[POWER Clamp Reference] 5.0V 4.5V 5.5V |
||||
|
[GND Clamp Reference] 0V 0V 0V |
||||
|
|
||||
|
|
||||
|
[TTgnd] 10n 12n 9n |
||||
|
[TTpower] 12n NA NA |
||||
|
|
||||
|
[Pulldown] |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m -40.0m -60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V 50.0m 40.0m 60.0m |
||||
|
[Pullup] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m 40.0m 60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V -50.0m -40.0m -60.0m |
||||
|
[GND_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
[POWER_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
|
||||
|
[Rgnd] 1500hm 100Ohm 3600 |
||||
|
[Rpower] 150Ohm 100Ohm NA |
||||
|
[Rac] 30Ohm NA NA |
||||
|
[Cac] 50pF NA NA |
||||
|
|
||||
|
[On] |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[R Series] 8ohm 6ohm 12ohm |
||||
|
| |
||||
|
| variable L(typ) L(min) L(max) |
||||
|
[L Series] 5nH NA NA |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[Rl Series] 4ohm NA NA |
||||
|
| |
||||
|
| variable C(typ) C(min) C(max) | The other elements |
||||
|
[C Series] 50pF NA NA | are 0 impedance |
||||
|
[Off] |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[R Series] 8ohm 6ohm 12ohm |
||||
|
| |
||||
|
| variable L(typ) L(min) L(max) |
||||
|
[L Series] 5nH NA NA |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[Rl Series] 4ohm NA NA |
||||
|
| |
||||
|
| variable C(typ) C(min) C(max) | The other elements |
||||
|
[C Series] 50pF NA NA | are 0 impedance |
||||
|
|
||||
|
[Series Current] |
||||
|
| Voltage I(typ) I(min) I(max) |
||||
|
-5.0V -3900.0m -3800.0m -4000.0m |
||||
|
-0.7V -80.0m -75.0m -85.0m |
||||
|
-0.6V -22.0m -20.0m -25.0m |
||||
|
-0.5V -2.4m -2.0m -2.9m |
||||
|
-0.4V 0.0m 0.0m 0.0m |
||||
|
5.0V 0.0m 0.0m 0.0m |
||||
|
|
||||
|
[Series MOSFET] |
||||
|
Vds = 1.0 |
||||
|
| Voltage I(typ) I(min) I(max) |
||||
|
5.0V 257.9m 153.3m 399.5m | Defines the Ids current as a |
||||
|
4.0V 203.0m 119.4m 317.3m | function of Vtable, for Vds = 1.0 |
||||
|
3.0V 129.8m 74.7m 205.6m |
||||
|
2.0V 31.2m 16.6m 51.0m |
||||
|
1.0V 52.7p 46.7p 56.7p |
||||
|
0.0V 0.0p 0.0p 0.0p |
||||
|
|
||||
|
|
||||
|
[Off] |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[R Series] 8ohm 6ohm 12ohm |
||||
|
| |
||||
|
| variable L(typ) L(min) L(max) |
||||
|
[L Series] 5nH NA NA |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[Rl Series] 4ohm NA NA |
||||
|
| |
||||
|
| variable C(typ) C(min) C(max) | The other elements |
||||
|
[C Series] 50pF NA NA | are 0 impedance |
||||
|
[Off] |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[R Series] 8ohm 6ohm 12ohm |
||||
|
| |
||||
|
| variable L(typ) L(min) L(max) |
||||
|
[L Series] 5nH NA NA |
||||
|
| variable R(typ) R(min) R(max) |
||||
|
[Rl Series] 4ohm NA NA |
||||
|
| |
||||
|
| variable C(typ) C(min) C(max) | The other elements |
||||
|
[C Series] 50pF NA NA | are 0 impedance |
||||
|
|
||||
|
[Series Current] |
||||
|
| Voltage I(typ) I(min) I(max) |
||||
|
-5.0V -3900.0m -3800.0m -4000.0m |
||||
|
-0.7V -80.0m -75.0m -85.0m |
||||
|
-0.6V -22.0m -20.0m -25.0m |
||||
|
-0.5V -2.4m -2.0m -2.9m |
||||
|
-0.4V 0.0m 0.0m 0.0m |
||||
|
5.0V 0.0m 0.0m 0.0m |
||||
|
|
||||
|
[Ramp] |
||||
|
# variable typ min max |
||||
|
dV/dt_r 3.0/2n 2.8/3n 3.2/1n |
||||
|
dV/dt_f 3.0/2n 2.8/3n 3.2/1n |
||||
|
|
||||
|
[Rising Waveform] |
||||
|
R_fixture = 500 |
||||
|
V_fixture = 5.0 |
||||
|
C_fixture = 10p |
||||
|
L_fixture = 2n |
||||
|
C_dut = 7p |
||||
|
R_dut = 1m |
||||
|
L_dut = 1n |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 0 0 0 |
||||
|
1.0ns 1 0.5 1.5 |
||||
|
2.0ns 2 1 3 |
||||
|
# |
||||
|
[Falling Waveform] |
||||
|
R_fixture = 50 |
||||
|
V_fixture = 0 |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 2 1 NA |
||||
|
1.0ns 1 0.5 NA |
||||
|
2.0ns 0 0 NA |
||||
|
|
||||
|
[Submodel] DMySubmodel |
||||
|
|
||||
|
Submodel_type Dynamic_clamp |
||||
|
|
||||
|
[Pulldown] |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m -40.0m -60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V 50.0m 40.0m 60.0m |
||||
|
[Pullup] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m 40.0m 60.0m |
||||
|
0.0V 0 0 0 |
||||
|
5.0V -50.0m -40.0m -60.0m |
||||
|
[GND_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V -50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
[POWER_clamp] |
||||
|
# |
||||
|
# Voltage I(typ) I(min) I(max) |
||||
|
# |
||||
|
-5.0V 50.0m NA NA |
||||
|
0.0V 0 NA NA |
||||
|
5.0V 0 NA NA |
||||
|
|
||||
|
[Ramp] |
||||
|
# variable typ min max |
||||
|
dV/dt_r 3.0/2n 2.8/3n 3.2/1n |
||||
|
dV/dt_f 3.0/2n 2.8/3n 3.2/1n |
||||
|
|
||||
|
[Rising Waveform] |
||||
|
R_fixture = 500 |
||||
|
V_fixture = 5.0 |
||||
|
C_fixture = 10p |
||||
|
L_fixture = 2n |
||||
|
C_dut = 7p |
||||
|
R_dut = 1m |
||||
|
L_dut = 1n |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 0 0 0 |
||||
|
1.0ns 1 0.5 1.5 |
||||
|
2.0ns 2 1 3 |
||||
|
# |
||||
|
[Falling Waveform] |
||||
|
R_fixture = 50 |
||||
|
V_fixture = 0 |
||||
|
#Time V(typ) V(min) V(max) |
||||
|
0.0ns 2 1 NA |
||||
|
1.0ns 1 0.5 NA |
||||
|
2.0ns 0 0 NA |
||||
|
|
||||
|
|
||||
|
[Submodel Spec] |
||||
|
| Subparameter typ min max |
||||
|
V_trigger_r 3.1 2.4 3.7 | Low to high transition |
||||
|
| triggers the turn on |
||||
|
| process of the pullup |
||||
|
V_trigger_f -10.0 -10.0 -10.0 | Not used, so trigger |
||||
|
| voltages are set out |
||||
|
| of range |
||||
|
Off_delay 5n 6n 4n | Time from rising edge |
||||
|
| trigger at which the |
||||
|
| pullup turned off |
||||
|
|
||||
|
[GND Pulse Table] | GND Clamp offset table |
||||
|
| Time V(typ) V(min) V(max) |
||||
|
| |
||||
|
0 0 0 0 |
||||
|
1e-9 0 0 0 |
||||
|
2e-9 0.9 0.8 1.0 |
||||
|
10e-9 0.9 0.8 1.0 |
||||
|
11e-9 0 0 0 |
||||
|
|
||||
|
[GND Clamp] | Table to be offset |
||||
|
| |
||||
|
| Voltage I(typ) I(min) I(max) |
||||
|
| |
||||
|
-5.000 -3.300e+01 -3.000e+01 -3.500e+01 |
||||
|
-4.000 -2.300e+01 -2.200e+01 -2.400e+01 |
||||
|
-3.000 -1.300e+01 -1.200e+01 -1.400e+01 |
||||
|
-2.000 -3.000e+00 -2.300e+00 -3.700e+00 |
||||
|
-1.900 -2.100e+00 -1.500e+00 -2.800e+00 |
||||
|
-1.800 -1.300e+00 -8.600e-01 -1.900e+00 |
||||
|
-1.700 -6.800e-01 -4.000e-01 -1.100e+00 |
||||
|
-1.600 -2.800e-01 -1.800e-01 -5.100e-01 |
||||
|
-1.500 -1.200e-01 -9.800e-02 -1.800e-01 |
||||
|
-1.400 -7.500e-02 -7.100e-02 -8.300e-02 |
||||
|
-1.300 -5.750e-02 -5.700e-02 -5.900e-02 |
||||
|
-1.200 -4.600e-02 -4.650e-02 -4.550e-02 |
||||
|
-1.100 -3.550e-02 -3.700e-02 -3.450e-02 |
||||
|
-1.000 -2.650e-02 -2.850e-02 -2.500e-02 |
||||
|
-0.900 -1.850e-02 -2.100e-02 -1.650e-02 |
||||
|
-0.800 -1.200e-02 -1.400e-02 -9.750e-03 |
||||
|
-0.700 -6.700e-03 -8.800e-03 -4.700e-03 |
||||
|
-0.600 -3.000e-03 -4.650e-03 -1.600e-03 |
||||
|
-0.500 -9.450e-04 -1.950e-03 -3.650e-04 |
||||
|
-0.400 -5.700e-05 -2.700e-04 -5.550e-06 |
||||
|
-0.300 -1.200e-06 -1.200e-05 -5.500e-08 |
||||
|
-0.200 -3.000e-08 -5.000e-07 0.000e+00 |
||||
|
-0.100 0.000e+00 0.000e+00 0.000e+00 |
||||
|
0.000 0.000e+00 0.000e+00 0.000e+00 |
||||
|
5.000 0.000e+00 0.000e+00 0.000e+00 |
||||
|
| |
||||
|
[POWER Pulse Table] | POWER Clamp offset table | |
||||
|
| Time V(typ) V(min) V(max) |
||||
|
| |
||||
|
0 0 0 0 |
||||
|
1e-9 0 0 0 |
||||
|
2e-9 -0.9 -1.0 -0.8 |
||||
|
10e-9 -0.9 -1.0 -0.8 |
||||
|
11e-9 0 0 0 |
||||
|
| |
||||
|
[POWER Clamp] | Table to be offset |
||||
|
| |
||||
|
| Voltage I(typ) I(min) I(max) |
||||
|
| |
||||
|
-5.000 1.150e+01 1.100e+01 1.150e+01 |
||||
|
-4.000 7.800e+00 7.500e+00 8.150e+00 |
||||
|
-3.000 4.350e+00 4.100e+00 4.700e+00 |
||||
|
-2.000 1.100e+00 8.750e-01 1.300e+00 |
||||
|
-1.900 8.000e-01 6.050e-01 1.000e+00 |
||||
|
-1.800 5.300e-01 3.700e-01 7.250e-01 |
||||
|
-1.700 2.900e-01 1.800e-01 4.500e-01 |
||||
|
-1.600 1.200e-01 6.850e-02 2.200e-01 |
||||
|
-1.500 3.650e-02 2.400e-02 6.900e-02 |
||||
|
-1.400 1.200e-02 1.100e-02 1.600e-02 |
||||
|
-1.300 6.300e-03 6.650e-03 6.100e-03 |
||||
|
-1.200 4.200e-03 4.750e-03 3.650e-03 |
||||
|
-1.100 2.900e-03 3.500e-03 2.350e-03 |
||||
|
-1.000 1.900e-03 2.450e-03 1.400e-03 |
||||
|
-0.900 1.150e-03 1.600e-03 7.100e-04 |
||||
|
-0.800 5.500e-04 9.150e-04 2.600e-04 |
||||
|
-0.700 1.200e-04 4.400e-04 5.600e-05 |
||||
|
-0.600 5.400e-05 1.550e-04 1.200e-05 |
||||
|
-0.500 1.350e-05 5.400e-05 1.300e-06 |
||||
|
-0.400 8.650e-07 7.450e-06 4.950e-08 |
||||
|
-0.300 6.250e-08 7.550e-07 0.000e+00 |
||||
|
-0.200 0.000e+00 8.400e-08 0.000e+00 |
||||
|
-0.100 0.000e+00 0.000e-08 0.000e+00 |
||||
|
0.000 0.000e+00 0.000e+00 0.000e+00 |
||||
|
|
||||
|
|
||||
|
[END] |
@ -0,0 +1,46 @@ |
|||||
|
[IBIS Ver] 3.2 |Let's test a comment |
||||
|
[Comment char] |_char |
||||
|
[File name] ibis_v2_1.pkg |
||||
|
[File Rev] 1.0 #Let's test a comment |
||||
|
[Date] 26/08/2021 |
||||
|
[Source] This is the |
||||
|
source for the files |
||||
|
[Notes] We can have some |
||||
|
Notes |
||||
|
[Copyright] |
||||
|
/* |
||||
|
* This program source code file is part of KiCad, a free EDA CAD application. |
||||
|
* |
||||
|
* Copyright (C) 2017-2021 KiCad Developers, see AUTHORS.txt for contributors. |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or |
||||
|
* modify it under the terms of the GNU General Public License |
||||
|
* as published by the Free Software Foundation; either version 2 |
||||
|
* of the License, or (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, you may find one here: |
||||
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
||||
|
* or you may search the http://www.gnu.org website for the version 2 license, |
||||
|
* or you may write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
||||
|
*/ |
||||
|
[Define Package Model] QFN4 |
||||
|
[Manufacturer] Kicad |
||||
|
[OEM] Kicad Packaging Co. |
||||
|
[Description] A 4 pin QFN, really ? |
||||
|
[Number Of Sections] 2 |
||||
|
[Number of Pins] 4 |
||||
|
[Pin Numbers] |
||||
|
A1 |
||||
|
A2 |
||||
|
A3 |
||||
|
A4 |
||||
|
|
||||
|
[End Package Model] |
||||
|
[END] |
@ -0,0 +1,89 @@ |
|||||
|
#include "../../pcbnew/signalIntegrity/kibis.h"
|
||||
|
#include <wx/textfile.h>
|
||||
|
|
||||
|
int main( void ) |
||||
|
{ |
||||
|
//KIBIS* k1 = new KIBIS( "ibis_v1_1.ibs" );
|
||||
|
//KIBIS* k2 = new KIBIS( "ibis_v2_1.ibs" );
|
||||
|
//KIBIS* k4 = new KIBIS( "sn74lvc541a.ibs" );
|
||||
|
KIBIS* k4 = new KIBIS( "ibis_lan8670_1_2_1v3.ibs" ); |
||||
|
|
||||
|
KIBIS_COMPONENT& comp = k4->m_components.at( 0 ); |
||||
|
|
||||
|
std::cout << "Component: " << comp.m_name << std::endl; |
||||
|
|
||||
|
for( KIBIS_PIN& pin : comp.m_pins ) |
||||
|
{ |
||||
|
std::cout << "--Pin: " << pin.m_pinNumber << " " << pin.m_signalName << std::endl; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//KIBIS_PIN* pin1 = comp.getPin( "11" );
|
||||
|
//KIBIS_PIN* pin2 = comp.getPin( "2" );
|
||||
|
KIBIS_PIN* pin1 = comp.getPin( "30" ); |
||||
|
KIBIS_PIN* pin2 = comp.getPin( "31" ); |
||||
|
|
||||
|
|
||||
|
std::cout << "pin1 name: " << pin1->m_signalName << std::endl; |
||||
|
std::cout << "pin2 name: " << pin2->m_signalName << std::endl; |
||||
|
std::cout << "pin1 model length: " << pin1->m_models.size()<< std::endl; |
||||
|
std::cout << "pin2 model length: " << pin2->m_models.size()<< std::endl; |
||||
|
std::string* tmp1 = new std::string(); |
||||
|
std::string* tmp2 = new std::string(); |
||||
|
std::string* tmp3 = new std::string(); |
||||
|
std::string* tmp4 = new std::string(); |
||||
|
|
||||
|
KIBIS_WAVEFORM_RECTANGULAR* wave = new KIBIS_WAVEFORM_RECTANGULAR(); |
||||
|
wave->m_ton = 80e-9; |
||||
|
wave->m_toff = 80e-9; |
||||
|
wave->m_cycles = 10; |
||||
|
wave->m_delay = 0; |
||||
|
//KIBIS_WAVEFORM_STUCK_HIGH* wave = new KIBIS_WAVEFORM_STUCK_HIGH();
|
||||
|
|
||||
|
std::cout << "WAVEFORM TYPE IN QA: " << wave->GetType() << std::endl; |
||||
|
std::cout << pin2->m_models.at(0)->m_name << std::endl; |
||||
|
pin2->writeSpiceDevice( tmp4, "device_typ", *( pin2->m_models.at( 0 ) ), IBIS_CORNER::TYP, |
||||
|
IBIS_CORNER::TYP ); |
||||
|
|
||||
|
KIBIS_MODEL* model1 = pin1->m_models.at( 0 ); |
||||
|
std::cout << "Model used for driver: " << model1->m_name << std::endl; |
||||
|
pin1->writeSpiceDiffDriver( tmp1, "driver_typ", *( model1 ), IBIS_CORNER::TYP, IBIS_CORNER::TYP, |
||||
|
KIBIS_ACCURACY::LEVEL_2, wave ); |
||||
|
|
||||
|
wxTextFile file( "output.sp" ); |
||||
|
if( file.Exists() ) |
||||
|
{ |
||||
|
file.Clear(); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
file.Create(); |
||||
|
} |
||||
|
file.AddLine( *tmp1 ); |
||||
|
file.AddLine( *tmp2 ); |
||||
|
file.AddLine( *tmp3 ); |
||||
|
file.AddLine( *tmp4 ); |
||||
|
|
||||
|
wxString simul = ""; |
||||
|
simul += "x1 0 OUT_1 OUT_2 driver_typ \n"; |
||||
|
simul += "R1 OUT_1 COM 25\n"; |
||||
|
simul += "R2 OUT_2 COM 25\n"; |
||||
|
simul += "V1 COM 0 1.25\n"; |
||||
|
simul += ".tran 0.1n 1000n \n"; |
||||
|
simul += ".control run \n"; |
||||
|
simul += "run \n"; |
||||
|
simul += "plot v(OUT_1) v(OUT_2)\n"; |
||||
|
//simul += "plot v(x1.KU) v(x1.KD) v(1) v(x1.DIEBUFF) \n";
|
||||
|
simul += ".endc \n"; |
||||
|
simul += ".end \n"; |
||||
|
|
||||
|
|
||||
|
file.AddLine( simul ); |
||||
|
|
||||
|
file.Write(); |
||||
|
|
||||
|
|
||||
|
std::cout << "Done" << std::endl; |
||||
|
|
||||
|
return 1; |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue