Support for non-square routing pitch. Allow loading of "foreign" cells.

* New: In CRL Core, AllianceFramework::getCell(), adds a new Catalog::State
    flags to request the loading of a "foreign" cell. That is, a Cell which
    is *not* in the Alliance libraries, but in *any* library starting from
    the root library. This is a temporary hack to allow the Blif parser to
    run.
* New: In CRL Core, RoutingGauge::getHorizontalGauge() and
    RoutingGauge::getVerticalGauge() to avoid relying on either metal names
    or depth to know the vertical and horizontal default routing
    informations. They return the metal layers gauges *closests* to the
    substrate which are likely to have the lesser pitch.
* New: In CRL Core, BlifParser, new configuration parameters:
    "etesian.cell.zero" & "etesian.cell.one" to figure out what are the
    tielow and tiehigh cells (instead of having the ones from sxlib
    hardwired).
* New: In Etesian, add support for non-square routing pitchs, that is,
    the lowest vertical and horizontal pitches are not equal. Needs to
    work with two pitches (H & V) instead of one.
      The Configuration associated class now also provides the
    RoutingGauge (not only the CellGauge).
      Use a new Configuration setting "etesian.feedNames" to set up
    the names of the filler cells. This a string of comma separated
    cell names.
* New: In Anabatic, Session::_getNearestGridPoint(), use the new
    non-square grid scheme.
This commit is contained in:
Jean-Paul Chaput 2017-11-26 20:31:38 +01:00
parent 0f74ff7029
commit e51ff95337
15 changed files with 288 additions and 184 deletions

View File

@ -341,7 +341,7 @@ namespace Anabatic {
{ {
Box ab = _anabatic->getCell()->getAbutmentBox(); Box ab = _anabatic->getCell()->getAbutmentBox();
RoutingLayerGauge* lg = _routingGauge->getLayerGauge( 1 ); RoutingLayerGauge* lg = _routingGauge->getVerticalGauge();
DbU::Unit x = lg->getTrackPosition( ab.getXMin() DbU::Unit x = lg->getTrackPosition( ab.getXMin()
, lg->getTrackIndex( ab.getXMin() , lg->getTrackIndex( ab.getXMin()
, ab.getXMax() , ab.getXMax()
@ -350,7 +350,7 @@ namespace Anabatic {
if (x < constraint.getXMin()) x += lg->getPitch(); if (x < constraint.getXMin()) x += lg->getPitch();
if (x > constraint.getXMax()) x -= lg->getPitch(); if (x > constraint.getXMax()) x -= lg->getPitch();
lg = _routingGauge->getLayerGauge( 2 ); lg = _routingGauge->getHorizontalGauge();
DbU::Unit y = lg->getTrackPosition( ab.getYMin() DbU::Unit y = lg->getTrackPosition( ab.getYMin()
, lg->getTrackIndex( ab.getYMin() , lg->getTrackIndex( ab.getYMin()
, ab.getYMax() , ab.getYMax()

View File

@ -130,12 +130,7 @@ def coriolisConfigure():
print ' - Loading \"%s\".' % helpers.truncPath(confFile) print ' - Loading \"%s\".' % helpers.truncPath(confFile)
execfile(confFile,moduleGlobals) execfile(confFile,moduleGlobals)
except Exception, e: except Exception, e:
print '[ERROR] An exception occured while loading the configuration file:' helpers.showPythonTrace( confFile, e )
print ' <%s>\n' % (confFile)
print ' You should check for simple python errors in this file.'
print ' Error was:'
print ' %s\n' % e
print ' Trying to continue anyway...'
for symbol, loader, loaderFlags in confHelpers: for symbol, loader, loaderFlags in confHelpers:
if moduleGlobals.has_key(symbol): if moduleGlobals.has_key(symbol):

View File

@ -411,6 +411,10 @@ namespace CRL {
if ( state->getCell() ) state->getCell()->destroy (); if ( state->getCell() ) state->getCell()->destroy ();
_catalog.deleteState ( name ); _catalog.deleteState ( name );
// Last resort, search through all Hurricane libraries.
if (mode & Catalog::State::Foreign)
return DataBase::getDB()->getCell( name );
return NULL; return NULL;
} }

View File

@ -29,7 +29,6 @@
namespace { namespace {
const char* dupLayerGauge = const char* dupLayerGauge =
"RoutingGauge::AddLayerGauge() :\n\n" "RoutingGauge::AddLayerGauge() :\n\n"
" Attempt to re-define layer gauge %s in routing gauge %s.\n"; " Attempt to re-define layer gauge %s in routing gauge %s.\n";
@ -118,6 +117,26 @@ namespace CRL {
} }
RoutingLayerGauge* RoutingGauge::getHorizontalGauge () const
{
for ( RoutingLayerGauge* gauge : _layerGauges ) {
if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isHorizontal() )
return gauge;
}
return NULL;
}
RoutingLayerGauge* RoutingGauge::getVerticalGauge () const
{
for ( RoutingLayerGauge* gauge : _layerGauges ) {
if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isVertical() )
return gauge;
}
return NULL;
}
RoutingLayerGauge* RoutingGauge::getLayerGauge ( const Layer* layer ) const RoutingLayerGauge* RoutingGauge::getLayerGauge ( const Layer* layer ) const
{ {
for ( size_t i=0 ; i < _layerGauges.size() ; i++ ) { for ( size_t i=0 ; i < _layerGauges.size() ; i++ ) {

View File

@ -24,6 +24,7 @@
#include <vector> #include <vector>
using namespace std; using namespace std;
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/Net.h" #include "hurricane/Net.h"
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
@ -281,7 +282,7 @@ namespace {
, _connections () , _connections ()
, _model (NULL) , _model (NULL)
{ {
Cell* cell = AllianceFramework::get()->getCell( modelName, Catalog::State::Views, 0 ); Cell* cell = AllianceFramework::get()->getCell( modelName, Catalog::State::Views|Catalog::State::Foreign, 0 );
if (cell) { if (cell) {
_model = Model::find( getString(cell->getName()) ); _model = Model::find( getString(cell->getName()) );
if (not _model) { if (not _model) {
@ -474,9 +475,18 @@ namespace {
{ {
auto framework = AllianceFramework::get(); auto framework = AllianceFramework::get();
static string zeroName = Cfg::getParamString("etesian.cell.zero","zero_x0")->asString();
static string oneName = Cfg::getParamString("etesian.cell.one" , "one_x0")->asString();
unsigned int supplyCount = 0; unsigned int supplyCount = 0;
Cell* zero = framework->getCell( "zero_x0", Catalog::State::Views ); Cell* zero = framework->getCell( zeroName, Catalog::State::Views|Catalog::State::Foreign );
Cell* one = framework->getCell( "one_x0" , Catalog::State::Views); Cell* one = framework->getCell( oneName, Catalog::State::Views|Catalog::State::Foreign );
Net* masterNetZero = NULL;
for ( Net* net : zero->getNets() ) if (not net->isSupply()) { masterNetZero = net; break; }
Net* masterNetOne = NULL;
for ( Net* net : one->getNets() ) if (not net->isSupply()) { masterNetOne = net; break; }
for ( Subckt* subckt : _subckts ) { for ( Subckt* subckt : _subckts ) {
if(not subckt->getModel()) if(not subckt->getModel())
@ -549,7 +559,7 @@ namespace {
Instance* insOne = Instance::create( _cell, insName.str(), one ); Instance* insOne = Instance::create( _cell, insName.str(), one );
Net* netOne = Net::create( _cell, insName.str() ); Net* netOne = Net::create( _cell, insName.str() );
insOne->getPlug( one->getNet("q") )->setNet( netOne ); insOne->getPlug( masterNetOne )->setNet( netOne );
plug->setNet( netOne ); plug->setNet( netOne );
} }
@ -559,7 +569,7 @@ namespace {
Instance* insZero = Instance::create( _cell, insName.str(), zero ); Instance* insZero = Instance::create( _cell, insName.str(), zero );
Net* netZero = Net::create( _cell, insName.str() ); Net* netZero = Net::create( _cell, insName.str() );
insZero->getPlug( zero->getNet("nq") )->setNet( netZero ); insZero->getPlug( masterNetZero )->setNet( netZero );
plug->setNet( netZero ); plug->setNet( netZero );
} }
} }

View File

@ -84,6 +84,7 @@ namespace CRL {
, Logical = 1 << 5 , Logical = 1 << 5
, Physical = 1 << 6 , Physical = 1 << 6
, InMemory = 1 << 7 , InMemory = 1 << 7
, Foreign = 1 << 8
, Views = Physical|Logical , Views = Physical|Logical
}; };
// Constructors. // Constructors.

View File

@ -1,14 +1,14 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2016, All Rights Reserved // Copyright (c) UPMC 2008-2016, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
// | Alliance / Hurricane Interface | // | Alliance / Hurricane Interface |
// | | // | |
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./crlcore/RoutingGauge.h" | // | C++ Header : "./crlcore/RoutingGauge.h" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
@ -17,9 +17,6 @@
#ifndef CRL_ROUTING_GAUGE_H #ifndef CRL_ROUTING_GAUGE_H
#define CRL_ROUTING_GAUGE_H #define CRL_ROUTING_GAUGE_H
class QXmlSteamReader;
#include <string> #include <string>
#include <vector> #include <vector>
#include "hurricane/Name.h" #include "hurricane/Name.h"
@ -54,37 +51,41 @@ namespace CRL {
// Constants. // Constants.
static const size_t nlayerdepth; static const size_t nlayerdepth;
// Constructors & Destructors. // Constructors & Destructors.
static RoutingGauge* create ( const char* name ); static RoutingGauge* create ( const char* name );
virtual void destroy (); virtual void destroy ();
// Accessors. // Accessors.
RoutingGauge* getClone () const; RoutingGauge* getClone () const;
inline const Name getName () const; inline const Name getName () const;
inline Technology* getTechnology () const; inline Technology* getTechnology () const;
inline size_t getDepth () const; inline size_t getDepth () const;
RoutingLayerGauge* getLayerGauge ( const Layer* ) const; inline DbU::Unit getHorizontalPitch () const;
size_t getViaDepth ( const Layer* ) const; inline DbU::Unit getVerticalPitch () const;
size_t getLayerDepth ( const Layer* ) const; RoutingLayerGauge* getHorizontalGauge () const;
unsigned int getLayerType ( const Layer* ) const; RoutingLayerGauge* getVerticalGauge () const;
unsigned int getLayerDirection ( const Layer* ) const; RoutingLayerGauge* getLayerGauge ( const Layer* ) const;
RoutingLayerGauge* getLayerGauge ( size_t depth ) const; size_t getViaDepth ( const Layer* ) const;
inline unsigned int getLayerDirection ( size_t depth ) const; size_t getLayerDepth ( const Layer* ) const;
inline unsigned int getLayerType ( size_t depth ) const; unsigned int getLayerType ( const Layer* ) const;
inline DbU::Unit getLayerPitch ( size_t depth ) const; unsigned int getLayerDirection ( const Layer* ) const;
inline DbU::Unit getLayerOffset ( size_t depth ) const; RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
inline DbU::Unit getLayerWireWidth ( size_t depth ) const; inline unsigned int getLayerDirection ( size_t depth ) const;
inline DbU::Unit getViaWidth ( size_t depth ) const; inline unsigned int getLayerType ( size_t depth ) const;
const Layer* getRoutingLayer ( size_t depth ) const; inline DbU::Unit getLayerPitch ( size_t depth ) const;
Layer* getContactLayer ( size_t depth ) const; inline DbU::Unit getLayerOffset ( size_t depth ) const;
const vector<RoutingLayerGauge*>& inline DbU::Unit getLayerWireWidth ( size_t depth ) const;
getLayerGauges () const; inline DbU::Unit getViaWidth ( size_t depth ) const;
// Methods. const Layer* getRoutingLayer ( size_t depth ) const;
void addLayerGauge ( RoutingLayerGauge* layerGauge ); Layer* getContactLayer ( size_t depth ) const;
void checkConnexity () const; const vector<RoutingLayerGauge*>&
// Hurricane Managment. getLayerGauges () const;
void toJson ( JsonWriter* ) const; // Methods.
virtual Record* _getRecord ( Record* record=NULL ) const; void addLayerGauge ( RoutingLayerGauge* layerGauge );
virtual string _getString () const; void checkConnexity () const;
virtual string _getTypeName () const; // Hurricane Managment.
void toJson ( JsonWriter* ) const;
virtual Record* _getRecord ( Record* record=NULL ) const;
virtual string _getString () const;
virtual string _getTypeName () const;
protected: protected:
// Internal - Attributes. // Internal - Attributes.
@ -102,15 +103,17 @@ namespace CRL {
}; };
inline const Name RoutingGauge::getName () const { return _name; } inline const Name RoutingGauge::getName () const { return _name; }
inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); } inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); }
inline Technology* RoutingGauge::getTechnology () const { return _technology; } inline Technology* RoutingGauge::getTechnology () const { return _technology; }
inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); } inline DbU::Unit RoutingGauge::getHorizontalPitch () const { return getHorizontalGauge()->getPitch(); }
inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); } inline DbU::Unit RoutingGauge::getVerticalPitch () const { return getVerticalGauge ()->getPitch(); }
inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); } inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); }
inline DbU::Unit RoutingGauge::getLayerOffset ( size_t depth ) const { return getLayerGauge(depth)->getOffset(); } inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); }
inline DbU::Unit RoutingGauge::getLayerWireWidth ( size_t depth ) const { return getLayerGauge(depth)->getWireWidth(); } inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); }
inline DbU::Unit RoutingGauge::getViaWidth ( size_t depth ) const { return getLayerGauge(depth)->getViaWidth(); } inline DbU::Unit RoutingGauge::getLayerOffset ( size_t depth ) const { return getLayerGauge(depth)->getOffset(); }
inline DbU::Unit RoutingGauge::getLayerWireWidth ( size_t depth ) const { return getLayerGauge(depth)->getWireWidth(); }
inline DbU::Unit RoutingGauge::getViaWidth ( size_t depth ) const { return getLayerGauge(depth)->getViaWidth(); }
// ------------------------------------------------------------------- // -------------------------------------------------------------------

View File

@ -573,7 +573,7 @@ namespace {
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."
, DbU::getValueString(parser->getCellGauge()->getSliceStep()).c_str() , DbU::getValueString(parser->getCellGauge()->getSliceStep()).c_str()
, DbU::getValueString(parser->getCoreSiteY()).c_str() ) << endl; , DbU::getValueString(parser->getCoreSiteX()).c_str() ) << endl;
} }
return parser->getLibrary(); return parser->getLibrary();

View File

@ -8,7 +8,7 @@
// | Alliance / Hurricane Interface | // | Alliance / Hurricane Interface |
// | | // | |
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./PyRoutingGauge.cpp" | // | C++ Module : "./PyRoutingGauge.cpp" |
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
@ -124,6 +124,34 @@ extern "C" {
} }
static PyObject* PyRoutingGauge_getHorizontalPitch ( PyRoutingGauge* self, PyObject* args )
{
cdebug_log(30,0) << "PyRoutingGauge_getHorizontalPitch()" << endl;
DbU::Unit pitch = 0;
HTRY
METHOD_HEAD("RoutingGauge.getHorizontalPitch()")
pitch = rg->getHorizontalPitch();
HCATCH
return Py_BuildValue("I",pitch);
}
static PyObject* PyRoutingGauge_getVerticalPitch ( PyRoutingGauge* self, PyObject* args )
{
cdebug_log(30,0) << "PyRoutingGauge_getVerticalPitch()" << endl;
DbU::Unit pitch = 0;
HTRY
METHOD_HEAD("RoutingGauge.getVerticalPitch()")
pitch = rg->getVerticalPitch();
HCATCH
return Py_BuildValue("I",pitch);
}
static PyObject* PyRoutingGauge_getLayerDepth ( PyRoutingGauge* self, PyObject* args ) static PyObject* PyRoutingGauge_getLayerDepth ( PyRoutingGauge* self, PyObject* args )
{ {
cdebug_log(30,0) << "PyRoutingGauge_getLayerDepth()" << endl; cdebug_log(30,0) << "PyRoutingGauge_getLayerDepth()" << endl;
@ -336,29 +364,33 @@ extern "C" {
PyMethodDef PyRoutingGauge_Methods[] = PyMethodDef PyRoutingGauge_Methods[] =
{ { "create" , (PyCFunction)PyRoutingGauge_create , METH_VARARGS|METH_STATIC { { "create" , (PyCFunction)PyRoutingGauge_create , METH_VARARGS|METH_STATIC
, "Create a new RoutingGauge." } , "Create a new RoutingGauge." }
, { "getName" , (PyCFunction)PyRoutingGauge_getName , METH_NOARGS , { "getName" , (PyCFunction)PyRoutingGauge_getName , METH_NOARGS
, "Return the maximum depth of the RoutingGauge." } , "Return the maximum depth of the RoutingGauge." }
, { "getTechnology" , (PyCFunction)PyRoutingGauge_getTechnology , METH_NOARGS , { "getTechnology" , (PyCFunction)PyRoutingGauge_getTechnology , METH_NOARGS
, "Return the Technology we are using." } , "Return the Technology we are using." }
, { "getDepth" , (PyCFunction)PyRoutingGauge_getDepth , METH_NOARGS , { "getDepth" , (PyCFunction)PyRoutingGauge_getDepth , METH_NOARGS
, "Return the maximum depth of the RoutingGauge." } , "Return the maximum depth of the RoutingGauge." }
, { "getLayerDepth" , (PyCFunction)PyRoutingGauge_getLayerDepth , METH_VARARGS , { "getHorizontalPitch" , (PyCFunction)PyRoutingGauge_getHorizontalPitch, METH_NOARGS
, "Return the horizontal pitch of the metal closest to the substrate." }
, { "getVerticalPitch" , (PyCFunction)PyRoutingGauge_getVerticalPitch , METH_NOARGS
, "Return the vertical pitch of the metal closest to the substrate." }
, { "getLayerDepth" , (PyCFunction)PyRoutingGauge_getLayerDepth , METH_VARARGS
, "Return the depth of the given layer." } , "Return the depth of the given layer." }
, { "getLayerGauge" , (PyCFunction)PyRoutingGauge_getLayerGauge , METH_VARARGS , { "getLayerGauge" , (PyCFunction)PyRoutingGauge_getLayerGauge , METH_VARARGS
, "Return the RoutingLayerGauge of the given layer/depth." } , "Return the RoutingLayerGauge of the given layer/depth." }
, { "getLayerDirection" , (PyCFunction)PyRoutingGauge_getLayerDirection, METH_VARARGS , { "getLayerDirection" , (PyCFunction)PyRoutingGauge_getLayerDirection , METH_VARARGS
, "Return the direction of the given layer/depth." } , "Return the direction of the given layer/depth." }
, { "getLayerPitch" , (PyCFunction)PyRoutingGauge_getLayerPitch , METH_VARARGS , { "getLayerPitch" , (PyCFunction)PyRoutingGauge_getLayerPitch , METH_VARARGS
, "Return the pitch of the given layer/depth." } , "Return the pitch of the given layer/depth." }
, { "getRoutingLayer" , (PyCFunction)PyRoutingGauge_getRoutingLayer , METH_VARARGS , { "getRoutingLayer" , (PyCFunction)PyRoutingGauge_getRoutingLayer , METH_VARARGS
, "Return the routing layer used for the requested depth." } , "Return the routing layer used for the requested depth." }
, { "getContactLayer" , (PyCFunction)PyRoutingGauge_getContactLayer , METH_VARARGS , { "getContactLayer" , (PyCFunction)PyRoutingGauge_getContactLayer , METH_VARARGS
, "Return the contact layer used for the requested depth." } , "Return the contact layer used for the requested depth." }
, { "getLayerGauges" , (PyCFunction)PyRoutingGauge_getLayerGauges , METH_NOARGS , { "getLayerGauges" , (PyCFunction)PyRoutingGauge_getLayerGauges , METH_NOARGS
, "Return the list of RoutingLayerGauge." } , "Return the list of RoutingLayerGauge." }
, { "addLayerGauge" , (PyCFunction)PyRoutingGauge_addLayerGauge , METH_VARARGS , { "addLayerGauge" , (PyCFunction)PyRoutingGauge_addLayerGauge , METH_VARARGS
, "Adds a new RoutingLayerGauge to the RoutingGauge." } , "Adds a new RoutingLayerGauge to the RoutingGauge." }
//, { "destroy" , (PyCFunction)PyRoutingGauge_destroy , METH_VARARGS //, { "destroy" , (PyCFunction)PyRoutingGauge_destroy , METH_VARARGS
// , "Destroy the associated hurricane object. The python object remains." } // , "Destroy the associated hurricane object. The python object remains." }

View File

@ -199,7 +199,7 @@ namespace {
if (xtie >= xmax) break; if (xtie >= xmax) break;
if (xtie+feedWidth > xmax) { if (xtie+feedWidth > xmax) {
// Feed is too big, try to find a smaller one. // Feed is too big, try to find a smaller one.
int pitch = (int)((xmax-xtie) / getEtesian()->getPitch()); int pitch = (int)((xmax-xtie) / getEtesian()->getVerticalPitch());
for ( ; pitch > 0 ; --pitch ) { for ( ; pitch > 0 ; --pitch ) {
feed = getEtesian()->getFeedCells().getFeed( pitch ); feed = getEtesian()->getFeedCells().getFeed( pitch );
feedWidth = feed->getAbutmentBox().getWidth(); feedWidth = feed->getAbutmentBox().getWidth();

View File

@ -14,26 +14,23 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <vector> #include <vector>
#include "vlsisapd/configuration/Configuration.h"
#include "vlsisapd/configuration/Configuration.h" #include "hurricane/Warning.h"
#include "hurricane/Warning.h" #include "hurricane/Technology.h"
#include "hurricane/Technology.h" #include "hurricane/DataBase.h"
#include "hurricane/DataBase.h" #include "hurricane/Cell.h"
#include "hurricane/Cell.h" #include "crlcore/Utilities.h"
#include "crlcore/Utilities.h" #include "crlcore/CellGauge.h"
#include "crlcore/CellGauge.h" #include "crlcore/AllianceFramework.h"
#include "crlcore/AllianceFramework.h" #include "etesian/Configuration.h"
#include "etesian/Configuration.h" #include "etesian/EtesianEngine.h"
#include "etesian/EtesianEngine.h"
namespace Etesian { namespace Etesian {
using std::cout; using std::cout;
using std::cerr; using std::cerr;
using std::endl; using std::endl;
@ -51,30 +48,37 @@ namespace Etesian {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Etesian::Configuration". // Class : "Etesian::Configuration".
Configuration::Configuration ( const CellGauge* cg ) Configuration::Configuration ( const RoutingGauge* rg, const CellGauge* cg )
: _cg ( NULL ) : _rg ( NULL )
, _cg ( NULL )
, _placeEffort ( static_cast<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) ) , _placeEffort ( static_cast<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) )
, _updateConf ( static_cast<GraphicUpdate> (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) ) , _updateConf ( static_cast<GraphicUpdate> (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) )
, _spreadingConf( Cfg::getParamBool ("etesian.uniformDensity", false )->asBool()? ForceUniform : MaxDensity ) , _spreadingConf( Cfg::getParamBool ("etesian.uniformDensity", false )->asBool()? ForceUniform : MaxDensity )
, _routingDriven( Cfg::getParamBool ("etesian.routingDriven", false )->asBool()) , _routingDriven( Cfg::getParamBool ("etesian.routingDriven" , false )->asBool())
, _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() ) , _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() )
, _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() ) , _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() )
, _feedNames ( Cfg::getParamString ("etesian.feedNames" ,"tie_x0,rowend_x0")->asString() )
{ {
if ( cg == NULL ) cg = AllianceFramework::get()->getCellGauge(); if (rg == NULL) rg = AllianceFramework::get()->getRoutingGauge();
if (cg == NULL) cg = AllianceFramework::get()->getCellGauge();
_rg = rg->getClone();
_cg = cg->getClone(); _cg = cg->getClone();
} }
Configuration::Configuration ( const Configuration& other ) Configuration::Configuration ( const Configuration& other )
: _cg (NULL) : _rg (NULL)
, _cg (NULL)
, _placeEffort ( other._placeEffort ) , _placeEffort ( other._placeEffort )
, _updateConf ( other._updateConf ) , _updateConf ( other._updateConf )
, _spreadingConf( other._spreadingConf ) , _spreadingConf( other._spreadingConf )
, _spaceMargin ( other._spaceMargin ) , _spaceMargin ( other._spaceMargin )
, _aspectRatio ( other._aspectRatio ) , _aspectRatio ( other._aspectRatio )
, _feedNames ( other._feedNames )
{ {
if ( other._cg ) _cg = other._cg->getClone(); if (other._rg) _rg = other._rg->getClone();
if (other._cg) _cg = other._cg->getClone();
} }
@ -118,6 +122,7 @@ namespace Etesian {
Record* Configuration::_getRecord () const Record* Configuration::_getRecord () const
{ {
Record* record = new Record ( _getString() ); Record* record = new Record ( _getString() );
record->add ( getSlot( "_rg" , _rg ) );
record->add ( getSlot( "_cg" , _cg ) ); record->add ( getSlot( "_cg" , _cg ) );
record->add ( getSlot( "_placeEffort" , (int)_placeEffort ) ); record->add ( getSlot( "_placeEffort" , (int)_placeEffort ) );
record->add ( getSlot( "_updateConf" , (int)_updateConf ) ); record->add ( getSlot( "_updateConf" , (int)_updateConf ) );

View File

@ -27,6 +27,7 @@
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/Breakpoint.h" #include "hurricane/Breakpoint.h"
#include "hurricane/DataBase.h"
#include "hurricane/Layer.h" #include "hurricane/Layer.h"
#include "hurricane/Net.h" #include "hurricane/Net.h"
#include "hurricane/Pad.h" #include "hurricane/Pad.h"
@ -143,13 +144,14 @@ namespace {
Transformation toTransformation ( point<int_t> position Transformation toTransformation ( point<int_t> position
, point<bool> orientation , point<bool> orientation
, Cell* model , Cell* model
, DbU::Unit pitch , DbU::Unit hpitch
, DbU::Unit vpitch
) )
{ {
DbU::Unit tx = position.x * pitch; DbU::Unit tx = position.x * vpitch;
DbU::Unit ty = position.y * pitch; DbU::Unit ty = position.y * hpitch;
Box cellBox = model->getAbutmentBox(); Box cellBox = model->getAbutmentBox();
Transformation::Orientation orient = Transformation::Orientation::ID; Transformation::Orientation orient = Transformation::Orientation::ID;
@ -197,6 +199,7 @@ namespace Etesian {
using Hurricane::Warning; using Hurricane::Warning;
using Hurricane::Breakpoint; using Hurricane::Breakpoint;
using Hurricane::Box; using Hurricane::Box;
using Hurricane::DataBase;
using Hurricane::Layer; using Hurricane::Layer;
using Hurricane::Cell; using Hurricane::Cell;
using Hurricane::Instance; using Hurricane::Instance;
@ -269,10 +272,22 @@ namespace Etesian {
cmess2 << " o ISPD benchmark <" << getCell()->getName() cmess2 << " o ISPD benchmark <" << getCell()->getName()
<< ">, no feed cells will be added." << endl; << ">, no feed cells will be added." << endl;
} else { } else {
// Ugly: Direct uses of Alliance Framework. string feedNames = getConfiguration()->getFeedNames();
// Must change toward something in the settings. char separator = ',';
_feedCells.useFeed( AllianceFramework::get()->getCell("tie_x0" ,Catalog::State::Views) );
_feedCells.useFeed( AllianceFramework::get()->getCell("rowend_x0",Catalog::State::Views) ); while ( not feedNames.empty() ) {
size_t cut = feedNames.find( separator );
if (cut != string::npos) {
_feedCells.useFeed( DataBase::getDB()->getCell( feedNames.substr(0,cut) ) );
feedNames = feedNames.substr( cut+1 );
} else {
_feedCells.useFeed( AllianceFramework::get()->getCell( feedNames, Catalog::State::Views|Catalog::State::Foreign ) );
feedNames.clear();
}
}
//_feedCells.useFeed( AllianceFramework::get()->getCell("tie_x0" ,Catalog::State::Views) );
//_feedCells.useFeed( AllianceFramework::get()->getCell("rowend_x0",Catalog::State::Views) );
} }
} }
@ -358,10 +373,14 @@ namespace Etesian {
static_cast<Instance*>(ioccurrence.getEntity())->destroy(); static_cast<Instance*>(ioccurrence.getEntity())->destroy();
} }
DbU::Unit abWidth = rows*getSliceHeight();
DbU::Unit adjust = abWidth % getVerticalPitch();
if (adjust) abWidth += getVerticalPitch() - adjust;
getCell()->setAbutmentBox( Box( DbU::fromLambda(0) getCell()->setAbutmentBox( Box( DbU::fromLambda(0)
, DbU::fromLambda(0) , DbU::fromLambda(0)
, columns*getSliceHeight() , abWidth
, rows *getSliceHeight() , rows*getSliceHeight()
) ); ) );
UpdateSession::close(); UpdateSession::close();
if (_viewer) _viewer->getCellWidget()->fitToContents(); if (_viewer) _viewer->getCellWidget()->fitToContents();
@ -419,9 +438,10 @@ namespace Etesian {
resetPlacement(); resetPlacement();
Dots dots ( cmess2, " ", 80, 1000 ); Dots dots ( cmess2, " ", 80, 1000 );
AllianceFramework* af = AllianceFramework::get(); AllianceFramework* af = AllianceFramework::get();
DbU::Unit pitch = getPitch(); DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getVerticalPitch();
if (not cmess2.enabled()) dots.disable(); if (not cmess2.enabled()) dots.disable();
@ -507,11 +527,11 @@ namespace Etesian {
instanceTransf.applyOn( instanceAb ); instanceTransf.applyOn( instanceAb );
// Upper rounded // Upper rounded
int_t xsize = (instanceAb.getWidth () + pitch -1) / pitch; int_t xsize = (instanceAb.getWidth () + vpitch -1) / vpitch;
int_t ysize = (instanceAb.getHeight() + pitch -1) / pitch; int_t ysize = (instanceAb.getHeight() + hpitch -1) / hpitch;
// Lower rounded // Lower rounded
int_t xpos = instanceAb.getXMin() / pitch; int_t xpos = instanceAb.getXMin() / vpitch;
int_t ypos = instanceAb.getYMin() / pitch; int_t ypos = instanceAb.getYMin() / hpitch;
instances[instanceId].size = point<int_t>( xsize, ysize ); instances[instanceId].size = point<int_t>( xsize, ysize );
instances[instanceId].list_index = instanceId; instances[instanceId].list_index = instanceId;
@ -562,8 +582,8 @@ namespace Etesian {
string insName = extractInstanceName( rp ); string insName = extractInstanceName( rp );
Point offset = extractRpOffset ( rp ); Point offset = extractRpOffset ( rp );
int_t xpin = offset.getX() / pitch; int_t xpin = offset.getX() / vpitch;
int_t ypin = offset.getY() / pitch; int_t ypin = offset.getY() / hpitch;
auto iid = _cellsToIds.find( insName ); auto iid = _cellsToIds.find( insName );
if (iid == _cellsToIds.end() ) { if (iid == _cellsToIds.end() ) {
@ -577,10 +597,10 @@ namespace Etesian {
} }
dots.finish( Dots::Reset ); dots.finish( Dots::Reset );
_surface = box<int_t>( (int_t)(getCell()->getAbutmentBox().getXMin() / pitch) _surface = box<int_t>( (int_t)(getCell()->getAbutmentBox().getXMin() / vpitch)
, (int_t)(getCell()->getAbutmentBox().getXMax() / pitch) , (int_t)(getCell()->getAbutmentBox().getXMax() / vpitch)
, (int_t)(getCell()->getAbutmentBox().getYMin() / pitch) , (int_t)(getCell()->getAbutmentBox().getYMin() / hpitch)
, (int_t)(getCell()->getAbutmentBox().getYMax() / pitch) , (int_t)(getCell()->getAbutmentBox().getYMax() / hpitch)
); );
_circuit = netlist( instances, nets, pins ); _circuit = netlist( instances, nets, pins );
_circuit.selfcheck(); _circuit.selfcheck();
@ -646,7 +666,8 @@ namespace Etesian {
* * artificially expand the areas given to coloquinte * * artificially expand the areas given to coloquinte
* * add placement dentity constraints * * add placement dentity constraints
*/ */
DbU::Unit pitch = getPitch(); DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getVerticalPitch();
const float densityThreshold = 0.9; const float densityThreshold = 0.9;
KiteEngine* routingEngine = KiteEngine::get( getCell() ); KiteEngine* routingEngine = KiteEngine::get( getCell() );
@ -664,10 +685,10 @@ namespace Etesian {
coloquinte::density_limit cur; coloquinte::density_limit cur;
cur.box_ = coloquinte::box<int_t>( cur.box_ = coloquinte::box<int_t>(
gc->getX() / pitch, gc->getX() / vpitch,
gc->getXMax() / pitch, gc->getXMax() / vpitch,
gc->getY() / pitch, gc->getY() / hpitch,
gc->getYMax() / pitch gc->getYMax() / hpitch
); );
cur.density_ = densityThreshold/density; cur.density_ = densityThreshold/density;
_densityLimits.push_back(cur); _densityLimits.push_back(cur);
@ -753,7 +774,7 @@ namespace Etesian {
using namespace coloquinte::gp; using namespace coloquinte::gp;
using namespace coloquinte::dp; using namespace coloquinte::dp;
int_t sliceHeight = getSliceHeight() / getPitch(); int_t sliceHeight = getSliceHeight() / getHorizontalPitch();
roughLegalize(sliceHeight, options); roughLegalize(sliceHeight, options);
for ( int i=0; i<iterations; ++i ){ for ( int i=0; i<iterations; ++i ){
@ -829,7 +850,7 @@ namespace Etesian {
bool routingDriven = getRoutingDriven(); bool routingDriven = getRoutingDriven();
startMeasures(); startMeasures();
double sliceHeight = getSliceHeight() / getPitch(); double sliceHeight = getSliceHeight() / getHorizontalPitch();
cmess1 << " o Running Coloquinte." << endl; cmess1 << " o Running Coloquinte." << endl;
cmess2 << " - Computing initial placement..." << endl; cmess2 << " - Computing initial placement..." << endl;
@ -919,9 +940,9 @@ namespace Etesian {
stopMeasures(); stopMeasures();
printMeasures(); printMeasures();
cmess1 << ::Dots::asString cmess1 << ::Dots::asString
( " - HPWL", DbU::getValueString( (DbU::Unit)coloquinte::gp::get_HPWL_wirelength(_circuit,_placementUB )*getPitch() ) ) << endl; ( " - HPWL", DbU::getValueString( (DbU::Unit)coloquinte::gp::get_HPWL_wirelength(_circuit,_placementUB )*getVerticalPitch() ) ) << endl;
cmess1 << ::Dots::asString cmess1 << ::Dots::asString
( " - RMST", DbU::getValueString( (DbU::Unit)coloquinte::gp::get_RSMT_wirelength(_circuit,_placementUB )*getPitch() ) ) << endl; ( " - RMST", DbU::getValueString( (DbU::Unit)coloquinte::gp::get_RSMT_wirelength(_circuit,_placementUB )*getVerticalPitch() ) ) << endl;
_placed = true; _placed = true;
@ -979,6 +1000,8 @@ namespace Etesian {
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() ) for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{ {
DbU::Unit hpitch = getHorizontalPitch();
DbU::Unit vpitch = getVerticalPitch();
Point instancePosition; Point instancePosition;
Instance* instance = static_cast<Instance*>(occurrence.getEntity()); Instance* instance = static_cast<Instance*>(occurrence.getEntity());
string instanceName = occurrence.getCompactString(); string instanceName = occurrence.getCompactString();
@ -997,7 +1020,8 @@ namespace Etesian {
Transformation trans = toTransformation( position Transformation trans = toTransformation( position
, placement.orientations_[(*iid).second] , placement.orientations_[(*iid).second]
, instance->getMasterCell() , instance->getMasterCell()
, getPitch() , hpitch
, vpitch
); );
//cerr << "Setting <" << instanceName << " @" << instancePosition << endl; //cerr << "Setting <" << instanceName << " @" << instancePosition << endl;

View File

@ -36,7 +36,7 @@ namespace Etesian {
{ {
if ( cell == NULL ) return; if ( cell == NULL ) return;
DbU::Unit pitch = _etesian->getPitch(); DbU::Unit pitch = _etesian->getVerticalPitch();
if (cell->getAbutmentBox().getWidth() % pitch != 0) if (cell->getAbutmentBox().getWidth() % pitch != 0)
cerr << Warning( "FeedCells::addFeed(): &lt;%s&gt; has not a width (%s) multiple of pitch (%s)." cerr << Warning( "FeedCells::addFeed(): &lt;%s&gt; has not a width (%s) multiple of pitch (%s)."

View File

@ -25,6 +25,7 @@ namespace Hurricane {
class Cell; class Cell;
} }
#include "crlcore/RoutingGauge.h"
#include "crlcore/CellGauge.h" #include "crlcore/CellGauge.h"
@ -37,6 +38,7 @@ namespace Etesian {
using Hurricane::DbU; using Hurricane::DbU;
using Hurricane::Cell; using Hurricane::Cell;
using CRL::CellGauge; using CRL::CellGauge;
using CRL::RoutingGauge;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -58,23 +60,26 @@ namespace Etesian {
class Configuration { class Configuration {
public: public:
// Constructor & Destructor. // Constructor & Destructor.
Configuration ( const CellGauge* cg=NULL ); Configuration ( const RoutingGauge* rg=NULL, const CellGauge* cg=NULL );
~Configuration (); ~Configuration ();
Configuration* clone () const; Configuration* clone () const;
// Methods. // Methods.
inline RoutingGauge* getGauge () const;
inline CellGauge* getCellGauge () const; inline CellGauge* getCellGauge () const;
inline Effort getPlaceEffort () const; inline Effort getPlaceEffort () const;
inline GraphicUpdate getUpdateConf () const; inline GraphicUpdate getUpdateConf () const;
inline Density getSpreadingConf () const; inline Density getSpreadingConf () const;
inline bool getRoutingDriven () const; inline bool getRoutingDriven () const;
inline double getSpaceMargin () const; inline double getSpaceMargin () const;
inline double getAspectRatio () const; inline double getAspectRatio () const;
inline string getFeedNames () const;
void print ( Cell* ) const; void print ( Cell* ) const;
Record* _getRecord () const; Record* _getRecord () const;
string _getString () const; string _getString () const;
string _getTypeName () const; string _getTypeName () const;
protected: protected:
// Attributes. // Attributes.
RoutingGauge* _rg;
CellGauge* _cg; CellGauge* _cg;
Effort _placeEffort; Effort _placeEffort;
GraphicUpdate _updateConf; GraphicUpdate _updateConf;
@ -82,12 +87,14 @@ namespace Etesian {
bool _routingDriven; bool _routingDriven;
double _spaceMargin; double _spaceMargin;
double _aspectRatio; double _aspectRatio;
string _feedNames;
private: private:
Configuration ( const Configuration& ); Configuration ( const Configuration& );
Configuration& operator= ( const Configuration& ); Configuration& operator= ( const Configuration& );
}; };
inline RoutingGauge* Configuration::getGauge () const { return _rg; }
inline CellGauge* Configuration::getCellGauge () const { return _cg; } inline CellGauge* Configuration::getCellGauge () const { return _cg; }
inline Effort Configuration::getPlaceEffort () const { return _placeEffort; } inline Effort Configuration::getPlaceEffort () const { return _placeEffort; }
inline GraphicUpdate Configuration::getUpdateConf () const { return _updateConf; } inline GraphicUpdate Configuration::getUpdateConf () const { return _updateConf; }
@ -95,6 +102,7 @@ namespace Etesian {
inline bool Configuration::getRoutingDriven () const { return _routingDriven; } inline bool Configuration::getRoutingDriven () const { return _routingDriven; }
inline double Configuration::getSpaceMargin () const { return _spaceMargin; } inline double Configuration::getSpaceMargin () const { return _spaceMargin; }
inline double Configuration::getAspectRatio () const { return _aspectRatio; } inline double Configuration::getAspectRatio () const { return _aspectRatio; }
inline string Configuration::getFeedNames () const { return _feedNames; }
} // Etesian namespace. } // Etesian namespace.

View File

@ -55,45 +55,46 @@ namespace Etesian {
public: public:
typedef ToolEngine Super; typedef ToolEngine Super;
public: public:
static const Name& staticGetName (); static const Name& staticGetName ();
static EtesianEngine* create ( Cell* ); static EtesianEngine* create ( Cell* );
static EtesianEngine* get ( const Cell* ); static EtesianEngine* get ( const Cell* );
public: public:
virtual Configuration* getConfiguration (); virtual Configuration* getConfiguration ();
virtual const Configuration* getConfiguration () const; virtual const Configuration* getConfiguration () const;
virtual const Name& getName () const; virtual const Name& getName () const;
inline CellGauge* getCellGauge () const; inline RoutingGauge* getGauge () const;
inline DbU::Unit getPitch () const; inline CellGauge* getCellGauge () const;
inline DbU::Unit getSliceHeight () const; inline DbU::Unit getHorizontalPitch () const;
inline Effort getPlaceEffort () const; inline DbU::Unit getVerticalPitch () const;
inline GraphicUpdate getUpdateConf () const; inline DbU::Unit getSliceHeight () const;
inline Density getSpreadingConf () const; inline Effort getPlaceEffort () const;
inline bool getRoutingDriven () const; inline GraphicUpdate getUpdateConf () const;
inline double getSpaceMargin () const; inline Density getSpreadingConf () const;
inline double getAspectRatio () const; inline bool getRoutingDriven () const;
inline const FeedCells& getFeedCells () const; inline double getSpaceMargin () const;
inline Hurricane::CellViewer* getViewer () const; inline double getAspectRatio () const;
inline void setViewer ( Hurricane::CellViewer* ); inline const FeedCells& getFeedCells () const;
inline Hurricane::CellViewer* getViewer () const;
inline void setViewer ( Hurricane::CellViewer* );
void setDefaultAb (); void setDefaultAb ();
void resetPlacement (); void resetPlacement ();
void toColoquinte (); void toColoquinte ();
void preplace (); void preplace ();
void roughLegalize ( float minDisruption, unsigned options ); void roughLegalize ( float minDisruption, unsigned options );
void globalPlace ( float initPenalty, float minDisruption, float targetImprovement, float minInc, float maxInc, unsigned options=0 ); void globalPlace ( float initPenalty, float minDisruption, float targetImprovement, float minInc, float maxInc, unsigned options=0 );
void detailedPlace ( int iterations, int effort, unsigned options=0 ); void detailedPlace ( int iterations, int effort, unsigned options=0 );
void feedRoutingBack (); void feedRoutingBack ();
void place (); void place ();
inline void useFeed ( Cell* ); inline void useFeed ( Cell* );
size_t findYSpin (); size_t findYSpin ();
void addFeeds (); void addFeeds ();
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
virtual std::string _getString () const; virtual std::string _getString () const;
virtual std::string _getTypeName () const; virtual std::string _getTypeName () const;
private: private:
// Attributes. // Attributes.
static Name _toolName; static Name _toolName;
@ -130,19 +131,21 @@ namespace Etesian {
// Inline Functions. // Inline Functions.
inline void EtesianEngine::setViewer ( Hurricane::CellViewer* viewer ) { _viewer = viewer; } inline void EtesianEngine::setViewer ( Hurricane::CellViewer* viewer ) { _viewer = viewer; }
inline Hurricane::CellViewer* EtesianEngine::getViewer () const { return _viewer; } inline Hurricane::CellViewer* EtesianEngine::getViewer () const { return _viewer; }
inline CellGauge* EtesianEngine::getCellGauge () const { return getConfiguration()->getCellGauge(); } inline RoutingGauge* EtesianEngine::getGauge () const { return getConfiguration()->getGauge(); }
inline DbU::Unit EtesianEngine::getPitch () const { return getCellGauge()->getPitch(); } inline CellGauge* EtesianEngine::getCellGauge () const { return getConfiguration()->getCellGauge(); }
inline DbU::Unit EtesianEngine::getSliceHeight () const { return getCellGauge()->getSliceHeight(); } inline DbU::Unit EtesianEngine::getHorizontalPitch () const { return getGauge()->getHorizontalPitch(); }
inline Effort EtesianEngine::getPlaceEffort () const { return getConfiguration()->getPlaceEffort(); } inline DbU::Unit EtesianEngine::getVerticalPitch () const { return getGauge()->getVerticalPitch(); }
inline GraphicUpdate EtesianEngine::getUpdateConf () const { return getConfiguration()->getUpdateConf(); } inline DbU::Unit EtesianEngine::getSliceHeight () const { return getCellGauge()->getSliceHeight(); }
inline Density EtesianEngine::getSpreadingConf () const { return getConfiguration()->getSpreadingConf(); } inline Effort EtesianEngine::getPlaceEffort () const { return getConfiguration()->getPlaceEffort(); }
inline bool EtesianEngine::getRoutingDriven () const { return getConfiguration()->getRoutingDriven(); } inline GraphicUpdate EtesianEngine::getUpdateConf () const { return getConfiguration()->getUpdateConf(); }
inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); } inline Density EtesianEngine::getSpreadingConf () const { return getConfiguration()->getSpreadingConf(); }
inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); } inline bool EtesianEngine::getRoutingDriven () const { return getConfiguration()->getRoutingDriven(); }
inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); } inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); }
inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; } inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); }
inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); }
inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; }
// Variables. // Variables.