Merge "collections" branch from <github> (G. Gouvine).

* New: In Hurricane, in Collection add simple STL iterator support.
    So now the C++11 "for" instruction can be used instead of the
    in-house "forEach".
      Example:
         forEach ( Component*, icomponent, net->getComponents() ) {
           cout << (*icomponent) << endl;
         }
      Become:
         for ( Component icomponent : net->getComponents() ) {
           cout << icomponent << endl;
         }
This commit is contained in:
Jean-Paul Chaput 2015-06-08 11:51:09 +02:00
commit 51043df640
18 changed files with 327 additions and 221 deletions

View File

@ -167,7 +167,8 @@ class Configuration ( object ):
elif self._osFedora .match(lines[0]): self._osType = "Linux.fc"
elif self._osLinux_64 .match(lines[0]):
self._osType = "Linux.x86_64"
self._libSuffix = "64"
if os.path.exists("/usr/lib64/"):
self._libSuffix = "64"
elif self._osLinux .match(lines[0]): self._osType = "Linux.i386"
elif self._osDarwin .match(lines[0]): self._osType = "Darwin"
elif self._osFreeBSD8x_amd64.match(lines[0]):

View File

@ -84,7 +84,8 @@ def guessOs ():
libDir = "lib64"
elif osLinux_64.match(lines[0]):
osType = "Linux.x86_64"
libDir = "lib64"
if(os.path.exists("/usr/lib64/")):
libDir = "lib64"
elif osLinux.match(lines[0]):
osType = "Linux.i386"
elif osFreeBSD8x_64.match(lines[0]):

View File

@ -82,6 +82,7 @@ std::int64_t get_HPWL_length(netlist const & circuit, placement_t const & pl, in
std::int64_t get_RSMT_length(netlist const & circuit, placement_t const & pl, index_t net_ind);
std::vector<std::pair<index_t, index_t> > get_MST_topology(std::vector<point<int_t> > const & pins);
std::vector<std::pair<index_t, index_t> > get_RSMT_horizontal_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limits);
point<std::vector<std::pair<index_t, index_t> > > get_RSMT_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limit);
} // namespace coloquinte

View File

@ -343,9 +343,55 @@ std::vector<edge_t> get_big_horizontal_topology_from_sorted(std::vector<point<in
// Sort the tree so that it is usable when building an RSMT
return get_tree_topo_sort(Htopo);
}
} // End anonymous namespace
std::vector<edge_t> get_RSMT_horizontal_topology(std::vector<point<int_t> > const & pins, index_t exactitude_limit){
if(pins.size() <= 1)
return std::vector<edge_t>();
else if(pins.size() == 2)
return std::vector<edge_t>(1, edge_t(0, 1));
else if(pins.size() == 3){
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
auto xpoints=ipoints;
std::sort(xpoints.begin(), xpoints.end(), [](indexed_pt a , indexed_pt b){return a.x_ < b.x_; });
return std::vector<edge_t>{{xpoints[0].index, xpoints[1].index}, {xpoints[1].index, xpoints[2].index}};
}
else{
std::vector<edge_t> horizontal_topology;
// Sort the pins by x coordinate
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
std::sort(ipoints.begin(), ipoints.end(), [](indexed_pt a , indexed_pt b){return a.x_ < b.x_; });
std::vector<point<int_t> > sorted_pins(pins.size());
for(index_t i=0; i<pins.size(); ++i){
sorted_pins[i] = ipoints[i];
}
// Get the topology for this ordering
if(pins.size() <= exactitude_limit){
horizontal_topology = get_small_horizontal_topology_from_sorted(sorted_pins);
}
else{
horizontal_topology = get_big_horizontal_topology_from_sorted(sorted_pins, exactitude_limit);
}
// Back to the original ordering
for(auto & E : horizontal_topology){
E.first = ipoints[E.first].index;
E.second = ipoints[E.second].index;
}
return horizontal_topology;
}
}
std::vector<std::pair<index_t, index_t> > get_MST_topology(std::vector<point<int_t> > const & pins){
std::vector<edge_t> edges;
@ -478,34 +524,8 @@ point<std::vector<std::pair<index_t, index_t> > > get_RSMT_topology(std::vector<
return point<std::vector<edge_t> >{{{xpoints[0].index, xpoints[1].index}, {xpoints[1].index, xpoints[2].index}}, {{ypoints[0].index, ypoints[1].index}, {ypoints[1].index, ypoints[2].index}}};
}
else{
std::vector<edge_t> horizontal_topology;
// Sort the pins by x coordinate
std::vector<indexed_pt> ipoints(pins.size());
for(index_t i=0; i<pins.size(); ++i){
ipoints[i] = indexed_pt(pins[i], i);
}
std::sort(ipoints.begin(), ipoints.end(), [](indexed_pt a , indexed_pt b){return a.x_ < b.x_; });
std::vector<point<int_t> > sorted_pins(pins.size());
for(index_t i=0; i<pins.size(); ++i){
sorted_pins[i] = ipoints[i];
}
// Get the topology for this ordering
if(pins.size() <= exactitude_limit){
horizontal_topology = get_small_horizontal_topology_from_sorted(sorted_pins);
}
else{
horizontal_topology = get_big_horizontal_topology_from_sorted(sorted_pins, exactitude_limit);
}
// Back to the original ordering
for(auto & E : horizontal_topology){
E.first = ipoints[E.first].index;
E.second = ipoints[E.second].index;
}
return point<std::vector<edge_t> >(horizontal_topology, get_vertical_topology(sorted_pins, horizontal_topology));
std::vector<edge_t> horizontal_topology = get_RSMT_horizontal_topology(pins, exactitude_limit);
return point<std::vector<edge_t> >(horizontal_topology, get_vertical_topology(pins, horizontal_topology));
}
}

View File

@ -249,6 +249,7 @@ namespace {
_layerInformations.add ( "CONT_POLY" , "CONT_POLY" , false, false );
_layerInformations.add ( "CONT_POLY2" , "CONT_POLY2" , false, false );
_layerInformations.add ( "CONT_VIA" , "VIA12" , false, false );
_layerInformations.add ( "CONT_VIA1" , "VIA12" , false, false );
_layerInformations.add ( "CONT_VIA2" , "VIA23" , false, false );
_layerInformations.add ( "CONT_VIA3" , "VIA34" , false, false );
_layerInformations.add ( "CONT_VIA4" , "VIA45" , false, false );

View File

@ -338,8 +338,10 @@ namespace {
void Model::connectModels ()
{
for ( Model* blifModel : _blifOrder )
for ( Model* blifModel : _blifOrder ){
cmess2 << "Handling model <" << blifModel->getCell()->getName() << ">" << endl;
blifModel->connectSubckts();
}
}
@ -480,20 +482,62 @@ namespace {
for ( auto connection : subckt->getConnections() ) {
string masterNetName = connection.first;
string netName = connection.second;
//cparanoid << "\tConnection "
// << "plug: <" << masterNetName << ">, "
// << "external: <" << netName << ">."
// << endl;
Net* net = _cell->getNet( netName );
Plug* plug = instance->getPlug( instance->getMasterCell()->getNet(masterNetName) );
Net* plugNet = plug->getNet();
if (not plugNet) {
if (not net) net = Net::create( _cell, netName );
plug->setNet( net );
continue;
Net* masterNet = instance->getMasterCell()->getNet(masterNetName);
if(not masterNet) {
ostringstream tmes;
tmes << "The master net <" << masterNetName << "> hasn't been found "
<< "for instance <" << subckt->getInstanceName() << "> "
<< "of model <" << subckt->getModelName() << ">"
<< "in model <" << getCell()->getName() << ">"
<< endl;
throw Error(tmes.str());
}
if (not net) { plugNet->addAlias( netName ); continue; }
if (plugNet == net) continue;
Plug* plug = instance->getPlug( masterNet );
if(not plug) {
ostringstream tmes;
tmes << "The plug in net <" << netName << "> "
<< "and master net <" << masterNetName << "> hasn't been found "
<< "for instance <" << subckt->getInstanceName() << "> "
<< "of model <" << subckt->getModelName() << ">"
<< "in model <" << getCell()->getName() << ">"
<< endl;
throw Error(tmes.str());
}
plugNet->merge( net );
Net* plugNet = plug->getNet();
if (not plugNet) { // Plug not connected yet
if (not net) net = Net::create( _cell, netName );
plug->setNet( net );
plugNet = net;
}
else if (not net) { // Net doesn't exist yet
plugNet->addAlias( netName );
}
else if (plugNet != net){ // Plus already connected to another net
plugNet->merge( net );
}
if( plugNet->getType() == Net::Type::POWER or plugNet->getType() == Net::Type::GROUND ){
ostringstream tmes;
string powType = plugNet->getType() == Net::Type::POWER ? "power" : "ground";
string plugName = plugNet->getName()._getString(); // Name of the original net
tmes << "Connecting instance <" << subckt->getInstanceName() << "> "
<< "of <" << subckt->getModelName() << "> "
<< "to the " << powType << " net <" << plugName << "> ";
if(netName != plugName)
tmes << "with the alias <" << netName << ">. ";
tmes << "Maybe you should use tie cells?";
cerr << Warning(tmes.str()) << endl;
}
}
}
}
@ -602,7 +646,23 @@ namespace CRL {
if (tokenize.state() & Tokenize::CoverAlias) {
blifModel->mergeAlias( blifLine[1], blifLine[2] );
} else if (tokenize.state() & Tokenize::CoverZero) {
cerr << Warning( "Blif::load() Definition of an alias <%s> of VSS in a \".names\". Maybe you should use tie cells?\n"
" File %s.blif at line %u."
, blifLine[1].c_str()
, blifFile.c_str()
, tokenize.lineno()
) << endl;
//blifModel->mergeAlias( blifLine[1], "vss" );
blifModel->getCell()->getNet( "vss" )->addAlias( blifLine[1] );
} else if (tokenize.state() & Tokenize::CoverOne ) {
cerr << Warning( "Blif::load() Definition of an alias <%s> of VDD in a \".names\". Maybe you should use tie cells?\n"
" File %s.blif at line %u."
, blifLine[1].c_str()
, blifFile.c_str()
, tokenize.lineno()
) << endl;
//blifModel->mergeAlias( blifLine[1], "vdd" );
blifModel->getCell()->getNet( "vdd" )->addAlias( blifLine[1] );
} else {
cerr << Error( "Blif::load() Unsupported \".names\" cover construct.\n"
" File %s.blif at line %u."

View File

@ -353,17 +353,17 @@ namespace Etesian {
double cellLength = 0;
vector<Occurrence> feedOccurrences;
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
string instanceName = (*ioccurrence).getCompactString();
string instanceName = occurrence.getCompactString();
if (CatalogExtension::isFeed(masterCell)) {
cerr << Warning( "Found a feedcell %s in an unplaced design, removing."
, instanceName.c_str()
) << endl;
feedOccurrences.push_back( *ioccurrence );
feedOccurrences.push_back( occurrence );
continue;
}
@ -409,19 +409,19 @@ namespace Etesian {
UpdateSession::open();
vector<Occurrence> feedOccurrences;
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
for( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
dots.dot();
if ( _flatDesign and not (*ioccurrence).getPath().getTailPath().isEmpty())
if ( _flatDesign and not occurrence.getPath().getTailPath().isEmpty())
_flatDesign = true;
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
string instanceName = (*ioccurrence).getCompactString();
string instanceName = occurrence.getCompactString();
if (CatalogExtension::isFeed(masterCell)) {
feedOccurrences.push_back( *ioccurrence );
feedOccurrences.push_back( occurrence );
}
}
@ -466,9 +466,9 @@ namespace Etesian {
Box topAb = getCell()->getAbutmentBox();
UpdateSession::open();
forEach ( Occurrence, ioccurrence, getCell()->getNonLeafInstanceOccurrences() )
for ( Occurrence occurrence : getCell()->getNonLeafInstanceOccurrences() )
{
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
if (masterCell->getAbutmentBox().isEmpty()) {
@ -481,11 +481,11 @@ namespace Etesian {
UpdateSession::close();
index_t instanceId = 0;
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
Cell* masterCell = instance->getMasterCell();
string instanceName = (*ioccurrence).getCompactString();
string instanceName = occurrence.getCompactString();
// Remove the enclosing brackets...
instanceName.erase( 0, 1 );
instanceName.erase( instanceName.size()-1 );
@ -498,7 +498,7 @@ namespace Etesian {
Box instanceAb = masterCell->getAbutmentBox();
Transformation instanceTransf = instance->getTransformation();
(*ioccurrence).getPath().getTransformation().applyOn( instanceTransf );
occurrence.getPath().getTransformation().applyOn( instanceTransf );
instanceTransf.applyOn( instanceAb );
// Upper rounded
@ -536,26 +536,26 @@ namespace Etesian {
vector<temporary_pin> pins;
unsigned int netId = 0;
forEach ( Net*, inet, getCell()->getNets() )
for ( Net* net : getCell()->getNets() )
{
const char* excludedType = NULL;
if ((*inet)->getType() == Net::Type::POWER ) excludedType = "POWER";
if ((*inet)->getType() == Net::Type::GROUND) excludedType = "GROUND";
if ((*inet)->getType() == Net::Type::CLOCK ) excludedType = "CLOCK";
if (net->getType() == Net::Type::POWER ) excludedType = "POWER";
if (net->getType() == Net::Type::GROUND) excludedType = "GROUND";
if (net->getType() == Net::Type::CLOCK ) excludedType = "CLOCK";
if (excludedType) {
cparanoid << Warning( "%s is not a routable net (%s,excluded)."
, getString(*inet).c_str(), excludedType ) << endl;
, getString(net).c_str(), excludedType ) << endl;
continue;
}
if (af->isBLOCKAGE((*inet)->getName())) continue;
if (af->isBLOCKAGE(net->getName())) continue;
dots.dot();
nets[netId] = temporary_net( netId, 1 );
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
string insName = extractInstanceName( *irp );
Point offset = extractRpOffset ( *irp );
for ( RoutingPad* rp : net->getRoutingPads() ) {
string insName = extractInstanceName( rp );
Point offset = extractRpOffset ( rp );
int_t xpin = offset.getX() / pitch;
int_t ypin = offset.getY() / pitch;
@ -651,16 +651,16 @@ namespace Etesian {
// Create different densities
_densityLimits.clear();
forEach(GCell*, gc, grid->getGCells()){
float density = (*gc)->getMaxHVDensity();
for(GCell* gc : grid->getGCells()){
float density = gc->getMaxHVDensity();
if(density >= densityThreshold){
coloquinte::density_limit cur;
cur.box_ = coloquinte::box<int_t>(
(*gc)->getX() / pitch,
(*gc)->getXMax() / pitch,
(*gc)->getY() / pitch,
(*gc)->getYMax() / pitch
gc->getX() / pitch,
gc->getXMax() / pitch,
gc->getY() / pitch,
gc->getYMax() / pitch
);
cur.density_ = densityThreshold/density;
_densityLimits.push_back(cur);
@ -804,6 +804,10 @@ namespace Etesian {
void EtesianEngine::place ()
{
if(getCell()->isPlaced()){
cmess2 << Warning("The cell is already placed; returning") << std::endl;
return;
}
getCell()->uniquify();
getConfiguration()->print( getCell() );
@ -964,11 +968,11 @@ namespace Etesian {
{
UpdateSession::open();
forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() )
for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() )
{
Point instancePosition;
Instance* instance = static_cast<Instance*>((*ioccurrence).getEntity());
string instanceName = (*ioccurrence).getCompactString();
Instance* instance = static_cast<Instance*>(occurrence.getEntity());
string instanceName = occurrence.getCompactString();
// Remove the enclosing brackets...
instanceName.erase( 0, 1 );
instanceName.erase( instanceName.size()-1 );

View File

@ -195,6 +195,24 @@ template<class Type> class Collection {
return record;
}
public:
class iterator{
Locator<Type>* _locator;
public: iterator(Locator<Type>* l) : _locator(l) {}
public: bool operator!=(iterator const & o) const {
bool invalidA = ( _locator == NULL) or not( _locator->isValid());
bool invalidB = (o._locator == NULL) or not(o._locator->isValid());
return invalidA != invalidB or (not invalidA and not invalidB and _locator != o._locator);
}
public: bool operator==(iterator const & o) const { return not(*this != o); }
public: iterator& operator++(){ _locator->progress(); return *this; }
public: Type operator*() { return _locator->getElement(); }
};
public: iterator begin() { return iterator(getLocator()); }
public: iterator end() { return iterator(NULL); }
public: bool empty() { return begin() == end(); }
};

View File

@ -87,16 +87,16 @@ namespace {
void destroyRing ( Net* net )
{
forEach ( RoutingPad*, irp, net->getRoutingPads() ) {
for( RoutingPad* rp : net->getRoutingPads() ) {
bool allMasters = true;
vector<Hook*> ring;
forEach ( Hook*, ihook, irp->getBodyHook()->getHooks() ) {
if (not ihook->isMaster()) { allMasters = false; break; }
ring.push_back( *ihook );
for( Hook* hook : rp->getBodyHook()->getHooks() ) {
if (not hook->isMaster()) { allMasters = false; break; }
ring.push_back( hook );
}
if (allMasters) {
for ( auto ihook : ring ) {
ihook->_setNextHook( ihook );
for ( auto hook : ring ) {
hook->_setNextHook( hook );
}
}
}
@ -183,27 +183,27 @@ namespace {
AllianceFramework* af = AllianceFramework::get();
bool hasPad = false;
forEach ( Instance*, iinstance, _topCell->getInstances() ) {
if (af->isPad(iinstance->getMasterCell())) {
for( Instance* instance : _topCell->getInstances() ) {
if (af->isPad(instance->getMasterCell())) {
if (not hasPad) {
cmess1 << " o Design has pads, assuming complete chip top structure." << endl;
hasPad = true;
}
string padName = getString( iinstance->getMasterCell()->getName() );
string padName = getString( instance->getMasterCell()->getName() );
if (padName.substr(0,8) == "pvddeck_") {
cmess1 << " o Reference power pad: " << iinstance->getName()
<< "(model:" << iinstance->getMasterCell()->getName() << ")." << endl;
cmess1 << " o Reference power pad: " << instance->getName()
<< "(model:" << instance->getMasterCell()->getName() << ")." << endl;
// Guessing the power, ground and clock nets from *this* pad connexions.
forEach ( Plug*, iplug, iinstance->getPlugs() ) {
Net* masterNet = iplug->getMasterNet();
for( Plug* plug : instance->getPlugs() ) {
Net* masterNet = plug->getMasterNet();
Net::Type netType = masterNet->getType();
if ( (netType != Net::Type::POWER )
and (netType != Net::Type::GROUND)
and (netType != Net::Type::CLOCK ) ) continue;
Net* net = iplug->getNet();
Net* net = plug->getNet();
if (not net) {
net = _topCell->getNet( masterNet->getName() );
if (not net) {
@ -216,15 +216,15 @@ namespace {
}
}
padName = getString( iinstance->getMasterCell()->getName() );
padName = getString( instance->getMasterCell()->getName() );
if (padName.substr(0,4) == "pck_") {
cmess1 << " o Reference clock pad: " << iinstance->getName()
<< "(model:" << iinstance->getMasterCell()->getName() << ")." << endl;
cmess1 << " o Reference clock pad: " << instance->getName()
<< "(model:" << instance->getMasterCell()->getName() << ")." << endl;
// Guessing external clock net *only* from *this* pad connexions.
forEach ( Plug*, iplug, iinstance->getPlugs() ) {
Net* masterNet = iplug->getMasterNet();
Net* net = iplug->getNet();
for( Plug* plug : instance->getPlugs() ) {
Net* masterNet = plug->getMasterNet();
Net* net = plug->getNet();
if (not net) {
net = _topCell->getNet( masterNet->getName() );
if (not net) {
@ -259,17 +259,17 @@ namespace {
_vssiPadNetName = "";
_ckoPadNetName = "";
forEach ( Net*, inet, _topCell->getNets() ) {
Net::Type netType = inet->getType();
for( Net* net : _topCell->getNets() ) {
Net::Type netType = net->getType();
if (netType == Net::Type::CLOCK) {
if (not inet->isExternal()) continue;
if (not net->isExternal()) continue;
if (_ckoPadNetName.isEmpty()) {
cmess1 << " - Using <" << inet->getName() << "> as internal (core) clock net." << endl;
_ckoPadNetName = inet->getName();
_cko = *inet;
if (NetRoutingExtension::isMixedPreRoute(*inet)) {
cmess1 << " - Using <" << net->getName() << "> as internal (core) clock net." << endl;
_ckoPadNetName = net->getName();
_cko = net;
if (NetRoutingExtension::isMixedPreRoute(net)) {
cmess1 << " (core clock net is already routed)" << endl;
_flags |= ClockIsRouted;
} else {
@ -278,22 +278,22 @@ namespace {
} else {
cerr << Error("Second clock net <%s> net at top block level will be ignored.\n"
" (will consider only <%s>)"
, getString(inet ->getName()).c_str()
, getString(net ->getName()).c_str()
, getString(_cko->getName()).c_str()
) << endl;
}
}
if (NetRoutingExtension::isManualGlobalRoute(*inet)) continue;
if (NetRoutingExtension::isManualGlobalRoute(net)) continue;
if (netType == Net::Type::POWER) {
if (_vddiPadNetName.isEmpty()) {
_vddiPadNetName = inet->getName();
_vddi = *inet;
_vddiPadNetName = net->getName();
_vddi = net;
} else {
cerr << Error("Second power supply net <%s> net at top block level will be ignored.\n"
" (will consider only <%s>)"
, getString(inet ->getName()).c_str()
, getString(net ->getName()).c_str()
, getString(_vddi->getName()).c_str()
) << endl;
}
@ -301,12 +301,12 @@ namespace {
if (netType == Net::Type::GROUND) {
if (_vssiPadNetName.isEmpty()) {
_vssiPadNetName = inet->getName();
_vssi = *inet;
_vssiPadNetName = net->getName();
_vssi = net;
} else {
cerr << Error("Second power ground net <%s> net at top block level will be ignored.\n"
" (will consider only <%s>)"
, getString(inet ->getName()).c_str()
, getString(net ->getName()).c_str()
, getString(_vssi->getName()).c_str()
) << endl;
}
@ -943,8 +943,8 @@ namespace {
Technology* technology = DataBase::getDB()->getTechnology();
RoutingGauge* rg = _kite->getConfiguration()->getRoutingGauge();
forEach ( Layer*, iLayer, technology->getLayers() ) {
RegularLayer* regular = dynamic_cast<RegularLayer*>(*iLayer);
for( Layer* layer : technology->getLayers() ) {
RegularLayer* regular = dynamic_cast<RegularLayer*>(layer);
if ( not regular
or (regular->getBasicLayer()->getMaterial() != BasicLayer::Material::metal) ) continue;
@ -1300,14 +1300,14 @@ namespace Kite {
QueryPowerRails query ( this );
Technology* technology = DataBase::getDB()->getTechnology();
forEach ( BasicLayer*, iLayer, technology->getBasicLayers() ) {
if ( (iLayer->getMaterial() != BasicLayer::Material::metal)
and (iLayer->getMaterial() != BasicLayer::Material::blockage) )
for( BasicLayer* layer : technology->getBasicLayers() ) {
if ( (layer->getMaterial() != BasicLayer::Material::metal)
and (layer->getMaterial() != BasicLayer::Material::blockage) )
continue;
if (_configuration->isGMetal(*iLayer)) continue;
if (not query.hasBasicLayer(*iLayer)) continue;
if (_configuration->isGMetal(layer)) continue;
if (not query.hasBasicLayer(layer)) continue;
query.setBasicLayer( *iLayer );
query.setBasicLayer( layer );
query.doQuery ();
}
query.ringAddToPowerRails();

View File

@ -91,10 +91,10 @@ namespace Kite {
{
cmess1 << " o Looking for fixed or manually global routed nets." << endl;
forEach ( Net*, inet, getCell()->getNets() ) {
if (*inet == _blockageNet) continue;
if (inet->getType() == Net::Type::POWER ) continue;
if (inet->getType() == Net::Type::GROUND) continue;
for( Net* net : getCell()->getNets() ) {
if (net == _blockageNet) continue;
if (net->getType() == Net::Type::POWER ) continue;
if (net->getType() == Net::Type::GROUND) continue;
// Don't skip the clock.
vector<Segment*> segments;
@ -104,39 +104,39 @@ namespace Kite {
bool isFixed = false;
size_t rpCount = 0;
if (inet->isDeepNet()) {
if (net->isDeepNet()) {
rpCount = 2;
Net* rootNet = dynamic_cast<Net*>(
dynamic_cast<DeepNet*>(*inet)->getRootNetOccurrence().getEntity() );
forEach ( Component*, icomponent, rootNet->getComponents() ) {
if (dynamic_cast<Horizontal*>(*icomponent)) { isFixed = true; break; }
if (dynamic_cast<Vertical*> (*icomponent)) { isFixed = true; break; }
if (dynamic_cast<Contact*> (*icomponent)) { isFixed = true; break; }
dynamic_cast<DeepNet*>(net)->getRootNetOccurrence().getEntity() );
for( Component* component : rootNet->getComponents() ) {
if (dynamic_cast<Horizontal*>(component)) { isFixed = true; break; }
if (dynamic_cast<Vertical*> (component)) { isFixed = true; break; }
if (dynamic_cast<Contact*> (component)) { isFixed = true; break; }
}
} else {
forEach ( Component*, icomponent, inet->getComponents() ) {
if (dynamic_cast<Pin*>(*icomponent)) continue;
for( Component* component : net->getComponents() ) {
if (dynamic_cast<Pin*>(component)) continue;
const RegularLayer* layer = dynamic_cast<const RegularLayer*>(icomponent->getLayer());
const RegularLayer* layer = dynamic_cast<const RegularLayer*>(component->getLayer());
if (layer and (layer->getBasicLayer()->getMaterial() == BasicLayer::Material::blockage))
continue;
Horizontal* horizontal = dynamic_cast<Horizontal*>(*icomponent);
Horizontal* horizontal = dynamic_cast<Horizontal*>(component);
if (horizontal) {
segments.push_back( horizontal );
isPreRouted = true;
if (horizontal->getWidth() != Session::getWireWidth(horizontal->getLayer()))
isFixed = true;
} else {
Vertical* vertical = dynamic_cast<Vertical*>(*icomponent);
Vertical* vertical = dynamic_cast<Vertical*>(component);
if (vertical) {
isPreRouted = true;
segments.push_back( vertical );
if (vertical->getWidth() != Session::getWireWidth(vertical->getLayer()))
isFixed = true;
} else {
Contact* contact = dynamic_cast<Contact*>(*icomponent);
Contact* contact = dynamic_cast<Contact*>(component);
if (contact) {
isPreRouted = true;
contacts.push_back( contact );
@ -144,11 +144,11 @@ namespace Kite {
or (contact->getHeight() != Session::getViaWidth(contact->getLayer())) )
isFixed = true;
} else {
RoutingPad* rp = dynamic_cast<RoutingPad*>(*icomponent);
RoutingPad* rp = dynamic_cast<RoutingPad*>(component);
if (rp) {
++rpCount;
} else {
// Plug* plug = dynamic_cast<Plug*>(*icomponent);
// Plug* plug = dynamic_cast<Plug*>(component);
// if (plug) {
// cerr << "buildPreRouteds(): " << plug << endl;
// ++rpCount;
@ -161,19 +161,19 @@ namespace Kite {
}
if (isFixed or isPreRouted or (rpCount < 2)) {
NetRoutingState* state = getRoutingState( *inet, Katabatic::KbCreate );
NetRoutingState* state = getRoutingState( net, Katabatic::KbCreate );
state->unsetFlags( NetRoutingState::AutomaticGlobalRoute );
state->setFlags ( NetRoutingState::ManualGlobalRoute );
if (rpCount < 2)
state->setFlags ( NetRoutingState::Unconnected );
if (isFixed) {
cmess2 << " - <" << (*inet)->getName() << "> is fixed." << endl;
cmess2 << " - <" << net->getName() << "> is fixed." << endl;
state->unsetFlags( NetRoutingState::ManualGlobalRoute );
state->setFlags ( NetRoutingState::Fixed );
} else {
if (rpCount > 1) {
cmess2 << " - <" << (*inet)->getName() << "> is manually global routed." << endl;
cmess2 << " - <" << net->getName() << "> is manually global routed." << endl;
for ( auto icontact : contacts ) {
AutoContact::createFrom( icontact );
}

View File

@ -216,13 +216,13 @@ namespace Kite {
throw Error("Trying to wipe out a routing with a routing engine\n");
using namespace Hurricane;
UpdateSession::open();
forEach(Net*, inet, cell->getNets()){
if(NetRoutingExtension::isManualGlobalRoute(*inet))
for(Net* net : cell->getNets()){
if(NetRoutingExtension::isManualGlobalRoute(net))
continue;
// First pass: destroy the contacts
std::vector<Contact*> contactPointers;
forEach(Component*, icom, (*inet)->getComponents()){
Contact * contact = dynamic_cast<Contact*>(*icom);
for(Component* com : net->getComponents()){
Contact * contact = dynamic_cast<Contact*>(com);
if(contact){
contactPointers.push_back(contact);
}
@ -231,12 +231,12 @@ namespace Kite {
contact->destroy();
// Second pass: destroy unconnected segments added by Knik as blockages
std::vector<Component*> compPointers;
forEach(Component*, icom, (*inet)->getComponents()){
Horizontal * h = dynamic_cast<Horizontal*>(*icom);
for(Component* com : net->getComponents()){
Horizontal * h = dynamic_cast<Horizontal*>(com);
if(h){
compPointers.push_back(h);
}
Vertical * v = dynamic_cast<Vertical*>(*icom);
Vertical * v = dynamic_cast<Vertical*>(com);
if(v){
compPointers.push_back(v);
}
@ -348,12 +348,12 @@ namespace Kite {
size_t coreReserved = 0;
size_t coronaReserved = 4;
forEach ( Knik::Vertex*, ivertex, _knik->getRoutingGraph()->getVertexes() ) {
for( Knik::Vertex* vertex : _knik->getRoutingGraph()->getVertexes() ) {
for ( int i=0 ; i<2 ; ++i ) {
Knik::Edge* edge = NULL;
if (i==0) {
edge = ivertex->getHEdgeOut();
edge = vertex->getHEdgeOut();
if (not edge) continue;
if (chipTools.hPadsEnclosed(edge->getBoundingBox())) {
@ -362,7 +362,7 @@ namespace Kite {
}
coreReserved = getHTracksReservedLocal();
} else {
edge = ivertex->getVEdgeOut();
edge = vertex->getVEdgeOut();
if (not edge) continue;
if (chipTools.vPadsEnclosed(edge->getBoundingBox())) {
@ -782,13 +782,13 @@ namespace Kite {
coherency = _routingPlanes[i]->_check(overlap) and coherency;
Katabatic::Session* ktbtSession = Session::base ();
forEach ( Net*, inet, getCell()->getNets() ) {
forEach ( Segment*, isegment, inet->getComponents().getSubSet<Segment*>() ) {
AutoSegment* autoSegment = ktbtSession->lookup( *isegment );
for( Net* net : getCell()->getNets() ) {
for( Segment* segment : net->getComponents().getSubSet<Segment*>() ) {
AutoSegment* autoSegment = ktbtSession->lookup( segment );
if (not autoSegment) continue;
if (not autoSegment->isCanonical()) continue;
TrackElement* trackSegment = Session::lookup( *isegment );
TrackElement* trackSegment = Session::lookup( segment );
if (not trackSegment) {
coherency = false;
cerr << Bug( "%p %s without Track Segment"
@ -857,8 +857,8 @@ namespace Kite {
{
cerr << " o Checking " << net << endl;
forEach ( Segment*, isegment, net->getComponents().getSubSet<Segment*>() ) {
TrackElement* trackSegment = _lookup( *isegment );
for( Segment* segment : net->getComponents().getSubSet<Segment*>() ) {
TrackElement* trackSegment = _lookup( segment );
if (trackSegment) {
trackSegment->_check();

View File

@ -716,24 +716,24 @@ namespace Kite {
continue;
canonicals.clear ();
forEach ( TrackElement*, isegment3
, segment2->getPerpandiculars().getSubSet(TrackElements_UniqCanonical(canonicals)) ) {
DataNegociate* data3 = isegment3->getDataNegociate();
for( TrackElement* segment3
: segment2->getPerpandiculars().getSubSet(TrackElements_UniqCanonical(canonicals)) ) {
DataNegociate* data3 = segment3->getDataNegociate();
if ( not data3 ) continue;
RoutingEvent* event3 = data3->getRoutingEvent();
if ( not event3 ) continue;
if ( not toFree.intersect(event3->getConstraints()) ) {
ltrace(200) << " . " << *isegment3 << endl;
ltrace(200) << " . " << segment3 << endl;
continue;
}
ltrace(200) << " | " << *isegment3 << endl;
ltrace(200) << " | " << segment3 << endl;
if ( shrinkRight xor shrinkLeft ) {
if ( shrinkRight ) {
if ( not (success=Manipulator(*isegment3,_fsm)
if ( not (success=Manipulator(segment3,_fsm)
.ripup( SegmentAction::OtherRipupPerpandAndPushAside
, toFree.getVMin() - getPPitch()/2
)) )
@ -741,28 +741,28 @@ namespace Kite {
if ( event3->getTracksFree() == 1 ) {
ltrace(200) << "Potential left intrication with other perpandicular." << endl;
if ( isegment3->getAxis() == segment2->getTargetU() - Session::getExtensionCap(getLayer()) ) {
if ( segment3->getAxis() == segment2->getTargetU() - Session::getExtensionCap(getLayer()) ) {
leftIntrication = true;
leftAxisHint = isegment3->getAxis();
leftAxisHint = segment3->getAxis();
}
}
}
if ( shrinkLeft ) {
if ( not (success=Manipulator(*isegment3,_fsm)
if ( not (success=Manipulator(segment3,_fsm)
.ripup( SegmentAction::OtherRipupPerpandAndPushAside
, toFree.getVMax() + getPPitch()/2
)) )
break;
if ( event3->getTracksFree() == 1 ) {
ltrace(200) << "Potential right intrication with other perpandicular." << endl;
if ( isegment3->getAxis() == segment2->getSourceU() + Session::getExtensionCap(getLayer()) ) {
if ( segment3->getAxis() == segment2->getSourceU() + Session::getExtensionCap(getLayer()) ) {
rightIntrication = true;
rightAxisHint = isegment3->getAxis();
rightAxisHint = segment3->getAxis();
}
}
}
} else {
if ( not (success=Manipulator(*isegment3,_fsm).ripup( SegmentAction::OtherRipup
if ( not (success=Manipulator(segment3,_fsm).ripup( SegmentAction::OtherRipup
| SegmentAction::EventLevel3
)) )
break;
@ -828,16 +828,16 @@ namespace Kite {
continue;
canonicals.clear();
forEach ( TrackElement*, isegment3
, segment2->getPerpandiculars().getSubSet(TrackElements_UniqCanonical(canonicals)) ) {
DataNegociate* data3 = isegment3->getDataNegociate();
for( TrackElement* segment3
: segment2->getPerpandiculars().getSubSet(TrackElements_UniqCanonical(canonicals)) ) {
DataNegociate* data3 = segment3->getDataNegociate();
if (not data3) continue;
RoutingEvent* event3 = data3->getRoutingEvent();
if (not event3) continue;
if (Manipulator(*isegment3,_fsm).canRipup())
_fsm.addAction( *isegment3, SegmentAction::OtherRipup );
if (Manipulator(segment3,_fsm).canRipup())
_fsm.addAction( segment3, SegmentAction::OtherRipup );
}
}
@ -1008,13 +1008,13 @@ namespace Kite {
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(_segment->getLayer());
ltracein(200);
forEach ( Track*, itrack, Tracks_Range::get(plane,uside)) {
for( Track* track : Tracks_Range::get(plane,uside)) {
size_t begin;
size_t end;
itrack->getOverlapBounds( _segment->getCanonicalInterval(), begin, end );
track->getOverlapBounds( _segment->getCanonicalInterval(), begin, end );
for ( ; begin < end ; begin++ ) {
TrackElement* other = itrack->getSegment(begin);
TrackElement* other = track->getSegment(begin);
ltrace(200) << "| " << other << endl;
if (other->getNet() == net) continue;

View File

@ -117,17 +117,17 @@ namespace {
AllianceFramework* af = AllianceFramework::get ();
RoutingGauge* rg = nw->getKiteEngine()->getRoutingGauge();
forEach ( Net*, inet, nw->getCell()->getNets() ) {
if (inet->getType() == Net::Type::POWER ) continue;
if (inet->getType() == Net::Type::GROUND) continue;
if (inet->getType() == Net::Type::CLOCK ) continue;
if (af->isBLOCKAGE(inet->getName())) continue;
for( Net* net : nw->getCell()->getNets() ) {
if (net->getType() == Net::Type::POWER ) continue;
if (net->getType() == Net::Type::GROUND) continue;
if (net->getType() == Net::Type::CLOCK ) continue;
if (af->isBLOCKAGE(net->getName())) continue;
forEach ( RoutingPad*, irp, inet->getRoutingPads() ) {
size_t depth = rg->getLayerDepth(irp->getLayer());
for( RoutingPad* rp : net->getRoutingPads() ) {
size_t depth = rg->getLayerDepth(rp->getLayer());
if (depth > 0) continue;
if (depth == 0)
TrackMarker::create( *irp, 1 );
TrackMarker::create( rp, 1 );
}
}
}
@ -326,8 +326,8 @@ namespace Kite {
const vector<AutoContact*>& contacts = _gcells[igcell]->getContacts();
for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Hook*, ihook, contacts[i]->getBodyHook()->getSlaveHooks() ) {
Hook* sourceHook = dynamic_cast<Segment::SourceHook*>(*ihook);
for( Hook* hook : contacts[i]->getBodyHook()->getSlaveHooks() ) {
Hook* sourceHook = dynamic_cast<Segment::SourceHook*>(hook);
if (not sourceHook) continue;
segment = dynamic_cast<Segment*>(sourceHook->getComponent());
@ -360,8 +360,8 @@ namespace Kite {
ltrace(149) << "AutoSegments from AutoContacts" << endl;
const vector<AutoContact*>& contacts = gcell->getContacts();
for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Component*, component, contacts[i]->getSlaveComponents() ) {
segment = dynamic_cast<Segment*>(*component);
for( Component* component : contacts[i]->getSlaveComponents() ) {
segment = dynamic_cast<Segment*>(component);
autoSegment = Session::base()->lookup( segment );
ltrace(149) << autoSegment << endl;
if (autoSegment and autoSegment->isCanonical()) {

View File

@ -49,8 +49,8 @@ namespace {
)
{
TrackElement* perpandicular;
forEach ( Segment*, isegment, segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( *isegment );
for( Segment* osegment : segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( osegment );
ltrace(200) << "S " << perpandicular << endl;
if ( not perpandicular or (perpandicular->getDirection() == direction) ) continue;
@ -58,8 +58,8 @@ namespace {
perpandiculars.push_back ( perpandicular );
}
forEach ( Segment*, isegment, segment->base()->getAutoTarget()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( *isegment );
for( Segment* osegment : segment->base()->getAutoTarget()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( osegment );
ltrace(200) << "T " << perpandicular << endl;
if ( not perpandicular or (perpandicular->getDirection() == direction) ) continue;
@ -74,8 +74,8 @@ namespace {
ltrace(200) << "Find failed caging: " << rp << endl;
TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup ( *isegment );
for( Segment* osegment : rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup ( osegment );
ltrace(200) << "* " << parallel << endl;
if ( parallel->isFixed () ) continue;
@ -156,8 +156,8 @@ namespace {
rp = dynamic_cast<RoutingPad*>(source->getAnchor());
if (rp) {
TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup( *isegment );
for( Segment* osegment : rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup( osegment );
ltrace(200) << "* " << parallel << endl;
if (parallel->isFixed ()) continue;
@ -207,8 +207,8 @@ namespace {
Katabatic::AutoContact* support = segment->base()->getAutoSource();
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
forEach( Component*, icomponent, rp->getSlaveComponents() ) {
Horizontal* baseSegment = dynamic_cast<Horizontal*>( *icomponent );
for( Component* component : rp->getSlaveComponents() ) {
Horizontal* baseSegment = dynamic_cast<Horizontal*>( component );
TrackElement* accessSegment = Session::lookup( baseSegment );
if (accessSegment and not accessSegment->isFixed()) {

View File

@ -80,16 +80,16 @@ namespace {
vector<Segment*> segments;
forEach ( Segment*, isegment, masterNet->getSegments() ) {
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(isegment->getLayer());
for( Segment* segment : masterNet->getSegments() ) {
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(segment->getLayer());
if ( plane == NULL ) continue;
if ( usedComponent == dynamic_cast<Component*>(*isegment) ) continue;
if ( not NetExternalComponents::isExternal(*isegment) ) continue;
if ( usedComponent == dynamic_cast<Component*>(segment) ) continue;
if ( not NetExternalComponents::isExternal(segment) ) continue;
//cerr << "Looking " << (void*)*isegment << ":" << *isegment << endl;
segments.push_back ( *isegment );
segments.push_back ( segment );
}
for ( size_t i=0 ; i<segments.size() ; ++i ) {
@ -159,15 +159,15 @@ namespace Kite {
{
cmess1 << " o Protect external components not useds as RoutingPads." << endl;
forEach ( Net*, inet, getCell()->getNets() ) {
if ( (*inet)->isSupply() ) continue;
for( Net* net : getCell()->getNets() ) {
if ( net->isSupply() ) continue;
NetRoutingState* state = getRoutingState( *inet );
NetRoutingState* state = getRoutingState( net );
if (state and state->isFixed()) continue;
vector<RoutingPad*> rps;
forEach ( RoutingPad*, irp, (*inet)->getRoutingPads() ) {
rps.push_back ( *irp );
for( RoutingPad* rp : net->getRoutingPads() ) {
rps.push_back ( rp );
}
for ( size_t i=0 ; i<rps.size() ; ++i )

View File

@ -504,15 +504,15 @@ namespace Kite {
and (segment->base()->getAutoSource()->getGCell()->getGlobalsCount(depth) >= 9.0);
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(segment->getLayer());
forEach ( Track*, itrack, Tracks_Range::get(plane,_constraint)) {
for( Track* track : Tracks_Range::get(plane,_constraint)) {
unsigned int costflags = 0;
costflags |= (segment->isLocal() and (depth >= 3)) ? TrackCost::LocalAndTopDepth : 0;
_costs.push_back ( itrack->getOverlapCost(segment,costflags) );
_costs.back().setAxisWeight ( _event->getAxisWeight(itrack->getAxis()) );
_costs.back().incDeltaPerpand ( _data->getWiringDelta(itrack->getAxis()) );
_costs.push_back ( track->getOverlapCost(segment,costflags) );
_costs.back().setAxisWeight ( _event->getAxisWeight(track->getAxis()) );
_costs.back().incDeltaPerpand ( _data->getWiringDelta(track->getAxis()) );
if (segment->isGlobal()) {
ltrace(500) << "Deter| setForGlobal() on " << *itrack << endl;
ltrace(500) << "Deter| setForGlobal() on " << track << endl;
_costs.back().setForGlobal();
}
@ -528,7 +528,7 @@ namespace Kite {
if ( _fullBlocked and (not _costs.back().isBlockage() and not _costs.back().isFixed()) )
_fullBlocked = false;
ltrace(149) << "| " << _costs.back() << ((_fullBlocked)?" FB ": " -- ") << (*itrack) << endl;
ltrace(149) << "| " << _costs.back() << ((_fullBlocked)?" FB ": " -- ") << track << endl;
}
ltraceout(148);

View File

@ -216,16 +216,16 @@ namespace Kite {
ltrace(148) << "getGCells(): sourceGCell: " << sourceGCell << endl;
ltrace(148) << "getGCells(): targetGCell: " << targetGCell << endl;
forEach ( AutoSegment*, isegment, base()->getAligneds() ) {
ltrace(148) << "| " << *isegment << endl;
for( AutoSegment* segment : base()->getAligneds() ) {
ltrace(148) << "| " << segment << endl;
Katabatic::GCell* gcell = isegment->getAutoSource()->getGCell();
Katabatic::GCell* gcell = segment->getAutoSource()->getGCell();
if (gcell->getIndex() < sourceGCell->getIndex()) {
sourceGCell = gcell;
ltrace(148) << "getGCells(): new sourceGCell: " << sourceGCell << endl;
}
gcell = isegment->getAutoTarget()->getGCell();
gcell = segment->getAutoTarget()->getGCell();
if (gcell->getIndex() > targetGCell->getIndex()) {
targetGCell = gcell;
ltrace(148) << "getGCells(): new targetGCell: " << targetGCell << endl;
@ -502,8 +502,8 @@ namespace Kite {
unsigned int direction = perpandicularTo( getDirection() );
TrackElement* dogleg = NULL;
forEach ( Segment*, isegment, base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
dogleg = Session::lookup( *isegment );
for( Segment* segment : base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
dogleg = Session::lookup( segment );
if (dogleg and (dogleg->getDirection() == direction)) {
ltrace(200) << "Source dogleg: " << dogleg << endl;
return dogleg;
@ -519,8 +519,8 @@ namespace Kite {
unsigned int direction = perpandicularTo( getDirection() );
TrackElement* dogleg = NULL;
forEach ( Segment*, isegment, base()->getAutoTarget()->getSlaveComponents().getSubSet<Segment*>() ) {
dogleg = Session::lookup( *isegment );
for( Segment* segment : base()->getAutoTarget()->getSlaveComponents().getSubSet<Segment*>() ) {
dogleg = Session::lookup( segment );
if (dogleg and (dogleg->getDirection() == direction)) {
ltrace(200) << "Target dogleg: " << dogleg << endl;
return dogleg;

View File

@ -89,10 +89,10 @@ namespace Unicorn {
_runUnicornInit();
_importCell.setDialog( _importDialog );
_importCell.addImporter( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1 ) );
_importCell.addImporter( "ACM/SIGDA (aka MCNC, .bench)", std::bind( &AcmSigda::load , placeholders::_1 ) );
_importCell.addImporter( "ISPD'04 (Bookshelf)" , std::bind( &Ispd04::load , placeholders::_1 ) );
_importCell.addImporter( "ISPD'05 (Bookshelf)" , std::bind( &Ispd05::load , placeholders::_1 ) );
_importCell.addImporter( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1 ) );
_importCell.addImporter( "ICCAD'04 (LEF/DEF)" , std::bind( &Iccad04Lefdef::load, placeholders::_1, 0 ) );
_importCell.addImporter( "Alliance compliant DEF" , std::bind( &DefImport::load , placeholders::_1, DefImport::FitAbOnCells) );