187 lines
6.7 KiB
C++
187 lines
6.7 KiB
C++
|
|
// -*- 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 <string>
|
|
|
|
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<Net*, unsigned long> 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<Net*, set<Occurrence> > netmap;
|
|
forEach(Occurrence,occurrence,getComponentOccurrences()) {
|
|
netmap[( dynamic_cast<Component*>((*occurrence).getEntity()))->getNet()].insert((*occurrence));
|
|
}
|
|
|
|
for ( map<Net*, set<Occurrence> >::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<Net*, unsigned long>::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 " + getString(_number) + " - " + getString(_occurrences.size()) + " occurences>";
|
|
}
|
|
|
|
|
|
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<Occurrence> Equi::getIsEquiFilter (){ return IsEquiFilter();}
|
|
GenericFilter<Occurrence> Equi::getIsComponentFilter (){ return IsComponentFilter();}
|
|
GenericFilter<Occurrence> Equi::getIsNetFilter (){ return IsNetFilter();}
|
|
GenericFilter<Occurrence> Equi::getIsLeafEquiFilter (){ return IsLeafEquiFilter(); }
|
|
GenericFilter<Occurrence> Equi::getIsNotLeafEquiFilter (){ return !IsLeafEquiFilter(); }
|
|
// GenericFilter<Component*> Equi::getIsUsedByExtractFilter (){ return IsUsedByExtractFilter();}
|
|
GenericFilter<Occurrence> 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<Occurrence> l = getEquiOccurrences().getLocator(); return !(l.isValid());};
|
|
bool Equi::hasNetOccurrence () const { GenericLocator<Occurrence> l = getNetOccurrences().getLocator(); return (l.isValid());};
|
|
bool Equi::hasComponentOccurrence () const { GenericLocator<Occurrence> l = getComponentOccurrences().getLocator(); return (l.isValid());};
|
|
|
|
}// End of namespace Equinox
|