Compare commits

..

No commits in common. "master" and "devel" have entirely different histories.

27 changed files with 134 additions and 364 deletions

View File

@ -7,10 +7,6 @@ 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
=======
@ -59,7 +55,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://github.com/lip6/coriolis
ego@home:src$ git clone https://gitlab.lip6.fr/vlsi-eda/coriolis.git
ego@home:src$ cd coriolis
Then, build the tool: ::

View File

@ -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://github.com/lip6/alliance.git'
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.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._homeDir = os.environ['HOME']
self._debugArg = ''
self._rmSource = False

View File

@ -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://github.com/lip6/alliance.git'
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.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._homeDir = os.environ['HOME']
self._debugArg = ''
self._rmSource = False

View File

@ -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://github.com/lip6/alliance.git'
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.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._homeDir = os.environ['HOME']
self._debugArg = ''
self._rmSource = False

View File

@ -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://github.com/lip6/alliance.git'
self._coriolisRepo = 'https://github.com/lip6/coriolis.git'
self._benchsRepo = 'https://github.com/lip6/alliance-check-toolkit.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._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.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.doCoriolis:
if conf.rmSource: gitCoriolis.removeLocalRepo()
gitCoriolis.clone ()
gitCoriolis.checkout( 'devel' )
gitCoriolis.submoduleInit()
gitCoriolis.submoduleUpdate()
if conf.rmSource: gitBenchs.removeLocalRepo()
gitBenchs.clone()

View File

@ -92,32 +92,15 @@ 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.vRange = [ None, None ]
self.vEnum = []
self.create = True
if not isinstance(v,CfgDefault):
self.v = v
self.path = path
self._v = None
self.v = v
self.vRange = [ None, None ]
self.vEnum = []
self.create = True
self.cacheRead()
@property
@ -125,12 +108,7 @@ class CachedParameter ( object ):
@v.setter
def v ( self, value ):
if value is None: return
if isinstance(value,CfgDefault):
if self._v is None:
self._v = value.vDefault
return
self._v = value
if value is not None: self._v = value
def __str__ ( self ):
if isinstance(self.v,str): s = '"{}"'.format(self.v)
@ -347,7 +325,7 @@ class CfgCache ( object ):
def display ( self ):
"""Print all the parameters stored in that CfgCache."""
if not len(self._path):
print( ' o Configuration contents (CfgCache):' )
print( ' o Applying configuration (CfgCache):' )
for attrName in self._rattr.keys():
if isinstance(self._rattr[attrName],CfgCache):
self._rattr[attrName].display()

View File

@ -33,7 +33,6 @@ 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 );

View File

@ -29,10 +29,9 @@ namespace CRL {
class LefImport {
public:
static void reset ();
static Hurricane::Library* load ( std::string fileName );
static void setMergeLibrary ( Hurricane::Library* );
static void setGdsForeignDirectory ( std::string path );
static void reset ();
static Hurricane::Library* load ( std::string fileName );
static void setMergeLibrary ( Hurricane::Library* );
};

View File

@ -1079,9 +1079,6 @@ 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 );
}
@ -1516,17 +1513,11 @@ 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 (layer->isBlockage() and (_flags & Gds::NoBlockages))
return;
if (not net) net = fusedNet();
if (points.size() > 2) {
@ -1791,18 +1782,6 @@ 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;
}
}
}
}

View File

@ -43,7 +43,6 @@
#include "crlcore/CellGauge.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/LefImport.h"
#include "crlcore/Gds.h"
#if defined(HAVE_LEFDEF)
@ -74,7 +73,6 @@ 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* );
@ -87,14 +85,6 @@ 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;
@ -123,26 +113,20 @@ 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 _macroForeignCbk ( lefrCallbackType_e, const lefiMacroForeign*, 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 _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;
@ -168,14 +152,6 @@ 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; }
@ -201,7 +177,6 @@ namespace {
inline void LefParser::clearPinComponents () { _pinComponents.clear(); }
string LefParser::_gdsForeignDirectory = "";
Library* LefParser::_mergeLibrary = nullptr;
map<string,Layer*> LefParser::_layerLut;
DbU::Unit LefParser::_coreSiteX = 0;
@ -212,10 +187,6 @@ namespace {
{ _mergeLibrary = library; }
void LefParser::setGdsForeignDirectory ( string path )
{ _gdsForeignDirectory = path; }
void LefParser::reset ()
{
_layerLut.clear();
@ -255,13 +226,9 @@ namespace {
LefParser::LefParser ( string file, string libraryName )
: _file (file)
, _libraryName (libraryName)
, _library (nullptr)
, _foreignPath ()
, _foreignPosition (Point(0,0))
, _gdsPower (nullptr)
, _gdsGround (nullptr)
, _cell (nullptr)
, _net (nullptr)
, _library (NULL)
, _cell (NULL)
, _net (NULL)
, _busBits ("()")
, _unitsMicrons (0.01)
, _unmatchedLayers ()
@ -269,8 +236,8 @@ namespace {
, _nthMetal (0)
, _nthCut (0)
, _nthRouting (0)
, _routingGauge (nullptr)
, _cellGauge (nullptr)
, _routingGauge (NULL)
, _cellGauge (NULL)
, _minTerminalWidth(DbU::fromPhysical(Cfg::getParamDouble("lefImport.minTerminalWidth",0.0)->asDouble(),DbU::UnitPower::Micro))
{
_routingGauge = AllianceFramework::get()->getRoutingGauge();
@ -295,14 +262,13 @@ namespace {
}
lefrInit();
lefrSetUnitsCbk ( _unitsCbk );
lefrSetLayerCbk ( _layerCbk );
lefrSetSiteCbk ( _siteCbk );
lefrSetObstructionCbk ( _obstructionCbk );
lefrSetMacroCbk ( _macroCbk );
lefrSetMacroSiteCbk ( _macroSiteCbk );
lefrSetMacroForeignCbk( _macroForeignCbk );
lefrSetPinCbk ( _pinCbk );
lefrSetUnitsCbk ( _unitsCbk );
lefrSetLayerCbk ( _layerCbk );
lefrSetSiteCbk ( _siteCbk );
lefrSetObstructionCbk( _obstructionCbk );
lefrSetMacroCbk ( _macroCbk );
lefrSetMacroSiteCbk ( _macroSiteCbk );
lefrSetPinCbk ( _pinCbk );
}
@ -492,20 +458,6 @@ 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 )
{
@ -598,21 +550,6 @@ 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() );
@ -644,7 +581,7 @@ namespace {
else parser->_pinPadPostProcess();
parser->clearPinComponents();
cerr << " o " << cellName
cerr << " - " << cellName
<< " " << DbU::getValueString(width) << " " << DbU::getValueString(height)
<< " " << gaugeName;
if (isPad) cerr << " (PAD)";
@ -675,38 +612,10 @@ namespace {
if (not parser->getCell()) parser->setCell( Cell::create( parser->getLibrary(true), "LefImportTmpCell" ) );
Net* net = nullptr;
Net::Type netType = Net::Type::UNDEFINED;
if (pin->hasUse()) {
string lefUse = pin->use();
boost::to_upper( lefUse );
if (lefUse == "SIGNAL") netType = Net::Type::LOGICAL;
//if (lefUse == "ANALOG") netType = Net::Type::ANALOG;
if (lefUse == "CLOCK" ) netType = Net::Type::CLOCK;
if (lefUse == "POWER" ) netType = Net::Type::POWER;
if (lefUse == "GROUND") netType = Net::Type::GROUND;
}
if ((netType == Net::Type::POWER) and parser->getGdsPower()) {
net = parser->getGdsPower();
cerr << " - Renaming GDS power net \"" << net->getName() << "\""
<< " to LEF name \"" << pin->name() << "\"." << endl;
net->setName( pin->name() );
parser->setGdsPower( nullptr );
} else {
if ((netType == Net::Type::GROUND) and parser->getGdsGround()) {
net = parser->getGdsGround();
cerr << " - Renaming GDS ground net \"" << net->getName() << "\""
<< " to LEF name \"" << pin->name() << "\"." << endl;
net->setName( pin->name() );
parser->setGdsGround( nullptr );
} else {
net = Net::create( parser->getCell(), pin->name() );
}
}
Net* net = Net::create( parser->getCell(), pin->name() );
net->setExternal( true );
net->setType ( netType );
if (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
if (pin->hasDirection()) {
string lefDir = pin->direction();
@ -717,8 +626,17 @@ namespace {
if (lefDir == "OUTPUT TRISTATE") net->setDirection( Net::Direction::TRISTATE );
if (lefDir == "INOUT" ) net->setDirection( Net::Direction::INOUT );
}
if (net->isSupply()) net->setGlobal( true );
if (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true );
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 );
}
for ( int iport=0 ; iport < pin->numPorts() ; ++iport ) {
Layer* layer = NULL;
@ -809,30 +727,27 @@ 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 << "X NOT isVH()" << endl;
// else cerr << "X isVH()" << endl;
cerr << " > " << segment << endl;
if (not isVH())
cerr << "NOT isVH()" << endl;
else
cerr << "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()
@ -860,7 +775,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.
}
@ -873,11 +788,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 );
@ -926,9 +841,8 @@ namespace {
}
if (ongrids.empty()) {
if (not isSupply)
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
, pinName.c_str() ) << endl;
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
, pinName.c_str() ) << endl;
for ( Component* component : components ) {
NetExternalComponents::setExternal( component );
}
@ -1094,7 +1008,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->getCoreSiteY()).c_str() ) << endl;
, DbU::getValueString(parser->getCoreSiteX()).c_str() ) << endl;
if (parser->getCoreSiteX() != parser->getCellGauge()->getSliceStep())
cerr << Warning( "LefParser::parse(): CRL slice step discrepency %s while LEF is %s."
@ -1154,12 +1068,4 @@ namespace CRL {
}
void LefImport::setGdsForeignDirectory ( string path )
{
#if defined(HAVE_LEFDEF)
LefParser::setGdsForeignDirectory( path );
#endif
}
} // End of CRL namespace.

View File

@ -109,37 +109,19 @@ 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." }
, { "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 */
{ { "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 */
};

View File

@ -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, CfgDefault, UpdateSession
from ...helpers.overlay import CfgCache, 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,10 +744,7 @@ 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
sPos = ''
if self._datas[1]:
sPos = DbU.getValueString(self._datas[1])
trace( 550, '\tIoPadConf._datas: @{} {}\n'.format(sPos,self._datas) )
trace( 550, '\tIoPadConf._datas: {}\n'.format(self._datas) )
@property
def side ( self ): return self._datas[0]
@ -1403,8 +1400,6 @@ 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

View File

@ -45,7 +45,7 @@ def unbitify ( rawName ):
class HTree ( object ):
"""
Build a H-Tree on a net occurrence.
Build a H-Tree on a net occurrene.
"""
def __init__ ( self, spares, treeNetOcc, index, flags ):
@ -106,11 +106,7 @@ class HTree ( object ):
hLeafDepth = gaugeConf.horizontalDepth - 2
gaugeConf.setStackPosition( contact, x, y )
gaugeConf.createVertical ( contact, forkContact, x, 0 )
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 )
gaugeConf.addTrackAvoid( Box( x, forkContact.getY(), x, y ) )
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 )
@ -159,12 +155,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 = gaugeConf.cfg.spares.htreeRootOffset
yoffset = 3
if not qt.isRoot():
ckParentNet = qt.bInputPlug(0).getNet()
driverContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.input, ckParentNet )
driverY = driverContact.getY()
yoffset = gaugeConf.cfg.spares.htreeOffset
yoffset = 5
trace( 550, '\tdriverContact={}\n'.format( driverContact ))
if qt.bl:
trace( 550, '+,', '\tblContact\n' )

View File

@ -1103,8 +1103,8 @@ class Spares ( object ):
trace( 540, ',+', '\tSpares.addStrayBuffer()\n' )
sliceHeight = self.conf.sliceHeight
x = self.toXPitch( position.getX() )
y = self.toYSlice( position.getY() )
x = self.quadTree.toXPitch( position.getX() )
y = self.quadTree.toYSlice( position.getY() )
slice = y // sliceHeight
orientation = Transformation.Orientation.ID
y = slice * sliceHeight
@ -1134,37 +1134,6 @@ 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

View File

@ -169,7 +169,7 @@ class Side ( object ):
self.type = sideType
self.corona = corona
self.pins = []
self.u = 0
self.u = self.conf.ioPadHeight
self.spacerCount = 0
self.gap = 0
self.coreWires = []
@ -370,10 +370,6 @@ 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)
@ -555,8 +551,6 @@ 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
@ -573,9 +567,7 @@ 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.padCornerWidth = self.padCorner.getAbutmentBox().getWidth()
self.padCornerHeight = self.padCorner.getAbutmentBox().getHeight()
self.padCorner = self.padLib.getCell( self.conf.cfg.chip.padCorner )
if self.conf.cfg.chip.minPadSpacing is None:
self.conf.cfg.chip.minPadSpacing = 0

View File

@ -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://github.com/lip6/alliance.git
https://gitlab.lip6.fr/jpc/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://github.com/lip6/alliance.git
ego@home:src> git clone https://gitlab.lip6.fr/jpc/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://github.com/lip6/alliance.git
ego@home:src> git clone https://gitlab.lip6.fr/jpc/alliance.git
3. Compilation & installation. For that step, you can use the following shell
script.

View File

@ -22,7 +22,7 @@ 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
:cb:`Alliance Check Toolkit` https://github.com/lip6/alliance-check-toolkit.git
|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
================================ =======================================================

View File

@ -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://github.com/lip6/coriolis.git
The |Coriolis| |git| repository is https://gitlab.lip6.fr/vlsi-cad/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://github.com/lip6/coriolis.git
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/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://github.com/lip6/coriolis.git
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
Third and final step, build & install:

View File

@ -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://github.com/lip6/alliance.git">https://github.com/lip6/alliance.git</a></blockquote>
<a class="reference external" href="https://gitlab.lip6.fr/jpc/alliance.git">https://gitlab.lip6.fr/jpc/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:~&gt; mkdir -p coriolis-2.x/src
ego@home:~&gt; <span class="nb">cd</span> coriolis-2.x/src
ego@home:src&gt; git clone https://github.com/lip6/alliance.git
ego@home:src&gt; git clone https://gitlab.lip6.fr/jpc/alliance.git
</pre></div>
</li>
<li><p class="first">Compilation &amp; 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:~&gt; mkdir -p coriolis-2.x/src
ego@home:~&gt; <span class="nb">cd</span> coriolis-2.x/src
ego@home:src&gt; git clone https://github.com/lip6/alliance.git
ego@home:src&gt; git clone https://gitlab.lip6.fr/jpc/alliance.git
</pre></div>
</li>
<li><p class="first">Compilation &amp; installation. For that step, you can use the following shell

View File

@ -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://github.com/lip6/alliance.git Coriolis https://github.com/lip6/coriolis.git Alliance...">
<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="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://github.com/lip6/alliance.git">https://github.com/lip6/alliance.git</a></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>
</tr>
<tr><td><span class="sc">Coriolis</span></td>
<td><a class="reference external" href="https://github.com/lip6/coriolis.git">https://github.com/lip6/coriolis.git</a></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>
</tr>
<tr><td><span class="cb">Alliance Check Toolkit</span></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>
<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>
</tr>
</tbody>
</table>

View File

@ -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://github.com/lip6/coriolis.git">https://github.com/lip6/coriolis.git</a></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>
<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&gt; 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:~&gt; mkdir -p ~/coriolis-2.x/src
dummy@lepka:src&gt; <span class="nb">cd</span> ~/coriolis-2.x/src
dummy@lepka:src&gt; git clone https://github.com/lip6/coriolis.git
dummy@lepka:src&gt; git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
</pre></div>
</li>
<li><p class="first">Build &amp; 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:~&gt; mkdir -p ~/coriolis-2.x/src
dummy@lepka:src&gt; <span class="nb">cd</span> ~/coriolis-2.x/src
dummy@lepka:src&gt; git clone https://github.com/lip6/coriolis.git
dummy@lepka:src&gt; git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
</pre></div>
<p>Third and final step, build &amp; install:</p>
<div class="highlight"><pre><span></span>dummy@lepka:src&gt; <span class="nb">cd</span> coriolis

View File

@ -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://github.com/lip6/coriolis.git
The |Coriolis| |git| repository is https://gitlab.lip6.fr/vlsi-cad/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://github.com/lip6/coriolis.git
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/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://github.com/lip6/coriolis.git
dummy@lepka:src> git clone https://gitlab.lip6.fr/vlsi-cad/coriolis.git
Third and final step, build & install:

View File

@ -24,7 +24,6 @@
#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"
@ -51,7 +50,6 @@ namespace Etesian {
using Hurricane::Plug;
using Hurricane::RoutingPad;
using Hurricane::Vertical;
using Hurricane::Horizontal;
using Hurricane::NetExternalComponents;
using Hurricane::DebugSession;
using Hurricane::UpdateSession;
@ -59,8 +57,6 @@ namespace Etesian {
using CRL::CatalogExtension;
using CRL::getTransformation;
using CRL::RoutingLayerGauge;
using Constant::LayerGaugeType;
using Constant::Direction;
using Etesian::EtesianEngine;
@ -150,7 +146,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) );
@ -634,15 +630,12 @@ namespace Etesian {
if (not component->getLayer()->isBlockage()) continue;
cdebug_log(121,0) << "Looking at " << component << endl;
Vertical* v = dynamic_cast<Vertical*>( component );
if ( not dynamic_cast<Vertical* >(component)
and not dynamic_cast<Horizontal*>(component)) continue;
if (not v) continue;
RoutingLayerGauge* rlg = rg->getLayerGauge( component->getLayer()->getRoutingLayer() );
RoutingLayerGauge* rlg = rg->getLayerGauge( v->getLayer()->getRoutingLayer() );
if (not rlg) continue;
if (rlg->getType() != LayerGaugeType::Default) continue;
if (rlg->getDirection() != Direction::Vertical) continue;
Box bb = component->getBoundingBox();
Box bb = v->getBoundingBox();
bb.inflate( -rlg->getWireWidth()/2, 0 );
Transformation transf = tile.getInstance()->getTransformation();
tile.getOccurrence().getPath().getTransformation().applyOn( transf );

View File

@ -9,11 +9,11 @@
"rev": "0e5744fd98acadee44bc5cfc4949146f1d30506f",
"revCount": 291,
"type": "git",
"url": "https://github.com/lip6/alliance-check-toolkit.git"
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
},
"original": {
"type": "git",
"url": "https://github.com/lip6/alliance-check-toolkit.git"
"url": "https://gitlab.lip6.fr/vlsi-eda/alliance-check-toolkit.git"
}
},
"nixpkgs": {

View File

@ -5,7 +5,7 @@
# Nixpkgs / NixOS version to use.
inputs.nixpkgs.url = "github:NixOS/nixpkgs"; # for alliance
inputs.alliance-check-toolkit.url = "git+https://github.com/lip6/alliance-check-toolkit.git";
inputs.alliance-check-toolkit.url = "git+https://gitlab.lip6.fr/vlsi-eda/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;

View File

@ -479,19 +479,6 @@ 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 );

View File

@ -60,7 +60,6 @@ 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 );