// -*- C++ -*- // // This file is part of the Coriolis Software. // Copyright (c) UPMC 2015-2018, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | B o r a - A n a l o g S l i c i n g T r e e | // | | // | Authors : Eric LAO | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./BoxSet.cpp" | // +-----------------------------------------------------------------+ #include "hurricane/Error.h" #include "hurricane/Warning.h" #include "hurricane/Cell.h" #include "crlcore/RoutingGauge.h" #include "bora/BoxSet.h" namespace Bora { using namespace std; using Hurricane::Error; using Hurricane::Warning; // ------------------------------------------------------------------- // Class : "Bora::BoxSet". BoxSet::BoxSet ( DbU::Unit height, DbU::Unit width ) : _height(height) , _width (width) , _cpt (1) { } BoxSet::BoxSet ( BoxSet* boxSet ) : _height(0) , _width (0) , _cpt (1) { if (boxSet) { _height = boxSet->getHeight(); _width = boxSet->getWidth(); _cpt = boxSet->getCpt(); } } BoxSet::~BoxSet () { } void BoxSet::print () const { cerr << "area: " << setprecision(4) << getOccupationArea() ; cerr << "%, \t cpt: " << getCpt(); if ((getWidth() == 0) && (getHeight() == 0)) cerr << ", \t ratio (W/H):inf"; else cerr << ", \t ratio (W/H):" << setprecision(2) << getWidth()/getHeight(); cerr << ", \t ratio (W*H):" << setprecision(4) << DbU::getPhysical(getWidth(),DbU::Micro) * DbU::getPhysical(getHeight(),DbU::Micro) << "umĀ²"; if (getType() == DeviceSNode){ cerr << ", \t Nfing: " << getNFing(); } cerr << ", \t H: " << setprecision(4) << DbU::getPhysical(getHeight(),DbU::Micro) << "um" ; cerr << ", W: " << DbU::getPhysical(getWidth(),DbU::Micro)<< "um"; cerr << endl; } const vector& BoxSet::getSet () const { cerr << Warning( "BoxSet::getSet(): DBoxSet and RHVBoxSet do not have vector of BoxSets." ) << endl; static const vector emptyBoxSet = vector(); return emptyBoxSet; } int BoxSet::getNFing () const { cerr << Warning( "BoxSet::getNFing(): Only DBoxSet has fingers." ) << endl; return 0; } size_t BoxSet::getIndex () const { cerr << Warning( "BoxSet::getIndex(): Only DBoxSet has parameter range indexes." ) << endl; return 0; } void BoxSet::destroy() { if (_cpt < 2) delete this; else --_cpt; } void BoxSet::setWidth ( DbU::Unit ) { cerr << Warning( "BoxSet::setWidth(): Must never be called." ) << endl; } void BoxSet::setHeight ( DbU::Unit ) { cerr << Warning( "BoxSet::setWidth(): Must never be called." ) << endl; } string BoxSet::_getTypeName () const { return "BoxSet"; } string BoxSet::_getString () const { string s = "<" + _getTypeName() + " refs:" + getString(_cpt) + " w:" + DbU::getValueString(getWidth ()) + " h:" + DbU::getValueString(getHeight()) + ">"; return s; } // ------------------------------------------------------------------- // Class : "Bora::HVBoxSet". HVBoxSet::HVBoxSet ( const vector& dimensionSet, DbU::Unit height, DbU::Unit width ) : BoxSet(height,width) ,_dimensionSet(dimensionSet) { for ( BoxSet* bs : _dimensionSet ) bs->incrementCpt(); } HVBoxSet::HVBoxSet ( HVBoxSet* boxSet ) : BoxSet( boxSet ) , _dimensionSet( boxSet->getSet() ) { for ( BoxSet* bs : _dimensionSet ) bs->incrementCpt(); } HVBoxSet::~HVBoxSet () { } double HVBoxSet::getDevicesArea () const { double area = 0; for ( BoxSet* bs : _dimensionSet ) area += bs->getDevicesArea(); return area; } string HVBoxSet::_getTypeName () const { return "HVBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::HBoxSet". int HBoxSet::_count = 0; int HBoxSet::_countAll = 0; HBoxSet::HBoxSet ( const vector& dimensionSet, DbU::Unit height, DbU::Unit width ) : HVBoxSet( dimensionSet, height, width ) { if ((_height == 0) and (_width == 0)) { calculateHeight(); calculateWidth (); } } HBoxSet::HBoxSet( HBoxSet* boxSet ) : HVBoxSet( boxSet ) { ++_count; ++_countAll; } HBoxSet::~HBoxSet () { --_count; } HBoxSet* HBoxSet::create ( const vector& dimensionSet, DbU::Unit height, DbU::Unit width ) { return new HBoxSet( dimensionSet, height, width ); } HBoxSet* HBoxSet::clone () { return HBoxSet::create( getSet(), getHeight(), getWidth() ); } void HBoxSet::calculateHeight () { DbU::Unit currentH = 0; for ( BoxSet* bs : _dimensionSet ) currentH += bs->getHeight(); _height = currentH; } void HBoxSet::calculateWidth () { DbU::Unit currentW = 0; for ( BoxSet* bs : _dimensionSet ) { if (currentW < bs->getWidth()) currentW = bs->getWidth(); } _width = currentW; } void HBoxSet::destroy() { BoxSet::destroy(); } string HBoxSet::_getTypeName () const { return "HBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::VBoxSet". int VBoxSet::_count = 0; int VBoxSet::_countAll = 0; VBoxSet::VBoxSet ( const vector& dimensionSet, DbU::Unit height, DbU::Unit width ) : HVBoxSet( dimensionSet, height, width ) { ++_count; ++_countAll; if ((_height == 0) and (_width == 0)){ calculateHeight(); calculateWidth (); } } VBoxSet::VBoxSet ( VBoxSet* boxSet ) : HVBoxSet( boxSet ) { } VBoxSet::~VBoxSet () { --_count; } VBoxSet* VBoxSet::create ( const vector& dimensionSet, DbU::Unit height, DbU::Unit width ) { return new VBoxSet( dimensionSet, height, width ); } VBoxSet* VBoxSet::clone () { return VBoxSet::create( getSet(), getHeight(), getWidth() ); } void VBoxSet::calculateHeight() { DbU::Unit currentH = 0; for ( BoxSet* bs : _dimensionSet ) { if (currentH < bs->getHeight()) currentH = bs->getHeight(); } _height = currentH; } void VBoxSet::calculateWidth () { DbU::Unit currentW = 0; for ( BoxSet* bs : _dimensionSet ) currentW += bs->getWidth(); _width = currentW; } void VBoxSet::destroy() { BoxSet::destroy(); } string VBoxSet::_getTypeName () const { return "VBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::DBoxSet". int DBoxSet::_count = 0; int DBoxSet::_countAll = 0; DBoxSet::DBoxSet ( DbU::Unit height, DbU::Unit width, size_t index ) : BoxSet( height, width ) , _index(index) { ++_count; ++_countAll; } DBoxSet::DBoxSet ( DBoxSet* boxSet ) : BoxSet( boxSet ) , _index( boxSet->getIndex() ) { } DBoxSet::~DBoxSet () { --_count; } DBoxSet* DBoxSet::create ( Cell* cell, int index, CRL::RoutingGauge* rg ) { DbU::Unit abHeight = cell->getAbutmentBox().getHeight(); DbU::Unit abWidth = cell->getAbutmentBox().getWidth(); if (rg) { DbU::Unit h2pitch = rg->getHorizontalPitch()*2; DbU::Unit v2pitch = rg->getVerticalPitch ()*2; if (abHeight % h2pitch) { cerr << Warning( "DBoxSet::create(): The height of device \"%s\" (%s) is not pitched on 2*%s (adjusted)." , getString(cell->getName()).c_str() , DbU::getValueString(abHeight ).c_str() , DbU::getValueString(h2pitch/2).c_str() ) << endl; abHeight += h2pitch - (abHeight % h2pitch); } if (abWidth % v2pitch) { cerr << Warning( "DBoxSet::create(): The width of device \"%s\" (%s) is not pitched on 2*%s (adjusted)." , getString(cell->getName()).c_str() , DbU::getValueString(abWidth ).c_str() , DbU::getValueString(v2pitch/2).c_str() ) << endl; abWidth += v2pitch - (abWidth % v2pitch); } } return new DBoxSet( abHeight, abWidth, index ); } DBoxSet* DBoxSet::clone () { return new DBoxSet( getHeight(), getWidth(), getNFing() ); } void DBoxSet::destroy() { BoxSet::destroy(); } string DBoxSet::_getTypeName () const { return "DBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::RHVBoxSet". int RHVBoxSet::_count = 0; int RHVBoxSet::_countAll = 0; RHVBoxSet::RHVBoxSet ( DbU::Unit height, DbU::Unit width ) : BoxSet( height, width ) { _width = width; _height = height; } RHVBoxSet::RHVBoxSet ( RHVBoxSet* boxSet ) : BoxSet( boxSet ) { } RHVBoxSet::~RHVBoxSet () { } void RHVBoxSet::destroy () { delete this; } void RHVBoxSet::print () const { cerr << "area: " << setprecision(4) << getOccupationArea() ; cerr << "%, \t cpt: " << getCpt(); cerr << ", \t H: " << setprecision(4) << DbU::getPhysical(_height,DbU::Micro) << "um" ; cerr << ", W: " << DbU::getPhysical(_width,DbU::Micro)<< "um"; cerr << endl; } string RHVBoxSet::_getTypeName () const { return "RHVBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::RHBoxSet". RHBoxSet::RHBoxSet ( DbU::Unit height ) : RHVBoxSet( height, 0 ) { _count++; _countAll++; } RHBoxSet::RHBoxSet ( RHBoxSet* boxSet ) : RHVBoxSet( boxSet ) { } RHBoxSet::~RHBoxSet () { } RHBoxSet* RHBoxSet::create ( DbU::Unit height ) { return new RHBoxSet ( height ); } RHBoxSet* RHBoxSet::clone () { return RHBoxSet::create( getHeight() ); } string RHBoxSet::_getTypeName () const { return "RHBoxSet"; } // ------------------------------------------------------------------- // Class : "Bora::RVBoxSet". RVBoxSet::RVBoxSet ( DbU::Unit width ) : RHVBoxSet( 0, width ) { ++_count; ++_countAll; } RVBoxSet::RVBoxSet( RVBoxSet* boxSet ) : RHVBoxSet( boxSet ) { } RVBoxSet::~RVBoxSet () { } RVBoxSet* RVBoxSet::create ( DbU::Unit width ) { return new RVBoxSet( width ); } RVBoxSet* RVBoxSet::clone() { return RVBoxSet::create( getWidth() ); } string RVBoxSet::_getTypeName () const { return "RVBoxSet"; } } // Bora namespace.