2016-05-30 04:30:29 -05:00
|
|
|
// -*- mode: C++; explicit-buffer-name: "Edges.cpp<anabatic>" -*-
|
|
|
|
//
|
|
|
|
// This file is part of the Coriolis Software.
|
|
|
|
// Copyright (c) UPMC 2016-2016, All Rights Reserved
|
|
|
|
//
|
|
|
|
// +-----------------------------------------------------------------+
|
|
|
|
// | C O R I O L I S |
|
|
|
|
// | A n a b a t i c - Global Routing Toolbox |
|
|
|
|
// | |
|
|
|
|
// | Author : Jean-Paul CHAPUT |
|
|
|
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
|
|
|
// | =============================================================== |
|
|
|
|
// | C++ Module : "./anabatic/Edges.cpp" |
|
|
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
#include "anabatic/Edges.h"
|
|
|
|
#include "anabatic/GCell.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace Anabatic {
|
|
|
|
|
|
|
|
using std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------
|
|
|
|
// Class : "Anabatic::GCell_Edges".
|
|
|
|
|
2016-06-10 11:27:06 -05:00
|
|
|
GCell_Edges::Locator::Locator ( const GCell* gcell, Flags filterFlags )
|
2016-05-30 04:30:29 -05:00
|
|
|
: EdgesHL()
|
2016-06-10 11:27:06 -05:00
|
|
|
, _gcell (gcell)
|
|
|
|
, _stateFlags (Flags::EastSide)
|
|
|
|
, _filterFlags(filterFlags)
|
|
|
|
, _iedge (0)
|
2016-05-30 04:30:29 -05:00
|
|
|
{
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "GCell_Edges::Locator::Locator() " << isValid() << endl;
|
2016-06-10 11:27:06 -05:00
|
|
|
if (_gcell->getEastEdges().empty() or not _filterFlags.contains(Flags::EastSide)) progress();
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EdgesHL* GCell_Edges::Locator::getClone () const
|
2016-05-30 11:52:38 -05:00
|
|
|
{
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "GCell_Edges::Locator::getClone()" << endl;
|
2016-05-30 11:52:38 -05:00
|
|
|
return new Locator (*this);
|
|
|
|
}
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
Edge* GCell_Edges::Locator::getElement () const
|
|
|
|
{
|
2016-06-10 11:27:06 -05:00
|
|
|
if (_stateFlags.contains(Flags::EastSide )) return _gcell->getEastEdges ()[_iedge];
|
|
|
|
if (_stateFlags.contains(Flags::NorthSide)) return _gcell->getNorthEdges()[_iedge];
|
|
|
|
if (_stateFlags.contains(Flags::WestSide )) return _gcell->getWestEdges ()[_iedge];
|
|
|
|
if (_stateFlags.contains(Flags::SouthSide)) return _gcell->getSouthEdges()[_iedge];
|
2016-05-30 04:30:29 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool GCell_Edges::Locator::isValid () const
|
2016-06-10 11:27:06 -05:00
|
|
|
{ return _stateFlags; }
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
void GCell_Edges::Locator::progress ()
|
|
|
|
{
|
2016-06-10 11:27:06 -05:00
|
|
|
// cdebug.log(110) << "GCell_Edges::Locator::progress() [from] " << _stateFlags << " iedge:" << _iedge << endl;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << " East:" << _gcell->getEastEdges().size()
|
|
|
|
// << " North:" << _gcell->getNorthEdges().size()
|
|
|
|
// << " West:" << _gcell->getWestEdges().size()
|
|
|
|
// << " South:" << _gcell->getSouthEdges().size() << endl;
|
|
|
|
// cdebug.log(110) << this << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
++_iedge;
|
2016-06-10 11:27:06 -05:00
|
|
|
while (_stateFlags) {
|
|
|
|
if ((_stateFlags & _filterFlags).contains(Flags::EastSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getEastEdges().size()) break;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "Switching to North side." << endl;
|
2016-06-10 11:27:06 -05:00
|
|
|
_stateFlags = Flags::NorthSide;
|
|
|
|
_iedge = 0;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << this << endl;
|
2016-05-30 11:52:38 -05:00
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-06-10 11:27:06 -05:00
|
|
|
if ((_stateFlags & _filterFlags).contains(Flags::NorthSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getNorthEdges().size()) break;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "Switching to West side." << endl;
|
2016-06-10 11:27:06 -05:00
|
|
|
_stateFlags = Flags::WestSide;
|
|
|
|
_iedge = 0;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << this << endl;
|
2016-05-30 11:52:38 -05:00
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-06-10 11:27:06 -05:00
|
|
|
if ((_stateFlags & _filterFlags).contains(Flags::WestSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getWestEdges().size()) break;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "Switching to South side." << endl;
|
2016-06-10 11:27:06 -05:00
|
|
|
_stateFlags = Flags::SouthSide;
|
|
|
|
_iedge = 0;
|
2016-05-30 11:52:38 -05:00
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-06-10 11:27:06 -05:00
|
|
|
if ((_stateFlags & _filterFlags).contains(Flags::SouthSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getSouthEdges().size()) break;
|
2016-06-03 10:29:22 -05:00
|
|
|
// cdebug.log(110) << "All edges done." << endl;
|
2016-06-10 11:27:06 -05:00
|
|
|
_stateFlags = 0;
|
|
|
|
_iedge = 0;
|
2016-05-30 11:52:38 -05:00
|
|
|
break;;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
|
|
|
}
|
2016-05-30 11:52:38 -05:00
|
|
|
|
2016-06-10 11:27:06 -05:00
|
|
|
cdebug.log(110) << "GCell_Edges::Locator::progress() [to] " << _stateFlags << " iedge:" << _iedge << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string GCell_Edges::Locator::_getString () const
|
|
|
|
{
|
|
|
|
string s = "<GCell_Edges::Locator";
|
2016-06-10 11:27:06 -05:00
|
|
|
if (_stateFlags.contains(Flags::EastSide )) s += " East[" + getString(_iedge) + "]";
|
|
|
|
if (_stateFlags.contains(Flags::NorthSide)) s += " North[" + getString(_iedge) + "]";
|
|
|
|
if (_stateFlags.contains(Flags::WestSide )) s += " West[" + getString(_iedge) + "]";
|
|
|
|
if (_stateFlags.contains(Flags::SouthSide)) s += " South[" + getString(_iedge) + "]";
|
|
|
|
if (_stateFlags == 0) s += " invalid";
|
2016-05-30 04:30:29 -05:00
|
|
|
s += ">";
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EdgesHC* GCell_Edges::getClone () const
|
|
|
|
{ return new GCell_Edges (*this); }
|
|
|
|
|
|
|
|
|
|
|
|
EdgesHL* GCell_Edges::getLocator () const
|
2016-06-10 11:27:06 -05:00
|
|
|
{ return new Locator (_gcell,_filterFlags); }
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
string GCell_Edges::_getString () const
|
|
|
|
{
|
|
|
|
string s = "<GCell_Edges "
|
|
|
|
+ getString(_gcell)
|
|
|
|
+ ">";
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // Anabatic namespace.
|