Bug fix: Never slacken a segment from a Pin.
* New: In Anabatic::AutoContactTerminal, new method "isOnPin()" to know if the terminal contact is on a Pin. Introduced in base class. * Bug: In Anabatic::AutoHorizontal::_canSlacken() & AutoVertical, forbid slackening from a Pin. As Pin are all on the side of the cell (aligneds) and the perpandicular segment will be locked on the Pin, it generates intractable overlaps for the router.
This commit is contained in:
parent
be2f9f8a45
commit
5498ad9ecb
|
@ -178,6 +178,7 @@ namespace Anabatic {
|
||||||
AutoHorizontal* AutoContact::getHorizontal2 () const { return NULL; }
|
AutoHorizontal* AutoContact::getHorizontal2 () const { return NULL; }
|
||||||
AutoVertical* AutoContact::getVertical1 () const { return NULL; }
|
AutoVertical* AutoContact::getVertical1 () const { return NULL; }
|
||||||
AutoVertical* AutoContact::getVertical2 () const { return NULL; }
|
AutoVertical* AutoContact::getVertical2 () const { return NULL; }
|
||||||
|
bool AutoContact::isOnPin () const { return false; }
|
||||||
|
|
||||||
|
|
||||||
void AutoContact::getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const
|
void AutoContact::getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "hurricane/RoutingPad.h"
|
#include "hurricane/RoutingPad.h"
|
||||||
#include "hurricane/Vertical.h"
|
#include "hurricane/Vertical.h"
|
||||||
#include "hurricane/Horizontal.h"
|
#include "hurricane/Horizontal.h"
|
||||||
|
#include "hurricane/Pin.h"
|
||||||
#include "hurricane/DebugSession.h"
|
#include "hurricane/DebugSession.h"
|
||||||
#include "crlcore/RoutingGauge.h"
|
#include "crlcore/RoutingGauge.h"
|
||||||
#include "anabatic/AutoContactTerminal.h"
|
#include "anabatic/AutoContactTerminal.h"
|
||||||
|
@ -47,6 +48,7 @@ namespace Anabatic {
|
||||||
using Hurricane::Transformation;
|
using Hurricane::Transformation;
|
||||||
using Hurricane::Entity;
|
using Hurricane::Entity;
|
||||||
using Hurricane::Occurrence;
|
using Hurricane::Occurrence;
|
||||||
|
using Hurricane::Pin;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
|
@ -129,6 +131,13 @@ namespace Anabatic {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AutoContactTerminal::isOnPin () const
|
||||||
|
{
|
||||||
|
RoutingPad* rp = dynamic_cast<RoutingPad*>( getAnchor() );
|
||||||
|
return (dynamic_cast<Pin*>(rp->getOccurrence().getEntity()) != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
AutoSegment* AutoContactTerminal::getOpposite ( const AutoSegment* ) const
|
AutoSegment* AutoContactTerminal::getOpposite ( const AutoSegment* ) const
|
||||||
{ return NULL; }
|
{ return NULL; }
|
||||||
|
|
||||||
|
|
|
@ -247,8 +247,9 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cdebug_tabw(149,1);
|
cdebug_tabw(149,1);
|
||||||
|
|
||||||
AutoContact* source = getAutoSource();
|
AutoContact* source = getAutoSource();
|
||||||
AutoContact* target = getAutoTarget();
|
AutoContact* target = getAutoTarget();
|
||||||
|
if (source->isOnPin() or target->isOnPin()) { cdebug_tabw(149,-1); return false; }
|
||||||
|
|
||||||
Interval sourceSide = source->getGCell()->getSide( Flags::Vertical );
|
Interval sourceSide = source->getGCell()->getSide( Flags::Vertical );
|
||||||
Interval targetSide = target->getGCell()->getSide( Flags::Vertical );
|
Interval targetSide = target->getGCell()->getSide( Flags::Vertical );
|
||||||
|
|
|
@ -1729,8 +1729,8 @@ namespace Anabatic {
|
||||||
|
|
||||||
if (_canSlacken()) return true;
|
if (_canSlacken()) return true;
|
||||||
if ((flags & Flags::Propagate) and not isNotAligned()) {
|
if ((flags & Flags::Propagate) and not isNotAligned()) {
|
||||||
forEach ( AutoSegment*, isegment, const_cast<AutoSegment*>(this)->getAligneds() ) {
|
for ( AutoSegment* segment : const_cast<AutoSegment*>(this)->getAligneds() ) {
|
||||||
if (isegment->_canSlacken()) return true;
|
if (segment->_canSlacken()) return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,6 +241,8 @@ namespace Anabatic {
|
||||||
{
|
{
|
||||||
cdebug_tabw(149,-1);
|
cdebug_tabw(149,-1);
|
||||||
|
|
||||||
|
if (getAutoSource()->isOnPin() or getAutoTarget()->isOnPin()) { cdebug_tabw(149,-1); return false; }
|
||||||
|
|
||||||
Interval sourceSide = getAutoSource()->getGCell()->getSide( Flags::Horizontal );
|
Interval sourceSide = getAutoSource()->getGCell()->getSide( Flags::Horizontal );
|
||||||
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());
|
||||||
|
|
|
@ -123,6 +123,7 @@ namespace Anabatic {
|
||||||
inline bool isUserNativeConstraints () const;
|
inline bool isUserNativeConstraints () const;
|
||||||
inline bool isHDogleg () const;
|
inline bool isHDogleg () const;
|
||||||
inline bool isVDogleg () const;
|
inline bool isVDogleg () const;
|
||||||
|
virtual bool isOnPin () const;
|
||||||
inline bool hasBadTopology () const;
|
inline bool hasBadTopology () const;
|
||||||
bool canDestroy ( Flags flags=Flags::NoFlags ) const;
|
bool canDestroy ( Flags flags=Flags::NoFlags ) const;
|
||||||
bool canMoveUp ( const AutoSegment* moved ) const;
|
bool canMoveUp ( const AutoSegment* moved ) const;
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace Anabatic {
|
||||||
virtual void _invalidate ( Flags flags );
|
virtual void _invalidate ( Flags flags );
|
||||||
public:
|
public:
|
||||||
bool isEndPoint () const;
|
bool isEndPoint () const;
|
||||||
|
virtual bool isOnPin () const;
|
||||||
virtual Box getNativeConstraintBox () const;
|
virtual Box getNativeConstraintBox () const;
|
||||||
RoutingPad* getRoutingPad () const;
|
RoutingPad* getRoutingPad () const;
|
||||||
inline AutoSegment* getSegment () const;
|
inline AutoSegment* getSegment () const;
|
||||||
|
|
Loading…
Reference in New Issue