Support of the FOREIGN directive in LEF files (using GDS view).
* New: In LefImport, add setGdsForeignDirectory() to point out from where to load the extra GDS file in case a FOREIGN directory is present in MACRO. Also add support for merging the supply nets. It may happens that the supply nets have different names in the GDS ("vdd!") and LEF files ("pvdd"), in that case, the LEF name supersede the GDS one. The GDS file will be loaded *first* then completed by the LEF contents. Blockage in the GDS file are *not* loaded. * Change: In GdsParser, perform an early recognition of supply nets. For now it's hardwired to names starting by "vdd" and "gnd", but should be parametrized in the future. Needed for the LefImport to merge, if needed, the power supplies. In GdsStream::xyToComponent(), skip the blockage if required.
This commit is contained in:
parent
d5f25940a4
commit
892661ca2a
|
@ -33,6 +33,7 @@ namespace CRL {
|
||||||
public:
|
public:
|
||||||
static const uint32_t NoGdsPrefix = (1<<0);
|
static const uint32_t NoGdsPrefix = (1<<0);
|
||||||
static const uint32_t Layer_0_IsBoundary = (1<<1);
|
static const uint32_t Layer_0_IsBoundary = (1<<1);
|
||||||
|
static const uint32_t NoBlockages = (1<<2);
|
||||||
public:
|
public:
|
||||||
static bool save ( Cell* );
|
static bool save ( Cell* );
|
||||||
static bool load ( Library*, std::string gdsPath, uint32_t flags=0 );
|
static bool load ( Library*, std::string gdsPath, uint32_t flags=0 );
|
||||||
|
|
|
@ -29,9 +29,10 @@ namespace CRL {
|
||||||
|
|
||||||
class LefImport {
|
class LefImport {
|
||||||
public:
|
public:
|
||||||
static void reset ();
|
static void reset ();
|
||||||
static Hurricane::Library* load ( std::string fileName );
|
static Hurricane::Library* load ( std::string fileName );
|
||||||
static void setMergeLibrary ( Hurricane::Library* );
|
static void setMergeLibrary ( Hurricane::Library* );
|
||||||
|
static void setGdsForeignDirectory ( std::string path );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1079,6 +1079,9 @@ namespace {
|
||||||
if (not net) {
|
if (not net) {
|
||||||
net = Net::create( _cell, _text );
|
net = Net::create( _cell, _text );
|
||||||
net->setExternal( true );
|
net->setExternal( true );
|
||||||
|
if (_text.substr(0,3) == "vdd") net->setType ( Net::Type::POWER );
|
||||||
|
if (_text.substr(0,3) == "gnd") net->setType ( Net::Type::GROUND );
|
||||||
|
if (_text[ _text.size()-1 ] == '!') net->setGlobal( true );
|
||||||
}
|
}
|
||||||
addNetReference( net, layer, xpos, ypos );
|
addNetReference( net, layer, xpos, ypos );
|
||||||
}
|
}
|
||||||
|
@ -1513,11 +1516,17 @@ namespace {
|
||||||
if (not net) {
|
if (not net) {
|
||||||
net = Net::create( _cell, _text );
|
net = Net::create( _cell, _text );
|
||||||
net->setExternal( true );
|
net->setExternal( true );
|
||||||
|
if (_text.substr(0,3) == "vdd") net->setType ( Net::Type::POWER );
|
||||||
|
if (_text.substr(0,3) == "gnd") net->setType ( Net::Type::GROUND );
|
||||||
|
if (_text[ _text.size()-1 ] == '!') net->setGlobal( true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
_skipENDEL = true;
|
_skipENDEL = true;
|
||||||
|
|
||||||
|
if (layer->isBlockage() and (_flags & Gds::NoBlockages))
|
||||||
|
return;
|
||||||
|
|
||||||
if (not net) net = fusedNet();
|
if (not net) net = fusedNet();
|
||||||
|
|
||||||
if (points.size() > 2) {
|
if (points.size() > 2) {
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#include "crlcore/CellGauge.h"
|
#include "crlcore/CellGauge.h"
|
||||||
#include "crlcore/AllianceFramework.h"
|
#include "crlcore/AllianceFramework.h"
|
||||||
#include "crlcore/LefImport.h"
|
#include "crlcore/LefImport.h"
|
||||||
|
#include "crlcore/Gds.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_LEFDEF)
|
#if defined(HAVE_LEFDEF)
|
||||||
|
@ -73,6 +74,7 @@ namespace {
|
||||||
class LefParser {
|
class LefParser {
|
||||||
public:
|
public:
|
||||||
static void setMergeLibrary ( Library* );
|
static void setMergeLibrary ( Library* );
|
||||||
|
static void setGdsForeignDirectory ( string );
|
||||||
static DbU::Unit fromLefUnits ( int );
|
static DbU::Unit fromLefUnits ( int );
|
||||||
static Layer* getLayer ( string );
|
static Layer* getLayer ( string );
|
||||||
static void addLayer ( string, Layer* );
|
static void addLayer ( string, Layer* );
|
||||||
|
@ -85,6 +87,14 @@ namespace {
|
||||||
Library* createLibrary ();
|
Library* createLibrary ();
|
||||||
inline string getLibraryName () const;
|
inline string getLibraryName () const;
|
||||||
inline Library* getLibrary ( bool create=false );
|
inline Library* getLibrary ( bool create=false );
|
||||||
|
inline string getForeignPath () const;
|
||||||
|
inline void setForeignPath ( string );
|
||||||
|
inline const Point& getForeignPosition () const;
|
||||||
|
inline void setForeignPosition ( const Point& );
|
||||||
|
inline Net* getGdsPower () const;
|
||||||
|
inline void setGdsPower ( Net* );
|
||||||
|
inline Net* getGdsGround () const;
|
||||||
|
inline void setGdsGround ( Net* );
|
||||||
inline Cell* getCell () const;
|
inline Cell* getCell () const;
|
||||||
inline void setCell ( Cell* );
|
inline void setCell ( Cell* );
|
||||||
inline CellGauge* getCellGauge () const;
|
inline CellGauge* getCellGauge () const;
|
||||||
|
@ -113,20 +123,26 @@ namespace {
|
||||||
inline void addPinComponent ( string name, Component* );
|
inline void addPinComponent ( string name, Component* );
|
||||||
inline void clearPinComponents ();
|
inline void clearPinComponents ();
|
||||||
private:
|
private:
|
||||||
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
|
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
|
||||||
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
|
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
|
||||||
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
|
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
|
||||||
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData );
|
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction* , lefiUserData );
|
||||||
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
|
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
|
||||||
static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData );
|
static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData );
|
||||||
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
|
static int _macroForeignCbk ( lefrCallbackType_e, const lefiMacroForeign*, lefiUserData );
|
||||||
|
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
|
||||||
void _pinStdPostProcess ();
|
void _pinStdPostProcess ();
|
||||||
void _pinPadPostProcess ();
|
void _pinPadPostProcess ();
|
||||||
private:
|
private:
|
||||||
|
static string _gdsForeignDirectory;
|
||||||
static Library* _mergeLibrary;
|
static Library* _mergeLibrary;
|
||||||
string _file;
|
string _file;
|
||||||
string _libraryName;
|
string _libraryName;
|
||||||
Library* _library;
|
Library* _library;
|
||||||
|
string _foreignPath;
|
||||||
|
Point _foreignPosition;
|
||||||
|
Net* _gdsPower;
|
||||||
|
Net* _gdsGround;
|
||||||
Cell* _cell;
|
Cell* _cell;
|
||||||
Net* _net;
|
Net* _net;
|
||||||
string _busBits;
|
string _busBits;
|
||||||
|
@ -152,6 +168,14 @@ namespace {
|
||||||
inline Library* LefParser::getLibrary ( bool create ) { if (not _library and create) createLibrary(); return _library; }
|
inline Library* LefParser::getLibrary ( bool create ) { if (not _library and create) createLibrary(); return _library; }
|
||||||
inline Cell* LefParser::getCell () const { return _cell; }
|
inline Cell* LefParser::getCell () const { return _cell; }
|
||||||
inline void LefParser::setCell ( Cell* cell ) { _cell=cell; }
|
inline void LefParser::setCell ( Cell* cell ) { _cell=cell; }
|
||||||
|
inline string LefParser::getForeignPath () const { return _foreignPath; }
|
||||||
|
inline void LefParser::setForeignPath ( string path ) { _foreignPath=path; }
|
||||||
|
inline const Point& LefParser::getForeignPosition () const { return _foreignPosition; }
|
||||||
|
inline void LefParser::setForeignPosition ( const Point& position ) { _foreignPosition=position; }
|
||||||
|
inline Net* LefParser::getGdsPower () const { return _gdsPower; }
|
||||||
|
inline void LefParser::setGdsPower ( Net* net ) { _gdsPower=net; }
|
||||||
|
inline Net* LefParser::getGdsGround () const { return _gdsGround; }
|
||||||
|
inline void LefParser::setGdsGround ( Net* net ) { _gdsGround=net; }
|
||||||
inline void LefParser::setCellGauge ( CellGauge* gauge ) { _cellGauge=gauge; }
|
inline void LefParser::setCellGauge ( CellGauge* gauge ) { _cellGauge=gauge; }
|
||||||
inline Net* LefParser::getNet () const { return _net; }
|
inline Net* LefParser::getNet () const { return _net; }
|
||||||
inline void LefParser::setNet ( Net* net ) { _net=net; }
|
inline void LefParser::setNet ( Net* net ) { _net=net; }
|
||||||
|
@ -177,6 +201,7 @@ namespace {
|
||||||
inline void LefParser::clearPinComponents () { _pinComponents.clear(); }
|
inline void LefParser::clearPinComponents () { _pinComponents.clear(); }
|
||||||
|
|
||||||
|
|
||||||
|
string LefParser::_gdsForeignDirectory = "";
|
||||||
Library* LefParser::_mergeLibrary = nullptr;
|
Library* LefParser::_mergeLibrary = nullptr;
|
||||||
map<string,Layer*> LefParser::_layerLut;
|
map<string,Layer*> LefParser::_layerLut;
|
||||||
DbU::Unit LefParser::_coreSiteX = 0;
|
DbU::Unit LefParser::_coreSiteX = 0;
|
||||||
|
@ -187,6 +212,10 @@ namespace {
|
||||||
{ _mergeLibrary = library; }
|
{ _mergeLibrary = library; }
|
||||||
|
|
||||||
|
|
||||||
|
void LefParser::setGdsForeignDirectory ( string path )
|
||||||
|
{ _gdsForeignDirectory = path; }
|
||||||
|
|
||||||
|
|
||||||
void LefParser::reset ()
|
void LefParser::reset ()
|
||||||
{
|
{
|
||||||
_layerLut.clear();
|
_layerLut.clear();
|
||||||
|
@ -226,9 +255,13 @@ namespace {
|
||||||
LefParser::LefParser ( string file, string libraryName )
|
LefParser::LefParser ( string file, string libraryName )
|
||||||
: _file (file)
|
: _file (file)
|
||||||
, _libraryName (libraryName)
|
, _libraryName (libraryName)
|
||||||
, _library (NULL)
|
, _library (nullptr)
|
||||||
, _cell (NULL)
|
, _foreignPath ()
|
||||||
, _net (NULL)
|
, _foreignPosition (Point(0,0))
|
||||||
|
, _gdsPower (nullptr)
|
||||||
|
, _gdsGround (nullptr)
|
||||||
|
, _cell (nullptr)
|
||||||
|
, _net (nullptr)
|
||||||
, _busBits ("()")
|
, _busBits ("()")
|
||||||
, _unitsMicrons (0.01)
|
, _unitsMicrons (0.01)
|
||||||
, _unmatchedLayers ()
|
, _unmatchedLayers ()
|
||||||
|
@ -236,8 +269,8 @@ namespace {
|
||||||
, _nthMetal (0)
|
, _nthMetal (0)
|
||||||
, _nthCut (0)
|
, _nthCut (0)
|
||||||
, _nthRouting (0)
|
, _nthRouting (0)
|
||||||
, _routingGauge (NULL)
|
, _routingGauge (nullptr)
|
||||||
, _cellGauge (NULL)
|
, _cellGauge (nullptr)
|
||||||
, _minTerminalWidth(DbU::fromPhysical(Cfg::getParamDouble("lefImport.minTerminalWidth",0.0)->asDouble(),DbU::UnitPower::Micro))
|
, _minTerminalWidth(DbU::fromPhysical(Cfg::getParamDouble("lefImport.minTerminalWidth",0.0)->asDouble(),DbU::UnitPower::Micro))
|
||||||
{
|
{
|
||||||
_routingGauge = AllianceFramework::get()->getRoutingGauge();
|
_routingGauge = AllianceFramework::get()->getRoutingGauge();
|
||||||
|
@ -262,13 +295,14 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
lefrInit();
|
lefrInit();
|
||||||
lefrSetUnitsCbk ( _unitsCbk );
|
lefrSetUnitsCbk ( _unitsCbk );
|
||||||
lefrSetLayerCbk ( _layerCbk );
|
lefrSetLayerCbk ( _layerCbk );
|
||||||
lefrSetSiteCbk ( _siteCbk );
|
lefrSetSiteCbk ( _siteCbk );
|
||||||
lefrSetObstructionCbk( _obstructionCbk );
|
lefrSetObstructionCbk ( _obstructionCbk );
|
||||||
lefrSetMacroCbk ( _macroCbk );
|
lefrSetMacroCbk ( _macroCbk );
|
||||||
lefrSetMacroSiteCbk ( _macroSiteCbk );
|
lefrSetMacroSiteCbk ( _macroSiteCbk );
|
||||||
lefrSetPinCbk ( _pinCbk );
|
lefrSetMacroForeignCbk( _macroForeignCbk );
|
||||||
|
lefrSetPinCbk ( _pinCbk );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -458,6 +492,20 @@ namespace {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int LefParser::_macroForeignCbk ( lefrCallbackType_e c, const lefiMacroForeign* foreign, lefiUserData ud )
|
||||||
|
{
|
||||||
|
LefParser* parser = (LefParser*)ud;
|
||||||
|
AllianceFramework* af = AllianceFramework::get();
|
||||||
|
|
||||||
|
if (_gdsForeignDirectory.empty()) return 0;
|
||||||
|
|
||||||
|
string gdsPath = _gdsForeignDirectory + "/" + foreign->cellName() + ".gds";
|
||||||
|
parser->setForeignPath( gdsPath );
|
||||||
|
parser->setForeignPosition( Point( parser->fromUnitsMicrons( foreign->px() )
|
||||||
|
, parser->fromUnitsMicrons( foreign->px() )));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int LefParser::_obstructionCbk ( lefrCallbackType_e c, lefiObstruction* obstruction, lefiUserData ud )
|
int LefParser::_obstructionCbk ( lefrCallbackType_e c, lefiObstruction* obstruction, lefiUserData ud )
|
||||||
{
|
{
|
||||||
|
@ -550,6 +598,21 @@ namespace {
|
||||||
parser->setCell( cell );
|
parser->setCell( cell );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (not parser->getForeignPath().empty()) {
|
||||||
|
Gds::load( parser->getLibrary(), parser->getForeignPath()
|
||||||
|
, Gds::NoGdsPrefix|Gds::NoBlockages|Gds::Layer_0_IsBoundary);
|
||||||
|
for ( Net* net : cell->getNets() ) {
|
||||||
|
if (net->isPower ()) parser->setGdsPower ( net );
|
||||||
|
if (net->isGround()) parser->setGdsGround( net );
|
||||||
|
if (parser->getForeignPosition() != Point(0,0)) {
|
||||||
|
for ( Component* component : net->getComponents() ) {
|
||||||
|
component->translate( parser->getForeignPosition().getX()
|
||||||
|
, parser->getForeignPosition().getY() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (macro->hasSize()) {
|
if (macro->hasSize()) {
|
||||||
width = parser->fromUnitsMicrons( macro->sizeX() );
|
width = parser->fromUnitsMicrons( macro->sizeX() );
|
||||||
height = parser->fromUnitsMicrons( macro->sizeY() );
|
height = parser->fromUnitsMicrons( macro->sizeY() );
|
||||||
|
@ -581,7 +644,7 @@ namespace {
|
||||||
else parser->_pinPadPostProcess();
|
else parser->_pinPadPostProcess();
|
||||||
parser->clearPinComponents();
|
parser->clearPinComponents();
|
||||||
|
|
||||||
cerr << " - " << cellName
|
cerr << " o " << cellName
|
||||||
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
|
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
|
||||||
<< " " << gaugeName;
|
<< " " << gaugeName;
|
||||||
if (isPad) cerr << " (PAD)";
|
if (isPad) cerr << " (PAD)";
|
||||||
|
@ -612,8 +675,38 @@ namespace {
|
||||||
|
|
||||||
if (not parser->getCell()) parser->setCell( Cell::create( parser->getLibrary(true), "LefImportTmpCell" ) );
|
if (not parser->getCell()) parser->setCell( Cell::create( parser->getLibrary(true), "LefImportTmpCell" ) );
|
||||||
|
|
||||||
Net* net = Net::create( parser->getCell(), pin->name() );
|
Net* net = nullptr;
|
||||||
|
Net::Type netType = Net::Type::UNDEFINED;
|
||||||
|
if (pin->hasUse()) {
|
||||||
|
string lefUse = pin->use();
|
||||||
|
boost::to_upper( lefUse );
|
||||||
|
|
||||||
|
if (lefUse == "SIGNAL") netType = Net::Type::LOGICAL;
|
||||||
|
//if (lefUse == "ANALOG") netType = Net::Type::ANALOG;
|
||||||
|
if (lefUse == "CLOCK" ) netType = Net::Type::CLOCK;
|
||||||
|
if (lefUse == "POWER" ) netType = Net::Type::POWER;
|
||||||
|
if (lefUse == "GROUND") netType = Net::Type::GROUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((netType == Net::Type::POWER) and parser->getGdsPower()) {
|
||||||
|
net = parser->getGdsPower();
|
||||||
|
cerr << " - Renaming GDS power net \"" << net->getName() << "\""
|
||||||
|
<< " to LEF name \"" << pin->name() << "\"." << endl;
|
||||||
|
net->setName( pin->name() );
|
||||||
|
parser->setGdsPower( nullptr );
|
||||||
|
} else {
|
||||||
|
if ((netType == Net::Type::GROUND) and parser->getGdsGround()) {
|
||||||
|
net = parser->getGdsGround();
|
||||||
|
cerr << " - Renaming GDS ground net \"" << net->getName() << "\""
|
||||||
|
<< " to LEF name \"" << pin->name() << "\"." << endl;
|
||||||
|
net->setName( pin->name() );
|
||||||
|
parser->setGdsGround( nullptr );
|
||||||
|
} else {
|
||||||
|
net = Net::create( parser->getCell(), pin->name() );
|
||||||
|
}
|
||||||
|
}
|
||||||
net->setExternal( true );
|
net->setExternal( true );
|
||||||
|
net->setType ( netType );
|
||||||
|
|
||||||
if (pin->hasDirection()) {
|
if (pin->hasDirection()) {
|
||||||
string lefDir = pin->direction();
|
string lefDir = pin->direction();
|
||||||
|
@ -624,17 +717,6 @@ namespace {
|
||||||
if (lefDir == "OUTPUT TRISTATE") net->setDirection( Net::Direction::TRISTATE );
|
if (lefDir == "OUTPUT TRISTATE") net->setDirection( Net::Direction::TRISTATE );
|
||||||
if (lefDir == "INOUT" ) net->setDirection( Net::Direction::INOUT );
|
if (lefDir == "INOUT" ) net->setDirection( Net::Direction::INOUT );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pin->hasUse()) {
|
|
||||||
string lefUse = pin->use();
|
|
||||||
boost::to_upper( lefUse );
|
|
||||||
|
|
||||||
if (lefUse == "SIGNAL") net->setType( Net::Type::LOGICAL );
|
|
||||||
//if (lefUse == "ANALOG") net->setType( Net::Type::ANALOG );
|
|
||||||
if (lefUse == "CLOCK" ) net->setType( Net::Type::CLOCK );
|
|
||||||
if (lefUse == "POWER" ) net->setType( Net::Type::POWER );
|
|
||||||
if (lefUse == "GROUND") net->setType( Net::Type::GROUND );
|
|
||||||
}
|
|
||||||
if (net->isSupply()) net->setGlobal( true );
|
if (net->isSupply()) net->setGlobal( true );
|
||||||
if (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
|
if (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
|
||||||
|
|
||||||
|
@ -1072,4 +1154,12 @@ namespace CRL {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LefImport::setGdsForeignDirectory ( string path )
|
||||||
|
{
|
||||||
|
#if defined(HAVE_LEFDEF)
|
||||||
|
LefParser::setGdsForeignDirectory( path );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
} // End of CRL namespace.
|
} // End of CRL namespace.
|
||||||
|
|
|
@ -109,19 +109,37 @@ extern "C" {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject* PyLefImport_setGdsForeignDirectory ( PyObject*, PyObject* args )
|
||||||
|
{
|
||||||
|
cdebug_log(30,0) << "PyLefImport_setGdsForeignDirectory()" << endl;
|
||||||
|
HTRY
|
||||||
|
char* path = NULL;
|
||||||
|
if (PyArg_ParseTuple( args, "s:LefImport.setGdsForeignDirectory", &path )) {
|
||||||
|
LefImport::setGdsForeignDirectory( path );
|
||||||
|
} else {
|
||||||
|
PyErr_SetString ( ConstructorError, "LefImport.setGdsForeignDirectory(): Bad type or bad number of parameters." );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
HCATCH
|
||||||
|
Py_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Standart Destroy (Attribute).
|
// Standart Destroy (Attribute).
|
||||||
|
|
||||||
|
|
||||||
PyMethodDef PyLefImport_Methods[] =
|
PyMethodDef PyLefImport_Methods[] =
|
||||||
{ { "load" , (PyCFunction)PyLefImport_load , METH_VARARGS|METH_STATIC
|
{ { "load" , (PyCFunction)PyLefImport_load , METH_VARARGS|METH_STATIC
|
||||||
, "Load a complete Cadence LEF library." }
|
, "Load a complete Cadence LEF library." }
|
||||||
, { "reset" , (PyCFunction)PyLefImport_reset , METH_NOARGS|METH_STATIC
|
, { "reset" , (PyCFunction)PyLefImport_reset , METH_NOARGS|METH_STATIC
|
||||||
, "Reset the Cadence LEF parser (clear technology)." }
|
, "Reset the Cadence LEF parser (clear technology)." }
|
||||||
, { "setMergeLibrary" , (PyCFunction)PyLefImport_setMergeLibrary, METH_VARARGS|METH_STATIC
|
, { "setMergeLibrary" , (PyCFunction)PyLefImport_setMergeLibrary , METH_VARARGS|METH_STATIC
|
||||||
, "Merge into this library instead of creating a new one." }
|
, "Merge into this library instead of creating a new one." }
|
||||||
//, { "destroy" , (PyCFunction)PyLefImport_destroy , METH_VARARGS
|
, { "setGdsForeignDirectory", (PyCFunction)PyLefImport_setGdsForeignDirectory, METH_VARARGS|METH_STATIC
|
||||||
// , "Destroy the associated hurricane object. The python object remains." }
|
, "Set the directory where to find FOREIGN GDS files." }
|
||||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
//, { "destroy" , (PyCFunction)PyLefImport_destroy , METH_VARARGS
|
||||||
|
// , "Destroy the associated hurricane object. The python object remains." }
|
||||||
|
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue