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:
parent
96add8871e
commit
0699fb0a40
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 );
|
||||
|
|
|
@ -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_"
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(); }
|
||||
|
|
Loading…
Reference in New Issue