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.
|
||||
|
||||
This project is hosted at: https://github.com/lip6/coriolis
|
||||
|
||||
Development discussion can be found at https://matrix.to/#/#coriolis:matrix.org
|
||||
|
||||
|
||||
Purpose
|
||||
=======
|
||||
|
@ -55,7 +59,7 @@ the repository in the right place. Proceed as follow: ::
|
|||
|
||||
ego@home:~$ mkdir -p ~/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
|
||||
|
||||
Then, build the tool: ::
|
||||
|
|
|
@ -300,9 +300,9 @@ class Configuration ( object ):
|
|||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
||||
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||
self._homeDir = os.environ['HOME']
|
||||
self._debugArg = ''
|
||||
self._rmSource = False
|
||||
|
|
|
@ -293,9 +293,9 @@ class Configuration ( object ):
|
|||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
||||
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||
self._homeDir = os.environ['HOME']
|
||||
self._debugArg = ''
|
||||
self._rmSource = False
|
||||
|
|
|
@ -300,9 +300,9 @@ class Configuration ( object ):
|
|||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||
self._supportRepos = [ 'http://github.com/miloyip/rapidjson' ]
|
||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
||||
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||
self._homeDir = os.environ['HOME']
|
||||
self._debugArg = ''
|
||||
self._rmSource = False
|
||||
|
|
|
@ -314,9 +314,9 @@ class Configuration ( object ):
|
|||
self._sender = 'Jean-Paul.Chaput@soc.lip6.fr'
|
||||
self._receivers = [ 'Jean-Paul.Chaput@lip6.fr', ]
|
||||
self._supportRepos = [ 'https://github.com/Tencent/rapidjson.git' ]
|
||||
self._allianceRepo = 'https://gitlab.lip6.fr/jpc/alliance.git'
|
||||
self._coriolisRepo = 'https://gitlab.lip6.fr/jpc/coriolis.git'
|
||||
self._benchsRepo = 'https://gitlab.lip6.fr/jpc/alliance-check-toolkit.git'
|
||||
self._allianceRepo = 'https://github.com/lip6/alliance.git'
|
||||
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
|
||||
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.git'
|
||||
self._homeDir = os.environ['HOME']
|
||||
self._debugArg = ''
|
||||
self._rmSource = False
|
||||
|
@ -602,17 +602,17 @@ try:
|
|||
if gitSupport.url.endswith('rapidjson'):
|
||||
gitSupport.checkout( 'b1a4d91' )
|
||||
|
||||
if conf.doAlliance:
|
||||
if conf.rmSource: gitAlliance.removeLocalRepo()
|
||||
gitAlliance.clone ()
|
||||
#gitAlliance.checkout( 'devel' )
|
||||
|
||||
if conf.doCoriolis:
|
||||
if conf.rmSource: gitCoriolis.removeLocalRepo()
|
||||
gitCoriolis.clone ()
|
||||
gitCoriolis.checkout( 'devel' )
|
||||
gitCoriolis.submoduleInit()
|
||||
gitCoriolis.submoduleUpdate()
|
||||
if conf.doAlliance:
|
||||
if conf.rmSource: gitAlliance.removeLocalRepo()
|
||||
gitAlliance.clone ()
|
||||
#gitAlliance.checkout( 'devel' )
|
||||
|
||||
if conf.doCoriolis:
|
||||
if conf.rmSource: gitCoriolis.removeLocalRepo()
|
||||
gitCoriolis.clone ()
|
||||
gitCoriolis.checkout( 'devel' )
|
||||
gitCoriolis.submoduleInit()
|
||||
gitCoriolis.submoduleUpdate()
|
||||
|
||||
if conf.rmSource: gitBenchs.removeLocalRepo()
|
||||
gitBenchs.clone()
|
||||
|
|
|
@ -92,15 +92,32 @@ class Configuration:
|
|||
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 ):
|
||||
|
||||
def __init__ ( self, path, v ):
|
||||
self.path = path
|
||||
self._v = None
|
||||
self.v = v
|
||||
self.vRange = [ None, None ]
|
||||
self.vEnum = []
|
||||
self.create = True
|
||||
self.path = path
|
||||
self._v = None
|
||||
self.vRange = [ None, None ]
|
||||
self.vEnum = []
|
||||
self.create = True
|
||||
if not isinstance(v,CfgDefault):
|
||||
self.v = v
|
||||
self.cacheRead()
|
||||
|
||||
@property
|
||||
|
@ -108,7 +125,12 @@ class CachedParameter ( object ):
|
|||
|
||||
@v.setter
|
||||
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 ):
|
||||
if isinstance(self.v,str): s = '"{}"'.format(self.v)
|
||||
|
@ -325,7 +347,7 @@ class CfgCache ( object ):
|
|||
def display ( self ):
|
||||
"""Print all the parameters stored in that CfgCache."""
|
||||
if not len(self._path):
|
||||
print( ' o Applying configuration (CfgCache):' )
|
||||
print( ' o Configuration contents (CfgCache):' )
|
||||
for attrName in self._rattr.keys():
|
||||
if isinstance(self._rattr[attrName],CfgCache):
|
||||
self._rattr[attrName].display()
|
||||
|
|
|
@ -33,6 +33,7 @@ namespace CRL {
|
|||
public:
|
||||
static const uint32_t NoGdsPrefix = (1<<0);
|
||||
static const uint32_t Layer_0_IsBoundary = (1<<1);
|
||||
static const uint32_t NoBlockages = (1<<2);
|
||||
public:
|
||||
static bool save ( Cell* );
|
||||
static bool load ( Library*, std::string gdsPath, uint32_t flags=0 );
|
||||
|
|
|
@ -29,9 +29,10 @@ namespace CRL {
|
|||
|
||||
class LefImport {
|
||||
public:
|
||||
static void reset ();
|
||||
static Hurricane::Library* load ( std::string fileName );
|
||||
static void setMergeLibrary ( Hurricane::Library* );
|
||||
static void reset ();
|
||||
static Hurricane::Library* load ( std::string fileName );
|
||||
static void setMergeLibrary ( Hurricane::Library* );
|
||||
static void setGdsForeignDirectory ( std::string path );
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1079,6 +1079,9 @@ namespace {
|
|||
if (not net) {
|
||||
net = Net::create( _cell, _text );
|
||||
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 );
|
||||
}
|
||||
|
@ -1513,13 +1516,19 @@ namespace {
|
|||
if (not net) {
|
||||
net = Net::create( _cell, _text );
|
||||
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
|
||||
_skipENDEL = true;
|
||||
|
||||
if (not net) net = fusedNet();
|
||||
if (layer->isBlockage() and (_flags & Gds::NoBlockages))
|
||||
return;
|
||||
|
||||
if (not net) net = fusedNet();
|
||||
|
||||
if (points.size() > 2) {
|
||||
bool isRectilinear = true;
|
||||
for ( size_t i=1 ; i<points.size() ; ++i ) {
|
||||
|
@ -1782,6 +1791,18 @@ namespace {
|
|||
NetExternalComponents::setExternal( p );
|
||||
toDestroy.push_back( component );
|
||||
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/AllianceFramework.h"
|
||||
#include "crlcore/LefImport.h"
|
||||
#include "crlcore/Gds.h"
|
||||
|
||||
|
||||
#if defined(HAVE_LEFDEF)
|
||||
|
@ -73,6 +74,7 @@ namespace {
|
|||
class LefParser {
|
||||
public:
|
||||
static void setMergeLibrary ( Library* );
|
||||
static void setGdsForeignDirectory ( string );
|
||||
static DbU::Unit fromLefUnits ( int );
|
||||
static Layer* getLayer ( string );
|
||||
static void addLayer ( string, Layer* );
|
||||
|
@ -85,6 +87,14 @@ namespace {
|
|||
Library* createLibrary ();
|
||||
inline string getLibraryName () const;
|
||||
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 void setCell ( Cell* );
|
||||
inline CellGauge* getCellGauge () const;
|
||||
|
@ -113,20 +123,26 @@ namespace {
|
|||
inline void addPinComponent ( string name, Component* );
|
||||
inline void clearPinComponents ();
|
||||
private:
|
||||
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
|
||||
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
|
||||
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
|
||||
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData );
|
||||
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
|
||||
static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData );
|
||||
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
|
||||
static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData );
|
||||
static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData );
|
||||
static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData );
|
||||
static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction* , lefiUserData );
|
||||
static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData );
|
||||
static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData );
|
||||
static int _macroForeignCbk ( lefrCallbackType_e, const lefiMacroForeign*, lefiUserData );
|
||||
static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData );
|
||||
void _pinStdPostProcess ();
|
||||
void _pinPadPostProcess ();
|
||||
private:
|
||||
static string _gdsForeignDirectory;
|
||||
static Library* _mergeLibrary;
|
||||
string _file;
|
||||
string _libraryName;
|
||||
Library* _library;
|
||||
string _foreignPath;
|
||||
Point _foreignPosition;
|
||||
Net* _gdsPower;
|
||||
Net* _gdsGround;
|
||||
Cell* _cell;
|
||||
Net* _net;
|
||||
string _busBits;
|
||||
|
@ -152,6 +168,14 @@ namespace {
|
|||
inline Library* LefParser::getLibrary ( bool create ) { if (not _library and create) createLibrary(); return _library; }
|
||||
inline Cell* LefParser::getCell () const { return _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 Net* LefParser::getNet () const { return _net; }
|
||||
inline void LefParser::setNet ( Net* net ) { _net=net; }
|
||||
|
@ -177,6 +201,7 @@ namespace {
|
|||
inline void LefParser::clearPinComponents () { _pinComponents.clear(); }
|
||||
|
||||
|
||||
string LefParser::_gdsForeignDirectory = "";
|
||||
Library* LefParser::_mergeLibrary = nullptr;
|
||||
map<string,Layer*> LefParser::_layerLut;
|
||||
DbU::Unit LefParser::_coreSiteX = 0;
|
||||
|
@ -187,6 +212,10 @@ namespace {
|
|||
{ _mergeLibrary = library; }
|
||||
|
||||
|
||||
void LefParser::setGdsForeignDirectory ( string path )
|
||||
{ _gdsForeignDirectory = path; }
|
||||
|
||||
|
||||
void LefParser::reset ()
|
||||
{
|
||||
_layerLut.clear();
|
||||
|
@ -226,9 +255,13 @@ namespace {
|
|||
LefParser::LefParser ( string file, string libraryName )
|
||||
: _file (file)
|
||||
, _libraryName (libraryName)
|
||||
, _library (NULL)
|
||||
, _cell (NULL)
|
||||
, _net (NULL)
|
||||
, _library (nullptr)
|
||||
, _foreignPath ()
|
||||
, _foreignPosition (Point(0,0))
|
||||
, _gdsPower (nullptr)
|
||||
, _gdsGround (nullptr)
|
||||
, _cell (nullptr)
|
||||
, _net (nullptr)
|
||||
, _busBits ("()")
|
||||
, _unitsMicrons (0.01)
|
||||
, _unmatchedLayers ()
|
||||
|
@ -236,8 +269,8 @@ namespace {
|
|||
, _nthMetal (0)
|
||||
, _nthCut (0)
|
||||
, _nthRouting (0)
|
||||
, _routingGauge (NULL)
|
||||
, _cellGauge (NULL)
|
||||
, _routingGauge (nullptr)
|
||||
, _cellGauge (nullptr)
|
||||
, _minTerminalWidth(DbU::fromPhysical(Cfg::getParamDouble("lefImport.minTerminalWidth",0.0)->asDouble(),DbU::UnitPower::Micro))
|
||||
{
|
||||
_routingGauge = AllianceFramework::get()->getRoutingGauge();
|
||||
|
@ -262,13 +295,14 @@ namespace {
|
|||
}
|
||||
|
||||
lefrInit();
|
||||
lefrSetUnitsCbk ( _unitsCbk );
|
||||
lefrSetLayerCbk ( _layerCbk );
|
||||
lefrSetSiteCbk ( _siteCbk );
|
||||
lefrSetObstructionCbk( _obstructionCbk );
|
||||
lefrSetMacroCbk ( _macroCbk );
|
||||
lefrSetMacroSiteCbk ( _macroSiteCbk );
|
||||
lefrSetPinCbk ( _pinCbk );
|
||||
lefrSetUnitsCbk ( _unitsCbk );
|
||||
lefrSetLayerCbk ( _layerCbk );
|
||||
lefrSetSiteCbk ( _siteCbk );
|
||||
lefrSetObstructionCbk ( _obstructionCbk );
|
||||
lefrSetMacroCbk ( _macroCbk );
|
||||
lefrSetMacroSiteCbk ( _macroSiteCbk );
|
||||
lefrSetMacroForeignCbk( _macroForeignCbk );
|
||||
lefrSetPinCbk ( _pinCbk );
|
||||
}
|
||||
|
||||
|
||||
|
@ -458,6 +492,20 @@ namespace {
|
|||
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 )
|
||||
{
|
||||
|
@ -550,6 +598,21 @@ namespace {
|
|||
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()) {
|
||||
width = parser->fromUnitsMicrons( macro->sizeX() );
|
||||
height = parser->fromUnitsMicrons( macro->sizeY() );
|
||||
|
@ -581,7 +644,7 @@ namespace {
|
|||
else parser->_pinPadPostProcess();
|
||||
parser->clearPinComponents();
|
||||
|
||||
cerr << " - " << cellName
|
||||
cerr << " o " << cellName
|
||||
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
|
||||
<< " " << gaugeName;
|
||||
if (isPad) cerr << " (PAD)";
|
||||
|
@ -612,10 +675,38 @@ namespace {
|
|||
|
||||
if (not parser->getCell()) parser->setCell( Cell::create( parser->getLibrary(true), "LefImportTmpCell" ) );
|
||||
|
||||
Net* net = Net::create( parser->getCell(), pin->name() );
|
||||
net->setExternal( true );
|
||||
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 (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()) {
|
||||
string lefDir = pin->direction();
|
||||
|
@ -626,17 +717,8 @@ namespace {
|
|||
if (lefDir == "OUTPUT TRISTATE") net->setDirection( Net::Direction::TRISTATE );
|
||||
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 (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
|
||||
|
||||
for ( int iport=0 ; iport < pin->numPorts() ; ++iport ) {
|
||||
Layer* layer = NULL;
|
||||
|
@ -727,27 +809,30 @@ namespace {
|
|||
const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 );
|
||||
Box ab = _cell->getAbutmentBox();
|
||||
|
||||
cerr << " @ _pinStdPostProcess" << endl;
|
||||
//cerr << " @ _pinStdPostProcess" << endl;
|
||||
|
||||
for ( auto element : _pinComponents ) {
|
||||
string pinName = element.first;
|
||||
vector<Component*>& components = element.second;
|
||||
vector<Segment*> ongrids;
|
||||
bool isSupply = false;
|
||||
|
||||
for ( Component* component : components ) {
|
||||
if (component->getNet()->isSupply()) {
|
||||
isSupply = true;
|
||||
break;
|
||||
}
|
||||
|
||||
Segment* segment = dynamic_cast<Segment*>( component );
|
||||
if (segment) {
|
||||
if (component->getNet()->isSupply()) continue;
|
||||
bool isWide = (segment->getWidth() >= getMinTerminalWidth());
|
||||
|
||||
cerr << " > " << segment << endl;
|
||||
if (not isVH())
|
||||
cerr << "NOT isVH()" << endl;
|
||||
else
|
||||
cerr << "isVH()" << endl;
|
||||
// cerr << " > " << segment << endl;
|
||||
// if (not isVH()) cerr << "X NOT isVH()" << endl;
|
||||
// else cerr << "X isVH()" << endl;
|
||||
|
||||
if (isVH() and (segment->getLayer()->getMask() == metal1->getMask())) {
|
||||
cerr << "isVH()" << endl;
|
||||
// cerr << "isVH()" << endl;
|
||||
Vertical* v = dynamic_cast<Vertical*>( segment );
|
||||
if (v) {
|
||||
DbU::Unit nearestX = gaugeMetal2->getTrackPosition( ab.getXMin()
|
||||
|
@ -775,7 +860,7 @@ namespace {
|
|||
, v->getDyTarget()
|
||||
)
|
||||
);
|
||||
//cerr << " | " << ongrids[ongrids.size()-1] << endl;
|
||||
cerr << " | " << ongrids[ongrids.size()-1] << endl;
|
||||
} else {
|
||||
// Unpitched and not wide enough to be under a metal2 track, ignore.
|
||||
}
|
||||
|
@ -788,11 +873,11 @@ namespace {
|
|||
if (isWide) ongrids.push_back( segment );
|
||||
}
|
||||
Rectilinear* rectilinear = dynamic_cast<Rectilinear*>( component );
|
||||
if (not (rectilinear->getLayer()->getMask() == metal1->getMask()))
|
||||
continue;
|
||||
|
||||
if (rectilinear) {
|
||||
cerr << " > " << rectilinear << endl;
|
||||
if (rectilinear->getLayer()->getMask() != metal1->getMask())
|
||||
continue;
|
||||
|
||||
vector<Box> boxes;
|
||||
rectilinear->getAsRectangles( boxes );
|
||||
|
||||
|
@ -841,8 +926,9 @@ namespace {
|
|||
}
|
||||
|
||||
if (ongrids.empty()) {
|
||||
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||
, pinName.c_str() ) << endl;
|
||||
if (not isSupply)
|
||||
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
|
||||
, pinName.c_str() ) << endl;
|
||||
for ( Component* component : components ) {
|
||||
NetExternalComponents::setExternal( component );
|
||||
}
|
||||
|
@ -1008,7 +1094,7 @@ namespace {
|
|||
if (parser->getCoreSiteY() != parser->getCellGauge()->getSliceHeight())
|
||||
cerr << Warning( "LefParser::parse(): CRL slice height discrepency %s while LEF is %s."
|
||||
, 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())
|
||||
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.
|
||||
|
|
|
@ -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).
|
||||
|
||||
|
||||
PyMethodDef PyLefImport_Methods[] =
|
||||
{ { "load" , (PyCFunction)PyLefImport_load , METH_VARARGS|METH_STATIC
|
||||
, "Load a complete Cadence LEF library." }
|
||||
, { "reset" , (PyCFunction)PyLefImport_reset , METH_NOARGS|METH_STATIC
|
||||
, "Reset the Cadence LEF parser (clear technology)." }
|
||||
, { "setMergeLibrary" , (PyCFunction)PyLefImport_setMergeLibrary, METH_VARARGS|METH_STATIC
|
||||
, "Merge into this library instead of creating a new one." }
|
||||
//, { "destroy" , (PyCFunction)PyLefImport_destroy , METH_VARARGS
|
||||
// , "Destroy the associated hurricane object. The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
{ { "load" , (PyCFunction)PyLefImport_load , METH_VARARGS|METH_STATIC
|
||||
, "Load a complete Cadence LEF library." }
|
||||
, { "reset" , (PyCFunction)PyLefImport_reset , METH_NOARGS|METH_STATIC
|
||||
, "Reset the Cadence LEF parser (clear technology)." }
|
||||
, { "setMergeLibrary" , (PyCFunction)PyLefImport_setMergeLibrary , METH_VARARGS|METH_STATIC
|
||||
, "Merge into this library instead of creating a new one." }
|
||||
, { "setGdsForeignDirectory", (PyCFunction)PyLefImport_setGdsForeignDirectory, METH_VARARGS|METH_STATIC
|
||||
, "Set the directory where to find FOREIGN GDS files." }
|
||||
//, { "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
|
||||
from ...helpers import trace, l, u, n
|
||||
from ...helpers.io import ErrorMessage, WarningMessage, catch
|
||||
from ...helpers.overlay import CfgCache, UpdateSession
|
||||
from ...helpers.overlay import CfgCache, CfgDefault, UpdateSession
|
||||
from .. import getParameter
|
||||
from ..rsave import rsave
|
||||
from ..utils import getPlugByName
|
||||
|
@ -80,7 +80,7 @@ class GaugeConf ( object ):
|
|||
self._plugToRp = { }
|
||||
self._rpToAccess = { }
|
||||
self._loadRoutingGauge()
|
||||
self._routingBb = Box()
|
||||
self._routingBb = Box()
|
||||
return
|
||||
|
||||
@property
|
||||
|
@ -744,7 +744,10 @@ class IoPadConf ( object ):
|
|||
else:
|
||||
if self._datas[5] is not None: self.flags |= IoPadConf.BIDIR
|
||||
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
|
||||
def side ( self ): return self._datas[0]
|
||||
|
@ -1400,6 +1403,8 @@ class BlockConf ( GaugeConf ):
|
|||
self.cfg.block.spareSide = None
|
||||
self.cfg.block.vRailsPeriod = None
|
||||
self.cfg.katana.dumpMeasures = None
|
||||
self.cfg.spares.htreeRootOffset = CfgDefault(3)
|
||||
self.cfg.spares.htreeOffset = CfgDefault(5)
|
||||
self.chipConf = ChipConf( self )
|
||||
self.etesian = None
|
||||
self.katana = None
|
||||
|
|
|
@ -45,7 +45,7 @@ def unbitify ( rawName ):
|
|||
|
||||
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 ):
|
||||
|
@ -106,7 +106,11 @@ class HTree ( object ):
|
|||
hLeafDepth = gaugeConf.horizontalDepth - 2
|
||||
gaugeConf.setStackPosition( contact, x, y )
|
||||
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:
|
||||
tl1Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[1], bufferConf.input, ckNet, GaugeConf.DeepDepth|GaugeConf.HAccess )
|
||||
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.tr and len(qt.tr.buffers) > 1):
|
||||
leafFlags |= GaugeConf.HAccess
|
||||
yoffset = 3
|
||||
yoffset = gaugeConf.cfg.spares.htreeRootOffset
|
||||
if not qt.isRoot():
|
||||
ckParentNet = qt.bInputPlug(0).getNet()
|
||||
driverContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.input, ckParentNet )
|
||||
driverY = driverContact.getY()
|
||||
yoffset = 5
|
||||
yoffset = gaugeConf.cfg.spares.htreeOffset
|
||||
trace( 550, '\tdriverContact={}\n'.format( driverContact ))
|
||||
if qt.bl:
|
||||
trace( 550, '+,', '\tblContact\n' )
|
||||
|
|
|
@ -1103,8 +1103,8 @@ class Spares ( object ):
|
|||
trace( 540, ',+', '\tSpares.addStrayBuffer()\n' )
|
||||
|
||||
sliceHeight = self.conf.sliceHeight
|
||||
x = self.quadTree.toXPitch( position.getX() )
|
||||
y = self.quadTree.toYSlice( position.getY() )
|
||||
x = self.toXPitch( position.getX() )
|
||||
y = self.toYSlice( position.getY() )
|
||||
slice = y // sliceHeight
|
||||
orientation = Transformation.Orientation.ID
|
||||
y = slice * sliceHeight
|
||||
|
@ -1134,6 +1134,37 @@ class Spares ( object ):
|
|||
raise ErrorMessage( 2, 'Spares.getFreeBufferUnder(): No more free buffers under {}.'.format(area) )
|
||||
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 ):
|
||||
"""
|
||||
Add a net through a whole hierarchy of Instance/Cells. The master cells
|
||||
|
|
|
@ -169,7 +169,7 @@ class Side ( object ):
|
|||
self.type = sideType
|
||||
self.corona = corona
|
||||
self.pins = []
|
||||
self.u = self.conf.ioPadHeight
|
||||
self.u = 0
|
||||
self.spacerCount = 0
|
||||
self.gap = 0
|
||||
self.coreWires = []
|
||||
|
@ -370,6 +370,10 @@ class Side ( object ):
|
|||
return
|
||||
|
||||
def _placePads ( self ):
|
||||
if self.type in (North,South):
|
||||
self.u = self.corona.padCornerWidth
|
||||
else:
|
||||
self.u = self.corona.padCornerHeight
|
||||
padLength = 0
|
||||
for pad in self.pads: padLength += pad[1].getMasterCell().getAbutmentBox().getWidth()
|
||||
padSpacing = (self.sideLength - 2*self.conf.ioPadHeight - padLength) // (len(self.pads) + 1)
|
||||
|
@ -551,6 +555,8 @@ class Corona ( object ):
|
|||
self.padCorner = []
|
||||
self.padRails = [] # [ , [net, layer, axis, width] ]
|
||||
self.powerCount = 0
|
||||
self.padCornerWidth = self.conf.ioPadHeight
|
||||
self.padCornerHeight = self.conf.ioPadHeight
|
||||
self.conf.cfg.chip.padCoreSide = None
|
||||
if self.conf.cfg.chip.padCoreSide.lower() == 'south':
|
||||
self.padOrient = Transformation.Orientation.MY
|
||||
|
@ -567,7 +573,9 @@ class Corona ( object ):
|
|||
raise ErrorMessage( 1, 'Corona.__init__(): Missing spacer cell "{}"'.format(spacerName) )
|
||||
self.padSpacers = sorted( self.padSpacers, key=_cmpPad, reverse=True )
|
||||
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:
|
||||
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.
|
||||
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
|
||||
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:~> 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
|
||||
script.
|
||||
|
@ -218,7 +218,7 @@ or ``/Linux.fc_64/`` (Fedora).
|
|||
|
||||
ego@home:~> mkdir -p 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
|
||||
script.
|
||||
|
|
|
@ -22,7 +22,7 @@ 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
|
||||
:cb:`Alliance Check Toolkit` https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git
|
||||
|Alliance| https://github.com/lip6/alliance.git
|
||||
|Coriolis| https://github.com/lip6/coriolis.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
|
||||
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::
|
||||
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: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:
|
||||
|
||||
|
@ -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: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:
|
||||
|
||||
|
|
|
@ -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.
|
||||
Sources are available through the following <span class="cb">git</span> repository:</p>
|
||||
<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
|
||||
is kept under <span class="cb">devel</span> (and will be merged into <span class="cb">master</span> from time
|
||||
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>
|
||||
<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:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
||||
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||
</pre></div>
|
||||
</li>
|
||||
<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>
|
||||
<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:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
|
||||
ego@home:src> git clone https://github.com/lip6/alliance.git
|
||||
</pre></div>
|
||||
</li>
|
||||
<li><p class="first">Compilation & installation. For that step, you can use the following shell
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<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="">
|
||||
<link rel="icon" href="../favicon.ico">
|
||||
|
||||
|
@ -134,13 +134,13 @@
|
|||
</thead>
|
||||
<tbody valign="top">
|
||||
<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><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><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>
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
@ -363,7 +363,7 @@ and Python modules (which must be dynamic).</p>
|
|||
<h4>The actively developed branch</h4>
|
||||
<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>
|
||||
<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">
|
||||
<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>
|
||||
|
@ -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>
|
||||
<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> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
||||
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||
</pre></div>
|
||||
</li>
|
||||
<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>
|
||||
<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> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
|
||||
dummy@lepka:src> git clone https://github.com/lip6/coriolis.git
|
||||
</pre></div>
|
||||
<p>Third and final step, build & install:</p>
|
||||
<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
|
||||
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::
|
||||
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: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:
|
||||
|
||||
|
@ -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: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:
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "hurricane/Plug.h"
|
||||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/Vertical.h"
|
||||
#include "hurricane/Horizontal.h"
|
||||
#include "hurricane/NetExternalComponents.h"
|
||||
#include "hurricane/Path.h"
|
||||
#include "hurricane/Library.h"
|
||||
|
@ -50,6 +51,7 @@ namespace Etesian {
|
|||
using Hurricane::Plug;
|
||||
using Hurricane::RoutingPad;
|
||||
using Hurricane::Vertical;
|
||||
using Hurricane::Horizontal;
|
||||
using Hurricane::NetExternalComponents;
|
||||
using Hurricane::DebugSession;
|
||||
using Hurricane::UpdateSession;
|
||||
|
@ -57,6 +59,8 @@ namespace Etesian {
|
|||
using CRL::CatalogExtension;
|
||||
using CRL::getTransformation;
|
||||
using CRL::RoutingLayerGauge;
|
||||
using Constant::LayerGaugeType;
|
||||
using Constant::Direction;
|
||||
using Etesian::EtesianEngine;
|
||||
|
||||
|
||||
|
@ -146,7 +150,7 @@ namespace Etesian {
|
|||
return;
|
||||
}
|
||||
|
||||
list<Tile>::iterator imerge = _tiles.end();
|
||||
//list<Tile>::iterator imerge = _tiles.end();
|
||||
for ( auto itile = _tiles.begin() ; itile != _tiles.end() ; ++itile ) {
|
||||
if ((*itile).getXMin() > flatAb.getXMin()) {
|
||||
_tiles.insert( itile, Tile(flatAb.getXMin(), flatAb.getWidth(), occurrence) );
|
||||
|
@ -630,12 +634,15 @@ namespace Etesian {
|
|||
if (not component->getLayer()->isBlockage()) continue;
|
||||
cdebug_log(121,0) << "Looking at " << component << endl;
|
||||
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 (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 );
|
||||
Transformation transf = tile.getInstance()->getTransformation();
|
||||
tile.getOccurrence().getPath().getTransformation().applyOn( transf );
|
||||
|
|
|
@ -9,11 +9,11 @@
|
|||
"rev": "0e5744fd98acadee44bc5cfc4949146f1d30506f",
|
||||
"revCount": 291,
|
||||
"type": "git",
|
||||
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
|
||||
"url": "https://github.com/lip6/alliance-check-toolkit.git"
|
||||
},
|
||||
"original": {
|
||||
"type": "git",
|
||||
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
|
||||
"url": "https://github.com/lip6/alliance-check-toolkit.git"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
# Nixpkgs / NixOS version to use.
|
||||
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.soclayout.url = "git+https://git.libre-soc.org/git/soclayout.git";
|
||||
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
|
||||
{
|
||||
Inherit::_toJson( writer );
|
||||
|
|
|
@ -60,6 +60,7 @@ namespace Hurricane {
|
|||
inline Points getContour () const;
|
||||
bool getAsRectangles ( std::vector<Box>& ) const;
|
||||
inline const vector<Point>& getPoints () const;
|
||||
Box getNearestHSide ( DbU::Unit y ) const;
|
||||
// Mutators.
|
||||
void setLayer ( const Layer* );
|
||||
virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
|
||||
|
|
Loading…
Reference in New Issue