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".
|
|
|
|
|
|
|
|
GCell_Edges::Locator::Locator ( const GCell* gcell )
|
|
|
|
: EdgesHL()
|
|
|
|
, _gcell(gcell)
|
|
|
|
, _flags(Flags::EastSide)
|
|
|
|
, _iedge(0)
|
|
|
|
{
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "GCell_Edges::Locator::Locator() " << isValid() << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_gcell->getEastEdges().empty()) progress();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
EdgesHL* GCell_Edges::Locator::getClone () const
|
2016-05-30 11:52:38 -05:00
|
|
|
{
|
|
|
|
cdebug.log(110) << "GCell_Edges::Locator::getClone()" << endl;
|
|
|
|
return new Locator (*this);
|
|
|
|
}
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
Edge* GCell_Edges::Locator::getElement () const
|
|
|
|
{
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::EastSide )) return _gcell->getEastEdges ()[_iedge];
|
|
|
|
if (_flags.contains(Flags::NorthSide)) return _gcell->getNorthEdges()[_iedge];
|
|
|
|
if (_flags.contains(Flags::WestSide )) return _gcell->getWestEdges ()[_iedge];
|
|
|
|
if (_flags.contains(Flags::SouthSide)) return _gcell->getSouthEdges()[_iedge];
|
2016-05-30 04:30:29 -05:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool GCell_Edges::Locator::isValid () const
|
2016-05-30 11:52:38 -05:00
|
|
|
{ return _flags; }
|
2016-05-30 04:30:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
void GCell_Edges::Locator::progress ()
|
|
|
|
{
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "GCell_Edges::Locator::progress() [from] " << _flags << " iedge:" << _iedge << endl;
|
|
|
|
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;
|
|
|
|
while (_flags) {
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::EastSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getEastEdges().size()) break;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "Switching to North side." << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
_flags = Flags::NorthSide;
|
|
|
|
_iedge = 0;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << this << endl;
|
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::NorthSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getNorthEdges().size()) break;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "Switching to West side." << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
_flags = Flags::WestSide;
|
|
|
|
_iedge = 0;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << this << endl;
|
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::WestSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getWestEdges().size()) break;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "Switching to South side." << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
_flags = Flags::SouthSide;
|
|
|
|
_iedge = 0;
|
2016-05-30 11:52:38 -05:00
|
|
|
continue;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::SouthSide)) {
|
2016-05-30 04:30:29 -05:00
|
|
|
if (_iedge < _gcell->getSouthEdges().size()) break;
|
2016-05-30 11:52:38 -05:00
|
|
|
cdebug.log(110) << "All edges done." << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
_flags = 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
|
|
|
|
|
|
|
cdebug.log(110) << "GCell_Edges::Locator::progress() [to] " << _flags << " iedge:" << _iedge << endl;
|
2016-05-30 04:30:29 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string GCell_Edges::Locator::_getString () const
|
|
|
|
{
|
|
|
|
string s = "<GCell_Edges::Locator";
|
2016-05-30 11:52:38 -05:00
|
|
|
if (_flags.contains(Flags::EastSide )) s += " East[" + getString(_iedge) + "]";
|
|
|
|
if (_flags.contains(Flags::NorthSide)) s += " North[" + getString(_iedge) + "]";
|
|
|
|
if (_flags.contains(Flags::WestSide )) s += " West[" + getString(_iedge) + "]";
|
|
|
|
if (_flags.contains(Flags::SouthSide)) s += " South[" + getString(_iedge) + "]";
|
|
|
|
if (_flags == 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
|
|
|
|
{ return new Locator (_gcell); }
|
|
|
|
|
|
|
|
|
|
|
|
string GCell_Edges::_getString () const
|
|
|
|
{
|
|
|
|
string s = "<GCell_Edges "
|
|
|
|
+ getString(_gcell)
|
|
|
|
+ ">";
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // Anabatic namespace.
|