Compare commits
21 Commits
Author | SHA1 | Date |
---|---|---|
|
8a45ed1e9e | |
|
a14a96f9ed | |
|
d819d46031 | |
|
892661ca2a | |
|
68f56c1361 | |
|
c9cbf87c10 | |
|
d5f25940a4 | |
|
46d81c5cb0 | |
|
6401f0d455 | |
|
bf5d4e881d | |
|
32a4b426b9 | |
|
9982f21f56 | |
|
fe37bb1552 | |
|
d0f0cdc47d | |
|
9d98c9aafd | |
|
77463c4803 | |
|
fc3def2df9 | |
|
e093cc4dcb | |
|
afee14b3b5 | |
|
7c0b61e669 | |
|
3db5f27aec |
|
@ -7,6 +7,10 @@ Coriolis README
|
||||||
|
|
||||||
Coriolis is a free database, placement tool and routing tool for VLSI design.
|
Coriolis is a free database, placement tool and routing tool for VLSI design.
|
||||||
|
|
||||||
|
This project is hosted at: https://github.com/lip6/coriolis
|
||||||
|
|
||||||
|
Development discussion can be found at https://matrix.to/#/#coriolis:matrix.org
|
||||||
|
|
||||||
|
|
||||||
Purpose
|
Purpose
|
||||||
=======
|
=======
|
||||||
|
@ -55,7 +59,7 @@ the repository in the right place. Proceed as follow: ::
|
||||||
|
|
||||||
ego@home:~$ mkdir -p ~/coriolis-2.x/src/
|
ego@home:~$ mkdir -p ~/coriolis-2.x/src/
|
||||||
ego@home:~$ cd ~/coriolis-2.x/src
|
ego@home:~$ cd ~/coriolis-2.x/src
|
||||||
ego@home:src$ git clone https://gitlab.lip6.fr/vlsi-eda/coriolis.git
|
ego@home:src$ git clone https://github.com/lip6/coriolis
|
||||||
ego@home:src$ cd coriolis
|
ego@home:src$ cd coriolis
|
||||||
|
|
||||||
Then, build the tool: ::
|
Then, build the tool: ::
|
||||||
|
|
|
@ -300,9 +300,9 @@ class Configuration ( object ):
|
||||||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||||
self._homeDir = os.environ['HOME']
|
self._homeDir = os.environ['HOME']
|
||||||
self._debugArg = ''
|
self._debugArg = ''
|
||||||
self._rmSource = False
|
self._rmSource = False
|
||||||
|
|
|
@ -293,9 +293,9 @@ class Configuration ( object ):
|
||||||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||||
self._homeDir = os.environ['HOME']
|
self._homeDir = os.environ['HOME']
|
||||||
self._debugArg = ''
|
self._debugArg = ''
|
||||||
self._rmSource = False
|
self._rmSource = False
|
||||||
|
|
|
@ -300,9 +300,9 @@ class Configuration ( object ):
|
||||||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||||
self._homeDir = os.environ['HOME']
|
self._homeDir = os.environ['HOME']
|
||||||
self._debugArg = ''
|
self._debugArg = ''
|
||||||
self._rmSource = False
|
self._rmSource = False
|
||||||
|
|
|
@ -314,9 +314,9 @@ class Configuration ( object ):
|
||||||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||||
self._supportRepos = [ 'https://github.com/Tencent/rapidjson.git' ]
|
self._supportRepos = [ 'https://github.com/Tencent/rapidjson.git' ]
|
||||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||||
self._homeDir = os.environ['HOME']
|
self._homeDir = os.environ['HOME']
|
||||||
self._debugArg = ''
|
self._debugArg = ''
|
||||||
self._rmSource = False
|
self._rmSource = False
|
||||||
|
@ -602,17 +602,17 @@ try:
|
||||||
if gitSupport.url.endswith('rapidjson'):
|
if gitSupport.url.endswith('rapidjson'):
|
||||||
gitSupport.checkout( 'b1a4d91' )
|
gitSupport.checkout( 'b1a4d91' )
|
||||||
|
|
||||||
if conf.doAlliance:
|
if conf.doAlliance:
|
||||||
if conf.rmSource: gitAlliance.removeLocalRepo()
|
if conf.rmSource: gitAlliance.removeLocalRepo()
|
||||||
gitAlliance.clone ()
|
gitAlliance.clone ()
|
||||||
#gitAlliance.checkout( 'devel' )
|
#gitAlliance.checkout( 'devel' )
|
||||||
|
|
||||||
if conf.doCoriolis:
|
if conf.doCoriolis:
|
||||||
if conf.rmSource: gitCoriolis.removeLocalRepo()
|
if conf.rmSource: gitCoriolis.removeLocalRepo()
|
||||||
gitCoriolis.clone ()
|
gitCoriolis.clone ()
|
||||||
gitCoriolis.checkout( 'devel' )
|
gitCoriolis.checkout( 'devel' )
|
||||||
gitCoriolis.submoduleInit()
|
gitCoriolis.submoduleInit()
|
||||||
gitCoriolis.submoduleUpdate()
|
gitCoriolis.submoduleUpdate()
|
||||||
|
|
||||||
if conf.rmSource: gitBenchs.removeLocalRepo()
|
if conf.rmSource: gitBenchs.removeLocalRepo()
|
||||||
gitBenchs.clone()
|
gitBenchs.clone()
|
||||||
|
|
|
@ -92,15 +92,32 @@ class Configuration:
|
||||||
Cfg.Configuration.popDefaultPriority()
|
Cfg.Configuration.popDefaultPriority()
|
||||||
|
|
||||||
|
|
||||||
|
class CfgDefault ( object ):
|
||||||
|
"""
|
||||||
|
Define a builtin default value. This value will be used as default
|
||||||
|
if the associated parameter do not have a value either set on disk
|
||||||
|
nor through progamming.
|
||||||
|
|
||||||
|
It is used as a very last ditch to get a value for a parameter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__ ( self, v ):
|
||||||
|
self.vDefault = v
|
||||||
|
|
||||||
|
def __str__ ( self ):
|
||||||
|
return 'CfgDefault({})'.format( self.vDefault )
|
||||||
|
|
||||||
|
|
||||||
class CachedParameter ( object ):
|
class CachedParameter ( object ):
|
||||||
|
|
||||||
def __init__ ( self, path, v ):
|
def __init__ ( self, path, v ):
|
||||||
self.path = path
|
self.path = path
|
||||||
self._v = None
|
self._v = None
|
||||||
self.v = v
|
self.vRange = [ None, None ]
|
||||||
self.vRange = [ None, None ]
|
self.vEnum = []
|
||||||
self.vEnum = []
|
self.create = True
|
||||||
self.create = True
|
if not isinstance(v,CfgDefault):
|
||||||
|
self.v = v
|
||||||
self.cacheRead()
|
self.cacheRead()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -108,7 +125,12 @@ class CachedParameter ( object ):
|
||||||
|
|
||||||
@v.setter
|
@v.setter
|
||||||
def v ( self, value ):
|
def v ( self, value ):
|
||||||
if value is not None: self._v = value
|
if value is None: return
|
||||||
|
if isinstance(value,CfgDefault):
|
||||||
|
if self._v is None:
|
||||||
|
self._v = value.vDefault
|
||||||
|
return
|
||||||
|
self._v = value
|
||||||
|
|
||||||
def __str__ ( self ):
|
def __str__ ( self ):
|
||||||
if isinstance(self.v,str): s = '"{}"'.format(self.v)
|
if isinstance(self.v,str): s = '"{}"'.format(self.v)
|
||||||
|
@ -325,7 +347,7 @@ class CfgCache ( object ):
|
||||||
def display ( self ):
|
def display ( self ):
|
||||||
"""Print all the parameters stored in that CfgCache."""
|
"""Print all the parameters stored in that CfgCache."""
|
||||||
if not len(self._path):
|
if not len(self._path):
|
||||||
print( ' o Applying configuration (CfgCache):' )
|
print( ' o Configuration contents (CfgCache):' )
|
||||||
for attrName in self._rattr.keys():
|
for attrName in self._rattr.keys():
|
||||||
if isinstance(self._rattr[attrName],CfgCache):
|
if isinstance(self._rattr[attrName],CfgCache):
|
||||||
self._rattr[attrName].display()
|
self._rattr[attrName].display()
|
||||||
|
|
|
@ -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,13 +1516,19 @@ 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 (not net) net = fusedNet();
|
if (layer->isBlockage() and (_flags & Gds::NoBlockages))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (not net) net = fusedNet();
|
||||||
|
|
||||||
if (points.size() > 2) {
|
if (points.size() > 2) {
|
||||||
bool isRectilinear = true;
|
bool isRectilinear = true;
|
||||||
for ( size_t i=1 ; i<points.size() ; ++i ) {
|
for ( size_t i=1 ; i<points.size() ; ++i ) {
|
||||||
|
@ -1782,6 +1791,18 @@ namespace {
|
||||||
NetExternalComponents::setExternal( p );
|
NetExternalComponents::setExternal( p );
|
||||||
toDestroy.push_back( component );
|
toDestroy.push_back( component );
|
||||||
cdebug_log(101,0) << "> external duplicate " << p << endl;
|
cdebug_log(101,0) << "> external duplicate " << p << endl;
|
||||||
|
} else {
|
||||||
|
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>( component );
|
||||||
|
if (rectilinear) {
|
||||||
|
rectilinear = Rectilinear::create( net
|
||||||
|
, rectilinear->getLayer()
|
||||||
|
, rectilinear->getPoints() );
|
||||||
|
NetExternalComponents::setExternal( rectilinear );
|
||||||
|
} else {
|
||||||
|
cerr << Error( "GdsStream::makeExternals(): Unmanaged component %s for net \"%s\"."
|
||||||
|
, getString(component).c_str()
|
||||||
|
, getString(net->getName()).c_str() ) << endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,10 +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->setExternal( true );
|
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 (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
|
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->setType ( netType );
|
||||||
|
|
||||||
if (pin->hasDirection()) {
|
if (pin->hasDirection()) {
|
||||||
string lefDir = pin->direction();
|
string lefDir = pin->direction();
|
||||||
|
@ -626,17 +717,8 @@ 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 (net->isSupply()) net->setGlobal( true );
|
||||||
if (pin->hasUse()) {
|
if (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( int iport=0 ; iport < pin->numPorts() ; ++iport ) {
|
for ( int iport=0 ; iport < pin->numPorts() ; ++iport ) {
|
||||||
Layer* layer = NULL;
|
Layer* layer = NULL;
|
||||||
|
@ -727,27 +809,30 @@ namespace {
|
||||||
const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 );
|
const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 );
|
||||||
Box ab = _cell->getAbutmentBox();
|
Box ab = _cell->getAbutmentBox();
|
||||||
|
|
||||||
cerr << " @ _pinStdPostProcess" << endl;
|
//cerr << " @ _pinStdPostProcess" << endl;
|
||||||
|
|
||||||
for ( auto element : _pinComponents ) {
|
for ( auto element : _pinComponents ) {
|
||||||
string pinName = element.first;
|
string pinName = element.first;
|
||||||
vector<Component*>& components = element.second;
|
vector<Component*>& components = element.second;
|
||||||
vector<Segment*> ongrids;
|
vector<Segment*> ongrids;
|
||||||
|
bool isSupply = false;
|
||||||
|
|
||||||
for ( Component* component : components ) {
|
for ( Component* component : components ) {
|
||||||
|
if (component->getNet()->isSupply()) {
|
||||||
|
isSupply = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Segment* segment = dynamic_cast<Segment*>( component );
|
Segment* segment = dynamic_cast<Segment*>( component );
|
||||||
if (segment) {
|
if (segment) {
|
||||||
if (component->getNet()->isSupply()) continue;
|
|
||||||
bool isWide = (segment->getWidth() >= getMinTerminalWidth());
|
bool isWide = (segment->getWidth() >= getMinTerminalWidth());
|
||||||
|
|
||||||
cerr << " > " << segment << endl;
|
// cerr << " > " << segment << endl;
|
||||||
if (not isVH())
|
// if (not isVH()) cerr << "X NOT isVH()" << endl;
|
||||||
cerr << "NOT isVH()" << endl;
|
// else cerr << "X isVH()" << endl;
|
||||||
else
|
|
||||||
cerr << "isVH()" << endl;
|
|
||||||
|
|
||||||
if (isVH() and (segment->getLayer()->getMask() == metal1->getMask())) {
|
if (isVH() and (segment->getLayer()->getMask() == metal1->getMask())) {
|
||||||
cerr << "isVH()" << endl;
|
// cerr << "isVH()" << endl;
|
||||||
Vertical* v = dynamic_cast<Vertical*>( segment );
|
Vertical* v = dynamic_cast<Vertical*>( segment );
|
||||||
if (v) {
|
if (v) {
|
||||||
DbU::Unit nearestX = gaugeMetal2->getTrackPosition( ab.getXMin()
|
DbU::Unit nearestX = gaugeMetal2->getTrackPosition( ab.getXMin()
|
||||||
|
@ -775,7 +860,7 @@ namespace {
|
||||||
, v->getDyTarget()
|
, v->getDyTarget()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
//cerr << " | " << ongrids[ongrids.size()-1] << endl;
|
cerr << " | " << ongrids[ongrids.size()-1] << endl;
|
||||||
} else {
|
} else {
|
||||||
// Unpitched and not wide enough to be under a metal2 track, ignore.
|
// Unpitched and not wide enough to be under a metal2 track, ignore.
|
||||||
}
|
}
|
||||||
|
@ -788,11 +873,11 @@ namespace {
|
||||||
if (isWide) ongrids.push_back( segment );
|
if (isWide) ongrids.push_back( segment );
|
||||||
}
|
}
|
||||||
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>( component );
|
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>( component );
|
||||||
if (not (rectilinear->getLayer()->getMask() == metal1->getMask()))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (rectilinear) {
|
if (rectilinear) {
|
||||||
cerr << " > " << rectilinear << endl;
|
cerr << " > " << rectilinear << endl;
|
||||||
|
if (rectilinear->getLayer()->getMask() != metal1->getMask())
|
||||||
|
continue;
|
||||||
|
|
||||||
vector<Box> boxes;
|
vector<Box> boxes;
|
||||||
rectilinear->getAsRectangles( boxes );
|
rectilinear->getAsRectangles( boxes );
|
||||||
|
|
||||||
|
@ -841,8 +926,9 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ongrids.empty()) {
|
if (ongrids.empty()) {
|
||||||
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
if (not isSupply)
|
||||||
, pinName.c_str() ) << endl;
|
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||||
|
, pinName.c_str() ) << endl;
|
||||||
for ( Component* component : components ) {
|
for ( Component* component : components ) {
|
||||||
NetExternalComponents::setExternal( component );
|
NetExternalComponents::setExternal( component );
|
||||||
}
|
}
|
||||||
|
@ -1008,7 +1094,7 @@ namespace {
|
||||||
if (parser->getCoreSiteY() != parser->getCellGauge()->getSliceHeight())
|
if (parser->getCoreSiteY() != parser->getCellGauge()->getSliceHeight())
|
||||||
cerr << Warning( "LefParser::parse(): CRL slice height discrepency %s while LEF is %s."
|
cerr << Warning( "LefParser::parse(): CRL slice height discrepency %s while LEF is %s."
|
||||||
, DbU::getValueString(parser->getCellGauge()->getSliceHeight()).c_str()
|
, DbU::getValueString(parser->getCellGauge()->getSliceHeight()).c_str()
|
||||||
, DbU::getValueString(parser->getCoreSiteX()).c_str() ) << endl;
|
, DbU::getValueString(parser->getCoreSiteY()).c_str() ) << endl;
|
||||||
|
|
||||||
if (parser->getCoreSiteX() != parser->getCellGauge()->getSliceStep())
|
if (parser->getCoreSiteX() != parser->getCellGauge()->getSliceStep())
|
||||||
cerr << Warning( "LefParser::parse(): CRL slice step discrepency %s while LEF is %s."
|
cerr << Warning( "LefParser::parse(): CRL slice step discrepency %s while LEF is %s."
|
||||||
|
@ -1068,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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ from ...CRL import AllianceFramework, RoutingLayerGauge, Catalog,
|
||||||
Gds, Spice
|
Gds, Spice
|
||||||
from ...helpers import trace, l, u, n
|
from ...helpers import trace, l, u, n
|
||||||
from ...helpers.io import ErrorMessage, WarningMessage, catch
|
from ...helpers.io import ErrorMessage, WarningMessage, catch
|
||||||
from ...helpers.overlay import CfgCache, UpdateSession
|
from ...helpers.overlay import CfgCache, CfgDefault, UpdateSession
|
||||||
from .. import getParameter
|
from .. import getParameter
|
||||||
from ..rsave import rsave
|
from ..rsave import rsave
|
||||||
from ..utils import getPlugByName
|
from ..utils import getPlugByName
|
||||||
|
@ -80,7 +80,7 @@ class GaugeConf ( object ):
|
||||||
self._plugToRp = { }
|
self._plugToRp = { }
|
||||||
self._rpToAccess = { }
|
self._rpToAccess = { }
|
||||||
self._loadRoutingGauge()
|
self._loadRoutingGauge()
|
||||||
self._routingBb = Box()
|
self._routingBb = Box()
|
||||||
return
|
return
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -744,7 +744,10 @@ class IoPadConf ( object ):
|
||||||
else:
|
else:
|
||||||
if self._datas[5] is not None: self.flags |= IoPadConf.BIDIR
|
if self._datas[5] is not None: self.flags |= IoPadConf.BIDIR
|
||||||
elif self._datas[6] is not None: self.flags |= IoPadConf.TRISTATE
|
elif self._datas[6] is not None: self.flags |= IoPadConf.TRISTATE
|
||||||
trace( 550, '\tIoPadConf._datas: {}\n'.format(self._datas) )
|
sPos = ''
|
||||||
|
if self._datas[1]:
|
||||||
|
sPos = DbU.getValueString(self._datas[1])
|
||||||
|
trace( 550, '\tIoPadConf._datas: @{} {}\n'.format(sPos,self._datas) )
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def side ( self ): return self._datas[0]
|
def side ( self ): return self._datas[0]
|
||||||
|
@ -1400,6 +1403,8 @@ class BlockConf ( GaugeConf ):
|
||||||
self.cfg.block.spareSide = None
|
self.cfg.block.spareSide = None
|
||||||
self.cfg.block.vRailsPeriod = None
|
self.cfg.block.vRailsPeriod = None
|
||||||
self.cfg.katana.dumpMeasures = None
|
self.cfg.katana.dumpMeasures = None
|
||||||
|
self.cfg.spares.htreeRootOffset = CfgDefault(3)
|
||||||
|
self.cfg.spares.htreeOffset = CfgDefault(5)
|
||||||
self.chipConf = ChipConf( self )
|
self.chipConf = ChipConf( self )
|
||||||
self.etesian = None
|
self.etesian = None
|
||||||
self.katana = None
|
self.katana = None
|
||||||
|
|
|
@ -45,7 +45,7 @@ def unbitify ( rawName ):
|
||||||
|
|
||||||
class HTree ( object ):
|
class HTree ( object ):
|
||||||
"""
|
"""
|
||||||
Build a H-Tree on a net occurrene.
|
Build a H-Tree on a net occurrence.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__ ( self, spares, treeNetOcc, index, flags ):
|
def __init__ ( self, spares, treeNetOcc, index, flags ):
|
||||||
|
@ -106,7 +106,11 @@ class HTree ( object ):
|
||||||
hLeafDepth = gaugeConf.horizontalDepth - 2
|
hLeafDepth = gaugeConf.horizontalDepth - 2
|
||||||
gaugeConf.setStackPosition( contact, x, y )
|
gaugeConf.setStackPosition( contact, x, y )
|
||||||
gaugeConf.createVertical ( contact, forkContact, x, 0 )
|
gaugeConf.createVertical ( contact, forkContact, x, 0 )
|
||||||
gaugeConf.addTrackAvoid( Box( x, forkContact.getY(), x, y ) )
|
trackAvoidBox = Box( x, forkContact.getY(), x, y )
|
||||||
|
if forkContact.getY() > contact.getY():
|
||||||
|
trackAvoidBox.inflate( 0, 0, 0, self.spares.conf.sliceHeight )
|
||||||
|
gaugeConf.addTrackAvoid( trackAvoidBox )
|
||||||
|
self.spares.trackAvoid( trackAvoidBox )
|
||||||
if len(leaf.buffers) > 1:
|
if len(leaf.buffers) > 1:
|
||||||
tl1Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[1], bufferConf.input, ckNet, GaugeConf.DeepDepth|GaugeConf.HAccess )
|
tl1Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[1], bufferConf.input, ckNet, GaugeConf.DeepDepth|GaugeConf.HAccess )
|
||||||
tl2Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[2], bufferConf.input, ckNet )
|
tl2Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[2], bufferConf.input, ckNet )
|
||||||
|
@ -155,12 +159,12 @@ class HTree ( object ):
|
||||||
or (qt.br and len(qt.br.buffers) > 1) \
|
or (qt.br and len(qt.br.buffers) > 1) \
|
||||||
or (qt.tr and len(qt.tr.buffers) > 1):
|
or (qt.tr and len(qt.tr.buffers) > 1):
|
||||||
leafFlags |= GaugeConf.HAccess
|
leafFlags |= GaugeConf.HAccess
|
||||||
yoffset = 3
|
yoffset = gaugeConf.cfg.spares.htreeRootOffset
|
||||||
if not qt.isRoot():
|
if not qt.isRoot():
|
||||||
ckParentNet = qt.bInputPlug(0).getNet()
|
ckParentNet = qt.bInputPlug(0).getNet()
|
||||||
driverContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.input, ckParentNet )
|
driverContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.input, ckParentNet )
|
||||||
driverY = driverContact.getY()
|
driverY = driverContact.getY()
|
||||||
yoffset = 5
|
yoffset = gaugeConf.cfg.spares.htreeOffset
|
||||||
trace( 550, '\tdriverContact={}\n'.format( driverContact ))
|
trace( 550, '\tdriverContact={}\n'.format( driverContact ))
|
||||||
if qt.bl:
|
if qt.bl:
|
||||||
trace( 550, '+,', '\tblContact\n' )
|
trace( 550, '+,', '\tblContact\n' )
|
||||||
|
|
|
@ -1103,8 +1103,8 @@ class Spares ( object ):
|
||||||
trace( 540, ',+', '\tSpares.addStrayBuffer()\n' )
|
trace( 540, ',+', '\tSpares.addStrayBuffer()\n' )
|
||||||
|
|
||||||
sliceHeight = self.conf.sliceHeight
|
sliceHeight = self.conf.sliceHeight
|
||||||
x = self.quadTree.toXPitch( position.getX() )
|
x = self.toXPitch( position.getX() )
|
||||||
y = self.quadTree.toYSlice( position.getY() )
|
y = self.toYSlice( position.getY() )
|
||||||
slice = y // sliceHeight
|
slice = y // sliceHeight
|
||||||
orientation = Transformation.Orientation.ID
|
orientation = Transformation.Orientation.ID
|
||||||
y = slice * sliceHeight
|
y = slice * sliceHeight
|
||||||
|
@ -1134,6 +1134,37 @@ class Spares ( object ):
|
||||||
raise ErrorMessage( 2, 'Spares.getFreeBufferUnder(): No more free buffers under {}.'.format(area) )
|
raise ErrorMessage( 2, 'Spares.getFreeBufferUnder(): No more free buffers under {}.'.format(area) )
|
||||||
return leaf.selectFree()
|
return leaf.selectFree()
|
||||||
|
|
||||||
|
def trackAvoid ( self, box ):
|
||||||
|
"""
|
||||||
|
Protect a vertical track by putting a vertical column of narrow filler
|
||||||
|
under it (usually tie). Used by the H-Tree (clock tree) in low-metal
|
||||||
|
nodes.
|
||||||
|
"""
|
||||||
|
trace( 540, ',+', '\tSpares.trackAvoid() {}\n'.format( box ))
|
||||||
|
yoffset = 0
|
||||||
|
if self.conf.isCoreBlock:
|
||||||
|
yoffset = self.conf.icore.getTransformation().getTy()
|
||||||
|
sliceHeight = self.conf.sliceHeight
|
||||||
|
x = self.toXPitch( box.getXMin() ) - self.conf.sliceStep
|
||||||
|
ymin = self.toYSlice( box.getYMin() )
|
||||||
|
ymax = self.toYSlice( box.getYMax() )
|
||||||
|
sliceMin = (ymin - yoffset) // sliceHeight
|
||||||
|
sliceMax = (ymax - yoffset) // sliceHeight
|
||||||
|
orientation = Transformation.Orientation.ID
|
||||||
|
ymin = sliceMin * sliceHeight
|
||||||
|
for row in range( sliceMin+1, sliceMax ):
|
||||||
|
orientation = Transformation.Orientation.ID
|
||||||
|
y = row * sliceHeight + yoffset
|
||||||
|
if row%2:
|
||||||
|
orientation = Transformation.Orientation.MY
|
||||||
|
y += sliceHeight
|
||||||
|
transf = Transformation( x, y, orientation )
|
||||||
|
instance = self.conf.feedsConf.createFeed( self.conf.corona )
|
||||||
|
instance.setTransformation( transf )
|
||||||
|
instance.setPlacementStatus( Instance.PlacementStatus.FIXED )
|
||||||
|
trace( 540, '\ttrackAvoid, feed: {} @{}\n'.format(instance,transf) )
|
||||||
|
trace( 540, '-' )
|
||||||
|
|
||||||
def raddTransNet ( self, topNet, path ):
|
def raddTransNet ( self, topNet, path ):
|
||||||
"""
|
"""
|
||||||
Add a net through a whole hierarchy of Instance/Cells. The master cells
|
Add a net through a whole hierarchy of Instance/Cells. The master cells
|
||||||
|
|
|
@ -169,7 +169,7 @@ class Side ( object ):
|
||||||
self.type = sideType
|
self.type = sideType
|
||||||
self.corona = corona
|
self.corona = corona
|
||||||
self.pins = []
|
self.pins = []
|
||||||
self.u = self.conf.ioPadHeight
|
self.u = 0
|
||||||
self.spacerCount = 0
|
self.spacerCount = 0
|
||||||
self.gap = 0
|
self.gap = 0
|
||||||
self.coreWires = []
|
self.coreWires = []
|
||||||
|
@ -370,6 +370,10 @@ class Side ( object ):
|
||||||
return
|
return
|
||||||
|
|
||||||
def _placePads ( self ):
|
def _placePads ( self ):
|
||||||
|
if self.type in (North,South):
|
||||||
|
self.u = self.corona.padCornerWidth
|
||||||
|
else:
|
||||||
|
self.u = self.corona.padCornerHeight
|
||||||
padLength = 0
|
padLength = 0
|
||||||
for pad in self.pads: padLength += pad[1].getMasterCell().getAbutmentBox().getWidth()
|
for pad in self.pads: padLength += pad[1].getMasterCell().getAbutmentBox().getWidth()
|
||||||
padSpacing = (self.sideLength - 2*self.conf.ioPadHeight - padLength) // (len(self.pads) + 1)
|
padSpacing = (self.sideLength - 2*self.conf.ioPadHeight - padLength) // (len(self.pads) + 1)
|
||||||
|
@ -551,6 +555,8 @@ class Corona ( object ):
|
||||||
self.padCorner = []
|
self.padCorner = []
|
||||||
self.padRails = [] # [ , [net, layer, axis, width] ]
|
self.padRails = [] # [ , [net, layer, axis, width] ]
|
||||||
self.powerCount = 0
|
self.powerCount = 0
|
||||||
|
self.padCornerWidth = self.conf.ioPadHeight
|
||||||
|
self.padCornerHeight = self.conf.ioPadHeight
|
||||||
self.conf.cfg.chip.padCoreSide = None
|
self.conf.cfg.chip.padCoreSide = None
|
||||||
if self.conf.cfg.chip.padCoreSide.lower() == 'south':
|
if self.conf.cfg.chip.padCoreSide.lower() == 'south':
|
||||||
self.padOrient = Transformation.Orientation.MY
|
self.padOrient = Transformation.Orientation.MY
|
||||||
|
@ -567,7 +573,9 @@ class Corona ( object ):
|
||||||
raise ErrorMessage( 1, 'Corona.__init__(): Missing spacer cell "{}"'.format(spacerName) )
|
raise ErrorMessage( 1, 'Corona.__init__(): Missing spacer cell "{}"'.format(spacerName) )
|
||||||
self.padSpacers = sorted( self.padSpacers, key=_cmpPad, reverse=True )
|
self.padSpacers = sorted( self.padSpacers, key=_cmpPad, reverse=True )
|
||||||
if self.conf.cfg.chip.padCorner is not None:
|
if self.conf.cfg.chip.padCorner is not None:
|
||||||
self.padCorner = self.padLib.getCell( self.conf.cfg.chip.padCorner )
|
self.padCorner = self.padLib.getCell( self.conf.cfg.chip.padCorner )
|
||||||
|
self.padCornerWidth = self.padCorner.getAbutmentBox().getWidth()
|
||||||
|
self.padCornerHeight = self.padCorner.getAbutmentBox().getHeight()
|
||||||
if self.conf.cfg.chip.minPadSpacing is None:
|
if self.conf.cfg.chip.minPadSpacing is None:
|
||||||
self.conf.cfg.chip.minPadSpacing = 0
|
self.conf.cfg.chip.minPadSpacing = 0
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ to rebuild |Alliance| from source. To perform this, be aware that you must
|
||||||
have at least a basic knowlegde of how to build a C/C++ program from source.
|
have at least a basic knowlegde of how to build a C/C++ program from source.
|
||||||
Sources are available through the following |git| repository:
|
Sources are available through the following |git| repository:
|
||||||
|
|
||||||
https://gitlab.lip6.fr/jpc/alliance.git
|
https://github.com/lip6/alliance.git
|
||||||
|
|
||||||
The stable version is under the branch :cb:`master`, while the development
|
The stable version is under the branch :cb:`master`, while the development
|
||||||
is kept under :cb:`devel` (and will be merged into :cb:`master` from time
|
is kept under :cb:`devel` (and will be merged into :cb:`master` from time
|
||||||
|
@ -159,7 +159,7 @@ directory alongside with |Coriolis|.
|
||||||
|
|
||||||
ego@home:~> mkdir -p coriolis-2.x/src
|
ego@home:~> mkdir -p coriolis-2.x/src
|
||||||
ego@home:~> cd coriolis-2.x/src
|
ego@home:~> cd coriolis-2.x/src
|
||||||
ego@home:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||||
|
|
||||||
3. Compilation & installation. For that step, you can use the following shell
|
3. Compilation & installation. For that step, you can use the following shell
|
||||||
script.
|
script.
|
||||||
|
@ -218,7 +218,7 @@ or ``/Linux.fc_64/`` (Fedora).
|
||||||
|
|
||||||
ego@home:~> mkdir -p coriolis-2.x/src
|
ego@home:~> mkdir -p coriolis-2.x/src
|
||||||
ego@home:~> cd coriolis-2.x/src
|
ego@home:~> cd coriolis-2.x/src
|
||||||
ego@home:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||||
|
|
||||||
3. Compilation & installation. For that step, you can use the following shell
|
3. Compilation & installation. For that step, you can use the following shell
|
||||||
script.
|
script.
|
||||||
|
|
|
@ -22,7 +22,7 @@ The |git| repositories of all the components of the project:
|
||||||
================================ =======================================================
|
================================ =======================================================
|
||||||
Component Repository
|
Component Repository
|
||||||
================================ =======================================================
|
================================ =======================================================
|
||||||
|Alliance| https://gitlab.lip6.fr/vlsi-eda/alliance.git
|
|Alliance| https://github.com/lip6/alliance.git
|
||||||
|Coriolis| https://gitlab.lip6.fr/vlsi-eda/coriolis.git
|
|Coriolis| https://github.com/lip6/coriolis.git
|
||||||
:cb:`Alliance Check Toolkit` https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git
|
:cb:`Alliance Check Toolkit` https://github.com/lip6/alliance-check-toolkit.git
|
||||||
================================ =======================================================
|
================================ =======================================================
|
||||||
|
|
|
@ -107,7 +107,7 @@ The actively developed branch
|
||||||
The **devel_anabatic** branch is now closed and we go back to a more classical
|
The **devel_anabatic** branch is now closed and we go back to a more classical
|
||||||
scheme where **master** is the stable version and **devel** the development one.
|
scheme where **master** is the stable version and **devel** the development one.
|
||||||
|
|
||||||
The |Coriolis| |git| repository is https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
The |Coriolis| |git| repository is https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
Again, the **devel_anabatic** branch is now closed. Please revert to **devel**
|
Again, the **devel_anabatic** branch is now closed. Please revert to **devel**
|
||||||
|
@ -171,7 +171,7 @@ Installing on |RedHat| or compatible distributions
|
||||||
|
|
||||||
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> cd ~/coriolis-2.x/src
|
dummy@lepka:src> cd ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
4. Build & install:
|
4. Build & install:
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ Second step is to create the source directory and pull the |git| repository:
|
||||||
|
|
||||||
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> cd ~/coriolis-2.x/src
|
dummy@lepka:src> cd ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
Third and final step, build & install:
|
Third and final step, build & install:
|
||||||
|
|
||||||
|
|
|
@ -237,7 +237,7 @@ to rebuild <span class="sc">Alliance</span> from source. To perform this, be awa
|
||||||
have at least a basic knowlegde of how to build a C/C++ program from source.
|
have at least a basic knowlegde of how to build a C/C++ program from source.
|
||||||
Sources are available through the following <span class="cb">git</span> repository:</p>
|
Sources are available through the following <span class="cb">git</span> repository:</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<a class="reference external" href="https://gitlab.lip6.fr/jpc/alliance.git">https://gitlab.lip6.fr/jpc/alliance.git</a></blockquote>
|
<a class="reference external" href="https://github.com/lip6/alliance.git">https://github.com/lip6/alliance.git</a></blockquote>
|
||||||
<p>The stable version is under the branch <span class="cb">master</span>, while the development
|
<p>The stable version is under the branch <span class="cb">master</span>, while the development
|
||||||
is kept under <span class="cb">devel</span> (and will be merged into <span class="cb">master</span> from time
|
is kept under <span class="cb">devel</span> (and will be merged into <span class="cb">master</span> from time
|
||||||
to time...)</p>
|
to time...)</p>
|
||||||
|
@ -339,7 +339,7 @@ directory alongside with <span class="sc">Coriolis</span>.</p>
|
||||||
<li><p class="first">Getting the sources (cloning the <span class="cb">git</span> repository):</p>
|
<li><p class="first">Getting the sources (cloning the <span class="cb">git</span> repository):</p>
|
||||||
<div class="highlight"><pre><span></span>ego@home:~> mkdir -p coriolis-2.x/src
|
<div class="highlight"><pre><span></span>ego@home:~> mkdir -p coriolis-2.x/src
|
||||||
ego@home:~> <span class="nb">cd</span> coriolis-2.x/src
|
ego@home:~> <span class="nb">cd</span> coriolis-2.x/src
|
||||||
ego@home:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</li>
|
</li>
|
||||||
<li><p class="first">Compilation & installation. For that step, you can use the following shell
|
<li><p class="first">Compilation & installation. For that step, you can use the following shell
|
||||||
|
@ -393,7 +393,7 @@ or <tt class="docutils literal">/Linux.fc_64/</tt> (Fedora).</p>
|
||||||
<li><p class="first">Getting the sources (cloning the <span class="cb">git</span> repository):</p>
|
<li><p class="first">Getting the sources (cloning the <span class="cb">git</span> repository):</p>
|
||||||
<div class="highlight"><pre><span></span>ego@home:~> mkdir -p coriolis-2.x/src
|
<div class="highlight"><pre><span></span>ego@home:~> mkdir -p coriolis-2.x/src
|
||||||
ego@home:~> <span class="nb">cd</span> coriolis-2.x/src
|
ego@home:~> <span class="nb">cd</span> coriolis-2.x/src
|
||||||
ego@home:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</li>
|
</li>
|
||||||
<li><p class="first">Compilation & installation. For that step, you can use the following shell
|
<li><p class="first">Compilation & installation. For that step, you can use the following shell
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<meta name="description" content="The git repositories of all the components of the project: Component Repository Alliance https://gitlab.lip6.fr/vlsi-eda/alliance.git Coriolis https://gitlab.lip6.fr/vlsi-eda/coriolis.git Alliance...">
|
<meta name="description" content="The git repositories of all the components of the project: Component Repository Alliance https://github.com/lip6/alliance.git Coriolis https://github.com/lip6/coriolis.git Alliance...">
|
||||||
<meta name="keywords" content="">
|
<meta name="keywords" content="">
|
||||||
<link rel="icon" href="../favicon.ico">
|
<link rel="icon" href="../favicon.ico">
|
||||||
|
|
||||||
|
@ -134,13 +134,13 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><span class="sc">Alliance</span></td>
|
<tr><td><span class="sc">Alliance</span></td>
|
||||||
<td><a class="reference external" href="https://gitlab.lip6.fr/vlsi-eda/alliance.git">https://gitlab.lip6.fr/vlsi-eda/alliance.git</a></td>
|
<td><a class="reference external" href="https://github.com/lip6/alliance.git">https://github.com/lip6/alliance.git</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><span class="sc">Coriolis</span></td>
|
<tr><td><span class="sc">Coriolis</span></td>
|
||||||
<td><a class="reference external" href="https://gitlab.lip6.fr/vlsi-eda/coriolis.git">https://gitlab.lip6.fr/vlsi-eda/coriolis.git</a></td>
|
<td><a class="reference external" href="https://github.com/lip6/coriolis.git">https://github.com/lip6/coriolis.git</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><span class="cb">Alliance Check Toolkit</span></td>
|
<tr><td><span class="cb">Alliance Check Toolkit</span></td>
|
||||||
<td><a class="reference external" href="https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git">https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git</a></td>
|
<td><a class="reference external" href="https://github.com/lip6/alliance-check-toolkit.git">https://github.com/lip6/alliance-check-toolkit.git</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -363,7 +363,7 @@ and Python modules (which must be dynamic).</p>
|
||||||
<h4>The actively developed branch</h4>
|
<h4>The actively developed branch</h4>
|
||||||
<p>The <strong>devel_anabatic</strong> branch is now closed and we go back to a more classical
|
<p>The <strong>devel_anabatic</strong> branch is now closed and we go back to a more classical
|
||||||
scheme where <strong>master</strong> is the stable version and <strong>devel</strong> the development one.</p>
|
scheme where <strong>master</strong> is the stable version and <strong>devel</strong> the development one.</p>
|
||||||
<p>The <span class="sc">Coriolis</span> <span class="cb">git</span> repository is <a class="reference external" href="https://gitlab.lip6.fr/vlsi-cad/coriolis.git">https://gitlab.lip6.fr/vlsi-cad/coriolis.git</a></p>
|
<p>The <span class="sc">Coriolis</span> <span class="cb">git</span> repository is <a class="reference external" href="https://github.com/lip6/coriolis.git">https://github.com/lip6/coriolis.git</a></p>
|
||||||
<div class="admonition note">
|
<div class="admonition note">
|
||||||
<p class="first admonition-title">Note</p>
|
<p class="first admonition-title">Note</p>
|
||||||
<p class="last">Again, the <strong>devel_anabatic</strong> branch is now closed. Please revert to <strong>devel</strong>
|
<p class="last">Again, the <strong>devel_anabatic</strong> branch is now closed. Please revert to <strong>devel</strong>
|
||||||
|
@ -419,7 +419,7 @@ dummy@lepka:support> git clone http://github.com/miloyip/rapidjson
|
||||||
<li><p class="first">Create the source directory and pull the <span class="cb">git</span> repository:</p>
|
<li><p class="first">Create the source directory and pull the <span class="cb">git</span> repository:</p>
|
||||||
<div class="highlight"><pre><span></span>dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
<div class="highlight"><pre><span></span>dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> <span class="nb">cd</span> ~/coriolis-2.x/src
|
dummy@lepka:src> <span class="nb">cd</span> ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</li>
|
</li>
|
||||||
<li><p class="first">Build & install:</p>
|
<li><p class="first">Build & install:</p>
|
||||||
|
@ -530,7 +530,7 @@ this will confuse the installer and end up with a non functional software
|
||||||
<p>Second step is to create the source directory and pull the <span class="cb">git</span> repository:</p>
|
<p>Second step is to create the source directory and pull the <span class="cb">git</span> repository:</p>
|
||||||
<div class="highlight"><pre><span></span>dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
<div class="highlight"><pre><span></span>dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> <span class="nb">cd</span> ~/coriolis-2.x/src
|
dummy@lepka:src> <span class="nb">cd</span> ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
</pre></div>
|
</pre></div>
|
||||||
<p>Third and final step, build & install:</p>
|
<p>Third and final step, build & install:</p>
|
||||||
<div class="highlight"><pre><span></span>dummy@lepka:src> <span class="nb">cd</span> coriolis
|
<div class="highlight"><pre><span></span>dummy@lepka:src> <span class="nb">cd</span> coriolis
|
||||||
|
|
|
@ -107,7 +107,7 @@ The actively developed branch
|
||||||
The **devel_anabatic** branch is now closed and we go back to a more classical
|
The **devel_anabatic** branch is now closed and we go back to a more classical
|
||||||
scheme where **master** is the stable version and **devel** the development one.
|
scheme where **master** is the stable version and **devel** the development one.
|
||||||
|
|
||||||
The |Coriolis| |git| repository is https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
The |Coriolis| |git| repository is https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
Again, the **devel_anabatic** branch is now closed. Please revert to **devel**
|
Again, the **devel_anabatic** branch is now closed. Please revert to **devel**
|
||||||
|
@ -171,7 +171,7 @@ Installing on |RedHat| or compatible distributions
|
||||||
|
|
||||||
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> cd ~/coriolis-2.x/src
|
dummy@lepka:src> cd ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
4. Build & install:
|
4. Build & install:
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ Second step is to create the source directory and pull the |git| repository:
|
||||||
|
|
||||||
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
dummy@lepka:~> mkdir -p ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> cd ~/coriolis-2.x/src
|
dummy@lepka:src> cd ~/coriolis-2.x/src
|
||||||
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||||
|
|
||||||
Third and final step, build & install:
|
Third and final step, build & install:
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "hurricane/Plug.h"
|
#include "hurricane/Plug.h"
|
||||||
#include "hurricane/RoutingPad.h"
|
#include "hurricane/RoutingPad.h"
|
||||||
#include "hurricane/Vertical.h"
|
#include "hurricane/Vertical.h"
|
||||||
|
#include "hurricane/Horizontal.h"
|
||||||
#include "hurricane/NetExternalComponents.h"
|
#include "hurricane/NetExternalComponents.h"
|
||||||
#include "hurricane/Path.h"
|
#include "hurricane/Path.h"
|
||||||
#include "hurricane/Library.h"
|
#include "hurricane/Library.h"
|
||||||
|
@ -50,6 +51,7 @@ namespace Etesian {
|
||||||
using Hurricane::Plug;
|
using Hurricane::Plug;
|
||||||
using Hurricane::RoutingPad;
|
using Hurricane::RoutingPad;
|
||||||
using Hurricane::Vertical;
|
using Hurricane::Vertical;
|
||||||
|
using Hurricane::Horizontal;
|
||||||
using Hurricane::NetExternalComponents;
|
using Hurricane::NetExternalComponents;
|
||||||
using Hurricane::DebugSession;
|
using Hurricane::DebugSession;
|
||||||
using Hurricane::UpdateSession;
|
using Hurricane::UpdateSession;
|
||||||
|
@ -57,6 +59,8 @@ namespace Etesian {
|
||||||
using CRL::CatalogExtension;
|
using CRL::CatalogExtension;
|
||||||
using CRL::getTransformation;
|
using CRL::getTransformation;
|
||||||
using CRL::RoutingLayerGauge;
|
using CRL::RoutingLayerGauge;
|
||||||
|
using Constant::LayerGaugeType;
|
||||||
|
using Constant::Direction;
|
||||||
using Etesian::EtesianEngine;
|
using Etesian::EtesianEngine;
|
||||||
|
|
||||||
|
|
||||||
|
@ -146,7 +150,7 @@ namespace Etesian {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
list<Tile>::iterator imerge = _tiles.end();
|
//list<Tile>::iterator imerge = _tiles.end();
|
||||||
for ( auto itile = _tiles.begin() ; itile != _tiles.end() ; ++itile ) {
|
for ( auto itile = _tiles.begin() ; itile != _tiles.end() ; ++itile ) {
|
||||||
if ((*itile).getXMin() > flatAb.getXMin()) {
|
if ((*itile).getXMin() > flatAb.getXMin()) {
|
||||||
_tiles.insert( itile, Tile(flatAb.getXMin(), flatAb.getWidth(), occurrence) );
|
_tiles.insert( itile, Tile(flatAb.getXMin(), flatAb.getWidth(), occurrence) );
|
||||||
|
@ -630,12 +634,15 @@ namespace Etesian {
|
||||||
if (not component->getLayer()->isBlockage()) continue;
|
if (not component->getLayer()->isBlockage()) continue;
|
||||||
cdebug_log(121,0) << "Looking at " << component << endl;
|
cdebug_log(121,0) << "Looking at " << component << endl;
|
||||||
Vertical* v = dynamic_cast<Vertical*>( component );
|
Vertical* v = dynamic_cast<Vertical*>( component );
|
||||||
if (not v) continue;
|
if ( not dynamic_cast<Vertical* >(component)
|
||||||
|
and not dynamic_cast<Horizontal*>(component)) continue;
|
||||||
|
|
||||||
RoutingLayerGauge* rlg = rg->getLayerGauge( v->getLayer()->getRoutingLayer() );
|
RoutingLayerGauge* rlg = rg->getLayerGauge( component->getLayer()->getRoutingLayer() );
|
||||||
if (not rlg) continue;
|
if (not rlg) continue;
|
||||||
|
if (rlg->getType() != LayerGaugeType::Default) continue;
|
||||||
|
if (rlg->getDirection() != Direction::Vertical) continue;
|
||||||
|
|
||||||
Box bb = v->getBoundingBox();
|
Box bb = component->getBoundingBox();
|
||||||
bb.inflate( -rlg->getWireWidth()/2, 0 );
|
bb.inflate( -rlg->getWireWidth()/2, 0 );
|
||||||
Transformation transf = tile.getInstance()->getTransformation();
|
Transformation transf = tile.getInstance()->getTransformation();
|
||||||
tile.getOccurrence().getPath().getTransformation().applyOn( transf );
|
tile.getOccurrence().getPath().getTransformation().applyOn( transf );
|
||||||
|
|
|
@ -9,11 +9,11 @@
|
||||||
"rev": "0e5744fd98acadee44bc5cfc4949146f1d30506f",
|
"rev": "0e5744fd98acadee44bc5cfc4949146f1d30506f",
|
||||||
"revCount": 291,
|
"revCount": 291,
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
|
"url": "https://github.com/lip6/alliance-check-toolkit.git"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
|
"url": "https://github.com/lip6/alliance-check-toolkit.git"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
# Nixpkgs / NixOS version to use.
|
# Nixpkgs / NixOS version to use.
|
||||||
inputs.nixpkgs.url = "github:NixOS/nixpkgs"; # for alliance
|
inputs.nixpkgs.url = "github:NixOS/nixpkgs"; # for alliance
|
||||||
inputs.alliance-check-toolkit.url = "git+https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git";
|
inputs.alliance-check-toolkit.url = "git+https://github.com/lip6/alliance-check-toolkit.git";
|
||||||
inputs.alliance-check-toolkit.flake = false;
|
inputs.alliance-check-toolkit.flake = false;
|
||||||
inputs.soclayout.url = "git+https://git.libre-soc.org/git/soclayout.git";
|
inputs.soclayout.url = "git+https://git.libre-soc.org/git/soclayout.git";
|
||||||
inputs.soclayout.flake = false;
|
inputs.soclayout.flake = false;
|
||||||
|
|
|
@ -479,6 +479,19 @@ namespace Hurricane {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Box Rectilinear::getNearestHSide ( DbU::Unit y ) const
|
||||||
|
{
|
||||||
|
Box side;
|
||||||
|
for ( size_t i=1 ; i<_points.size() ; ++i ) {
|
||||||
|
if (_points[i-1].getY() != _points[i].getY()) continue;
|
||||||
|
if ( not side.isEmpty()
|
||||||
|
and (std::abs(side.getYCenter() - y) >= std::abs(_points[i].getY() - y))) continue;
|
||||||
|
side = Box( _points[i-1], _points[i] );
|
||||||
|
}
|
||||||
|
return side;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Rectilinear::_toJson ( JsonWriter* writer ) const
|
void Rectilinear::_toJson ( JsonWriter* writer ) const
|
||||||
{
|
{
|
||||||
Inherit::_toJson( writer );
|
Inherit::_toJson( writer );
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace Hurricane {
|
||||||
inline Points getContour () const;
|
inline Points getContour () const;
|
||||||
bool getAsRectangles ( std::vector<Box>& ) const;
|
bool getAsRectangles ( std::vector<Box>& ) const;
|
||||||
inline const vector<Point>& getPoints () const;
|
inline const vector<Point>& getPoints () const;
|
||||||
|
Box getNearestHSide ( DbU::Unit y ) const;
|
||||||
// Mutators.
|
// Mutators.
|
||||||
void setLayer ( const Layer* );
|
void setLayer ( const Layer* );
|
||||||
virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
|
virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
|
||||||
|
|
Loading…
Reference in New Issue