* ./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:
parent
966de8279c
commit
22f8a25ced
|
@ -66,7 +66,7 @@ namespace Kite {
|
|||
, _base (base)
|
||||
, _postEventCb ()
|
||||
, _edgeCapacityPercent(0.80)
|
||||
, _expandStep (0.60)
|
||||
, _expandStep (0.99)
|
||||
, _ripupLimits ()
|
||||
, _ripupCost (3)
|
||||
, _eventsLimit (4000000)
|
||||
|
|
|
@ -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 ();
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue