* ./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)
|
, _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)
|
||||||
|
|
|
@ -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 ();
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue