ADDED: Read IBIS files
This commit is contained in:
parent
ac0f95683f
commit
0d35d69f70
|
@ -96,6 +96,10 @@ option( KICAD_SANITIZE_THREADS
|
|||
"Build KiCad with sanitizer options. WARNING: Not compatible with gold linker"
|
||||
OFF )
|
||||
|
||||
option( KICAD_SIGNAL_INTEGRITY
|
||||
"Build tools for signal integrity analysis ( default ON )"
|
||||
ON )
|
||||
|
||||
option( KICAD_STDLIB_DEBUG
|
||||
"Build KiCad with libstdc++ debug flags enabled."
|
||||
OFF )
|
||||
|
@ -510,6 +514,11 @@ if( KICAD_USE_OCC )
|
|||
add_definitions( -DKICAD_USE_OCC )
|
||||
endif()
|
||||
|
||||
if( KICAD_SIGNAL_INTEGRITY )
|
||||
add_definitions( -DKICAD_SIGNAL_INTEGRITY )
|
||||
endif()
|
||||
|
||||
|
||||
if( KICAD_USE_EGL AND UNIX AND NOT APPLE )
|
||||
message( STATUS "Configuring KiCad for the wxGLCanvas EGL backend" )
|
||||
add_definitions( -DKICAD_USE_EGL )
|
||||
|
|
|
@ -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.
|
|
@ -34,5 +34,7 @@ Licensed in the public domain:
|
|||
- lemon in thirdparty/lemon
|
||||
Licensed under CC BY-SA 4.0:
|
||||
- All the demo files provided in demos/*
|
||||
Licensed under clause-3 BSD:
|
||||
- ibis / kibis files in pcbnew/signalIntegrity
|
||||
Licensed under GPLv3 (or later):
|
||||
- All remaining code not listed above
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
File diff suppressed because it is too large
Load Diff
|
@ -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
|
|
@ -47,3 +47,6 @@ add_subdirectory( unittests )
|
|||
# Utility/debugging/profiling programs
|
||||
add_subdirectory( tools )
|
||||
|
||||
if( KICAD_SIGNAL_INTEGRITY )
|
||||
add_subdirectory( signalIntegrity )
|
||||
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;
|
||||
}
|
Loading…
Reference in New Issue