* ./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)
, _postEventCb ()
, _edgeCapacityPercent(0.80)
, _expandStep (0.60)
, _expandStep (0.99)
, _ripupLimits ()
, _ripupCost (3)
, _eventsLimit (4000000)

View File

@ -178,7 +178,7 @@ namespace Kite {
void GraphicKiteEngine::runDetailed ()
{
static vector<Net*> routingNets;
static KatabaticEngine::NetSet routingNets;
KiteEngine* kite = KiteEngine::get ( getCell() );
if ( not kite ) {
@ -191,14 +191,6 @@ namespace Kite {
_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 );
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 );

View File

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

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// 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;
@ -91,6 +115,7 @@ namespace {
Track* track = segment->getTrack();
unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer());
AutoContact* source = segment->base()->getAutoSource();
RoutingPad* rp = NULL;
Interval uside = source->getGCell()->getUSide(direction);
DbU::Unit minConstraint = DbU::Min;
DbU::Unit maxConstraint = DbU::Max;
@ -140,7 +165,7 @@ namespace {
// Finding perpandiculars, by way of the source & target RoutingPad.
if ( source->getAnchor() ) {
RoutingPad* rp = dynamic_cast<RoutingPad*>(source->getAnchor());
rp = dynamic_cast<RoutingPad*>(source->getAnchor());
if ( rp ) {
TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
@ -163,18 +188,25 @@ namespace {
ltracein(200);
if ( perpandiculars.size() == 0 ) {
ltrace(200) << "No perpandiculars to " << segment << endl;
ltraceout(200);
return;
}
Interval constraints ( minConstraint, maxConstraint );
for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) {
ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl;
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);
}
void freeCagedTerminals ( Track* track )
void protectCagedTerminals ( Track* track )
{
Configuration* configuration = Session::getConfiguration ();
const Layer* metal2 = configuration->getRoutingLayer ( 1 );
@ -194,15 +226,6 @@ namespace {
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
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()
, rp
, metal3
@ -278,7 +301,7 @@ namespace Kite {
Track* track = plane->getTrackByIndex ( 0 );
while ( track ) {
freeCagedTerminals ( track );
protectCagedTerminals ( track );
track = track->getNext ();
}
}
@ -288,15 +311,17 @@ namespace Kite {
void KiteEngine::_computeCagedConstraints ()
{
set<TrackElement*> faileds;
TrackElementLut::iterator isegment = _trackSegmentLut.begin();
for ( ; isegment != _trackSegmentLut.end() ; isegment++ ) {
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;
@ -311,7 +336,7 @@ namespace Kite {
segment = Session::lookup ( *isegment );
if ( not segment ) continue;
propagateCagedConstraints ( segment );
propagateCagedConstraints ( segment, faileds );
}
}

View File

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

View File

@ -69,7 +69,9 @@ namespace Kite {
, _insertEvents()
, _removeEvents()
, _sortEvents ()
{ }
{
//_addCanonizeCb ( _computeCagedConstraints );
}
void Session::_postCreate ()
@ -248,8 +250,9 @@ namespace Kite {
# endif
}
set<TrackElement*> faileds;
for ( set<Net*>::iterator inet=netsModificateds.begin() ; inet != netsModificateds.end() ; inet++ ) {
_getKiteEngine()->_computeCagedConstraints ( *inet );
_getKiteEngine()->_computeCagedConstraints ( *inet, faileds );
}
# if defined(CHECK_DATABASE)
@ -261,6 +264,17 @@ namespace Kite {
_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;
}

View File

@ -120,7 +120,7 @@ namespace Kite {
void saveGlobalSolution ();
void annotateGlobalGraph ();
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 setInterrupt ( bool );
virtual void finalizeLayout ();
@ -133,7 +133,7 @@ namespace Kite {
bool _check ( unsigned int& overlap, const char* message=NULL ) const;
void _check ( Net* ) const;
void _computeCagedConstraints ();
void _computeCagedConstraints ( Net* );
void _computeCagedConstraints ( Net*, set<TrackElement*>& );
virtual Record* _getRecord () const;
virtual string _getString () const;
virtual string _getTypeName () const;