diff --git a/crlcore/src/ccore/crlcore/CellGauge.h b/crlcore/src/ccore/crlcore/CellGauge.h
index 1ab2b9b2..fd63b606 100644
--- a/crlcore/src/ccore/crlcore/CellGauge.h
+++ b/crlcore/src/ccore/crlcore/CellGauge.h
@@ -1,4 +1,3 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
diff --git a/katabatic/doc/AutoSegment.dox b/katabatic/doc/AutoSegment.dox
index e0177f1e..3e6daeaa 100644
--- a/katabatic/doc/AutoSegment.dox
+++ b/katabatic/doc/AutoSegment.dox
@@ -185,6 +185,18 @@
//! This AutoSegment has been created to to reconnect parts of an AutoSegment
//! after slackening.
+ //! \var AutoSegmentFlag::SegSourceTop
+ //! The source contact of this segment is connected to the top layer.
+
+ //! \var AutoSegmentFlag::SegSourceBottom
+ //! The source contact of this segment is connected to the bottom layer.
+
+ //! \var AutoSegmentFlag::SegTargetTop
+ //! The target contact of this segment is connected to the top layer.
+
+ //! \var AutoSegmentFlag::SegTargetBottom
+ //! The target contact of this segment is connected to the bottom layer.
+
//! \var AutoSegmentFlag::SegLayerChange
//! This AutoSegment has been created to to reconnect parts of an AutoSegment
//! after a layer change.
diff --git a/katabatic/doc/Constants.dox b/katabatic/doc/Constants.dox
index 30235646..ae66a706 100644
--- a/katabatic/doc/Constants.dox
+++ b/katabatic/doc/Constants.dox
@@ -31,11 +31,13 @@
//! \var KbWithPerpands
//! Request that AutoSegments in perpandicular direction should be includeds.
- //! \var KbBySource
- //! Request AutoSegments anchored by their source anchor.
+ //! \var KbSource
+ //! Request AutoSegments anchored by their source anchor or that some
+ //! operation has to be performed on the source.
- //! \var KbByTarget
- //! Request AutoSegments anchored by their target anchor.
+ //! \var KbTarget
+ //! Request AutoSegments anchored by their target anchor or that some
+ //! operation has to be performed on the target.
//! \var KbWarnOnError
//! Display a warning if something has gone wrong.
diff --git a/katabatic/doc/SoC.css b/katabatic/doc/SoC.css
index fccd7194..98351ca2 100644
--- a/katabatic/doc/SoC.css
+++ b/katabatic/doc/SoC.css
@@ -286,7 +286,7 @@
border: 2px solid black;
}
- div.center {
+ div.center, div.image {
text-align: center;
}
diff --git a/katabatic/src/AutoContact.cpp b/katabatic/src/AutoContact.cpp
index 79b91d71..89335823 100644
--- a/katabatic/src/AutoContact.cpp
+++ b/katabatic/src/AutoContact.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -30,7 +29,6 @@
#include "hurricane/RoutingPad.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "hurricane/DebugSession.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContact.h"
@@ -90,10 +88,10 @@ namespace Katabatic {
restoreNativeConstraintBox();
ltrace(90) << "Native CBox: " << this
- << " <" << DbU::getLambda(getCBXMin())
- << " " << DbU::getLambda(getCBYMin())
- << " " << DbU::getLambda(getCBXMax())
- << " " << DbU::getLambda(getCBYMax()) << ">" << endl;
+ << " <" << DbU::toLambda(getCBXMin())
+ << " " << DbU::toLambda(getCBYMin())
+ << " " << DbU::toLambda(getCBXMax())
+ << " " << DbU::toLambda(getCBYMax()) << ">" << endl;
Session::link( this );
invalidate( KbTopology );
@@ -212,6 +210,9 @@ namespace Katabatic {
void AutoContact::getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& processeds )
{
+ DbU::Unit hSideLength = getGCell()->getSide( KbHorizontal ).getSize();
+ DbU::Unit vSideLength = getGCell()->getSide( KbVertical ).getSize();
+
forEach ( AutoSegment*, isegment, getAutoSegments() ) {
bool isSourceHook = (isegment->getAutoSource() == this);
@@ -223,9 +224,11 @@ namespace Katabatic {
if (isegment->isLocal()) {
length = isegment->getLength();
lengths[depth] += length;
- if ( not isegment->isUnbound() and (abs(length) > DbU::lambda(50.0)) )
+
+ DbU::Unit sideLength = (isegment->isHorizontal()) ? hSideLength : vSideLength;
+ if ( not isegment->isUnbound() and (abs(length) > sideLength) )
cerr << Error("Suspicious length:%.2f of %s."
- ,DbU::getLambda(length),getString(*isegment).c_str()) << endl;
+ ,DbU::toLambda(length),getString(*isegment).c_str()) << endl;
} else {
if ( isegment->isHorizontal() ) {
if ( isSourceHook )
@@ -249,20 +252,28 @@ namespace Katabatic {
Interval AutoContact::getNativeUConstraints ( unsigned int direction ) const
{
- Box nativeConstraints = getNativeConstraintBox();
+ Box nativeConstraints = getNativeConstraintBox();
+ Interval constraint;
if (direction & KbHorizontal) {
- return Interval( nativeConstraints.getXMin(), nativeConstraints.getXMax() );
+ constraint = Interval( nativeConstraints.getXMin(), nativeConstraints.getXMax() );
+ } else {
+ constraint = Interval( nativeConstraints.getYMin(), nativeConstraints.getYMax() );
}
- return Interval( nativeConstraints.getYMin(), nativeConstraints.getYMax() );
+ if (direction & KbNoGCellShrink) constraint.inflate( 0, GCell::getTopRightShrink() );
+ return constraint;
}
Interval AutoContact::getUConstraints ( unsigned int direction ) const
{
+ Interval constraint;
if (direction & KbHorizontal) {
- return Interval( getCBXMin(), getCBXMax() );
+ constraint = Interval( getCBXMin(), getCBXMax() );
+ } else {
+ constraint = Interval( getCBYMin(), getCBYMax() );
}
- return Interval( getCBYMin(), getCBYMax() );
+ if (direction & KbNoGCellShrink) constraint.inflate( 0, GCell::getTopRightShrink() );
+ return constraint;
}
@@ -429,13 +440,13 @@ namespace Katabatic {
cerr << Error ( "Incompatible DY restriction on %s", _getString().c_str() ) << endl;
if ( constraintMin > getCBYMax() )
cerr << Error ( "(constraintMin > CBYMax : %.2lf > %.2lf)"
- , DbU::getLambda(constraintMin)
- , DbU::getLambda(getCBYMax()) )
+ , DbU::toLambda(constraintMin)
+ , DbU::toLambda(getCBYMax()) )
<< endl;
if ( constraintMax < getCBYMin() )
cerr << Error ( "(constraintMax < CBYMin : %.2lf < %.2lf)"
- , DbU::getLambda(constraintMax)
- , DbU::getLambda(getCBYMin()) )
+ , DbU::toLambda(constraintMax)
+ , DbU::toLambda(getCBYMin()) )
<< endl;
return false;
}
@@ -448,13 +459,13 @@ namespace Katabatic {
cerr << Error ( "Incompatible DX restriction on %s", _getString().c_str() ) << endl;
if ( constraintMin > getCBXMax() )
cerr << Error ( "(constraintMin > CBXMax : %.2lf > %.2lf)"
- , DbU::getLambda(constraintMin)
- , DbU::getLambda(getCBXMax()) )
+ , DbU::toLambda(constraintMin)
+ , DbU::toLambda(getCBXMax()) )
<< endl;
if ( constraintMax < getCBXMin() )
cerr << Error ( "(constraintMax < CBXMin : %.2lf < %.2lf)"
- , DbU::getLambda(constraintMax)
- , DbU::getLambda(getCBXMin()) )
+ , DbU::toLambda(constraintMax)
+ , DbU::toLambda(getCBXMin()) )
<< endl;
return false;
}
diff --git a/katabatic/src/AutoContactHTee.cpp b/katabatic/src/AutoContactHTee.cpp
index 9dc62ebd..687ae475 100644
--- a/katabatic/src/AutoContactHTee.cpp
+++ b/katabatic/src/AutoContactHTee.cpp
@@ -28,7 +28,6 @@
#include "hurricane/Plug.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "hurricane/DebugSession.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContactHTee.h"
@@ -304,6 +303,9 @@ namespace Katabatic {
}
}
}
+ _horizontal1->invalidate( this );
+ _horizontal2->invalidate( this );
+ _vertical1 ->invalidate( this );
ltraceout(110);
DebugSession::close();
diff --git a/katabatic/src/AutoContactTerminal.cpp b/katabatic/src/AutoContactTerminal.cpp
index ac251e26..23e4cd0f 100644
--- a/katabatic/src/AutoContactTerminal.cpp
+++ b/katabatic/src/AutoContactTerminal.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2012-2013, All Rights Reserved
+// Copyright (c) UPMC 2012-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -30,7 +29,6 @@
#include "hurricane/RoutingPad.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "hurricane/DebugSession.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContactTerminal.h"
@@ -265,7 +263,6 @@ namespace Katabatic {
throw Error( os.str() );
}
unsetFlags( CntInvalidatedCache );
-
ltrace(110) << "seg:" << _segment << endl;
delete [] horizontals;
@@ -354,6 +351,7 @@ namespace Katabatic {
else if (delta == 0) setLayer( rg->getRoutingLayer(anchorDepth) );
else if (delta == 1) setLayer( rg->getContactLayer(std::min(anchorDepth,segmentDepth)) );
}
+ _segment->invalidate( this );
ltraceout(110);
DebugSession::close();
diff --git a/katabatic/src/AutoContactTurn.cpp b/katabatic/src/AutoContactTurn.cpp
index cd657c91..6affe780 100644
--- a/katabatic/src/AutoContactTurn.cpp
+++ b/katabatic/src/AutoContactTurn.cpp
@@ -28,7 +28,6 @@
#include "hurricane/Plug.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "hurricane/DebugSession.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContactTurn.h"
@@ -251,6 +250,8 @@ namespace Katabatic {
setLayer ( (delta == 0) ? rg->getRoutingLayer(depthContact) : rg->getContactLayer(depthContact) );
}
}
+ _horizontal1->invalidate( this );
+ _vertical1 ->invalidate( this );
ltraceout(110);
DebugSession::close ();
diff --git a/katabatic/src/AutoContactVTee.cpp b/katabatic/src/AutoContactVTee.cpp
index 33915ce1..842862b0 100644
--- a/katabatic/src/AutoContactVTee.cpp
+++ b/katabatic/src/AutoContactVTee.cpp
@@ -28,7 +28,6 @@
#include "hurricane/Plug.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "hurricane/DebugSession.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContactVTee.h"
@@ -289,6 +288,9 @@ namespace Katabatic {
}
}
}
+ _horizontal1->invalidate( this );
+ _vertical1 ->invalidate( this );
+ _vertical2 ->invalidate( this );
ltraceout(110);
DebugSession::close ();
diff --git a/katabatic/src/AutoHorizontal.cpp b/katabatic/src/AutoHorizontal.cpp
index 8679a658..a03b6c14 100644
--- a/katabatic/src/AutoHorizontal.cpp
+++ b/katabatic/src/AutoHorizontal.cpp
@@ -231,9 +231,6 @@ namespace Katabatic {
Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax());
Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax());
- // Ugly: should uses topRightShrink from GCell.
- //sourceConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- //targetConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
// Expand by a tiny amount for the "contains" to work for sure.
sourceConstraints.inflate( 1 );
targetConstraints.inflate( 1 );
@@ -245,9 +242,6 @@ namespace Katabatic {
ltrace(200) << "target constraints: " << targetConstraints
<< " " << DbU::getValueString(targetConstraints.getSize()) << endl;
- // Ugly: GCell's track number is hardwired.
- //if (sourceConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; }
- //if (targetConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; }
if (not sourceConstraints.contains(sourceSide)) { ltraceout(200); return true; }
if (not targetConstraints.contains(targetSide)) { ltraceout(200); return true; }
@@ -298,8 +292,8 @@ namespace Katabatic {
if (source->isTerminal()) {
Interval perpandConstraints = getAutoTarget()->getUConstraints(KbHorizontal);
- Interval constraints = source->getUConstraints (KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- Interval nativeConstraints = source->getNativeUConstraints(KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
+ Interval constraints = source->getUConstraints (KbVertical|KbNoGCellShrink);
+ Interval nativeConstraints = source->getNativeUConstraints(KbVertical|KbNoGCellShrink);
int slack = constraints.getSize() / getPitch();
int nativeSlack = nativeConstraints.getSize() / getPitch();
@@ -334,8 +328,8 @@ namespace Katabatic {
if (parallel) target = parallel->getAutoTarget();
if (target->isTerminal()) {
- Interval constraints = target->getUConstraints (KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- Interval nativeConstraints = target->getNativeUConstraints(KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
+ Interval constraints = target->getUConstraints (KbVertical|KbNoGCellShrink);
+ Interval nativeConstraints = target->getNativeUConstraints(KbVertical|KbNoGCellShrink);
int slack = constraints.getSize() / getPitch();
int nativeSlack = nativeConstraints.getSize() / getPitch();
@@ -390,7 +384,7 @@ namespace Katabatic {
if (_horizontal->getY() == axis) return;
- ltrace(80) << "_setAxis() @Y " << DbU::getLambda(axis) << " " << this << endl;
+ ltrace(80) << "_setAxis() @Y " << DbU::toLambda(axis) << " " << this << endl;
_horizontal->setY( axis );
invalidate();
@@ -410,6 +404,13 @@ namespace Katabatic {
if (_horizontal->getTargetX() < _horizontal->getSourceX()) {
ltrace(80) << "updateOrient() " << this << " (before S/T swap)" << endl;
_horizontal->invert();
+
+ unsigned int spinFlags = _flags & SegDepthSpin;
+ unsetFlags( SegDepthSpin );
+ if (spinFlags & SegSourceTop ) setFlags( SegTargetTop );
+ if (spinFlags & SegSourceBottom) setFlags( SegTargetBottom );
+ if (spinFlags & SegTargetTop ) setFlags( SegSourceTop );
+ if (spinFlags & SegTargetBottom) setFlags( SegSourceBottom );
}
}
@@ -690,7 +691,7 @@ namespace Katabatic {
{
ltrace(200) << "AutoHorizontal::_makeDogleg(GCell*)" << endl;
- DebugSession::open( getNet(), 110 );
+ DebugSession::open( getNet(), 80 );
ltracein(159);
//Session::doglegReset();
@@ -723,7 +724,7 @@ namespace Katabatic {
Session::dogleg( this );
targetDetach();
- invalidate();
+ invalidate( KbTopology );
autoTarget->invalidate( KbTopology );
AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer );
AutoContact* dlContact2 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer );
diff --git a/katabatic/src/AutoSegment.cpp b/katabatic/src/AutoSegment.cpp
index 4a300d6c..e654d7ee 100644
--- a/katabatic/src/AutoSegment.cpp
+++ b/katabatic/src/AutoSegment.cpp
@@ -198,7 +198,7 @@ namespace {
_attractors[position]++;
_attractorsCount++;
- ltrace(88) << "add Attractor @" << DbU::getLambda(position)
+ ltrace(88) << "add Attractor @" << DbU::toLambda(position)
<< " [" << _attractors[position] << "]" << endl;
}
@@ -356,9 +356,7 @@ namespace Katabatic {
Session::link( this );
updateOrient();
updatePositions();
- invalidate( KbNoFlags );
- //sourceAttach( getAutoSource() );
- //targetAttach( getAutoTarget() );
+ invalidate( KbTopology );
_observers.notify( Create );
}
@@ -415,15 +413,19 @@ namespace Katabatic {
void AutoSegment::invalidate ( unsigned int flags )
{
if (Session::doDestroyTool()) return;
+ if (flags & KbSource) setFlags( SegInvalidatedSource );
+ if (flags & KbTarget) setFlags( SegInvalidatedTarget );
if (isInvalidated()) return;
ltrace(200) << "AutoSegment::invalidate() " << flags << " " << this << endl;
ltracein(200);
_invalidate();
+
if ((flags & KbPropagate) and not isNotAligned()) {
- forEach( AutoSegment*, isegment, getAligneds() )
+ forEach( AutoSegment*, isegment, getAligneds() ) {
isegment->_invalidate();
+ }
}
ltraceout(200);
}
@@ -441,20 +443,63 @@ namespace Katabatic {
}
+ void AutoSegment::invalidate ( AutoContact* contact )
+ {
+ if (Session::doDestroyTool()) return;
+ if (contact == getAutoSource()) setFlags( SegInvalidatedSource );
+ if (contact == getAutoTarget()) setFlags( SegInvalidatedTarget );
+ }
+
+
void AutoSegment::revalidate ()
{
- ltrace(110) << "AutoSegment::revalidate() " << this << endl;
+ ltrace(200) << "AutoSegment::revalidate() " << this << endl;
if (not isInvalidated()) return;
- ltracein(110);
+ ltracein(200);
- updateOrient();
+ updateOrient ();
updatePositions();
- unsetFlags( SegInvalidated|SegInvalidatedLayer|SegCreated );
- _observers.notify( Revalidate );
+ unsigned int oldSpinFlags = _flags & SegDepthSpin;
- ltraceout(110);
+ if (_flags & (SegInvalidatedSource|SegCreated)) {
+ const Layer* contactLayer = getAutoSource()->getLayer();
+ const Layer* segmentLayer = getLayer();
+ ltrace(200) << "Changed source: " << getAutoSource() << endl;
+
+ unsetFlags( SegSourceTop|SegSourceBottom );
+ if (contactLayer != segmentLayer) {
+ setFlags( (segmentLayer == contactLayer->getTop()) ? SegSourceBottom : SegSourceTop );
+ }
+ }
+
+ if (_flags & (SegInvalidatedTarget|SegCreated)) {
+ const Layer* contactLayer = getAutoTarget()->getLayer();
+ const Layer* segmentLayer = getLayer();
+ ltrace(200) << "Changed target: " << getAutoTarget() << endl;
+
+ unsetFlags( SegTargetTop|SegTargetBottom );
+ if (contactLayer != segmentLayer) {
+ setFlags( (segmentLayer == contactLayer->getTop()) ? SegTargetBottom : SegTargetTop );
+ }
+ }
+
+ unsigned int observerFlags = Revalidate;
+ if ( (_flags & SegCreated) or (oldSpinFlags != (_flags & SegDepthSpin)) )
+ observerFlags |= RevalidatePPitch;
+
+ unsetFlags( SegInvalidated
+ | SegInvalidatedSource
+ | SegInvalidatedTarget
+ | SegInvalidatedLayer
+ | SegCreated
+ );
+
+ _observers.notify( observerFlags );
+
+ ltrace(200) << "Updated: " << this << endl;
+ ltraceout(200);
}
@@ -471,6 +516,38 @@ namespace Katabatic {
}
+ bool AutoSegment::isSameLayerDogleg () const
+ {
+ if (not isSpinTopOrBottom()) return false;
+
+ unsigned int perpandicularDepth = getDepth() + (isSpinTop() ? 1 : -1);
+ if (perpandicularDepth >= Session::getDepth()) {
+ cerr << this << " isSpinTop too high." << endl;
+ }
+ perpandicularDepth = Session::getDepth() - 1;
+
+ return (getLength() > (Session::getPitch(perpandicularDepth)))
+ and (getLength() < (Session::getPitch(perpandicularDepth) * 3));
+ }
+
+
+ DbU::Unit AutoSegment::getPPitch () const
+ {
+ DbU::Unit topPPitch = getPitch();
+ DbU::Unit bottomPPitch = topPPitch;
+ unsigned int depth = getDepth();
+
+ if (depth < Session::getDepth()) {
+ topPPitch = Session::getPitch( depth + ((_flags & SegSpinTop) ? 1 : 0) );
+ }
+ if (depth > 0) {
+ bottomPPitch = Session::getPitch( depth - ((_flags & SegSpinBottom) ? 1 : 0) );
+ }
+
+ return std::max( topPPitch, bottomPPitch );
+ }
+
+
DbU::Unit AutoSegment::getSlack () const
{
DbU::Unit constraintMin;
@@ -578,6 +655,49 @@ namespace Katabatic {
{ return AutoSegments_Perpandiculars( this ); }
+ bool AutoSegment::checkDepthSpin () const
+ {
+ bool valid = true;
+ const Layer* sourceLayer = getAutoSource()->getLayer();
+ const Layer* targetLayer = getAutoTarget()->getLayer();
+
+ if ( (_flags & SegSourceTop) and (sourceLayer->getBottom() != getLayer()) ) {
+ cerr << Error("%s\n"
+ " Source is not going above, connected to *top* of %s."
+ , getString(this).c_str()
+ , getString(getAutoSource()).c_str()
+ ) << endl;
+ valid = false;
+ }
+ if ( (_flags & SegSourceBottom) and (sourceLayer->getTop() != getLayer()) ) {
+ cerr << Error("%s\n"
+ " Source is not going below, connected to *bottom* of %s."
+ , getString(this).c_str()
+ , getString(getAutoSource()).c_str()
+ ) << endl;
+ valid = false;
+ }
+ if ( (_flags & SegTargetTop) and (targetLayer->getBottom() != getLayer()) ) {
+ cerr << Error("%s\n"
+ " Target is not going above connected to *top* of %s."
+ , getString(this).c_str()
+ , getString(getAutoTarget()).c_str()
+ ) << endl;
+ valid = false;
+ }
+ if ( (_flags & SegTargetBottom) and (targetLayer->getTop() != getLayer()) ) {
+ cerr << Error("%s\n"
+ " Target is not going below, connected to *bottom* of %s."
+ , getString(this).c_str()
+ , getString(getAutoTarget()).c_str()
+ ) << endl;
+ valid = false;
+ }
+
+ return valid;
+ }
+
+
void AutoSegment::setFlagsOnAligneds ( unsigned int flags )
{
setFlags( flags );
@@ -595,6 +715,7 @@ namespace Katabatic {
base()->getSourceHook()->detach();
source->cacheDetach( this );
unsetFlags( SegNotSourceAligned );
+ setFlags( SegInvalidatedSource );
}
}
@@ -606,6 +727,7 @@ namespace Katabatic {
base()->getTargetHook()->detach();
target->cacheDetach( this );
unsetFlags( SegNotTargetAligned );
+ setFlags( SegInvalidatedTarget );
}
}
@@ -662,9 +784,10 @@ namespace Katabatic {
if (constraintMin > constraintMax) { ltraceout(200); return false; }
if (isDogleg()) {
- // Ugly: hard-wired value of the track spacing.
- constraintMin -= DbU::lambda(25.0);
- constraintMax += DbU::lambda(25.0);
+ DbU::Unit halfSideLength = getAutoSource()->getGCell()->getSide
+ ( isHorizontal() ? KbVertical : KbHorizontal ).getHalfSize();
+ constraintMin -= halfSideLength;
+ constraintMax += halfSideLength;
}
if (getAxis() < constraintMin) {
@@ -725,8 +848,8 @@ namespace Katabatic {
if ( (axis == getAxis()) and not (flags & KbRealignate) ) return;
ltrace(200) << "setAxis() @"
- << ((isHorizontal())?"Y ":"X ") << DbU::getLambda(getAxis())
- << " to " << DbU::getLambda(axis) << " on " << this << endl;
+ << ((isHorizontal())?"Y ":"X ") << DbU::toLambda(getAxis())
+ << " to " << DbU::toLambda(axis) << " on " << this << endl;
ltracein(80);
_setAxis( axis );
@@ -856,8 +979,8 @@ namespace Katabatic {
getConstraints( constraintMin, constraintMax );
if (attractors.getAttractorsCount()) {
- ltrace(89) << "Lower Median " << DbU::getLambda(attractors.getLowerMedian()) << endl;
- ltrace(89) << "Upper Median " << DbU::getLambda(attractors.getUpperMedian()) << endl;
+ ltrace(89) << "Lower Median " << DbU::toLambda(attractors.getLowerMedian()) << endl;
+ ltrace(89) << "Upper Median " << DbU::toLambda(attractors.getUpperMedian()) << endl;
optimalMin = attractors.getLowerMedian();
optimalMax = attractors.getUpperMedian();
@@ -1044,7 +1167,7 @@ namespace Katabatic {
ltracein(200);
invalidate( KbNoFlags );
- setFlags( SegInvalidatedLayer );
+ setFlags( SegInvalidatedLayer|SegInvalidatedSource|SegInvalidatedTarget );
const Layer* newLayer = Session::getRoutingGauge()->getRoutingLayer(depth);
if (getLayer() != newLayer) {
@@ -1658,9 +1781,10 @@ namespace Katabatic {
{
bool coherency = true;
- coherency = coherency && checkNotInvalidated();
- coherency = coherency && checkPositions();
- coherency = coherency && checkConstraints();
+ coherency = checkNotInvalidated() and coherency;
+ coherency = checkPositions() and coherency;
+ coherency = checkConstraints() and coherency;
+ coherency = checkDepthSpin() and coherency;
return coherency;
}
@@ -1681,6 +1805,14 @@ namespace Katabatic {
state += isNotAligned () ? "A": "-";
state += isSlackened () ? "S": "-";
state += isInvalidated () ? "i": "-";
+
+ if (_flags & SegSourceTop) state += 'T';
+ else if (_flags & SegSourceBottom) state += 'B';
+ else state += '-';
+ if (_flags & SegTargetTop) state += 'T';
+ else if (_flags & SegTargetBottom) state += 'B';
+ else state += '-';
+
return state;
}
diff --git a/katabatic/src/AutoSegments.cpp b/katabatic/src/AutoSegments.cpp
index 4d686256..f828b296 100644
--- a/katabatic/src/AutoSegments.cpp
+++ b/katabatic/src/AutoSegments.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -381,8 +380,8 @@ namespace Katabatic {
ltrace(79) << _hookLocator->getElement() << endl;
Hook* hook = dynamic_cast(_hookLocator->getElement());
if (hook) {
- if ( ((_flags & KbBySource) and (dynamic_cast(hook)))
- or ((_flags & KbByTarget) and (dynamic_cast(hook))) ) {
+ if ( ((_flags & KbSource) and (dynamic_cast(hook)))
+ or ((_flags & KbTarget) and (dynamic_cast(hook))) ) {
_element = Session::lookup( static_cast(hook->getComponent()) );
if (_element->isHorizontal()) {
diff --git a/katabatic/src/AutoVertical.cpp b/katabatic/src/AutoVertical.cpp
index 791e9f50..ec04170f 100644
--- a/katabatic/src/AutoVertical.cpp
+++ b/katabatic/src/AutoVertical.cpp
@@ -224,16 +224,10 @@ namespace Katabatic {
Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax());
Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax());
- // Ugly: should uses topRightShrink from GCell.
- //sourceConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- //targetConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
// Expand by a tiny amount for the "contains" to work for sure.
sourceConstraints.inflate( 1 );
targetConstraints.inflate( 1 );
- // Ugly: GCell's track number is hardwired.
- //if (sourceConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; }
- //if (targetConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; }
if (not sourceConstraints.contains(sourceSide)) { ltraceout(200); return true; }
if (not targetConstraints.contains(targetSide)) { ltraceout(200); return true; }
@@ -263,8 +257,8 @@ namespace Katabatic {
AutoSegment* parallel = this;
if (source->isTerminal()) {
- Interval constraints = source->getUConstraints (KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- Interval nativeConstraints = source->getNativeUConstraints(KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
+ Interval constraints = source->getUConstraints (KbHorizontal|KbNoGCellShrink);
+ Interval nativeConstraints = source->getNativeUConstraints(KbHorizontal|KbNoGCellShrink);
int slack = constraints.getSize() / getPitch();
int nativeSlack = nativeConstraints.getSize() / getPitch();
@@ -294,8 +288,8 @@ namespace Katabatic {
}
if (target->isTerminal()) {
- Interval constraints = target->getUConstraints (KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
- Interval nativeConstraints = target->getNativeUConstraints(KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) );
+ Interval constraints = target->getUConstraints (KbHorizontal|KbNoGCellShrink);
+ Interval nativeConstraints = target->getNativeUConstraints(KbHorizontal|KbNoGCellShrink);
int slack = constraints.getSize() / getPitch();
int nativeSlack = nativeConstraints.getSize() / getPitch();
@@ -333,7 +327,7 @@ namespace Katabatic {
if (_vertical->getX() == axis) return;
- ltrace(159) << "_setAxis() @X " << DbU::getLambda(axis) << " " << this << endl;
+ ltrace(159) << "_setAxis() @X " << DbU::toLambda(axis) << " " << this << endl;
_vertical->setX( axis );
invalidate();
@@ -353,6 +347,13 @@ namespace Katabatic {
if (_vertical->getTargetY() < _vertical->getSourceY()) {
ltrace(80) << "updateOrient() " << this << " (before S/T swap)" << endl;
_vertical->invert();
+
+ unsigned int spinFlags = _flags & SegDepthSpin;
+ unsetFlags( SegDepthSpin );
+ if (spinFlags & SegSourceTop ) setFlags( SegTargetTop );
+ if (spinFlags & SegSourceBottom) setFlags( SegTargetBottom );
+ if (spinFlags & SegTargetTop ) setFlags( SegSourceTop );
+ if (spinFlags & SegTargetBottom) setFlags( SegSourceBottom );
}
}
@@ -641,7 +642,7 @@ namespace Katabatic {
Session::dogleg( this );
targetDetach();
- invalidate();
+ invalidate( KbTopology );
autoTarget->invalidate( KbTopology );
AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _vertical->getNet(), contactLayer );
ltrace(200) << dlContact1 << endl;
diff --git a/katabatic/src/ChipTools.cpp b/katabatic/src/ChipTools.cpp
index ac892f31..28310320 100644
--- a/katabatic/src/ChipTools.cpp
+++ b/katabatic/src/ChipTools.cpp
@@ -47,16 +47,20 @@ namespace {
enum SegmentType { LocalSegments=0x10, GlobalSegments=0x20 };
- bool isChip ( Cell* cell, Instance*& core )
+ bool isChip ( Cell* cell, Instance*& core, Cell*& referencePad )
{
AllianceFramework* af = AllianceFramework::get();
int pads = 0;
int cores = 0;
+ core = NULL;
+ referencePad = NULL;
forEach ( Instance*, iinstance, cell->getInstances() ) {
- if ( af->isPad(iinstance->getMasterCell()) )
+ if ( af->isPad(iinstance->getMasterCell()) ) {
++pads;
- else {
+ if (not referencePad)
+ referencePad = iinstance->getMasterCell();
+ } else {
++cores;
core = *iinstance;
}
@@ -177,7 +181,7 @@ namespace Katabatic {
cmess1 << " o Slackening IOs of <" << core->getName() << ">." << endl;
Layer::Mask mask = Session::getRoutingLayer(1)->getMask();
- slackenBorder ( core->getBoundingBox().inflate(DbU::lambda(50.0))
+ slackenBorder ( core->getBoundingBox().inflate(Session::getSliceHeight())
, mask
, GlobalSegments|Constant::Horizontal
);
@@ -186,19 +190,19 @@ namespace Katabatic {
void KatabaticEngine::chipPrep ()
{
- if ( isChip() ) {
- reselectPadRp ( getCell() );
- // slackenBlockIos ( _core );
+ if (isChip()) {
+ reselectPadRp( getCell() );
+ //slackenBlockIos( _core );
- // cmess1 << " o Slackening Pads-connected segments." << endl;
- // slackenBorder ( _cell->getBoundingBox().inflate(DbU::lambda(-425.0))
- // , Session::getRoutingLayer(3)->getMask()
- // , GlobalSegments|LocalSegments|Constant::Horizontal
- // );
- // slackenBorder ( _cell->getBoundingBox().inflate(DbU::lambda(-425.0))
- // , Session::getRoutingLayer(1)->getMask()
- // , GlobalSegments|Constant::Horizontal
- // );
+ //cmess1 << " o Slackening Pads-connected segments." << endl;
+ //slackenBorder( _cell->getBoundingBox().inflate(DbU::lambda(-425.0))
+ // , Session::getRoutingLayer(3)->getMask()
+ // , GlobalSegments|LocalSegments|Constant::Horizontal
+ // );
+ //slackenBorder( _cell->getBoundingBox().inflate(DbU::lambda(-425.0))
+ // , Session::getRoutingLayer(1)->getMask()
+ // , GlobalSegments|Constant::Horizontal
+ // );
}
}
@@ -206,6 +210,7 @@ namespace Katabatic {
ChipTools::ChipTools ( Cell* cell )
: _cell (cell)
, _core (NULL)
+ , _referencePad(NULL)
, _isChip (false)
, _chipBb (cell->getBoundingBox())
, _leftPadsBb ()
@@ -214,11 +219,11 @@ namespace Katabatic {
, _bottomPadsBb()
, _chipCorona ()
{
- _isChip = ::isChip ( _cell, _core );
+ _isChip = ::isChip( _cell, _core, _referencePad );
- if ( _isChip ) {
+ if (_isChip) {
// Ugly: hard-coded pads height.
- const DbU::Unit padHeight = DbU::lambda(400.0);
+ const DbU::Unit padHeight = _referencePad->getAbutmentBox().getHeight();
Box outer = _cell->getBoundingBox().inflate ( -padHeight );
_chipCorona = Torus ( outer, _core->getBoundingBox() );
@@ -228,9 +233,10 @@ namespace Katabatic {
_topPadsBb = Box ( _chipBb.getXMin(), _chipCorona.getOuterBox().getYMax(), _chipBb.getXMax(), _chipBb.getYMax() );
cmess1 << " o Design is a complete chip." << endl;
- cmess1 << " - Core: <" << _core->getName() << ">/<"
+ cmess1 << " - Core: <" << _core->getName() << ">/<"
<< _core->getMasterCell()->getName() << ">." << endl;
- cmess1 << " - Corona: " << _chipCorona << "." << endl;
+ cmess1 << " - Reference pad: <" << _referencePad->getName() << ">" << endl;
+ cmess1 << " - Corona: " << _chipCorona << "." << endl;
} else {
_chipCorona = Torus ( _cell->getBoundingBox(), _cell->getBoundingBox() );
}
@@ -253,6 +259,7 @@ namespace Katabatic {
record->add ( getSlot ( "_cell" , _cell ) );
record->add ( getSlot ( "_core" , _core ) );
+ record->add ( getSlot ( "_referencePad", _referencePad ) );
record->add ( getSlot ( "_isChip" , &_isChip ) );
record->add ( getSlot ( "_chipBb" , &_chipBb ) );
record->add ( getSlot ( "_leftPadsBb" , &_leftPadsBb ) );
diff --git a/katabatic/src/Configuration.cpp b/katabatic/src/Configuration.cpp
index 4e77d0d4..6e8b6feb 100644
--- a/katabatic/src/Configuration.cpp
+++ b/katabatic/src/Configuration.cpp
@@ -14,19 +14,21 @@
// +-----------------------------------------------------------------+
-#include
-#include
-#include
-#include "vlsisapd/configuration/Configuration.h"
-#include "hurricane/Warning.h"
-#include "hurricane/Error.h"
-#include "hurricane/Technology.h"
-#include "hurricane/DataBase.h"
-#include "hurricane/Cell.h"
-#include "crlcore/Utilities.h"
-#include "crlcore/RoutingLayerGauge.h"
-#include "crlcore/AllianceFramework.h"
-#include "katabatic/Configuration.h"
+#include
+#include
+#include
+#include "vlsisapd/configuration/Configuration.h"
+#include "hurricane/Warning.h"
+#include "hurricane/Error.h"
+#include "hurricane/Technology.h"
+#include "hurricane/DataBase.h"
+#include "hurricane/Cell.h"
+#include "crlcore/Utilities.h"
+#include "crlcore/CellGauge.h"
+#include "crlcore/RoutingGauge.h"
+#include "crlcore/RoutingLayerGauge.h"
+#include "crlcore/AllianceFramework.h"
+#include "katabatic/Configuration.h"
@@ -62,18 +64,21 @@ namespace Katabatic {
// Class : "Katabatic::ConfigurationConcrete".
- ConfigurationConcrete::ConfigurationConcrete ( const RoutingGauge* rg )
+ ConfigurationConcrete::ConfigurationConcrete ( const CellGauge* cg, const RoutingGauge* rg )
: Configuration ()
+ , _cg (NULL)
, _rg (NULL)
, _extensionCap (DbU::lambda(0.5))
, _saturateRatio (Cfg::getParamPercentage("katabatic.saturateRatio",80.0)->asDouble())
, _saturateRp (Cfg::getParamInt ("katabatic.saturateRp" ,8 )->asInt())
- , _globalThreshold(DbU::lambda((double)Cfg::getParamInt("katabatic.globalLengthThreshold",29*50)->asInt())) // Ugly: direct uses of SxLib gauge.
+ , _globalThreshold(0)
, _allowedDepth (0)
, _hEdgeCapacity (0)
, _vEdgeCapacity (0)
{
+ if (cg == NULL) cg = AllianceFramework::get()->getCellGauge();
if (rg == NULL) rg = AllianceFramework::get()->getRoutingGauge();
+ _cg = cg->getClone();
_rg = rg->getClone();
if (Cfg::hasParameter("katabatic.topRoutingLayer")) {
@@ -89,15 +94,19 @@ namespace Katabatic {
if (_gmetalv == NULL) cerr << Warning("Cannot get \"gmetalv\" layer from the Technology.") << endl;
if (_gmetalh == NULL) cerr << Warning("Cannot get \"gmetalh\" layer from the Technology.") << endl;
+ DbU::Unit sliceHeight = _cg->getSliceHeight();
+ _globalThreshold = DbU::fromLambda
+ ( (double)Cfg::getParamInt("katabatic.globalLengthThreshold",29*DbU::toLambda(sliceHeight))->asInt() );
+
vector::const_iterator ilayerGauge = rg->getLayerGauges().begin();
for ( ; ilayerGauge != rg->getLayerGauges().end() ; ++ilayerGauge ) {
RoutingLayerGauge* layerGauge = (*ilayerGauge);
if (layerGauge->getType() != Constant::Default) continue;
if (layerGauge->getDirection() == Constant::Horizontal) {
- _hEdgeCapacity += layerGauge->getTrackNumber ( 0, DbU::lambda(50.0) ) - 1;
+ _hEdgeCapacity += layerGauge->getTrackNumber ( 0, sliceHeight ) - 1;
} else if (layerGauge->getDirection() == Constant::Vertical) {
- _vEdgeCapacity += layerGauge->getTrackNumber( 0, DbU::lambda(50.0) ) - 1;
+ _vEdgeCapacity += layerGauge->getTrackNumber( 0, sliceHeight ) - 1;
}
}
}
@@ -108,19 +117,22 @@ namespace Katabatic {
, _gmetalh (other._gmetalh)
, _gmetalv (other._gmetalv)
, _gcontact (other._gcontact)
+ , _cg (NULL)
, _rg (NULL)
, _extensionCap (other._extensionCap)
, _saturateRatio (other._saturateRatio)
, _globalThreshold (other._globalThreshold)
, _allowedDepth (other._allowedDepth)
{
- if ( other._rg ) _rg = other._rg->getClone();
+ if (other._cg) _cg = other._cg->getClone();
+ if (other._rg) _rg = other._rg->getClone();
}
ConfigurationConcrete::~ConfigurationConcrete ()
{
ltrace(89) << "About to delete attribute _rg (RoutingGauge)." << endl;
+ _cg->destroy ();
_rg->destroy ();
}
@@ -153,6 +165,10 @@ namespace Katabatic {
{ return _rg->getLayerDepth(layer); }
+ CellGauge* ConfigurationConcrete::getCellGauge () const
+ { return _cg; }
+
+
RoutingGauge* ConfigurationConcrete::getRoutingGauge () const
{ return _rg; }
@@ -173,6 +189,14 @@ namespace Katabatic {
{ return _extensionCap; }
+ DbU::Unit ConfigurationConcrete::getSliceHeight () const
+ { return _cg->getSliceHeight(); }
+
+
+ DbU::Unit ConfigurationConcrete::getSliceStep () const
+ { return _cg->getSliceStep(); }
+
+
DbU::Unit ConfigurationConcrete::getPitch ( const Layer* layer, unsigned int flags ) const
{ return getPitch( getLayerDepth(layer), flags ); }
@@ -290,7 +314,7 @@ namespace Katabatic {
cout << Dots::asIdentifier(" - Routing Gauge" ,getString(_rg->getName())) << endl;
cout << Dots::asString (" - Top routing layer" ,topLayerName) << endl;
cout << Dots::asPercentage(" - GCell saturation threshold" ,_saturateRatio) << endl;
- cout << Dots::asDouble (" - Long global length threshold",DbU::getLambda(_globalThreshold)) << endl;
+ cout << Dots::asDouble (" - Long global length threshold",DbU::toLambda(_globalThreshold)) << endl;
}
diff --git a/katabatic/src/GCell.cpp b/katabatic/src/GCell.cpp
index 985be6d0..1eb66c65 100644
--- a/katabatic/src/GCell.cpp
+++ b/katabatic/src/GCell.cpp
@@ -361,8 +361,7 @@ namespace Katabatic {
GCell* GCell::create ( GCellGrid* gcellGrid, unsigned int index, Box box )
{
- if (_topRightShrink == 0)
- _topRightShrink = 1 /*DbU::lambda(0.0)*/;
+ if (_topRightShrink == 0) _topRightShrink = 1;
DbU::Unit trShrink = ( gcellGrid->isOnTopBorder (index)
or gcellGrid->isOnRightBorder(index)) ? 0 : _topRightShrink;
@@ -499,25 +498,25 @@ namespace Katabatic {
AutoSegments GCell::getHStartSegments ()
{
- return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbBySource);
+ return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbSource);
}
AutoSegments GCell::getVStartSegments ()
{
- return new AutoSegments_AnchorOnGCell (this,KbVertical|KbBySource);
+ return new AutoSegments_AnchorOnGCell (this,KbVertical|KbSource);
}
AutoSegments GCell::getHStopSegments ()
{
- return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbByTarget);
+ return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbTarget);
}
AutoSegments GCell::getVStopSegments ()
{
- return new AutoSegments_AnchorOnGCell (this,KbVertical|KbByTarget);
+ return new AutoSegments_AnchorOnGCell (this,KbVertical|KbTarget);
}
@@ -1324,8 +1323,8 @@ namespace Katabatic {
, ""
, getColumn()
, getRow()
- , DbU::getLambda(getX())
- , DbU::getLambda(getY())
+ , DbU::toLambda(getX())
+ , DbU::toLambda(getY())
, getDensity()
, _cDensity
);
diff --git a/katabatic/src/KatabaticEngine.cpp b/katabatic/src/KatabaticEngine.cpp
index 51f3964c..53ec4e79 100644
--- a/katabatic/src/KatabaticEngine.cpp
+++ b/katabatic/src/KatabaticEngine.cpp
@@ -401,7 +401,7 @@ namespace Katabatic {
AutoSegmentLut::const_iterator it = _autoSegmentLut.begin();
AutoSegmentLut::const_iterator end = _autoSegmentLut.end ();
for ( ; it != end ; it++ )
- coherency = coherency && it->second->_check();
+ coherency = it->second->_check() and coherency;
vector::const_iterator itGCell = _gcellGrid->getGCellVector()->begin();
vector::const_iterator endGCell = _gcellGrid->getGCellVector()->end();
@@ -573,7 +573,7 @@ namespace Katabatic {
}
ltrace(159) << "Align on " << aligneds[0]
- << " " << DbU::getLambda(aligneds[0]->getAxis()) << endl;
+ << " " << DbU::toLambda(aligneds[0]->getAxis()) << endl;
aligneds[0]->setAxis( aligneds[0]->getAxis(), KbRealignate );
aligneds.clear();
diff --git a/katabatic/src/LayerAssign.cpp b/katabatic/src/LayerAssign.cpp
index 16c76a53..dbe12250 100644
--- a/katabatic/src/LayerAssign.cpp
+++ b/katabatic/src/LayerAssign.cpp
@@ -299,7 +299,7 @@ namespace Katabatic {
locals.push_back( autoSegment );
} else {
// Ugly: Hard-coded GCell side.
- if ( (autoSegment->getLength() < 3*DbU::lambda(50.0)) and (autoSegment != seed) )
+ if ( (autoSegment->getLength() < 3*Session::getSliceHeight()) and (autoSegment != seed) )
locals.push_back( autoSegment );
else
globals.push_back( autoSegment );
diff --git a/katabatic/src/LoadGrByNet.cpp b/katabatic/src/LoadGrByNet.cpp
index 1e9aec05..1162bc93 100644
--- a/katabatic/src/LoadGrByNet.cpp
+++ b/katabatic/src/LoadGrByNet.cpp
@@ -961,7 +961,7 @@ namespace {
}
#endif
// HARDCODED VALUE.
- if ( (_topology & Global_Fixed) and (globalSegment->getLength() < 2*DbU::lambda(50.0)) )
+ if ( (_topology & Global_Fixed) and (globalSegment->getLength() < 2*Session::getSliceHeight()) )
_toFixSegments.push_back( globalSegment );
if (_connexity.fields.globals < 2) {
diff --git a/katabatic/src/Session.cpp b/katabatic/src/Session.cpp
index d3f3b4a4..97df43d4 100644
--- a/katabatic/src/Session.cpp
+++ b/katabatic/src/Session.cpp
@@ -1,7 +1,7 @@
// -*- mode: C++; explicit-buffer-name: "Session.cpp" -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -81,6 +81,7 @@ namespace Katabatic {
Session::Session ( KatabaticEngine* ktbt )
: _katabatic (ktbt)
, _technology (ktbt->getRoutingGauge()->getTechnology())
+ , _cellGauge (ktbt->getCellGauge())
, _routingGauge (ktbt->getRoutingGauge())
, _autoContacts ()
, _doglegs ()
@@ -185,7 +186,7 @@ namespace Katabatic {
}
if (aligneds.empty()) canonical->setFlags( SegNotAligned );
- ltrace(159) << "Align @" << DbU::getLambda(canonical->getAxis())
+ ltrace(159) << "Align @" << DbU::toLambda(canonical->getAxis())
<< " on " << canonical << endl;
//canonical->setAxis( canonical->getAxis(), KbRealignate );
diff --git a/katabatic/src/katabatic/AutoContact.h b/katabatic/src/katabatic/AutoContact.h
index c62bf76d..481e9379 100644
--- a/katabatic/src/katabatic/AutoContact.h
+++ b/katabatic/src/katabatic/AutoContact.h
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
diff --git a/katabatic/src/katabatic/AutoContactTerminal.h b/katabatic/src/katabatic/AutoContactTerminal.h
index cc406e71..8c2ab882 100644
--- a/katabatic/src/katabatic/AutoContactTerminal.h
+++ b/katabatic/src/katabatic/AutoContactTerminal.h
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC/LIP6 2012-2013, All Rights Reserved
+// Copyright (c) UPMC/LIP6 2012-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
diff --git a/katabatic/src/katabatic/AutoSegment.h b/katabatic/src/katabatic/AutoSegment.h
index d03e3add..528b55d7 100644
--- a/katabatic/src/katabatic/AutoSegment.h
+++ b/katabatic/src/katabatic/AutoSegment.h
@@ -60,30 +60,40 @@ namespace Katabatic {
// -------------------------------------------------------------------
// Class : "AutoSegment".
- enum AutoSegmentFlag { SegHorizontal = 0x00000001
- , SegFixed = 0x00000002
- , SegGlobal = 0x00000004
- , SegWeakGlobal = 0x00000008
- , SegCanonical = 0x00000010
- , SegBipoint = 0x00000020
- , SegDogleg = 0x00000040
- , SegStrap = 0x00000080
- , SegLayerChange = 0x00000100
- , SegStrongTerminal = 0x00000200 // Replace Terminal.
- , SegWeakTerminal1 = 0x00000400 // Replace TopologicalEnd.
- , SegWeakTerminal2 = 0x00000800 // Replace TopologicalEnd.
- , SegNotSourceAligned = 0x00001000
- , SegNotTargetAligned = 0x00002000
- , SegUnbound = 0x00010000
- , SegHalfSlackened = 0x00020000
- , SegSlackened = 0x00040000
- , SegAxisSet = 0x00080000
- , SegInvalidated = 0x00100000
- , SegInvalidatedLayer = 0x00200000
- , SegCreated = 0x00400000
- // Masks.
- , SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2
- , SegNotAligned = SegNotSourceAligned|SegNotTargetAligned
+ enum AutoSegmentFlag { SegNoFlags = 0x00000000
+ , SegHorizontal = 0x00000001
+ , SegFixed = 0x00000002
+ , SegGlobal = 0x00000004
+ , SegWeakGlobal = 0x00000008
+ , SegCanonical = 0x00000010
+ , SegBipoint = 0x00000020
+ , SegDogleg = 0x00000040
+ , SegStrap = 0x00000080
+ , SegSourceTop = 0x00000100
+ , SegSourceBottom = 0x00000200
+ , SegTargetTop = 0x00000400
+ , SegTargetBottom = 0x00000800
+ , SegLayerChange = 0x00001000
+ , SegStrongTerminal = 0x00002000 // Replace Terminal.
+ , SegWeakTerminal1 = 0x00004000 // Replace TopologicalEnd.
+ , SegWeakTerminal2 = 0x00008000 // Replace TopologicalEnd.
+ , SegNotSourceAligned = 0x00010000
+ , SegNotTargetAligned = 0x00020000
+ , SegUnbound = 0x00100000
+ , SegHalfSlackened = 0x00200000
+ , SegSlackened = 0x00400000
+ , SegAxisSet = 0x00800000
+ , SegInvalidated = 0x01000000
+ , SegInvalidatedSource = 0x02000000
+ , SegInvalidatedTarget = 0x04000000
+ , SegInvalidatedLayer = 0x08000000
+ , SegCreated = 0x10000000
+ // Masks.
+ , SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2
+ , SegNotAligned = SegNotSourceAligned|SegNotTargetAligned
+ , SegSpinTop = SegSourceTop |SegTargetTop
+ , SegSpinBottom = SegSourceBottom|SegTargetBottom
+ , SegDepthSpin = SegSpinTop |SegSpinBottom
};
@@ -92,10 +102,11 @@ namespace Katabatic {
friend class AutoVertical;
public:
- enum ObserverFlag { Create = 0x000000001
- , Destroy = 0x000000002
- , Invalidate = 0x000000003
- , Revalidate = 0x000000004
+ enum ObserverFlag { Create = 0x000000001
+ , Destroy = 0x000000002
+ , Invalidate = 0x000000004
+ , Revalidate = 0x000000008
+ , RevalidatePPitch = 0x000000010
};
public:
typedef std::function< void(AutoSegment*) > RevalidateCb_t;
@@ -153,7 +164,11 @@ namespace Katabatic {
inline bool isNotTargetAligned () const;
inline bool isNotAligned () const;
bool isStrongTerminal ( unsigned int flags=0 ) const;
+ bool isSameLayerDogleg () const;
inline bool isLayerChange () const;
+ inline bool isSpinTop () const;
+ inline bool isSpinBottom () const;
+ inline bool isSpinTopOrBottom () const;
inline bool isStrap () const;
inline bool isDogleg () const;
inline bool isUnbound () const;
@@ -173,6 +188,7 @@ namespace Katabatic {
bool canSlacken ( unsigned int flags=0 ) const;
virtual bool checkPositions () const = 0;
virtual bool checkConstraints () const = 0;
+ bool checkDepthSpin () const;
// Accessors.
template< typename T >
inline T* getObserver ();
@@ -188,6 +204,7 @@ namespace Katabatic {
inline AutoSegment* getParent () const;
inline unsigned int getDepth () const;
inline DbU::Unit getPitch () const;
+ DbU::Unit getPPitch () const;
inline DbU::Unit getAxis () const;
virtual DbU::Unit getSourceU () const = 0;
virtual DbU::Unit getTargetU () const = 0;
@@ -221,6 +238,8 @@ namespace Katabatic {
void computeTerminal ();
virtual void updateOrient () = 0;
virtual void updatePositions () = 0;
+ void updateSourceSpin ();
+ void updateTargetSpin ();
void sourceDetach ();
void targetDetach ();
void sourceAttach ( AutoContact* );
@@ -248,6 +267,7 @@ namespace Katabatic {
// Canonical Modifiers.
AutoSegment* canonize ( unsigned int flags=KbNoFlags );
virtual void invalidate ( unsigned int flags=KbPropagate );
+ void invalidate ( AutoContact* );
void computeOptimal ( set& processeds );
void setAxis ( DbU::Unit, unsigned int flags=KbNoFlags );
bool toConstraintAxis ( unsigned int flags=KbRealignate );
@@ -414,6 +434,9 @@ namespace Katabatic {
inline bool AutoSegment::isUnbound () const { return _flags & SegUnbound ; }
inline bool AutoSegment::isStrap () const { return _flags & SegStrap; }
inline bool AutoSegment::isLayerChange () const { return _flags & SegLayerChange; }
+ inline bool AutoSegment::isSpinTop () const { return ((_flags & SegSpinTop ) == SegSpinTop); }
+ inline bool AutoSegment::isSpinBottom () const { return ((_flags & SegSpinBottom) == SegSpinBottom); }
+ inline bool AutoSegment::isSpinTopOrBottom () const { return isSpinTop() or isSpinBottom(); }
inline bool AutoSegment::isSlackened () const { return _flags & SegSlackened; }
inline bool AutoSegment::isCanonical () const { return _flags & SegCanonical; }
inline bool AutoSegment::isUnsetAxis () const { return not (_flags & SegAxisSet); }
diff --git a/katabatic/src/katabatic/AutoSegments.h b/katabatic/src/katabatic/AutoSegments.h
index b15c85c7..e68c5a8e 100644
--- a/katabatic/src/katabatic/AutoSegments.h
+++ b/katabatic/src/katabatic/AutoSegments.h
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
+// Copyright (c) UPMC/LIP6 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
diff --git a/katabatic/src/katabatic/ChipTools.h b/katabatic/src/katabatic/ChipTools.h
index a8cdea8a..3f53533e 100644
--- a/katabatic/src/katabatic/ChipTools.h
+++ b/katabatic/src/katabatic/ChipTools.h
@@ -42,6 +42,7 @@ namespace Katabatic {
inline bool isChip () const;
inline Cell* getCell () const;
inline Instance* getCore () const;
+ inline Cell* getReferencePad () const;
inline const Box& getChipBb () const;
inline const Box& getLeftPadsBb () const;
inline const Box& getRightPadsBb () const;
@@ -59,6 +60,7 @@ namespace Katabatic {
private:
Cell* _cell;
Instance* _core;
+ Cell* _referencePad;
bool _isChip;
Box _chipBb;
Box _leftPadsBb;
@@ -73,6 +75,7 @@ namespace Katabatic {
inline bool ChipTools::isChip () const { return _isChip; }
inline Cell* ChipTools::getCell () const { return _cell; }
inline Instance* ChipTools::getCore () const { return _core; }
+ inline Cell* ChipTools::getReferencePad () const { return _referencePad; }
inline const Box& ChipTools::getChipBb () const { return _chipBb; }
inline const Box& ChipTools::getLeftPadsBb () const { return _leftPadsBb; };
inline const Box& ChipTools::getRightPadsBb () const { return _rightPadsBb; };
diff --git a/katabatic/src/katabatic/Configuration.h b/katabatic/src/katabatic/Configuration.h
index d1107fa3..3b3573ca 100644
--- a/katabatic/src/katabatic/Configuration.h
+++ b/katabatic/src/katabatic/Configuration.h
@@ -25,8 +25,9 @@ namespace Hurricane {
class Cell;
}
-#include "crlcore/RoutingGauge.h"
namespace CRL {
+ class CellGauge;
+ class RoutingGauge;
class RoutingLayerGauge;
}
@@ -40,6 +41,7 @@ namespace Katabatic {
using Hurricane::Layer;
using Hurricane::DbU;
using Hurricane::Cell;
+ using CRL::CellGauge;
using CRL::RoutingGauge;
using CRL::RoutingLayerGauge;
@@ -61,11 +63,14 @@ namespace Katabatic {
virtual size_t getDepth () const = 0;
virtual size_t getAllowedDepth () const = 0;
virtual size_t getLayerDepth ( const Layer* ) const = 0;
+ virtual CellGauge* getCellGauge () const = 0;
virtual RoutingGauge* getRoutingGauge () const = 0;
virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const = 0;
virtual const Layer* getRoutingLayer ( size_t depth ) const = 0;
virtual Layer* getContactLayer ( size_t depth ) const = 0;
virtual DbU::Unit getExtensionCap () const = 0;
+ virtual DbU::Unit getSliceHeight () const = 0;
+ virtual DbU::Unit getSliceStep () const = 0;
virtual DbU::Unit getPitch ( size_t depth, unsigned int flags ) const = 0;
virtual DbU::Unit getOffset ( size_t depth ) const = 0;
virtual DbU::Unit getWireWidth ( size_t depth ) const = 0;
@@ -105,7 +110,7 @@ namespace Katabatic {
friend class Configuration;
public:
// Constructor & Destructor.
- ConfigurationConcrete ( const RoutingGauge* rg=NULL );
+ ConfigurationConcrete ( const CellGauge* cg=NULL, const RoutingGauge* rg=NULL );
virtual ~ConfigurationConcrete ();
virtual ConfigurationConcrete* clone () const;
// Methods.
@@ -114,11 +119,14 @@ namespace Katabatic {
virtual size_t getDepth () const;
virtual size_t getAllowedDepth () const;
virtual size_t getLayerDepth ( const Layer* ) const;
+ virtual CellGauge* getCellGauge () const;
virtual RoutingGauge* getRoutingGauge () const;
virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
virtual const Layer* getRoutingLayer ( size_t depth ) const;
virtual Layer* getContactLayer ( size_t depth ) const;
virtual DbU::Unit getExtensionCap () const;
+ virtual DbU::Unit getSliceHeight () const;
+ virtual DbU::Unit getSliceStep () const;
virtual DbU::Unit getPitch ( size_t depth, unsigned int flags ) const;
virtual DbU::Unit getOffset ( size_t depth ) const;
virtual DbU::Unit getWireWidth ( size_t depth ) const;
@@ -145,6 +153,7 @@ namespace Katabatic {
const Layer* _gmetalh;
const Layer* _gmetalv;
const Layer* _gcontact;
+ CellGauge* _cg;
RoutingGauge* _rg;
DbU::Unit _extensionCap;
float _saturateRatio;
diff --git a/katabatic/src/katabatic/Constants.h b/katabatic/src/katabatic/Constants.h
index a339e52a..d0afb8e1 100644
--- a/katabatic/src/katabatic/Constants.h
+++ b/katabatic/src/katabatic/Constants.h
@@ -1,7 +1,7 @@
// -*- mode: C++; explicit-buffer-name: "Constants.h" -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2013-2013, All Rights Reserved
+// Copyright (c) UPMC 2013-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -27,8 +27,8 @@ namespace Katabatic {
, KbHorizontal = 0x00000010
, KbVertical = 0x00000020
, KbWithPerpands = 0x00000040
- , KbBySource = 0x00000080
- , KbByTarget = 0x00000100
+ , KbSource = 0x00000080
+ , KbTarget = 0x00000100
, KbWarnOnError = 0x00000200
, KbTopology = 0x00000400
, KbGlobalSegment = 0x00000800
@@ -44,6 +44,7 @@ namespace Katabatic {
, KbWithNeighbors = 0x00200000
, KbNoCheckLayer = 0x00400000
, KbHalfSlacken = 0x00800000
+ , KbNoGCellShrink = 0x01000000
, KbDirectionMask = KbHorizontal|KbVertical
};
@@ -72,7 +73,7 @@ namespace Katabatic {
inline unsigned int perpandicularTo ( unsigned int direction )
{
- switch ( direction ) {
+ switch ( direction & KbDirectionMask ) {
case KbHorizontal: return KbVertical;
case KbVertical: return KbHorizontal;
}
diff --git a/katabatic/src/katabatic/GridBox.h b/katabatic/src/katabatic/GridBox.h
index 3296284a..aab22a3d 100644
--- a/katabatic/src/katabatic/GridBox.h
+++ b/katabatic/src/katabatic/GridBox.h
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
+// Copyright (c) UPMC/LIP6 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -172,14 +171,14 @@ namespace Katabatic {
) const
{
if ( direction & Constant::Horizontal ) {
- channelMin = getYMin() + DbU::lambda( inclusive?0:0.1 );
+ channelMin = getYMin() + DbU::toLambda( inclusive?0:0.1 );
channelMax = getYMax();
- channelLeft = getXMin() + DbU::lambda( inclusive?0:0.1 );
+ channelLeft = getXMin() + DbU::toLambda( inclusive?0:0.1 );
channelRight = getXMax();
} else {
- channelMin = getXMin() + DbU::lambda( inclusive?0:0.1 );
+ channelMin = getXMin() + DbU::toLambda( inclusive?0:0.1 );
channelMax = getXMax();
- channelLeft = getYMin() + DbU::lambda( inclusive?0:0.1 );
+ channelLeft = getYMin() + DbU::toLambda( inclusive?0:0.1 );
channelRight = getYMax();
}
}
diff --git a/katabatic/src/katabatic/KatabaticEngine.h b/katabatic/src/katabatic/KatabaticEngine.h
index 7270f194..1411bc97 100644
--- a/katabatic/src/katabatic/KatabaticEngine.h
+++ b/katabatic/src/katabatic/KatabaticEngine.h
@@ -106,6 +106,7 @@ namespace Katabatic {
inline unsigned int getFlags ( unsigned int mask ) const;
inline Configuration* getKatabaticConfiguration ();
virtual Configuration* getConfiguration ();
+ inline CellGauge* getCellGauge () const;
inline RoutingGauge* getRoutingGauge () const;
inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
inline const Layer* getRoutingLayer ( size_t depth ) const ;
@@ -219,6 +220,7 @@ namespace Katabatic {
inline void KatabaticEngine::setGlobalThreshold ( DbU::Unit threshold ) { _configuration->setGlobalThreshold(threshold); }
inline unsigned int KatabaticEngine::getFlags ( unsigned int mask ) const { return _flags & mask; }
inline EngineState KatabaticEngine::getState () const { return _state; }
+ inline CellGauge* KatabaticEngine::getCellGauge () const { return _configuration->getCellGauge(); }
inline RoutingGauge* KatabaticEngine::getRoutingGauge () const { return _configuration->getRoutingGauge(); }
inline RoutingLayerGauge* KatabaticEngine::getLayerGauge ( size_t depth ) const { return _configuration->getLayerGauge(depth); }
inline const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const { return _configuration->getRoutingLayer(depth); }
diff --git a/katabatic/src/katabatic/Observer.h b/katabatic/src/katabatic/Observer.h
index 9b942b29..b36164b9 100644
--- a/katabatic/src/katabatic/Observer.h
+++ b/katabatic/src/katabatic/Observer.h
@@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
diff --git a/katabatic/src/katabatic/Session.h b/katabatic/src/katabatic/Session.h
index 643af7f3..528f1ae4 100644
--- a/katabatic/src/katabatic/Session.h
+++ b/katabatic/src/katabatic/Session.h
@@ -24,6 +24,7 @@
#include
#include "hurricane/Commons.h"
#include "hurricane/DbU.h"
+#include "crlcore/CellGauge.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/Constants.h"
#include "katabatic/Configuration.h"
@@ -82,6 +83,9 @@ namespace Katabatic {
static size_t getSaturateRp ();
static inline size_t getAllowedDepth ();
static DbU::Unit getExtensionCap ();
+ static inline CellGauge* getCellGauge ();
+ static inline DbU::Unit getSliceHeight ();
+ static inline DbU::Unit getSliceStep ();
static inline RoutingGauge* getRoutingGauge ();
static inline RoutingLayerGauge* getLayerGauge ( size_t depth );
static inline size_t getDepth ();
@@ -147,6 +151,7 @@ namespace Katabatic {
static Session* _session;
KatabaticEngine* _katabatic;
Technology* _technology;
+ CellGauge* _cellGauge;
RoutingGauge* _routingGauge;
vector _autoContacts;
vector _doglegs;
@@ -170,6 +175,7 @@ namespace Katabatic {
// Inline Functions.
inline Technology* Session::getTechnology () { return get("getTechnology()")->_technology; }
+ inline CellGauge* Session::getCellGauge () { return get("getCellGauge()")->_cellGauge; }
inline RoutingGauge* Session::getRoutingGauge () { return get("getRoutingGauge()")->_routingGauge; }
inline bool Session::doDestroyBaseContact () { return get("doDestroyBaseContact()")->_doDestroyBaseContact(); }
inline bool Session::doDestroyBaseSegment () { return get("doDestroyBaseSegment()")->_doDestroyBaseSegment(); }
@@ -195,6 +201,8 @@ namespace Katabatic {
inline DbU::Unit Session::getExtensionCap () { return getConfiguration()->getExtensionCap(); }
inline size_t Session::getAllowedDepth () { return getConfiguration()->getAllowedDepth(); }
+ inline DbU::Unit Session::getSliceHeight () { return getCellGauge()->getSliceHeight(); }
+ inline DbU::Unit Session::getSliceStep () { return getCellGauge()->getSliceStep(); }
inline RoutingLayerGauge* Session::getLayerGauge ( size_t depth ) { return getRoutingGauge()->getLayerGauge(depth); }
inline size_t Session::getDepth () { return getRoutingGauge()->getDepth(); }
inline size_t Session::getViaDepth ( const Layer* layer ) { return getRoutingGauge()->getViaDepth(layer); }
diff --git a/kite/src/BuildPowerRails.cpp b/kite/src/BuildPowerRails.cpp
index 9a09e263..51097962 100644
--- a/kite/src/BuildPowerRails.cpp
+++ b/kite/src/BuildPowerRails.cpp
@@ -223,16 +223,67 @@ namespace {
else destroyRing( _vdde );
if (_vsse == NULL) cerr << Error("Missing net (for pads) at chip level." ) << endl;
else destroyRing( _vsse );
+ if (_vddi == NULL) cerr << Error("Missing / net (for pads) at top level." ) << endl;
+ else destroyRing( _vddi );
+ if (_vssi == NULL) cerr << Error("Missing / net (for pads) at top level." ) << endl;
+ else destroyRing( _vssi );
if (_ck == NULL) cerr << Warning("No net at (for pads) chip level." ) << endl;
if (_cki == NULL) cerr << Warning("No net at (for pads) chip level." ) << endl;
else destroyRing( _cki );
+ } else {
+ _vddiName = "";
+ _vssiName = "";
+ _ckoName = "";
+
+ forEach ( Net*, inet, topCell->getNets() ) {
+ Net::Type netType = inet->getType();
+ if (netType == Net::Type::POWER) {
+ if (_vddiName.isEmpty()) {
+ _vddiName = inet->getName();
+ _vddi = *inet;
+ } else {
+ cerr << Error("Second power supply net <%s> net at top block level will be ignored.\n"
+ " (will consider only <%s>)"
+ , getString(inet ->getName()).c_str()
+ , getString(_vddi->getName()).c_str()
+ ) << endl;
+ }
+ }
+
+ if (netType == Net::Type::GROUND) {
+ if (_vssiName.isEmpty()) {
+ _vssiName = inet->getName();
+ _vssi = *inet;
+ } else {
+ cerr << Error("Second power ground net <%s> net at top block level will be ignored.\n"
+ " (will consider only <%s>)"
+ , getString(inet ->getName()).c_str()
+ , getString(_vssi->getName()).c_str()
+ ) << endl;
+ }
+ }
+
+ if (netType == Net::Type::CLOCK) {
+ if (_ckoName.isEmpty()) {
+ _ckoName = inet->getName();
+ _cko = *inet;
+ } else {
+ cerr << Error("Second clock net <%s> net at top block level will be ignored.\n"
+ " (will consider only <%s>)"
+ , getString(inet ->getName()).c_str()
+ , getString(_cko->getName()).c_str()
+ ) << endl;
+ }
+ }
+ }
+
+ if ((_vddi) == NULL) cerr << Error("Missing net at top block level." ) << endl;
+ else destroyRing( _vddi );
+ if (_vssi == NULL) cerr << Error("Missing net at top block level." ) << endl;
+ else destroyRing( _vssi );
}
- if (_vddi == NULL) cerr << Error("Missing / net (for pads) at top level." ) << endl;
- else destroyRing( _vddi );
- if (_vssi == NULL) cerr << Error("Missing / net (for pads) at top level." ) << endl;
- else destroyRing( _vssi );
- if (_cko == NULL) cparanoid << Warning("No net at top level." ) << endl;
+ if (_cko == NULL) cparanoid << Warning("No clock net at top level." ) << endl;
}
@@ -524,7 +575,7 @@ namespace {
Segment* segment = NULL;
DbU::Unit delta = plane->getLayerGauge()->getPitch()
- plane->getLayerGauge()->getHalfWireWidth()
- - DbU::lambda(0.1);
+ - DbU::fromLambda(0.1);
DbU::Unit extension = layer->getExtentionCap();
//DbU::Unit extension = Session::getExtentionCap();
//unsigned int type = plane->getLayerGauge()->getType();
@@ -1020,8 +1071,8 @@ namespace {
if ( _chipTools.isChip()
and ((depth == 2) or (depth == 3))
- and (segment->getWidth () == DbU::lambda( 12.0))
- and (segment->getLength() > DbU::lambda(200.0))
+ and (segment->getWidth () == DbU::fromLambda( 12.0))
+ and (segment->getLength() > DbU::fromLambda(200.0))
and (_kite->getChipTools().getCorona().contains(bb)) ) {
switch ( depth ) {
case 2: _vRingSegments.push_back ( segment ); break; // M3 V.
diff --git a/kite/src/Configuration.cpp b/kite/src/Configuration.cpp
index a5927e86..7c9e8647 100644
--- a/kite/src/Configuration.cpp
+++ b/kite/src/Configuration.cpp
@@ -125,10 +125,22 @@ namespace Kite {
{ return _base->getLayerDepth(layer); }
+ CellGauge* Configuration::getCellGauge () const
+ { return _base->getCellGauge(); }
+
+
RoutingGauge* Configuration::getRoutingGauge () const
{ return _base->getRoutingGauge(); }
+ DbU::Unit Configuration::getSliceHeight () const
+ { return _base->getSliceHeight(); }
+
+
+ DbU::Unit Configuration::getSliceStep () const
+ { return _base->getSliceStep(); }
+
+
RoutingLayerGauge* Configuration::getLayerGauge ( size_t depth ) const
{ return _base->getLayerGauge(depth); }
diff --git a/kite/src/DataNegociate.cpp b/kite/src/DataNegociate.cpp
index 8e2f642c..d985bbca 100644
--- a/kite/src/DataNegociate.cpp
+++ b/kite/src/DataNegociate.cpp
@@ -125,7 +125,7 @@ namespace Kite {
if (RoutingEvent::getStage() == RoutingEvent::Repair)
perpandicular->base()->setFlagsOnAligneds( Katabatic::SegUnbound );
- interval.inflate( DbU::lambda(-0.5) );
+ interval.inflate( DbU::fromLambda(-0.5) );
ltrace(148) << "| perpandicular: " << perpandiculars[i] << endl;
ltrace(148) << "| canonical: " << perpandicular << endl;
diff --git a/kite/src/GraphicKiteEngine.cpp b/kite/src/GraphicKiteEngine.cpp
index 0db01d5e..ae413c28 100644
--- a/kite/src/GraphicKiteEngine.cpp
+++ b/kite/src/GraphicKiteEngine.cpp
@@ -26,7 +26,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -52,7 +51,6 @@ namespace Kite {
using Hurricane::Exception;
using Hurricane::Breakpoint;
using Hurricane::DebugSession;
- using Hurricane::UpdateSession;
using Hurricane::Point;
using Hurricane::Net;
using Hurricane::Graphics;
diff --git a/kite/src/KiteEngine.cpp b/kite/src/KiteEngine.cpp
index 5401eb89..66ebcf1d 100644
--- a/kite/src/KiteEngine.cpp
+++ b/kite/src/KiteEngine.cpp
@@ -30,7 +30,6 @@
#include "hurricane/Instance.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
-#include "hurricane/UpdateSession.h"
#include "crlcore/Measures.h"
#include "knik/Vertex.h"
#include "knik/Edge.h"
@@ -41,6 +40,7 @@
#include "kite/DataNegociate.h"
#include "kite/RoutingPlane.h"
#include "kite/Session.h"
+#include "kite/TrackSegment.h"
#include "kite/NegociateWindow.h"
#include "kite/KiteEngine.h"
@@ -456,6 +456,7 @@ namespace Kite {
//DebugSession::addToTrace( getCell(), "acc_reg_ckx" );
//DebugSession::addToTrace( getCell(), "acc_reg_nckx" );
//DebugSession::addToTrace( getCell(), "i(0)" );
+ //DebugSession::addToTrace( getCell(), "ram_nmux_0_sel0" );
//DebugSession::addToTrace( getCell(), "ram_adrb_14" );
//DebugSession::addToTrace( getCell(), "ram_adrb_9" );
//DebugSession::addToTrace( getCell(), "ram_adra(11)" );
@@ -463,7 +464,7 @@ namespace Kite {
//DebugSession::addToTrace( getCell(), "ram_adrb(8)" );
//DebugSession::addToTrace( getCell(), "alu_carry(1)" );
//DebugSession::addToTrace( getCell(), "alu_np(0)" );
- //DebugSession::addToTrace( getCell(), "ram_d(3)" );
+ //DebugSession::addToTrace( getCell(), "ram_q2(0)" );
//DebugSession::addToTrace( getCell(), "ram_q1(0)" );
//DebugSession::addToTrace( getCell(), "ram_i_up" );
// Test signals from (M1-VLSI).
@@ -504,6 +505,7 @@ namespace Kite {
//DebugSession::addToTrace( getCell(), "mips_r3000_1m_dp_mux32_s_mw_se_sel0" );
//DebugSession::addToTrace( getCell(), "mips_r3000_1m_dp_mux32_badr_sd_sel1" );
//DebugSession::addToTrace( getCell(), "mips_r3000_1m_dp_addsub32_carith_se_pi_3_21" );
+ //DebugSession::addToTrace( getCell(), "mips_r3000_1m_dp_addsub32_carith_se_pi_4_26" );
//DebugSession::addToTrace( getCell(), "mips_r3000_1m_ct_cause_rx(1)" );
// Test signals from (R3000,pipeline+chip).
//DebugSession::addToTrace( getCell(), "mips_r3000_core.mips_r3000_1m_dp.banc.reada0" );
@@ -552,7 +554,6 @@ namespace Kite {
if (_negociateWindow) return;
startMeasures();
-
Session::open( this );
_negociateWindow = NegociateWindow::create( this );
@@ -564,9 +565,9 @@ namespace Kite {
_negociateWindow = NULL;
Session::close();
+ stopMeasures();
//if ( _editor ) _editor->refresh ();
- stopMeasures();
printMeasures( "algo" );
Session::open( this );
@@ -601,7 +602,7 @@ namespace Kite {
TrackElement* segment = _lookup( ilut->second );
if (segment == NULL) continue;
- unsigned long long wl = (unsigned long long)DbU::getLambda( segment->getLength() );
+ unsigned long long wl = (unsigned long long)DbU::toLambda( segment->getLength() );
if (wl > 100000) {
cerr << Error("KiteEngine::printCompletion(): Suspiciously long wire: %llu for %p:%s"
,wl,ilut->first,getString(segment).c_str()) << endl;
@@ -610,6 +611,12 @@ namespace Kite {
if (segment->isFixed() or segment->isBlockage()) continue;
+ // if (segment->isSameLayerDogleg()) {
+ // cerr << " Same layer:" << segment << endl;
+ // cerr << " S: " << segment->base()->getAutoSource() << endl;
+ // cerr << " T: " << segment->base()->getAutoTarget() << endl;
+ // }
+
totalWireLength += wl;
if (segment->getTrack() != NULL) {
routeds++;
diff --git a/kite/src/KiteMain.cpp b/kite/src/KiteMain.cpp
index 57e37802..c1c2a4de 100644
--- a/kite/src/KiteMain.cpp
+++ b/kite/src/KiteMain.cpp
@@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
+// Copyright (c) UPMC/LIP6 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -25,7 +25,6 @@ namespace bopts = boost::program_options;
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "hurricane/Warning.h"
-#include "hurricane/UpdateSession.h"
using namespace Hurricane;
#include "crlcore/Utilities.h"
diff --git a/kite/src/Manipulator.cpp b/kite/src/Manipulator.cpp
index 9a7ce4a3..afff592a 100644
--- a/kite/src/Manipulator.cpp
+++ b/kite/src/Manipulator.cpp
@@ -127,13 +127,13 @@ namespace Kite {
TrackElement* neighbor = _segment->getPrevious();
if (neighbor and (neighbor->isFixed() or neighbor->isBlockage())) {
- if (abs(axis - neighbor->getTargetU()) < DbU::lambda(10.0))
+ if (abs(axis - neighbor->getTargetU()) < getPPitch()*2)
return true;
}
neighbor = _segment->getNext();
if (neighbor and (neighbor->isFixed() or neighbor->isBlockage())) {
- if (abs(axis - neighbor->getSourceU()) < DbU::lambda(10.0))
+ if (abs(axis - neighbor->getSourceU()) < getPPitch()*2)
return true;
}
@@ -209,8 +209,7 @@ namespace Kite {
if (Manipulator(perpandiculars[i],_fsm).ripup(perpandicularActionFlags)) {
if (dislodgeCaged) {
- // Ugly: hard-coded uses of pitch.
- _event->setAxisHint( _event->getSegment()->getAxis() + DbU::lambda(5.0) );
+ _event->setAxisHint( _event->getSegment()->getAxis() + _event->getSegment()->getPitch() );
}
continue;
}
@@ -272,7 +271,7 @@ namespace Kite {
bool Manipulator::relax ( Interval interval, unsigned int flags )
{
- interval.inflate( - Session::getExtensionCap() /*+ DbU::lambda(5.0)*/ ); // Ugly.
+ interval.inflate( - Session::getExtensionCap() );
ltrace(200) << "Manipulator::relax() of: " << _segment << " " << interval << endl;
if (_segment->isFixed()) return false;
@@ -451,9 +450,8 @@ namespace Kite {
uside = gcells[imaxconflict+1]->getSide( _segment->getDirection() );
ltrace(200) << "GCell Edge Comparison (max): " << uside
<< " vs. " << DbU::getValueString(interval.getVMax()) << endl;
- // Ugly: Direct uses of routing pitch.
- if (interval.getVMax()+DbU::lambda(5.0) >= uside.getVMin()) {
- interval.inflate( 0, DbU::fromLambda(5.0) );
+ if (interval.getVMax()+getPPitch() >= uside.getVMin()) {
+ interval.inflate( 0, getPPitch() );
ltrace(200) << "Using next GCell " << interval << endl;
imaxconflict++;
}
@@ -501,8 +499,7 @@ namespace Kite {
doglegAxis = dogLegGCell->getSide( _segment->getDirection() ).getCenter();
//ltrace(200) << "MARK 1 doglegAxis: " << DbU::getValueString(doglegAxis) << endl;
} else {
- // Ugly: hardcoded pitch.
- doglegAxis = interval.getVMin() - DbU::lambda(5.0);
+ doglegAxis = interval.getVMin() - getPPitch();
//ltrace(200) << "MARK 2 doglegAxis: " << DbU::getValueString(doglegAxis) << endl;
}
} else {
@@ -510,8 +507,7 @@ namespace Kite {
doglegAxis = dogLegGCell->getSide( _segment->getDirection() ).getVMin();
//ltrace(200) << "MARK 3 doglegAxis: " << DbU::getValueString(doglegAxis) << endl;
} else {
- // Ugly: hardcoded pitch (5.0 - 1.0).
- doglegAxis = interval.getVMax() + DbU::lambda(4.0);
+ doglegAxis = interval.getVMax() + getPPitch() - DbU::fromLambda(1.0);
//ltrace(200) << "MARK 4 doglegAxis: " << DbU::getValueString(doglegAxis) << endl;
}
}
@@ -558,8 +554,7 @@ namespace Kite {
if (maxExpanded) {
doglegAxis = dogLegGCell->getSide(segment1->getDirection()/*,false*/).getCenter();
} else {
- // Ugly: hardcoded pitch.
- doglegAxis = interval.getVMax() + DbU::lambda(5.0);
+ doglegAxis = interval.getVMax() + getPPitch();
}
if (doglegReuse2) _fsm.addAction( dogleg, SegmentAction::OtherRipup );
else dogleg->setAxis( doglegAxis );
@@ -740,7 +735,7 @@ namespace Kite {
if ( shrinkRight ) {
if ( not (success=Manipulator(*isegment3,_fsm)
.ripup( SegmentAction::OtherRipupPerpandAndPushAside
- , toFree.getVMin() - DbU::lambda(2.5)
+ , toFree.getVMin() - getPPitch()/2
)) )
break;
@@ -755,7 +750,7 @@ namespace Kite {
if ( shrinkLeft ) {
if ( not (success=Manipulator(*isegment3,_fsm)
.ripup( SegmentAction::OtherRipupPerpandAndPushAside
- , toFree.getVMax() + DbU::lambda(2.5)
+ , toFree.getVMax() + getPPitch()/2
)) )
break;
if ( event3->getTracksFree() == 1 ) {
@@ -1033,12 +1028,12 @@ namespace Kite {
if (other->getAxis() < _segment->getAxis()) {
// Ugly: routing pitch.
- shiftedAxisHint = otherEvent->getAxisHint() - DbU::lambda(5.0);
+ shiftedAxisHint = otherEvent->getAxisHint() - getPitch();
if (shiftedAxisHint < uside.getVMin())
shiftedAxisHint = uside.getVMin();
} else {
// Ugly: routing pitch.
- shiftedAxisHint = otherEvent->getAxisHint() + DbU::lambda(5.0);
+ shiftedAxisHint = otherEvent->getAxisHint() + getPitch();
if (shiftedAxisHint > uside.getVMax())
shiftedAxisHint = uside.getVMax();
}
@@ -1094,7 +1089,7 @@ namespace Kite {
if (_segment->isLocal()) {
if (not _segment->canPivotUp(0.5)) return false;
} else {
- if (_segment->getLength() < DbU::lambda(100.0)) {
+ if (_segment->getLength() < 20*getPitch()) {
if (not (flags & AllowShortPivotUp)) return false;
if (not _segment->canPivotUp(1.0)) return false;
}
@@ -1113,7 +1108,7 @@ namespace Kite {
if ( _segment->isFixed()) return false;
if (not _segment->isLocal()) return false;
- if (_segment->getLength() < 5*DbU::lambda(5.0)) return false;
+ if (_segment->getLength() < 5*getPitch()) return false;
if (_fsm.getCosts().size()) {
Track* track = _fsm.getTrack(0);
diff --git a/kite/src/PreProcess.cpp b/kite/src/PreProcess.cpp
index 3afe513a..75e89924 100644
--- a/kite/src/PreProcess.cpp
+++ b/kite/src/PreProcess.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -243,20 +242,21 @@ namespace {
for ( size_t i=0 ; igetSize() ; ++i ) {
TrackElement* segment = track->getSegment(i);
if ( segment and segment->isFixed() and segment->isTerminal() ) {
- Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() );
+ Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() );
+ DbU::Unit ppitch = segment->getPPitch();
- //if (freeInterval.getSize() < DbU::lambda(5.0)*6) {
- if ( (segment->getSourceU() - freeInterval.getVMin() < DbU::lambda(5.0)*3)
- or (freeInterval.getVMax() - segment->getTargetU() < DbU::lambda(5.0)*3) ) {
+ //if (freeInterval.getSize() < ppitch*6) {
+ if ( (segment->getSourceU() - freeInterval.getVMin() < ppitch*3)
+ or (freeInterval.getVMax() - segment->getTargetU() < ppitch*3) ) {
cinfo << "Caged terminal: " << segment << endl;
- if ( (segment->getLayer() != metal2)
- or (segment->getLength() >= DbU::lambda(5.0))
- or (segment->getNet() == neighborNet) ) {
+ if ( (segment->getLayer () != metal2)
+ or (segment->getLength() >= ppitch)
+ or (segment->getNet () == neighborNet) ) {
neighborNet = segment->getNet();
continue;
}
- if (segment->getSourceU() - lastMovedUp < DbU::lambda(5.0)*4) {
+ if (segment->getSourceU() - lastMovedUp < ppitch*4) {
++moveUpCount;
if (moveUpCount % 2 == 0) {
moveUpCaged( segment );
@@ -274,7 +274,7 @@ namespace {
, rp
, metal3
, rp->getSourcePosition()
- , DbU::lambda(1.0), DbU::lambda(1.0)
+ , DbU::fromLambda(1.0), DbU::fromLambda(1.0)
);
source->setFlags( Katabatic::CntIgnoreAnchor );
@@ -283,7 +283,7 @@ namespace {
, rp
, metal3
, rp->getSourcePosition()
- , DbU::lambda(1.0), DbU::lambda(1.0)
+ , DbU::fromLambda(1.0), DbU::fromLambda(1.0)
);
target->setFlags( Katabatic::CntIgnoreAnchor );
diff --git a/kite/src/ProtectRoutingPads.cpp b/kite/src/ProtectRoutingPads.cpp
index 90926c42..77d35245 100644
--- a/kite/src/ProtectRoutingPads.cpp
+++ b/kite/src/ProtectRoutingPads.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -98,7 +97,7 @@ namespace {
DbU::Unit wireWidth = plane->getLayerGauge()->getWireWidth();
DbU::Unit delta = plane->getLayerGauge()->getHalfPitch()
+ wireWidth/2
- - DbU::lambda(0.1);
+ - DbU::fromLambda(0.1);
DbU::Unit extension = segments[i]->getLayer()->getExtentionCap();
Box bb ( segments[i]->getBoundingBox() );
diff --git a/kite/src/RoutingEvent.cpp b/kite/src/RoutingEvent.cpp
index b9c9d89b..73b1f1d1 100644
--- a/kite/src/RoutingEvent.cpp
+++ b/kite/src/RoutingEvent.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -617,8 +616,7 @@ namespace Kite {
ltrace(200) << "Not expanding on Terminals:" << _constraints << endl;
} else {
ltrace(200) << "Expanding:" << _constraints << endl;
- // Ugly: direct uses of Cell Gauge.
- _constraints.inflate( DbU::lambda(50.0) );
+ _constraints.inflate( Session::getSliceHeight() );
ltrace(200) << "Expanding (after):" << _constraints << endl;
}
}
@@ -655,8 +653,8 @@ namespace Kite {
}
_priority
- = (DbU::getLambda(_segment->getLength()) + 1.0)
- * (DbU::getLambda(_segment->base()->getSlack()) + 1.0);
+ = (DbU::toLambda(_segment->getLength()) + 1.0)
+ * (DbU::toLambda(_segment->base()->getSlack()) + 1.0);
ltrace(200) << _segment << " has " << _tracksNb << " choices " << perpandicular << endl;
ltraceout(200);
diff --git a/kite/src/RoutingPlane.cpp b/kite/src/RoutingPlane.cpp
index 3c45faf0..00c929c9 100644
--- a/kite/src/RoutingPlane.cpp
+++ b/kite/src/RoutingPlane.cpp
@@ -1,8 +1,7 @@
-
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -100,18 +99,27 @@ namespace Kite {
if (not plane->_layerGauge)
throw Error( badLayerGauge, depth, getString(kite->getRoutingGauge()).c_str() );
+ DbU::Unit hExtension = 0;
+ DbU::Unit vExtension = 0;
+ unsigned int gaugeDepth = 0;
+ if (Session::getLayerGauge(gaugeDepth)->getType() == Constant::PinOnly) ++gaugeDepth;
+
+ bool HV = (Session::getLayerGauge(gaugeDepth)->getDirection() == Constant::Horizontal);
+ hExtension = Session::getLayerGauge( gaugeDepth + (HV?1:0) )->getPitch() / 2;
+ vExtension = Session::getLayerGauge( gaugeDepth + (HV?0:1) )->getPitch() / 2;
+
size_t trackNumber;
Box abutmentBox = kite->getCell()->getAbutmentBox();
// HARD CODED.
if (plane->getDirection() == KbHorizontal) {
- plane->_trackMin = abutmentBox.getXMin() - DbU::lambda(2.0);
- plane->_trackMax = abutmentBox.getXMax() + DbU::lambda(2.0);
+ plane->_trackMin = abutmentBox.getXMin() - hExtension;
+ plane->_trackMax = abutmentBox.getXMax() + hExtension;
plane->_axisMin = abutmentBox.getYMin();
plane->_axisMax = abutmentBox.getYMax();
trackNumber = plane->computeTracksSize();
} else {
- plane->_trackMin = abutmentBox.getYMin() - DbU::lambda(2.0);
- plane->_trackMax = abutmentBox.getYMax() + DbU::lambda(2.0);
+ plane->_trackMin = abutmentBox.getYMin() - vExtension;
+ plane->_trackMax = abutmentBox.getYMax() + vExtension;
plane->_axisMin = abutmentBox.getXMin();
plane->_axisMax = abutmentBox.getXMax();
trackNumber = plane->computeTracksSize();
diff --git a/kite/src/SegmentFsm.cpp b/kite/src/SegmentFsm.cpp
index 93902fa9..b48d2a66 100644
--- a/kite/src/SegmentFsm.cpp
+++ b/kite/src/SegmentFsm.cpp
@@ -1,7 +1,7 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -41,7 +41,7 @@ namespace {
class Cs1Candidate {
public:
- inline Cs1Candidate ( Track* track=NULL );
+ inline Cs1Candidate ( Track* track=NULL, DbU::Unit ppitch=0 );
inline Track* getTrack () const;
inline size_t getBegin () const;
inline size_t getEnd () const;
@@ -58,6 +58,7 @@ namespace {
friend inline bool operator< ( const Cs1Candidate&, const Cs1Candidate& );
private:
Track* _track;
+ DbU::Unit _ppitch;
size_t _begin;
size_t _end;
vector _conflicts;
@@ -67,8 +68,9 @@ namespace {
};
- inline Cs1Candidate::Cs1Candidate ( Track* track )
+ inline Cs1Candidate::Cs1Candidate ( Track* track, DbU::Unit ppitch )
: _track (track)
+ , _ppitch (ppitch)
, _begin (0)
, _end (0)
, _conflicts ()
@@ -123,7 +125,7 @@ namespace {
}
// Ugly: hard-coded pitch.
- _breakPos = _conflicts[i].getVMin() - DbU::lambda(5.0);
+ _breakPos = _conflicts[i].getVMin() - _ppitch;
}
}
@@ -742,7 +744,7 @@ namespace Kite {
}
for ( ; track and track->getAxis() <= constraints.getVMax() ; track = track->getNextTrack() ) {
- candidates.push_back( Cs1Candidate(track) );
+ candidates.push_back( Cs1Candidate(track,segment->getPPitch()) );
size_t begin;
size_t end;
diff --git a/kite/src/Session.cpp b/kite/src/Session.cpp
index b6e6c2ff..de3fcf42 100644
--- a/kite/src/Session.cpp
+++ b/kite/src/Session.cpp
@@ -1,7 +1,7 @@
// -*- mode: C++; explicit-buffer-name: "Session.cpp" -*-
//
// This file is part of the Coriolis Software.
-// Copyright (c) UPMC 2008-2013, All Rights Reserved
+// Copyright (c) UPMC 2008-2014, All Rights Reserved
//
// +-----------------------------------------------------------------+
// | C O R I O L I S |
@@ -205,6 +205,10 @@ namespace Kite {
for ( set