// 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 #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 (compo)) { c = dynamic_cast (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 (compo)) ) continue; Splitter* splitter = dynamic_cast (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(go)) ) continue; Fence* fence = dynamic_cast (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 { // ****************************************************** 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* 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 { 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* 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 { // ****************************************************** 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* 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 { // ****************************************************** 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* 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 { // ****************************************************** 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* 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