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; }
|
||||
AutoVertical* AutoContact::getVertical1 () 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
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "hurricane/RoutingPad.h"
|
||||
#include "hurricane/Vertical.h"
|
||||
#include "hurricane/Horizontal.h"
|
||||
#include "hurricane/Pin.h"
|
||||
#include "hurricane/DebugSession.h"
|
||||
#include "crlcore/RoutingGauge.h"
|
||||
#include "anabatic/AutoContactTerminal.h"
|
||||
|
@ -47,6 +48,7 @@ namespace Anabatic {
|
|||
using Hurricane::Transformation;
|
||||
using Hurricane::Entity;
|
||||
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
|
||||
{ return NULL; }
|
||||
|
||||
|
|
|
@ -247,8 +247,9 @@ namespace Anabatic {
|
|||
{
|
||||
cdebug_tabw(149,1);
|
||||
|
||||
AutoContact* source = getAutoSource();
|
||||
AutoContact* target = getAutoTarget();
|
||||
AutoContact* source = getAutoSource();
|
||||
AutoContact* target = getAutoTarget();
|
||||
if (source->isOnPin() or target->isOnPin()) { cdebug_tabw(149,-1); return false; }
|
||||
|
||||
Interval sourceSide = source->getGCell()->getSide( Flags::Vertical );
|
||||
Interval targetSide = target->getGCell()->getSide( Flags::Vertical );
|
||||
|
|
|
@ -1729,8 +1729,8 @@ namespace Anabatic {
|
|||
|
||||
if (_canSlacken()) return true;
|
||||
if ((flags & Flags::Propagate) and not isNotAligned()) {
|
||||
forEach ( AutoSegment*, isegment, const_cast<AutoSegment*>(this)->getAligneds() ) {
|
||||
if (isegment->_canSlacken()) return true;
|
||||
for ( AutoSegment* segment : const_cast<AutoSegment*>(this)->getAligneds() ) {
|
||||
if (segment->_canSlacken()) return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -241,6 +241,8 @@ namespace Anabatic {
|
|||
{
|
||||
cdebug_tabw(149,-1);
|
||||
|
||||
if (getAutoSource()->isOnPin() or getAutoTarget()->isOnPin()) { cdebug_tabw(149,-1); return false; }
|
||||
|
||||
Interval sourceSide = getAutoSource()->getGCell()->getSide( Flags::Horizontal );
|
||||
Interval targetSide = getAutoTarget()->getGCell()->getSide( Flags::Horizontal );
|
||||
Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax());
|
||||
|
|
|
@ -123,6 +123,7 @@ namespace Anabatic {
|
|||
inline bool isUserNativeConstraints () const;
|
||||
inline bool isHDogleg () const;
|
||||
inline bool isVDogleg () const;
|
||||
virtual bool isOnPin () const;
|
||||
inline bool hasBadTopology () const;
|
||||
bool canDestroy ( Flags flags=Flags::NoFlags ) const;
|
||||
bool canMoveUp ( const AutoSegment* moved ) const;
|
||||
|
|
|
@ -60,6 +60,7 @@ namespace Anabatic {
|
|||
virtual void _invalidate ( Flags flags );
|
||||
public:
|
||||
bool isEndPoint () const;
|
||||
virtual bool isOnPin () const;
|
||||
virtual Box getNativeConstraintBox () const;
|
||||
RoutingPad* getRoutingPad () const;
|
||||
inline AutoSegment* getSegment () const;
|
||||
|
|
Loading…
Reference in New Issue