* ./kite:

- Change: In TrackSegment, _postDogLeg() & _postModify(), add segments to
        "Ring" if they are directly connected to a RoutingPad. To maintain the
        "border effect" after a topological slackening.
    - Change: In GraphicKiteEngine, in the global routing relateds menus, suppress
        the mention of "solution" as it might be unclear for an average user.
        (just "Save Global Routing" or "Load Global Routing").
    - Change: In RoutingEvent, conflictSolve1() tries to move up "other" blocking
        segment before trying to break "self".
    - Bug: In TrackSegment::reschedule(), remove from Track segments that are
        now in a greater order than the current one. This bug was shown in the
        TrackSegment::_postModify() method after a desalignate.
          It was causing overlaps and/or routing completion false reports.
This commit is contained in:
Jean-Paul Chaput 2010-04-12 11:24:57 +00:00
parent 3069af8a63
commit 974b29b8a7
4 changed files with 53 additions and 8 deletions

View File

@ -286,14 +286,14 @@ namespace Kite {
if ( dRouteAction )
cerr << Warning("GraphicKiteEngine::addToMenu() - Kite detailed router already hooked in.") << endl;
else {
QAction* gLoadSolutionAction = new QAction ( tr("Kite - &Load Global Solution"), _viewer );
gLoadSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.loadSolution" );
QAction* gLoadSolutionAction = new QAction ( tr("Kite - &Load Global Routing"), _viewer );
gLoadSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.loadGlobalRouting" );
gLoadSolutionAction->setStatusTip ( tr("Load a solution for the global routing (.kgr)") );
gLoadSolutionAction->setVisible ( true );
stepMenu->addAction ( gLoadSolutionAction );
QAction* gSaveSolutionAction = new QAction ( tr("Kite - &Save Global Solution"), _viewer );
gSaveSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.saveSolution" );
QAction* gSaveSolutionAction = new QAction ( tr("Kite - &Save Global Routing"), _viewer );
gSaveSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.saveGlobalRouting" );
gSaveSolutionAction->setStatusTip ( tr("Save a global router solution (.kgr)") );
gSaveSolutionAction->setVisible ( true );
stepMenu->addAction ( gSaveSolutionAction );

View File

@ -368,7 +368,8 @@ namespace Kite {
cmess1.flush ();
} else {
cmess2 << " <FirstPass:Negociation - event:" << setw(7) << setfill('0')
<< RoutingEvent::getProcesseds() << setfill(' ') << "> "
<< RoutingEvent::getProcesseds() << setfill(' ') << "> id:"
<< event->getSegment()->getId() << " "
<< event->getSegment()->getNet()->getName()
<< endl;
cmess2.flush();

View File

@ -1188,6 +1188,16 @@ namespace {
Interval overlap0 = candidates[icandidate].getConflict(0);
if ( candidates[icandidate].getLength() == 1 ) {
Track* track = candidates[icandidate].getTrack();
TrackElement* other = track->getSegment(candidates[icandidate].getBegin());
if ( other->isGlobal()
and (other->getDataNegociate()->getGCellOrder() == Session::getOrder())
and other->canMoveUp() ) {
ltrace(200) << "conflictSolve1() - One conflict, other move up" << endl;
if ( (success = other->moveUp()) ) break;
}
ltrace(200) << "conflictSolve1() - One conflict, relaxing self" << endl;
if ( Manipulator(segment,*this).relax(overlap0,relaxFlags) ) {
@ -1233,7 +1243,7 @@ namespace {
//if ( track && (track->getAxis() < constraints.getVMin()) ) track = track->getNext();
//for ( ; !success && track && (track->getAxis() <= constraints.getVMax()) ; track = track->getNext() )
if ( !success && constraintByPerpandiculars ) {
if ( not success and constraintByPerpandiculars ) {
ltrace(200) << "Overconstrained perpandiculars, rip them up. On track:" << endl;
ltrace(200) << " " << track << endl;
Manipulator(segment,*this).ripupPerpandiculars ();
@ -1355,6 +1365,8 @@ namespace {
bool State::slackenTopology ( TrackElement* segment, unsigned int flags )
{
DebugSession::open ( segment->getNet() );
bool success = false;
bool blocked = false;
bool repush = true;
@ -1365,7 +1377,7 @@ namespace {
<< " " << segment << endl;
ltracein(200);
if ( (not segment) or (not data) ) { ltraceout(200); return false; }
if ( (not segment) or (not data) ) { ltraceout(200); DebugSession::close(); return false; }
if ( segment == _event->getSegment() ) _event->resetInsertState();
if ( not (data->isBorder() or data->isRing()) ) {
@ -1374,6 +1386,7 @@ namespace {
if ( not Manipulator(segment,*this).canRipup() ) {
cerr << "[UNSOLVED] " << segment << " slacken topology not allowed for border/ring." << endl;
ltraceout(200);
DebugSession::close ();
return false;
}
}
@ -1387,6 +1400,7 @@ namespace {
} else {
ltrace(200) << "Refusing to slacken border segment." << endl;
ltraceout(200);
DebugSession::close ();
return false;
}
}
@ -1612,6 +1626,7 @@ namespace {
}
ltraceout(200);
DebugSession::close ();
return success;
}

View File

@ -31,6 +31,7 @@
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "hurricane/RoutingPad.h"
#include "katabatic/AutoContact.h"
#include "crlcore/RoutingGauge.h"
#include "kite/GCell.h"
@ -57,6 +58,7 @@ namespace Kite {
using Hurricane::Error;
using Hurricane::Net;
using Hurricane::Name;
using Hurricane::RoutingPad;
// -------------------------------------------------------------------
@ -532,6 +534,11 @@ namespace Kite {
} else {
if ( _data and _data->hasRoutingEvent() )
_data->getRoutingEvent()->setDisabled();
if ( getOrder() > Session::getOrder() ) {
if ( _track != NULL )
Session::addRemoveEvent ( this );
}
}
ltraceout(200);
}
@ -1000,6 +1007,16 @@ namespace Kite {
ltrace(200) << "Adding to ring: " << segments[i] << endl;
Session::getNegociateWindow()->addToRing ( segments[i] );
}
} else {
if ( segments[i]->getOrder() > Session::getOrder()) {
AutoContact* source = segments[i]->base()->getAutoSource();
AutoContact* target = segments[i]->base()->getAutoTarget();
if ( (source and dynamic_cast<RoutingPad*>(source->getAnchor()))
or (target and dynamic_cast<RoutingPad*>(target->getAnchor()))) {
ltrace(200) << "Adding to ring: " << segments[i] << endl;
Session::getNegociateWindow()->addToRing ( segments[i] );
}
}
}
//if ( i == 1 ) {
// RoutingEvent* event = segments[i]->getDataNegociate()->getRoutingEvent();
@ -1041,7 +1058,9 @@ namespace Kite {
#if ENABLE_STIFFNESS
updateGCellsStiffness ( TrackElement::RemoveFromGCells );
#endif
_base->desalignate ();
#if ENABLE_STIFFNESS
updateGCellsStiffness ( TrackElement::AddToGCells );
#endif
@ -1081,7 +1100,7 @@ namespace Kite {
unsigned int perpandicularDir = Constant::perpandicular ( parallelDir );
const vector<AutoSegment*>& invalidateds = Session::getInvalidateds();
vector<TrackElement*> segments;
vector<TrackElement*> segments;
if ( not invalidateds.empty() ) {
for ( size_t i=0 ; i<invalidateds.size() ; i++ ) {
@ -1114,6 +1133,16 @@ namespace Kite {
}
segment->reschedule ( 0 );
}
} else if ( segment->getDataNegociate()->getGCellOrder() > Session::getOrder()) {
if ( segment->getDirection() == parallelDir ) {
AutoContact* source = segment->base()->getAutoSource();
AutoContact* target = segment->base()->getAutoTarget();
if ( (source and dynamic_cast<RoutingPad*>(source->getAnchor()))
or (target and dynamic_cast<RoutingPad*>(target->getAnchor()))) {
ltrace(200) << "Adding to ring: " << segment << endl;
Session::getNegociateWindow()->addToRing ( segment );
}
}
}
}