* ./kite:

- Change: In Configuration, sets the default expandStep parameter to
        0.99 (gives better results).
    - Change: In KiteEngine::_computeCagedConstraints(), detect and build
        a list of segments on which caged constraints are incompatibles
        (tearing effect shown in ieee_division). All caged constraints
        functions are modificated accordingly.
    - Change: In Session::_revalidate(), makes doglegs on Segment with
        incompatible caged constraints.
    - Mark: vld & ieee_division works.
This commit is contained in:
Jean-Paul Chaput 2010-05-11 11:04:47 +00:00
parent 966de8279c
commit 22f8a25ced
8 changed files with 65 additions and 34 deletions

View File

@ -66,7 +66,7 @@ namespace Kite {
, _base (base) , _base (base)
, _postEventCb () , _postEventCb ()
, _edgeCapacityPercent(0.80) , _edgeCapacityPercent(0.80)
, _expandStep (0.60) , _expandStep (0.99)
, _ripupLimits () , _ripupLimits ()
, _ripupCost (3) , _ripupCost (3)
, _eventsLimit (4000000) , _eventsLimit (4000000)

View File

@ -178,7 +178,7 @@ namespace Kite {
void GraphicKiteEngine::runDetailed () void GraphicKiteEngine::runDetailed ()
{ {
static vector<Net*> routingNets; static KatabaticEngine::NetSet routingNets;
KiteEngine* kite = KiteEngine::get ( getCell() ); KiteEngine* kite = KiteEngine::get ( getCell() );
if ( not kite ) { if ( not kite ) {
@ -191,14 +191,6 @@ namespace Kite {
_viewer->clearToolInterrupt (); _viewer->clearToolInterrupt ();
// kite->setSaturateRatio ( 0.85 );
// kite->setExpandStep ( 0.20 );
// kite->setRipupLimit ( 25, Configuration::BorderRipupLimit );
// kite->setRipupLimit ( 15, Configuration::StrapRipupLimit );
// kite->setRipupLimit ( 5, Configuration::LocalRipupLimit );
// kite->setRipupLimit ( 5, Configuration::GlobalRipupLimit );
// kite->setRipupLimit ( 5, Configuration::LongGlobalRipupLimit );
// kite->setRipupCost ( 3 );
kite->loadGlobalRouting ( Katabatic::LoadGrByNet, routingNets ); kite->loadGlobalRouting ( Katabatic::LoadGrByNet, routingNets );
emit cellPostModificated (); emit cellPostModificated ();

View File

@ -377,7 +377,7 @@ namespace Kite {
} }
void KiteEngine::loadGlobalRouting ( unsigned int method, vector<Net*>& nets ) void KiteEngine::loadGlobalRouting ( unsigned int method, KatabaticEngine::NetSet& nets )
{ {
KatabaticEngine::loadGlobalRouting ( method, nets ); KatabaticEngine::loadGlobalRouting ( method, nets );

View File

@ -173,7 +173,7 @@ int main ( int argc, char *argv[] )
knik->loadSolution (); knik->loadSolution ();
} }
static vector<Net*> routingNets; static KatabaticEngine::NetSet routingNets;
KiteEngine* kite = KiteEngine::create ( cell ); KiteEngine* kite = KiteEngine::create ( cell );
// kite->setSaturateRatio ( 0.85 ); // kite->setSaturateRatio ( 0.85 );
// kite->setExpandStep ( 0.20 ); // kite->setExpandStep ( 0.20 );

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
// //
// =================================================================== // ===================================================================
// //
@ -82,7 +82,31 @@ namespace {
} }
void propagateCagedConstraints ( TrackElement* segment ) void findFailedPerpandiculars ( RoutingPad* rp, unsigned int direction, set<TrackElement*>& faileds )
{
ltrace(200) << "Find failed caging: " << rp << endl;
TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup ( *isegment );
ltrace(200) << "* " << parallel << endl;
if ( parallel->isFixed () ) continue;
if ( parallel->getDirection() != direction ) continue;
AutoContact* contact = parallel->base()->getAutoSource();
if ( contact->base()->getAnchor() != rp ) contact = NULL;
if ( contact == NULL ) contact = parallel->base()->getAutoTarget();
if ( contact->base()->getAnchor() != rp ) continue;
//parallel->makeDogLeg ( contact->getGCell() );
faileds.insert ( parallel );
}
}
void propagateCagedConstraints ( TrackElement* segment, set<TrackElement*>& faileds )
{ {
if ( not segment->isFixed() ) return; if ( not segment->isFixed() ) return;
@ -91,6 +115,7 @@ namespace {
Track* track = segment->getTrack(); Track* track = segment->getTrack();
unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer()); unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer());
AutoContact* source = segment->base()->getAutoSource(); AutoContact* source = segment->base()->getAutoSource();
RoutingPad* rp = NULL;
Interval uside = source->getGCell()->getUSide(direction); Interval uside = source->getGCell()->getUSide(direction);
DbU::Unit minConstraint = DbU::Min; DbU::Unit minConstraint = DbU::Min;
DbU::Unit maxConstraint = DbU::Max; DbU::Unit maxConstraint = DbU::Max;
@ -140,7 +165,7 @@ namespace {
// Finding perpandiculars, by way of the source & target RoutingPad. // Finding perpandiculars, by way of the source & target RoutingPad.
if ( source->getAnchor() ) { if ( source->getAnchor() ) {
RoutingPad* rp = dynamic_cast<RoutingPad*>(source->getAnchor()); rp = dynamic_cast<RoutingPad*>(source->getAnchor());
if ( rp ) { if ( rp ) {
TrackElement* parallel; TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) { forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
@ -163,18 +188,25 @@ namespace {
ltracein(200); ltracein(200);
if ( perpandiculars.size() == 0 ) { if ( perpandiculars.size() == 0 ) {
ltrace(200) << "No perpandiculars to " << segment << endl; ltrace(200) << "No perpandiculars to " << segment << endl;
ltraceout(200);
return;
} }
Interval constraints ( minConstraint, maxConstraint ); Interval constraints ( minConstraint, maxConstraint );
for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) { for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) {
ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl; ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl;
perpandiculars[iperpand]->base()->mergeUserConstraints ( constraints ); perpandiculars[iperpand]->base()->mergeUserConstraints ( constraints );
if ( perpandiculars[iperpand]->base()->getUserConstraints().isEmpty() ) {
ltrace(200) << "Cumulative caged constraints are too tight on " << perpandiculars[iperpand] << endl;
findFailedPerpandiculars ( rp, direction, faileds );
} }
}
ltraceout(200); ltraceout(200);
} }
void freeCagedTerminals ( Track* track ) void protectCagedTerminals ( Track* track )
{ {
Configuration* configuration = Session::getConfiguration (); Configuration* configuration = Session::getConfiguration ();
const Layer* metal2 = configuration->getRoutingLayer ( 1 ); const Layer* metal2 = configuration->getRoutingLayer ( 1 );
@ -194,15 +226,6 @@ namespace {
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor()); RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
GCell* gcell = Session::lookup ( support->getGCell() ); GCell* gcell = Session::lookup ( support->getGCell() );
#if 0
Point point ( segment->base()->getSourceU(), track->getAxis() );
GCell* gcell = Session::lookup ( segment->base()->getAutoSource()->getGCell() );
AutoContact* source = AutoContact::create ( gcell->base(), segment->getNet(), metal3 );
AutoContact* target = AutoContact::create ( gcell->base(), segment->getNet(), metal3 );
source->setPosition ( point );
target->setPosition ( point );
#endif
AutoContact* source = AutoContact::fromRp ( gcell->base() AutoContact* source = AutoContact::fromRp ( gcell->base()
, rp , rp
, metal3 , metal3
@ -278,7 +301,7 @@ namespace Kite {
Track* track = plane->getTrackByIndex ( 0 ); Track* track = plane->getTrackByIndex ( 0 );
while ( track ) { while ( track ) {
freeCagedTerminals ( track ); protectCagedTerminals ( track );
track = track->getNext (); track = track->getNext ();
} }
} }
@ -288,15 +311,17 @@ namespace Kite {
void KiteEngine::_computeCagedConstraints () void KiteEngine::_computeCagedConstraints ()
{ {
set<TrackElement*> faileds;
TrackElementLut::iterator isegment = _trackSegmentLut.begin(); TrackElementLut::iterator isegment = _trackSegmentLut.begin();
for ( ; isegment != _trackSegmentLut.end() ; isegment++ ) { for ( ; isegment != _trackSegmentLut.end() ; isegment++ ) {
if ( not isegment->second->isFixed() ) continue; if ( not isegment->second->isFixed() ) continue;
propagateCagedConstraints ( isegment->second ); propagateCagedConstraints ( isegment->second, faileds );
} }
} }
void KiteEngine::_computeCagedConstraints ( Net* net ) void KiteEngine::_computeCagedConstraints ( Net* net, set<TrackElement*>& faileds )
{ {
TrackElement* segment = NULL; TrackElement* segment = NULL;
@ -311,7 +336,7 @@ namespace Kite {
segment = Session::lookup ( *isegment ); segment = Session::lookup ( *isegment );
if ( not segment ) continue; if ( not segment ) continue;
propagateCagedConstraints ( segment ); propagateCagedConstraints ( segment, faileds );
} }
} }

View File

@ -3614,7 +3614,7 @@ namespace Kite {
{ {
if ( _valid and not force ) return; if ( _valid and not force ) return;
DebugSession::open ( _segment->getNet(), 200 ); DebugSession::open ( _segment->getNet(), 148 );
ltrace(200) << "RoutingEvent::revalidate() - " << (void*)this << ":" << this << endl; ltrace(200) << "RoutingEvent::revalidate() - " << (void*)this << ":" << this << endl;
ltracein(200); ltracein(200);

View File

@ -69,7 +69,9 @@ namespace Kite {
, _insertEvents() , _insertEvents()
, _removeEvents() , _removeEvents()
, _sortEvents () , _sortEvents ()
{ } {
//_addCanonizeCb ( _computeCagedConstraints );
}
void Session::_postCreate () void Session::_postCreate ()
@ -248,8 +250,9 @@ namespace Kite {
# endif # endif
} }
set<TrackElement*> faileds;
for ( set<Net*>::iterator inet=netsModificateds.begin() ; inet != netsModificateds.end() ; inet++ ) { for ( set<Net*>::iterator inet=netsModificateds.begin() ; inet != netsModificateds.end() ; inet++ ) {
_getKiteEngine()->_computeCagedConstraints ( *inet ); _getKiteEngine()->_computeCagedConstraints ( *inet, faileds );
} }
# if defined(CHECK_DATABASE) # if defined(CHECK_DATABASE)
@ -261,6 +264,17 @@ namespace Kite {
_sortEvents.clear (); _sortEvents.clear ();
if ( not faileds.empty() ) {
set<TrackElement*>::iterator ifailed = faileds.begin();
vector<GCell*> gcells;
for ( ; ifailed != faileds.end() ; ++ifailed ) {
(*ifailed)->getGCells ( gcells );
(*ifailed)->makeDogLeg ( gcells[0] );
}
count += _revalidate ();
}
return count; return count;
} }

View File

@ -120,7 +120,7 @@ namespace Kite {
void saveGlobalSolution (); void saveGlobalSolution ();
void annotateGlobalGraph (); void annotateGlobalGraph ();
void runGlobalRouter ( unsigned int mode ); void runGlobalRouter ( unsigned int mode );
virtual void loadGlobalRouting ( unsigned int method, vector<Net*>& ); virtual void loadGlobalRouting ( unsigned int method, KatabaticEngine::NetSet& );
void runNegociate ( unsigned int slowMotion=0 ); void runNegociate ( unsigned int slowMotion=0 );
void setInterrupt ( bool ); void setInterrupt ( bool );
virtual void finalizeLayout (); virtual void finalizeLayout ();
@ -133,7 +133,7 @@ namespace Kite {
bool _check ( unsigned int& overlap, const char* message=NULL ) const; bool _check ( unsigned int& overlap, const char* message=NULL ) const;
void _check ( Net* ) const; void _check ( Net* ) const;
void _computeCagedConstraints (); void _computeCagedConstraints ();
void _computeCagedConstraints ( Net* ); void _computeCagedConstraints ( Net*, set<TrackElement*>& );
virtual Record* _getRecord () const; virtual Record* _getRecord () const;
virtual string _getString () const; virtual string _getString () const;
virtual string _getTypeName () const; virtual string _getTypeName () const;