Add a second repair stage after the realing stage of the router.
* New: In Katana::NegotiateWindow::_negociate(), if the realign stage is enabled, perform a second stage of repair after it. To do this we need to reverse the state of events marked as FailedRepair to Repair. We isolate the repair stage in a new dedicated function, NegociateWindow::_negociateRepair(). Maybe should do the same for each other negociate stage.
This commit is contained in:
parent
8c182672dd
commit
15412317ec
|
@ -661,51 +661,7 @@ namespace Katana {
|
|||
if (RoutingEvent::getProcesseds() >= limit) setInterrupt( true );
|
||||
}
|
||||
//_pack( count, true );
|
||||
if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
|
||||
|
||||
//if (not _katana->isChannelMode() ) {
|
||||
cdebug_log(9000,0) << "Deter| Repair Stage" << endl;
|
||||
cmess1 << " o Repair Stage." << endl;
|
||||
|
||||
cdebug_log(159,0) << "Loadind Repair queue." << endl;
|
||||
_katana->setStage( StageRepair );
|
||||
for ( size_t i=0 ; (i<_eventHistory.size()) and not isInterrupted() ; i++ ) {
|
||||
RoutingEvent* event = _eventHistory.getNth(i);
|
||||
|
||||
if (not event->isCloned() and event->isUnimplemented()) {
|
||||
event->reschedule( _eventQueue, 0 );
|
||||
}
|
||||
}
|
||||
_eventQueue.commit();
|
||||
cmess2 << " <repair.queue:" << right << setw(8) << setfill('0')
|
||||
<< _eventQueue.size() << ">" << setfill(' ') << endl;
|
||||
|
||||
count = 0;
|
||||
//_eventQueue.prepareRepair();
|
||||
while ( not _eventQueue.empty() and not isInterrupted() ) {
|
||||
RoutingEvent* event = _eventQueue.pop();
|
||||
|
||||
if (tty::enabled()) {
|
||||
cmess2 << " <repair.event:" << tty::bold << setw(8) << setfill('0')
|
||||
<< RoutingEvent::getProcesseds() << tty::reset
|
||||
<< " remains:" << right << setw(8) << setfill('0')
|
||||
<< _eventQueue.size() << ">"
|
||||
<< setfill(' ') << tty::reset << tty::cr;
|
||||
cmess2.flush();
|
||||
} else {
|
||||
cmess2 << " <repair.event:" << setw(8) << setfill('0')
|
||||
<< RoutingEvent::getProcesseds() << setfill(' ') << " "
|
||||
<< event->getEventLevel() << ":" << event->getPriority() << "> "
|
||||
<< event->getSegment()
|
||||
<< endl;
|
||||
cmess2.flush();
|
||||
}
|
||||
|
||||
event->process( _eventQueue, _eventHistory, _eventLoop );
|
||||
|
||||
count++;
|
||||
if (RoutingEvent::getProcesseds() >= limit) setInterrupt( true );
|
||||
}
|
||||
_negociateRepair();
|
||||
|
||||
if (_katana->getConfiguration()->runRealignStage()) {
|
||||
cmess1 << " o Realign Stage." << endl;
|
||||
|
@ -742,6 +698,8 @@ namespace Katana {
|
|||
count++;
|
||||
if (RoutingEvent::getProcesseds() >= limit) setInterrupt( true );
|
||||
}
|
||||
|
||||
_negociateRepair();
|
||||
}
|
||||
|
||||
if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
|
||||
|
@ -764,6 +722,58 @@ namespace Katana {
|
|||
}
|
||||
|
||||
|
||||
void NegociateWindow::_negociateRepair ()
|
||||
{
|
||||
cdebug_log(159,1) << "NegociateWindow::_negociateRepair() - " << _segments.size() << endl;
|
||||
|
||||
uint64_t limit = _katana->getEventsLimit();
|
||||
uint64_t count = 0;
|
||||
if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
|
||||
|
||||
cmess1 << " o Repair Stage." << endl;
|
||||
cdebug_log(159,0) << "Loadind Repair queue." << endl;
|
||||
|
||||
_katana->setStage( StageRepair );
|
||||
for ( size_t i=0 ; (i<_eventHistory.size()) and not isInterrupted() ; i++ ) {
|
||||
RoutingEvent* event = _eventHistory.getNth(i);
|
||||
if (not event->isCloned() and (event->getState() >= DataNegociate::Unimplemented)) {
|
||||
event->setState( DataNegociate::Repair );
|
||||
event->reschedule( _eventQueue, 0 );
|
||||
}
|
||||
}
|
||||
_eventQueue.commit();
|
||||
cmess2 << " <repair.queue:" << right << setw(8) << setfill('0')
|
||||
<< _eventQueue.size() << ">" << setfill(' ') << endl;
|
||||
|
||||
while ( not _eventQueue.empty() and not isInterrupted() ) {
|
||||
RoutingEvent* event = _eventQueue.pop();
|
||||
|
||||
if (tty::enabled()) {
|
||||
cmess2 << " <repair.event:" << tty::bold << setw(8) << setfill('0')
|
||||
<< RoutingEvent::getProcesseds() << tty::reset
|
||||
<< " remains:" << right << setw(8) << setfill('0')
|
||||
<< _eventQueue.size() << ">"
|
||||
<< setfill(' ') << tty::reset << tty::cr;
|
||||
cmess2.flush();
|
||||
} else {
|
||||
cmess2 << " <repair.event:" << setw(8) << setfill('0')
|
||||
<< RoutingEvent::getProcesseds() << setfill(' ') << " "
|
||||
<< event->getEventLevel() << ":" << event->getPriority() << "> "
|
||||
<< event->getSegment()
|
||||
<< endl;
|
||||
cmess2.flush();
|
||||
}
|
||||
|
||||
event->process( _eventQueue, _eventHistory, _eventLoop );
|
||||
|
||||
count++;
|
||||
if (RoutingEvent::getProcesseds() >= limit) setInterrupt( true );
|
||||
}
|
||||
|
||||
cdebug_tabw(159,-1);
|
||||
}
|
||||
|
||||
|
||||
void NegociateWindow::run ( Flags flags )
|
||||
{
|
||||
cdebug_log(159,1) << "NegociateWindow::run()" << endl;
|
||||
|
|
|
@ -47,19 +47,18 @@ namespace Katana {
|
|||
|
||||
class DataNegociate {
|
||||
public:
|
||||
enum SlackState { RipupPerpandiculars = 1
|
||||
, Minimize = 2
|
||||
, Dogleg = 3
|
||||
, Slacken = 4
|
||||
, ConflictSolveByHistory = 5
|
||||
, ConflictSolveByPlaceds = 6
|
||||
, LocalVsGlobal = 7
|
||||
, MoveUp = 8
|
||||
, MaximumSlack = 9
|
||||
, Unimplemented = 10
|
||||
, Repair = 11
|
||||
, RepairFailed = 12
|
||||
};
|
||||
static const uint32_t RipupPerpandiculars = 1;
|
||||
static const uint32_t Minimize = 2;
|
||||
static const uint32_t Dogleg = 3;
|
||||
static const uint32_t Slacken = 4;
|
||||
static const uint32_t ConflictSolveByHistory = 5;
|
||||
static const uint32_t ConflictSolveByPlaceds = 6;
|
||||
static const uint32_t LocalVsGlobal = 7;
|
||||
static const uint32_t MoveUp = 8;
|
||||
static const uint32_t MaximumSlack = 9;
|
||||
static const uint32_t Unimplemented = 10;
|
||||
static const uint32_t Repair = 11;
|
||||
static const uint32_t RepairFailed = 12;
|
||||
public:
|
||||
DataNegociate ( TrackElement* );
|
||||
~DataNegociate ();
|
||||
|
|
|
@ -110,6 +110,7 @@ namespace Katana {
|
|||
void _associateSymmetrics ();
|
||||
void _pack ( size_t& count, bool last );
|
||||
size_t _negociate ();
|
||||
void _negociateRepair ();
|
||||
Hurricane::Record* _getRecord () const;
|
||||
std::string _getString () const;
|
||||
inline std::string _getTypeName () const;
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
// -*- C++ -*-
|
||||
//
|
||||
// This file is part of the Coriolis Software.
|
||||
// Copyright (c) UPMC 2008-2018, All Rights Reserved
|
||||
// Copyright (c) Sorbonne Université 2008-2022, All Rights Reserved
|
||||
//
|
||||
// +-----------------------------------------------------------------+
|
||||
// | C O R I O L I S |
|
||||
// | K i t e - D e t a i l e d R o u t e r |
|
||||
// | |
|
||||
// | Author : Jean-Paul CHAPUT |
|
||||
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||
// | =============================================================== |
|
||||
// | C++ Header : "./katana/RoutingEvent.h" |
|
||||
// +-----------------------------------------------------------------+
|
||||
|
|
Loading…
Reference in New Issue