// -*- C++ -*- // // This file is part of the Coriolis Software. // Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // // =================================================================== // // $Id$ // // x-----------------------------------------------------------------x // | | // | C O R I O L I S | // | E q u i n o x - E x t r a c t o r | // | | // | Author : Wu Yife | // | E-mail : Wu.Yifei@lip6.fr | // | | // | Updater : Bodin bruno | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./Equi.cpp" | // | *************************************************************** | // | U p d a t e s | // | | // x-----------------------------------------------------------------x #include using namespace std; #include "hurricane/Box.h" #include "hurricane/Cell.h" #include "hurricane/Component.h" #include "hurricane/Occurrence.h" #include "hurricane/Collection.h" #include "hurricane/DataBase.h" #include "hurricane/Technology.h" #include "hurricane/Entity.h" #include "hurricane/Filter.h" #include "hurricane/Net.h" #include "hurricane/Commons.h" #include "hurricane/Error.h" #include "hurricane/Relation.h" #include "hurricane/Locator.h" #include "crlcore/Utilities.h" #include "crlcore/ToolEngine.h" #include "equinox/Tile.h" #include "equinox/Equi.h" #include "equinox/Strategy.h" #include "equinox/EquinoxEngine.h" #include "equinox/EquinoxFilters.h" #include "equinox/EquinoxCollections.h" namespace Equinox { using namespace Hurricane; // ------------------------------------------------------------------- // Class : "Equinox::Equi". map Equi::_map_net2nb_usefulcomponent; void Equi::_preDestroy() { if(_nextequi) _nextequi->decrementCount(); _equinox->removeEqui(this); Entity::_preDestroy(); } void Equi::factorizeComponents() { // get all components to netmap (net2Component) map > netmap; forEach(Occurrence,occurrence,getComponentOccurrences()) { netmap[( dynamic_cast((*occurrence).getEntity()))->getNet()].insert((*occurrence)); } for ( map >::iterator i = netmap.begin(); i != netmap.end(); i++ ) { Net * net = (*i).first; //process nb_component and map_net2nb_usefulcomponent[net] unsigned long nb_component = 0; map::iterator end = _map_net2nb_usefulcomponent.end(); if(_map_net2nb_usefulcomponent.find(net)==end) { /* haven't been calculed */ nb_component = net->getComponents().getSubSet(IsUsedByExtractFilter()).getSize(); _map_net2nb_usefulcomponent[net] = nb_component; } else { nb_component = _map_net2nb_usefulcomponent[net] ; } if( (*i).second.size() == nb_component ){ forEach (Occurrence,occurrence,getCollection((*i).second)) _occurrences.erase((*occurrence)); _occurrences.insert(Occurrence(net)); } } } void Equi::_postCreate() { Entity::_postCreate(); _equinox->addEqui(this); } string Equi::_getString() const { return ""; } Equi::Equi(EquinoxEngine* equinox, Equi* nextequi, const unsigned long& number) : Entity() , _equinox(equinox) , _occurrences() , _nextequi(nextequi) , _count(0) , _number(number) { if(!equinox){ throw Error("Can't create Equi: equinox is null"); } } Equi * Equi::create(EquinoxEngine* equinox, Equi* nextequi, const unsigned long& number) { Equi * equi = new Equi(equinox, nextequi, number); if(!equi) { throw Error("can't create Equi : allocation error"); } equi->_postCreate(); return equi; } Cell* Equi::getCell() const { return _equinox->getCell(); } // filters GenericFilter Equi::getIsEquiFilter (){ return IsEquiFilter();} GenericFilter Equi::getIsComponentFilter (){ return IsComponentFilter();} GenericFilter Equi::getIsNetFilter (){ return IsNetFilter();} GenericFilter Equi::getIsLeafEquiFilter (){ return IsLeafEquiFilter(); } GenericFilter Equi::getIsNotLeafEquiFilter (){ return !IsLeafEquiFilter(); } // GenericFilter Equi::getIsUsedByExtractFilter (){ return IsUsedByExtractFilter();} GenericFilter Equi::getIsNetOrComponentFilter (){ return IsNetOrComponentFilter();} Occurrences Equi::getAllOccurrences () const { return AllOccurrencesCollection(this);} Occurrences Equi::getEquiOccurrences () const { return getOccurrences().getSubSet(IsEquiFilter());}; Occurrences Equi::getComponentOccurrences () const { return getOccurrences().getSubSet(IsComponentFilter());}; Occurrences Equi::getNetOccurrences () const { return getOccurrences().getSubSet(IsNetFilter());}; Occurrences Equi::getNetAndComponentOccurrences () const { return getOccurrences().getSubSet(IsNetOrComponentFilter());}; Occurrences Equi::getEquiComponentOccurrences () const { return EquiComponentOccurrencesCollection(this);}; Occurrences Equi::getCurrentComponentOccurrences () const { return CurrentComponentOccurrencesCollection(this); }; bool Equi::isLeafEqui () const { GenericLocator l = getEquiOccurrences().getLocator(); return !(l.isValid());}; bool Equi::hasNetOccurrence () const { GenericLocator l = getNetOccurrences().getLocator(); return (l.isValid());}; bool Equi::hasComponentOccurrence () const { GenericLocator l = getComponentOccurrences().getLocator(); return (l.isValid());}; }// End of namespace Equinox