Compare commits

..

21 Commits

Author SHA1 Message Date
Jean-Paul Chaput 8a45ed1e9e Merge branch 'master' of github.com:lip6/coriolis 2023-07-19 16:30:01 +02:00
Jean-Paul Chaput a14a96f9ed Allow the Y position of the H-Tree horizontal branch to be set.
* Change: In cumulus.block.configuration and cumulus.block.htree, two new
    configuration parameters allow to specify the offset of the horizontal
    branch of the H-Tree manually:
        cfg.spares.htreeRootOffset (first level of the tree)
        cfg.spares.htreeOffset     (subsequent levels)
      The offset is given in number of tracks.
2023-07-19 16:15:22 +02:00
Jean-Paul Chaput d819d46031 Allow weak default values in helpers.overlay.CachedParameter.
* New: In helpers.overlay.CfgDefault, new class that can be used to give
    a default value to a cached configuration parameter. The default
    value will be used as a last ditch fallback and used *only if* no
    default value can be fetched from the C++ database (disk).
2023-07-19 16:10:27 +02:00
Jean-Paul Chaput 892661ca2a Support of the FOREIGN directive in LEF files (using GDS view).
* New: In LefImport, add setGdsForeignDirectory() to point out from where
    to load the extra GDS file in case a FOREIGN directory is present
    in MACRO.
      Also add support for merging the supply nets. It may happens that
    the supply nets have different names in the GDS ("vdd!") and LEF files
    ("pvdd"), in that case, the LEF name supersede the GDS one.
      The GDS file will be loaded *first* then completed by the LEF contents.
      Blockage in the GDS file are *not* loaded.
* Change: In GdsParser, perform an early recognition of supply nets. For now
    it's hardwired to names starting by "vdd" and "gnd", but should be
    parametrized in the future.
      Needed for the LefImport to merge, if needed, the power supplies.
      In GdsStream::xyToComponent(), skip the blockage if required.
2023-07-19 16:06:43 +02:00
Gabriel Gouvine 68f56c1361
Merge pull request #2 from ChipFlow/robtaylor/room-link
Add chat room link
2023-07-18 11:22:42 +02:00
Rob Taylor c9cbf87c10
Merge branch 'master' into robtaylor/room-link 2023-07-17 18:57:44 +01:00
Jean-Paul Chaput d5f25940a4 Merge branch 'master' of github.com:lip6/coriolis 2023-07-17 15:22:32 +02:00
Jean-Paul Chaput 46d81c5cb0 Change policy for vertical track protection of the H-Tree.
Formerly we were using Placement::Area::TrackAvoid() to shift cells terminals
out of the way of the reserved vertical track. With double height cells,
this is coming more complex and due to heavy tracks uses in some cells,
the shift required may becomes too great. Instead, we place filler cells
just underneath the reserved track to prevent their usage. This is a
supplemental constraint on the router, but the new version manage it
correctly.

* New: In cumulus/block.spares.Spares.trackAvoid() to place filler cells
    under a given vertical area.
2023-07-17 15:12:56 +02:00
Jean-Paul Chaput 6401f0d455 In SubSlice::getUsedVTRacks() only consider obstacles in the first V gauge. 2023-07-17 15:06:51 +02:00
Jean-Paul Chaput bf5d4e881d More aggressive detection of supply pin in LefImport.
* Change: In LefImport::_pinCbk(), if a pin has "USE POWER" or "USE GROUND"
    make it a global signal (previously flagged only "!" appended to name).
* Change: In LefImport::_pinStdPostProcess() do not try to find "on grid"
    components for supply nets, just make all their components externals.
2023-07-17 15:04:12 +02:00
Jean-Paul Chaput 32a4b426b9
Merge pull request #1 from ChipFlow/robtaylor/update-readme
Update repo locations for github move
2023-07-17 11:05:20 +02:00
Robert Taylor 9982f21f56 Update repo references in code to point to github 2023-07-16 19:24:53 +00:00
Robert Taylor fe37bb1552 Update readme for new project location 2023-07-16 19:24:53 +00:00
Jean-Paul Chaput d0f0cdc47d In cumulus/chip.pads, now support non-square corner I/O pads. 2023-07-15 21:26:13 +02:00
Jean-Paul Chaput 9d98c9aafd Allow Rectilinear to be tagged as external components in GdsParser. 2023-07-15 21:24:38 +02:00
Jean-Paul Chaput 77463c4803 New Rectilinear::getNearestHSide() function.
* New: In Rectilinear::getNearestHSide(), returns the *horizontal* side
    of a polygon which is closest to a given Y coordinate.
      Unused for now.
2023-07-15 21:23:42 +02:00
Robert Taylor fc3def2df9 Add link to matrix room 2023-07-15 00:24:42 +00:00
Robert Taylor e093cc4dcb Update repo references in code to point to github 2023-07-15 00:23:10 +00:00
Robert Taylor afee14b3b5 Update readme for new project location 2023-07-14 21:34:21 +00:00
Jean-Paul Chaput 7c0b61e669 Finally put the *master* branch up to date. Will stay on it for now on. 2023-07-14 12:49:20 +02:00
Jean-Paul Chaput 3db5f27aec Adjust parameters of socInstaler.py to re-enable nightly builds on bop. 2019-05-28 15:37:10 +02:00
27 changed files with 364 additions and 134 deletions

View File

@ -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: ::

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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 );

View File

@ -32,6 +32,7 @@ namespace CRL {
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 );
}; };

View File

@ -1079,6 +1079,9 @@ namespace {
if (not net) { if (not net) {
net = Net::create( _cell, _text ); net = Net::create( _cell, _text );
net->setExternal( true ); net->setExternal( true );
if (_text.substr(0,3) == "vdd") net->setType ( Net::Type::POWER );
if (_text.substr(0,3) == "gnd") net->setType ( Net::Type::GROUND );
if (_text[ _text.size()-1 ] == '!') net->setGlobal( true );
} }
addNetReference( net, layer, xpos, ypos ); addNetReference( net, layer, xpos, ypos );
} }
@ -1513,11 +1516,17 @@ namespace {
if (not net) { if (not net) {
net = Net::create( _cell, _text ); net = Net::create( _cell, _text );
net->setExternal( true ); net->setExternal( true );
if (_text.substr(0,3) == "vdd") net->setType ( Net::Type::POWER );
if (_text.substr(0,3) == "gnd") net->setType ( Net::Type::GROUND );
if (_text[ _text.size()-1 ] == '!') net->setGlobal( true );
} }
} }
} else } else
_skipENDEL = true; _skipENDEL = true;
if (layer->isBlockage() and (_flags & Gds::NoBlockages))
return;
if (not net) net = fusedNet(); if (not net) net = fusedNet();
if (points.size() > 2) { if (points.size() > 2) {
@ -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;
}
} }
} }
} }

View File

@ -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;
@ -116,17 +126,23 @@ namespace {
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 _macroForeignCbk ( lefrCallbackType_e, const lefiMacroForeign*, lefiUserData );
static int _pinCbk ( lefrCallbackType_e, lefiPin* , 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();
@ -265,9 +298,10 @@ namespace {
lefrSetUnitsCbk ( _unitsCbk ); lefrSetUnitsCbk ( _unitsCbk );
lefrSetLayerCbk ( _layerCbk ); lefrSetLayerCbk ( _layerCbk );
lefrSetSiteCbk ( _siteCbk ); lefrSetSiteCbk ( _siteCbk );
lefrSetObstructionCbk( _obstructionCbk ); lefrSetObstructionCbk ( _obstructionCbk );
lefrSetMacroCbk ( _macroCbk ); lefrSetMacroCbk ( _macroCbk );
lefrSetMacroSiteCbk ( _macroSiteCbk ); lefrSetMacroSiteCbk ( _macroSiteCbk );
lefrSetMacroForeignCbk( _macroForeignCbk );
lefrSetPinCbk ( _pinCbk ); 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 (pin->name()[ strlen(pin->name())-1 ] == '!') net->setGlobal( true ); if (lefUse == "SIGNAL") netType = Net::Type::LOGICAL;
//if (lefUse == "ANALOG") netType = Net::Type::ANALOG;
if (lefUse == "CLOCK" ) netType = Net::Type::CLOCK;
if (lefUse == "POWER" ) netType = Net::Type::POWER;
if (lefUse == "GROUND") netType = Net::Type::GROUND;
}
if ((netType == Net::Type::POWER) and parser->getGdsPower()) {
net = parser->getGdsPower();
cerr << " - Renaming GDS power net \"" << net->getName() << "\""
<< " to LEF name \"" << pin->name() << "\"." << endl;
net->setName( pin->name() );
parser->setGdsPower( nullptr );
} else {
if ((netType == Net::Type::GROUND) and parser->getGdsGround()) {
net = parser->getGdsGround();
cerr << " - Renaming GDS ground net \"" << net->getName() << "\""
<< " to LEF name \"" << pin->name() << "\"." << endl;
net->setName( pin->name() );
parser->setGdsGround( nullptr );
} else {
net = Net::create( parser->getCell(), pin->name() );
}
}
net->setExternal( true );
net->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,6 +926,7 @@ namespace {
} }
if (ongrids.empty()) { if (ongrids.empty()) {
if (not isSupply)
cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid." cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid."
, pinName.c_str() ) << endl; , pinName.c_str() ) << endl;
for ( Component* component : components ) { for ( Component* component : components ) {
@ -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.

View File

@ -109,6 +109,22 @@ 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).
@ -117,8 +133,10 @@ extern "C" {
, "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." }
, { "setGdsForeignDirectory", (PyCFunction)PyLefImport_setGdsForeignDirectory, METH_VARARGS|METH_STATIC
, "Set the directory where to find FOREIGN GDS files." }
//, { "destroy" , (PyCFunction)PyLefImport_destroy , METH_VARARGS //, { "destroy" , (PyCFunction)PyLefImport_destroy , METH_VARARGS
// , "Destroy the associated hurricane object. The python object remains." } // , "Destroy the associated hurricane object. The python object remains." }
, {NULL, NULL, 0, NULL} /* sentinel */ , {NULL, NULL, 0, NULL} /* sentinel */

View File

@ -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
@ -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

View File

@ -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' )

View File

@ -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

View File

@ -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
@ -568,6 +574,8 @@ class Corona ( object ):
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

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. 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.

View File

@ -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
================================ ======================================================= ================================ =======================================================

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 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:

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

View File

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

View File

@ -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 );

View File

@ -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": {

View File

@ -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;

View File

@ -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 );

View File

@ -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 );