diff --git a/katabatic/src/AutoContact.cpp b/katabatic/src/AutoContact.cpp index 437a137a..c8178213 100644 --- a/katabatic/src/AutoContact.cpp +++ b/katabatic/src/AutoContact.cpp @@ -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; } diff --git a/katabatic/src/AutoHorizontal.cpp b/katabatic/src/AutoHorizontal.cpp index d1717f6a..1a750415 100644 --- a/katabatic/src/AutoHorizontal.cpp +++ b/katabatic/src/AutoHorizontal.cpp @@ -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 ); diff --git a/katabatic/src/LoadGrByNet.cpp b/katabatic/src/LoadGrByNet.cpp index d6236fed..a5da24f0 100644 --- a/katabatic/src/LoadGrByNet.cpp +++ b/katabatic/src/LoadGrByNet.cpp @@ -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_" diff --git a/katabatic/src/NetConstraints.cpp b/katabatic/src/NetConstraints.cpp index a9e0318e..5094c7f5 100644 --- a/katabatic/src/NetConstraints.cpp +++ b/katabatic/src/NetConstraints.cpp @@ -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 ); } } } diff --git a/katabatic/src/katabatic/AutoContact.h b/katabatic/src/katabatic/AutoContact.h index 7588b77b..bd8726b1 100644 --- a/katabatic/src/katabatic/AutoContact.h +++ b/katabatic/src/katabatic/AutoContact.h @@ -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 (xxMax) 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 (xxMax) x=xMax; return (int)DbU::toLambda(x-xMin); } inline DbU::Unit AutoContact::getCBXMin () const { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMin) + _gcell->getX(); }