Do not slacken segments which source/target in a "go straight" GCell.
* Change: In Anabatic::AutoHorizontal::_canSlacken(), if the source or target contact is in a GCell flagged "go straight", do not slacken, which would create a dogleg. This case is usually meet under big power rails that render a dogleg impossible to place as all tracks are used. Same modification for AutoVertical.
This commit is contained in:
parent
70a3960ba5
commit
1b2c90424a
|
@ -249,6 +249,8 @@ namespace Anabatic {
|
||||||
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Vertical );
|
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Vertical );
|
||||||
Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax());
|
Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax());
|
||||||
Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax());
|
Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax());
|
||||||
|
bool sourceGoStraight = getAutoSource()->getGCell()->isGoStraight();
|
||||||
|
bool targetGoStraight = getAutoTarget()->getGCell()->isGoStraight();
|
||||||
|
|
||||||
// Expand by a tiny amount for the "contains" to work for sure.
|
// Expand by a tiny amount for the "contains" to work for sure.
|
||||||
sourceConstraints.inflate( 1 );
|
sourceConstraints.inflate( 1 );
|
||||||
|
@ -261,8 +263,8 @@ namespace Anabatic {
|
||||||
cdebug_log(149,0) << "target constraints: " << targetConstraints
|
cdebug_log(149,0) << "target constraints: " << targetConstraints
|
||||||
<< " " << DbU::getValueString(targetConstraints.getSize()) << endl;
|
<< " " << DbU::getValueString(targetConstraints.getSize()) << endl;
|
||||||
|
|
||||||
if (not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
if (not sourceGoStraight and not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||||
if (not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
if (not targetGoStraight and not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||||
|
|
||||||
cdebug_tabw(149,-1);
|
cdebug_tabw(149,-1);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -243,13 +243,15 @@ namespace Anabatic {
|
||||||
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Horizontal );
|
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Horizontal );
|
||||||
Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax());
|
Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax());
|
||||||
Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax());
|
Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax());
|
||||||
|
bool sourceGoStraight = getAutoSource()->getGCell()->isGoStraight();
|
||||||
|
bool targetGoStraight = getAutoTarget()->getGCell()->isGoStraight();
|
||||||
|
|
||||||
// Expand by a tiny amount for the "contains" to work for sure.
|
// Expand by a tiny amount for the "contains" to work for sure.
|
||||||
sourceConstraints.inflate( 1 );
|
sourceConstraints.inflate( 1 );
|
||||||
targetConstraints.inflate( 1 );
|
targetConstraints.inflate( 1 );
|
||||||
|
|
||||||
if (not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
if (not sourceGoStraight and not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||||
if (not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
if (not targetGoStraight and not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||||
|
|
||||||
cdebug_tabw(149,-1);
|
cdebug_tabw(149,-1);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -186,12 +186,13 @@ namespace Anabatic {
|
||||||
s += (_flags & (uint64_t)DeviceGCell ) ? 'd' : '-';
|
s += (_flags & (uint64_t)DeviceGCell ) ? 'd' : '-';
|
||||||
s += (_flags & (uint64_t)HChannelGCell) ? 'c' : '-';
|
s += (_flags & (uint64_t)HChannelGCell) ? 'c' : '-';
|
||||||
s += (_flags & (uint64_t)VChannelGCell) ? 'c' : '-';
|
s += (_flags & (uint64_t)VChannelGCell) ? 'c' : '-';
|
||||||
s += (_flags & (uint64_t)HRailGCell ) ? 'r' : '-';
|
s += (_flags & (uint64_t)HRailGCell ) ? 'H' : '-';
|
||||||
s += (_flags & (uint64_t)VRailGCell ) ? 'r' : '-';
|
s += (_flags & (uint64_t)VRailGCell ) ? 'V' : '-';
|
||||||
s += (_flags & (uint64_t)StrutGCell ) ? 's' : '-';
|
s += (_flags & (uint64_t)StrutGCell ) ? 'S' : '-';
|
||||||
s += (_flags & (uint64_t)MatrixGCell ) ? 'm' : '-';
|
s += (_flags & (uint64_t)MatrixGCell ) ? 'M' : '-';
|
||||||
s += (_flags & (uint64_t)StdCellRow ) ? 'S' : '-';
|
s += (_flags & (uint64_t)StdCellRow ) ? 'R' : '-';
|
||||||
s += (_flags & (uint64_t)ChannelRow ) ? 'C' : '-';
|
s += (_flags & (uint64_t)ChannelRow ) ? 'C' : '-';
|
||||||
|
s += (_flags & (uint64_t)GoStraight ) ? 'g' : '-';
|
||||||
s += ",";
|
s += ",";
|
||||||
s += (_flags & (uint64_t)Invalidated ) ? 'i' : '-';
|
s += (_flags & (uint64_t)Invalidated ) ? 'i' : '-';
|
||||||
s += (_flags & (uint64_t)DestroyGCell ) ? 'D' : '-';
|
s += (_flags & (uint64_t)DestroyGCell ) ? 'D' : '-';
|
||||||
|
|
Loading…
Reference in New Issue