425 lines
11 KiB
C++
425 lines
11 KiB
C++
|
|
// This file is part of the Coriolis Project.
|
|
// Copyright (C) Laboratoire LIP6 - Departement ASIM
|
|
// Universite Pierre et Marie Curie
|
|
//
|
|
// Date : 29/01/2004
|
|
// Author : Hugo Clément <Hugo.Clement@lip6.fr>
|
|
|
|
|
|
#include "hurricane/Technology.h"
|
|
#include "hurricane/DataBase.h"
|
|
#include "hurricane/Contact.h"
|
|
#include "nimbus/Splitter.h"
|
|
#include "nimbus/GCell.h"
|
|
#include "nimbus/Fence.h"
|
|
#include "nimbus/RoutTools.h"
|
|
|
|
namespace Nimbus {
|
|
|
|
using namespace Hurricane;
|
|
|
|
Layer* getGRLayer ()
|
|
{
|
|
return DataBase::getDB()->getTechnology()->getLayer (Name ("SPL1"));
|
|
}
|
|
|
|
#if 0
|
|
Contact* getContact (Net& net, Point& position)
|
|
{
|
|
Contact* contact;
|
|
|
|
//cout << "Searching for " << position << endl;
|
|
|
|
for_each_contact (contact, net.getContacts()) {
|
|
|
|
if (contact->getPosition() == position) {
|
|
return contact;
|
|
} else {
|
|
}
|
|
|
|
end_for;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
Contacts* getContact (Net& net, Box& box)
|
|
{
|
|
|
|
return (net.getContacts().getSubSet (getContactIsUnderFilter (box)));
|
|
}
|
|
#endif
|
|
|
|
Contact* CheckGetContact (Component* compo) {
|
|
Contact* c = NULL;
|
|
|
|
if (dynamic_cast<Contact*> (compo)) {
|
|
c = dynamic_cast<Contact*> (compo);
|
|
} else {
|
|
// empty
|
|
}
|
|
|
|
return c;
|
|
}
|
|
|
|
|
|
// ********************************************************************
|
|
// Rattachements des Splitters à leur Fence
|
|
//
|
|
|
|
#if 0
|
|
void StickSplittersToFences (Cell* cell) {
|
|
|
|
for (unsigned step = 1; true ; step ++) {
|
|
|
|
DisplaySlot* displaySlot = getDisplaySlot (cell, getFenceDisplayName(step));
|
|
|
|
if (!displaySlot)
|
|
return;
|
|
|
|
for_each_net (net, cell->getNets()) {
|
|
|
|
for_each_component (compo, net->getComponents()) {
|
|
|
|
if ( ! (is_a<Splitter*> (compo)) )
|
|
continue;
|
|
|
|
Splitter* splitter = dynamic_cast<Splitter*> (compo);
|
|
|
|
if (splitter->getFence())
|
|
continue;
|
|
|
|
unsigned sstep = splitter->getStep();
|
|
if (sstep != step) continue;
|
|
Point p (splitter->getPosition());
|
|
Box b = Box(p); b.Inflate(getUnit(10));
|
|
for_each_go (go, displaySlot->_getQuadTree().getGosUnder (b)) {
|
|
if ( ! (is_a<Fence*>(go)) )
|
|
continue;
|
|
|
|
Fence* fence = dynamic_cast<Fence*> (go);
|
|
|
|
if (
|
|
(fence->getStep() == sstep)
|
|
)
|
|
{
|
|
fence->attachSplitter (splitter);
|
|
splitter->setFence (fence);
|
|
break;
|
|
}
|
|
|
|
end_for;
|
|
}
|
|
|
|
end_for;
|
|
}
|
|
|
|
end_for;
|
|
}
|
|
}
|
|
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
// ****************************************************************************************************
|
|
// Filters declaration & implementation
|
|
// ****************************************************************************************************
|
|
|
|
class Contact_IsUnderFilter : public Filter<Contact*> {
|
|
// ******************************************************
|
|
|
|
public: Box _area;
|
|
|
|
public: Contact_IsUnderFilter(const Box& area)
|
|
// *********************************************
|
|
: _area(area)
|
|
{
|
|
};
|
|
|
|
public: Contact_IsUnderFilter(const Contact_IsUnderFilter& filter)
|
|
// *******************************************************************
|
|
: _area(filter._area)
|
|
{
|
|
};
|
|
|
|
public: Contact_IsUnderFilter& operator=(const Contact_IsUnderFilter& filter)
|
|
// ******************************************************************************
|
|
{
|
|
_area = filter._area;
|
|
return *this;
|
|
};
|
|
|
|
public: virtual Filter<Contact*>* getClone() const
|
|
// *************************************************
|
|
{
|
|
return new Contact_IsUnderFilter(*this);
|
|
};
|
|
|
|
public: virtual bool accept(Contact* contact) const
|
|
// ****************************************************
|
|
{
|
|
return (_area.intersect(contact->getBoundingBox())) && (getGRLayer() == contact->getLayer());
|
|
};
|
|
|
|
public: virtual string _getString() const
|
|
// **************************************
|
|
{
|
|
return "<" + _TName("Contact::isUnderFilter") + " " + getString(_area) + ">";
|
|
};
|
|
|
|
};
|
|
|
|
|
|
ContactFilter getIsUnderFilter(const Box& area)
|
|
// *********************************************************
|
|
{
|
|
return Contact_IsUnderFilter(area);
|
|
}
|
|
|
|
|
|
ContactFilter getContactIsUnderFilter (const Box& area) {
|
|
|
|
return Contact_IsUnderFilter (area);
|
|
}
|
|
|
|
class GCell_FenceFilter : public Filter<GCell*> {
|
|
|
|
public: Fence* _fence;
|
|
|
|
public: GCell_FenceFilter(Fence* fence)
|
|
: _fence (fence)
|
|
{
|
|
};
|
|
public: GCell_FenceFilter(const GCell_FenceFilter& filter)
|
|
: _fence (filter._fence)
|
|
{
|
|
}
|
|
public: GCell_FenceFilter& operator=(const GCell_FenceFilter& filter)
|
|
{
|
|
_fence = filter._fence;
|
|
return *this;
|
|
};
|
|
public: virtual Filter<GCell*>* getClone() const
|
|
{
|
|
return new GCell_FenceFilter(*this);
|
|
};
|
|
public: virtual bool accept(GCell* gcell) const
|
|
{
|
|
for_each_fence(fence, gcell->getSurroundingFences())
|
|
{
|
|
if (fence->getParentFence() == _fence)
|
|
return true;
|
|
end_for;
|
|
}
|
|
return false;
|
|
};
|
|
public: virtual string _getString() const
|
|
{
|
|
return "<" + _TName("GCell::FenceFilter") + ">";
|
|
};
|
|
};
|
|
|
|
GCellFilter getGCellFenceFilter(Fence* fence)
|
|
{
|
|
return GCell_FenceFilter(fence);
|
|
}
|
|
|
|
|
|
class GCell_StepFilter : public Filter<GCell*> {
|
|
// ******************************************************
|
|
|
|
public: unsigned _step;
|
|
|
|
public: GCell_StepFilter(unsigned step)
|
|
// *********************************************
|
|
: _step(step)
|
|
{
|
|
};
|
|
|
|
public: GCell_StepFilter(const GCell_StepFilter& filter)
|
|
// *******************************************************************
|
|
: _step(filter._step)
|
|
{
|
|
};
|
|
|
|
public: GCell_StepFilter& operator=(const GCell_StepFilter& filter)
|
|
// ******************************************************************************
|
|
{
|
|
_step = filter._step;
|
|
return *this;
|
|
};
|
|
|
|
public: virtual Filter<GCell*>* getClone() const
|
|
// *************************************************
|
|
{
|
|
return new GCell_StepFilter(*this);
|
|
};
|
|
|
|
public: virtual bool accept(GCell* gcell) const
|
|
// ****************************************************
|
|
{
|
|
return (gcell->getStep() == _step);
|
|
};
|
|
|
|
public: virtual string _getString() const
|
|
// **************************************
|
|
{
|
|
return "<" + _TName("GCell::StepFilter") + " " + getString(_step) + ">";
|
|
};
|
|
|
|
};
|
|
|
|
|
|
GCellFilter getStepFilter(unsigned step)
|
|
// *********************************************************
|
|
{
|
|
return GCell_StepFilter(step);
|
|
}
|
|
|
|
|
|
GCellFilter getGCellStepFilter (unsigned step) {
|
|
|
|
return GCell_StepFilter (step);
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fence filtering
|
|
|
|
|
|
class Fence_IsInnerOfFilter : public Filter<Fence*> {
|
|
// ******************************************************
|
|
|
|
public: const GCell* _gc;
|
|
|
|
public: Fence_IsInnerOfFilter(const GCell* gcell)
|
|
// *********************************************
|
|
: _gc(gcell)
|
|
{
|
|
};
|
|
|
|
public: Fence_IsInnerOfFilter(const Fence_IsInnerOfFilter& filter)
|
|
// *******************************************************************
|
|
: _gc(filter._gc)
|
|
{
|
|
};
|
|
|
|
public: Fence_IsInnerOfFilter& operator=(const Fence_IsInnerOfFilter& filter)
|
|
// ******************************************************************************
|
|
{
|
|
_gc = filter._gc;
|
|
return *this;
|
|
};
|
|
|
|
public: virtual Filter<Fence*>* getClone() const
|
|
// *************************************************
|
|
{
|
|
return new Fence_IsInnerOfFilter(*this);
|
|
};
|
|
|
|
public: virtual bool accept(Fence* fence) const
|
|
// ****************************************************
|
|
{
|
|
GCell* gc1 = fence->getGCell1();
|
|
GCell* gc2 = fence->getGCell2();
|
|
return ((gc1 == gc2) && (gc1 == _gc));
|
|
};
|
|
|
|
public: virtual string _getString() const
|
|
// **************************************
|
|
{
|
|
return "<" + _TName("Fence::isInnerOfFilter") + " " + getString(_gc) + ">";
|
|
};
|
|
|
|
};
|
|
|
|
|
|
FenceFilter getIsInnerOfFilter(const GCell* gcell)
|
|
// *********************************************************
|
|
{
|
|
return Fence_IsInnerOfFilter(gcell);
|
|
}
|
|
|
|
|
|
FenceFilter getFenceIsInnerOfFilter (const GCell* gcell) {
|
|
|
|
return Fence_IsInnerOfFilter (gcell);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class Fence_IsSubFenceOfFilter : public Filter<Fence*> {
|
|
// ******************************************************
|
|
|
|
public: const Fence* _fence;
|
|
|
|
public: Fence_IsSubFenceOfFilter(const Fence* fence)
|
|
// *********************************************
|
|
: _fence(fence)
|
|
{
|
|
};
|
|
|
|
public: Fence_IsSubFenceOfFilter(const Fence_IsSubFenceOfFilter& filter)
|
|
// *******************************************************************
|
|
: _fence(filter._fence)
|
|
{
|
|
};
|
|
|
|
public: Fence_IsSubFenceOfFilter& operator=(const Fence_IsSubFenceOfFilter& filter)
|
|
// ******************************************************************************
|
|
{
|
|
_fence = filter._fence;
|
|
return *this;
|
|
};
|
|
|
|
public: virtual Filter<Fence*>* getClone() const
|
|
// *************************************************
|
|
{
|
|
return new Fence_IsSubFenceOfFilter(*this);
|
|
};
|
|
|
|
public: virtual bool accept(Fence* fence) const
|
|
// ****************************************************
|
|
{
|
|
const GCell* gc1 = fence->getGCell1()->getContainer();
|
|
const GCell* gc2 = fence->getGCell2()->getContainer();
|
|
return (
|
|
( gc1 != gc2 )
|
|
&&
|
|
( (gc1 == _fence->getGCell1()) || (gc1 == _fence->getGCell2()) )
|
|
&&
|
|
( (gc2 == _fence->getGCell1()) || (gc2 == _fence->getGCell2()) )
|
|
);
|
|
};
|
|
|
|
public: virtual string _getString() const
|
|
// **************************************
|
|
{
|
|
return "<" + _TName("Fence::isSubFenceOfFilter") + " " + getString(_fence) + ">";
|
|
};
|
|
|
|
}; // class FenceIsSubFenceOfFilter
|
|
|
|
|
|
FenceFilter getIsSubFenceOfFilter(const Fence* fence)
|
|
// *********************************************************
|
|
{
|
|
return Fence_IsSubFenceOfFilter(fence);
|
|
}
|
|
|
|
|
|
FenceFilter getFenceIsSubFenceOfFilter (const Fence* fence) {
|
|
|
|
return Fence_IsSubFenceOfFilter (fence);
|
|
}
|
|
|
|
|
|
} // namespace Nimbus
|