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 sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->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.
|
||||
sourceConstraints.inflate( 1 );
|
||||
|
@ -261,8 +263,8 @@ namespace Anabatic {
|
|||
cdebug_log(149,0) << "target constraints: " << targetConstraints
|
||||
<< " " << DbU::getValueString(targetConstraints.getSize()) << endl;
|
||||
|
||||
if (not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not sourceGoStraight and not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not targetGoStraight and not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||
|
||||
cdebug_tabw(149,-1);
|
||||
return false;
|
||||
|
|
|
@ -243,13 +243,15 @@ namespace Anabatic {
|
|||
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Horizontal );
|
||||
Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->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.
|
||||
sourceConstraints.inflate( 1 );
|
||||
targetConstraints.inflate( 1 );
|
||||
|
||||
if (not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not sourceGoStraight and not sourceConstraints.contains(sourceSide)) { cdebug_tabw(149,-1); return true; }
|
||||
if (not targetGoStraight and not targetConstraints.contains(targetSide)) { cdebug_tabw(149,-1); return true; }
|
||||
|
||||
cdebug_tabw(149,-1);
|
||||
return false;
|
||||
|
|
|
@ -186,12 +186,13 @@ namespace Anabatic {
|
|||
s += (_flags & (uint64_t)DeviceGCell ) ? 'd' : '-';
|
||||
s += (_flags & (uint64_t)HChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & (uint64_t)VChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & (uint64_t)HRailGCell ) ? 'r' : '-';
|
||||
s += (_flags & (uint64_t)VRailGCell ) ? 'r' : '-';
|
||||
s += (_flags & (uint64_t)StrutGCell ) ? 's' : '-';
|
||||
s += (_flags & (uint64_t)MatrixGCell ) ? 'm' : '-';
|
||||
s += (_flags & (uint64_t)StdCellRow ) ? 'S' : '-';
|
||||
s += (_flags & (uint64_t)HRailGCell ) ? 'H' : '-';
|
||||
s += (_flags & (uint64_t)VRailGCell ) ? 'V' : '-';
|
||||
s += (_flags & (uint64_t)StrutGCell ) ? 'S' : '-';
|
||||
s += (_flags & (uint64_t)MatrixGCell ) ? 'M' : '-';
|
||||
s += (_flags & (uint64_t)StdCellRow ) ? 'R' : '-';
|
||||
s += (_flags & (uint64_t)ChannelRow ) ? 'C' : '-';
|
||||
s += (_flags & (uint64_t)GoStraight ) ? 'g' : '-';
|
||||
s += ",";
|
||||
s += (_flags & (uint64_t)Invalidated ) ? 'i' : '-';
|
||||
s += (_flags & (uint64_t)DestroyGCell ) ? 'D' : '-';
|
||||
|
|
Loading…
Reference in New Issue