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

View File

@ -130,12 +130,7 @@ def coriolisConfigure():
print ' - Loading \"%s\".' % helpers.truncPath(confFile)
execfile(confFile,moduleGlobals)
except Exception, e:
print '[ERROR] An exception occured while loading the configuration file:'
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...'
helpers.showPythonTrace( confFile, e )
for symbol, loader, loaderFlags in confHelpers:
if moduleGlobals.has_key(symbol):

View File

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

View File

@ -29,7 +29,6 @@
namespace {
const char* dupLayerGauge =
"RoutingGauge::AddLayerGauge() :\n\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
{
for ( size_t i=0 ; i < _layerGauges.size() ; i++ ) {

View File

@ -24,6 +24,7 @@
#include <vector>
using namespace std;
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Cell.h"
@ -281,7 +282,7 @@ namespace {
, _connections ()
, _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) {
_model = Model::find( getString(cell->getName()) );
if (not _model) {
@ -474,9 +475,18 @@ namespace {
{
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;
Cell* zero = framework->getCell( "zero_x0", Catalog::State::Views );
Cell* one = framework->getCell( "one_x0" , Catalog::State::Views);
Cell* zero = framework->getCell( zeroName, Catalog::State::Views|Catalog::State::Foreign );
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 ) {
if(not subckt->getModel())
@ -549,7 +559,7 @@ namespace {
Instance* insOne = Instance::create( _cell, insName.str(), one );
Net* netOne = Net::create( _cell, insName.str() );
insOne->getPlug( one->getNet("q") )->setNet( netOne );
insOne->getPlug( masterNetOne )->setNet( netOne );
plug->setNet( netOne );
}
@ -559,7 +569,7 @@ namespace {
Instance* insZero = Instance::create( _cell, insName.str(), zero );
Net* netZero = Net::create( _cell, insName.str() );
insZero->getPlug( zero->getNet("nq") )->setNet( netZero );
insZero->getPlug( masterNetZero )->setNet( netZero );
plug->setNet( netZero );
}
}

View File

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

View File

@ -1,14 +1,14 @@
// -*- C++ -*-
//
// 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 |
// | Alliance / Hurricane Interface |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./crlcore/RoutingGauge.h" |
// +-----------------------------------------------------------------+
@ -17,9 +17,6 @@
#ifndef CRL_ROUTING_GAUGE_H
#define CRL_ROUTING_GAUGE_H
class QXmlSteamReader;
#include <string>
#include <vector>
#include "hurricane/Name.h"
@ -54,37 +51,41 @@ namespace CRL {
// Constants.
static const size_t nlayerdepth;
// Constructors & Destructors.
static RoutingGauge* create ( const char* name );
virtual void destroy ();
// Accessors.
RoutingGauge* getClone () const;
inline const Name getName () const;
inline Technology* getTechnology () const;
inline size_t getDepth () const;
RoutingLayerGauge* getLayerGauge ( const Layer* ) const;
size_t getViaDepth ( const Layer* ) const;
size_t getLayerDepth ( const Layer* ) const;
unsigned int getLayerType ( const Layer* ) const;
unsigned int getLayerDirection ( const Layer* ) const;
RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
inline unsigned int getLayerDirection ( size_t depth ) const;
inline unsigned int getLayerType ( size_t depth ) const;
inline DbU::Unit getLayerPitch ( size_t depth ) const;
inline DbU::Unit getLayerOffset ( size_t depth ) const;
inline DbU::Unit getLayerWireWidth ( size_t depth ) const;
inline DbU::Unit getViaWidth ( size_t depth ) const;
const Layer* getRoutingLayer ( size_t depth ) const;
Layer* getContactLayer ( size_t depth ) const;
const vector<RoutingLayerGauge*>&
getLayerGauges () const;
// Methods.
void addLayerGauge ( RoutingLayerGauge* layerGauge );
void checkConnexity () const;
// Hurricane Managment.
void toJson ( JsonWriter* ) const;
virtual Record* _getRecord ( Record* record=NULL ) const;
virtual string _getString () const;
virtual string _getTypeName () const;
static RoutingGauge* create ( const char* name );
virtual void destroy ();
// Accessors.
RoutingGauge* getClone () const;
inline const Name getName () const;
inline Technology* getTechnology () const;
inline size_t getDepth () const;
inline DbU::Unit getHorizontalPitch () const;
inline DbU::Unit getVerticalPitch () const;
RoutingLayerGauge* getHorizontalGauge () const;
RoutingLayerGauge* getVerticalGauge () const;
RoutingLayerGauge* getLayerGauge ( const Layer* ) const;
size_t getViaDepth ( const Layer* ) const;
size_t getLayerDepth ( const Layer* ) const;
unsigned int getLayerType ( const Layer* ) const;
unsigned int getLayerDirection ( const Layer* ) const;
RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
inline unsigned int getLayerDirection ( size_t depth ) const;
inline unsigned int getLayerType ( size_t depth ) const;
inline DbU::Unit getLayerPitch ( size_t depth ) const;
inline DbU::Unit getLayerOffset ( size_t depth ) const;
inline DbU::Unit getLayerWireWidth ( size_t depth ) const;
inline DbU::Unit getViaWidth ( size_t depth ) const;
const Layer* getRoutingLayer ( size_t depth ) const;
Layer* getContactLayer ( size_t depth ) const;
const vector<RoutingLayerGauge*>&
getLayerGauges () const;
// Methods.
void addLayerGauge ( RoutingLayerGauge* layerGauge );
void checkConnexity () const;
// Hurricane Managment.
void toJson ( JsonWriter* ) const;
virtual Record* _getRecord ( Record* record=NULL ) const;
virtual string _getString () const;
virtual string _getTypeName () const;
protected:
// Internal - Attributes.
@ -102,15 +103,17 @@ namespace CRL {
};
inline const Name RoutingGauge::getName () const { return _name; }
inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); }
inline Technology* RoutingGauge::getTechnology () const { return _technology; }
inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); }
inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); }
inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); }
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(); }
inline const Name RoutingGauge::getName () const { return _name; }
inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); }
inline Technology* RoutingGauge::getTechnology () const { return _technology; }
inline DbU::Unit RoutingGauge::getHorizontalPitch () const { return getHorizontalGauge()->getPitch(); }
inline DbU::Unit RoutingGauge::getVerticalPitch () const { return getVerticalGauge ()->getPitch(); }
inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); }
inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); }
inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); }
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())
cerr << Warning( "LefParser::parse(): CRL slice step discrepency %s while LEF is %s."
, DbU::getValueString(parser->getCellGauge()->getSliceStep()).c_str()
, DbU::getValueString(parser->getCoreSiteY()).c_str() ) << endl;
, DbU::getValueString(parser->getCoreSiteX()).c_str() ) << endl;
}
return parser->getLibrary();

View File

@ -8,7 +8,7 @@
// | Alliance / Hurricane Interface |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | 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 )
{
cdebug_log(30,0) << "PyRoutingGauge_getLayerDepth()" << endl;
@ -336,29 +364,33 @@ extern "C" {
PyMethodDef PyRoutingGauge_Methods[] =
{ { "create" , (PyCFunction)PyRoutingGauge_create , METH_VARARGS|METH_STATIC
{ { "create" , (PyCFunction)PyRoutingGauge_create , METH_VARARGS|METH_STATIC
, "Create a new RoutingGauge." }
, { "getName" , (PyCFunction)PyRoutingGauge_getName , METH_NOARGS
, { "getName" , (PyCFunction)PyRoutingGauge_getName , METH_NOARGS
, "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." }
, { "getDepth" , (PyCFunction)PyRoutingGauge_getDepth , METH_NOARGS
, { "getDepth" , (PyCFunction)PyRoutingGauge_getDepth , METH_NOARGS
, "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." }
, { "getLayerGauge" , (PyCFunction)PyRoutingGauge_getLayerGauge , METH_VARARGS
, { "getLayerGauge" , (PyCFunction)PyRoutingGauge_getLayerGauge , METH_VARARGS
, "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." }
, { "getLayerPitch" , (PyCFunction)PyRoutingGauge_getLayerPitch , METH_VARARGS
, { "getLayerPitch" , (PyCFunction)PyRoutingGauge_getLayerPitch , METH_VARARGS
, "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." }
, { "getContactLayer" , (PyCFunction)PyRoutingGauge_getContactLayer , METH_VARARGS
, { "getContactLayer" , (PyCFunction)PyRoutingGauge_getContactLayer , METH_VARARGS
, "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." }
, { "addLayerGauge" , (PyCFunction)PyRoutingGauge_addLayerGauge , METH_VARARGS
, { "addLayerGauge" , (PyCFunction)PyRoutingGauge_addLayerGauge , METH_VARARGS
, "Adds a new RoutingLayerGauge to the RoutingGauge." }
//, { "destroy" , (PyCFunction)PyRoutingGauge_destroy , METH_VARARGS
// , "Destroy the associated hurricane object. The python object remains." }

View File

@ -199,7 +199,7 @@ namespace {
if (xtie >= xmax) break;
if (xtie+feedWidth > xmax) {
// 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 ) {
feed = getEtesian()->getFeedCells().getFeed( pitch );
feedWidth = feed->getAbutmentBox().getWidth();

View File

@ -14,26 +14,23 @@
// +-----------------------------------------------------------------+
#include <iostream>
#include <iomanip>
#include <vector>
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Warning.h"
#include "hurricane/Technology.h"
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "crlcore/CellGauge.h"
#include "crlcore/AllianceFramework.h"
#include "etesian/Configuration.h"
#include "etesian/EtesianEngine.h"
#include <iostream>
#include <iomanip>
#include <vector>
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Warning.h"
#include "hurricane/Technology.h"
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "crlcore/CellGauge.h"
#include "crlcore/AllianceFramework.h"
#include "etesian/Configuration.h"
#include "etesian/EtesianEngine.h"
namespace Etesian {
using std::cout;
using std::cerr;
using std::endl;
@ -51,30 +48,37 @@ namespace Etesian {
// -------------------------------------------------------------------
// Class : "Etesian::Configuration".
Configuration::Configuration ( const CellGauge* cg )
: _cg ( NULL )
Configuration::Configuration ( const RoutingGauge* rg, const CellGauge* cg )
: _rg ( NULL )
, _cg ( NULL )
, _placeEffort ( static_cast<Effort> (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) )
, _updateConf ( static_cast<GraphicUpdate> (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) )
, _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() )
, _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();
}
Configuration::Configuration ( const Configuration& other )
: _cg (NULL)
: _rg (NULL)
, _cg (NULL)
, _placeEffort ( other._placeEffort )
, _updateConf ( other._updateConf )
, _spreadingConf( other._spreadingConf )
, _spaceMargin ( other._spaceMargin )
, _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* record = new Record ( _getString() );
record->add ( getSlot( "_rg" , _rg ) );
record->add ( getSlot( "_cg" , _cg ) );
record->add ( getSlot( "_placeEffort" , (int)_placeEffort ) );
record->add ( getSlot( "_updateConf" , (int)_updateConf ) );

View File

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

View File

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

View File

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