In Katabatic, no more segments with one fixed contact only.

* Bug: In Katabatic, in AutoHorizontal::_slacken() when slackening
    from a METAL2 terminal no longer set the terminal still on the
    terminal fixed. Instead use a the new feature of
    CntUserNativeConstraints.
* Bug: In Katabatic, in AutoContact, new flag CntUsernativeconstraints
    so the native constraint box is specified by the user constraints.
      This new possibility is needed because, if a Contact is fixed
    the native constraint box *is* bound to it's current position.
    But if the related segment is not fixed, and moved, it may move
    the Contact with him, loosing the original fixed position.
      Now we can remember the wanted position through the user
    constraints.
* New: In Katabatic, in GCellConfiguration new explicit management
    for 4 globals and one METAL2 (occured for the first time in the
    RAM generator).
This commit is contained in:
Jean-Paul Chaput 2016-04-22 22:43:53 +02:00
parent 96add8871e
commit 0699fb0a40
5 changed files with 122 additions and 76 deletions

View File

@ -259,7 +259,11 @@ namespace Katabatic {
Box AutoContact::getNativeConstraintBox () const
{ return isFixed() ? Box(_contact->getPosition()) : _gcell->getBoundingBox(); }
{
if (isUserNativeConstraints()) return getConstraintBox();
if (isFixed()) return Box(_contact->getPosition());
return _gcell->getBoundingBox();
}
Interval AutoContact::getNativeUConstraints ( unsigned int direction ) const
@ -438,8 +442,8 @@ namespace Katabatic {
setCBXMax ( box.getXMax() );
setCBYMin ( box.getYMin() );
setCBYMax ( box.getYMax() );
ltrace(110) << "setConstraintBox() - " << this << " " << getConstraintBox() << endl;
ltrace(110) << "* " << _gcell << endl;
ltrace(200) << "setConstraintBox() - " << this << " " << getConstraintBox() << endl;
ltrace(200) << "* " << _gcell << endl;
}
@ -448,6 +452,7 @@ namespace Katabatic {
, unsigned int flags
)
{
ltrace(200) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl;
if (flags & KbHorizontal) {
if ( (constraintMin > getCBYMax()) or (constraintMax < getCBYMin()) ) {
if ( Session::isInDemoMode() or not (flags & KbWarnOnError) ) return false;
@ -487,7 +492,7 @@ namespace Katabatic {
setCBXMin ( std::max(getCBXMin(),constraintMin) );
setCBXMax ( std::min(getCBXMax(),constraintMax) );
}
ltrace(110) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl;
ltrace(200) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl;
return true;
}
@ -609,6 +614,8 @@ namespace Katabatic {
s.insert( s.size()-1, (isVTee ())? "v": "-" );
s.insert( s.size()-1, (isInvalidated ())? "i": "-" );
s.insert( s.size()-1, (isInvalidatedCache())? "c": "-" );
//s.insert( s.size()-1, getString(getConstraintBox()));
return s;
}

View File

@ -189,14 +189,19 @@ namespace Katabatic {
constraintMax = min ( constraintMax, contact->getCBYMax() );
ltrace(148) << "Merge with target constraints: " << contact << " ["
<< DbU::getValueString(constraintMin) << ":"
<< DbU::getValueString(constraintMax) << "]"
<< DbU::getValueString(contact->getCBYMin()) << ":"
<< DbU::getValueString(contact->getCBYMax()) << "]"
<< endl;
constraintMin = max ( constraintMin, getUserConstraints().getVMin() );
constraintMax = min ( constraintMax, getUserConstraints().getVMax() );
ltrace(148) << "Merge with user constraints: " << getUserConstraints() << " ["
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
<< endl;
ltrace(148) << "Resulting constraints: " << " ["
<< DbU::getValueString(constraintMin) << ":"
<< DbU::getValueString(constraintMax) << "]"
<< endl;
@ -323,8 +328,11 @@ namespace Katabatic {
success = true;
if (isMetal2Source) {
ltrace(200) << "Fixing on source terminal contact." << endl;
doglegs[doglegs.size()-2]->getAutoSource()->setFlags( CntFixed );
ltrace(200) << "Fixing on source terminal contact."
<< doglegs[doglegs.size()-2]->getAutoSource() << endl;
//doglegs[doglegs.size()-2]->getAutoSource()->setFlags( CntFixed );
doglegs[doglegs.size()-2]->getAutoSource()->setConstraintBox( source->getConstraintBox() );
doglegs[doglegs.size()-2]->getAutoSource()->setFlags( CntUserNativeConstraints );
}
parallel = doglegs[ doglegs.size()-1 ];
@ -365,8 +373,11 @@ namespace Katabatic {
success = true;
if (isMetal2Target) {
ltrace(200) << "Fixing on target terminal contact." << endl;
doglegs[doglegs.size()-2]->getAutoTarget()->setFlags( CntFixed );
ltrace(200) << "Fixing on target terminal contact: "
<< doglegs[doglegs.size()-2]->getAutoTarget() << endl;
//doglegs[doglegs.size()-2]->getAutoTarget()->setFlags( CntFixed );
doglegs[doglegs.size()-2]->getAutoTarget()->setConstraintBox( target->getConstraintBox() );
doglegs[doglegs.size()-2]->getAutoTarget()->setFlags( CntUserNativeConstraints );
}
}
}
@ -750,14 +761,14 @@ namespace Katabatic {
segment2->setFlags( (isSlackened()?SegSlackened:0) );
Session::dogleg( segment2 );
if (isSourceTerminal()) {
if (autoSource->isTerminal()) {
segment1->setFlags( SegWeakTerminal1 );
segment2->setFlags( SegWeakTerminal1 );
autoTarget->unsetFlags( CntWeakTerminal );
dlContact1->setFlags ( CntWeakTerminal );
if (autoTarget->getGCell() == doglegGCell)
dlContact1->migrateConstraintBox( autoTarget );
} else if (isTargetTerminal()) {
} else if (autoTarget->isTerminal()) {
unsetFlags( SegTargetTerminal );
setFlags( SegWeakTerminal1 );
segment1->setFlags( SegWeakTerminal1 );

View File

@ -653,6 +653,7 @@ namespace {
void _do_1G_xM1 ();
void _do_xG_xM1_xM3 ();
void _do_xG_1M1_1M2 ();
void _do_4G_1M2 ();
void _do_xG_xM2 ();
void _do_1G_1M3 ();
void _do_xG_xM3 ();
@ -725,6 +726,7 @@ namespace {
, Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 0, 0, 0 , 0 )
, Conn_4G_3M1 = CONNEXITY_VALUE( 4, 3, 0, 0, 0 , 0 )
, Conn_4G_4M1 = CONNEXITY_VALUE( 4, 4, 0, 0, 0 , 0 )
, Conn_4G_1M2 = CONNEXITY_VALUE( 4, 0, 1, 0, 0 , 0 )
, Conn_4G_1M3 = CONNEXITY_VALUE( 4, 0, 0, 1, 0 , 0 )
, Conn_1G_1Pad = CONNEXITY_VALUE( 1, 0, 0, 0, 1 , 0 )
, Conn_2G_1Pad = CONNEXITY_VALUE( 2, 0, 0, 0, 1 , 0 )
@ -964,6 +966,7 @@ namespace {
case Conn_4G_2M1:
case Conn_4G_3M1:
case Conn_4G_4M1: _do_xG_xM1_xM3(); break;
case Conn_4G_1M2: _do_4G_1M2(); break;
case Conn_2G_1M2:
case Conn_2G_2M2:
case Conn_2G_3M2:
@ -1799,6 +1802,28 @@ namespace {
}
void GCellTopology::_do_4G_1M2 ()
{
ltrace(99) << "_do_4G_1M2() [Managed Configuration]" << endl;
ltracein(99);
Component* rpL2 = _routingPads[0];
ltrace(99) << "rpL2 := " << rpL2 << endl;
AutoContact* rpL2ContactSource = NULL;
AutoContact* rpL2ContactTarget = NULL;
doRp_AutoContacts( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, DoSourceContact|DoTargetContact );
_southWestContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(2) );
_northEastContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(2) );
AutoSegment::create( _southWestContact, rpL2ContactSource, KbHorizontal );
AutoSegment::create( rpL2ContactTarget, _northEastContact, KbHorizontal );
ltraceout(99);
}
void GCellTopology::_do_xG_xM2 ()
{
ltrace(99) << "_do_"

View File

@ -103,7 +103,7 @@ namespace {
ltrace(99) << "Apply to (target): " << contact << endl;
contact->restrictConstraintBox( constraintBox.getYMin()
, constraintBox.getYMax()
, KbHorizontal );
, KbHorizontal|KbWarnOnError );
}
contact = ialigned->getAutoSource();
ltrace(99) << "contact: " << contact << endl;
@ -111,7 +111,7 @@ namespace {
ltrace(99) << "Apply to (source): " << contact << endl;
contact->restrictConstraintBox( constraintBox.getYMin()
, constraintBox.getYMax()
, KbHorizontal );
, KbHorizontal|KbWarnOnError );
}
}
}
@ -128,14 +128,14 @@ namespace {
ltrace(99) << "Apply to (target): " << contact << endl;
contact->restrictConstraintBox( constraintBox.getXMin()
, constraintBox.getXMax()
, KbVertical );
, KbVertical|KbWarnOnError );
}
contact = ialigned->getAutoSource();
if (contact) {
ltrace(99) << "Apply to (source): " << contact << endl;
contact->restrictConstraintBox( constraintBox.getXMin()
, constraintBox.getXMax()
, KbVertical );
, KbVertical|KbWarnOnError );
}
}
}

View File

@ -56,17 +56,18 @@ namespace Katabatic {
// -------------------------------------------------------------------
// Class : "Katabatic::AutoContact".
enum AutoContactFlag { CntFixed = 0x00000001
, CntTerminal = 0x00000002
, CntTurn = 0x00000004
, CntHTee = 0x00000008
, CntVTee = 0x00000010
, CntInvalidated = 0x00000020
, CntInvalidatedCache = 0x00000040
, CntInCreationStage = 0x00000080
, CntBadTopology = 0x00000100
, CntIgnoreAnchor = 0x00000200
, CntWeakTerminal = 0x00000400
enum AutoContactFlag { CntFixed = 0x00000001
, CntTerminal = 0x00000002
, CntTurn = 0x00000004
, CntHTee = 0x00000008
, CntVTee = 0x00000010
, CntInvalidated = 0x00000020
, CntInvalidatedCache = 0x00000040
, CntInCreationStage = 0x00000080
, CntBadTopology = 0x00000100
, CntIgnoreAnchor = 0x00000200
, CntWeakTerminal = 0x00000400
, CntUserNativeConstraints = 0x00000800
};
class AutoContact {
@ -113,6 +114,7 @@ namespace Katabatic {
inline bool isHTee () const;
inline bool isVTee () const;
inline bool isFixed () const;
inline bool isUserNativeConstraints () const;
inline bool hasBadTopology () const;
bool canDestroy ( unsigned int flags=0 ) const;
bool canMoveUp ( const AutoSegment* moved ) const;
@ -205,55 +207,56 @@ namespace Katabatic {
// Wrapped Contact Inline Functions.
inline Hook* AutoContact::getBodyHook () { return _contact->getBodyHook(); }
inline Hook* AutoContact::getAnchorHook () { return _contact->getAnchorHook(); }
inline Component* AutoContact::getAnchor () const { return _contact->getAnchor(); }
inline Net* AutoContact::getNet () const { return _contact->getNet(); }
inline const Layer* AutoContact::getLayer () const { return _contact->getLayer(); }
inline DbU::Unit AutoContact::getX () const { return _contact->getX(); }
inline DbU::Unit AutoContact::getY () const { return _contact->getY(); }
inline DbU::Unit AutoContact::getDx () const { return _contact->getDx(); }
inline DbU::Unit AutoContact::getDy () const { return _contact->getDy(); }
inline Point AutoContact::getCenter () const { return _contact->getCenter(); }
inline Point AutoContact::getPosition () const { return _contact->getPosition(); }
inline DbU::Unit AutoContact::getWidth () const { return _contact->getWidth(); }
inline DbU::Unit AutoContact::getHalfWidth () const { return _contact->getHalfWidth(); }
inline DbU::Unit AutoContact::getHeight () const { return _contact->getHeight(); }
inline DbU::Unit AutoContact::getHalfHeight () const { return _contact->getHalfHeight(); }
inline Components AutoContact::getSlaveComponents () const { return _contact->getSlaveComponents(); }
inline void AutoContact::setLayer ( const Layer* layer ) { return _contact->setLayer(layer); }
inline void AutoContact::setWidth ( DbU::Unit w ) { return _contact->setWidth(w); }
inline void AutoContact::setHeight ( DbU::Unit h ) { return _contact->setHeight(h); }
inline void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) { return _contact->setSizes(w,h); }
inline void AutoContact::setX ( DbU::Unit x ) { return _contact->setX(x); }
inline void AutoContact::setY ( DbU::Unit y ) { return _contact->setY(y); }
inline void AutoContact::setPosition ( DbU::Unit x, DbU::Unit y ) { return _contact->setPosition(x,y); }
inline void AutoContact::setPosition ( const Point& p ) { return _contact->setPosition(p); }
inline void AutoContact::setDx ( DbU::Unit dx ) { return _contact->setDx(dx); }
inline void AutoContact::setDy ( DbU::Unit dy ) { return _contact->setDy(dy); }
inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { return _contact->setOffset(dx,dy); }
// AutoContact Inline Functions.
inline bool AutoContact::isInCreationStage () const { return _flags&CntInCreationStage; }
inline bool AutoContact::isInvalidated () const { return _flags&CntInvalidated; }
inline bool AutoContact::isInvalidatedCache () const { return _flags&CntInvalidatedCache; }
inline bool AutoContact::isTurn () const { return _flags&CntTurn; }
inline bool AutoContact::isFixed () const { return _flags&CntFixed; }
inline bool AutoContact::isTerminal () const { return _flags&CntTerminal; }
inline bool AutoContact::isHTee () const { return _flags&CntHTee; }
inline bool AutoContact::isVTee () const { return _flags&CntVTee; }
inline bool AutoContact::hasBadTopology () const { return _flags&CntBadTopology; }
inline size_t AutoContact::getId () const { return _id; }
inline Contact* AutoContact::base () const { return _contact; }
inline GCell* AutoContact::getGCell () const { return _gcell; }
inline Box AutoContact::getConstraintBox () const { return Box(getCBXMin(),getCBYMin(),getCBXMax(),getCBYMax()); }
inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); }
inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); }
inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); }
inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); }
inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; }
inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; }
inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (x<xMin) return 0; return (int)DbU::toLambda(x-xMin); }
inline int AutoContact::_getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ) { if (x>xMax) x=xMax; return (int)DbU::toLambda(x-xMin); }
inline Hook* AutoContact::getBodyHook () { return _contact->getBodyHook(); }
inline Hook* AutoContact::getAnchorHook () { return _contact->getAnchorHook(); }
inline Component* AutoContact::getAnchor () const { return _contact->getAnchor(); }
inline Net* AutoContact::getNet () const { return _contact->getNet(); }
inline const Layer* AutoContact::getLayer () const { return _contact->getLayer(); }
inline DbU::Unit AutoContact::getX () const { return _contact->getX(); }
inline DbU::Unit AutoContact::getY () const { return _contact->getY(); }
inline DbU::Unit AutoContact::getDx () const { return _contact->getDx(); }
inline DbU::Unit AutoContact::getDy () const { return _contact->getDy(); }
inline Point AutoContact::getCenter () const { return _contact->getCenter(); }
inline Point AutoContact::getPosition () const { return _contact->getPosition(); }
inline DbU::Unit AutoContact::getWidth () const { return _contact->getWidth(); }
inline DbU::Unit AutoContact::getHalfWidth () const { return _contact->getHalfWidth(); }
inline DbU::Unit AutoContact::getHeight () const { return _contact->getHeight(); }
inline DbU::Unit AutoContact::getHalfHeight () const { return _contact->getHalfHeight(); }
inline Components AutoContact::getSlaveComponents () const { return _contact->getSlaveComponents(); }
inline void AutoContact::setLayer ( const Layer* layer ) { _contact->setLayer(layer); }
inline void AutoContact::setWidth ( DbU::Unit w ) { _contact->setWidth(w); }
inline void AutoContact::setHeight ( DbU::Unit h ) { _contact->setHeight(h); }
inline void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) { _contact->setSizes(w,h); }
inline void AutoContact::setX ( DbU::Unit x ) { _contact->setX(x); }
inline void AutoContact::setY ( DbU::Unit y ) { _contact->setY(y); }
inline void AutoContact::setPosition ( DbU::Unit x, DbU::Unit y ) { _contact->setPosition(x,y); }
inline void AutoContact::setPosition ( const Point& p ) { _contact->setPosition(p); }
inline void AutoContact::setDx ( DbU::Unit dx ) { _contact->setDx(dx); }
inline void AutoContact::setDy ( DbU::Unit dy ) { _contact->setDy(dy); }
inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { _contact->setOffset(dx,dy); }
// AutoContact Inline Functions.
inline bool AutoContact::isInCreationStage () const { return _flags&CntInCreationStage; }
inline bool AutoContact::isInvalidated () const { return _flags&CntInvalidated; }
inline bool AutoContact::isInvalidatedCache () const { return _flags&CntInvalidatedCache; }
inline bool AutoContact::isTurn () const { return _flags&CntTurn; }
inline bool AutoContact::isFixed () const { return _flags&CntFixed; }
inline bool AutoContact::isUserNativeConstraints () const { return _flags&CntUserNativeConstraints; }
inline bool AutoContact::isTerminal () const { return _flags&CntTerminal; }
inline bool AutoContact::isHTee () const { return _flags&CntHTee; }
inline bool AutoContact::isVTee () const { return _flags&CntVTee; }
inline bool AutoContact::hasBadTopology () const { return _flags&CntBadTopology; }
inline size_t AutoContact::getId () const { return _id; }
inline Contact* AutoContact::base () const { return _contact; }
inline GCell* AutoContact::getGCell () const { return _gcell; }
inline Box AutoContact::getConstraintBox () const { return Box(getCBXMin(),getCBYMin(),getCBXMax(),getCBYMax()); }
inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); }
inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); }
inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); }
inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); }
inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; }
inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; }
inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (x<xMin) return 0; return (int)DbU::toLambda(x-xMin); }
inline int AutoContact::_getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ) { if (x>xMax) x=xMax; return (int)DbU::toLambda(x-xMin); }
inline DbU::Unit AutoContact::getCBXMin () const
{ return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMin) + _gcell->getX(); }