2010-03-09 09:24:55 -06:00
|
|
|
// -*- C++ -*-
|
|
|
|
//
|
|
|
|
// This file is part of the Coriolis Software.
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
// Copyright (c) UPMC 2008-2014, All Rights Reserved
|
2010-03-09 09:24:55 -06:00
|
|
|
//
|
2013-12-03 18:59:29 -06:00
|
|
|
// +-----------------------------------------------------------------+
|
2010-03-09 09:24:55 -06:00
|
|
|
// | C O R I O L I S |
|
|
|
|
// | K i t e - D e t a i l e d R o u t e r |
|
|
|
|
// | |
|
|
|
|
// | Author : Jean-Paul CHAPUT |
|
|
|
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
|
|
|
// | =============================================================== |
|
|
|
|
// | C++ Module : "./PreProcess.cpp" |
|
2013-12-03 18:59:29 -06:00
|
|
|
// +-----------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
#include <sstream>
|
|
|
|
#include "hurricane/DebugSession.h"
|
|
|
|
#include "hurricane/Bug.h"
|
|
|
|
#include "hurricane/Warning.h"
|
|
|
|
#include "hurricane/Net.h"
|
|
|
|
#include "hurricane/Name.h"
|
|
|
|
#include "hurricane/RoutingPad.h"
|
|
|
|
#include "hurricane/Horizontal.h"
|
|
|
|
#include "katabatic/AutoContactTerminal.h"
|
|
|
|
#include "kite/DataNegociate.h"
|
|
|
|
#include "kite/TrackElement.h"
|
|
|
|
#include "kite/Track.h"
|
|
|
|
#include "kite/RoutingPlane.h"
|
|
|
|
#include "kite/NegociateWindow.h"
|
|
|
|
#include "kite/Session.h"
|
|
|
|
#include "kite/KiteEngine.h"
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
using namespace Hurricane;
|
|
|
|
using namespace CRL;
|
|
|
|
using namespace Kite;
|
2013-12-03 18:59:29 -06:00
|
|
|
using Katabatic::perpandicularTo;
|
|
|
|
using Katabatic::AutoContactTerminal;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
void getPerpandiculars ( TrackElement* segment
|
|
|
|
, Katabatic::AutoContact* from
|
|
|
|
, unsigned int direction
|
|
|
|
, vector<TrackElement*>& perpandiculars
|
2010-03-09 09:24:55 -06:00
|
|
|
)
|
|
|
|
{
|
|
|
|
TrackElement* perpandicular;
|
|
|
|
forEach ( Segment*, isegment, segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
|
|
|
|
perpandicular = Session::lookup ( *isegment );
|
|
|
|
ltrace(200) << "S " << perpandicular << endl;
|
|
|
|
|
|
|
|
if ( not perpandicular or (perpandicular->getDirection() == direction) ) continue;
|
|
|
|
|
|
|
|
perpandiculars.push_back ( perpandicular );
|
|
|
|
}
|
|
|
|
|
|
|
|
forEach ( Segment*, isegment, segment->base()->getAutoTarget()->getSlaveComponents().getSubSet<Segment*>() ) {
|
|
|
|
perpandicular = Session::lookup ( *isegment );
|
|
|
|
ltrace(200) << "T " << perpandicular << endl;
|
|
|
|
|
|
|
|
if ( not perpandicular or (perpandicular->getDirection() == direction) ) continue;
|
|
|
|
|
|
|
|
perpandiculars.push_back ( perpandicular );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-05-11 06:04:47 -05:00
|
|
|
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;
|
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
Katabatic::AutoContact* contact = parallel->base()->getAutoSource();
|
2010-05-11 06:04:47 -05:00
|
|
|
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 )
|
2010-03-09 09:24:55 -06:00
|
|
|
{
|
2013-12-03 18:59:29 -06:00
|
|
|
if (not segment->isFixed()) return;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
ltrace(200) << "Propagate caging: " << segment << endl;
|
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
Track* track = segment->getTrack();
|
2013-12-03 18:59:29 -06:00
|
|
|
//unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer());
|
|
|
|
unsigned int direction = segment->getDirection();
|
2010-12-12 15:42:57 -06:00
|
|
|
Katabatic::AutoContact* source = segment->base()->getAutoSource();
|
|
|
|
RoutingPad* rp = NULL;
|
2013-12-03 18:59:29 -06:00
|
|
|
Interval uside = source->getGCell()->getSide(direction);
|
2010-12-12 15:42:57 -06:00
|
|
|
DbU::Unit minConstraint = DbU::Min;
|
|
|
|
DbU::Unit maxConstraint = DbU::Max;
|
|
|
|
vector<TrackElement*> perpandiculars;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
if ( not track ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
cerr << Bug( "%s is not inserted in a <Track>", getString(segment).c_str() ) << endl;
|
2010-03-09 09:24:55 -06:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Computing constraints from fixed only TrackElements (caging).
|
|
|
|
TrackElement* parallel;
|
|
|
|
size_t i = segment->getIndex();
|
|
|
|
while ( i > 0 ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
parallel = track->getSegment( --i );
|
|
|
|
if (not parallel) continue;
|
|
|
|
if (parallel->getTargetU() < uside.getVMin()) break;
|
|
|
|
if (parallel->getNet() == segment->getNet()) continue;
|
|
|
|
if (not parallel->isFixed()) continue;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
ltrace(200) << "Min Constraint from: " << parallel << endl;
|
2013-12-03 18:59:29 -06:00
|
|
|
minConstraint = max( minConstraint, parallel->getTargetU() );
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
i = segment->getIndex();
|
|
|
|
while ( i < track->getSize()-1 ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
parallel = track->getSegment( ++i );
|
|
|
|
if (not parallel) continue;
|
|
|
|
if (parallel->getSourceU() > uside.getVMax()) break;
|
|
|
|
if (parallel->getNet() == segment->getNet()) continue;
|
|
|
|
if (not parallel->isFixed()) continue;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
ltrace(200) << "Max Constraint from: " << parallel << endl;
|
2013-12-03 18:59:29 -06:00
|
|
|
maxConstraint = min( maxConstraint, parallel->getSourceU() );
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
if (minConstraint > maxConstraint) {
|
|
|
|
cerr << Bug( "%s have too tight caging constraints.", getString(segment).c_str() ) << endl;
|
2010-03-09 09:24:55 -06:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ( (minConstraint <= uside.getVMin()) and (maxConstraint >= uside.getVMax()) ) {
|
|
|
|
ltrace(200) << "No constraints [" << DbU::getValueString(minConstraint)
|
|
|
|
<< ":" << DbU::getValueString(maxConstraint)
|
|
|
|
<< " vs. " << uside << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Finding perpandiculars, by way of the source & target RoutingPad.
|
2013-12-03 18:59:29 -06:00
|
|
|
if (source->getAnchor()) {
|
2010-05-11 06:04:47 -05:00
|
|
|
rp = dynamic_cast<RoutingPad*>(source->getAnchor());
|
2013-12-03 18:59:29 -06:00
|
|
|
if (rp) {
|
2010-03-09 09:24:55 -06:00
|
|
|
TrackElement* parallel;
|
|
|
|
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
parallel = Session::lookup( *isegment );
|
2010-03-09 09:24:55 -06:00
|
|
|
ltrace(200) << "* " << parallel << endl;
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
if (parallel->isFixed ()) continue;
|
|
|
|
if (parallel->isGlobal()) continue;
|
|
|
|
getPerpandiculars( parallel, source, direction, perpandiculars );
|
|
|
|
getPerpandiculars( parallel, segment->base()->getAutoTarget(), direction, perpandiculars );
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
} else {
|
2013-12-03 18:59:29 -06:00
|
|
|
cerr << Bug( "%s is not anchored on a <RoutingPad>\n (%s)"
|
|
|
|
, getString(source).c_str()
|
|
|
|
, getString(source->getAnchor()).c_str() ) << endl;
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Apply caging constraints to perpandiculars.
|
|
|
|
ltracein(200);
|
2013-12-03 18:59:29 -06:00
|
|
|
if (perpandiculars.size() == 0) {
|
2010-03-09 09:24:55 -06:00
|
|
|
ltrace(200) << "No perpandiculars to " << segment << endl;
|
2010-05-11 06:04:47 -05:00
|
|
|
ltraceout(200);
|
|
|
|
return;
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
Interval constraints ( minConstraint, maxConstraint );
|
|
|
|
for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) {
|
|
|
|
ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl;
|
2013-12-03 18:59:29 -06:00
|
|
|
perpandiculars[iperpand]->base()->mergeUserConstraints( constraints );
|
|
|
|
if (perpandiculars[iperpand]->base()->getUserConstraints().isEmpty()) {
|
2010-05-11 06:04:47 -05:00
|
|
|
ltrace(200) << "Cumulative caged constraints are too tight on " << perpandiculars[iperpand] << endl;
|
2013-12-03 18:59:29 -06:00
|
|
|
findFailedPerpandiculars( rp, direction, faileds );
|
2010-05-11 06:04:47 -05:00
|
|
|
}
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
2010-05-11 06:04:47 -05:00
|
|
|
|
2010-03-09 09:24:55 -06:00
|
|
|
ltraceout(200);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
void moveUpCaged ( TrackElement* segment )
|
|
|
|
{
|
|
|
|
DebugSession::open( segment->getNet(), 150 );
|
|
|
|
ltrace(150) << "::moveUpCaged() " << segment << endl;
|
|
|
|
ltracein(150);
|
|
|
|
|
|
|
|
//Configuration* configuration = Session::getConfiguration();
|
|
|
|
//const Layer* metal2 = configuration->getRoutingLayer( 1 );
|
|
|
|
//const Layer* metal3 = configuration->getRoutingLayer( 2 );
|
|
|
|
|
|
|
|
Katabatic::AutoContact* support = segment->base()->getAutoSource();
|
|
|
|
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
|
|
|
|
|
|
|
|
forEach( Component*, icomponent, rp->getSlaveComponents() ) {
|
|
|
|
Horizontal* baseSegment = dynamic_cast<Horizontal*>( *icomponent );
|
|
|
|
TrackElement* accessSegment = Session::lookup( baseSegment );
|
|
|
|
|
|
|
|
if (accessSegment and not accessSegment->isFixed()) {
|
|
|
|
accessSegment->moveUp( Katabatic::KbNoFlags );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ltraceout(150);
|
|
|
|
DebugSession::close();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-05-11 06:04:47 -05:00
|
|
|
void protectCagedTerminals ( Track* track )
|
2010-03-09 09:24:55 -06:00
|
|
|
{
|
2013-12-03 18:59:29 -06:00
|
|
|
ltrace(150) << "protectCagedTerminals() " << track << endl;
|
|
|
|
ltracein(150);
|
|
|
|
|
|
|
|
DbU::Unit lastMovedUp = track->getMin();
|
|
|
|
unsigned int moveUpCount = 0;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
Configuration* configuration = Session::getConfiguration();
|
|
|
|
const Layer* metal2 = configuration->getRoutingLayer( 1 );
|
|
|
|
const Layer* metal3 = configuration->getRoutingLayer( 2 );
|
|
|
|
Net* neighborNet = NULL;
|
|
|
|
|
|
|
|
if (track->getLayer() != metal2) {
|
|
|
|
ltraceout(150);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( size_t i=0 ; i<track->getSize() ; ++i ) {
|
|
|
|
TrackElement* segment = track->getSegment(i);
|
2010-03-09 09:24:55 -06:00
|
|
|
if ( segment and segment->isFixed() and segment->isTerminal() ) {
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() );
|
|
|
|
DbU::Unit ppitch = segment->getPPitch();
|
2010-03-09 09:24:55 -06:00
|
|
|
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
//if (freeInterval.getSize() < ppitch*6) {
|
|
|
|
if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3)
|
|
|
|
or (freeInterval.getVMax() - segment->getTargetU() < ppitch*3) ) {
|
2010-03-09 09:24:55 -06:00
|
|
|
cinfo << "Caged terminal: " << segment << endl;
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
if ( (segment->getLayer () != metal2)
|
|
|
|
or (segment->getLength() >= ppitch)
|
|
|
|
or (segment->getNet () == neighborNet) ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
neighborNet = segment->getNet();
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
if (segment->getSourceU() - lastMovedUp < ppitch*4) {
|
2013-12-03 18:59:29 -06:00
|
|
|
++moveUpCount;
|
|
|
|
if (moveUpCount % 2 == 0) {
|
|
|
|
moveUpCaged( segment );
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
moveUpCount = 0;
|
|
|
|
}
|
|
|
|
lastMovedUp = segment->getSourceU();
|
2010-03-09 09:24:55 -06:00
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
Katabatic::AutoContact* support = segment->base()->getAutoSource();
|
|
|
|
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
|
2013-12-03 18:59:29 -06:00
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
Katabatic::AutoContact* source
|
2013-12-03 18:59:29 -06:00
|
|
|
= Katabatic::AutoContactTerminal::create( support->getGCell()
|
|
|
|
, rp
|
|
|
|
, metal3
|
|
|
|
, rp->getSourcePosition()
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
, DbU::fromLambda(1.0), DbU::fromLambda(1.0)
|
2013-12-03 18:59:29 -06:00
|
|
|
);
|
|
|
|
source->setFlags( Katabatic::CntIgnoreAnchor );
|
|
|
|
|
2010-12-12 15:42:57 -06:00
|
|
|
Katabatic::AutoContact* target =
|
2013-12-03 18:59:29 -06:00
|
|
|
Katabatic::AutoContactTerminal::create( support->getGCell()
|
|
|
|
, rp
|
|
|
|
, metal3
|
|
|
|
, rp->getSourcePosition()
|
Support of RoutingGauge, part 2.
In Katabatic & Kite, remove all hard-coded values related to track pitches.
* New: In <Session>, add more convenience function to access RoutingGauge
characteristics.
* New: In <AutoSegment>, <AutoContact>, add support for the "depth spin",
that is, if the source/target contacts are going "top" or "down".
Used to compute the perpandicular pitch. Need a small modification
of the revalidation mechanism. The observers of <AutoSegment> are
notified when the spin changes.
* New: In <AutoSegment>, the getPPitch() method allow to compute the
"perpandicular pitch". For now it is simply the greatest from the
source perpandicular pitch and the target perpandicular pitch.
Make uses of the "depth spin".
* New: In <TrackElement>, <TrackSegment>, cache the perpandicular pitch.
Updated through the notification from the observable.
2014-05-19 10:58:38 -05:00
|
|
|
, DbU::fromLambda(1.0), DbU::fromLambda(1.0)
|
2013-12-03 18:59:29 -06:00
|
|
|
);
|
|
|
|
target->setFlags( Katabatic::CntIgnoreAnchor );
|
|
|
|
|
|
|
|
AutoSegment* fixedSegment = AutoSegment::create( source, target, Katabatic::KbVertical );
|
|
|
|
fixedSegment->setFlags( Katabatic::SegFixed );
|
|
|
|
Session::getNegociateWindow()->createTrackSegment( fixedSegment, KtLoadingStage );
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
2013-12-03 18:59:29 -06:00
|
|
|
|
|
|
|
neighborNet = segment->getNet();
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
}
|
2013-12-03 18:59:29 -06:00
|
|
|
|
|
|
|
ltraceout(150);
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} // End of local namespace.
|
|
|
|
|
|
|
|
|
|
|
|
namespace Kite {
|
|
|
|
|
|
|
|
|
|
|
|
using Hurricane::Bug;
|
|
|
|
using Hurricane::Net;
|
|
|
|
using Hurricane::Name;
|
2013-12-03 18:59:29 -06:00
|
|
|
using Katabatic::AutoSegmentLut;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
|
|
|
|
|
|
|
void KiteEngine::preProcess ()
|
|
|
|
{
|
2013-12-03 18:59:29 -06:00
|
|
|
for ( size_t i=0 ; i<_routingPlanes.size() ; ++i ) {
|
2010-03-09 09:24:55 -06:00
|
|
|
RoutingPlane* plane = _routingPlanes[i];
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
Track* track = plane->getTrackByIndex( 0 );
|
2010-03-09 09:24:55 -06:00
|
|
|
while ( track ) {
|
2013-12-03 18:59:29 -06:00
|
|
|
protectCagedTerminals( track );
|
|
|
|
track = track->getNextTrack();
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
Session::revalidate ();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KiteEngine::_computeCagedConstraints ()
|
|
|
|
{
|
2010-05-11 06:04:47 -05:00
|
|
|
set<TrackElement*> faileds;
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
TrackElement* segment = NULL;
|
|
|
|
AutoSegmentLut::const_iterator isegment = _getAutoSegmentLut().begin();
|
|
|
|
for ( ; isegment != _getAutoSegmentLut().end() ; isegment++ ) {
|
|
|
|
segment = _lookup( isegment->second );
|
|
|
|
if (not segment or not segment->isFixed()) continue;
|
2010-03-09 09:24:55 -06:00
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
DebugSession::open( segment->getNet() );
|
|
|
|
propagateCagedConstraints( segment, faileds );
|
|
|
|
DebugSession::close();
|
2010-03-09 09:24:55 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-12-03 18:59:29 -06:00
|
|
|
} // Kite namespace.
|