Merge branch 'devel_anabatic' into devel_stratus
This commit is contained in:
commit
a9a006a161
|
@ -1,38 +0,0 @@
|
|||
((nil . ((company-clang-arguments
|
||||
. ("-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/agds"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/alliance/ap"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/alliance/vst"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/bookshelf"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/cif"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/crlcore"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/lefdef"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/liberty"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/openaccess"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/spice"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/ccore/toolbox"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/cyclop"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/fonts"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/LibraryManager/crlcore"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/crlcore/src/pyCRL/crlcore"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/equinox/src/equinox"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/equinox/src/intervalTree/src/equinox"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/etesian/src/etesian"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/isobar/hurricane/isobar"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/viewer/hurricane/viewer"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/viewer/obsoletes"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/katabatic/src/katabatic"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/kite/src/kite"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/knik/src/knik"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/solstice/src/solstice"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/unicorn/src/unicorn"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/agds/src/vlsisapd/agds"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/bookshelf/src/vlsisapd/bookshelf"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/cif/src/vlsisapd/cif"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/configuration/src/vlsisapd/configuration"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/dtr/src/vlsisapd/dtr"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/liberty/src/vlsisapd/liberty"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/openChams/src/vlsisapd/openChams"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/spice/src/vlsisapd/spice"
|
||||
"-I/dsk/l1/jpc/coriolis-2.x/src/coriolis/vlsisapd/src/utilities/src/vlsisapd/utilities"
|
||||
)))))
|
|
@ -8,6 +8,8 @@ TAGS
|
|||
GTAGS
|
||||
GPATH
|
||||
GRTAGS
|
||||
dir-locals.el
|
||||
.projectile
|
||||
|
||||
|
||||
man/
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
-*.fig
|
||||
-*.png
|
||||
-*.eps
|
||||
-*.pdf
|
||||
-*.aux
|
||||
-*.bb
|
|
@ -26,7 +26,7 @@ Documentation
|
|||
|
||||
The complete documentation is available here, both in pdf & html:
|
||||
|
||||
./documentation/UsersGuide/UsersGuide.html
|
||||
./documentation/_build/html/index.html
|
||||
./documentation/UsersGuide/UsersGuide.pdf
|
||||
|
||||
The documentation of the latest *stable* version is also
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
setup_boost()
|
||||
setup_qt()
|
||||
|
||||
find_package(PythonLibs REQUIRED)
|
||||
find_package(PythonLibs 2 REQUIRED)
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(VLSISAPD REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
|
|
|
@ -445,7 +445,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
NetData* AnabaticEngine::getNetData ( Net* net, unsigned int flags )
|
||||
NetData* AnabaticEngine::getNetData ( Net* net, Flags flags )
|
||||
{
|
||||
NetData* data = NULL;
|
||||
NetDatas::iterator idata = _netDatas.find( net->getId() );
|
||||
|
@ -606,7 +606,6 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::ripup ( Segment* seed, Flags flags )
|
||||
{
|
||||
|
||||
Net* net = seed->getNet();
|
||||
|
||||
DebugSession::open( net, 112, 120 );
|
||||
|
@ -703,7 +702,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AnabaticEngine::loadGlobalRouting ( unsigned int method )
|
||||
void AnabaticEngine::loadGlobalRouting ( uint32_t method )
|
||||
{
|
||||
if (_state < EngineGlobalLoaded)
|
||||
throw Error ("AnabaticEngine::loadGlobalRouting() : global routing not present yet.");
|
||||
|
@ -711,15 +710,9 @@ namespace Anabatic {
|
|||
if (_state > EngineGlobalLoaded)
|
||||
throw Error ("AnabaticEngine::loadGlobalRouting() : global routing already loaded.");
|
||||
|
||||
switch ( method ) {
|
||||
case EngineLoadGrByNet: _loadGrByNet(); break;
|
||||
case EngineLoadGrByGCell:
|
||||
default:
|
||||
throw Error( badMethod
|
||||
, "Anabatic::loadGlobalRouting()"
|
||||
, method
|
||||
, getString(_cell).c_str()
|
||||
);
|
||||
if (method == EngineLoadGrByNet ) { _loadGrByNet(); }
|
||||
else {
|
||||
throw Error( badMethod, "Anabatic::loadGlobalRouting()", method, getString(_cell).c_str() );
|
||||
}
|
||||
cleanupGlobal();
|
||||
|
||||
|
|
|
@ -157,7 +157,7 @@ namespace Anabatic {
|
|||
{ return _goName; }
|
||||
|
||||
|
||||
bool AutoContact::canDestroy ( unsigned int flags ) const
|
||||
bool AutoContact::canDestroy ( Flags flags ) const
|
||||
{
|
||||
if (not _contact->getSlaveComponents().isEmpty()) {
|
||||
if (flags & Flags::WarnOnError) {
|
||||
|
@ -171,16 +171,13 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
const Name& AutoContact::getName () const
|
||||
{ return _goName; }
|
||||
|
||||
|
||||
AutoSegments AutoContact::getAutoSegments ()
|
||||
{ return new AutoSegments_CachedOnContact(this); }
|
||||
|
||||
|
||||
AutoSegment* AutoContact::getPerpandicular ( const AutoSegment* ) const
|
||||
{ return NULL; }
|
||||
const Name& AutoContact::getName () const { return _goName; }
|
||||
AutoSegments AutoContact::getAutoSegments () { return new AutoSegments_CachedOnContact(this); }
|
||||
AutoSegment* AutoContact::getPerpandicular ( const AutoSegment* ) const { return NULL; }
|
||||
AutoHorizontal* AutoContact::getHorizontal1 () const { return NULL; }
|
||||
AutoHorizontal* AutoContact::getHorizontal2 () const { return NULL; }
|
||||
AutoVertical* AutoContact::getVertical1 () const { return NULL; }
|
||||
AutoVertical* AutoContact::getVertical2 () const { return NULL; }
|
||||
|
||||
|
||||
void AutoContact::getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const
|
||||
|
@ -248,7 +245,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoContact::getNativeUConstraints ( unsigned int direction ) const
|
||||
Interval AutoContact::getNativeUConstraints ( Flags direction ) const
|
||||
{
|
||||
Box nativeConstraints = getNativeConstraintBox();
|
||||
Interval constraint;
|
||||
|
@ -262,7 +259,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoContact::getUConstraints ( unsigned int direction ) const
|
||||
Interval AutoContact::getUConstraints ( Flags direction ) const
|
||||
{
|
||||
Interval constraint;
|
||||
if (direction & Flags::Horizontal) {
|
||||
|
@ -275,7 +272,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContact::invalidate ( unsigned int flags )
|
||||
void AutoContact::invalidate ( Flags flags )
|
||||
{
|
||||
if (not isInvalidated()) {
|
||||
cdebug_log(145,1) << "AutoContact::invalidate() - " << this << endl;
|
||||
|
@ -318,6 +315,31 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContact::updateSize ()
|
||||
{
|
||||
if (isInvalidatedWidth()) {
|
||||
size_t minDepth = 0;
|
||||
size_t maxDepth = 0;
|
||||
getDepthSpan( minDepth, maxDepth );
|
||||
|
||||
if (getVertical1() and getVertical1()->isWide()) {
|
||||
size_t vdepth = (Session::getLayerDepth(getVertical1()->getLayer()) == maxDepth) ? maxDepth : minDepth;
|
||||
DbU::Unit width = getVertical1()->getWidth();
|
||||
width += Session::getViaWidth(vdepth) - Session::getWireWidth(vdepth);
|
||||
setWidth( width );
|
||||
}
|
||||
|
||||
if (getHorizontal1() and getHorizontal1()->isWide()) {
|
||||
size_t hdepth = (Session::getLayerDepth(getHorizontal1()->getLayer()) == maxDepth) ? maxDepth : minDepth;
|
||||
DbU::Unit width = getHorizontal1()->getWidth();
|
||||
width += Session::getViaWidth(hdepth) - Session::getWireWidth(hdepth);
|
||||
setHeight( width );
|
||||
}
|
||||
unsetFlags ( CntInvalidatedWidth );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void AutoContact::_getTopology ( Contact* support, Component*& anchor, Horizontal**& horizontals, Vertical**& verticals, size_t size )
|
||||
{
|
||||
size_t hcount = 0;
|
||||
|
@ -342,7 +364,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContact::showTopologyError ( const std::string& message, unsigned int flags )
|
||||
void AutoContact::showTopologyError ( const std::string& message, Flags flags )
|
||||
{
|
||||
Component* anchor = NULL;
|
||||
Horizontal** horizontals = new Horizontal* [10];
|
||||
|
@ -395,7 +417,7 @@ namespace Anabatic {
|
|||
|
||||
|
||||
|
||||
bool AutoContact::isTee ( unsigned int direction ) const
|
||||
bool AutoContact::isTee ( Flags direction ) const
|
||||
{
|
||||
return (isHTee() and (direction & Flags::Horizontal))
|
||||
or (isVTee() and (direction & Flags::Vertical ));
|
||||
|
@ -442,9 +464,9 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoContact::restrictConstraintBox ( DbU::Unit constraintMin
|
||||
, DbU::Unit constraintMax
|
||||
, unsigned int flags
|
||||
bool AutoContact::restrictConstraintBox ( DbU::Unit constraintMin
|
||||
, DbU::Unit constraintMax
|
||||
, Flags flags
|
||||
)
|
||||
{
|
||||
cdebug_log(149,0) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl;
|
||||
|
|
|
@ -110,9 +110,14 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContactHTee::_invalidate ( unsigned int )
|
||||
AutoHorizontal* AutoContactHTee::getHorizontal1 () const { return _horizontal1; };
|
||||
AutoHorizontal* AutoContactHTee::getHorizontal2 () const { return _horizontal2; };
|
||||
AutoVertical* AutoContactHTee::getVertical1 () const { return _vertical1; };
|
||||
|
||||
|
||||
void AutoContactHTee::_invalidate ( Flags )
|
||||
{
|
||||
unsigned int flags = Flags::Propagate;
|
||||
Flags flags = Flags::Propagate;
|
||||
if (_horizontal1 and _horizontal2) {
|
||||
if (_horizontal1->isInvalidated() xor _horizontal2->isInvalidated())
|
||||
flags = Flags::NoFlags;
|
||||
|
@ -258,6 +263,7 @@ namespace Anabatic {
|
|||
if (not hasBadTopology()) {
|
||||
setX( getVertical1 ()->getX() );
|
||||
setY( getHorizontal1()->getY() );
|
||||
updateSize();
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
|
|
|
@ -246,16 +246,23 @@ namespace Anabatic {
|
|||
order( xMin, xMax );
|
||||
order( yMin, yMax );
|
||||
|
||||
Box bb ( xMin, yMin, xMax, yMax );
|
||||
|
||||
if (_segment and _segment->isWide()) {
|
||||
if (dynamic_cast<AutoHorizontal*>(_segment)) bb.inflate( 0, 0, 0, -_segment->getWidth() );
|
||||
else bb.inflate( 0, 0, -_segment->getWidth(), 0 );
|
||||
}
|
||||
|
||||
cdebug_log(145,0) << "| Using (y): "
|
||||
<< DbU::getValueString(yMin) << " "
|
||||
<< DbU::getValueString(yMax) << endl;
|
||||
<< DbU::getValueString(bb.getYMin()) << " "
|
||||
<< DbU::getValueString(bb.getYMax()) << endl;
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
return Box( xMin, yMin, xMax, yMax );
|
||||
return bb;
|
||||
}
|
||||
|
||||
|
||||
void AutoContactTerminal::_invalidate ( unsigned int flags )
|
||||
void AutoContactTerminal::_invalidate ( Flags flags )
|
||||
{
|
||||
if (_segment) _segment->invalidate();
|
||||
}
|
||||
|
@ -354,28 +361,47 @@ namespace Anabatic {
|
|||
|
||||
ostringstream message;
|
||||
if (not hasBadTopology()) {
|
||||
Box anchorBb = getAnchor()->getBoundingBox();
|
||||
anchorBb.inflate( Session::getViaWidth (getAnchor()->getLayer())
|
||||
- Session::getWireWidth(getAnchor()->getLayer()) );
|
||||
|
||||
if (_segment->isHorizontal()) {
|
||||
if (not getUConstraints(Flags::Vertical).contains(_segment->getY())) {
|
||||
DbU::Unit axis = _segment->getY();
|
||||
if (_segment->isWide()) {
|
||||
axis += (- _segment->getWidth() + Session::getWireWidth(_segment->getLayer())) / 2;
|
||||
setHeight( _segment->getContactWidth() );
|
||||
}
|
||||
|
||||
if (not getUConstraints(Flags::Vertical).contains(axis)) {
|
||||
cdebug_log(145,0) << "Cached: " << _segment << endl;
|
||||
message << "Terminal horizontal segment Y " << DbU::getValueString(_segment->getY())
|
||||
message << "Terminal horizontal segment Y " << DbU::getValueString(axis)
|
||||
<< " axis is outside RoutingPad " << getUConstraints(Flags::Vertical) << ".";
|
||||
|
||||
Interval intv;
|
||||
_segment->getConstraints( intv );
|
||||
message << "\n Segment constraints: " << intv << endl;
|
||||
|
||||
unsigned int flags = 0;
|
||||
Flags flags = Flags::NoFlags;
|
||||
if (_segment->isCreated()) flags |= Flags::CParanoid;
|
||||
showTopologyError( message.str(), flags );
|
||||
} else
|
||||
setY( _segment->getY() );
|
||||
} else {
|
||||
if (not getUConstraints(Flags::Horizontal).contains(_segment->getX())) {
|
||||
DbU::Unit axis = _segment->getX();
|
||||
if (_segment->isWide()) {
|
||||
axis += (- _segment->getWidth() + Session::getWireWidth(_segment->getLayer())) / 2;
|
||||
setWidth ( _segment->getContactWidth() );
|
||||
setHeight( anchorBb.getHeight() );
|
||||
|
||||
cdebug_log(145,0) << "Contact for wide segment." << endl;
|
||||
}
|
||||
|
||||
if (not getUConstraints(Flags::Horizontal).contains(axis)) {
|
||||
cdebug_log(145,0) << "Cached: " << _segment << endl;
|
||||
message << "Terminal vertical segment X" << DbU::getValueString(_segment->getX())
|
||||
message << "Terminal vertical segment X" << DbU::getValueString(axis)
|
||||
<< " axis is outside RoutingPad " << getUConstraints(Flags::Horizontal) << ".";
|
||||
|
||||
unsigned int flags = 0;
|
||||
Flags flags = Flags::NoFlags;
|
||||
if (_segment->isCreated()) flags |= Flags::CParanoid;
|
||||
showTopologyError( message.str(), flags );
|
||||
} else
|
||||
|
|
|
@ -104,7 +104,11 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContactTurn::_invalidate ( unsigned int flags )
|
||||
AutoHorizontal* AutoContactTurn::getHorizontal1 () const { return _horizontal1; };
|
||||
AutoVertical* AutoContactTurn::getVertical1 () const { return _vertical1; };
|
||||
|
||||
|
||||
void AutoContactTurn::_invalidate ( Flags flags )
|
||||
{
|
||||
if (_horizontal1) _horizontal1->invalidate();
|
||||
if (_vertical1 ) _vertical1 ->invalidate();
|
||||
|
@ -144,6 +148,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
if (_horizontal1 and _vertical1) unsetFlags( CntInvalidatedCache );
|
||||
setFlags( CntInvalidatedWidth );
|
||||
}
|
||||
|
||||
|
||||
|
@ -172,8 +177,10 @@ namespace Anabatic {
|
|||
if (not message.empty()) {
|
||||
showTopologyError( message );
|
||||
setFlags( CntBadTopology );
|
||||
} else
|
||||
} else {
|
||||
unsetFlags( CntInvalidatedCache );
|
||||
setFlags ( CntInvalidatedWidth );
|
||||
}
|
||||
|
||||
cdebug_log(145,0) << "h1:" << _horizontal1 << endl;
|
||||
cdebug_log(145,0) << "v1:" << _vertical1 << endl;
|
||||
|
@ -201,11 +208,12 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
base()->invalidate( false );
|
||||
unsetFlags ( CntInvalidated );
|
||||
unsetFlags( CntInvalidated );
|
||||
|
||||
if (not hasBadTopology()) {
|
||||
setX( getVertical1 ()->getX() );
|
||||
setY( getHorizontal1()->getY() );
|
||||
updateSize();
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
|
|
|
@ -106,9 +106,14 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoContactVTee::_invalidate ( unsigned int )
|
||||
AutoHorizontal* AutoContactVTee::getHorizontal1 () const { return _horizontal1; };
|
||||
AutoVertical* AutoContactVTee::getVertical1 () const { return _vertical1; };
|
||||
AutoVertical* AutoContactVTee::getVertical2 () const { return _vertical2; };
|
||||
|
||||
|
||||
void AutoContactVTee::_invalidate ( Flags )
|
||||
{
|
||||
unsigned int flags = Flags::Propagate;
|
||||
Flags flags = Flags::Propagate;
|
||||
if (_vertical1 and _vertical2) {
|
||||
if (_vertical1->isInvalidated() xor _vertical2->isInvalidated())
|
||||
flags = Flags::NoFlags;
|
||||
|
@ -225,6 +230,7 @@ namespace Anabatic {
|
|||
if (not hasBadTopology()) {
|
||||
setX( getVertical1 ()->getX() );
|
||||
setY( getHorizontal1()->getY() );
|
||||
updateSize();
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
|
|
|
@ -120,7 +120,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoHorizontal::getSourceConstraints ( unsigned int flags ) const
|
||||
Interval AutoHorizontal::getSourceConstraints ( Flags flags ) const
|
||||
{
|
||||
if (flags & Flags::NativeConstraints) {
|
||||
Box nativeBox ( getAutoSource()->getNativeConstraintBox() );
|
||||
|
@ -130,7 +130,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoHorizontal::getTargetConstraints ( unsigned int flags ) const
|
||||
Interval AutoHorizontal::getTargetConstraints ( Flags flags ) const
|
||||
{
|
||||
if (flags & Flags::NativeConstraints) {
|
||||
Box nativeBox ( getAutoTarget()->getNativeConstraintBox() );
|
||||
|
@ -145,26 +145,26 @@ namespace Anabatic {
|
|||
constraintMin = getNativeMin();
|
||||
constraintMax = getNativeMax();
|
||||
|
||||
cdebug_log(149,0) << "Native constraints: ["
|
||||
cdebug_log(144,0) << "Native constraints: ["
|
||||
<< DbU::getValueString(constraintMin) << ":"
|
||||
<< DbU::getValueString(constraintMax) << "]"
|
||||
<< endl;
|
||||
|
||||
constraintMin = std::max ( constraintMin, getAutoSource()->getCBYMin() );
|
||||
constraintMax = std::min ( constraintMax, getAutoSource()->getCBYMax() );
|
||||
cdebug_log(149,0) << "Merge with source constraints: ["
|
||||
cdebug_log(144,0) << "Merge with source constraints: ["
|
||||
<< DbU::getValueString(getAutoSource()->getCBYMin()) << ":"
|
||||
<< DbU::getValueString(getAutoSource()->getCBYMax()) << "]"
|
||||
<< endl;
|
||||
|
||||
constraintMin = std::max ( constraintMin, getUserConstraints().getVMin() );
|
||||
constraintMax = std::min ( constraintMax, getUserConstraints().getVMax() );
|
||||
cdebug_log(149,0) << "Merge with user constraints: ["
|
||||
cdebug_log(144,0) << "Merge with user constraints: ["
|
||||
<< DbU::getValueString(getUserConstraints().getVMin()) << ":"
|
||||
<< DbU::getValueString(getUserConstraints().getVMax()) << "]"
|
||||
<< endl;
|
||||
|
||||
cdebug_log(149,0) << "Resulting constraints: " << " ["
|
||||
cdebug_log(145,0) << "Resulting constraints: " << " ["
|
||||
<< DbU::getValueString(constraintMin) << ":"
|
||||
<< DbU::getValueString(constraintMax) << "]"
|
||||
<< endl;
|
||||
|
@ -185,7 +185,7 @@ namespace Anabatic {
|
|||
GCell* gcell = getAutoSource()->getGCell();
|
||||
GCell* end = getAutoTarget()->getGCell();
|
||||
|
||||
cdebug_log(149,0) << "yprobe: " << DbU::getValueString(yprobe) << endl;
|
||||
cdebug_log(144,0) << "yprobe: " << DbU::getValueString(yprobe) << endl;
|
||||
|
||||
if (gcell->getXMin() > end->getXMin()) std::swap( gcell, end );
|
||||
if (yprobe == gcell->getConstraintYMax()) yprobe--;
|
||||
|
@ -240,7 +240,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoHorizontal::_slacken ( unsigned int flags )
|
||||
bool AutoHorizontal::_slacken ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,0) << "AutoHorizontal::_slacken() " << this << endl;
|
||||
|
||||
|
@ -389,7 +389,7 @@ namespace Anabatic {
|
|||
|
||||
if (_horizontal->getY() == axis) return;
|
||||
|
||||
cdebug_log(145,0) << "_setAxis() @Y " << DbU::getValueString(axis) << " " << this << endl;
|
||||
cdebug_log(144,0) << "_setAxis() @Y " << DbU::getValueString(axis) << " " << this << endl;
|
||||
|
||||
_horizontal->setY( axis );
|
||||
invalidate();
|
||||
|
@ -410,19 +410,19 @@ namespace Anabatic {
|
|||
cdebug_log(145,0) << "updateOrient() " << this << " (before S/T swap)" << endl;
|
||||
_horizontal->invert();
|
||||
|
||||
unsigned int spinFlags = _flags & SegDepthSpin;
|
||||
uint64_t spinFlags = _flags & SegDepthSpin;
|
||||
unsetFlags( SegDepthSpin );
|
||||
if (spinFlags & SegSourceTop ) setFlags( SegTargetTop );
|
||||
if (spinFlags & SegSourceBottom) setFlags( SegTargetBottom );
|
||||
if (spinFlags & SegTargetTop ) setFlags( SegSourceTop );
|
||||
if (spinFlags & SegTargetBottom) setFlags( SegSourceBottom );
|
||||
|
||||
unsigned int invalidatedFlags = _flags & (SegInvalidatedSource|SegInvalidatedTarget);
|
||||
uint64_t invalidatedFlags = _flags & (SegInvalidatedSource|SegInvalidatedTarget);
|
||||
unsetFlags( SegInvalidatedSource|SegInvalidatedTarget );
|
||||
if (invalidatedFlags & SegInvalidatedSource) setFlags( SegInvalidatedTarget );
|
||||
if (invalidatedFlags & SegInvalidatedTarget) setFlags( SegInvalidatedSource );
|
||||
|
||||
unsigned int terminalFlags = _flags & SegStrongTerminal;
|
||||
uint64_t terminalFlags = _flags & SegStrongTerminal;
|
||||
unsetFlags( SegStrongTerminal );
|
||||
if (terminalFlags & SegSourceTerminal) setFlags( SegTargetTerminal );
|
||||
if (terminalFlags & SegTargetTerminal) setFlags( SegSourceTerminal );
|
||||
|
@ -432,8 +432,8 @@ namespace Anabatic {
|
|||
|
||||
void AutoHorizontal::updatePositions ()
|
||||
{
|
||||
_sourcePosition = _horizontal->getSourceX() - Session::getExtensionCap(getLayer());
|
||||
_targetPosition = _horizontal->getTargetX() + Session::getExtensionCap(getLayer());
|
||||
_sourcePosition = _horizontal->getSourceX() - getExtensionCap();
|
||||
_targetPosition = _horizontal->getTargetX() + getExtensionCap();
|
||||
}
|
||||
|
||||
|
||||
|
@ -453,8 +453,8 @@ namespace Anabatic {
|
|||
bool AutoHorizontal::checkPositions () const
|
||||
{
|
||||
bool coherency = true;
|
||||
DbU::Unit sourcePosition = _horizontal->getSourceX() - Session::getExtensionCap(getLayer());
|
||||
DbU::Unit targetPosition = _horizontal->getTargetX() + Session::getExtensionCap(getLayer());
|
||||
DbU::Unit sourcePosition = _horizontal->getSourceX() - getExtensionCap();
|
||||
DbU::Unit targetPosition = _horizontal->getTargetX() + getExtensionCap();
|
||||
|
||||
if ( _sourcePosition != sourcePosition ) {
|
||||
cerr << Error ( "%s\n Source position incoherency: "
|
||||
|
@ -728,7 +728,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
unsigned int AutoHorizontal::_makeDogleg ( GCell* doglegGCell, unsigned int flags )
|
||||
Flags AutoHorizontal::_makeDogleg ( GCell* doglegGCell, Flags flags )
|
||||
{
|
||||
DebugSession::open( getNet(), 140, 150 );
|
||||
cdebug_log(149,0) << "AutoHorizontal::_makeDogleg(GCell*) in " << doglegGCell << endl;
|
||||
|
@ -808,6 +808,11 @@ namespace Anabatic {
|
|||
segment2->setFlags( SegWeakTerminal1 );
|
||||
}
|
||||
|
||||
if (isAnalog()) {
|
||||
segment1->setFlags( SegAnalog );
|
||||
segment2->setFlags( SegAnalog );
|
||||
}
|
||||
|
||||
cdebug_log(149,0) << "Session::dogleg[x+1] perpand: " << segment1 << endl;
|
||||
cdebug_log(149,0) << "Session::dogleg[x+2] new paral: " << segment2 << endl;
|
||||
cdebug_log(149,0) << "Session::dogleg[x+0] original: " << this << endl;
|
||||
|
|
|
@ -233,6 +233,77 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// Class : "SideStack".
|
||||
|
||||
class SideStack {
|
||||
public:
|
||||
SideStack ( Flags direction, DbU::Unit pitch );
|
||||
const Interval& getSideAt ( DbU::Unit ) const;
|
||||
inline const Interval& getGSide () const;
|
||||
inline DbU::Unit getGSideMin () const;
|
||||
inline DbU::Unit getGSideMax () const;
|
||||
void addGCell ( const GCell* );
|
||||
inline void restrictGSide ( const Interval& );
|
||||
void show () const;
|
||||
private:
|
||||
Flags _direction;
|
||||
DbU::Unit _pitch;
|
||||
Interval _full;
|
||||
Interval _gside;
|
||||
map<DbU::Unit,Interval> _sides;
|
||||
};
|
||||
|
||||
|
||||
SideStack::SideStack ( Flags direction, DbU::Unit pitch )
|
||||
: _direction( (direction & Flags::Horizontal) ? Flags::Vertical : Flags::Horizontal )
|
||||
, _pitch (pitch)
|
||||
, _full (false)
|
||||
, _gside (false)
|
||||
, _sides ()
|
||||
{ }
|
||||
|
||||
|
||||
inline const Interval& SideStack::getGSide () const { return _gside; }
|
||||
inline DbU::Unit SideStack::getGSideMin () const { return _gside.getVMin(); }
|
||||
inline DbU::Unit SideStack::getGSideMax () const { return _gside.getVMax(); }
|
||||
inline void SideStack::restrictGSide ( const Interval& restrict ) { _gside.intersection( restrict ); }
|
||||
|
||||
|
||||
const Interval& SideStack::getSideAt ( DbU::Unit position ) const
|
||||
{
|
||||
if (_sides.empty()) return _full;
|
||||
if (_sides.size() == 1) return _sides.begin()->second;
|
||||
|
||||
if (_sides.begin()->first > position) return _sides.begin()->second;
|
||||
for ( auto iside = ++_sides.begin() ; iside != _sides.end() ; ++iside ) {
|
||||
if (iside->first >= position) return (--iside)->second;
|
||||
}
|
||||
return _sides.rbegin()->second;
|
||||
}
|
||||
|
||||
|
||||
void SideStack::addGCell ( const GCell* gcell )
|
||||
{
|
||||
Interval side = gcell->getSide( _direction, _pitch );
|
||||
DbU::Unit position = (_direction & Flags::Vertical) ? gcell->getBoundingBox().getXMin()
|
||||
: gcell->getBoundingBox().getYMin();
|
||||
|
||||
_gside.intersection( side );
|
||||
_sides.insert( make_pair(position,side) );
|
||||
}
|
||||
|
||||
|
||||
void SideStack::show () const
|
||||
{
|
||||
cdebug_log(145,0) << "SideStack::show()" << endl;
|
||||
for ( auto pside : _sides ) {
|
||||
cdebug_log(145,0) << "@ " << DbU::getValueString(pside.first)
|
||||
<< " " << pside.second << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // End of local namespace.
|
||||
|
||||
|
||||
|
@ -303,9 +374,13 @@ namespace Anabatic {
|
|||
// Class : "Anabatic::AutoSegment".
|
||||
|
||||
|
||||
size_t AutoSegment::_allocateds = 0;
|
||||
size_t AutoSegment::_globalsCount = 0;
|
||||
unsigned long AutoSegment::_maxId = 0;
|
||||
size_t AutoSegment::_allocateds = 0;
|
||||
size_t AutoSegment::_globalsCount = 0;
|
||||
bool AutoSegment::_analogMode = false;
|
||||
|
||||
|
||||
void AutoSegment::setAnalogMode ( bool state ) { _analogMode = state; }
|
||||
bool AutoSegment::getAnalogMode () { return _analogMode; }
|
||||
|
||||
|
||||
AutoSegment::AutoSegment ( Segment* segment )
|
||||
|
@ -334,6 +409,7 @@ namespace Anabatic {
|
|||
|
||||
if (source->isTerminal()) setFlags( SegSourceTerminal );
|
||||
if (target->isTerminal()) setFlags( SegTargetTerminal );
|
||||
if (_analogMode) setFlags( SegAnalog );
|
||||
|
||||
source->invalidate( Flags::Topology );
|
||||
}
|
||||
|
@ -412,7 +488,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoSegment::invalidate ( unsigned int flags )
|
||||
void AutoSegment::invalidate ( Flags flags )
|
||||
{
|
||||
if (Session::doDestroyTool()) return;
|
||||
if (flags & Flags::Source) setFlags( SegInvalidatedSource );
|
||||
|
@ -463,7 +539,7 @@ namespace Anabatic {
|
|||
updateOrient ();
|
||||
updatePositions();
|
||||
|
||||
unsigned int oldSpinFlags = _flags & SegDepthSpin;
|
||||
uint64_t oldSpinFlags = _flags & SegDepthSpin;
|
||||
|
||||
if (_flags & (SegInvalidatedSource|SegCreated)) {
|
||||
AutoContact* source = getAutoSource();
|
||||
|
@ -509,13 +585,13 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::isStrongTerminal ( unsigned int flags ) const
|
||||
bool AutoSegment::isStrongTerminal ( Flags flags ) const
|
||||
{
|
||||
if (_flags & SegStrongTerminal) return true;
|
||||
|
||||
if ((flags & Flags::Propagate) and not isNotAligned()) {
|
||||
forEach( AutoSegment*, isegment, const_cast<AutoSegment*>(this)->getAligneds() ) {
|
||||
if (isegment->_flags & SegStrongTerminal) return true;
|
||||
for ( AutoSegment* segment : const_cast<AutoSegment*>(this)->getAligneds() ) {
|
||||
if (segment->_flags & SegStrongTerminal) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
@ -532,6 +608,13 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
DbU::Unit AutoSegment::getExtensionCap () const
|
||||
{
|
||||
DbU::Unit mWidth = std::max( Session::getWireWidth(getLayer()), Session::getViaWidth(getLayer()) );
|
||||
if (getWidth() <= mWidth) return Session::getExtensionCap( getLayer() );
|
||||
return getWidth() / 2;
|
||||
}
|
||||
|
||||
DbU::Unit AutoSegment::getSlack () const
|
||||
{
|
||||
DbU::Unit constraintMin;
|
||||
|
@ -606,44 +689,38 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getOnSourceContact ( unsigned int direction )
|
||||
AutoSegments AutoSegment::getOnSourceContact ( Flags direction )
|
||||
{
|
||||
return AutoSegments_OnContact
|
||||
( this, getSource() ).getSubSet( AutoSegments_InDirection(direction) );
|
||||
}
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getOnTargetContact ( unsigned int direction )
|
||||
AutoSegments AutoSegment::getOnTargetContact ( Flags direction )
|
||||
{
|
||||
return AutoSegments_OnContact
|
||||
( this, getTarget() ).getSubSet( AutoSegments_InDirection(direction) );
|
||||
}
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getCachedOnSourceContact ( unsigned int direction )
|
||||
AutoSegments AutoSegment::getCachedOnSourceContact ( Flags direction )
|
||||
{ return AutoSegments_CachedOnContact( getAutoSource(), direction ); }
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getCachedOnTargetContact ( unsigned int direction )
|
||||
AutoSegments AutoSegment::getCachedOnTargetContact ( Flags direction )
|
||||
{ return AutoSegments_CachedOnContact( getAutoTarget(), direction ); }
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getAligneds ( unsigned int flags )
|
||||
{
|
||||
cdebug_log(145,0) << "AutoSegment::getAligneds() - flags:" << flags << endl;
|
||||
return AutoSegments_Aligneds( this, flags );
|
||||
}
|
||||
AutoSegments AutoSegment::getAligneds ( Flags flags )
|
||||
{ return AutoSegments_Aligneds( this, flags ); }
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getConnecteds ( unsigned int flags )
|
||||
{
|
||||
cdebug_log(145,0) << "AutoSegment::getConnecteds() - flags:" << flags << endl;
|
||||
return AutoSegments_Connecteds( this, flags );
|
||||
}
|
||||
AutoSegments AutoSegment::getConnecteds ( Flags flags )
|
||||
{ return AutoSegments_Connecteds( this, flags ); }
|
||||
|
||||
|
||||
AutoSegments AutoSegment::getPerpandiculars ()
|
||||
{ return AutoSegments_Perpandiculars( this ); }
|
||||
AutoSegments AutoSegment::getPerpandiculars ( Flags flags )
|
||||
{ return AutoSegments_Perpandiculars( this, flags ); }
|
||||
|
||||
|
||||
bool AutoSegment::checkDepthSpin () const
|
||||
|
@ -689,7 +766,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoSegment::setFlagsOnAligneds ( unsigned int flags )
|
||||
void AutoSegment::setFlagsOnAligneds ( uint64_t flags )
|
||||
{
|
||||
setFlags( flags );
|
||||
if (not isNotAligned()) {
|
||||
|
@ -769,7 +846,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::toConstraintAxis ( unsigned int flags )
|
||||
bool AutoSegment::toConstraintAxis ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "toConstraintAxis() " << this << endl;
|
||||
|
||||
|
@ -807,7 +884,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::toOptimalAxis ( unsigned int flags )
|
||||
bool AutoSegment::toOptimalAxis ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "toOptimalAxis() " << this << endl;
|
||||
|
||||
|
@ -822,14 +899,14 @@ namespace Anabatic {
|
|||
DbU::Unit optimalMax = min( max(getOptimalMax(),constraintMin), constraintMax );
|
||||
|
||||
cdebug_log(149,0) << "optimal:[" << DbU::getValueString(optimalMin)
|
||||
<< " " << DbU::getValueString(optimalMin) << "]" << endl;
|
||||
<< " " << DbU::getValueString(optimalMax) << "]" << endl;
|
||||
|
||||
if (getAxis() < optimalMin) {
|
||||
setAxis( optimalMin, flags );
|
||||
cdebug_tabw(149,-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
if (getAxis() > optimalMax) {
|
||||
setAxis( optimalMax, flags );
|
||||
cdebug_tabw(149,-1);
|
||||
|
@ -838,12 +915,14 @@ namespace Anabatic {
|
|||
|
||||
if (flags & Flags::Realignate) setAxis( getAxis(), flags );
|
||||
|
||||
//setAxis( optimalMin, flags );
|
||||
|
||||
cdebug_tabw(149,-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void AutoSegment::setAxis ( DbU::Unit axis, unsigned int flags )
|
||||
void AutoSegment::setAxis ( DbU::Unit axis, Flags flags )
|
||||
{
|
||||
if (not isCanonical()) return;
|
||||
|
||||
|
@ -886,7 +965,7 @@ namespace Anabatic {
|
|||
if (not source->isTerminal())
|
||||
source->setFlags( CntWeakTerminal );
|
||||
} else {
|
||||
unsigned int terminalFlag = 0;
|
||||
uint64_t terminalFlag = 0;
|
||||
switch ( _getFlags() & SegWeakTerminal ) {
|
||||
case 0: break;
|
||||
case SegSourceTerminal|SegTargetTerminal:
|
||||
|
@ -916,21 +995,52 @@ namespace Anabatic {
|
|||
{
|
||||
cdebug_log(145,1) << "computeOptimal() - " << this << endl;
|
||||
|
||||
DbU::Unit optimalMin;
|
||||
DbU::Unit optimalMax;
|
||||
DbU::Unit constraintMin;
|
||||
DbU::Unit constraintMax;
|
||||
DbU::Unit optimalMin;
|
||||
DbU::Unit optimalMax;
|
||||
DbU::Unit constraintMin;
|
||||
DbU::Unit constraintMax;
|
||||
vector<AutoSegment*> aligneds;
|
||||
SideStack sideStack ( (isHorizontal() ? Flags::Horizontal : Flags::Vertical), getPitch() );
|
||||
|
||||
getConstraints( constraintMin, constraintMax );
|
||||
cdebug_log(145,0) << "Constraints: [" << DbU::getValueString(constraintMin)
|
||||
<< " " << DbU::getValueString(constraintMax) << "]" << endl;
|
||||
|
||||
if (isUserDefined()) {
|
||||
optimalMin = optimalMax = getAxis();
|
||||
aligneds.push_back( this );
|
||||
} else {
|
||||
DbU::Unit minGCell = getOrigin();
|
||||
DbU::Unit maxGCell = getExtremity();
|
||||
DbU::Unit terminalMin;
|
||||
DbU::Unit terminalMax;
|
||||
AttractorsMap attractors;
|
||||
|
||||
Flags flags = (isAnalog() ? Flags::WithDoglegs : Flags::NoFlags);
|
||||
|
||||
getAligneds( Flags::WithSelf|flags ).fill( aligneds );
|
||||
|
||||
if (getGCell()->isMatrix()) {
|
||||
sideStack.addGCell( getGCell() );
|
||||
} else {
|
||||
vector<GCell*> gcells;
|
||||
|
||||
cdebug_log(145,0) << "Using pitch for L/T shrink:" << DbU::getValueString(getPitch()) << endl;
|
||||
for ( AutoSegment* aligned : aligneds ) {
|
||||
aligned->getGCells( gcells );
|
||||
for ( GCell* gcell : gcells ) {
|
||||
sideStack.addGCell( gcell );
|
||||
cdebug_log(145,0) << "| gcellSide:" << sideStack.getGSide() << " (from " << gcell << ")" << endl;
|
||||
}
|
||||
if (aligned->isStrongTerminal()) {
|
||||
Interval terminalConstraints;
|
||||
aligned->getConstraints( terminalConstraints );
|
||||
sideStack.restrictGSide( terminalConstraints );
|
||||
cdebug_log(145,0) << "| gcellSide:" << sideStack.getGSide() << " (from " << aligned << ")" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
sideStack.show();
|
||||
|
||||
cdebug_log(145,0) << "GCell interval " << sideStack.getGSide() << endl;
|
||||
|
||||
AutoContact* anchor = getAutoSource();
|
||||
if (anchor->isTerminal()) {
|
||||
|
@ -964,78 +1074,101 @@ namespace Anabatic {
|
|||
attractors.addAttractor( terminalMax );
|
||||
}
|
||||
|
||||
forEach( AutoSegment*, autoSegment, getPerpandiculars() ) {
|
||||
cdebug_log(145,1) << "| Perpandicular " << *autoSegment << endl;
|
||||
for ( AutoSegment* autoSegment : getPerpandiculars(flags) ) {
|
||||
cdebug_log(145,1) << "| Perpandicular " << autoSegment << endl;
|
||||
if (autoSegment->isGlobal()) {
|
||||
// Sloppy implentation.
|
||||
DbU::Unit perpandMin = autoSegment->getSourceU();
|
||||
DbU::Unit perpandMax = autoSegment->getTargetU();
|
||||
cdebug_log(145,0) << "Used as global." << endl;
|
||||
|
||||
if (perpandMin < minGCell) attractors.addAttractor( minGCell );
|
||||
if (perpandMax > maxGCell) attractors.addAttractor( maxGCell );
|
||||
} else if (autoSegment->isLongLocal()) {
|
||||
cdebug_log(145,0) << "| Used as long global attractor." << endl;
|
||||
const Interval& side = sideStack.getSideAt( autoSegment->getAxis() );
|
||||
cdebug_log(145,0) << "Side @" << DbU::getValueString(autoSegment->getAxis())
|
||||
<< " " << side << endl;
|
||||
|
||||
DbU::Unit perpandMin = autoSegment->getSourceU();
|
||||
DbU::Unit perpandMax = autoSegment->getTargetU();
|
||||
if (autoSegment->getSourceU() < side.getVMin()) attractors.addAttractor( sideStack.getGSideMin() );
|
||||
if (autoSegment->getTargetU() > side.getVMax()) attractors.addAttractor( sideStack.getGSideMax() );
|
||||
|
||||
if (perpandMin != perpandMax) {
|
||||
if (perpandMin == getAxis()) attractors.addAttractor( perpandMax );
|
||||
if (perpandMax == getAxis()) attractors.addAttractor( perpandMin );
|
||||
}
|
||||
// // Sloppy implentation.
|
||||
// DbU::Unit perpandMin = autoSegment->getSourceU();
|
||||
// DbU::Unit perpandMax = autoSegment->getTargetU();
|
||||
|
||||
// if (perpandMin < minGCell) attractors.addAttractor( minGCell );
|
||||
// if (perpandMax > maxGCell) attractors.addAttractor( maxGCell );
|
||||
} else if (autoSegment->isLocal()) {
|
||||
if (not autoSegment->isStrongTerminal()) { cdebug_tabw(145,-1); continue; }
|
||||
if (autoSegment->isStrongTerminal()) {
|
||||
cdebug_log(145,0) << "Used as strong terminal." << endl;
|
||||
|
||||
DbU::Unit terminalMin;
|
||||
DbU::Unit terminalMax;
|
||||
|
||||
DbU::Unit terminalMin;
|
||||
DbU::Unit terminalMax;
|
||||
|
||||
if (getTerminalInterval( *autoSegment
|
||||
, NULL
|
||||
, isHorizontal()
|
||||
, terminalMin
|
||||
, terminalMax )) {
|
||||
attractors.addAttractor( terminalMin );
|
||||
if (terminalMin != terminalMax)
|
||||
attractors.addAttractor( terminalMax );
|
||||
if (getTerminalInterval( autoSegment
|
||||
, NULL
|
||||
, isHorizontal()
|
||||
, terminalMin
|
||||
, terminalMax )) {
|
||||
attractors.addAttractor( terminalMin );
|
||||
if (terminalMin != terminalMax)
|
||||
attractors.addAttractor( terminalMax );
|
||||
}
|
||||
} else if (autoSegment->isLongLocal() or (autoSegment->getLength() > getPPitch()*20)) {
|
||||
cdebug_log(145,0) << "Used as long global attractor." << endl;
|
||||
|
||||
DbU::Unit perpandMin = autoSegment->getSourceU();
|
||||
DbU::Unit perpandMax = autoSegment->getTargetU();
|
||||
|
||||
if (perpandMin != perpandMax) {
|
||||
if (perpandMin == getAxis()) attractors.addAttractor( perpandMax );
|
||||
if (perpandMax == getAxis()) attractors.addAttractor( perpandMin );
|
||||
}
|
||||
}
|
||||
}
|
||||
cdebug_tabw(145,-1);
|
||||
}
|
||||
|
||||
if (attractors.getAttractorsCount()) {
|
||||
cdebug_log(145,0) << "Lower Median " << DbU::getValueString(attractors.getLowerMedian()) << endl;
|
||||
cdebug_log(145,0) << "Upper Median " << DbU::getValueString(attractors.getUpperMedian()) << endl;
|
||||
|
||||
optimalMin = attractors.getLowerMedian();
|
||||
optimalMax = attractors.getUpperMedian();
|
||||
} else {
|
||||
cdebug_log(145,0) << "No attractors, reverting to GCell bounding box" << endl;
|
||||
|
||||
optimalMin = 0;
|
||||
optimalMax = (isHorizontal()) ? _gcell->getBoundingBox().getYMax()
|
||||
: _gcell->getBoundingBox().getXMax();
|
||||
}
|
||||
|
||||
setInBound( sideStack.getGSideMin(), sideStack.getGSideMax(), optimalMin );
|
||||
setInBound( sideStack.getGSideMin(), sideStack.getGSideMax(), optimalMax );
|
||||
|
||||
cdebug_log(145,0) << "optimalMin: " << DbU::getValueString(optimalMin) << endl;
|
||||
cdebug_log(145,0) << "optimalMax: " << DbU::getValueString(optimalMax) << endl;
|
||||
}
|
||||
|
||||
setInBound( constraintMin, constraintMax, optimalMin );
|
||||
setInBound( constraintMin, constraintMax, optimalMax );
|
||||
|
||||
cdebug_log(145,0) << "Applying constraint on: " << this << endl;
|
||||
setOptimalMin( optimalMin );
|
||||
setOptimalMax( optimalMax );
|
||||
processeds.insert( this );
|
||||
if (not isNotAligned()) {
|
||||
for ( AutoSegment* autoSegment : getAligneds() ) {
|
||||
cdebug_log(145,0) << "Applying constraint on: " << autoSegment << endl;
|
||||
autoSegment->setOptimalMin( optimalMin );
|
||||
autoSegment->setOptimalMax( optimalMax );
|
||||
processeds.insert( autoSegment );
|
||||
}
|
||||
for ( AutoSegment* aligned : aligneds ) {
|
||||
cdebug_log(145,0) << "Applying constraint on: " << aligned << endl;
|
||||
aligned->setOptimalMin( optimalMin );
|
||||
aligned->setOptimalMax( optimalMax );
|
||||
processeds.insert( aligned );
|
||||
}
|
||||
|
||||
// cdebug_log(145,0) << "Applying constraint on: " << this << endl;
|
||||
// setOptimalMin( optimalMin );
|
||||
// setOptimalMax( optimalMax );
|
||||
// processeds.insert( this );
|
||||
// if (not isNotAligned()) {
|
||||
// for ( AutoSegment* autoSegment : getAligneds() ) {
|
||||
// cdebug_log(145,0) << "Applying constraint on: " << autoSegment << endl;
|
||||
// autoSegment->setOptimalMin( optimalMin );
|
||||
// autoSegment->setOptimalMax( optimalMax );
|
||||
// processeds.insert( autoSegment );
|
||||
// }
|
||||
// }
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
}
|
||||
|
||||
|
||||
AutoSegment* AutoSegment::canonize ( unsigned int flags )
|
||||
AutoSegment* AutoSegment::canonize ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,0) << "canonize() - " << this << endl;
|
||||
|
||||
|
@ -1128,10 +1261,10 @@ namespace Anabatic {
|
|||
|
||||
getAlignedContacts( contacts );
|
||||
|
||||
DbU::Unit spanMin = DbU::Min;
|
||||
DbU::Unit spanMax = DbU::Max;
|
||||
Interval constraints;
|
||||
unsigned int direction = getDirection();
|
||||
DbU::Unit spanMin = DbU::Min;
|
||||
DbU::Unit spanMax = DbU::Max;
|
||||
Interval constraints;
|
||||
Flags direction = getDirection();
|
||||
|
||||
for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) {
|
||||
constraints = icontact->first->getUConstraints( direction );
|
||||
|
@ -1278,7 +1411,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoSegment::changeDepth ( unsigned int depth, unsigned int flags )
|
||||
void AutoSegment::changeDepth ( unsigned int depth, Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "changeDepth() " << depth << " - " << this << endl;
|
||||
Session::invalidate( getNet() );
|
||||
|
@ -1295,7 +1428,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
void AutoSegment::_changeDepth ( unsigned int depth, unsigned int flags )
|
||||
void AutoSegment::_changeDepth ( unsigned int depth, Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "_changeDepth() - " << this << endl;
|
||||
|
||||
|
@ -1346,7 +1479,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::canSlacken ( unsigned int flags ) const
|
||||
bool AutoSegment::canSlacken ( Flags flags ) const
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::canSlacken()" << endl;
|
||||
|
||||
|
@ -1363,7 +1496,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::slacken ( unsigned int flags )
|
||||
bool AutoSegment::slacken ( Flags flags )
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
|
@ -1379,7 +1512,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
float AutoSegment::getMaxUnderDensity ( unsigned int flags )
|
||||
float AutoSegment::getMaxUnderDensity ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::getMaxUnderDensity() " << endl;
|
||||
|
||||
|
@ -1407,7 +1540,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::canPivotUp ( float reserve, unsigned int flags ) const
|
||||
bool AutoSegment::canPivotUp ( float reserve, Flags flags ) const
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::canPivotUp() - " << flags
|
||||
<< " (reserve:" << reserve << ")" << endl;
|
||||
|
@ -1456,7 +1589,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::canPivotDown ( float reserve, unsigned int flags ) const
|
||||
bool AutoSegment::canPivotDown ( float reserve, Flags flags ) const
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::canPivotDown()"
|
||||
<< " (reserve:" << reserve << ")" << endl;
|
||||
|
@ -1503,7 +1636,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::canMoveUp ( float reserve, unsigned int flags ) const
|
||||
bool AutoSegment::canMoveUp ( float reserve, Flags flags ) const
|
||||
{
|
||||
cdebug_log(159,0) << "AutoSegment::canMoveUp() " << flags
|
||||
<< " (reserve:" << reserve << ") " << this << endl;
|
||||
|
@ -1601,7 +1734,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::moveUp ( unsigned int flags )
|
||||
bool AutoSegment::moveUp ( Flags flags )
|
||||
{
|
||||
//if ( not canMoveUp(0.0,flags) ) return false;
|
||||
changeDepth( Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2, flags&Flags::Propagate );
|
||||
|
@ -1610,7 +1743,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::moveDown ( unsigned int flags )
|
||||
bool AutoSegment::moveDown ( Flags flags )
|
||||
{
|
||||
//if ( not canPivotDown(0.0,flags) ) return false;
|
||||
changeDepth( Session::getRoutingGauge()->getLayerDepth(getLayer()) - 2, flags&Flags::Propagate );
|
||||
|
@ -1648,7 +1781,7 @@ namespace Anabatic {
|
|||
#if THIS_IS_DISABLED
|
||||
|
||||
|
||||
bool AutoSegment::shearUp ( GCell* upGCell, AutoSegment*& movedUp, float reserve, unsigned int flags )
|
||||
bool AutoSegment::shearUp ( GCell* upGCell, AutoSegment*& movedUp, float reserve, Flags flags )
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::shearUp() " << this << endl;
|
||||
|
||||
|
@ -1719,7 +1852,7 @@ namespace Anabatic {
|
|||
#endif
|
||||
|
||||
|
||||
unsigned int AutoSegment::canDogleg ( Interval interval )
|
||||
Flags AutoSegment::canDogleg ( Interval interval )
|
||||
{
|
||||
cdebug_log(149,0) << "AutoSegment::canDogleg(Interval) " << interval << endl;
|
||||
|
||||
|
@ -1823,12 +1956,12 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
unsigned int AutoSegment::makeDogleg ( Interval interval, unsigned int flags )
|
||||
Flags AutoSegment::makeDogleg ( Interval interval, Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "AutoSegment::makeDogleg(Interval) - " << interval << endl;
|
||||
|
||||
bool leftDogleg = true;
|
||||
unsigned int rflags = 0;
|
||||
Flags rflags = Flags::NoFlags;
|
||||
size_t leftDoglegCount = 0;
|
||||
size_t rightDoglegCount = 0;
|
||||
AutoSegment* leftCandidate = NULL;
|
||||
|
@ -1875,9 +2008,9 @@ namespace Anabatic {
|
|||
|
||||
cdebug_log(149,0) << "Break @" << DbU::getValueString(axis) << " " << leftCandidate << endl;
|
||||
|
||||
unsigned int direction = getDirection();
|
||||
GCell* gcell = leftCandidate->getAutoSource()->getGCell();
|
||||
GCell* end = leftCandidate->getAutoTarget()->getGCell();
|
||||
Flags direction = getDirection();
|
||||
GCell* gcell = leftCandidate->getAutoSource()->getGCell();
|
||||
GCell* end = leftCandidate->getAutoTarget()->getGCell();
|
||||
while ( gcell != end ) {
|
||||
if (gcell->getSide(direction).contains(axis)) break;
|
||||
gcell = (direction == Flags::Horizontal) ? gcell->getEast (getNativeMin())
|
||||
|
@ -1899,13 +2032,13 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
unsigned int AutoSegment::makeDogleg ( GCell* doglegGCell, unsigned int flags )
|
||||
Flags AutoSegment::makeDogleg ( GCell* doglegGCell, Flags flags )
|
||||
{
|
||||
cdebug_log(9000,0) << "Deter| AutoSegment::makeDogleg(GCell*) " << doglegGCell << endl;
|
||||
cdebug_log(9000,0) << "Deter| in " << this << endl;
|
||||
cdebug_tabw(149,1);
|
||||
|
||||
unsigned int rflags = 0;
|
||||
Flags rflags = Flags::NoFlags;
|
||||
|
||||
if ( doglegGCell->isIoPad()
|
||||
and (Session::getAnabatic()->getState() != EngineGlobalLoaded) ) {
|
||||
|
@ -2018,10 +2151,21 @@ namespace Anabatic {
|
|||
, Segment* hurricaneSegment
|
||||
)
|
||||
{
|
||||
static const Layer* horizontalLayer = Session::getRoutingLayer( 1 );
|
||||
static DbU::Unit horizontalWidth = Session::getWireWidth ( 1 );
|
||||
static const Layer* verticalLayer = Session::getRoutingLayer( 2 );
|
||||
static DbU::Unit verticalWidth = Session::getWireWidth ( 2 );
|
||||
const Layer* horizontalLayer = Session::getRoutingLayer( 1 );
|
||||
DbU::Unit horizontalWidth = Session::getWireWidth ( 1 );
|
||||
const Layer* verticalLayer = Session::getRoutingLayer( 2 );
|
||||
DbU::Unit verticalWidth = Session::getWireWidth ( 2 );
|
||||
|
||||
uint32_t wPitch = NetRoutingExtension::getWPitch( source->getNet() );
|
||||
if (wPitch > 1) {
|
||||
horizontalWidth += (wPitch-1) * Session::getPitch(1);
|
||||
verticalWidth += (wPitch-1) * Session::getPitch(2);
|
||||
}
|
||||
cdebug_log(149,0) << "wPitch:" << wPitch << " hW:" << DbU::getValueString(horizontalWidth) << endl;
|
||||
|
||||
if (wPitch > 2) {
|
||||
throw Error( "wPitch %d for \"%s\"", wPitch, getString(source->getNet()->getName()).c_str() );
|
||||
}
|
||||
|
||||
bool reattachSource = false;
|
||||
bool reattachTarget = false;
|
||||
|
@ -2126,14 +2270,16 @@ namespace Anabatic {
|
|||
throw Error( badSegment, getString(source).c_str(), getString(target).c_str() );
|
||||
}
|
||||
|
||||
if (wPitch > 1) segment->setFlags( SegWide );
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
||||
|
||||
AutoSegment* AutoSegment::create ( AutoContact* source
|
||||
, AutoContact* target
|
||||
, unsigned int dir
|
||||
, size_t depth
|
||||
AutoSegment* AutoSegment::create ( AutoContact* source
|
||||
, AutoContact* target
|
||||
, Flags dir
|
||||
, size_t depth
|
||||
)
|
||||
{
|
||||
// Hardcoded: make the assumption that,
|
||||
|
@ -2141,19 +2287,31 @@ namespace Anabatic {
|
|||
// depth=1 is horizontal | METAL2
|
||||
// depth=2 is vertical | METAL3
|
||||
// Should be based on gauge informations.
|
||||
static const Layer* hLayer = Session::getRoutingLayer( 1 );
|
||||
static DbU::Unit hWidth = Session::getWireWidth ( 1 );
|
||||
static const Layer* vLayer = Session::getRoutingLayer( 2 );
|
||||
static DbU::Unit vWidth = Session::getWireWidth ( 2 );
|
||||
const Layer* hLayer = Session::getRoutingLayer( 1 );
|
||||
DbU::Unit hWidth = Session::getWireWidth ( 1 );
|
||||
const Layer* vLayer = Session::getRoutingLayer( 2 );
|
||||
DbU::Unit vWidth = Session::getWireWidth ( 2 );
|
||||
|
||||
const Layer* horizontalLayer = hLayer;
|
||||
DbU::Unit horizontalWidth = hWidth;
|
||||
const Layer* verticalLayer = vLayer;
|
||||
DbU::Unit verticalWidth = vWidth;
|
||||
|
||||
uint32_t wPitch = NetRoutingExtension::getWPitch( source->getNet() );
|
||||
if (wPitch > 1) {
|
||||
horizontalWidth = (wPitch-1) * Session::getPitch(1) + hWidth;
|
||||
verticalWidth = (wPitch-1) * Session::getPitch(2) + vWidth;
|
||||
}
|
||||
|
||||
if (depth != RoutingGauge::nlayerdepth) {
|
||||
horizontalLayer = verticalLayer = Session::getRoutingLayer( depth );
|
||||
horizontalWidth = verticalWidth = Session::getWireWidth ( depth );
|
||||
|
||||
if (wPitch > 1) {
|
||||
horizontalWidth = verticalWidth = (wPitch-1) * Session::getPitch (depth)
|
||||
+ Session::getWireWidth(depth);
|
||||
} else {
|
||||
horizontalWidth = verticalWidth = Session::getWireWidth( depth );
|
||||
}
|
||||
}
|
||||
|
||||
AutoSegment* segment;
|
||||
|
@ -2202,6 +2360,8 @@ namespace Anabatic {
|
|||
} else
|
||||
throw Error( badSegment, getString(source).c_str(), getString(target).c_str() );
|
||||
|
||||
if (wPitch > 1) segment->setFlags( SegWide );
|
||||
|
||||
return segment;
|
||||
}
|
||||
|
||||
|
@ -2213,7 +2373,28 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoSegment::isTopologicalBound ( AutoSegment* seed, unsigned int flags )
|
||||
AutoSegment* AutoSegment::getGlobalThroughDogleg ( AutoSegment* dogleg, AutoContact* from )
|
||||
{
|
||||
AutoContact* source = dogleg->getAutoSource();
|
||||
AutoContact* target = dogleg->getAutoTarget();
|
||||
if (not source->isTurn() or not target->isTurn()) return NULL;
|
||||
|
||||
AutoSegment* fromSegment = (source == from) ? source->getPerpandicular(dogleg) : target->getPerpandicular(dogleg);
|
||||
AutoSegment* toSegment = (source != from) ? source->getPerpandicular(dogleg) : target->getPerpandicular(dogleg);
|
||||
|
||||
if (not toSegment->isGlobal() or (toSegment->getLayer() != fromSegment->getLayer())) return NULL;
|
||||
|
||||
Interval fromConstraints;
|
||||
Interval toConstraints;
|
||||
fromSegment->getConstraints( fromConstraints );
|
||||
toSegment ->getConstraints( toConstraints );
|
||||
if (not fromConstraints.intersect(toConstraints)) return NULL;
|
||||
|
||||
return toSegment;
|
||||
}
|
||||
|
||||
|
||||
bool AutoSegment::isTopologicalBound ( AutoSegment* seed, Flags flags )
|
||||
{
|
||||
cdebug_log(145,1) << "isTopologicalBound() - " << seed << endl;
|
||||
|
||||
|
@ -2270,7 +2451,7 @@ namespace Anabatic {
|
|||
continue;
|
||||
}
|
||||
|
||||
if (autoSegment->isHorizontal() xor (flags & Flags::Horizontal)) continue;
|
||||
if (autoSegment->isHorizontal() xor (bool)(flags & Flags::Horizontal)) continue;
|
||||
|
||||
cdebug_log(145,0) << "| " << autoSegment << endl;
|
||||
|
||||
|
@ -2288,13 +2469,13 @@ namespace Anabatic {
|
|||
|
||||
|
||||
#if THIS_IS_DISABLED
|
||||
unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, bool isHorizontalMaster
|
||||
, const Layer* masterLayer )
|
||||
Flags AutoSegment::getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, bool isHorizontalMaster
|
||||
, const Layer* masterLayer )
|
||||
{
|
||||
unsigned int state = 0;
|
||||
Flags state = Flags::NoFlags;
|
||||
|
||||
bool sourcePerpandicular = arePerpandiculars ( isHorizontalMaster, source );
|
||||
bool currentPerpandicular = arePerpandiculars ( isHorizontalMaster, current );
|
||||
|
|
|
@ -20,6 +20,36 @@
|
|||
#include "anabatic/AutoSegment.h"
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
using namespace Anabatic;
|
||||
|
||||
|
||||
AutoContact* isLocalDogleg ( AutoSegment* current, AutoContact* from, AutoSegment* master )
|
||||
{
|
||||
if (not current->isLocal() or not from->isTurn()) return NULL;
|
||||
|
||||
AutoContact* to = current->getOppositeAnchor( from );
|
||||
if (not to->isTurn()) return NULL;
|
||||
|
||||
AutoSegment* targetGlobal = to->getPerpandicular( current );
|
||||
if (not targetGlobal->isGlobal() or (master->getLayer() != targetGlobal->getLayer())) return NULL;
|
||||
|
||||
cdebug_log(144,0) << "Global aligned though dogleg:" << targetGlobal << endl;
|
||||
|
||||
Interval masterConstraints;
|
||||
Interval targetConstraints;
|
||||
master ->getConstraints( masterConstraints );
|
||||
targetGlobal->getConstraints( targetConstraints );
|
||||
if (not targetConstraints.intersect(masterConstraints)) return NULL;
|
||||
|
||||
return to;
|
||||
}
|
||||
|
||||
|
||||
} // Anonymous namespace.
|
||||
|
||||
|
||||
namespace Anabatic {
|
||||
|
||||
using namespace std;
|
||||
|
@ -36,7 +66,7 @@ namespace Anabatic {
|
|||
|
||||
void AutoSegmentStack::push ( AutoContact* contact, AutoSegment* segment )
|
||||
{
|
||||
cdebug_log(145,0) << "Stacking " << contact << " + " << segment << endl;
|
||||
cdebug_log(144,0) << "Stacking " << contact << " + " << segment << endl;
|
||||
push_back( make_pair(contact,segment) );
|
||||
}
|
||||
|
||||
|
@ -196,7 +226,7 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "AutoSegments_Connecteds".
|
||||
|
||||
AutoSegments_Connecteds::Locator::Locator ( AutoSegment* segment, unsigned int flags )
|
||||
AutoSegments_Connecteds::Locator::Locator ( AutoSegment* segment, Flags flags )
|
||||
: AutoSegmentHL()
|
||||
, _stack ()
|
||||
{
|
||||
|
@ -292,22 +322,30 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "AutoSegments_Aligneds".
|
||||
|
||||
AutoSegments_Aligneds::Locator::Locator ( AutoSegment* segment, unsigned int flags )
|
||||
AutoSegments_Aligneds::Locator::Locator ( AutoSegment* segment, Flags flags )
|
||||
: AutoSegmentHL()
|
||||
, _flags (flags)
|
||||
, _master(segment)
|
||||
, _stack ()
|
||||
{
|
||||
if (not _master) return;
|
||||
if (not _flags.intersect(Flags::Source|Flags::Target))
|
||||
_flags |= Flags::Source | Flags::Target;
|
||||
|
||||
_flags |= (_master->isHorizontal()) ? Flags::Horizontal : Flags::Vertical;
|
||||
if (_flags & Flags::WithDoglegs) _flags |= Flags::WithPerpands;
|
||||
|
||||
cdebug_log(145,0) << "AutoSegments_Aligneds::Locator::Locator() - _flags:" << _flags << endl;
|
||||
cdebug_log(144,0) << "AutoSegments_Aligneds::Locator::Locator() _flags:" << _flags.asString(FlagsFunction) << endl;
|
||||
|
||||
AutoContact* contact = segment->getAutoSource();
|
||||
if (contact) _stack.push( contact, segment );
|
||||
if (_flags & Flags::Source) {
|
||||
AutoContact* contact = segment->getAutoSource();
|
||||
if (contact) _stack.push( contact, segment );
|
||||
}
|
||||
|
||||
contact = segment->getAutoTarget();
|
||||
if (contact) _stack.push( contact, segment );
|
||||
if (_flags & Flags::Target) {
|
||||
AutoContact* contact = segment->getAutoTarget();
|
||||
if (contact) _stack.push( contact, segment );
|
||||
}
|
||||
|
||||
if (not (_flags & Flags::WithSelf)) progress();
|
||||
}
|
||||
|
@ -323,36 +361,52 @@ namespace Anabatic {
|
|||
|
||||
void AutoSegments_Aligneds::Locator::progress ()
|
||||
{
|
||||
cdebug_log(145,0) << "AutoSegments_Aligneds::Locator::progress()" << endl;
|
||||
cdebug_log(144,0) << "AutoSegments_Aligneds::Locator::progress()" << endl;
|
||||
|
||||
while (not _stack.isEmpty()) {
|
||||
AutoContact* sourceContact = _stack.getAutoContact ();
|
||||
AutoSegment* sourceSegment = _stack.getAutoSegment ();
|
||||
|
||||
_stack.pop ();
|
||||
cdebug_log(144,1) << "Iterate over: " << sourceContact << endl;
|
||||
|
||||
LocatorHelper helper (sourceContact, _flags);
|
||||
for ( ; helper.isValid() ; helper.progress() ) {
|
||||
AutoSegment* currentSegment = helper.getSegment();
|
||||
cdebug_log(145,0) << "Looking at: " << currentSegment << endl;
|
||||
cdebug_log(144,0) << "| " << currentSegment << endl;
|
||||
|
||||
if (currentSegment == sourceSegment) continue;
|
||||
|
||||
if ( (not (_flags & Flags::NoCheckLayer))
|
||||
and AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) {
|
||||
cerr << Error("Aligned segments not in same layer (aligneds locator)\n"
|
||||
" %s\n"
|
||||
" %s."
|
||||
,getString(_master).c_str()
|
||||
,getString(currentSegment).c_str()) << endl;
|
||||
continue;
|
||||
}
|
||||
if (AutoSegment::areAligneds(currentSegment,_master)) {
|
||||
if ( (not (_flags & Flags::NoCheckLayer))
|
||||
and AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) {
|
||||
cerr << Error( "Aligned segments not in same layer (aligneds locator)\n"
|
||||
" %s\n"
|
||||
" %s."
|
||||
,getString(_master).c_str()
|
||||
,getString(currentSegment).c_str() ) << endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact );
|
||||
if (targetContact) _stack.push( targetContact, currentSegment );
|
||||
AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact );
|
||||
if (targetContact) _stack.push( targetContact, currentSegment );
|
||||
} else {
|
||||
if (_flags & Flags::WithDoglegs) {
|
||||
AutoContact* targetContact = isLocalDogleg( currentSegment, sourceContact, _master );
|
||||
|
||||
if (targetContact) {
|
||||
cdebug_log(144,0) << "Stacking dogleg global. " << endl;
|
||||
_stack.push( targetContact, currentSegment );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cdebug_tabw(144,-1);
|
||||
|
||||
if (_stack.getAutoSegment() == _master) continue;
|
||||
if (not AutoSegment::areAligneds(_stack.getAutoSegment(),_master)) continue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -389,15 +443,16 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "AutoSegments_Perpandiculars".
|
||||
|
||||
AutoSegments_Perpandiculars::Locator::Locator ( AutoSegment* master )
|
||||
AutoSegments_Perpandiculars::Locator::Locator ( AutoSegment* master, Flags flags )
|
||||
: AutoSegmentHL()
|
||||
, _flags (Flags::WithPerpands)
|
||||
//, _flags (Flags::WithPerpands|Flags::WithDoglegs)
|
||||
, _flags (Flags::WithPerpands|flags)
|
||||
, _master (master)
|
||||
, _stack ()
|
||||
, _perpandiculars()
|
||||
{
|
||||
cdebug_log(145,0) << "AutoSegments_Perpandiculars::Locator::Locator()" << endl;
|
||||
cdebug_log(145,0) << " " << _master << endl;
|
||||
cdebug_log(144,0) << "AutoSegments_Perpandiculars::Locator::Locator(): _flags:" << _flags.asString(FlagsFunction) << endl;
|
||||
cdebug_log(144,0) << " " << _master << endl;
|
||||
|
||||
if (not _master) return;
|
||||
if (_master->isHorizontal()) _flags |= Flags::Horizontal;
|
||||
|
@ -422,41 +477,71 @@ namespace Anabatic {
|
|||
|
||||
void AutoSegments_Perpandiculars::Locator::progress ()
|
||||
{
|
||||
cdebug_log(145,0) << "AutoSegments_Perpandiculars::Locator::progress()" << endl;
|
||||
cdebug_log(144,1) << "AutoSegments_Perpandiculars::Locator::progress()" << endl;
|
||||
|
||||
if (not _perpandiculars.empty()) _perpandiculars.pop_back();
|
||||
if (not _perpandiculars.empty()) return;
|
||||
if (not _perpandiculars.empty()) { cdebug_tabw(144,-1); return; }
|
||||
|
||||
while ( not _stack.isEmpty() ) {
|
||||
AutoContact* sourceContact = _stack.getAutoContact();
|
||||
AutoSegment* sourceSegment = _stack.getAutoSegment();
|
||||
|
||||
_stack.pop();
|
||||
cdebug_log(144,0) << "Iterate over: " << sourceContact << endl;
|
||||
|
||||
LocatorHelper helper (sourceContact, _flags);
|
||||
for ( ; helper.isValid() ; helper.progress() ) {
|
||||
AutoSegment* currentSegment = helper.getSegment();
|
||||
if (currentSegment == sourceSegment) continue;
|
||||
|
||||
if (AutoSegment::areAligneds(currentSegment,_master)) {
|
||||
AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact );
|
||||
if (targetContact) {
|
||||
if ( (_master->isHorizontal() and sourceContact->isHTee())
|
||||
or (_master->isVertical () and sourceContact->isVTee()) ) {
|
||||
if (AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) {
|
||||
cerr << Error("Aligned segments not in same layer (perpandicular locator)\n"
|
||||
" %s\n"
|
||||
" %s."
|
||||
,getString(_master).c_str()
|
||||
,getString(currentSegment).c_str()) << endl;
|
||||
continue;
|
||||
}
|
||||
cdebug_log(144,0) << "| " << currentSegment << endl;
|
||||
|
||||
cdebug_log(145,0) << "Stacking target. " << endl;
|
||||
_stack.push( targetContact, currentSegment );
|
||||
if (AutoSegment::areAligneds(currentSegment,_master)) {
|
||||
AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact );
|
||||
|
||||
if (targetContact) {
|
||||
if (_master->getLayer() != currentSegment->getLayer()) {
|
||||
continue;
|
||||
}
|
||||
cdebug_log(144,0) << "Stacking target. " << endl;
|
||||
_stack.push( targetContact, currentSegment );
|
||||
|
||||
// if ( (_master->isHorizontal() and sourceContact->isHTee())
|
||||
// or (_master->isVertical () and sourceContact->isVTee()) ) {
|
||||
// if (AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) {
|
||||
// cerr << Error("Aligned segments not in same layer (perpandicular locator)\n"
|
||||
// " %s\n"
|
||||
// " %s."
|
||||
// ,getString(_master).c_str()
|
||||
// ,getString(currentSegment).c_str()) << endl;
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// cdebug_log(144,0) << "Stacking target. " << endl;
|
||||
// _stack.push( targetContact, currentSegment );
|
||||
// }
|
||||
} else {
|
||||
cdebug_log(144,0) << "No opposite anchor to: " << sourceContact << endl;
|
||||
}
|
||||
} else {
|
||||
if ( (_flags & Flags::WithDoglegs) and currentSegment->isLocal() and sourceContact->isTurn() ) {
|
||||
AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact );
|
||||
if (targetContact->isTurn()) {
|
||||
AutoSegment* targetGlobal = targetContact->getPerpandicular( currentSegment );
|
||||
if (targetGlobal->isGlobal() and (_master->getLayer() == targetGlobal->getLayer())) {
|
||||
cdebug_log(144,0) << "Global aligned though dogleg:" << targetGlobal << endl;
|
||||
Interval masterConstraints;
|
||||
Interval targetConstraints;
|
||||
_master ->getConstraints( masterConstraints );
|
||||
targetGlobal->getConstraints( targetConstraints );
|
||||
if (targetConstraints.intersect(masterConstraints)) {
|
||||
cdebug_log(144,0) << "Stacking dogleg global. " << endl;
|
||||
_stack.push( targetContact, currentSegment );
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_perpandiculars.push_back( currentSegment );
|
||||
}
|
||||
}
|
||||
|
@ -465,6 +550,8 @@ namespace Anabatic {
|
|||
if (_stack.getAutoSegment() == _master) continue;
|
||||
if (not _perpandiculars.empty()) break;
|
||||
}
|
||||
|
||||
cdebug_tabw(144,-1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -481,7 +568,7 @@ namespace Anabatic {
|
|||
|
||||
|
||||
AutoSegmentHL* AutoSegments_Perpandiculars::getLocator () const
|
||||
{ return new Locator(_segment); }
|
||||
{ return new Locator(_master,_flags); }
|
||||
|
||||
|
||||
string AutoSegments_Perpandiculars::Locator::_getString () const
|
||||
|
@ -494,7 +581,7 @@ namespace Anabatic {
|
|||
string AutoSegments_Perpandiculars::_getString () const
|
||||
{
|
||||
string s = "<" + _TName("AutoSegments_Perpandiculars") + " "
|
||||
+ getString(_segment)
|
||||
+ getString(_master)
|
||||
+ ">";
|
||||
return s;
|
||||
}
|
||||
|
@ -503,7 +590,7 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "AutoSegments_AnchorOnGCell".
|
||||
|
||||
AutoSegments_AnchorOnGCell::Locator::Locator ( GCell* fcell, unsigned int flags )
|
||||
AutoSegments_AnchorOnGCell::Locator::Locator ( GCell* fcell, Flags flags )
|
||||
: AutoSegmentHL()
|
||||
, _flags (flags)
|
||||
, _itContact (fcell->getContacts().begin())
|
||||
|
@ -600,7 +687,7 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::AutoSegments_CachedOnContact".
|
||||
|
||||
AutoSegments_CachedOnContact::Locator::Locator ( AutoContact* sourceContact, unsigned int direction )
|
||||
AutoSegments_CachedOnContact::Locator::Locator ( AutoContact* sourceContact, Flags direction )
|
||||
: AutoSegmentHL()
|
||||
, _helper(new LocatorHelper(sourceContact,direction))
|
||||
{ }
|
||||
|
|
|
@ -115,7 +115,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoVertical::getSourceConstraints ( unsigned int flags ) const
|
||||
Interval AutoVertical::getSourceConstraints ( Flags flags ) const
|
||||
{
|
||||
if (flags & Flags::NativeConstraints) {
|
||||
Box nativeBox ( getAutoSource()->getNativeConstraintBox() );
|
||||
|
@ -125,7 +125,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
Interval AutoVertical::getTargetConstraints ( unsigned int flags ) const
|
||||
Interval AutoVertical::getTargetConstraints ( Flags flags ) const
|
||||
{
|
||||
if (flags & Flags::NativeConstraints) {
|
||||
Box nativeBox ( getAutoTarget()->getNativeConstraintBox() );
|
||||
|
@ -181,7 +181,7 @@ namespace Anabatic {
|
|||
GCell* gcell = getAutoSource()->getGCell();
|
||||
GCell* end = getAutoTarget()->getGCell();
|
||||
|
||||
cdebug_log(149,0) << "xprobe: " << DbU::getValueString(xprobe) << endl;
|
||||
cdebug_log(144,0) << "xprobe: " << DbU::getValueString(xprobe) << endl;
|
||||
|
||||
if (gcell->getYMin() > end->getYMin()) std::swap( gcell, end );
|
||||
if (xprobe == gcell->getConstraintXMax()) xprobe--;
|
||||
|
@ -230,7 +230,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool AutoVertical::_slacken ( unsigned int flags )
|
||||
bool AutoVertical::_slacken ( Flags flags )
|
||||
{
|
||||
cdebug_log(149,1) << "AutoVertical::_slacken() " << this << endl;
|
||||
|
||||
|
@ -328,7 +328,7 @@ namespace Anabatic {
|
|||
|
||||
if (_vertical->getX() == axis) return;
|
||||
|
||||
cdebug_log(149,0) << "_setAxis() @X " << DbU::getValueString(axis) << " " << this << endl;
|
||||
cdebug_log(144,0) << "_setAxis() @X " << DbU::getValueString(axis) << " " << this << endl;
|
||||
|
||||
_vertical->setX( axis );
|
||||
invalidate();
|
||||
|
@ -371,8 +371,8 @@ namespace Anabatic {
|
|||
|
||||
void AutoVertical::updatePositions ()
|
||||
{
|
||||
_sourcePosition = _vertical->getSourceY() - Session::getExtensionCap(getLayer());
|
||||
_targetPosition = _vertical->getTargetY() + Session::getExtensionCap(getLayer());
|
||||
_sourcePosition = _vertical->getSourceY() - getExtensionCap();
|
||||
_targetPosition = _vertical->getTargetY() + getExtensionCap();
|
||||
}
|
||||
|
||||
|
||||
|
@ -392,8 +392,8 @@ namespace Anabatic {
|
|||
bool AutoVertical::checkPositions () const
|
||||
{
|
||||
bool coherency = true;
|
||||
DbU::Unit sourcePosition = _vertical->getSourceY() - Session::getExtensionCap(getLayer());
|
||||
DbU::Unit targetPosition = _vertical->getTargetY() + Session::getExtensionCap(getLayer());
|
||||
DbU::Unit sourcePosition = _vertical->getSourceY() - getExtensionCap();
|
||||
DbU::Unit targetPosition = _vertical->getTargetY() + getExtensionCap();
|
||||
|
||||
if ( _sourcePosition != sourcePosition ) {
|
||||
cerr << Error ( "%s\n Source position incoherency: "
|
||||
|
@ -646,7 +646,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
unsigned int AutoVertical::_makeDogleg ( GCell* doglegGCell, unsigned int flags )
|
||||
Flags AutoVertical::_makeDogleg ( GCell* doglegGCell, Flags flags )
|
||||
{
|
||||
cdebug_log(149,0) << "AutoVertical::_makeDogleg(GCell*)" << endl;
|
||||
|
||||
|
@ -722,6 +722,11 @@ namespace Anabatic {
|
|||
segment2->setFlags( SegWeakTerminal1 );
|
||||
}
|
||||
|
||||
if (isAnalog()) {
|
||||
segment1->setFlags( SegAnalog );
|
||||
segment2->setFlags( SegAnalog );
|
||||
}
|
||||
|
||||
cdebug_log(149,0) << "Session::dogleg[x+1] perpand: " << segment1 << endl;
|
||||
cdebug_log(149,0) << "Session::dogleg[x+2] new paral: " << segment2 << endl;
|
||||
cdebug_log(149,0) << "Session::dogleg[x+0] original: " << this << endl;
|
||||
|
|
|
@ -328,6 +328,8 @@ namespace Anabatic {
|
|||
|
||||
void Configuration::print ( Cell* cell ) const
|
||||
{
|
||||
if (not cmess1.enabled()) return;
|
||||
|
||||
string topLayerName = "UNKOWN";
|
||||
const Layer* topLayer = _rg->getRoutingLayer( _allowedDepth );
|
||||
if (topLayer)
|
||||
|
|
|
@ -14,81 +14,131 @@
|
|||
// +-----------------------------------------------------------------+
|
||||
|
||||
|
||||
#include <string>
|
||||
#include "anabatic/Constants.h"
|
||||
|
||||
|
||||
namespace Anabatic {
|
||||
|
||||
using std::string;
|
||||
using std::ostringstream;
|
||||
using Hurricane::BaseFlags;
|
||||
|
||||
const uint64_t Flags::NoFlags = 0;
|
||||
|
||||
const BaseFlags Flags::NoFlags = 0;
|
||||
// Flags used for both objects states & functions arguments.
|
||||
const uint64_t Flags::Horizontal = (1 << 0);
|
||||
const uint64_t Flags::Vertical = (1 << 1);
|
||||
const uint64_t Flags::Source = (1 << 2);
|
||||
const uint64_t Flags::Target = (1 << 3);
|
||||
const uint64_t Flags::Invalidated = (1 << 4);
|
||||
const BaseFlags Flags::Horizontal = (1L << 0);
|
||||
const BaseFlags Flags::Vertical = (1L << 1);
|
||||
const BaseFlags Flags::Source = (1L << 2);
|
||||
const BaseFlags Flags::Target = (1L << 3);
|
||||
const BaseFlags Flags::Invalidated = (1L << 4);
|
||||
// Flags for GCell objects states only.
|
||||
const uint64_t Flags::DeviceGCell = (1 << 5);
|
||||
const uint64_t Flags::HChannelGCell = (1 << 6);
|
||||
const uint64_t Flags::VChannelGCell = (1 << 7);
|
||||
const uint64_t Flags::StrutGCell = (1 << 8);
|
||||
const uint64_t Flags::MatrixGCell = (1 << 9);
|
||||
const uint64_t Flags::IoPadGCell = (1 << 10);
|
||||
const uint64_t Flags::Saturated = (1 << 11);
|
||||
const BaseFlags Flags::DeviceGCell = (1L << 5);
|
||||
const BaseFlags Flags::HChannelGCell = (1L << 6);
|
||||
const BaseFlags Flags::VChannelGCell = (1L << 7);
|
||||
const BaseFlags Flags::StrutGCell = (1L << 8);
|
||||
const BaseFlags Flags::MatrixGCell = (1L << 9);
|
||||
const BaseFlags Flags::IoPadGCell = (1L << 10);
|
||||
const BaseFlags Flags::Saturated = (1L << 11);
|
||||
// Flags for Anabatic objects states only.
|
||||
const uint64_t Flags::DemoMode = (1 << 5);
|
||||
const uint64_t Flags::WarnOnGCellOverload = (1 << 6);
|
||||
const uint64_t Flags::DestroyGCell = (1 << 7);
|
||||
const uint64_t Flags::DestroyBaseContact = (1 << 8);
|
||||
const uint64_t Flags::DestroyBaseSegment = (1 << 9);
|
||||
const BaseFlags Flags::DemoMode = (1L << 5);
|
||||
const BaseFlags Flags::WarnOnGCellOverload = (1L << 6);
|
||||
const BaseFlags Flags::DestroyGCell = (1L << 7);
|
||||
const BaseFlags Flags::DestroyBaseContact = (1L << 8);
|
||||
const BaseFlags Flags::DestroyBaseSegment = (1L << 9);
|
||||
// Flags for NetDatas objects states only.
|
||||
const uint64_t Flags::GlobalRouted = (1 << 5);
|
||||
const BaseFlags Flags::GlobalRouted = (1L << 5);
|
||||
// Masks.
|
||||
const uint64_t Flags::WestSide = Horizontal|Target;
|
||||
const uint64_t Flags::EastSide = Horizontal|Source;
|
||||
const uint64_t Flags::SouthSide = Vertical |Target;
|
||||
const uint64_t Flags::NorthSide = Vertical |Source;
|
||||
const uint64_t Flags::AllSides = WestSide|EastSide|SouthSide|NorthSide ;
|
||||
const uint64_t Flags::EndsMask = Source|Target;
|
||||
const uint64_t Flags::DirectionMask = Horizontal|Vertical;
|
||||
const uint64_t Flags::DestroyMask = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||
const uint64_t Flags::GCellTypeMask = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||
const BaseFlags Flags::WestSide = Horizontal|Target;
|
||||
const BaseFlags Flags::EastSide = Horizontal|Source;
|
||||
const BaseFlags Flags::SouthSide = Vertical |Target;
|
||||
const BaseFlags Flags::NorthSide = Vertical |Source;
|
||||
const BaseFlags Flags::AllSides = WestSide|EastSide|SouthSide|NorthSide ;
|
||||
const BaseFlags Flags::EndsMask = Source|Target;
|
||||
const BaseFlags Flags::DirectionMask = Horizontal|Vertical;
|
||||
const BaseFlags Flags::DestroyMask = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||
const BaseFlags Flags::GCellTypeMask = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||
// Flags for functions arguments only.
|
||||
const uint64_t Flags::Create = (1 << 5);
|
||||
const uint64_t Flags::WithPerpands = (1 << 6);
|
||||
const uint64_t Flags::WithSelf = (1 << 7);
|
||||
const uint64_t Flags::AboveLayer = (1 << 8);
|
||||
const uint64_t Flags::BelowLayer = (1 << 9);
|
||||
const uint64_t Flags::OpenSession = (1 << 10);
|
||||
const uint64_t Flags::Realignate = (1 << 11);
|
||||
const uint64_t Flags::NativeConstraints = (1 << 12);
|
||||
const uint64_t Flags::ForceMove = (1 << 13);
|
||||
const uint64_t Flags::WarnOnError = (1 << 14);
|
||||
const uint64_t Flags::Topology = (1 << 15);
|
||||
const uint64_t Flags::GlobalSegment = (1 << 16);
|
||||
const uint64_t Flags::AllowTerminal = (1 << 17);
|
||||
const uint64_t Flags::AllowLocal = (1 << 18);
|
||||
const uint64_t Flags::IgnoreContacts = (1 << 19);
|
||||
const uint64_t Flags::Propagate = (1 << 20);
|
||||
const uint64_t Flags::Superior = (1 << 21);
|
||||
const uint64_t Flags::DoglegOnLeft = (1 << 22);
|
||||
const uint64_t Flags::DoglegOnRight = (1 << 23);
|
||||
const uint64_t Flags::WithNeighbors = (1 << 24);
|
||||
const uint64_t Flags::NoCheckLayer = (1 << 25);
|
||||
const uint64_t Flags::HalfSlacken = (1 << 26);
|
||||
const uint64_t Flags::NoGCellShrink = (1 << 27);
|
||||
const uint64_t Flags::CParanoid = (1 << 28);
|
||||
const uint64_t Flags::CheckLowDensity = (1 << 29);
|
||||
const uint64_t Flags::CheckLowUpDensity = (1 << 30);
|
||||
const uint64_t Flags::NoUpdate = (1 << 31);
|
||||
const BaseFlags Flags::Create = (1L << 5);
|
||||
const BaseFlags Flags::WithPerpands = (1L << 6);
|
||||
const BaseFlags Flags::WithDoglegs = (1L << 7);
|
||||
const BaseFlags Flags::WithSelf = (1L << 8);
|
||||
const BaseFlags Flags::AboveLayer = (1L << 9);
|
||||
const BaseFlags Flags::BelowLayer = (1L << 10);
|
||||
const BaseFlags Flags::OpenSession = (1L << 11);
|
||||
const BaseFlags Flags::Realignate = (1L << 12);
|
||||
const BaseFlags Flags::NativeConstraints = (1L << 13);
|
||||
const BaseFlags Flags::ForceMove = (1L << 14);
|
||||
const BaseFlags Flags::WarnOnError = (1L << 15);
|
||||
const BaseFlags Flags::Topology = (1L << 16);
|
||||
const BaseFlags Flags::GlobalSegment = (1L << 17);
|
||||
const BaseFlags Flags::AllowTerminal = (1L << 18);
|
||||
const BaseFlags Flags::AllowLocal = (1L << 19);
|
||||
const BaseFlags Flags::IgnoreContacts = (1L << 20);
|
||||
const BaseFlags Flags::Propagate = (1L << 21);
|
||||
const BaseFlags Flags::Superior = (1L << 22);
|
||||
const BaseFlags Flags::DoglegOnLeft = (1L << 23);
|
||||
const BaseFlags Flags::DoglegOnRight = (1L << 24);
|
||||
const BaseFlags Flags::WithNeighbors = (1L << 25);
|
||||
const BaseFlags Flags::NoCheckLayer = (1L << 26);
|
||||
const BaseFlags Flags::HalfSlacken = (1L << 27);
|
||||
const BaseFlags Flags::NoGCellShrink = (1L << 28);
|
||||
const BaseFlags Flags::CParanoid = (1L << 29);
|
||||
const BaseFlags Flags::CheckLowDensity = (1L << 30);
|
||||
const BaseFlags Flags::CheckLowUpDensity = (1L << 31);
|
||||
const BaseFlags Flags::NoUpdate = (1L << 32);
|
||||
|
||||
|
||||
Flags::~Flags ()
|
||||
{ }
|
||||
|
||||
|
||||
string Flags::asString ( uint32_t mode ) const
|
||||
{
|
||||
ostringstream s;
|
||||
|
||||
s << ((_flags & (uint64_t)Horizontal ) ? "h" : "-");
|
||||
s << ((_flags & (uint64_t)Vertical ) ? "v" : "-");
|
||||
s << ((_flags & (uint64_t)Source ) ? "S" : "-");
|
||||
s << ((_flags & (uint64_t)Target ) ? "T" : "-");
|
||||
s << ((_flags & (uint64_t)Invalidated) ? "i" : "-");
|
||||
|
||||
switch ( mode ) {
|
||||
case FlagsFunction:
|
||||
s << ((_flags & (uint64_t)Create ) ? "C" : "-");
|
||||
s << ((_flags & (uint64_t)WithPerpands ) ? "P" : "-");
|
||||
s << ((_flags & (uint64_t)WithDoglegs ) ? "D" : "-");
|
||||
s << ((_flags & (uint64_t)WithSelf ) ? "s" : "-");
|
||||
s << ((_flags & (uint64_t)AboveLayer ) ? "a" : "-");
|
||||
s << ((_flags & (uint64_t)BelowLayer ) ? "b" : "-");
|
||||
s << ((_flags & (uint64_t)OpenSession ) ? "o" : "-");
|
||||
s << ((_flags & (uint64_t)Realignate ) ? "R" : "-");
|
||||
s << ((_flags & (uint64_t)NativeConstraints) ? "N" : "-");
|
||||
s << ((_flags & (uint64_t)ForceMove ) ? "m" : "-");
|
||||
s << ((_flags & (uint64_t)WarnOnError ) ? "w" : "-");
|
||||
s << ((_flags & (uint64_t)Topology ) ? "t" : "-");
|
||||
s << ((_flags & (uint64_t)GlobalSegment ) ? "G" : "-");
|
||||
s << ((_flags & (uint64_t)AllowTerminal ) ? "t" : "-");
|
||||
s << ((_flags & (uint64_t)AllowLocal ) ? "l" : "-");
|
||||
s << ((_flags & (uint64_t)IgnoreContacts ) ? "i" : "-");
|
||||
s << ((_flags & (uint64_t)Propagate ) ? "p" : "-");
|
||||
s << ((_flags & (uint64_t)Superior ) ? "S" : "-");
|
||||
s << ((_flags & (uint64_t)DoglegOnLeft ) ? "L" : "-");
|
||||
s << ((_flags & (uint64_t)DoglegOnRight ) ? "R" : "-");
|
||||
s << ((_flags & (uint64_t)WithNeighbors ) ? "N" : "-");
|
||||
s << ((_flags & (uint64_t)NoCheckLayer ) ? "L" : "-");
|
||||
s << ((_flags & (uint64_t)HalfSlacken ) ? "h" : "-");
|
||||
s << ((_flags & (uint64_t)NoGCellShrink ) ? "s" : "-");
|
||||
s << ((_flags & (uint64_t)CParanoid ) ? "p" : "-");
|
||||
s << ((_flags & (uint64_t)CheckLowDensity ) ? "l" : "-");
|
||||
s << ((_flags & (uint64_t)CheckLowUpDensity) ? "u" : "-");
|
||||
s << ((_flags & (uint64_t)NoUpdate ) ? "u" : "-");
|
||||
break;
|
||||
}
|
||||
|
||||
s << " (" << value() << ")";
|
||||
return s.str();
|
||||
}
|
||||
|
||||
string Flags::_getTypeName () const
|
||||
{ return "Anabatic::Flags"; }
|
||||
|
||||
|
@ -96,20 +146,20 @@ namespace Anabatic {
|
|||
string Flags::_getString () const
|
||||
{
|
||||
string s = "";
|
||||
s += (_flags & Horizontal ) ? 'h' : '-';
|
||||
s += (_flags & Vertical ) ? 'v' : '-';
|
||||
s += (_flags & Source ) ? 'S' : '-';
|
||||
s += (_flags & Target ) ? 'T' : '-';
|
||||
s += (_flags & DeviceGCell ) ? 'd' : '-';
|
||||
s += (_flags & HChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & VChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & StrutGCell ) ? 's' : '-';
|
||||
s += (_flags & MatrixGCell ) ? 'm' : '-';
|
||||
s += (_flags & (uint64_t)Horizontal ) ? 'h' : '-';
|
||||
s += (_flags & (uint64_t)Vertical ) ? 'v' : '-';
|
||||
s += (_flags & (uint64_t)Source ) ? 'S' : '-';
|
||||
s += (_flags & (uint64_t)Target ) ? 'T' : '-';
|
||||
s += (_flags & (uint64_t)DeviceGCell ) ? 'd' : '-';
|
||||
s += (_flags & (uint64_t)HChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & (uint64_t)VChannelGCell) ? 'c' : '-';
|
||||
s += (_flags & (uint64_t)StrutGCell ) ? 's' : '-';
|
||||
s += (_flags & (uint64_t)MatrixGCell ) ? 'm' : '-';
|
||||
s += ",";
|
||||
s += (_flags & Invalidated ) ? 'i' : '-';
|
||||
s += (_flags & DestroyGCell ) ? 'D' : '-';
|
||||
s += (_flags & AboveLayer ) ? 'A' : '-';
|
||||
s += (_flags & BelowLayer ) ? 'B' : '-';
|
||||
s += (_flags & (uint64_t)Invalidated ) ? 'i' : '-';
|
||||
s += (_flags & (uint64_t)DestroyGCell ) ? 'D' : '-';
|
||||
s += (_flags & (uint64_t)AboveLayer ) ? 'A' : '-';
|
||||
s += (_flags & (uint64_t)BelowLayer ) ? 'B' : '-';
|
||||
|
||||
return s;
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -17,6 +17,8 @@
|
|||
#include <iostream>
|
||||
#include "hurricane/Error.h"
|
||||
#include "hurricane/Segment.h"
|
||||
#include "hurricane/DataBase.h"
|
||||
#include "hurricane/Technology.h"
|
||||
#include "anabatic/Edge.h"
|
||||
#include "anabatic/GCell.h"
|
||||
#include "anabatic/AnabaticEngine.h"
|
||||
|
@ -88,9 +90,9 @@ namespace Anabatic {
|
|||
Edge* edge = new Edge ( source, target, flags );
|
||||
edge->_postCreate();
|
||||
|
||||
cdebug_log(110,1) << "Edge::create(): " << (void*)edge << ":" << edge << endl;
|
||||
cdebug_log(110,0) << "source:" << (void*)source << ":" << edge->getSource() << endl;
|
||||
cdebug_log(110,0) << "target:" << (void*)target << ":" << edge->getTarget() << endl;
|
||||
cdebug_log(110,1) << "Edge::create(): " << /*(void*)edge << ":" <<*/ edge << endl;
|
||||
cdebug_log(110,0) << "source:" << /*(void*)source << ":" <<*/ edge->getSource() << endl;
|
||||
cdebug_log(110,0) << "target:" << /*(void*)target << ":" <<*/ edge->getTarget() << endl;
|
||||
cdebug_tabw(110,-1);
|
||||
return edge;
|
||||
}
|
||||
|
@ -182,6 +184,10 @@ namespace Anabatic {
|
|||
_realOccupancy = occupancy;
|
||||
}
|
||||
|
||||
void Edge::incRealOccupancy2 ( int value )
|
||||
{
|
||||
_realOccupancy += value;
|
||||
}
|
||||
|
||||
Segment* Edge::getSegment ( const Net* owner ) const
|
||||
{
|
||||
|
@ -195,7 +201,13 @@ namespace Anabatic {
|
|||
void Edge::add ( Segment* segment )
|
||||
{
|
||||
_segments.push_back( segment );
|
||||
incRealOccupancy( 1 ); // Need to take the wire width into account.
|
||||
Horizontal* h = dynamic_cast<Horizontal*>(segment);
|
||||
Vertical* v = dynamic_cast<Vertical*>(segment);
|
||||
DbU::Unit pitch = 0;
|
||||
if (h) pitch = Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL2"));
|
||||
if (v) pitch = Session::getPitch(Hurricane::DataBase::getDB()->getTechnology()->getLayer("METAL3"));
|
||||
|
||||
incRealOccupancy( segment->getWidth()/pitch ); // Need to take the wire width into account.
|
||||
}
|
||||
|
||||
|
||||
|
@ -300,6 +312,20 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
bool Edge::isMaxCapacity ( Net* net ) const
|
||||
{
|
||||
if (net){
|
||||
Hurricane::NetRoutingState* state = Hurricane::NetRoutingExtension::get( net );
|
||||
//cerr << "bool Edge::isMaxCapacity ( Net* net ) const: " << net << endl;
|
||||
//cerr << "WPitch: " << state->getWPitch() << endl;
|
||||
|
||||
return ( (_realOccupancy +state->getWPitch()) > _capacity ) ? true : false;
|
||||
} else {
|
||||
return ( _realOccupancy >= _capacity ) ? true : false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Edge::translate ( const DbU::Unit&, const DbU::Unit& )
|
||||
{
|
||||
cerr << Error( "Edge::translate(): On %s,\n"
|
||||
|
|
|
@ -271,12 +271,12 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::GCell".
|
||||
|
||||
Name GCell::_extensionName = "Anabatic::GCell";
|
||||
unsigned int GCell::_displayMode = GCell::Boundary;
|
||||
Name GCell::_extensionName = "Anabatic::GCell";
|
||||
uint32_t GCell::_displayMode = GCell::Boundary;
|
||||
|
||||
|
||||
unsigned int GCell::getDisplayMode () { return _displayMode; }
|
||||
void GCell::setDisplayMode ( unsigned int mode ) { _displayMode = mode; }
|
||||
uint32_t GCell::getDisplayMode () { return _displayMode; }
|
||||
void GCell::setDisplayMode ( uint32_t mode ) { _displayMode = mode; }
|
||||
|
||||
|
||||
GCell::GCell ( AnabaticEngine* anabatic, DbU::Unit xmin, DbU::Unit ymin )
|
||||
|
@ -581,10 +581,10 @@ namespace Anabatic {
|
|||
Box GCell::getBorder ( const GCell* s, const GCell* t )
|
||||
{
|
||||
Flags flags = Flags::NoFlags;
|
||||
flags |= (s->getXMax() == t->getXMin()) ? Flags::EastSide : 0;
|
||||
flags |= (t->getXMax() == s->getXMin()) ? Flags::WestSide : 0;
|
||||
flags |= (s->getYMax() == t->getYMin()) ? Flags::NorthSide : 0;
|
||||
flags |= (t->getYMax() == s->getYMin()) ? Flags::SouthSide : 0;
|
||||
flags |= (s->getXMax() == t->getXMin()) ? Flags::EastSide : Flags::NoFlags;
|
||||
flags |= (t->getXMax() == s->getXMin()) ? Flags::WestSide : Flags::NoFlags;
|
||||
flags |= (s->getYMax() == t->getYMin()) ? Flags::NorthSide : Flags::NoFlags;
|
||||
flags |= (t->getYMax() == s->getYMin()) ? Flags::SouthSide : Flags::NoFlags;
|
||||
|
||||
if (flags & Flags::Vertical) {
|
||||
if (flags & Flags::Horizontal) return Box();
|
||||
|
@ -1065,11 +1065,11 @@ namespace Anabatic {
|
|||
{ return getDensity(depth) > Session::getSaturateRatio(); }
|
||||
|
||||
|
||||
Interval GCell::getSide ( unsigned int direction ) const
|
||||
{
|
||||
if (direction & Flags::Vertical) return Interval( getYMin(), getYMax() );
|
||||
return Interval( getXMin(), getXMax() );
|
||||
}
|
||||
// Interval GCell::getSide ( Flags direction ) const
|
||||
// {
|
||||
// if (direction & Flags::Vertical) return Interval( getYMin(), getYMax() );
|
||||
// return Interval( getXMin(), getXMax() );
|
||||
// }
|
||||
|
||||
|
||||
AutoSegments GCell::getHStartSegments ()
|
||||
|
@ -1154,7 +1154,7 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
float GCell::getDensity ( unsigned int flags ) const
|
||||
float GCell::getDensity ( Flags flags ) const
|
||||
{
|
||||
if (isInvalidated() and not(flags & Flags::NoUpdate)) const_cast<GCell*>(this)->updateDensity();
|
||||
|
||||
|
@ -1552,7 +1552,7 @@ namespace Anabatic {
|
|||
bool GCell::stepDesaturate ( size_t depth
|
||||
, set<Net*>& globalNets
|
||||
, AutoSegment*& moved
|
||||
, unsigned int flags
|
||||
, Flags flags
|
||||
)
|
||||
{
|
||||
cdebug_log(9000,0) << "Deter| GCell::stepDesaturate() [" << getId() << "] depth:" << depth << endl;
|
||||
|
@ -1665,6 +1665,20 @@ namespace Anabatic {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
void GCell::setEdgesOccupancy ( unsigned int width, unsigned int height )
|
||||
{
|
||||
getEastEdge()->setCapacity(width);
|
||||
getWestEdge()->setCapacity(width);
|
||||
getNorthEdge()->setCapacity(height);
|
||||
getSouthEdge()->setCapacity(height);
|
||||
getEastEdge()->setRealOccupancy(0);
|
||||
getWestEdge()->setRealOccupancy(0);
|
||||
getNorthEdge()->setRealOccupancy(0);
|
||||
getSouthEdge()->setRealOccupancy(0);
|
||||
}
|
||||
|
||||
|
||||
string GCell::_getTypeName () const
|
||||
{ return getString(_extensionName); }
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ namespace Anabatic {
|
|||
using Hurricane::NetRoutingExtension;
|
||||
|
||||
|
||||
void AnabaticEngine::_desaturate ( unsigned int depth
|
||||
void AnabaticEngine::_desaturate ( unsigned int depth
|
||||
, set<Net*>& globalNets
|
||||
, unsigned long& total
|
||||
, unsigned long& globals )
|
||||
|
@ -472,7 +472,7 @@ namespace Anabatic {
|
|||
#endif
|
||||
|
||||
|
||||
void AnabaticEngine::layerAssign ( unsigned int method )
|
||||
void AnabaticEngine::layerAssign ( uint32_t method )
|
||||
{
|
||||
cdebug_log(9000,0) << "Deter| Layer Assignment" << endl;
|
||||
|
||||
|
|
|
@ -102,7 +102,7 @@ namespace {
|
|||
//! request the creation of a contact <em>on the target point</em>.
|
||||
|
||||
|
||||
//! \function unsigned int checkRoutingPadSize ( Component* rp );
|
||||
//! \function uint64_t checkRoutingPadSize ( Component* rp );
|
||||
//!
|
||||
//! Look at the geometrical size of the Component and assess if
|
||||
//! it's span is too narrow either horizontally or vertically.
|
||||
|
@ -127,7 +127,7 @@ namespace {
|
|||
* call the canonization, which needs all the caches to be up to date.
|
||||
*/
|
||||
|
||||
//! \function void GCellTopology::doRp_AutoContacts ( GCell* gcell, Component* rp, AutoContact*& source, AutoContact*& target, unsigned int flags );
|
||||
//! \function void GCellTopology::doRp_AutoContacts ( GCell* gcell, Component* rp, AutoContact*& source, AutoContact*& target, uint64_t flags );
|
||||
//! \param gcell The GCell into which create the AutoContact.
|
||||
//! \param rp The Component we want to access.
|
||||
//! \param source The AutoContact created on the \c source (\e returned).
|
||||
|
@ -166,7 +166,7 @@ namespace {
|
|||
//!
|
||||
//! \image html doRp_AutoContacts.png "doRp_AutoContacts()"
|
||||
|
||||
//! \function AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, unsigned int flags );
|
||||
//! \function AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, uint64_t flags );
|
||||
//! \param gcell The GCell into which create the AutoContact.
|
||||
//! \param rp The Component onto which anchor the access contact.
|
||||
//! \param flags Relevant flags are:
|
||||
|
@ -185,7 +185,7 @@ namespace {
|
|||
//!
|
||||
//! \image html doRp_Access.png "doRp_Access()"
|
||||
|
||||
//! \function AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, unsigned int flags );
|
||||
//! \function AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, uint64_t flags );
|
||||
//! \param rp The Component onto which anchor the access contact.
|
||||
//! \param flags Relevant flags are:
|
||||
//! - HAccess, the terminal is to be accessed through an horizontal
|
||||
|
@ -405,21 +405,21 @@ namespace {
|
|||
// ---------------------------------------------------------------
|
||||
// Local Enum/Types.
|
||||
|
||||
enum LocalFunctionFlag { NoFlags = 0x00000000
|
||||
, SortDecreasing = 0x00000001
|
||||
, HAccess = 0x00000002
|
||||
, VSmall = 0x00000004
|
||||
, HSmall = 0x00000008
|
||||
, Punctual = 0x00000010
|
||||
, HCollapse = 0x00000020
|
||||
, VCollapse = 0x00000040
|
||||
, Terminal = 0x00000080
|
||||
, DoSourceContact = 0x00000100
|
||||
, DoTargetContact = 0x00000200
|
||||
, SouthBound = 0x00010000
|
||||
, NorthBound = 0x00020000
|
||||
, WestBound = 0x00040000
|
||||
, EastBound = 0x00080000
|
||||
enum LocalFunctionFlag { NoFlags = (1 << 0)
|
||||
, SortDecreasing = (1 << 1)
|
||||
, HAccess = (1 << 2)
|
||||
, VSmall = (1 << 3)
|
||||
, HSmall = (1 << 4)
|
||||
, Punctual = (1 << 5)
|
||||
, HCollapse = (1 << 6)
|
||||
, VCollapse = (1 << 7)
|
||||
, Terminal = (1 << 8)
|
||||
, DoSourceContact = (1 << 9)
|
||||
, DoTargetContact = (1 << 10)
|
||||
, SouthBound = (1 << 11)
|
||||
, NorthBound = (1 << 12)
|
||||
, WestBound = (1 << 13)
|
||||
, EastBound = (1 << 14)
|
||||
};
|
||||
|
||||
|
||||
|
@ -483,7 +483,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
unsigned int checkRoutingPadSize ( Component* anchor )
|
||||
uint64_t checkRoutingPadSize ( Component* anchor )
|
||||
{
|
||||
Point source;
|
||||
Point target;
|
||||
|
@ -496,7 +496,7 @@ namespace {
|
|||
DbU::Unit width = abs( target.getX() - source.getX() );
|
||||
DbU::Unit height = abs( target.getY() - source.getY() );
|
||||
|
||||
unsigned int flags = 0;
|
||||
uint64_t flags = 0;
|
||||
flags |= (width < 3*Session::getPitch(anchorDepth)) ? HSmall : 0;
|
||||
flags |= (height < 3*Session::getPitch(anchorDepth)) ? VSmall : 0;
|
||||
flags |= ((width == 0) && (height == 0)) ? Punctual : 0;
|
||||
|
@ -518,7 +518,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
unsigned int getSegmentHookType ( Hook* hook )
|
||||
uint64_t getSegmentHookType ( Hook* hook )
|
||||
{
|
||||
Horizontal* horizontal = dynamic_cast<Horizontal*>( hook->getComponent() );
|
||||
if (horizontal) {
|
||||
|
@ -548,14 +548,14 @@ namespace {
|
|||
|
||||
class SortHkByX {
|
||||
public:
|
||||
inline SortHkByX ( unsigned int flags );
|
||||
inline SortHkByX ( uint64_t flags );
|
||||
inline bool operator() ( Hook* h1, Hook* h2 );
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
uint64_t _flags;
|
||||
};
|
||||
|
||||
|
||||
inline SortHkByX::SortHkByX ( unsigned int flags )
|
||||
inline SortHkByX::SortHkByX ( uint64_t flags )
|
||||
: _flags(flags)
|
||||
{ }
|
||||
|
||||
|
@ -586,14 +586,14 @@ namespace {
|
|||
|
||||
class SortHkByY {
|
||||
public:
|
||||
inline SortHkByY ( unsigned int flags );
|
||||
inline SortHkByY ( uint64_t flags );
|
||||
inline bool operator() ( Hook* h1, Hook* h2 );
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
uint64_t _flags;
|
||||
};
|
||||
|
||||
|
||||
inline SortHkByY::SortHkByY ( unsigned int flags )
|
||||
inline SortHkByY::SortHkByY ( uint64_t flags )
|
||||
: _flags(flags)
|
||||
{ }
|
||||
|
||||
|
@ -624,14 +624,14 @@ namespace {
|
|||
|
||||
class SortRpByX {
|
||||
public:
|
||||
inline SortRpByX ( unsigned int flags );
|
||||
inline SortRpByX ( uint64_t flags );
|
||||
inline bool operator() ( Component* rp1, Component* rp2 );
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
uint64_t _flags;
|
||||
};
|
||||
|
||||
|
||||
inline SortRpByX::SortRpByX ( unsigned int flags )
|
||||
inline SortRpByX::SortRpByX ( uint64_t flags )
|
||||
: _flags(flags)
|
||||
{ }
|
||||
|
||||
|
@ -651,14 +651,14 @@ namespace {
|
|||
|
||||
class SortRpByY {
|
||||
public:
|
||||
inline SortRpByY ( unsigned int flags );
|
||||
inline SortRpByY ( uint64_t flags );
|
||||
inline bool operator() ( Component* rp1, Component* rp2 );
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
uint64_t _flags;
|
||||
};
|
||||
|
||||
|
||||
inline SortRpByY::SortRpByY ( unsigned int flags )
|
||||
inline SortRpByY::SortRpByY ( uint64_t flags )
|
||||
: _flags(flags)
|
||||
{ }
|
||||
|
||||
|
@ -718,10 +718,10 @@ namespace {
|
|||
void construct ( ForkStack& forks );
|
||||
inline unsigned int getStateG () const;
|
||||
inline GCell* getGCell () const;
|
||||
static void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, unsigned int flags );
|
||||
static AutoContact* doRp_Access ( GCell*, Component*, unsigned int flags );
|
||||
static AutoContact* doRp_AccessPad ( RoutingPad*, unsigned int flags );
|
||||
static AutoContact* doRp_AccessAnalog ( GCell*, RoutingPad*, unsigned int flags );
|
||||
static void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, uint64_t flags );
|
||||
static AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags );
|
||||
static AutoContact* doRp_AccessPad ( RoutingPad*, uint64_t flags );
|
||||
static AutoContact* doRp_AccessAnalog ( GCell*, RoutingPad*, uint64_t flags );
|
||||
static void doRp_StairCaseH ( GCell*, Component* rp1, Component* rp2 );
|
||||
static void doRp_StairCaseV ( GCell*, Component* rp1, Component* rp2 );
|
||||
private:
|
||||
|
@ -880,7 +880,7 @@ namespace {
|
|||
void GCellTopology::fixSegments ()
|
||||
{
|
||||
for ( size_t i=0 ; i<_toFixSegments.size() ; ++i )
|
||||
_toFixSegments[i]->setFlags( SegFixed );
|
||||
_toFixSegments[i]->setFlags( AutoSegment::SegFixed );
|
||||
_toFixSegments.clear();
|
||||
}
|
||||
|
||||
|
@ -1120,7 +1120,7 @@ namespace {
|
|||
, targetContact
|
||||
, static_cast<Segment*>( _fromHook->getComponent() )
|
||||
);
|
||||
globalSegment->setFlags( (_degree == 2) ? SegBipoint : 0 );
|
||||
globalSegment->setFlags( (_degree == 2) ? AutoSegment::SegBipoint : 0 );
|
||||
cdebug_log(145,0) << "Create global segment: " << globalSegment << endl;
|
||||
|
||||
// HARDCODED VALUE.
|
||||
|
@ -1196,7 +1196,7 @@ namespace {
|
|||
, targetContact
|
||||
, static_cast<Segment*>( _fromHook->getComponent() )
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
cdebug_log(145,0) << "[Create global segment (1)]: " << globalSegment << endl;
|
||||
}
|
||||
}
|
||||
cdebug_tabw(145,-1);
|
||||
|
@ -1207,7 +1207,7 @@ namespace {
|
|||
, Component* rp
|
||||
, AutoContact*& source
|
||||
, AutoContact*& target
|
||||
, unsigned int flags
|
||||
, uint64_t flags
|
||||
)
|
||||
{
|
||||
cdebug_log(145,1) << "doRp_AutoContacts()" << endl;
|
||||
|
@ -1219,8 +1219,8 @@ namespace {
|
|||
Point targetPosition;
|
||||
const Layer* rpLayer = rp->getLayer();
|
||||
size_t rpDepth = Session::getLayerDepth( rp->getLayer() );
|
||||
unsigned int direction = Session::getDirection ( rpDepth );
|
||||
DbU::Unit viaSide = Session::getWireWidth ( rpDepth );
|
||||
Flags direction = Session::getDirection ( rpDepth );
|
||||
DbU::Unit viaSide = Session::getViaWidth ( rpDepth );
|
||||
|
||||
getPositions( rp, sourcePosition, targetPosition );
|
||||
|
||||
|
@ -1256,7 +1256,7 @@ namespace {
|
|||
targetProtect->setFlags( CntFixed );
|
||||
|
||||
AutoSegment* segment = AutoSegment::create( sourceProtect, targetProtect, direction );
|
||||
segment->setFlags( SegFixed );
|
||||
segment->setFlags( AutoSegment::SegFixed );
|
||||
|
||||
__routingPadAutoSegments.insert( make_pair(rp,segment) );
|
||||
}
|
||||
|
@ -1293,7 +1293,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, unsigned int flags )
|
||||
AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, uint64_t flags )
|
||||
{
|
||||
cdebug_log(145,1) << "doRp_Access() - flags:" << flags << endl;
|
||||
|
||||
|
@ -1326,7 +1326,7 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, unsigned int flags )
|
||||
AutoContact* GCellTopology::doRp_AccessPad ( RoutingPad* rp, uint64_t flags )
|
||||
{
|
||||
cdebug_log(145,1) << "doRp_AccessPad()" << endl;
|
||||
cdebug_log(145,0) << rp << endl;
|
||||
|
@ -1473,14 +1473,14 @@ namespace {
|
|||
}
|
||||
|
||||
|
||||
AutoContact* GCellTopology::doRp_AccessAnalog ( GCell* gcell, RoutingPad* rp, unsigned int flags )
|
||||
AutoContact* GCellTopology::doRp_AccessAnalog ( GCell* gcell, RoutingPad* rp, uint64_t flags )
|
||||
{
|
||||
cdebug_log(145,1) << "doRp_AccessAnalog()" << endl;
|
||||
cdebug_log(145,0) << rp << endl;
|
||||
|
||||
const Layer* rpLayer = rp->getLayer();
|
||||
size_t rpDepth = Session::getLayerDepth( rpLayer );
|
||||
DbU::Unit viaSide = Session::getWireWidth ( rpDepth );
|
||||
DbU::Unit viaSide = Session::getViaWidth ( rpDepth );
|
||||
Point position = rp->getCenter();
|
||||
Point onGrid = Session::getNearestGridPoint( position, gcell->getConstraintBox() );
|
||||
|
||||
|
@ -1637,12 +1637,12 @@ namespace {
|
|||
cdebug_log(145,1) << "_do_xG_1Pad() [Managed Configuration - Optimized] " << _topology << endl;
|
||||
cdebug_log(145,0) << "_connexity.globals:" << (int)_connexity.fields.globals << endl;
|
||||
|
||||
unsigned int flags = NoFlags;
|
||||
bool eastPad = false;
|
||||
bool westPad = false;
|
||||
bool northPad = false;
|
||||
bool southPad = false;
|
||||
Instance* padInstance = _routingPads[0]->getOccurrence().getPath().getHeadInstance();
|
||||
uint64_t flags = NoFlags;
|
||||
bool eastPad = false;
|
||||
bool westPad = false;
|
||||
bool northPad = false;
|
||||
bool southPad = false;
|
||||
Instance* padInstance = _routingPads[0]->getOccurrence().getPath().getHeadInstance();
|
||||
|
||||
switch ( padInstance->getTransformation().getOrientation() ) {
|
||||
case Transformation::Orientation::ID: northPad = true; break;
|
||||
|
@ -1657,10 +1657,10 @@ namespace {
|
|||
break;
|
||||
}
|
||||
cdebug_log(145,0) << "eastPad:" << eastPad << ", "
|
||||
<< "westPad:" << westPad << ", "
|
||||
<< "northPad:" << northPad << ", "
|
||||
<< "southPad:" << southPad
|
||||
<< endl;
|
||||
<< "westPad:" << westPad << ", "
|
||||
<< "northPad:" << northPad << ", "
|
||||
<< "southPad:" << southPad
|
||||
<< endl;
|
||||
|
||||
AutoContact* source = doRp_AccessPad( _routingPads[0], flags );
|
||||
// Point position = _routingPads[0]->getCenter();
|
||||
|
@ -1759,7 +1759,7 @@ namespace {
|
|||
{
|
||||
cdebug_log(145,1) << "_do_1G_1M1() [Managed Configuration - Optimized] " << _topology << endl;
|
||||
|
||||
unsigned int flags = NoFlags;
|
||||
uint64_t flags = NoFlags;
|
||||
if (_east ) { flags |= HAccess; }
|
||||
else if (_west ) { flags |= HAccess; }
|
||||
else if (_north) { flags |= VSmall; }
|
||||
|
@ -1776,7 +1776,7 @@ namespace {
|
|||
cdebug_log(145,1) << "_do_1G_" << (int)_connexity.fields.M1 << "M1() [Managed Configuration]" << endl;
|
||||
|
||||
sort( _routingPads.begin(), _routingPads.end(), SortRpByX(NoFlags) ); // increasing X.
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
AutoContact* leftContact = doRp_Access( _gcell, _routingPads[i-1], HAccess );
|
||||
AutoContact* rightContact = doRp_Access( _gcell, _routingPads[i ], HAccess );
|
||||
AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
|
||||
|
@ -1789,7 +1789,7 @@ namespace {
|
|||
globalRp = _routingPads[0];
|
||||
|
||||
cdebug_log(145,0) << "| Initial N/S Global RP: " << globalRp << endl;
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
if (_routingPads[i]->getBoundingBox().getHeight() > globalRp->getBoundingBox().getHeight()) {
|
||||
cdebug_log(145,0) << "| Better RP: " << globalRp << endl;
|
||||
globalRp = _routingPads[i];
|
||||
|
@ -1889,7 +1889,7 @@ namespace {
|
|||
rpM3 = _routingPads[0];
|
||||
|
||||
sort( _routingPads.begin(), _routingPads.end(), SortRpByX(NoFlags) ); // increasing X.
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
AutoContact* leftContact = doRp_Access( _gcell, _routingPads[i-1], HAccess );
|
||||
AutoContact* rightContact = doRp_Access( _gcell, _routingPads[i ], HAccess );
|
||||
AutoSegment::create( leftContact, rightContact, Flags::Horizontal );
|
||||
|
@ -1927,7 +1927,7 @@ namespace {
|
|||
// All RoutingPad are M1.
|
||||
Component* southWestRp = _routingPads[0];
|
||||
cdebug_log(145,0) << "| Initial S-W Global RP: " << southWestRp << endl;
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
if (southWestRp->getBoundingBox().getHeight() >= 4*Session::getPitch(1)) break;
|
||||
if (_routingPads[i]->getBoundingBox().getHeight() > southWestRp->getBoundingBox().getHeight()) {
|
||||
cdebug_log(145,0) << "| Better RP: " << southWestRp << endl;
|
||||
|
@ -1951,7 +1951,7 @@ namespace {
|
|||
cdebug_log(145,0) << "| Initial N-E Global RP: " << northEastRp << endl;
|
||||
|
||||
if (_routingPads.size() > 1) {
|
||||
for ( unsigned int i=_routingPads.size()-1; i != 0 ; ) {
|
||||
for ( size_t i=_routingPads.size()-1; i != 0 ; ) {
|
||||
i -= 1;
|
||||
if (northEastRp->getBoundingBox().getHeight() >= 4*Session::getPitch(1)) break;
|
||||
if (_routingPads[i]->getBoundingBox().getHeight() > northEastRp->getBoundingBox().getHeight()) {
|
||||
|
@ -2006,7 +2006,7 @@ namespace {
|
|||
<< (int)_connexity.fields.M2 << "M2() [Managed Configuration - x]" << endl;
|
||||
|
||||
Component* biggestRp = _routingPads[0];
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; ++i ) {
|
||||
doRp_StairCaseH( _gcell, _routingPads[i-1], _routingPads[i] );
|
||||
if (_routingPads[i]->getBoundingBox().getWidth() > biggestRp->getBoundingBox().getWidth())
|
||||
biggestRp = _routingPads[i];
|
||||
|
@ -2042,7 +2042,7 @@ namespace {
|
|||
{
|
||||
cdebug_log(145,1) << "_do_1G_1M3() [Optimised Configuration]" << endl;
|
||||
|
||||
unsigned int flags = (_east or _west) ? HAccess : NoFlags;
|
||||
uint64_t flags = (_east or _west) ? HAccess : NoFlags;
|
||||
flags |= (_north) ? DoTargetContact : NoFlags;
|
||||
flags |= (_south) ? DoSourceContact : NoFlags;
|
||||
|
||||
|
@ -2091,7 +2091,7 @@ namespace {
|
|||
cdebug_log(145,0) << "_north:" << _north << endl;
|
||||
|
||||
sort( _routingPads.begin(), _routingPads.end(), SortRpByY(NoFlags) ); // increasing Y.
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; i++ ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; i++ ) {
|
||||
doRp_StairCaseV( _gcell, _routingPads[i-1], _routingPads[i] );
|
||||
}
|
||||
|
||||
|
@ -2263,7 +2263,7 @@ namespace {
|
|||
{
|
||||
cdebug_log(145,1) << "void GCellTopology::_doDevice ()" << _gcell << endl;
|
||||
// #0: Check if all RoutingPads are set to a component.
|
||||
for ( unsigned int i=0; i<_routingPads.size() ; i++ ) {
|
||||
for ( size_t i=0; i<_routingPads.size() ; i++ ) {
|
||||
if ( ( _routingPads[i]->getSourcePosition().getX() == _routingPads[i]->getTargetPosition().getX() )
|
||||
&&( _routingPads[i]->getSourcePosition().getY() == _routingPads[i]->getTargetPosition().getY() )
|
||||
){
|
||||
|
@ -2294,7 +2294,7 @@ namespace {
|
|||
rpNE = _routingPads[0];
|
||||
rpSW = _routingPads[0];
|
||||
|
||||
for ( unsigned int i=1 ; i<_routingPads.size() ; i++ ) {
|
||||
for ( size_t i=1 ; i<_routingPads.size() ; i++ ) {
|
||||
rpNE = returnNE( _gcell, rpNE, _routingPads[i] );
|
||||
rpSW = returnSW( _gcell, rpSW, _routingPads[i] );
|
||||
}
|
||||
|
@ -2350,19 +2350,10 @@ namespace {
|
|||
{
|
||||
cdebug_log(145,1) << "void GCellTopology::_doHChannel ( ForkStack& forks )" << _gcell << endl;
|
||||
|
||||
vector<Hook*> hooks;
|
||||
Hook* firsthhook = NULL;
|
||||
Hook* lasthhook = NULL;
|
||||
static const Layer* hLayer = Session::getRoutingLayer( 1 );
|
||||
static DbU::Unit hWidth = Session::getWireWidth ( 1 );
|
||||
static const Layer* vLayer = Session::getRoutingLayer( 2 );
|
||||
static DbU::Unit vWidth = Session::getWireWidth ( 2 );
|
||||
|
||||
const Layer* horizontalLayer = hLayer;
|
||||
DbU::Unit horizontalWidth = hWidth;
|
||||
const Layer* verticalLayer = vLayer;
|
||||
DbU::Unit verticalWidth = vWidth;
|
||||
AutoContact* targetContact = NULL;
|
||||
vector<Hook*> hooks;
|
||||
Hook* firsthhook = NULL;
|
||||
Hook* lasthhook = NULL;
|
||||
AutoContact* targetContact = NULL;
|
||||
|
||||
// Save segments only
|
||||
cdebug_log(145,0) << "fromHook: " << _fromHook << endl;
|
||||
|
@ -2462,15 +2453,8 @@ namespace {
|
|||
cdebug_log(145,0) << "Chain contacts: " << endl;
|
||||
for (size_t j=1; j < autoContacts.size(); j++){
|
||||
if (autoContacts[j-1] != autoContacts[j]){
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( autoContacts[j-1] , autoContacts[j]
|
||||
, Horizontal::create( autoContacts[j-1]->base() , autoContacts[j]->base()
|
||||
, horizontalLayer
|
||||
, autoContacts[j-1]->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* segment = AutoSegment::create( autoContacts[j-1] , autoContacts[j], Flags::Horizontal );
|
||||
cdebug_log(145,0) << "[Create global segment (2)]: " << segment << endl;
|
||||
}
|
||||
}
|
||||
// There are only 2 AutoContacts to create
|
||||
|
@ -2498,15 +2482,8 @@ namespace {
|
|||
|
||||
cdebug_log(145,0) << "[Create AutoContact Source]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact Target]: " << target << endl;
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Horizontal::create( source->base(), target->base()
|
||||
, horizontalLayer
|
||||
, source->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Horizontal );
|
||||
cdebug_log(145,0) << "[Create global segment (3)]: " << globalSegment << endl;
|
||||
|
||||
if (_fromHook->getComponent() == hooks[0]->getComponent()){
|
||||
cdebug_log(145,0) << "Found from:" << hooks[0]->getComponent() << endl;
|
||||
|
@ -2551,15 +2528,8 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact Source]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact Target]: " << target << endl;
|
||||
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Vertical::create( source->base(), target->base()
|
||||
, verticalLayer
|
||||
, source->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Vertical );
|
||||
cdebug_log(145,0) << "[Create global segment (4)]: " << globalSegment << endl;
|
||||
|
||||
if (_fromHook->getComponent() == hooks[0]->getComponent()){
|
||||
cdebug_log(145,0) << "Found from:" << hooks[0]->getComponent() << endl;
|
||||
|
@ -2585,19 +2555,10 @@ namespace {
|
|||
cdebug_log(145,1) << "void GCellTopology::_doVChannel ()" << _gcell << endl;
|
||||
|
||||
|
||||
vector<Hook*> hooks;
|
||||
Hook* firstvhook = NULL;
|
||||
Hook* lastvhook = NULL;
|
||||
static const Layer* hLayer = Session::getRoutingLayer( 1 );
|
||||
static DbU::Unit hWidth = Session::getWireWidth ( 1 );
|
||||
static const Layer* vLayer = Session::getRoutingLayer( 2 );
|
||||
static DbU::Unit vWidth = Session::getWireWidth ( 2 );
|
||||
|
||||
const Layer* horizontalLayer = hLayer;
|
||||
DbU::Unit horizontalWidth = hWidth;
|
||||
const Layer* verticalLayer = vLayer;
|
||||
DbU::Unit verticalWidth = vWidth;
|
||||
AutoContact* targetContact = NULL;
|
||||
vector<Hook*> hooks;
|
||||
Hook* firstvhook = NULL;
|
||||
Hook* lastvhook = NULL;
|
||||
AutoContact* targetContact = NULL;
|
||||
|
||||
// Save segments only
|
||||
cdebug_log(145,0) << "fromHook: " << _fromHook << endl;
|
||||
|
@ -2699,16 +2660,9 @@ namespace {
|
|||
cdebug_log(145,0) << "Chain contacts: " << endl;
|
||||
for (size_t j=1; j < autoContacts.size(); j++){
|
||||
if (autoContacts[j-1] != autoContacts[j]){
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( autoContacts[j-1] , autoContacts[j]
|
||||
, Vertical::create( autoContacts[j-1]->base() , autoContacts[j]->base()
|
||||
, verticalLayer
|
||||
, autoContacts[j-1]->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* segment = AutoSegment::create( autoContacts[j-1] , autoContacts[j], Flags::Vertical );
|
||||
if (not segment->isGlobal()) segment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (5)]: " << segment << endl;
|
||||
}
|
||||
}
|
||||
// There are only 2 AutoContacts to create
|
||||
|
@ -2738,16 +2692,9 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact Source]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact Target]: " << target << endl;
|
||||
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Vertical::create( source->base(), target->base()
|
||||
, verticalLayer
|
||||
, source->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Vertical );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (6)]: " << globalSegment << endl;
|
||||
|
||||
if (_fromHook->getComponent() == hooks[0]->getComponent()){
|
||||
cdebug_log(145,0) << "Found from:" << hooks[0]->getComponent() << endl;
|
||||
|
@ -2793,16 +2740,9 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact Source]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact Target]: " << target << endl;
|
||||
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Horizontal::create( source->base(), target->base()
|
||||
, horizontalLayer
|
||||
, source->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Horizontal );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (7)]: " << globalSegment << endl;
|
||||
|
||||
if (_fromHook->getComponent() == hooks[0]->getComponent()){
|
||||
cdebug_log(145,0) << "Found from:" << hooks[0]->getComponent() << endl;
|
||||
|
@ -2853,16 +2793,7 @@ namespace {
|
|||
AutoContact* GCellTopology::_doStrut ( ForkStack& forks )
|
||||
{
|
||||
cdebug_log(145,1) << "void GCellTopology::_doStrut ()" << _gcell << endl;
|
||||
|
||||
static const Layer* hLayer = Session::getRoutingLayer( 1 );
|
||||
static DbU::Unit hWidth = Session::getWireWidth ( 1 );
|
||||
static const Layer* vLayer = Session::getRoutingLayer( 2 );
|
||||
static DbU::Unit vWidth = Session::getWireWidth ( 2 );
|
||||
|
||||
const Layer* horizontalLayer = hLayer;
|
||||
DbU::Unit horizontalWidth = hWidth;
|
||||
const Layer* verticalLayer = vLayer;
|
||||
DbU::Unit verticalWidth = vWidth;
|
||||
AutoContact* targetContact = NULL; // Contact for fromHook segment
|
||||
cdebug_log(145,0) << "FromHook: " << _fromHook << endl;
|
||||
cdebug_log(145,0) << "North : " << _north << endl;
|
||||
|
@ -2948,16 +2879,9 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << target << endl;
|
||||
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Horizontal::create( source->base(), target->base()
|
||||
, horizontalLayer
|
||||
, source->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Horizontal );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (8)]: " << globalSegment << endl;
|
||||
|
||||
} else if ((_east != NULL) && (_west != NULL) ) {
|
||||
cdebug_log(145,0) << "Case EW" << endl;
|
||||
|
@ -2999,16 +2923,9 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << source << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << target << endl;
|
||||
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( source, target
|
||||
, Vertical::create( source->base(), target->base()
|
||||
, verticalLayer
|
||||
, source->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( source, target, Flags::Vertical );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (9)]: " << globalSegment << endl;
|
||||
|
||||
} else {
|
||||
cerr << Warning( "Something is wrong with the globals in this Strut. 5 "
|
||||
|
@ -3048,16 +2965,9 @@ namespace {
|
|||
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << xtee << endl;
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( turn, xtee
|
||||
, Horizontal::create( turn->base(), xtee->base()
|
||||
, horizontalLayer
|
||||
, turn->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( turn, xtee, Flags::Horizontal );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (10)]: " << globalSegment << endl;
|
||||
|
||||
} else if ((_north != NULL) && (_south != NULL) && (_west != NULL)){
|
||||
cdebug_log(145,0) << "Case NSW " << endl;
|
||||
|
@ -3086,16 +2996,9 @@ namespace {
|
|||
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << xtee << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( xtee, turn
|
||||
, Horizontal::create( xtee->base(), turn->base()
|
||||
, horizontalLayer
|
||||
, xtee->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( xtee, turn, Flags::Horizontal );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (11)]: " << globalSegment << endl;
|
||||
|
||||
|
||||
} else if ((_east != NULL) && (_north != NULL) && (_west != NULL)){
|
||||
|
@ -3125,16 +3028,9 @@ namespace {
|
|||
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << xtee << endl;
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( turn, xtee
|
||||
, Vertical::create( turn->base(), xtee->base()
|
||||
, verticalLayer
|
||||
, turn->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( turn, xtee, Flags::Vertical );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (12)]: " << globalSegment << endl;
|
||||
|
||||
} else if ((_east != NULL) && (_south != NULL) && (_west != NULL)){
|
||||
cdebug_log(145,0) << "Case EWS " << endl;
|
||||
|
@ -3163,16 +3059,9 @@ namespace {
|
|||
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << xtee << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment =
|
||||
AutoSegment::create( xtee, turn
|
||||
, Vertical::create( xtee->base(), turn->base()
|
||||
, verticalLayer
|
||||
, turn->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment << endl;
|
||||
AutoSegment* globalSegment = AutoSegment::create( xtee, turn, Flags::Vertical );
|
||||
if (not globalSegment->isGlobal()) globalSegment->setFlags( AutoSegment::SegLongLocal );
|
||||
cdebug_log(145,0) << "[Create global segment (13)]: " << globalSegment << endl;
|
||||
|
||||
} else {
|
||||
cerr << Warning( "Something is wrong with the globals in this Strut. 6"
|
||||
|
@ -3212,24 +3101,10 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << hteeh << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << vteev << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment1 =
|
||||
AutoSegment::create( turn, hteeh
|
||||
, Horizontal::create( turn->base(), hteeh->base()
|
||||
, horizontalLayer
|
||||
, turn->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
AutoSegment* globalSegment2 =
|
||||
AutoSegment::create( turn, hteeh
|
||||
, Vertical::create( turn->base(), hteeh->base()
|
||||
, verticalLayer
|
||||
, turn->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment2 << endl;
|
||||
AutoSegment* globalSegment1 = AutoSegment::create( turn, hteeh, Flags::Horizontal );
|
||||
AutoSegment* globalSegment2 = AutoSegment::create( turn, hteeh, Flags::Vertical );
|
||||
cdebug_log(145,0) << "[Create global segment (14.1)]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment (14.2)]: " << globalSegment2 << endl;
|
||||
|
||||
} else if ( (_north->getComponent()->getX() > _south->getComponent()->getX() )
|
||||
&& (_east->getComponent ()->getY() < _west->getComponent ()->getY() )
|
||||
|
@ -3258,24 +3133,10 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << hteeh << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << vteev << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment1 =
|
||||
AutoSegment::create( vteev, hteeh
|
||||
, Horizontal::create( vteev->base(), hteeh->base()
|
||||
, horizontalLayer
|
||||
, vteev->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
AutoSegment* globalSegment2 =
|
||||
AutoSegment::create( vteev, turn
|
||||
, Vertical::create( vteev->base(), turn->base()
|
||||
, verticalLayer
|
||||
, vteev->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment2 << endl;
|
||||
AutoSegment* globalSegment1 = AutoSegment::create( vteev, hteeh, Flags::Horizontal );
|
||||
AutoSegment* globalSegment2 = AutoSegment::create( vteev, turn, Flags::Vertical );
|
||||
cdebug_log(145,0) << "[Create global segment (15.1)]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment (15.2)]: " << globalSegment2 << endl;
|
||||
|
||||
} else if ( (_north->getComponent()->getX() < _south->getComponent()->getX() )
|
||||
&& (_east->getComponent ()->getY() > _west->getComponent ()->getY() )
|
||||
|
@ -3304,24 +3165,10 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << hteeh << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << vteev << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment1 =
|
||||
AutoSegment::create( turn, hteeh
|
||||
, Horizontal::create( turn->base(), hteeh->base()
|
||||
, horizontalLayer
|
||||
, turn->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
AutoSegment* globalSegment2 =
|
||||
AutoSegment::create( vteev, hteeh
|
||||
, Vertical::create( vteev->base(), hteeh->base()
|
||||
, verticalLayer
|
||||
, vteev->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment2 << endl;
|
||||
AutoSegment* globalSegment1 = AutoSegment::create( turn, hteeh, Flags::Horizontal );
|
||||
AutoSegment* globalSegment2 = AutoSegment::create( vteev, hteeh, Flags::Vertical );
|
||||
cdebug_log(145,0) << "[Create global segment (16.1)]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment (16.2)]: " << globalSegment2 << endl;
|
||||
|
||||
} else {
|
||||
cdebug_log(145,0) << "(N.X > S.X) & (E.Y > W.Y)" << endl;
|
||||
|
@ -3348,24 +3195,10 @@ namespace {
|
|||
cdebug_log(145,0) << "[Create AutoContact]: " << hteeh << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << vteev << endl;
|
||||
cdebug_log(145,0) << "[Create AutoContact]: " << turn << endl;
|
||||
AutoSegment* globalSegment1 =
|
||||
AutoSegment::create( turn, hteeh
|
||||
, Horizontal::create( turn->base(), hteeh->base()
|
||||
, horizontalLayer
|
||||
, turn->getY()
|
||||
, horizontalWidth
|
||||
)
|
||||
);
|
||||
AutoSegment* globalSegment2 =
|
||||
AutoSegment::create( vteev, turn
|
||||
, Vertical::create( vteev->base(), turn->base()
|
||||
, verticalLayer
|
||||
, vteev->getX()
|
||||
, verticalWidth
|
||||
)
|
||||
);
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment]: " << globalSegment2 << endl;
|
||||
AutoSegment* globalSegment1 = AutoSegment::create( turn, hteeh, Flags::Horizontal );
|
||||
AutoSegment* globalSegment2 = AutoSegment::create( vteev, turn, Flags::Vertical );
|
||||
cdebug_log(145,0) << "[Create global segment (17.1)]: " << globalSegment1 << endl;
|
||||
cdebug_log(145,0) << "[Create global segment (17.2)]: " << globalSegment2 << endl;
|
||||
}
|
||||
} else {
|
||||
cerr << Warning( "Something is wrong with the number of globals in this Strut. 7"
|
||||
|
@ -3409,14 +3242,16 @@ namespace Anabatic {
|
|||
startMeasures();
|
||||
openSession();
|
||||
|
||||
forEach ( Net*, inet, getCell()->getNets() ) {
|
||||
if (NetRoutingExtension::isAutomaticGlobalRoute(*inet)) {
|
||||
DebugSession::open( *inet, 140, 150 );
|
||||
_loadNetGlobalRouting( *inet );
|
||||
for ( Net* net : getCell()->getNets() ) {
|
||||
if (NetRoutingExtension::isAutomaticGlobalRoute(net)) {
|
||||
DebugSession::open( net, 144, 150 );
|
||||
AutoSegment::setAnalogMode( NetRoutingExtension::isAnalog(net) );
|
||||
_loadNetGlobalRouting( net );
|
||||
Session::revalidate();
|
||||
DebugSession::close();
|
||||
}
|
||||
} // forEach(Net*)
|
||||
}
|
||||
AutoSegment::setAnalogMode( false );
|
||||
|
||||
#if defined(CHECK_DATABASE)
|
||||
_check ( "after Anabatic loading" );
|
||||
|
|
|
@ -37,20 +37,22 @@ namespace Anabatic {
|
|||
|
||||
void AnabaticEngine::_computeNetOptimals ( Net* net )
|
||||
{
|
||||
DebugSession::open( net, 140, 150 );
|
||||
DebugSession::open( net, 145, 150 );
|
||||
cdebug_log(149,0) << "Anabatic::_computeNetOptimals( " << net << " )" << endl;
|
||||
cdebug_tabw(145,1);
|
||||
|
||||
vector<AutoSegment*> segments;
|
||||
forEach ( Segment*, segment, net->getSegments() ) {
|
||||
AutoSegment* autoSegment = Session::lookup( *segment );
|
||||
for ( Segment* segment : net->getSegments() ) {
|
||||
AutoSegment* autoSegment = Session::lookup( segment );
|
||||
if (autoSegment) segments.push_back( autoSegment );
|
||||
}
|
||||
sort( segments.begin(), segments.end(), AutoSegment::CompareId() );
|
||||
|
||||
set<AutoSegment*> processeds;
|
||||
for ( size_t i=0 ; i<segments.size() ; i++ )
|
||||
segments[i]->computeOptimal( processeds );
|
||||
for ( AutoSegment* segment : segments ) {
|
||||
if (processeds.find(segment) != processeds.end()) continue;
|
||||
segment->computeOptimal( processeds );
|
||||
}
|
||||
|
||||
cdebug_tabw(145,-1);
|
||||
DebugSession::close();
|
||||
|
|
|
@ -165,7 +165,7 @@ namespace Anabatic {
|
|||
AutoContact* source = Session::lookup( dynamic_cast<Contact*>( isegment->getSource() ));
|
||||
AutoContact* target = Session::lookup( dynamic_cast<Contact*>( isegment->getTarget() ));
|
||||
AutoSegment* autoSegment = AutoSegment::create( source, target, isegment );
|
||||
autoSegment->setFlags( SegUserDefined|SegAxisSet );
|
||||
autoSegment->setFlags( AutoSegment::SegUserDefined|AutoSegment::SegAxisSet );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -156,12 +156,12 @@ namespace Anabatic {
|
|||
|
||||
cdebug_tabw(145,1);
|
||||
|
||||
canonical->setFlags( SegCanonical );
|
||||
canonical->setFlags( AutoSegment::SegCanonical );
|
||||
cdebug_log(145,0) << "Canonical: " << canonical << endl;
|
||||
|
||||
for ( size_t j=0 ; j<aligneds.size() ; j++ ) {
|
||||
if (isWeakGlobal and not aligneds[j]->isGlobal()) aligneds[j]->setFlags ( SegWeakGlobal );
|
||||
else aligneds[j]->unsetFlags( SegWeakGlobal );
|
||||
if (isWeakGlobal and not aligneds[j]->isGlobal()) aligneds[j]->setFlags ( AutoSegment::SegWeakGlobal );
|
||||
else aligneds[j]->unsetFlags( AutoSegment::SegWeakGlobal );
|
||||
|
||||
if (aligneds[j] == canonical) continue;
|
||||
if (aligneds[j]->isCanonical()) {
|
||||
|
@ -169,13 +169,12 @@ namespace Anabatic {
|
|||
" Segment is no longer the canonical one, this must not happens."
|
||||
,getString(aligneds[j]).c_str()) << endl;
|
||||
}
|
||||
aligneds[j]->unsetFlags( SegCanonical );
|
||||
aligneds[j]->unsetFlags( AutoSegment::SegCanonical );
|
||||
cdebug_log(145,0) << "Secondary: " << aligneds[j] << endl;
|
||||
}
|
||||
if (aligneds.empty()) canonical->setFlags( SegNotAligned );
|
||||
if (aligneds.empty()) canonical->setFlags( AutoSegment::SegNotAligned );
|
||||
|
||||
cdebug_log(149,0) << "Align @" << DbU::getValueString(canonical->getAxis())
|
||||
<< " on " << canonical << endl;
|
||||
cdebug_log(149,0) << "Align on canonical:" << canonical << endl;
|
||||
|
||||
//canonical->setAxis( canonical->getAxis(), Flags::Realignate );
|
||||
if (canonical->isUnsetAxis()) canonical->toOptimalAxis( Flags::Realignate|Flags::Propagate );
|
||||
|
@ -248,7 +247,7 @@ namespace Anabatic {
|
|||
_segmentInvalidateds.clear();
|
||||
|
||||
cdebug_log(145,0) << "AutoSegments/AutoContacts queued deletion." << endl;
|
||||
unsigned int flags = _anabatic->flags() & Flags::DestroyMask;
|
||||
Flags flags = _anabatic->flags() & Flags::DestroyMask;
|
||||
_anabatic->flags() = Flags::DestroyMask;
|
||||
set<AutoSegment*>::iterator isegment = _destroyedSegments.begin();
|
||||
for ( ; isegment != _destroyedSegments.end() ; isegment++ ) {
|
||||
|
@ -300,18 +299,18 @@ namespace Anabatic {
|
|||
}
|
||||
|
||||
|
||||
unsigned int Session::getDirection ( size_t depth )
|
||||
Flags Session::getDirection ( size_t depth )
|
||||
{
|
||||
RoutingGauge* rg = get("getDirection()")->_routingGauge;
|
||||
switch ( rg->getLayerDirection(depth) ) {
|
||||
case Constant::Horizontal: return Flags::Horizontal;
|
||||
case Constant::Vertical: return Flags::Vertical;
|
||||
}
|
||||
return 0;
|
||||
return Flags::NoFlags;
|
||||
}
|
||||
|
||||
|
||||
DbU::Unit Session::_getPitch ( size_t depth, unsigned int flags ) const
|
||||
DbU::Unit Session::_getPitch ( size_t depth, Flags flags ) const
|
||||
{
|
||||
if (flags == Flags::NoFlags) return _routingGauge->getLayerPitch(depth);
|
||||
|
||||
|
@ -380,7 +379,7 @@ namespace Anabatic {
|
|||
{ return get("doWarnGCellOverload()")->_anabatic->doWarnOnGCellOverload(); }
|
||||
|
||||
|
||||
void Session::setAnabaticFlags ( unsigned int flags )
|
||||
void Session::setAnabaticFlags ( Flags flags )
|
||||
{ get("setKabaticFlags()")->_anabatic->flags() = flags; }
|
||||
|
||||
|
||||
|
|
|
@ -163,7 +163,7 @@ namespace Anabatic {
|
|||
// Class : "Anabatic::AnabaticEngine".
|
||||
|
||||
typedef std::set<Net*,Entity::CompareById> NetSet;
|
||||
typedef std::map<unsigned int,NetData*> NetDatas;
|
||||
typedef std::map<uint64_t,NetData*> NetDatas;
|
||||
|
||||
|
||||
class AnabaticEngine : public ToolEngine {
|
||||
|
@ -184,7 +184,7 @@ namespace Anabatic {
|
|||
static const Name& staticGetName ();
|
||||
virtual const Name& getName () const;
|
||||
virtual Configuration* getConfiguration ();
|
||||
inline unsigned int getDensityMode () const;
|
||||
inline uint64_t getDensityMode () const;
|
||||
inline CellViewer* getViewer () const;
|
||||
inline void setViewer ( CellViewer* );
|
||||
inline EngineState getState () const;
|
||||
|
@ -200,11 +200,11 @@ namespace Anabatic {
|
|||
size_t getNetsFromEdge ( const Edge*, NetSet& );
|
||||
virtual void openSession ();
|
||||
inline void setState ( EngineState state );
|
||||
inline void setDensityMode ( unsigned int );
|
||||
inline void setDensityMode ( uint64_t );
|
||||
inline void addOv ( Edge* );
|
||||
inline void removeOv ( Edge* );
|
||||
inline const NetDatas& getNetDatas () const;
|
||||
NetData* getNetData ( Net*, unsigned int flags=Flags::NoFlags );
|
||||
NetData* getNetData ( Net*, Flags flags=Flags::NoFlags );
|
||||
void setupNetDatas ();
|
||||
void updateMatrix ();
|
||||
// Dijkstra related functions.
|
||||
|
@ -239,12 +239,12 @@ namespace Anabatic {
|
|||
void chipPrep ();
|
||||
void setupSpecialNets ();
|
||||
void setupPreRouteds ();
|
||||
void loadGlobalRouting ( unsigned int method );
|
||||
void loadGlobalRouting ( uint32_t method );
|
||||
void computeNetConstraints ( Net* );
|
||||
void toOptimals ( Net* );
|
||||
void updateNetTopology ( Net* );
|
||||
bool moveUpNetTrunk ( AutoSegment*, set<Net*>& globalNets, GCell::Set& invalidateds );
|
||||
void layerAssign ( unsigned int method );
|
||||
void layerAssign ( uint32_t method );
|
||||
void finalizeLayout ();
|
||||
inline const AutoContactLut& _getAutoContactLut () const;
|
||||
inline const AutoSegmentLut& _getAutoSegmentLut () const;
|
||||
|
@ -304,7 +304,7 @@ namespace Anabatic {
|
|||
CellViewer* _viewer;
|
||||
Flags _flags;
|
||||
int _stamp;
|
||||
unsigned int _densityMode;
|
||||
uint64_t _densityMode;
|
||||
AutoSegmentLut _autoSegmentLut;
|
||||
AutoContactLut _autoContactLut;
|
||||
Net* _blockageNet;
|
||||
|
@ -322,8 +322,8 @@ namespace Anabatic {
|
|||
inline GCell* AnabaticEngine::getGCellUnder ( DbU::Unit x, DbU::Unit y ) const { return _matrix.getUnder(x,y); }
|
||||
inline GCell* AnabaticEngine::getGCellUnder ( Point p ) const { return _matrix.getUnder(p); }
|
||||
inline GCellsUnder AnabaticEngine::getGCellsUnder ( Segment* s ) const { return std::shared_ptr<RawGCellsUnder>( new RawGCellsUnder(this,s) ); }
|
||||
inline unsigned int AnabaticEngine::getDensityMode () const { return _densityMode; }
|
||||
inline void AnabaticEngine::setDensityMode ( unsigned int mode ) { _densityMode=mode; }
|
||||
inline uint64_t AnabaticEngine::getDensityMode () const { return _densityMode; }
|
||||
inline void AnabaticEngine::setDensityMode ( uint64_t mode ) { _densityMode=mode; }
|
||||
inline void AnabaticEngine::setBlockageNet ( Net* net ) { _blockageNet = net; }
|
||||
inline const AutoContactLut& AnabaticEngine::_getAutoContactLut () const { return _autoContactLut; }
|
||||
inline const AutoSegmentLut& AnabaticEngine::_getAutoSegmentLut () const { return _autoSegmentLut; }
|
||||
|
|
|
@ -31,6 +31,8 @@ namespace Anabatic {
|
|||
|
||||
using std::cerr;
|
||||
using std::endl;
|
||||
using Hurricane::order;
|
||||
using Hurricane::setInBound;
|
||||
using Hurricane::tab;
|
||||
using Hurricane::Name;
|
||||
using Hurricane::Net;
|
||||
|
@ -59,11 +61,12 @@ namespace Anabatic {
|
|||
, CntVTee = (1 << 4)
|
||||
, CntInvalidated = (1 << 6)
|
||||
, CntInvalidatedCache = (1 << 7)
|
||||
, CntInCreationStage = (1 << 8)
|
||||
, CntBadTopology = (1 << 9)
|
||||
, CntIgnoreAnchor = (1 << 10)
|
||||
, CntWeakTerminal = (1 << 11)
|
||||
, CntUserNativeConstraints = (1 << 12)
|
||||
, CntInvalidatedWidth = (1 << 8)
|
||||
, CntInCreationStage = (1 << 9)
|
||||
, CntBadTopology = (1 << 10)
|
||||
, CntIgnoreAnchor = (1 << 11)
|
||||
, CntWeakTerminal = (1 << 12)
|
||||
, CntUserNativeConstraints = (1 << 13)
|
||||
};
|
||||
|
||||
class AutoContact {
|
||||
|
@ -104,15 +107,16 @@ namespace Anabatic {
|
|||
inline bool isInCreationStage () const;
|
||||
inline bool isInvalidated () const;
|
||||
inline bool isInvalidatedCache () const;
|
||||
inline bool isInvalidatedWidth () const;
|
||||
inline bool isTerminal () const;
|
||||
inline bool isTurn () const;
|
||||
bool isTee ( unsigned int direction ) const;
|
||||
bool isTee ( Flags direction ) const;
|
||||
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 canDestroy ( Flags flags=Flags::NoFlags ) const;
|
||||
bool canMoveUp ( const AutoSegment* moved ) const;
|
||||
// Accessors.
|
||||
inline Contact* base () const;
|
||||
|
@ -125,13 +129,17 @@ namespace Anabatic {
|
|||
virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0;
|
||||
virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const = 0;
|
||||
virtual AutoSegment* getSegment ( unsigned int ) const = 0;
|
||||
virtual AutoHorizontal* getHorizontal1 () const;
|
||||
virtual AutoHorizontal* getHorizontal2 () const;
|
||||
virtual AutoVertical* getVertical1 () const;
|
||||
virtual AutoVertical* getVertical2 () const;
|
||||
void getDepthSpan ( size_t& minDepth, size_t& maxDepth ) const;
|
||||
inline unsigned int getMinDepth () const;
|
||||
inline unsigned int getMaxDepth () const;
|
||||
void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& );
|
||||
virtual Box getNativeConstraintBox () const;
|
||||
Interval getNativeUConstraints ( unsigned int direction ) const;
|
||||
Interval getUConstraints ( unsigned int direction ) const;
|
||||
Interval getNativeUConstraints ( Flags direction ) const;
|
||||
Interval getUConstraints ( Flags direction ) const;
|
||||
inline DbU::Unit getCBXMin () const;
|
||||
inline DbU::Unit getCBXMax () const;
|
||||
inline DbU::Unit getCBYMin () const;
|
||||
|
@ -141,17 +149,18 @@ namespace Anabatic {
|
|||
// Collections.
|
||||
AutoSegments getAutoSegments ();
|
||||
// Modifiers.
|
||||
void invalidate ( unsigned int flags=0 );
|
||||
void invalidate ( Flags flags=Flags::NoFlags );
|
||||
virtual void cacheDetach ( AutoSegment* ) = 0;
|
||||
virtual void cacheAttach ( AutoSegment* ) = 0;
|
||||
virtual void updateCache () = 0;
|
||||
void updateSize ();
|
||||
virtual void updateGeometry () = 0;
|
||||
virtual void updateTopology () = 0;
|
||||
void showTopologyError ( const std::string&, unsigned int flags=0 );
|
||||
void showTopologyError ( const std::string&, Flags flags=Flags::NoFlags );
|
||||
virtual void checkTopology ();
|
||||
virtual void forceOnGrid ( Point );
|
||||
inline void setFlags ( unsigned int );
|
||||
inline void unsetFlags ( unsigned int );
|
||||
inline void setFlags ( Flags );
|
||||
inline void unsetFlags ( Flags );
|
||||
void setGCell ( GCell* );
|
||||
inline void setCBXMin ( DbU::Unit xMin );
|
||||
inline void setCBXMax ( DbU::Unit xMax );
|
||||
|
@ -160,7 +169,7 @@ namespace Anabatic {
|
|||
void setConstraintBox ( const Box& box );
|
||||
bool restrictConstraintBox ( DbU::Unit constraintMin
|
||||
, DbU::Unit constraintMax
|
||||
, unsigned int flags=Flags::WarnOnError );
|
||||
, Flags flags=Flags::WarnOnError );
|
||||
void restoreNativeConstraintBox ();
|
||||
void migrateConstraintBox ( AutoContact* other );
|
||||
void destroy ();
|
||||
|
@ -179,7 +188,7 @@ namespace Anabatic {
|
|||
size_t _id;
|
||||
Contact* _contact;
|
||||
GCell* _gcell;
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
DbU::Unit _xMin;
|
||||
DbU::Unit _xMax;
|
||||
DbU::Unit _yMin;
|
||||
|
@ -200,7 +209,7 @@ namespace Anabatic {
|
|||
inline int _boundX ( DbU::Unit x ) const;
|
||||
inline int _boundY ( DbU::Unit x ) const;
|
||||
static void _getTopology ( Contact*, Component*& anchor, Horizontal**&, Vertical**&, size_t );
|
||||
virtual void _invalidate ( unsigned int flags ) = 0;
|
||||
virtual void _invalidate ( Flags flags ) = 0;
|
||||
};
|
||||
|
||||
|
||||
|
@ -236,6 +245,7 @@ namespace Anabatic {
|
|||
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::isInvalidatedWidth () const { return _flags&CntInvalidatedWidth; }
|
||||
inline bool AutoContact::isTurn () const { return _flags&CntTurn; }
|
||||
inline bool AutoContact::isFixed () const { return _flags&CntFixed; }
|
||||
inline bool AutoContact::isUserNativeConstraints () const { return _flags&CntUserNativeConstraints; }
|
||||
|
@ -251,8 +261,8 @@ namespace Anabatic {
|
|||
inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _xMax = _boundX(xMax); }
|
||||
inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _yMin = _boundY(yMin); }
|
||||
inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _yMax = _boundY(yMax); }
|
||||
inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; }
|
||||
inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; }
|
||||
inline void AutoContact::setFlags ( Flags flags ) { _flags|= flags; }
|
||||
inline void AutoContact::unsetFlags ( Flags flags ) { _flags&=~flags; }
|
||||
inline DbU::Unit AutoContact::getCBXMin () const { return isFixed() ? _contact->getX() : _xMin; }
|
||||
inline DbU::Unit AutoContact::getCBXMax () const { return isFixed() ? _contact->getX() : _xMax; }
|
||||
inline DbU::Unit AutoContact::getCBYMin () const { return isFixed() ? _contact->getY() : _yMin; }
|
||||
|
@ -277,7 +287,7 @@ namespace Anabatic {
|
|||
|
||||
class LocatorHelper {
|
||||
public:
|
||||
inline LocatorHelper ( AutoContact*, unsigned int flags=0 );
|
||||
inline LocatorHelper ( AutoContact*, Flags flags=Flags::NoFlags );
|
||||
inline bool isValid () const;
|
||||
inline AutoSegment* getSegment () const;
|
||||
inline void progress ();
|
||||
|
@ -285,22 +295,22 @@ namespace Anabatic {
|
|||
inline unsigned int _min () const;
|
||||
inline unsigned int _max () const;
|
||||
private:
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
unsigned int _index;
|
||||
AutoContact* _contact;
|
||||
};
|
||||
|
||||
|
||||
inline LocatorHelper::LocatorHelper ( AutoContact* contact, unsigned int flags )
|
||||
inline LocatorHelper::LocatorHelper ( AutoContact* contact, Flags flags )
|
||||
: _flags(flags), _index(_min()), _contact(contact)
|
||||
{
|
||||
cdebug_tabw(145,1);
|
||||
cdebug_log(145,0) << "CTOR LocatorHelper " << contact->_getString() << endl;
|
||||
cdebug_log(145,0) << "+ _min():" << _min() << endl;
|
||||
cdebug_log(145,0) << "+ _max():" << _max() << endl;
|
||||
cdebug_log(145,0) << "+ getSegment(_min()):" << _contact->getSegment(_min()) << endl;
|
||||
cdebug_tabw(144,1);
|
||||
cdebug_log(144,0) << "CTOR LocatorHelper " << contact->_getString() << endl;
|
||||
cdebug_log(144,0) << "+ _min():" << _min() << endl;
|
||||
cdebug_log(144,0) << "+ _max():" << _max() << endl;
|
||||
cdebug_log(144,0) << "+ getSegment(_min()):" << _contact->getSegment(_min()) << endl;
|
||||
if (not _contact->getSegment(_index)) progress();
|
||||
cdebug_tabw(145,-1);
|
||||
cdebug_tabw(144,-1);
|
||||
}
|
||||
|
||||
inline bool LocatorHelper::isValid () const
|
||||
|
@ -314,37 +324,26 @@ namespace Anabatic {
|
|||
|
||||
inline AutoSegment* LocatorHelper::getSegment () const
|
||||
{
|
||||
cdebug_log(145,0) << "LocatorHelper::getSegment(" << _index << ") - " << _contact->getSegment(_index) << endl;
|
||||
cdebug_log(144,0) << " LocatorHelper::getSegment(" << _index << ") - " << _contact->getSegment(_index) << endl;
|
||||
return (_index < _max()) ? _contact->getSegment(_index) : NULL;
|
||||
}
|
||||
|
||||
inline void LocatorHelper::progress ()
|
||||
{
|
||||
cdebug_tabw(145,1);
|
||||
cdebug_tabw(144,1);
|
||||
++_index;
|
||||
cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
|
||||
cdebug_log(144,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
|
||||
while ((_index < _max()) and (_contact->getSegment(_index) == NULL)) {
|
||||
++_index;
|
||||
cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
|
||||
cdebug_log(144,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
|
||||
}
|
||||
cdebug_tabw(145,-1);
|
||||
cdebug_tabw(144,-1);
|
||||
}
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Helper Functions.
|
||||
|
||||
|
||||
template<typename Type>inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
|
||||
|
||||
inline DbU::Unit setInBound ( DbU::Unit lower, DbU::Unit upper, DbU::Unit& value )
|
||||
{
|
||||
if ( lower > value ) value = lower;
|
||||
if ( upper < value ) value = upper;
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
inline size_t abssub ( size_t a, size_t b ) { return (a>b) ? a-b : b-a; }
|
||||
|
||||
|
||||
|
|
|
@ -39,11 +39,11 @@ namespace Anabatic {
|
|||
// Constructors & Destructors.
|
||||
AutoContactHTee ( GCell*, Contact* );
|
||||
virtual ~AutoContactHTee ();
|
||||
virtual void _invalidate ( unsigned int flags );
|
||||
virtual void _invalidate ( Flags flags );
|
||||
public:
|
||||
inline AutoHorizontal* getHorizontal1 () const;
|
||||
inline AutoHorizontal* getHorizontal2 () const;
|
||||
inline AutoVertical* getVertical1 () const;
|
||||
virtual AutoHorizontal* getHorizontal1 () const;
|
||||
virtual AutoHorizontal* getHorizontal2 () const;
|
||||
virtual AutoVertical* getVertical1 () const;
|
||||
virtual AutoSegment* getOpposite ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getSegment ( unsigned int ) const;
|
||||
|
@ -61,11 +61,6 @@ namespace Anabatic {
|
|||
AutoHorizontal* _horizontal2;
|
||||
AutoVertical* _vertical1;
|
||||
};
|
||||
|
||||
|
||||
inline AutoHorizontal* AutoContactHTee::getHorizontal1 () const { return _horizontal1; };
|
||||
inline AutoHorizontal* AutoContactHTee::getHorizontal2 () const { return _horizontal2; };
|
||||
inline AutoVertical* AutoContactHTee::getVertical1 () const { return _vertical1; };
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace Anabatic {
|
|||
// Constructors & Destructors.
|
||||
AutoContactTerminal ( GCell*, Contact* );
|
||||
virtual ~AutoContactTerminal ();
|
||||
virtual void _invalidate ( unsigned int flags );
|
||||
virtual void _invalidate ( Flags flags );
|
||||
public:
|
||||
bool isEndPoint () const;
|
||||
virtual Box getNativeConstraintBox () const;
|
||||
|
|
|
@ -38,10 +38,10 @@ namespace Anabatic {
|
|||
// Constructors & Destructors.
|
||||
AutoContactTurn ( GCell*, Contact* );
|
||||
virtual ~AutoContactTurn ();
|
||||
virtual void _invalidate ( unsigned int flags );
|
||||
virtual void _invalidate ( Flags flags );
|
||||
public:
|
||||
inline AutoHorizontal* getHorizontal1 () const;
|
||||
inline AutoVertical* getVertical1 () const;
|
||||
virtual AutoHorizontal* getHorizontal1 () const;
|
||||
virtual AutoVertical* getVertical1 () const;
|
||||
virtual AutoSegment* getOpposite ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getSegment ( unsigned int ) const;
|
||||
|
@ -59,10 +59,6 @@ namespace Anabatic {
|
|||
AutoVertical* _vertical1;
|
||||
};
|
||||
|
||||
|
||||
inline AutoHorizontal* AutoContactTurn::getHorizontal1 () const { return _horizontal1; };
|
||||
inline AutoVertical* AutoContactTurn::getVertical1 () const { return _vertical1; };
|
||||
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
|
|
@ -36,11 +36,11 @@ namespace Anabatic {
|
|||
// Constructors & Destructors.
|
||||
AutoContactVTee ( GCell*, Contact* );
|
||||
virtual ~AutoContactVTee ();
|
||||
virtual void _invalidate ( unsigned int flags );
|
||||
virtual void _invalidate ( Flags flags );
|
||||
public:
|
||||
inline AutoHorizontal* getHorizontal1 () const;
|
||||
inline AutoVertical* getVertical1 () const;
|
||||
inline AutoVertical* getVertical2 () const;
|
||||
virtual AutoHorizontal* getHorizontal1 () const;
|
||||
virtual AutoVertical* getVertical1 () const;
|
||||
virtual AutoVertical* getVertical2 () const;
|
||||
virtual AutoSegment* getOpposite ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const;
|
||||
virtual AutoSegment* getSegment ( unsigned int ) const;
|
||||
|
@ -60,11 +60,6 @@ namespace Anabatic {
|
|||
};
|
||||
|
||||
|
||||
inline AutoHorizontal* AutoContactVTee::getHorizontal1 () const { return _horizontal1; };
|
||||
inline AutoVertical* AutoContactVTee::getVertical1 () const { return _vertical1; };
|
||||
inline AutoVertical* AutoContactVTee::getVertical2 () const { return _vertical2; };
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
||||
|
||||
|
|
|
@ -46,8 +46,8 @@ namespace Anabatic {
|
|||
virtual DbU::Unit getDuTarget () const;
|
||||
virtual Interval getSpanU () const;
|
||||
virtual bool getConstraints ( DbU::Unit& min , DbU::Unit& max ) const;
|
||||
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
||||
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
||||
virtual Interval getSourceConstraints ( Flags flags=0 ) const;
|
||||
virtual Interval getTargetConstraints ( Flags flags=0 ) const;
|
||||
virtual Flags getDirection () const;
|
||||
virtual size_t getGCells ( vector<GCell*>& ) const;
|
||||
// Modifiers.
|
||||
|
@ -59,10 +59,10 @@ namespace Anabatic {
|
|||
virtual void updateNativeConstraints ();
|
||||
virtual bool checkPositions () const;
|
||||
virtual bool checkConstraints () const;
|
||||
virtual unsigned int _makeDogleg ( GCell*, unsigned int flags );
|
||||
virtual Flags _makeDogleg ( GCell*, Flags flags );
|
||||
virtual bool moveULeft ();
|
||||
virtual bool moveURight ();
|
||||
virtual bool _slacken ( unsigned int flags );
|
||||
virtual bool _slacken ( Flags flags );
|
||||
#if THIS_IS_DISABLED
|
||||
virtual void desalignate ( AutoContact* );
|
||||
#endif
|
||||
|
|
|
@ -60,52 +60,55 @@ namespace Anabatic {
|
|||
// -------------------------------------------------------------------
|
||||
// Class : "AutoSegment".
|
||||
|
||||
enum AutoSegmentFlag { SegNoFlags = 0x0
|
||||
, SegHorizontal = (1<< 0)
|
||||
, SegFixed = (1<< 1)
|
||||
, SegGlobal = (1<< 2)
|
||||
, SegWeakGlobal = (1<< 3)
|
||||
, SegLongLocal = (1<< 4)
|
||||
, SegCanonical = (1<< 5)
|
||||
, SegBipoint = (1<< 6)
|
||||
, SegDogleg = (1<< 7)
|
||||
, SegStrap = (1<< 8)
|
||||
, SegSourceTop = (1<< 9)
|
||||
, SegSourceBottom = (1<<10)
|
||||
, SegTargetTop = (1<<11)
|
||||
, SegTargetBottom = (1<<12)
|
||||
, SegIsReduced = (1<<13)
|
||||
, SegLayerChange = (1<<14)
|
||||
, SegSourceTerminal = (1<<15) // Replace Terminal.
|
||||
, SegTargetTerminal = (1<<16) // Replace Terminal.
|
||||
, SegStrongTerminal = SegSourceTerminal|SegTargetTerminal
|
||||
, SegWeakTerminal1 = (1<<17) // Replace TopologicalEnd.
|
||||
, SegWeakTerminal2 = (1<<18) // Replace TopologicalEnd.
|
||||
, SegNotSourceAligned = (1<<19)
|
||||
, SegNotTargetAligned = (1<<20)
|
||||
, SegUnbound = (1<<21)
|
||||
, SegHalfSlackened = (1<<22)
|
||||
, SegSlackened = (1<<23)
|
||||
, SegAxisSet = (1<<24)
|
||||
, SegInvalidated = (1<<25)
|
||||
, SegInvalidatedSource = (1<<26)
|
||||
, SegInvalidatedTarget = (1<<27)
|
||||
, SegInvalidatedLayer = (1<<28)
|
||||
, SegCreated = (1<<29)
|
||||
, SegUserDefined = (1<<30)
|
||||
// Masks.
|
||||
, SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2
|
||||
, SegNotAligned = SegNotSourceAligned|SegNotTargetAligned
|
||||
, SegSpinTop = SegSourceTop |SegTargetTop
|
||||
, SegSpinBottom = SegSourceBottom |SegTargetBottom
|
||||
, SegDepthSpin = SegSpinTop |SegSpinBottom
|
||||
};
|
||||
|
||||
|
||||
class AutoSegment {
|
||||
friend class AutoHorizontal;
|
||||
friend class AutoVertical;
|
||||
|
||||
public:
|
||||
static const uint64_t SegNoFlags = 0L;
|
||||
static const uint64_t SegHorizontal = (1L<< 0);
|
||||
static const uint64_t SegFixed = (1L<< 1);
|
||||
static const uint64_t SegGlobal = (1L<< 2);
|
||||
static const uint64_t SegWeakGlobal = (1L<< 3);
|
||||
static const uint64_t SegLongLocal = (1L<< 4);
|
||||
static const uint64_t SegCanonical = (1L<< 5);
|
||||
static const uint64_t SegBipoint = (1L<< 6);
|
||||
static const uint64_t SegDogleg = (1L<< 7);
|
||||
static const uint64_t SegStrap = (1L<< 8);
|
||||
static const uint64_t SegSourceTop = (1L<< 9);
|
||||
static const uint64_t SegSourceBottom = (1L<<10);
|
||||
static const uint64_t SegTargetTop = (1L<<11);
|
||||
static const uint64_t SegTargetBottom = (1L<<12);
|
||||
static const uint64_t SegIsReduced = (1L<<13);
|
||||
static const uint64_t SegLayerChange = (1L<<14);
|
||||
static const uint64_t SegSourceTerminal = (1L<<15); // Replace Terminal.
|
||||
static const uint64_t SegTargetTerminal = (1L<<16); // Replace Terminal.
|
||||
static const uint64_t SegStrongTerminal = SegSourceTerminal|SegTargetTerminal;
|
||||
static const uint64_t SegWeakTerminal1 = (1L<<17); // Replace TopologicalEnd.
|
||||
static const uint64_t SegWeakTerminal2 = (1L<<18); // Replace TopologicalEnd.
|
||||
static const uint64_t SegNotSourceAligned = (1L<<19);
|
||||
static const uint64_t SegNotTargetAligned = (1L<<20);
|
||||
static const uint64_t SegUnbound = (1L<<21);
|
||||
static const uint64_t SegHalfSlackened = (1L<<22);
|
||||
static const uint64_t SegSlackened = (1L<<23);
|
||||
static const uint64_t SegAxisSet = (1L<<24);
|
||||
static const uint64_t SegInvalidated = (1L<<25);
|
||||
static const uint64_t SegInvalidatedSource = (1L<<26);
|
||||
static const uint64_t SegInvalidatedTarget = (1L<<27);
|
||||
static const uint64_t SegInvalidatedLayer = (1L<<28);
|
||||
static const uint64_t SegCreated = (1L<<29);
|
||||
static const uint64_t SegUserDefined = (1L<<30);
|
||||
static const uint64_t SegAnalog = (1L<<31);
|
||||
static const uint64_t SegWide = (1L<<32);
|
||||
// Masks.
|
||||
static const uint64_t SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2;
|
||||
static const uint64_t SegNotAligned = SegNotSourceAligned|SegNotTargetAligned;
|
||||
static const uint64_t SegSpinTop = SegSourceTop |SegTargetTop;
|
||||
static const uint64_t SegSpinBottom = SegSourceBottom |SegTargetBottom;
|
||||
static const uint64_t SegDepthSpin = SegSpinTop |SegSpinBottom;
|
||||
|
||||
public:
|
||||
class Observable : public StaticObservable<1> {
|
||||
public:
|
||||
|
@ -118,23 +121,24 @@ namespace Anabatic {
|
|||
Observable& operator= ( const StaticObservable& );
|
||||
};
|
||||
public:
|
||||
enum ObserverFlag { Create = 0x000000001
|
||||
, Destroy = 0x000000002
|
||||
, Invalidate = 0x000000004
|
||||
, Revalidate = 0x000000008
|
||||
, RevalidatePPitch = 0x000000010
|
||||
enum ObserverFlag { Create = (1 << 0)
|
||||
, Destroy = (1 << 1)
|
||||
, Invalidate = (1 << 2)
|
||||
, Revalidate = (1 << 3)
|
||||
, RevalidatePPitch = (1 << 4)
|
||||
};
|
||||
public:
|
||||
typedef std::function< void(AutoSegment*) > RevalidateCb_t;
|
||||
public:
|
||||
static void setDestroyMode ( bool );
|
||||
static void setAnalogMode ( bool );
|
||||
static bool getAnalogMode ();
|
||||
static AutoSegment* create ( AutoContact* source
|
||||
, AutoContact* target
|
||||
, Segment* hurricaneSegment
|
||||
);
|
||||
static AutoSegment* create ( AutoContact* source
|
||||
, AutoContact* target
|
||||
, unsigned int dir
|
||||
, Flags dir
|
||||
, size_t depth=RoutingGauge::nlayerdepth
|
||||
);
|
||||
void destroy ();
|
||||
|
@ -156,6 +160,7 @@ namespace Anabatic {
|
|||
virtual DbU::Unit getX () const;
|
||||
virtual DbU::Unit getY () const;
|
||||
inline DbU::Unit getWidth () const;
|
||||
inline DbU::Unit getContactWidth () const;
|
||||
inline DbU::Unit getLength () const;
|
||||
inline DbU::Unit getSourcePosition () const;
|
||||
inline DbU::Unit getTargetPosition () const;
|
||||
|
@ -181,7 +186,7 @@ namespace Anabatic {
|
|||
inline bool isNotSourceAligned () const;
|
||||
inline bool isNotTargetAligned () const;
|
||||
inline bool isNotAligned () const;
|
||||
bool isStrongTerminal ( unsigned int flags=0 ) const;
|
||||
bool isStrongTerminal ( Flags flags=Flags::NoFlags ) const;
|
||||
inline bool isSourceTerminal () const;
|
||||
inline bool isTargetTerminal () const;
|
||||
inline bool isLayerChange () const;
|
||||
|
@ -201,22 +206,24 @@ namespace Anabatic {
|
|||
inline bool isUserDefined () const;
|
||||
bool isReduceCandidate () const;
|
||||
bool isUTurn () const;
|
||||
inline bool isAnalog () const;
|
||||
inline bool isWide () const;
|
||||
virtual bool _canSlacken () const = 0;
|
||||
bool canReduce () const;
|
||||
bool mustRaise () const;
|
||||
unsigned int canDogleg ( Interval );
|
||||
Flags canDogleg ( Interval );
|
||||
virtual bool canMoveULeft ( float reserve=0.0 ) const = 0;
|
||||
virtual bool canMoveURight ( float reserve=0.0 ) const = 0;
|
||||
bool canMoveUp ( float reserve=0.0, unsigned int flags=0 ) const;
|
||||
bool canPivotUp ( float reserve=0.0, unsigned int flags=0 ) const;
|
||||
bool canPivotDown ( float reserve=0.0, unsigned int flags=0 ) const;
|
||||
bool canSlacken ( unsigned int flags=0 ) const;
|
||||
bool canMoveUp ( float reserve=0.0, Flags flags=Flags::NoFlags ) const;
|
||||
bool canPivotUp ( float reserve=0.0, Flags flags=Flags::NoFlags ) const;
|
||||
bool canPivotDown ( float reserve=0.0, Flags flags=Flags::NoFlags ) const;
|
||||
bool canSlacken ( Flags flags=Flags::NoFlags ) const;
|
||||
virtual bool checkPositions () const = 0;
|
||||
virtual bool checkConstraints () const = 0;
|
||||
bool checkDepthSpin () const;
|
||||
// Accessors.
|
||||
inline unsigned long getId () const;
|
||||
inline unsigned int getFlags () const;
|
||||
inline uint64_t getFlags () const;
|
||||
virtual Flags getDirection () const = 0;
|
||||
inline GCell* getGCell () const;
|
||||
virtual size_t getGCells ( vector<GCell*>& ) const = 0;
|
||||
|
@ -228,6 +235,7 @@ namespace Anabatic {
|
|||
inline unsigned int getDepth () const;
|
||||
inline DbU::Unit getPitch () const;
|
||||
DbU::Unit getPPitch () const;
|
||||
DbU::Unit getExtensionCap () const;
|
||||
inline DbU::Unit getAxis () const;
|
||||
virtual DbU::Unit getSourceU () const = 0;
|
||||
virtual DbU::Unit getTargetU () const = 0;
|
||||
|
@ -237,8 +245,8 @@ namespace Anabatic {
|
|||
inline DbU::Unit getExtremity () const;
|
||||
virtual Interval getSpanU () const = 0;
|
||||
Interval getMinSpanU () const;
|
||||
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const = 0;
|
||||
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const = 0;
|
||||
virtual Interval getSourceConstraints ( Flags flags=Flags::NoFlags ) const = 0;
|
||||
virtual Interval getTargetConstraints ( Flags flags=Flags::NoFlags ) const = 0;
|
||||
virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const = 0;
|
||||
inline bool getConstraints ( Interval& i ) const;
|
||||
inline const Interval& getUserConstraints () const;
|
||||
|
@ -252,11 +260,11 @@ namespace Anabatic {
|
|||
virtual DbU::Unit getCost ( DbU::Unit axis ) const;
|
||||
virtual AutoSegment* getCanonical ( DbU::Unit& min , DbU::Unit& max );
|
||||
inline AutoSegment* getCanonical ( Interval& i );
|
||||
float getMaxUnderDensity ( unsigned int flags );
|
||||
float getMaxUnderDensity ( Flags flags );
|
||||
// Modifiers.
|
||||
inline void unsetFlags ( unsigned int );
|
||||
inline void setFlags ( unsigned int );
|
||||
void setFlagsOnAligneds ( unsigned int );
|
||||
inline void unsetFlags ( uint64_t );
|
||||
inline void setFlags ( uint64_t );
|
||||
void setFlagsOnAligneds ( uint64_t );
|
||||
inline void incReduceds ();
|
||||
inline void decReduceds ();
|
||||
virtual void setDuSource ( DbU::Unit du ) = 0;
|
||||
|
@ -283,36 +291,36 @@ namespace Anabatic {
|
|||
inline void setParent ( AutoSegment* );
|
||||
void revalidate ();
|
||||
AutoSegment* makeDogleg ( AutoContact* );
|
||||
unsigned int makeDogleg ( Interval, unsigned int flags=Flags::NoFlags );
|
||||
unsigned int makeDogleg ( GCell*, unsigned int flags=Flags::NoFlags );
|
||||
virtual unsigned int _makeDogleg ( GCell*, unsigned int flags ) = 0;
|
||||
Flags makeDogleg ( Interval, Flags flags=Flags::NoFlags );
|
||||
Flags makeDogleg ( GCell* , Flags flags=Flags::NoFlags );
|
||||
virtual Flags _makeDogleg ( GCell* , Flags flags ) = 0;
|
||||
virtual bool moveULeft () = 0;
|
||||
virtual bool moveURight () = 0;
|
||||
bool slacken ( unsigned int flags );
|
||||
virtual bool _slacken ( unsigned int flags ) = 0;
|
||||
void _changeDepth ( unsigned int depth, unsigned int flags );
|
||||
void changeDepth ( unsigned int depth, unsigned int flags );
|
||||
bool moveUp ( unsigned int flags=Flags::NoFlags );
|
||||
bool moveDown ( unsigned int flags=Flags::NoFlags );
|
||||
bool slacken ( Flags flags );
|
||||
virtual bool _slacken ( Flags flags ) = 0;
|
||||
void _changeDepth ( unsigned int depth, Flags flags );
|
||||
void changeDepth ( unsigned int depth, Flags flags );
|
||||
bool moveUp ( Flags flags=Flags::NoFlags );
|
||||
bool moveDown ( Flags flags=Flags::NoFlags );
|
||||
bool reduceDoglegLayer ();
|
||||
bool reduce ();
|
||||
bool raise ();
|
||||
// Canonical Modifiers.
|
||||
AutoSegment* canonize ( unsigned int flags=Flags::NoFlags );
|
||||
virtual void invalidate ( unsigned int flags=Flags::Propagate );
|
||||
AutoSegment* canonize ( Flags flags=Flags::NoFlags );
|
||||
virtual void invalidate ( Flags flags=Flags::Propagate );
|
||||
void invalidate ( AutoContact* );
|
||||
void computeOptimal ( set<AutoSegment*>& processeds );
|
||||
void setAxis ( DbU::Unit, unsigned int flags=Flags::NoFlags );
|
||||
bool toConstraintAxis ( unsigned int flags=Flags::Realignate );
|
||||
bool toOptimalAxis ( unsigned int flags=Flags::Realignate );
|
||||
void setAxis ( DbU::Unit, Flags flags=Flags::NoFlags );
|
||||
bool toConstraintAxis ( Flags flags=Flags::Realignate );
|
||||
bool toOptimalAxis ( Flags flags=Flags::Realignate );
|
||||
// Collections & Filters.
|
||||
AutoSegments getOnSourceContact ( unsigned int direction );
|
||||
AutoSegments getOnTargetContact ( unsigned int direction );
|
||||
AutoSegments getCachedOnSourceContact ( unsigned int direction );
|
||||
AutoSegments getCachedOnTargetContact ( unsigned int direction );
|
||||
AutoSegments getAligneds ( unsigned int flags=Flags::NoFlags );
|
||||
AutoSegments getConnecteds ( unsigned int flags=Flags::NoFlags );
|
||||
AutoSegments getPerpandiculars ();
|
||||
AutoSegments getOnSourceContact ( Flags direction );
|
||||
AutoSegments getOnTargetContact ( Flags direction );
|
||||
AutoSegments getCachedOnSourceContact ( Flags direction );
|
||||
AutoSegments getCachedOnTargetContact ( Flags direction );
|
||||
AutoSegments getAligneds ( Flags flags=Flags::NoFlags );
|
||||
AutoSegments getConnecteds ( Flags flags=Flags::NoFlags );
|
||||
AutoSegments getPerpandiculars ( Flags flags=Flags::NoFlags );
|
||||
size_t getAlignedContacts ( map<AutoContact*,int>& ) const ;
|
||||
// Observers.
|
||||
template< typename OwnerT >
|
||||
|
@ -330,20 +338,18 @@ namespace Anabatic {
|
|||
bool shearUp ( GCell*
|
||||
, AutoSegment*& movedUp
|
||||
, float reserve
|
||||
, unsigned int flags );
|
||||
, Flags flags );
|
||||
#endif
|
||||
|
||||
protected:
|
||||
// Internal: Static Attributes.
|
||||
static size_t _allocateds;
|
||||
static size_t _globalsCount;
|
||||
static bool _destroyBase;
|
||||
static bool _destroyTool;
|
||||
static unsigned long _maxId;
|
||||
static bool _analogMode;
|
||||
// Internal: Attributes.
|
||||
const unsigned long _id;
|
||||
GCell* _gcell;
|
||||
unsigned int _flags;
|
||||
uint64_t _flags;
|
||||
unsigned int _depth : 8;
|
||||
unsigned int _optimalMin :16;
|
||||
unsigned int _optimalMax :16;
|
||||
|
@ -367,7 +373,7 @@ namespace Anabatic {
|
|||
AutoSegment& operator= ( const AutoSegment& );
|
||||
protected:
|
||||
void _invalidate ();
|
||||
inline unsigned int _getFlags () const;
|
||||
inline uint64_t _getFlags () const;
|
||||
std::string _getStringFlags () const;
|
||||
virtual void _setAxis ( DbU::Unit ) = 0;
|
||||
|
||||
|
@ -388,19 +394,20 @@ namespace Anabatic {
|
|||
|
||||
// Static Utilities.
|
||||
public:
|
||||
static inline unsigned int swapSourceTargetFlags ( AutoSegment* );
|
||||
static inline uint64_t swapSourceTargetFlags ( AutoSegment* );
|
||||
static inline bool areAlignedsAndDiffLayer ( AutoSegment*, AutoSegment* );
|
||||
static bool isTopologicalBound ( AutoSegment* seed, unsigned int flags );
|
||||
static AutoSegment* getGlobalThroughDogleg ( AutoSegment* dogleg, AutoContact* from );
|
||||
static bool isTopologicalBound ( AutoSegment* seed, Flags flags );
|
||||
static inline bool arePerpandiculars ( AutoSegment* a, AutoSegment* b );
|
||||
static inline bool arePerpandiculars ( bool isHorizontalA, AutoSegment* b );
|
||||
static inline bool areAligneds ( AutoSegment* a, AutoSegment* b );
|
||||
static unsigned int getPerpandicularState ( AutoContact* contact
|
||||
static Flags getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, bool isHorizontalMaster
|
||||
, const Layer* masterLayer=NULL
|
||||
);
|
||||
static inline unsigned int getPerpandicularState ( AutoContact* contact
|
||||
static inline Flags getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, AutoSegment* master
|
||||
|
@ -491,11 +498,13 @@ namespace Anabatic {
|
|||
inline bool AutoSegment::isInvalidatedLayer () const { return _flags & SegInvalidatedLayer; }
|
||||
inline bool AutoSegment::isCreated () const { return _flags & SegCreated; }
|
||||
inline bool AutoSegment::isUserDefined () const { return _flags & SegUserDefined; }
|
||||
inline void AutoSegment::setFlags ( unsigned int flags ) { _flags |= flags; }
|
||||
inline void AutoSegment::unsetFlags ( unsigned int flags ) { _flags &= ~flags; }
|
||||
inline bool AutoSegment::isAnalog () const { return _flags & SegAnalog; }
|
||||
inline bool AutoSegment::isWide () const { return _flags & SegWide; }
|
||||
inline void AutoSegment::setFlags ( uint64_t flags ) { _flags |= flags; }
|
||||
inline void AutoSegment::unsetFlags ( uint64_t flags ) { _flags &= ~flags; }
|
||||
|
||||
inline unsigned int AutoSegment::getFlags () const { return _flags; }
|
||||
inline unsigned int AutoSegment::_getFlags () const { return _flags; }
|
||||
inline uint64_t AutoSegment::getFlags () const { return _flags; }
|
||||
inline uint64_t AutoSegment::_getFlags () const { return _flags; }
|
||||
inline void AutoSegment::incReduceds () { if (_reduceds<3) ++_reduceds; }
|
||||
inline void AutoSegment::decReduceds () { if (_reduceds>0) --_reduceds; }
|
||||
inline void AutoSegment::setLayer ( const Layer* layer ) { base()->setLayer(layer); _depth=Session::getLayerDepth(layer); }
|
||||
|
@ -507,6 +516,11 @@ namespace Anabatic {
|
|||
//inline void AutoSegment::mergeUserConstraints ( const Interval& constraints ) { _userConstraints.intersection(constraints); }
|
||||
inline void AutoSegment::resetUserConstraints () { _userConstraints = Interval(false); }
|
||||
|
||||
|
||||
inline DbU::Unit AutoSegment::getContactWidth () const
|
||||
{ return getWidth() + Session::getViaWidth(getLayer()) - Session::getWireWidth(getLayer()); }
|
||||
|
||||
|
||||
inline void AutoSegment::setParent ( AutoSegment* parent )
|
||||
{
|
||||
if ( parent == this ) {
|
||||
|
@ -518,19 +532,16 @@ namespace Anabatic {
|
|||
|
||||
inline bool AutoSegment::CompareId::operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const
|
||||
{ return lhs->getId() < rhs->getId(); }
|
||||
|
||||
inline unsigned long AutoSegment::getMaxId ()
|
||||
{ return _maxId; }
|
||||
|
||||
inline unsigned int AutoSegment::swapSourceTargetFlags ( AutoSegment* segment )
|
||||
|
||||
inline uint64_t AutoSegment::swapSourceTargetFlags ( AutoSegment* segment )
|
||||
{
|
||||
unsigned int segFlags = segment->getFlags();
|
||||
unsigned int swapFlags = segment->getFlags() & ~(SegSourceTop |SegTargetTop
|
||||
|SegSourceBottom |SegTargetBottom
|
||||
|SegSourceTerminal |SegTargetTerminal
|
||||
|SegNotSourceAligned |SegNotTargetAligned
|
||||
|SegInvalidatedSource|SegInvalidatedTarget
|
||||
);
|
||||
uint64_t segFlags = segment->getFlags();
|
||||
uint64_t swapFlags = segment->getFlags() & ~(SegSourceTop |SegTargetTop
|
||||
|SegSourceBottom |SegTargetBottom
|
||||
|SegSourceTerminal |SegTargetTerminal
|
||||
|SegNotSourceAligned |SegNotTargetAligned
|
||||
|SegInvalidatedSource|SegInvalidatedTarget
|
||||
);
|
||||
|
||||
swapFlags |= (segFlags & SegSourceTop ) ? SegTargetTop : SegNoFlags;
|
||||
swapFlags |= (segFlags & SegSourceBottom ) ? SegTargetBottom : SegNoFlags;
|
||||
|
@ -560,10 +571,10 @@ namespace Anabatic {
|
|||
inline bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b )
|
||||
{ return a and b and (a->isHorizontal() == b->isHorizontal()); }
|
||||
|
||||
inline unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, AutoSegment* master )
|
||||
inline Flags AutoSegment::getPerpandicularState ( AutoContact* contact
|
||||
, AutoSegment* source
|
||||
, AutoSegment* current
|
||||
, AutoSegment* master )
|
||||
{
|
||||
return getPerpandicularState ( contact, source, current, master->isHorizontal(), master->getLayer() );
|
||||
}
|
||||
|
|
|
@ -218,7 +218,7 @@ namespace Anabatic {
|
|||
// Sub-Class: Locator.
|
||||
class Locator : public AutoSegmentHL {
|
||||
public:
|
||||
inline Locator ( AutoSegment* segment , unsigned int flags );
|
||||
inline Locator ( AutoSegment* segment , Flags flags );
|
||||
inline Locator ( const Locator &locator );
|
||||
virtual AutoSegment* getElement () const;
|
||||
virtual AutoSegmentHL* getClone () const;
|
||||
|
@ -226,14 +226,14 @@ namespace Anabatic {
|
|||
virtual void progress ();
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
AutoSegment* _master;
|
||||
AutoSegmentStack _stack;
|
||||
};
|
||||
|
||||
public:
|
||||
// AutoSegments_Aligneds Methods.
|
||||
AutoSegments_Aligneds ( AutoSegment*, unsigned int flags=Flags::NoFlags );
|
||||
AutoSegments_Aligneds ( AutoSegment*, Flags flags );
|
||||
AutoSegments_Aligneds ( const AutoSegments_Aligneds& );
|
||||
virtual AutoSegmentHC* getClone () const;
|
||||
virtual AutoSegmentHL* getLocator () const;
|
||||
|
@ -241,7 +241,7 @@ namespace Anabatic {
|
|||
|
||||
protected:
|
||||
// AutoSegments_Aligneds Attributes.
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
AutoSegment* _segment;
|
||||
};
|
||||
|
||||
|
@ -254,7 +254,7 @@ namespace Anabatic {
|
|||
{ }
|
||||
|
||||
|
||||
inline AutoSegments_Aligneds::AutoSegments_Aligneds ( AutoSegment* segment, unsigned int flags )
|
||||
inline AutoSegments_Aligneds::AutoSegments_Aligneds ( AutoSegment* segment, Flags flags )
|
||||
: AutoSegmentHC()
|
||||
, _flags (flags)
|
||||
, _segment(segment)
|
||||
|
@ -277,7 +277,7 @@ namespace Anabatic {
|
|||
// Sub-Class: Locator.
|
||||
class Locator : public AutoSegmentHL {
|
||||
public:
|
||||
inline Locator ( AutoSegment* segment, unsigned int flags );
|
||||
inline Locator ( AutoSegment* segment, Flags flags );
|
||||
inline Locator ( const Locator &locator );
|
||||
virtual AutoSegment* getElement () const;
|
||||
virtual AutoSegmentHL* getClone () const;
|
||||
|
@ -290,7 +290,7 @@ namespace Anabatic {
|
|||
|
||||
public:
|
||||
// AutoSegments_Connecteds Methods.
|
||||
AutoSegments_Connecteds ( AutoSegment*, unsigned int flags );
|
||||
AutoSegments_Connecteds ( AutoSegment*, Flags flags );
|
||||
AutoSegments_Connecteds ( const AutoSegments_Connecteds& );
|
||||
virtual AutoSegmentHC* getClone () const;
|
||||
virtual AutoSegmentHL* getLocator () const;
|
||||
|
@ -298,7 +298,7 @@ namespace Anabatic {
|
|||
|
||||
protected:
|
||||
// AutoSegments_Connecteds Attributes.
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
AutoSegment* _segment;
|
||||
};
|
||||
|
||||
|
@ -309,7 +309,7 @@ namespace Anabatic {
|
|||
{ }
|
||||
|
||||
|
||||
inline AutoSegments_Connecteds::AutoSegments_Connecteds ( AutoSegment* segment, unsigned int flags )
|
||||
inline AutoSegments_Connecteds::AutoSegments_Connecteds ( AutoSegment* segment, Flags flags )
|
||||
: AutoSegmentHC()
|
||||
, _flags (flags)
|
||||
, _segment(segment)
|
||||
|
@ -332,7 +332,7 @@ namespace Anabatic {
|
|||
// Sub-Class: Locator.
|
||||
class Locator : public AutoSegmentHL {
|
||||
public:
|
||||
Locator ( AutoSegment* master );
|
||||
Locator ( AutoSegment* master, Flags flags );
|
||||
inline Locator ( const Locator& );
|
||||
virtual AutoSegment* getElement () const;
|
||||
virtual AutoSegmentHL* getClone () const;
|
||||
|
@ -340,7 +340,7 @@ namespace Anabatic {
|
|||
virtual void progress ();
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
AutoSegment* _master;
|
||||
AutoSegmentStack _stack;
|
||||
vector<AutoSegment*> _perpandiculars;
|
||||
|
@ -348,7 +348,7 @@ namespace Anabatic {
|
|||
|
||||
public:
|
||||
// AutoSegments_Perpandiculars Methods.
|
||||
inline AutoSegments_Perpandiculars ( AutoSegment* master );
|
||||
inline AutoSegments_Perpandiculars ( AutoSegment*, Flags flags=Flags::NoFlags );
|
||||
inline AutoSegments_Perpandiculars ( const AutoSegments_Perpandiculars& );
|
||||
virtual AutoSegmentHC* getClone () const;
|
||||
virtual AutoSegmentHL* getLocator () const;
|
||||
|
@ -356,7 +356,8 @@ namespace Anabatic {
|
|||
|
||||
protected:
|
||||
// AutoSegments_Perpandiculars Attributes.
|
||||
AutoSegment* _segment;
|
||||
Flags _flags;
|
||||
AutoSegment* _master;
|
||||
};
|
||||
|
||||
|
||||
|
@ -370,16 +371,18 @@ namespace Anabatic {
|
|||
|
||||
|
||||
inline AutoSegments_Perpandiculars::AutoSegments_Perpandiculars
|
||||
( AutoSegment* segment )
|
||||
( AutoSegment* master, Flags flags )
|
||||
: AutoSegmentHC()
|
||||
, _segment(segment)
|
||||
, _flags (flags)
|
||||
, _master(master)
|
||||
{ }
|
||||
|
||||
|
||||
inline AutoSegments_Perpandiculars::AutoSegments_Perpandiculars
|
||||
( const AutoSegments_Perpandiculars& autosegments )
|
||||
: AutoSegmentHC()
|
||||
, _segment(autosegments._segment)
|
||||
, _flags (autosegments._flags)
|
||||
, _master(autosegments._master)
|
||||
{ }
|
||||
|
||||
|
||||
|
@ -392,7 +395,7 @@ namespace Anabatic {
|
|||
// Sub-Class: Locator.
|
||||
class Locator : public AutoSegmentHL {
|
||||
public:
|
||||
Locator ( GCell* fcell, unsigned int flags );
|
||||
Locator ( GCell* fcell, Flags flags );
|
||||
inline Locator ( const Locator& );
|
||||
virtual ~Locator ();
|
||||
virtual AutoSegment* getElement () const;
|
||||
|
@ -401,7 +404,7 @@ namespace Anabatic {
|
|||
virtual void progress ();
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
vector<AutoContact*>::const_iterator _itContact;
|
||||
vector<AutoContact*>::const_iterator _itEnd;
|
||||
Hurricane::Locator<Hook*>* _hookLocator;
|
||||
|
@ -410,7 +413,7 @@ namespace Anabatic {
|
|||
|
||||
public:
|
||||
// AutoSegments_Perpandiculars Methods.
|
||||
inline AutoSegments_AnchorOnGCell ( GCell* fcell, unsigned int flags );
|
||||
inline AutoSegments_AnchorOnGCell ( GCell* fcell, Flags flags );
|
||||
inline AutoSegments_AnchorOnGCell ( const AutoSegments_AnchorOnGCell& );
|
||||
virtual AutoSegmentHC* getClone () const;
|
||||
virtual AutoSegmentHL* getLocator () const;
|
||||
|
@ -418,8 +421,8 @@ namespace Anabatic {
|
|||
|
||||
public:
|
||||
// AutoSegments_Perpandiculars Attributes.
|
||||
GCell* _fcell;
|
||||
unsigned int _flags;
|
||||
GCell* _fcell;
|
||||
Flags _flags;
|
||||
};
|
||||
|
||||
|
||||
|
@ -433,7 +436,7 @@ namespace Anabatic {
|
|||
{ }
|
||||
|
||||
|
||||
inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell ( GCell* fcell, unsigned int flags )
|
||||
inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell ( GCell* fcell, Flags flags )
|
||||
: AutoSegmentHC()
|
||||
, _fcell(fcell)
|
||||
, _flags(flags)
|
||||
|
@ -457,7 +460,7 @@ namespace Anabatic {
|
|||
// Sub-Class: Locator.
|
||||
class Locator : public AutoSegmentHL {
|
||||
public:
|
||||
Locator ( AutoContact* sourceAnchor, unsigned int direction );
|
||||
Locator ( AutoContact* sourceAnchor, Flags direction );
|
||||
inline Locator ( const Locator& );
|
||||
virtual ~Locator ();
|
||||
virtual AutoSegment* getElement () const;
|
||||
|
@ -473,7 +476,7 @@ namespace Anabatic {
|
|||
public:
|
||||
// AutoSegments_CachedOnContact Methods.
|
||||
inline AutoSegments_CachedOnContact ( AutoContact* sourceContact
|
||||
, unsigned int direction=Flags::Horizontal|Flags::Vertical );
|
||||
, Flags direction=Flags::Horizontal|Flags::Vertical );
|
||||
inline AutoSegments_CachedOnContact ( const AutoSegments_CachedOnContact& );
|
||||
virtual AutoSegmentHC* getClone () const;
|
||||
virtual AutoSegmentHL* getLocator () const;
|
||||
|
@ -481,7 +484,7 @@ namespace Anabatic {
|
|||
|
||||
protected:
|
||||
// AutoSegments_CachedOnContact Attributes.
|
||||
unsigned int _direction;
|
||||
Flags _direction;
|
||||
AutoContact* _sourceContact;
|
||||
|
||||
};
|
||||
|
@ -494,7 +497,7 @@ namespace Anabatic {
|
|||
|
||||
|
||||
inline AutoSegments_CachedOnContact::AutoSegments_CachedOnContact
|
||||
( AutoContact* sourceContact, unsigned int direction )
|
||||
( AutoContact* sourceContact, Flags direction )
|
||||
: AutoSegmentHC()
|
||||
, _direction (direction)
|
||||
, _sourceContact(sourceContact)
|
||||
|
@ -527,17 +530,17 @@ namespace Anabatic {
|
|||
|
||||
class AutoSegments_InDirection : public AutoSegmentHF {
|
||||
public:
|
||||
inline AutoSegments_InDirection ( unsigned int direction );
|
||||
inline AutoSegments_InDirection ( Flags direction );
|
||||
inline AutoSegments_InDirection ( const AutoSegments_InDirection& );
|
||||
virtual AutoSegmentHF* getClone () const;
|
||||
virtual bool accept ( AutoSegment* segment ) const;
|
||||
virtual string _getString () const;
|
||||
protected:
|
||||
unsigned int _direction;
|
||||
Flags _direction;
|
||||
};
|
||||
|
||||
|
||||
inline AutoSegments_InDirection::AutoSegments_InDirection ( unsigned int direction )
|
||||
inline AutoSegments_InDirection::AutoSegments_InDirection ( Flags direction )
|
||||
: AutoSegmentHF()
|
||||
, _direction(direction)
|
||||
{}
|
||||
|
|
|
@ -46,8 +46,8 @@ namespace Anabatic {
|
|||
virtual DbU::Unit getDuTarget () const;
|
||||
virtual Interval getSpanU () const;
|
||||
virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const;
|
||||
virtual Interval getSourceConstraints ( unsigned int flags=0 ) const;
|
||||
virtual Interval getTargetConstraints ( unsigned int flags=0 ) const;
|
||||
virtual Interval getSourceConstraints ( Flags flags=0 ) const;
|
||||
virtual Interval getTargetConstraints ( Flags flags=0 ) const;
|
||||
virtual Flags getDirection () const;
|
||||
virtual size_t getGCells ( vector<GCell*>& ) const;
|
||||
// Modifiers.
|
||||
|
@ -59,10 +59,10 @@ namespace Anabatic {
|
|||
virtual void updateNativeConstraints ();
|
||||
virtual bool checkPositions () const;
|
||||
virtual bool checkConstraints () const;
|
||||
virtual unsigned int _makeDogleg ( GCell*, unsigned int flags );
|
||||
virtual Flags _makeDogleg ( GCell*, Flags flags );
|
||||
virtual bool moveULeft ();
|
||||
virtual bool moveURight ();
|
||||
virtual bool _slacken ( unsigned int flags );
|
||||
virtual bool _slacken ( Flags flags );
|
||||
#if THIS_IS_DISABLED
|
||||
virtual void desalignate ( AutoContact* );
|
||||
#endif
|
||||
|
|
|
@ -24,78 +24,84 @@ namespace Anabatic {
|
|||
|
||||
class Flags : public Hurricane::BaseFlags {
|
||||
public:
|
||||
static const uint64_t NoFlags ; // = 0;
|
||||
static const BaseFlags NoFlags ; // = 0;
|
||||
// Flags used for both objects states & functions arguments.
|
||||
static const uint64_t Horizontal ; // = (1 << 0);
|
||||
static const uint64_t Vertical ; // = (1 << 1);
|
||||
static const uint64_t Source ; // = (1 << 2);
|
||||
static const uint64_t Target ; // = (1 << 3);
|
||||
static const uint64_t Invalidated ; // = (1 << 4);
|
||||
static const BaseFlags Horizontal ; // = (1 << 0);
|
||||
static const BaseFlags Vertical ; // = (1 << 1);
|
||||
static const BaseFlags Source ; // = (1 << 2);
|
||||
static const BaseFlags Target ; // = (1 << 3);
|
||||
static const BaseFlags Invalidated ; // = (1 << 4);
|
||||
// Flags for GCell objects states only.
|
||||
static const uint64_t DeviceGCell ; // = (1 << 5);
|
||||
static const uint64_t HChannelGCell ; // = (1 << 6);
|
||||
static const uint64_t VChannelGCell ; // = (1 << 7);
|
||||
static const uint64_t StrutGCell ; // = (1 << 8);
|
||||
static const uint64_t MatrixGCell ; // = (1 << 9);
|
||||
static const uint64_t IoPadGCell ; // = (1 << 10);
|
||||
static const uint64_t Saturated ; // = (1 << 11);
|
||||
static const BaseFlags DeviceGCell ; // = (1 << 5);
|
||||
static const BaseFlags HChannelGCell ; // = (1 << 6);
|
||||
static const BaseFlags VChannelGCell ; // = (1 << 7);
|
||||
static const BaseFlags StrutGCell ; // = (1 << 8);
|
||||
static const BaseFlags MatrixGCell ; // = (1 << 9);
|
||||
static const BaseFlags IoPadGCell ; // = (1 << 10);
|
||||
static const BaseFlags Saturated ; // = (1 << 11);
|
||||
// Flags for Anabatic objects states only.
|
||||
static const uint64_t DemoMode ; // = (1 << 5);
|
||||
static const uint64_t WarnOnGCellOverload ; // = (1 << 6);
|
||||
static const uint64_t DestroyGCell ; // = (1 << 7);
|
||||
static const uint64_t DestroyBaseContact ; // = (1 << 8);
|
||||
static const uint64_t DestroyBaseSegment ; // = (1 << 9);
|
||||
static const BaseFlags DemoMode ; // = (1 << 5);
|
||||
static const BaseFlags WarnOnGCellOverload ; // = (1 << 6);
|
||||
static const BaseFlags DestroyGCell ; // = (1 << 7);
|
||||
static const BaseFlags DestroyBaseContact ; // = (1 << 8);
|
||||
static const BaseFlags DestroyBaseSegment ; // = (1 << 9);
|
||||
// Flags for NetDatas objects states only.
|
||||
static const uint64_t GlobalRouted ; // = (1 << 5);
|
||||
static const BaseFlags GlobalRouted ; // = (1 << 5);
|
||||
// Masks.
|
||||
static const uint64_t WestSide ; // = Horizontal|Target;
|
||||
static const uint64_t EastSide ; // = Horizontal|Source;
|
||||
static const uint64_t SouthSide ; // = Vertical |Target;
|
||||
static const uint64_t NorthSide ; // = Vertical |Source;
|
||||
static const uint64_t AllSides ; // = WestSide|EastSide|SouthSide|NorthSide ;
|
||||
static const uint64_t EndsMask ; // = Source|Target;
|
||||
static const uint64_t DirectionMask ; // = Horizontal|Vertical;
|
||||
static const uint64_t DestroyMask ; // = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||
static const uint64_t GCellTypeMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||
static const BaseFlags WestSide ; // = Horizontal|Target;
|
||||
static const BaseFlags EastSide ; // = Horizontal|Source;
|
||||
static const BaseFlags SouthSide ; // = Vertical |Target;
|
||||
static const BaseFlags NorthSide ; // = Vertical |Source;
|
||||
static const BaseFlags AllSides ; // = WestSide|EastSide|SouthSide|NorthSide ;
|
||||
static const BaseFlags EndsMask ; // = Source|Target;
|
||||
static const BaseFlags DirectionMask ; // = Horizontal|Vertical;
|
||||
static const BaseFlags DestroyMask ; // = DestroyGCell|DestroyBaseContact|DestroyBaseSegment;
|
||||
static const BaseFlags GCellTypeMask ; // = DeviceGCell|HChannelGCell|VChannelGCell|StrutGCell|MatrixGCell|IoPadGCell;
|
||||
// Flags for functions arguments only.
|
||||
static const uint64_t Create ; // = (1 << 5);
|
||||
static const uint64_t WithPerpands ;
|
||||
static const uint64_t WithSelf ;
|
||||
static const uint64_t AboveLayer ;
|
||||
static const uint64_t BelowLayer ;
|
||||
static const uint64_t OpenSession ;
|
||||
static const uint64_t Realignate ;
|
||||
static const uint64_t NativeConstraints ;
|
||||
static const uint64_t ForceMove ;
|
||||
static const uint64_t WarnOnError ;
|
||||
static const uint64_t Topology ;
|
||||
static const uint64_t GlobalSegment ;
|
||||
static const uint64_t AllowTerminal ;
|
||||
static const uint64_t AllowLocal ;
|
||||
static const uint64_t IgnoreContacts ;
|
||||
static const uint64_t Propagate ;
|
||||
static const uint64_t Superior ;
|
||||
static const uint64_t DoglegOnLeft ;
|
||||
static const uint64_t DoglegOnRight ;
|
||||
static const uint64_t WithNeighbors ;
|
||||
static const uint64_t NoCheckLayer ;
|
||||
static const uint64_t HalfSlacken ;
|
||||
static const uint64_t NoGCellShrink ;
|
||||
static const uint64_t CParanoid ;
|
||||
static const uint64_t CheckLowDensity ;
|
||||
static const uint64_t CheckLowUpDensity ;
|
||||
static const uint64_t NoUpdate ;
|
||||
static const BaseFlags Create ; // = (1 << 5);
|
||||
static const BaseFlags WithPerpands ;
|
||||
static const BaseFlags WithDoglegs ;
|
||||
static const BaseFlags WithSelf ;
|
||||
static const BaseFlags AboveLayer ;
|
||||
static const BaseFlags BelowLayer ;
|
||||
static const BaseFlags OpenSession ;
|
||||
static const BaseFlags Realignate ;
|
||||
static const BaseFlags NativeConstraints ;
|
||||
static const BaseFlags ForceMove ;
|
||||
static const BaseFlags WarnOnError ;
|
||||
static const BaseFlags Topology ;
|
||||
static const BaseFlags GlobalSegment ;
|
||||
static const BaseFlags AllowTerminal ;
|
||||
static const BaseFlags AllowLocal ;
|
||||
static const BaseFlags IgnoreContacts ;
|
||||
static const BaseFlags Propagate ;
|
||||
static const BaseFlags Superior ;
|
||||
static const BaseFlags DoglegOnLeft ;
|
||||
static const BaseFlags DoglegOnRight ;
|
||||
static const BaseFlags WithNeighbors ;
|
||||
static const BaseFlags NoCheckLayer ;
|
||||
static const BaseFlags HalfSlacken ;
|
||||
static const BaseFlags NoGCellShrink ;
|
||||
static const BaseFlags CParanoid ;
|
||||
static const BaseFlags CheckLowDensity ;
|
||||
static const BaseFlags CheckLowUpDensity ;
|
||||
static const BaseFlags NoUpdate ;
|
||||
public:
|
||||
inline Flags ( uint64_t flags = NoFlags );
|
||||
inline Flags ( BaseFlags );
|
||||
inline Flags ( const Hurricane::BaseFlags& );
|
||||
virtual ~Flags ();
|
||||
virtual std::string asString ( uint32_t mode ) const;
|
||||
virtual std::string _getTypeName () const;
|
||||
virtual std::string _getString () const;
|
||||
};
|
||||
|
||||
|
||||
Flags::Flags ( uint64_t flags ) : BaseFlags(flags) { }
|
||||
Flags::Flags ( BaseFlags base ) : BaseFlags(base) { }
|
||||
Flags::Flags ( uint64_t flags ) : BaseFlags(flags) { }
|
||||
Flags::Flags ( const Hurricane::BaseFlags& flags ) : BaseFlags(flags) { }
|
||||
|
||||
|
||||
enum FlagsMode { FlagsFunction = 1
|
||||
};
|
||||
|
||||
|
||||
enum EngineState { EngineCreation = 1
|
||||
|
|
|
@ -38,43 +38,6 @@ namespace Anabatic {
|
|||
class AnabaticEngine;
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::Symmetry".
|
||||
|
||||
class Symmetry
|
||||
{
|
||||
public:
|
||||
enum iFlag { None = 0
|
||||
, sHorizontal = (1<<0)
|
||||
, sVertical = (1<<1)
|
||||
, sCFound = (1<<2)
|
||||
};
|
||||
private:
|
||||
Symmetry(unsigned int, DbU::Unit);
|
||||
~Symmetry();
|
||||
public:
|
||||
static Symmetry* create(unsigned int, DbU::Unit);
|
||||
|
||||
public:
|
||||
unsigned int getType () const;
|
||||
inline DbU::Unit getValue() const;
|
||||
inline bool isCFound() const;
|
||||
inline void setAsH();
|
||||
inline void setAsV();
|
||||
inline void setFound();
|
||||
|
||||
private:
|
||||
unsigned int _flags;
|
||||
DbU::Unit _value;
|
||||
};
|
||||
|
||||
inline void Symmetry::setAsH () { _flags = ((_flags & ~(0x3)) | sHorizontal); }
|
||||
inline void Symmetry::setAsV () { _flags = ((_flags & ~(0x3)) | sVertical ); }
|
||||
inline void Symmetry::setFound () { _flags |= sCFound; }
|
||||
inline DbU::Unit Symmetry::getValue () const { return _value; }
|
||||
inline bool Symmetry::isCFound () const { return _flags & sCFound; }
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::IntervalC".
|
||||
|
||||
|
@ -86,49 +49,120 @@ namespace Anabatic {
|
|||
, iVertical = (1<<1)
|
||||
, iSet = (1<<2)
|
||||
};
|
||||
private:
|
||||
IntervalC();
|
||||
~IntervalC();
|
||||
public:
|
||||
static IntervalC* create();
|
||||
|
||||
public:
|
||||
void set ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void setRange ( DbU::Unit, DbU::Unit );
|
||||
void extendMin ( DbU::Unit );
|
||||
void extendMax ( DbU::Unit );
|
||||
void print () const;
|
||||
inline bool isH () const;
|
||||
inline bool isV () const;
|
||||
inline void setAsH ();
|
||||
inline void setAsV ();
|
||||
inline DbU::Unit getMin () const;
|
||||
inline DbU::Unit getMax () const;
|
||||
inline DbU::Unit getCenter () const;
|
||||
DbU::Unit getAxis () const;
|
||||
inline void setAxis ( DbU::Unit );
|
||||
inline void setiSet ();
|
||||
inline bool isiSet () const;
|
||||
void reset ();
|
||||
IntervalC();
|
||||
IntervalC(const IntervalC&);
|
||||
IntervalC(IntervalC&);
|
||||
~IntervalC();
|
||||
void set ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void setRange ( DbU::Unit, DbU::Unit );
|
||||
void extendMin ( DbU::Unit );
|
||||
void extendMax ( DbU::Unit );
|
||||
void print () const;
|
||||
inline bool isH () const;
|
||||
inline bool isV () const;
|
||||
inline void setAsH ();
|
||||
inline void setAsV ();
|
||||
inline DbU::Unit getMin () const;
|
||||
inline DbU::Unit getMax () const;
|
||||
inline DbU::Unit getCenter () const;
|
||||
DbU::Unit getAxis () const;
|
||||
inline void setAxis ( DbU::Unit );
|
||||
inline void setiSet ();
|
||||
inline bool isiSet () const;
|
||||
void reset ();
|
||||
|
||||
Flags getFlags () const;
|
||||
void setFlags (Flags);
|
||||
|
||||
private:
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
DbU::Unit _min;
|
||||
DbU::Unit _max;
|
||||
DbU::Unit _axis;
|
||||
};
|
||||
|
||||
inline void IntervalC::setAsH () { _flags = ((_flags & ~(0x3)) | iHorizontal); }
|
||||
inline void IntervalC::setAsV () { _flags = ((_flags & ~(0x3)) | iVertical ); }
|
||||
inline void IntervalC::setAxis ( DbU::Unit axis ) { _axis = axis; }
|
||||
inline DbU::Unit IntervalC::getAxis () const { return _axis; }
|
||||
inline DbU::Unit IntervalC::getCenter() const { return getMin()+getMax(); }
|
||||
inline DbU::Unit IntervalC::getMin () const { return _min; }
|
||||
inline DbU::Unit IntervalC::getMax () const { return _max; }
|
||||
inline void IntervalC::setiSet () { _flags |= iSet; }
|
||||
inline bool IntervalC::isiSet () const { return _flags & iSet; }
|
||||
inline bool IntervalC::isH () const { return _flags & iHorizontal; }
|
||||
inline bool IntervalC::isV () const { return _flags & iVertical ; }
|
||||
inline void IntervalC::setAsH () { _flags = ((_flags & ~(0x3)) | iHorizontal); }
|
||||
inline void IntervalC::setAsV () { _flags = ((_flags & ~(0x3)) | iVertical ); }
|
||||
inline void IntervalC::setAxis ( DbU::Unit axis ) { _axis = axis; }
|
||||
inline DbU::Unit IntervalC::getAxis () const { return _axis; }
|
||||
inline DbU::Unit IntervalC::getCenter() const { return getMin()+getMax(); }
|
||||
inline DbU::Unit IntervalC::getMin () const { return _min; }
|
||||
inline DbU::Unit IntervalC::getMax () const { return _max; }
|
||||
inline void IntervalC::setiSet () { _flags |= iSet; }
|
||||
inline bool IntervalC::isiSet () const { return _flags & iSet; }
|
||||
inline bool IntervalC::isH () const { return _flags & iHorizontal; }
|
||||
inline bool IntervalC::isV () const { return _flags & iVertical ; }
|
||||
inline void IntervalC::setFlags ( Flags flags ) { _flags = flags; }
|
||||
inline Flags IntervalC::getFlags () const { return _flags; }
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::GRAData".
|
||||
|
||||
class GRAData
|
||||
{
|
||||
private:
|
||||
GRAData();
|
||||
~GRAData();
|
||||
public:
|
||||
static GRAData* create();
|
||||
//////////////////////////////////////// GRDATA
|
||||
inline bool isiSet () const;
|
||||
inline IntervalC getInterv () const;
|
||||
inline IntervalC getIntervFrom () const;
|
||||
inline DbU::Unit getIAxis () const;
|
||||
inline DbU::Unit getIMax () const;
|
||||
inline DbU::Unit getIMin () const;
|
||||
inline DbU::Unit getPIAxis () const;
|
||||
inline DbU::Unit getPIMax () const;
|
||||
inline DbU::Unit getPIMin () const;
|
||||
|
||||
inline IntervalC getIntervFrom2 () const;
|
||||
inline DbU::Unit getPIMax2 () const;
|
||||
inline DbU::Unit getPIMin2 () const;
|
||||
inline DbU::Unit getPIAxis2 () const;
|
||||
|
||||
inline void setInterv ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
inline void setIntervfrom ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
inline void setIntervfrom2 ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void resetIntervals ();
|
||||
void clearFrom2 ();
|
||||
inline Edge* getFrom2 () const;
|
||||
inline void setFrom2 ( Edge* );
|
||||
inline void printInterv () const;
|
||||
inline void printIntervfrom () const;
|
||||
|
||||
private:
|
||||
IntervalC _intervfrom;
|
||||
IntervalC _interv;
|
||||
Edge* _from2;
|
||||
IntervalC _intervfrom2;
|
||||
};
|
||||
|
||||
inline bool GRAData::isiSet () const { return _interv.isiSet() ; }
|
||||
inline IntervalC GRAData::getInterv () const { return _interv; }
|
||||
inline IntervalC GRAData::getIntervFrom() const { return _intervfrom; }
|
||||
inline DbU::Unit GRAData::getIAxis () const { return _interv.getAxis() ; }
|
||||
inline DbU::Unit GRAData::getIMax () const { return _interv.getMax() ; }
|
||||
inline DbU::Unit GRAData::getIMin () const { return _interv.getMin() ; }
|
||||
inline DbU::Unit GRAData::getPIAxis () const { return _intervfrom.getAxis(); }
|
||||
inline DbU::Unit GRAData::getPIMax () const { return _intervfrom.getMax() ; }
|
||||
inline DbU::Unit GRAData::getPIMin () const { return _intervfrom.getMin() ; }
|
||||
|
||||
inline DbU::Unit GRAData::getPIMax2 () const { return _intervfrom2.getMax() ; }
|
||||
inline DbU::Unit GRAData::getPIMin2 () const { return _intervfrom2.getMin() ; }
|
||||
inline DbU::Unit GRAData::getPIAxis2 () const { return _intervfrom2.getAxis(); }
|
||||
inline IntervalC GRAData::getIntervFrom2 () const { return _intervfrom2; }
|
||||
|
||||
inline void GRAData::setInterv ( DbU::Unit min, DbU::Unit max, DbU::Unit axis ) { _interv.set(min, max, axis); }
|
||||
inline void GRAData::setIntervfrom ( DbU::Unit min, DbU::Unit max, DbU::Unit axis ) { _intervfrom.set(min, max, axis); }
|
||||
inline void GRAData::setIntervfrom2( DbU::Unit min, DbU::Unit max, DbU::Unit axis ) { _intervfrom2.set(min, max, axis); }
|
||||
|
||||
inline Edge* GRAData::getFrom2 () const { return _from2; }
|
||||
inline void GRAData::setFrom2 ( Edge* from ) { _from2 = from; }
|
||||
inline void GRAData::printInterv () const { _interv.print() ; }
|
||||
inline void GRAData::printIntervfrom () const { _intervfrom.print(); }
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::Vertex".
|
||||
|
@ -146,6 +180,11 @@ namespace Anabatic {
|
|||
, ERestricted = (1<<2)
|
||||
, WRestricted = (1<<3)
|
||||
, AxisTarget = (1<<4)
|
||||
, From2Mode = (1<<5)
|
||||
, UseFromFrom2 = (1<<6)
|
||||
, iHorizontal = (1<<7)
|
||||
, iVertical = (1<<8)
|
||||
, iSet = (1<<9)
|
||||
};
|
||||
public:
|
||||
static DbU::Unit unreached;
|
||||
|
@ -185,6 +224,7 @@ namespace Anabatic {
|
|||
inline void clearRps ();
|
||||
inline Contact* breakGoThrough ( Net* );
|
||||
|
||||
//////////////////////////////////////// Analog
|
||||
inline bool isNorth ( const Vertex* ) const;
|
||||
inline bool isSouth ( const Vertex* ) const;
|
||||
inline bool isEast ( const Vertex* ) const;
|
||||
|
@ -201,44 +241,53 @@ namespace Anabatic {
|
|||
inline void setSRestricted ();
|
||||
inline void setERestricted ();
|
||||
inline void setWRestricted ();
|
||||
inline unsigned int getFlags () const;
|
||||
inline DbU::Unit getXPath () const;
|
||||
inline DbU::Unit getYPath () const;
|
||||
bool hasRP ( Net* ) const;
|
||||
bool hasVRP ( Net* ) const;
|
||||
bool hasHRP ( Net* ) const;
|
||||
static bool isRestricted ( const Vertex* v1, const Vertex* v2 );
|
||||
static Point getNextPathPoint2( const Vertex*, const Vertex* );
|
||||
Point getPathPoint ( const Vertex * ) const;
|
||||
inline void setIAsH ();
|
||||
inline void setIAsV ();
|
||||
inline DbU::Unit getIAxis () const;
|
||||
inline void setIAxis ( DbU::Unit ) ;
|
||||
inline DbU::Unit getICenter () const;
|
||||
inline DbU::Unit getIMax () const;
|
||||
inline DbU::Unit getIMin () const;
|
||||
inline void setPIAsH ();
|
||||
inline void setPIAsV ();
|
||||
inline DbU::Unit getPIAxis () const;
|
||||
inline void setPIAxis ( DbU::Unit ) ;
|
||||
inline DbU::Unit getPICenter () const;
|
||||
inline DbU::Unit getPIMax () const;
|
||||
inline DbU::Unit getPIMin () const;
|
||||
bool isH () const;
|
||||
bool isV () const;
|
||||
inline bool isiSet () const;
|
||||
inline void setInterv ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
inline void setIRange ( DbU::Unit, DbU::Unit );
|
||||
inline void setIRangeFrom ( DbU::Unit, DbU::Unit );
|
||||
inline void printInterval () const ;
|
||||
void setIntervals ( Vertex* );
|
||||
void resetIntervals ();
|
||||
inline void setFlags ( unsigned int );
|
||||
inline bool isAxisTarget () const;
|
||||
inline void unsetFlags ( unsigned int );
|
||||
inline void setAxisTarget ();
|
||||
|
||||
static bool isRestricted ( const Vertex* v1, const Vertex* v2, const Edge* e, DbU::Unit hpitch = 0, DbU::Unit vpitch = 0, Net* net = NULL);
|
||||
bool areSameSide ( const Vertex*, const Vertex* ) const;
|
||||
|
||||
inline bool isFromFrom2 () const;
|
||||
inline bool isFrom2Mode () const;
|
||||
inline bool isAxisTarget () const;
|
||||
inline bool isiHorizontal() const;
|
||||
inline bool isiVertical () const;
|
||||
inline void setFlags ( uint32_t );
|
||||
inline void unsetFlags ( uint32_t );
|
||||
bool isH () const;
|
||||
bool isV () const;
|
||||
inline void createAData ();
|
||||
////////////////////////////////////
|
||||
Point getStartPathPoint ( const Vertex* next ) const;
|
||||
Point getNextPathPoint ( Point, const Vertex* ) const;
|
||||
//////////////////////////////////////// GRDATA
|
||||
void setIntervals ( Vertex* );
|
||||
|
||||
bool isiSet () const;
|
||||
DbU::Unit getIAxis () const;
|
||||
DbU::Unit getIMax () const;
|
||||
DbU::Unit getIMin () const;
|
||||
DbU::Unit getPIAxis () const;
|
||||
DbU::Unit getPIMax () const;
|
||||
DbU::Unit getPIMin () const;
|
||||
void setInterv ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void setIntervfrom ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void setIntervfrom2 ( DbU::Unit, DbU::Unit, DbU::Unit );
|
||||
void resetIntervals ();
|
||||
void clearFrom2 ();
|
||||
Edge* getFrom2 () const;
|
||||
void setFrom2 ( Edge* );
|
||||
void createIntervFrom2 ();
|
||||
DbU::Unit getPIMax2 () const;
|
||||
DbU::Unit getPIMin2 () const;
|
||||
DbU::Unit getPIAxis2 () const;
|
||||
IntervalC getIntervFrom2 () const;
|
||||
IntervalC getIntervFrom ( uint32_t criteria=0 ) const;
|
||||
IntervalC getInterv () const;
|
||||
void printInterv () const;
|
||||
void printIntervfrom () const;
|
||||
GCell* getGPrev ( uint32_t criteria=0 ) const;
|
||||
|
||||
// Inspector support.
|
||||
string _getString () const;
|
||||
private:
|
||||
|
@ -256,9 +305,8 @@ namespace Anabatic {
|
|||
int _stamp;
|
||||
DbU::Unit _distance;
|
||||
Edge* _from;
|
||||
unsigned int _flags;
|
||||
IntervalC* _intervfrom;
|
||||
IntervalC* _interv;
|
||||
uint32_t _flags;
|
||||
GRAData* _adata;
|
||||
};
|
||||
|
||||
|
||||
|
@ -274,9 +322,7 @@ namespace Anabatic {
|
|||
, _distance(unreached)
|
||||
, _from (NULL)
|
||||
, _flags (NoRestriction)
|
||||
|
||||
, _intervfrom(IntervalC::create())
|
||||
, _interv (IntervalC::create())
|
||||
, _adata (NULL)
|
||||
{
|
||||
gcell->setObserver( GCell::Observable::Vertex, &_observer );
|
||||
}
|
||||
|
@ -332,32 +378,15 @@ namespace Anabatic {
|
|||
inline void Vertex::setSRestricted () { _flags |= SRestricted; }
|
||||
inline void Vertex::setERestricted () { _flags |= ERestricted; }
|
||||
inline void Vertex::setWRestricted () { _flags |= WRestricted; }
|
||||
inline unsigned int Vertex::getFlags () const { return _flags; }
|
||||
|
||||
inline void Vertex::setIAxis ( DbU::Unit axis ) { _interv->setAxis(axis); }
|
||||
inline DbU::Unit Vertex::getIAxis () const { return _interv->getAxis(); }
|
||||
inline void Vertex::setIAsH () { _interv->setAsH(); }
|
||||
inline void Vertex::setIAsV () { _interv->setAsV(); }
|
||||
inline DbU::Unit Vertex::getICenter () const { return _interv->getCenter(); }
|
||||
inline DbU::Unit Vertex::getIMax () const { return _interv->getMax(); }
|
||||
inline DbU::Unit Vertex::getIMin () const { return _interv->getMin(); }
|
||||
inline void Vertex::setPIAxis ( DbU::Unit axis ) { _intervfrom->setAxis(axis); }
|
||||
inline DbU::Unit Vertex::getPIAxis () const { return _intervfrom->getAxis(); }
|
||||
inline void Vertex::setPIAsH () { _intervfrom->setAsH(); }
|
||||
inline void Vertex::setPIAsV () { _intervfrom->setAsV(); }
|
||||
inline DbU::Unit Vertex::getPICenter() const { return _intervfrom->getCenter(); }
|
||||
inline DbU::Unit Vertex::getPIMax () const { return _intervfrom->getMax(); }
|
||||
inline DbU::Unit Vertex::getPIMin () const { return _intervfrom->getMin(); }
|
||||
inline bool Vertex::isiSet () const { return _interv->isiSet(); }
|
||||
inline bool Vertex::isFromFrom2 () const { return (_flags & Vertex::UseFromFrom2); }
|
||||
inline bool Vertex::isFrom2Mode () const { return (_flags & Vertex::From2Mode ); }
|
||||
inline bool Vertex::isAxisTarget () const { return (_flags & Vertex::AxisTarget ); }
|
||||
inline bool Vertex::isiHorizontal() const { return (_flags & Vertex::iHorizontal ); }
|
||||
inline bool Vertex::isiVertical () const { return (_flags & Vertex::iVertical ); }
|
||||
inline void Vertex::setFlags ( uint32_t mask ) { _flags |= mask ; }
|
||||
inline void Vertex::unsetFlags ( uint32_t mask ) { _flags &= ~mask; }
|
||||
|
||||
inline void Vertex::setInterv ( DbU::Unit min, DbU::Unit max, DbU::Unit axis ) { _interv->set(min, max, axis); }
|
||||
inline void Vertex::setIRange ( DbU::Unit min, DbU::Unit max ) { _interv->setRange(min, max); }
|
||||
inline void Vertex::setIRangeFrom( DbU::Unit min, DbU::Unit max ) { _intervfrom->setRange(min, max); }
|
||||
inline void Vertex::printInterval() const { _interv->print(); }
|
||||
|
||||
inline void Vertex::setAxisTarget() { _flags |= AxisTarget; }
|
||||
inline bool Vertex::isAxisTarget () const { return (_flags & AxisTarget); }
|
||||
inline void Vertex::unsetFlags ( unsigned int mask ) { _flags &= ~mask; }
|
||||
// -------------------------------------------------------------------
|
||||
// Class : "Anabatic::PriorityQueue".
|
||||
|
||||
|
@ -437,7 +466,7 @@ namespace Anabatic {
|
|||
, AxisTarget = (1<<2)
|
||||
};
|
||||
public:
|
||||
inline Mode ( unsigned int flags=NoMode );
|
||||
inline Mode ( Flag flags=NoMode );
|
||||
inline Mode ( BaseFlags );
|
||||
virtual ~Mode ();
|
||||
virtual std::string _getTypeName () const;
|
||||
|
@ -462,8 +491,6 @@ namespace Anabatic {
|
|||
Dijkstra ( const Dijkstra& );
|
||||
Dijkstra& operator= ( const Dijkstra& );
|
||||
static DbU::Unit _distance ( const Vertex*, const Vertex*, const Edge* );
|
||||
DbU::Unit _getDistancetoRP ( Point );
|
||||
DbU::Unit _estimatePtoRP ( Point, RoutingPad*, Vertex* );
|
||||
Point _getPonderedPoint () const;
|
||||
void _cleanup ();
|
||||
bool _propagate ( Flags enabledSides );
|
||||
|
@ -475,12 +502,24 @@ namespace Anabatic {
|
|||
void _checkEdges () const;
|
||||
void _createSelfSymSeg ( Segment* );
|
||||
|
||||
inline void setAxisTarget ();
|
||||
inline bool needAxisTarget () const;
|
||||
inline void setFlags ( unsigned int );
|
||||
inline void unsetFlags ( unsigned int );
|
||||
void setAxisTargets ();
|
||||
void unsetAxisTargets ();
|
||||
inline void setAxisTarget ();
|
||||
inline bool needAxisTarget () const;
|
||||
inline void setFlags ( Flags );
|
||||
inline void unsetFlags ( Flags );
|
||||
void setAxisTargets ();
|
||||
void unsetAxisTargets ();
|
||||
|
||||
bool _attachSymContactsHook ( RoutingPad* );
|
||||
void _limitSymSearchArea ( RoutingPad* rp );
|
||||
void _setSourcesGRAData ( Vertex*, RoutingPad*);
|
||||
bool _checkFrom2 ( Edge*, Vertex* );
|
||||
bool _isDistance2Shorter ( DbU::Unit&, Vertex*, Vertex*, Edge* );
|
||||
void _pushEqualDistance ( DbU::Unit, bool, Vertex*, Vertex*, Edge* );
|
||||
void _updateGRAData ( Vertex*, bool, Vertex* );
|
||||
void _initiateUpdateIntervals ( Vertex* );
|
||||
bool _updateIntervals ( bool&, Vertex*, bool&, int&, Edge* );
|
||||
void _updateRealOccupancy ( Vertex* );
|
||||
|
||||
private:
|
||||
AnabaticEngine* _anabatic;
|
||||
vector<Vertex*> _vertexes;
|
||||
|
@ -494,12 +533,12 @@ namespace Anabatic {
|
|||
DbU::Unit _searchAreaHalo;
|
||||
int _connectedsId;
|
||||
PriorityQueue _queue;
|
||||
unsigned int _flags;
|
||||
Flags _flags;
|
||||
};
|
||||
|
||||
|
||||
inline Dijkstra::Mode::Mode ( unsigned int flags ) : BaseFlags(flags) { }
|
||||
inline Dijkstra::Mode::Mode ( BaseFlags base ) : BaseFlags(base) { }
|
||||
inline Dijkstra::Mode::Mode ( Dijkstra::Mode::Flag flags ) : BaseFlags(flags) { }
|
||||
inline Dijkstra::Mode::Mode ( BaseFlags base ) : BaseFlags(base) { }
|
||||
|
||||
inline bool Dijkstra::isBipoint () const { return _net and (_targets.size()+_sources.size() == 2); }
|
||||
inline bool Dijkstra::isSourceVertex ( Vertex* v ) const { return (_sources.find(v) != _sources.end()); }
|
||||
|
@ -510,9 +549,10 @@ namespace Anabatic {
|
|||
template<typename DistanceT>
|
||||
inline DistanceT* Dijkstra::setDistance ( DistanceT cb ) { _distanceCb = cb; return _distanceCb.target<DistanceT>(); }
|
||||
|
||||
inline void Dijkstra::setFlags ( unsigned int mask ) { _flags |= mask; }
|
||||
inline bool Dijkstra::needAxisTarget () const { return (_flags & Mode::AxisTarget); }
|
||||
inline void Dijkstra::unsetFlags ( unsigned int mask ) { _flags &= ~mask; }
|
||||
inline void Dijkstra::setFlags ( Flags mask ) { _flags |= mask; }
|
||||
inline bool Dijkstra::needAxisTarget () const { return (_flags & Mode::AxisTarget); }
|
||||
inline void Dijkstra::unsetFlags ( Flags mask ) { _flags &= ~mask; }
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
||||
|
||||
|
|
|
@ -73,8 +73,11 @@ namespace Anabatic {
|
|||
Interval getSide () const;
|
||||
Segment* getSegment ( const Net* ) const;
|
||||
inline const vector<Segment*>& getSegments () const;
|
||||
inline void setCapacity ( int );
|
||||
inline void incCapacity ( int );
|
||||
inline void setRealOccupancy ( int );
|
||||
void incRealOccupancy ( int );
|
||||
void incRealOccupancy2 ( int );
|
||||
inline void setHistoricCost ( float );
|
||||
void add ( Segment* );
|
||||
void remove ( Segment* );
|
||||
|
@ -83,6 +86,8 @@ namespace Anabatic {
|
|||
inline const Flags& flags () const;
|
||||
inline Flags& flags ();
|
||||
inline void revalidate () const;
|
||||
|
||||
bool isMaxCapacity ( Net* net = NULL ) const;
|
||||
void _setSource ( GCell* );
|
||||
void _setTarget ( GCell* );
|
||||
private:
|
||||
|
@ -133,13 +138,14 @@ namespace Anabatic {
|
|||
inline GCell* Edge::getTarget () const { return _target; }
|
||||
inline DbU::Unit Edge::getAxis () const { return _axis; }
|
||||
inline const vector<Segment*>& Edge::getSegments () const { return _segments; }
|
||||
inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; }
|
||||
inline void Edge::incCapacity ( int delta ) { _capacity = ((int)_capacity+delta > 0) ? _capacity+delta : 0; }
|
||||
inline void Edge::setCapacity ( int c ) { _capacity = ((int) c > 0) ? c : 0; }
|
||||
inline void Edge::setRealOccupancy ( int c ) { _realOccupancy = ((int) c > 0) ? c : 0; }
|
||||
inline void Edge::setHistoricCost ( float hcost ) { _historicCost = hcost; }
|
||||
inline const Flags& Edge::flags () const { return _flags; }
|
||||
inline Flags& Edge::flags () { return _flags; }
|
||||
inline void Edge::revalidate () const { /*if (_flags&Flags::Invalidated)*/ const_cast<Edge*>(this)->_revalidate(); }
|
||||
|
||||
|
||||
|
||||
} // Anabatic namespace.
|
||||
|
||||
|
||||
|
|
|
@ -123,8 +123,8 @@ namespace Anabatic {
|
|||
float _density;
|
||||
};
|
||||
public:
|
||||
static unsigned int getDisplayMode ();
|
||||
static void setDisplayMode ( unsigned int );
|
||||
static uint32_t getDisplayMode ();
|
||||
static void setDisplayMode ( uint32_t );
|
||||
static Box getBorder ( const GCell*, const GCell* );
|
||||
public:
|
||||
static GCell* create ( AnabaticEngine* );
|
||||
|
@ -155,9 +155,9 @@ namespace Anabatic {
|
|||
inline DbU::Unit getYMax ( int shrink=0 ) const;
|
||||
inline DbU::Unit getXCenter () const;
|
||||
inline DbU::Unit getYCenter () const;
|
||||
inline DbU::Unit getConstraintXMax () const;
|
||||
inline DbU::Unit getConstraintYMax () const;
|
||||
inline Interval getSide ( Flags direction ) const;
|
||||
inline DbU::Unit getConstraintXMax ( int shrink=0 ) const;
|
||||
inline DbU::Unit getConstraintYMax ( int shrink=0 ) const;
|
||||
inline Interval getSide ( Flags direction, int shrink=0 ) const;
|
||||
inline Point getCenter () const;
|
||||
inline Box getConstraintBox () const;
|
||||
inline const vector<Edge*>& getWestEdges () const;
|
||||
|
@ -171,6 +171,12 @@ namespace Anabatic {
|
|||
inline GCell* getEast () const;
|
||||
inline GCell* getSouth () const;
|
||||
inline GCell* getNorth () const;
|
||||
|
||||
inline Edge* getWestEdge () const;
|
||||
inline Edge* getEastEdge () const;
|
||||
inline Edge* getSouthEdge () const;
|
||||
inline Edge* getNorthEdge () const;
|
||||
|
||||
GCell* getWest ( DbU::Unit y ) const;
|
||||
GCell* getEast ( DbU::Unit y ) const;
|
||||
GCell* getSouth ( DbU::Unit x ) const;
|
||||
|
@ -193,14 +199,13 @@ namespace Anabatic {
|
|||
// Detailed routing functions.
|
||||
bool hasFreeTrack ( size_t depth, float reserve ) const;
|
||||
inline size_t getDepth () const;
|
||||
Interval getSide ( unsigned int ) const;
|
||||
float getHCapacity () const;
|
||||
float getVCapacity () const;
|
||||
float getDensity ( unsigned int flags=Flags::NoFlags ) const;
|
||||
float getDensity ( Flags flags=Flags::NoFlags ) const;
|
||||
float getAverageHVDensity () const;
|
||||
float getMaxHVDensity () const;
|
||||
inline float getCDensity ( unsigned int flags=Flags::NoFlags ) const;
|
||||
inline float getWDensity ( size_t depth, unsigned int flags=Flags::NoFlags ) const;
|
||||
inline float getCDensity ( Flags flags=Flags::NoFlags ) const;
|
||||
inline float getWDensity ( size_t depth, Flags flags=Flags::NoFlags ) const;
|
||||
inline DbU::Unit getBlockage ( size_t depth ) const;
|
||||
inline float getFragmentation ( size_t depth ) const;
|
||||
inline float getFeedthroughs ( size_t depth ) const;
|
||||
|
@ -212,8 +217,8 @@ namespace Anabatic {
|
|||
AutoSegments getVStartSegments ();
|
||||
AutoSegments getHStopSegments ();
|
||||
AutoSegments getVStopSegments ();
|
||||
inline AutoSegments getStartSegments ( unsigned int direction );
|
||||
inline AutoSegments getStopSegments ( unsigned int direction );
|
||||
inline AutoSegments getStartSegments ( Flags direction );
|
||||
inline AutoSegments getStopSegments ( Flags direction );
|
||||
size_t getRoutingPads ( set<RoutingPad*>& );
|
||||
inline const Key& getKey () const;
|
||||
size_t checkDensity () const;
|
||||
|
@ -234,10 +239,12 @@ namespace Anabatic {
|
|||
void rpDesaturate ( set<Net*>& );
|
||||
bool stepDesaturate ( size_t depth
|
||||
, set<Net*>&, AutoSegment*& moved
|
||||
, unsigned int flags=Flags::NoFlags );
|
||||
, Flags flags=Flags::NoFlags );
|
||||
bool stepNetDesaturate ( size_t depth
|
||||
, set<Net*>& globalNets
|
||||
, Set& invalidateds );
|
||||
|
||||
void setEdgesOccupancy (unsigned int, unsigned int);
|
||||
// Misc. functions.
|
||||
inline const Flags& flags () const;
|
||||
inline Flags& flags ();
|
||||
|
@ -274,7 +281,7 @@ namespace Anabatic {
|
|||
GCell& operator= ( const GCell& );
|
||||
private:
|
||||
static Name _extensionName;
|
||||
static unsigned int _displayMode;
|
||||
static uint32_t _displayMode;
|
||||
Observable _observable;
|
||||
AnabaticEngine* _anabatic;
|
||||
Flags _flags;
|
||||
|
@ -324,6 +331,12 @@ namespace Anabatic {
|
|||
inline GCell* GCell::getEast () const { return _eastEdges.empty() ? NULL : _eastEdges[0]->getOpposite(this); }
|
||||
inline GCell* GCell::getSouth () const { return _southEdges.empty() ? NULL : _southEdges[0]->getOpposite(this); }
|
||||
inline GCell* GCell::getNorth () const { return _northEdges.empty() ? NULL : _northEdges[0]->getOpposite(this); }
|
||||
|
||||
inline Edge* GCell::getWestEdge () const { return _westEdges.empty() ? NULL : _westEdges[0]; }
|
||||
inline Edge* GCell::getEastEdge () const { return _eastEdges.empty() ? NULL : _eastEdges[0]; }
|
||||
inline Edge* GCell::getSouthEdge () const { return _southEdges.empty() ? NULL : _southEdges[0]; }
|
||||
inline Edge* GCell::getNorthEdge () const { return _northEdges.empty() ? NULL : _northEdges[0]; }
|
||||
|
||||
inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); }
|
||||
inline const vector<Contact*>& GCell::getGContacts () const { return _gcontacts; }
|
||||
inline size_t GCell::getDepth () const { return _depth; }
|
||||
|
@ -341,7 +354,7 @@ namespace Anabatic {
|
|||
inline Flags& GCell::flags () { return _flags; }
|
||||
|
||||
inline DbU::Unit GCell::getXMax ( int shrink ) const
|
||||
{ return _eastEdges.empty() ? getCell()->getAbutmentBox().getXMax() - shrink
|
||||
{ return _eastEdges.empty() ? getCell()->getAbutmentBox().getXMax() - shrink
|
||||
: _eastEdges[0]->getOpposite(this)->getXMin() - shrink; }
|
||||
|
||||
inline DbU::Unit GCell::getYMax ( int shrink ) const
|
||||
|
@ -351,11 +364,11 @@ namespace Anabatic {
|
|||
inline DbU::Unit GCell::getXCenter () const { return (getXMin()+getXMax())/2; }
|
||||
inline DbU::Unit GCell::getYCenter () const { return (getYMin()+getYMax())/2; }
|
||||
|
||||
inline DbU::Unit GCell::getConstraintXMax () const
|
||||
{ return getXMax( _eastEdges.empty() ? 0 : 1 ); }
|
||||
inline DbU::Unit GCell::getConstraintXMax ( int shrink ) const
|
||||
{ return getXMax( shrink + (_eastEdges.empty() ? 0 : 1) ); }
|
||||
|
||||
inline DbU::Unit GCell::getConstraintYMax () const
|
||||
{ return getYMax( _northEdges.empty() ? 0 : 1 ); }
|
||||
inline DbU::Unit GCell::getConstraintYMax ( int shrink ) const
|
||||
{ return getYMax( shrink + (_northEdges.empty() ? 0 : 1) ); }
|
||||
|
||||
inline Point GCell::getCenter () const
|
||||
{ return Point( (getXMin()+getXMax())/2, (getYMin()+getYMax())/2); }
|
||||
|
@ -363,10 +376,10 @@ namespace Anabatic {
|
|||
inline Box GCell::getConstraintBox () const
|
||||
{ return Box( getXMin(), getYMin(), getConstraintXMax(), getConstraintYMax() ); }
|
||||
|
||||
inline Interval GCell::getSide ( Flags direction ) const
|
||||
inline Interval GCell::getSide ( Flags direction, int shrink ) const
|
||||
{
|
||||
if (direction.isset(Flags::Vertical)) return Interval( getYMin(), getConstraintYMax() );
|
||||
return Interval( getXMin(), getConstraintXMax() );
|
||||
if (direction.isset(Flags::Vertical)) return Interval( getYMin(), getConstraintYMax(shrink) );
|
||||
return Interval( getXMin(), getConstraintXMax(shrink) );
|
||||
}
|
||||
|
||||
inline void GCell::setObserver ( size_t slot, BaseObserver* observer )
|
||||
|
@ -381,16 +394,16 @@ namespace Anabatic {
|
|||
|
||||
inline GCell::Observable::Observable () : StaticObservable<1>() { }
|
||||
|
||||
inline AutoSegments GCell::getStartSegments ( unsigned int direction )
|
||||
inline AutoSegments GCell::getStartSegments ( Flags direction )
|
||||
{ return (direction&Flags::Horizontal) ? getHStartSegments() : getVStartSegments(); }
|
||||
|
||||
inline AutoSegments GCell::getStopSegments ( unsigned int direction )
|
||||
inline AutoSegments GCell::getStopSegments ( Flags direction )
|
||||
{ return (direction&Flags::Horizontal) ? getHStopSegments() : getVStopSegments(); }
|
||||
|
||||
inline float GCell::getCDensity ( unsigned int flags ) const
|
||||
inline float GCell::getCDensity ( Flags flags ) const
|
||||
{ if (isInvalidated() and not(flags & Flags::NoUpdate)) const_cast<GCell*>(this)->updateDensity(); return _cDensity; }
|
||||
|
||||
inline float GCell::getWDensity ( size_t depth, unsigned int flags ) const
|
||||
inline float GCell::getWDensity ( size_t depth, Flags flags ) const
|
||||
{ if (isInvalidated() and not(flags & Flags::NoUpdate)) const_cast<GCell*>(this)->updateDensity(); return _densities[depth]; }
|
||||
|
||||
inline float GCell::getFragmentation ( size_t depth ) const
|
||||
|
|
|
@ -94,13 +94,13 @@ namespace Anabatic {
|
|||
static inline size_t getLayerDepth ( const Layer* layer );
|
||||
static inline const Layer* getRoutingLayer ( size_t );
|
||||
static inline const Layer* getContactLayer ( size_t );
|
||||
static unsigned int getDirection ( size_t depth );
|
||||
static inline DbU::Unit getPitch ( size_t depth, unsigned int flags );
|
||||
static Flags getDirection ( size_t depth );
|
||||
static inline DbU::Unit getPitch ( size_t depth, Flags flags );
|
||||
static inline DbU::Unit getOffset ( size_t depth );
|
||||
static inline DbU::Unit getWireWidth ( size_t depth );
|
||||
static inline DbU::Unit getViaWidth ( size_t depth );
|
||||
static inline unsigned int getDirection ( const Layer* );
|
||||
static inline DbU::Unit getPitch ( const Layer*, unsigned int flags );
|
||||
static inline Flags getDirection ( const Layer* );
|
||||
static inline DbU::Unit getPitch ( const Layer*, Flags flags );
|
||||
static inline DbU::Unit getOffset ( const Layer* );
|
||||
static inline DbU::Unit getWireWidth ( const Layer* );
|
||||
static inline DbU::Unit getViaWidth ( const Layer* );
|
||||
|
@ -114,11 +114,11 @@ namespace Anabatic {
|
|||
static inline const vector<AutoSegment*>& getDoglegs ();
|
||||
static inline const set<Net*>& getNetsModificateds ();
|
||||
static void close ();
|
||||
static void setAnabaticFlags ( unsigned int );
|
||||
static void setAnabaticFlags ( Flags );
|
||||
static inline void dogleg ( AutoSegment* );
|
||||
static inline void doglegReset ();
|
||||
static inline void revalidateTopology ();
|
||||
static inline void setInvalidateMask ( unsigned int );
|
||||
static inline void setInvalidateMask ( Flags );
|
||||
static inline void invalidate ( Net* );
|
||||
static inline void invalidate ( AutoContact* );
|
||||
static inline void invalidate ( AutoSegment* );
|
||||
|
@ -145,7 +145,7 @@ namespace Anabatic {
|
|||
void _canonize ();
|
||||
void _revalidateTopology ();
|
||||
virtual size_t _revalidate ();
|
||||
DbU::Unit _getPitch ( size_t depth, unsigned int flags ) const;
|
||||
DbU::Unit _getPitch ( size_t depth, Flags flags ) const;
|
||||
Point _getNearestGridPoint ( Point, Box constraints );
|
||||
Record* _getRecord () const;
|
||||
string _getString () const;
|
||||
|
@ -212,16 +212,16 @@ namespace Anabatic {
|
|||
inline size_t Session::getLayerDepth ( const Layer* layer ) { return getRoutingGauge()->getLayerDepth(layer); }
|
||||
inline const Layer* Session::getRoutingLayer ( size_t depth ) { return getRoutingGauge()->getRoutingLayer(depth); }
|
||||
inline const Layer* Session::getContactLayer ( size_t depth ) { return getRoutingGauge()->getContactLayer(depth); }
|
||||
inline DbU::Unit Session::getPitch ( size_t depth, unsigned int flags=Flags::NoFlags ) { return get("getPitch(depth,flags)")->_getPitch( depth, flags ); }
|
||||
inline DbU::Unit Session::getPitch ( size_t depth, Flags flags=Flags::NoFlags ) { return get("getPitch(depth,flags)")->_getPitch( depth, flags ); }
|
||||
inline DbU::Unit Session::getOffset ( size_t depth ) { return getRoutingGauge()->getLayerOffset(depth); }
|
||||
inline DbU::Unit Session::getWireWidth ( size_t depth ) { return getRoutingGauge()->getLayerWireWidth(depth); }
|
||||
inline DbU::Unit Session::getViaWidth ( size_t depth ) { return getRoutingGauge()->getViaWidth(depth); }
|
||||
inline DbU::Unit Session::getPitch ( const Layer* layer, unsigned int flags=Flags::NoFlags ) { return getPitch( getLayerDepth(layer), flags ); }
|
||||
inline DbU::Unit Session::getPitch ( const Layer* layer, Flags flags=Flags::NoFlags ) { return getPitch( getLayerDepth(layer), flags ); }
|
||||
inline DbU::Unit Session::getOffset ( const Layer* layer ) { return getOffset ( getLayerDepth(layer) ); }
|
||||
inline DbU::Unit Session::getWireWidth ( const Layer* layer ) { return getWireWidth( getLayerDepth(layer) ); }
|
||||
inline DbU::Unit Session::getViaWidth ( const Layer* layer ) { return getViaWidth ( getViaDepth(layer) ); }
|
||||
inline DbU::Unit Session::getExtensionCap ( const Layer* layer ) { return getConfiguration()->getExtensionCap(layer); }
|
||||
inline unsigned int Session::getDirection ( const Layer* layer ) { return getDirection( getLayerDepth(layer) ); }
|
||||
inline Flags Session::getDirection ( const Layer* layer ) { return getDirection( getLayerDepth(layer) ); }
|
||||
inline Point Session::getNearestGridPoint ( Point p, Box b ) { return get("getNearestGridPoint()")->_getNearestGridPoint(p,b); }
|
||||
|
||||
inline void Session::_dogleg ( AutoSegment* segment ) { _doglegs.push_back(segment); }
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
FindLibexecinfo.cmake
|
||||
FindLibbfd.cmake
|
||||
FindQwt.cmake
|
||||
FindSphinx.cmake
|
||||
GetGitRevisionDescription.cmake
|
||||
GetGitRevisionDescription.cmake.in
|
||||
)
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
|
||||
# CMake snippet courtesy of Eric Scott BARR's blog.
|
||||
|
||||
find_program( SPHINX_EXECUTABLE NAMES sphinx-build
|
||||
HINTS $ENV{SPHINX_DIR}
|
||||
PATH_SUFFIXES bin
|
||||
DOC "Sphinx documentation generator"
|
||||
)
|
||||
|
||||
include( FindPackageHandleStandardArgs )
|
||||
find_package_handle_standard_args( Sphinx DEFAULT_MSG SPHINX_EXECUTABLE )
|
||||
mark_as_advanced( SPHINX_EXECUTABLE )
|
|
@ -147,7 +147,7 @@ def guessShell ():
|
|||
#if os.environ.has_key('SHELL'): return os.environ['SHELL']
|
||||
|
||||
psCommand = subprocess.Popen ( ['ps', '-p', str(os.getppid()) ], stdout=subprocess.PIPE )
|
||||
shell = psCommand.stdout.readlines()[1][:-1].split()[-1]
|
||||
shell = psCommand.stdout.readlines()[1][:-1].split()[3].lstrip('-')
|
||||
whichCommand = subprocess.Popen ( ['which', shell ], stdout=subprocess.PIPE )
|
||||
shellPath = whichCommand.stdout.readlines()[0][:-1]
|
||||
|
||||
|
@ -273,9 +273,10 @@ if __name__ == "__main__":
|
|||
or osType.startswith("Linux.sl") \
|
||||
or osType.startswith("Linux.el") \
|
||||
or osType.startswith("Linux.fc") \
|
||||
or osType.startswith("Darwin") \
|
||||
or osType.startswith("Cygwin"):
|
||||
sitePackagesDir = "%s/python%s/site-packages" % (absLibDir,version)
|
||||
elif osType.startswith("Darwin"):
|
||||
sitePackagesDir = "%s/%s/site-packages" % (absLibDir,version)
|
||||
else:
|
||||
sitePackagesDir = "%s/python%s/dist-packages" % (absLibDir,version)
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
setup_qt()
|
||||
|
||||
find_package(LibXml2 REQUIRED)
|
||||
find_package(PythonLibs REQUIRED)
|
||||
find_package(PythonLibs 2 REQUIRED)
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(BISON REQUIRED)
|
||||
find_package(FLEX REQUIRED)
|
||||
|
|
|
@ -12,6 +12,10 @@
|
|||
font-family: "Open Sans", Verdana, sans-serif;;
|
||||
}
|
||||
|
||||
html {
|
||||
background: #dddddd;
|
||||
}
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
|
@ -20,9 +24,10 @@
|
|||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin-top: 2em;
|
||||
width: 550pt;
|
||||
width: 600pt;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
padding: 30pt;
|
||||
/*
|
||||
margin-right: 12%;
|
||||
margin-left: 12%;
|
||||
|
@ -38,19 +43,21 @@
|
|||
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
/*font-family: "Liberation Serif", sans-serif;*/
|
||||
/*font-family: "URW Bookman L", "Liberation Serif", sans-serif;*/
|
||||
font-family: "URW Bookman L";
|
||||
}
|
||||
|
||||
h1 { text-align: center; }
|
||||
h1.header { text-align: center; }
|
||||
h1 { text-align: left; }
|
||||
h2, h3, h4, h5, h6 { text-align: left;
|
||||
padding-top: 11pt;
|
||||
}
|
||||
h1, h2, h3 { /*font-family: "Liberation Serif", sans-serif; */
|
||||
/*color: #09550B;*/
|
||||
}
|
||||
h1 { font-weight:normal; font-size: 170%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h2 { font-weight:normal; font-size: 140%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h3 { font-weight: bold; font-size: 118%; letter-spacing:0.2em; word-spacing:0.4em; }
|
||||
h1 { font-weight: bold; font-size: 170%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h2 { font-weight: bold; font-size: 140%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h3 { font-weight: bold; font-size: 118%; /*letter-spacing:0.2em; word-spacing:0.4em;*/ }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
@ -156,14 +163,20 @@
|
|||
a:link img, a:visited img { border-style: none; }
|
||||
a img { color: white; }
|
||||
|
||||
a {
|
||||
color: black;
|
||||
border-bottom: 1px solid black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:link, a:active, a:visited {
|
||||
color: #09550B;
|
||||
text-decoration: none;
|
||||
/*color: #09550B;*/
|
||||
/*text-decoration: none;*/
|
||||
}
|
||||
|
||||
a:hover, a:focus {
|
||||
color: #FF9900;
|
||||
text-decoration: underline;
|
||||
/*color: #FF9900; */
|
||||
border-bottom: 2px solid black;
|
||||
}
|
||||
|
||||
|
||||
|
@ -210,6 +223,7 @@
|
|||
padding: 2px 0px;
|
||||
text-align: center;
|
||||
background-color: black;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
table.header td {
|
||||
|
@ -220,6 +234,18 @@
|
|||
font-size: 110%;
|
||||
}
|
||||
|
||||
table.UserDefined {
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
table.UserDefined th {
|
||||
border: 1px solid;
|
||||
}
|
||||
|
||||
table.UserDefined td {
|
||||
padding: 0px 5px;
|
||||
}
|
||||
|
||||
table.DoxUser td, table.DoxUser th {
|
||||
padding: 0px 5px;
|
||||
border: 0px;
|
||||
|
@ -349,7 +375,7 @@
|
|||
display: table-cell;
|
||||
text-align: center;
|
||||
padding: 2pt;
|
||||
width: 10%;
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
ul.tablist li:hover {
|
||||
|
@ -362,7 +388,9 @@
|
|||
color: white;
|
||||
}
|
||||
|
||||
ul.tablist * a:link img, ul.tablist * a:visited img { border-style: none; }
|
||||
ul.tablist * a { border-bottom: none; }
|
||||
|
||||
ul.tablist * a:link img, ul.tablist * a:visited img { border-style: none; border-bottom: none; }
|
||||
|
||||
ul.tablist * a:link, ul.tablist * a:visited {
|
||||
color: black;
|
||||
|
@ -410,8 +438,8 @@
|
|||
width: 100%-4px;
|
||||
/*background-color: #DADAEF;*/
|
||||
/*background-color: #eeeeff;*/
|
||||
/*background-color: #EEEEEE;*/
|
||||
background-color: #CCE6CA;
|
||||
background-color: #cccccc;
|
||||
/*background-color: #CCE6CA;*/
|
||||
border: 0px solid #003300;
|
||||
text-align: center;
|
||||
margin: 0px;
|
||||
|
@ -427,11 +455,18 @@
|
|||
}
|
||||
|
||||
a.qindex, a.qindex:visited {
|
||||
color: #09550B;
|
||||
/*color: #09550B;*/
|
||||
color: black;
|
||||
border: 2px solid #cccccc;
|
||||
padding: 2px 2px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
a.qindex:hover {
|
||||
background-color: #ddddff;
|
||||
/*background-color: #ddddff;*/
|
||||
font-weight: bold;
|
||||
padding: 2px 2px;
|
||||
border: 2px solid black;
|
||||
}
|
||||
|
||||
a.qindexHL, a.qindexHL:hover, a.qindexHL:visited {
|
||||
|
@ -544,6 +579,7 @@
|
|||
{
|
||||
font-family: time;
|
||||
font-size: 250%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
|
@ -554,9 +590,10 @@
|
|||
div.fragment {
|
||||
font-family: "Monospace";
|
||||
font-size: 80%;
|
||||
border: dashed;
|
||||
border-width: thin;
|
||||
border-color: #003300;
|
||||
border: none;
|
||||
/*border-width: thin; */
|
||||
/*border-color: #003300;*/
|
||||
/*background-color: #FCFCE1;*/
|
||||
background-color: #FCFCE1;
|
||||
padding: 0.5em;
|
||||
margin-left: 5%;
|
||||
|
@ -583,9 +620,17 @@
|
|||
* Attributes Listing.
|
||||
*/
|
||||
|
||||
p.formulaDsp {
|
||||
text-align: center;
|
||||
}
|
||||
a.el, a.elRef {
|
||||
font-family: Courier;
|
||||
font-weight: bold;
|
||||
font-size: 110%;
|
||||
color: black;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
p.formulaDsp {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.mdTable {
|
||||
/*border: 1px solid #868686;*/
|
||||
|
@ -628,10 +673,12 @@ p.formulaDsp {
|
|||
}
|
||||
|
||||
.memproto {
|
||||
background-color: #CCE6CA;
|
||||
/*background-color: #CCE6CA;*/
|
||||
background-color: #cccccc;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
border-color: #008500;
|
||||
/*border-color: #008500;*/
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
.memname {
|
||||
|
@ -650,7 +697,8 @@ p.formulaDsp {
|
|||
/*margin-top: -8px;*/
|
||||
border-left-width: 1px;
|
||||
border-left-style: solid;
|
||||
border-color: #008500;
|
||||
/*border-color: #008500;*/
|
||||
border-color: black;
|
||||
}
|
||||
|
||||
div.contents * table tr {
|
||||
|
|
|
@ -128,43 +128,43 @@ stylesTable = \
|
|||
, (Drawing, 'spot' , { 'color':'White' , 'border':2, 'threshold':6.0*scale })
|
||||
, (Drawing, 'ghost' , { 'color':'White' , 'border':1 })
|
||||
, (Drawing, 'text.ruler' , { 'color':'White' , 'border':1, 'threshold':0.0 *scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'White' , 'border':1, 'threshold':4.0 *scale })
|
||||
, (Drawing, 'text.reference', { 'color':'White' , 'border':1, 'threshold':20.0*scale })
|
||||
, (Drawing, 'text.instance' , { 'color':'White' , 'border':1, 'threshold':400.0 *scale })
|
||||
, (Drawing, 'text.reference', { 'color':'White' , 'border':1, 'threshold':200.0*scale })
|
||||
, (Drawing, 'undef' , { 'color':'Violet' , 'border':0, 'pattern':'2244118822441188' })
|
||||
|
||||
# Active Layers.
|
||||
, (Group , 'Active Layers')
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'urgo.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'urgo.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'antihash0.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'poids2.8' , 'border':1, 'threshold':1.50*scale })
|
||||
, (Drawing, 'nWell' , { 'color':'Tan' , 'pattern':'urgo.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'pWell' , { 'color':'LightYellow', 'pattern':'urgo.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'nImplant', { 'color':'LawnGreen' , 'pattern':'antihash0.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'pImplant', { 'color':'Yellow' , 'pattern':'antihash0.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'active' , { 'color':'White' , 'pattern':'antihash1.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'poly' , { 'color':'Red' , 'pattern':'poids2.8' , 'border':1, 'threshold':0*scale })
|
||||
, (Drawing, 'poly2' , { 'color':poly2Color , 'pattern':'poids2.8' , 'border':1, 'threshold':0*scale })
|
||||
|
||||
# Routing Layers.
|
||||
, (Group , 'Routing Layers')
|
||||
#, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'light_antislash0.8', 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':0.80*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metcap', { 'color':'DarkTurquoise', 'pattern':'poids2.8' , 'border':2, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal7', { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal8', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.02*scale })
|
||||
, (Drawing, 'metal1', { 'color':'Blue' , 'pattern':'slash.8' , 'border':1, 'threshold':00*scale })
|
||||
, (Drawing, 'metal2', { 'color':'Aqua' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metcap', { 'color':'DarkTurquoise', 'pattern':'poids2.8' , 'border':2, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal3', { 'color':'LightPink' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal4', { 'color':'Green' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal5', { 'color':'Yellow' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal6', { 'color':'Violet' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal7', { 'color':'Red' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
, (Drawing, 'metal8', { 'color':'Blue' , 'pattern':'poids4.8' , 'border':1, 'threshold':0.0*scale })
|
||||
|
||||
# Cuts (VIA holes).
|
||||
, (Group , 'Cuts (VIA holes)')
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':1.50*scale })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Blue' , 'threshold':0.80*scale })
|
||||
, (Drawing, 'cut0', { 'color':'0,150,150', 'threshold':0*scale })
|
||||
, (Drawing, 'cut1', { 'color':'Aqua' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut2', { 'color':'LightPink', 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut3', { 'color':'Green' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut4', { 'color':'Yellow' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut5', { 'color':'Violet' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut6', { 'color':'Red' , 'threshold':0.0*scale })
|
||||
, (Drawing, 'cut7', { 'color':'Blue' , 'threshold':0.0*scale })
|
||||
|
||||
# MIM6.
|
||||
, (Group , 'MIM6')
|
||||
|
@ -192,7 +192,7 @@ stylesTable = \
|
|||
, (Drawing, 'gmetalv' , { 'color':'200,200,255', 'pattern':'light_antihash1.8', 'border':1 })
|
||||
, (Drawing, 'gcut' , { 'color':'255,255,190', 'border':1 })
|
||||
, (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4, 'threshold':0.02*scale })
|
||||
, (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4, 'threshold':0.10*scale })
|
||||
, (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':2, 'threshold':0.10*scale })
|
||||
)
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
|
|
@ -210,13 +210,13 @@ namespace CRL {
|
|||
cdebug_log(100,1) << "RoutingLayerGauge::getTrackIndex ( " << position << " )" << endl;
|
||||
|
||||
long modulo;
|
||||
long depth;
|
||||
long index;
|
||||
|
||||
divide ( position-start, depth, modulo );
|
||||
divide ( position-start, index, modulo );
|
||||
|
||||
cdebug_log(100,0) << "depth := " << depth << endl;
|
||||
cdebug_log(100,0) << "index := " << index << endl;
|
||||
|
||||
if ( depth < 0 ) {
|
||||
if ( index < 0 ) {
|
||||
cdebug_tabw(100,-1);
|
||||
return 0;
|
||||
|
||||
|
@ -232,13 +232,13 @@ namespace CRL {
|
|||
throw Error ( badExactPosition, getString(this).c_str(), DbU::getValueString(position).c_str() );
|
||||
|
||||
if ( mode & Constant::Superior ) {
|
||||
if ( modulo != 0 ) depth++;
|
||||
if ( modulo != 0 ) index++;
|
||||
} else if ( mode & Constant::Nearest ) {
|
||||
if ( modulo > _pitch / 2 ) depth++;
|
||||
if ( modulo > _pitch / 2 ) index++;
|
||||
}
|
||||
|
||||
unsigned int tracksNumber = getTrackNumber(start,stop);
|
||||
if ( (unsigned)depth >= tracksNumber ) {
|
||||
if ( (unsigned)index >= tracksNumber ) {
|
||||
cdebug_tabw(100,-1);
|
||||
return (tracksNumber > 0) ? tracksNumber-1 : 0;
|
||||
// throw Error ( overflowIndex
|
||||
|
@ -251,7 +251,7 @@ namespace CRL {
|
|||
|
||||
cdebug_tabw(100,-1);
|
||||
|
||||
return depth;
|
||||
return index;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -71,13 +71,13 @@ namespace CRL {
|
|||
connect ( openAction, SIGNAL(triggered()), this, SLOT(openCell()) );
|
||||
}
|
||||
|
||||
QMenu* debugMenu = createDebugMenu ();
|
||||
/*QMenu* debugMenu =*/ createDebugMenu ();
|
||||
_stressDisplayAction = new QAction ( tr("Stress Display"), this );
|
||||
_stressDisplayAction->setObjectName ( "viewer.menuBar.debug.stressDisplay" );
|
||||
_stressDisplayAction->setStatusTip ( tr("Intensive use of display redrawing") );
|
||||
connect ( _stressDisplayAction, SIGNAL(triggered()), this, SLOT(stressDisplay()) );
|
||||
|
||||
debugMenu->addAction ( _stressDisplayAction );
|
||||
//debugMenu->addAction ( _stressDisplayAction );
|
||||
|
||||
getCellWidget()->addDrawExtensionGo ( DemoGo::staticGetName()
|
||||
, DemoGo::initDrawDemoGo
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
set_lib_link_mode()
|
||||
setup_sysconfdir("${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
find_package(PythonLibs REQUIRED)
|
||||
find_package(PythonLibs 2 REQUIRED)
|
||||
find_package(PythonSitePackages REQUIRED)
|
||||
find_package(VLSISAPD REQUIRED)
|
||||
find_package(HURRICANE REQUIRED)
|
||||
|
|
|
@ -41,8 +41,8 @@ def kwParseMain ( **kw ):
|
|||
editor = kw['editor']
|
||||
if cell == None: cell = editor.getCell()
|
||||
|
||||
if cell == None:
|
||||
raise ErrorMessage( 3, 'Chip: No cell loaded yet.' )
|
||||
#if cell == None:
|
||||
# raise ErrorMessage( 3, 'Chip: No cell loaded yet.' )
|
||||
|
||||
return cell, editor
|
||||
|
||||
|
|
|
@ -5,16 +5,14 @@
|
|||
|
||||
cmake_minimum_required(VERSION 2.4.0)
|
||||
|
||||
OPTION(BUILD_DOC "Build the documentation (html+latex)" OFF)
|
||||
option(BUILD_DOC "Build the documentation (html+pdf)" OFF)
|
||||
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/")
|
||||
find_package(Bootstrap REQUIRED)
|
||||
find_package(Sphinx REQUIRED)
|
||||
setup_project_paths(CORIOLIS)
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${CRLCORE_SOURCE_DIR}/cmake_modules/")
|
||||
print_cmake_module_path()
|
||||
|
||||
set_cmake_policies()
|
||||
check_distribution()
|
||||
|
||||
#if(BUILD_DOC)
|
||||
# include(UseLATEX)
|
||||
|
@ -22,11 +20,77 @@
|
|||
|
||||
add_subdirectory(examples)
|
||||
if(BUILD_DOC)
|
||||
add_subdirectory(UsersGuide)
|
||||
set ( htmlInstallDir share/doc/coriolis2/en/html/main )
|
||||
set ( pdfInstallDir share/doc/coriolis2/en/pdf/main )
|
||||
|
||||
set ( pythonCppRst PythonCpp/pdfHeader.rst
|
||||
PythonCpp/Introduction.rst
|
||||
PythonCpp/Configuration.rst
|
||||
PythonCpp/DBoStandalone.rst
|
||||
PythonCpp/DBoHierarchy.rst
|
||||
PythonCpp/NonDBo.rst
|
||||
PythonCpp/DbU.rst
|
||||
PythonCpp/Name.rst )
|
||||
|
||||
set ( usersGuideRst UsersGuide/pdfHeader.rst
|
||||
UsersGuide/LicenseCredits.rst
|
||||
UsersGuide/Releases.rst
|
||||
UsersGuide/Installation.rst
|
||||
UsersGuide/Configuration.rst
|
||||
UsersGuide/ViewerTools.rst
|
||||
UsersGuide/ScriptsPlugins.rst )
|
||||
|
||||
set ( rdsRst RDS/pdfHeader.rst
|
||||
RDS/RDSpage.rst )
|
||||
|
||||
add_custom_target ( doc_HTML ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}
|
||||
&& rm -rf _build
|
||||
&& sphinx-build -b html -d _build/doctrees . _build/html )
|
||||
add_dependencies ( doc_HTML ../etc/definitions.rst
|
||||
../_static/SoC.css
|
||||
../_static/www-SoC.css
|
||||
../_static/SoC-ReST.css
|
||||
../_static/pygments.css
|
||||
CrlCore/CrlCore.rst
|
||||
DpGen/DpGen.rst
|
||||
Hurricane/Hurricane.rst
|
||||
Patterns/Patterns.rst
|
||||
Stratus/Stratus.rst
|
||||
Unicorn/Unicorn.rst
|
||||
Viewer/Viewer.rst
|
||||
${usersGuideRst} UsersGuide/index.rst
|
||||
${pythonCppRst} PythonCpp/index.rst
|
||||
${rdsRst} RDS/index.rst
|
||||
)
|
||||
|
||||
add_custom_target ( pdf_UsersGuide ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& ../etc/doPdf.sh ${usersGuideRst} UsersGuide.rst )
|
||||
add_dependencies ( pdf_UsersGuide ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${usersGuideRst} )
|
||||
|
||||
add_custom_target ( pdf_PythonCpp ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/PythonCpp
|
||||
&& ../etc/doPdf.sh ${pythonCppRst} PythonCpp.rst
|
||||
)
|
||||
add_dependencies ( pdf_PythonCpp ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${pythonCppRst} )
|
||||
|
||||
add_custom_target ( pdf_RDS ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/RDS
|
||||
&& ../etc/doPdf.sh ${rdsRst} RDS.rst
|
||||
)
|
||||
add_dependencies ( pdf_RDS ../etc/definitions.rst
|
||||
../etc/SoC-ReST.tex
|
||||
${pythonCppRst} )
|
||||
|
||||
install ( DIRECTORY _build/html/ DESTINATION ${htmlInstallDir} )
|
||||
install ( FILES RDS/RDS.pdf
|
||||
PythonCpp/PythonCpp.pdf
|
||||
UsersGuide/UsersGuide.pdf DESTINATION ${pdfInstallDir} )
|
||||
|
||||
endif(BUILD_DOC)
|
||||
|
||||
set ( htmlInstallDir share/doc/coriolis2/ )
|
||||
set ( latexInstallDir share/doc/coriolis2/ )
|
||||
|
||||
install ( FILES general-index.html DESTINATION ${htmlInstallDir} RENAME index.html )
|
||||
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
.. Coriolis documentation master file, created by
|
||||
sphinx-quickstart on Mon Jul 10 15:08:36 2017.
|
||||
You can adapt this file completely to your liking, but it should at least
|
||||
contain the root `toctree` directive.
|
||||
|
||||
Comprenhensive Table of Contents
|
||||
================================
|
||||
|
||||
.. toctree::
|
||||
|
||||
UsersGuide/index.rst
|
||||
Stratus/Stratus.rst
|
||||
DpGen/DpGen.rst
|
||||
Patterns/Patterns.rst
|
||||
Hurricane/Hurricane.rst
|
||||
Viewer/Viewer.rst
|
||||
CrlCore/CrlCore.rst
|
||||
Unicorn/Unicorn.rst
|
||||
PythonCpp/index.rst
|
||||
RDS/index.rst
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
====================
|
||||
CRL Core Reference
|
||||
====================
|
||||
|
||||
The CRL Core C++ API reference is generated by Doxygen_ and is
|
||||
available here: `CRL Core <file:../../crlcore/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=================
|
||||
DpGen Reference
|
||||
=================
|
||||
|
||||
The DpGen extension of the Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `DpGen <file:../../dpgen/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=====================
|
||||
Hurricane Reference
|
||||
=====================
|
||||
|
||||
The Hurricane C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Hurricane <file:../../hurricane/index.html>`_
|
|
@ -0,0 +1,14 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=====================
|
||||
Katabatic Reference
|
||||
=====================
|
||||
|
||||
The Katabatic C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Katana <file:../../katabatic/index.html>`_
|
||||
|
||||
.. note:: The Katabatic API has served as a base for it's
|
||||
mixed signal conterpart **Anabatic**.
|
|
@ -0,0 +1,14 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
=================
|
||||
Kite Reference
|
||||
=================
|
||||
|
||||
The Kite C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Kite <file:../../kite/index.html>`_
|
||||
|
||||
.. note:: The Kite API has also served has a base for it's
|
||||
mixed-signal conterpart Katana (:sc:`Kit[e]-Ana[logic]`).
|
|
@ -0,0 +1,153 @@
|
|||
# Makefile for Sphinx documentation
|
||||
#
|
||||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
# Internal variables.
|
||||
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||
PAPEROPT_letter = -D latex_paper_size=letter
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
# the i18n builder cannot share the environment and doctrees with the others
|
||||
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
|
||||
|
||||
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
|
||||
|
||||
help:
|
||||
@echo "Please use \`make <target>' where <target> is one of"
|
||||
@echo " html to make standalone HTML files"
|
||||
@echo " dirhtml to make HTML files named index.html in directories"
|
||||
@echo " singlehtml to make a single large HTML file"
|
||||
@echo " pickle to make pickle files"
|
||||
@echo " json to make JSON files"
|
||||
@echo " htmlhelp to make HTML files and a HTML help project"
|
||||
@echo " qthelp to make HTML files and a qthelp project"
|
||||
@echo " devhelp to make HTML files and a Devhelp project"
|
||||
@echo " epub to make an epub"
|
||||
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
|
||||
@echo " latexpdf to make LaTeX files and run them through pdflatex"
|
||||
@echo " text to make text files"
|
||||
@echo " man to make manual pages"
|
||||
@echo " texinfo to make Texinfo files"
|
||||
@echo " info to make Texinfo files and run them through makeinfo"
|
||||
@echo " gettext to make PO message catalogs"
|
||||
@echo " changes to make an overview of all changed/added/deprecated items"
|
||||
@echo " linkcheck to check all external links for integrity"
|
||||
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
|
||||
|
||||
clean:
|
||||
-rm -rf $(BUILDDIR)/*
|
||||
|
||||
html:
|
||||
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
|
||||
|
||||
dirhtml:
|
||||
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
|
||||
|
||||
singlehtml:
|
||||
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
|
||||
@echo
|
||||
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
|
||||
|
||||
pickle:
|
||||
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
|
||||
@echo
|
||||
@echo "Build finished; now you can process the pickle files."
|
||||
|
||||
json:
|
||||
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
|
||||
@echo
|
||||
@echo "Build finished; now you can process the JSON files."
|
||||
|
||||
htmlhelp:
|
||||
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run HTML Help Workshop with the" \
|
||||
".hhp project file in $(BUILDDIR)/htmlhelp."
|
||||
|
||||
qthelp:
|
||||
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
|
||||
@echo
|
||||
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
|
||||
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
|
||||
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Coriolis.qhcp"
|
||||
@echo "To view the help file:"
|
||||
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Coriolis.qhc"
|
||||
|
||||
devhelp:
|
||||
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
|
||||
@echo
|
||||
@echo "Build finished."
|
||||
@echo "To view the help file:"
|
||||
@echo "# mkdir -p $$HOME/.local/share/devhelp/Coriolis"
|
||||
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Coriolis"
|
||||
@echo "# devhelp"
|
||||
|
||||
epub:
|
||||
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
|
||||
@echo
|
||||
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
|
||||
|
||||
latex:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo
|
||||
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
|
||||
@echo "Run \`make' in that directory to run these through (pdf)latex" \
|
||||
"(use \`make latexpdf' here to do that automatically)."
|
||||
|
||||
latexpdf:
|
||||
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
|
||||
@echo "Running LaTeX files through pdflatex..."
|
||||
$(MAKE) -C $(BUILDDIR)/latex all-pdf
|
||||
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
|
||||
|
||||
text:
|
||||
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
|
||||
@echo
|
||||
@echo "Build finished. The text files are in $(BUILDDIR)/text."
|
||||
|
||||
man:
|
||||
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
|
||||
@echo
|
||||
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
|
||||
|
||||
texinfo:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo
|
||||
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
|
||||
@echo "Run \`make' in that directory to run these through makeinfo" \
|
||||
"(use \`make info' here to do that automatically)."
|
||||
|
||||
info:
|
||||
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
|
||||
@echo "Running Texinfo files through makeinfo..."
|
||||
make -C $(BUILDDIR)/texinfo info
|
||||
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
|
||||
|
||||
gettext:
|
||||
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
|
||||
@echo
|
||||
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
|
||||
|
||||
changes:
|
||||
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
|
||||
@echo
|
||||
@echo "The overview file is in $(BUILDDIR)/changes."
|
||||
|
||||
linkcheck:
|
||||
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
|
||||
@echo
|
||||
@echo "Link check complete; look for any errors in the above output " \
|
||||
"or in $(BUILDDIR)/linkcheck/output.txt."
|
||||
|
||||
doctest:
|
||||
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
|
||||
@echo "Testing of doctests in the sources finished, look at the " \
|
||||
"results in $(BUILDDIR)/doctest/output.txt."
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
====================
|
||||
Patterns Reference
|
||||
====================
|
||||
|
||||
The Patterns extension of the Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `Patterns <file:../../patterns/index.html>`_
|
|
@ -0,0 +1,42 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
2. Basic File Structure and CMake configuration
|
||||
=================================================
|
||||
|
||||
As a first example we will consider the ``Hurrican::Library``
|
||||
class. To export a class into Python, we must create three files:
|
||||
|
||||
#. ``PyLibrary.h``, defines the ``PyLibrary`` C-Struct and the functions
|
||||
needed outside the module istself (mostly for ``PyHurricane.cpp``).
|
||||
|
||||
#. ``PyLibrary.cpp``, contains the complete wrapping of the class and
|
||||
the Python type definition (``PyTypeLibrary``).
|
||||
|
||||
#. ``PyHurricane.cpp``, the definition of the Python module into which
|
||||
the classes are registered. The module act as a ``namespace`` in
|
||||
Python so it is good practice to give it the same name as it's
|
||||
associated C++ namespace.
|
||||
|
||||
|newpage|
|
||||
|
||||
To build a Python module in |cmake|, use the following macro:
|
||||
|
||||
.. code-block:: cmake
|
||||
|
||||
set( pyCpps PyLibrary.cpp
|
||||
PyHurricane.cpp )
|
||||
set( pyIncludes hurricane/isobar/PyLibrary.h
|
||||
|
||||
add_python_module( "${pyCpps}"
|
||||
"${pyIncludes}"
|
||||
"isobar;1.0;1" # Name & version of the supporting
|
||||
# shared library.
|
||||
Hurricane # Name of the Python module will give:
|
||||
# Hurricane.so
|
||||
"${depLibs}" # List of dependency libraries.
|
||||
include/coriolis2/hurricane/isobar
|
||||
# Where to install the include files.
|
||||
)
|
|
@ -0,0 +1,439 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
4. Case 2 - Hierarchy of DBo Derived Classes
|
||||
==============================================
|
||||
|
||||
Now we want to export the following C++ class hierarchy into Python: ::
|
||||
|
||||
PyEntity <-- PyComponent <-+- PyContact
|
||||
+- PySegment <-+- PyHorizontal
|
||||
+- PyVertical
|
||||
|
||||
|
||||
4.1 Base Class Header
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Remark:** this is only a partial description of the tree for the sake of
|
||||
clarity.
|
||||
|
||||
One important fact to remember is that ``PyEntity`` and ``PyComponent``
|
||||
being related to C++ abstract classes, no objects of those types will be
|
||||
created, only ``PyContact``, ``PyHorizontal`` or ``PyVertical`` will.
|
||||
|
||||
The consequence is that there is no ``PyEntity_Link()`` like in :ref:`3.1`
|
||||
but instead two functions:
|
||||
|
||||
#. ``PyEntity_NEW()`` which create the relevant ``PyEntity`` *derived*
|
||||
object from the ``Entity`` one. For example, if the ``Entity*`` given
|
||||
as argument is in fact a ``Horizontal*``, then the function will
|
||||
return a ``PyHorizontal*``.
|
||||
|
||||
#. ``EntityCast()`` do the reverse of ``PyEntity_NEW()`` that is, from
|
||||
a ``PyEntity``, return the C++ *derived* object. Again, if the
|
||||
``PyEntity*`` is a ``PyHorizontal*``, the function will cast it as
|
||||
a ``Horizontal*`` *then* return it as an ``Entity*``.
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#ifndef ISOBAR_PY_ENTITY_H
|
||||
#define ISOBAR_PY_ENTITY_H
|
||||
|
||||
#include "hurricane/isobar/PyHurricane.h"
|
||||
#include "hurricane/Entity.h"
|
||||
|
||||
namespace Isobar {
|
||||
extern "C" {
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
Hurricane::Entity* _object;
|
||||
} PyEntity;
|
||||
|
||||
extern PyObject* PyEntity_NEW ( Hurricane::Entity* entity );
|
||||
extern void PyEntity_LinkPyType ();
|
||||
extern PyTypeObject PyTypeEntity;
|
||||
extern PyMethodDef PyEntity_Methods[];
|
||||
|
||||
|
||||
#define IsPyEntity(v) ( (v)->ob_type == &PyTypeEntity )
|
||||
#define PYENTITY(v) ( (PyEntity*)(v) )
|
||||
#define PYENTITY_O(v) ( PYENTITY(v)->_object )
|
||||
|
||||
} // extern "C".
|
||||
|
||||
Hurricane::Entity* EntityCast ( PyObject* derivedObject );
|
||||
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif // ISOBAR_PY_ENTITY_H
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
4.2 Base Class File
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`3.2 Class Associated File` are:
|
||||
|
||||
#. No call to ``DBoLinkCreateMethod()`` because there must be no ``PyEntity_Link()``,
|
||||
but the definitions of ``PyEntity_NEW()`` and ``EntityCast``.
|
||||
|
||||
#. For defining the ``PyTypeEntity`` Python type, we call a different
|
||||
macro: ``PyTypeRootObjectDefinitions``, dedicated to base classes.
|
||||
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyCell.h"
|
||||
#include "hurricane/isobar/PyHorizontal.h"
|
||||
#include "hurricane/isobar/PyVertical.h"
|
||||
#include "hurricane/isobar/PyContact.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Entity,entity,function)
|
||||
|
||||
DBoDestroyAttribute(PyEntity_destroy ,PyEntity)
|
||||
|
||||
static PyObject* PyEntity_getCell ( PyEntity *self )
|
||||
{
|
||||
Cell* cell = NULL;
|
||||
HTRY
|
||||
METHOD_HEAD( "Entity.getCell()" )
|
||||
cell = entity->getCell();
|
||||
HCATCH
|
||||
return PyCell_Link( cell );
|
||||
}
|
||||
|
||||
PyMethodDef PyEntity_Methods[] =
|
||||
{ { "getCell", (PyCFunction)PyEntity_getCell, METH_NOARGS
|
||||
, "Returns the entity cell." }
|
||||
, { "destroy", (PyCFunction)PyEntity_destroy, METH_NOARGS
|
||||
, "Destroy associated hurricane object, the python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
||||
DBoDeleteMethod(Entity)
|
||||
PyTypeObjectLinkPyType(Entity)
|
||||
|
||||
#else // End of Python Module Code Part.
|
||||
|
||||
PyObject* PyEntity_NEW ( Entity* entity )
|
||||
{
|
||||
if (not entity) {
|
||||
PyErr_SetString ( HurricaneError, "Invalid Entity (bad occurrence)" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Horizontal* horizontal = dynamic_cast<Horizontal*>(entity);
|
||||
if (horizontal) return PyHorizontal_Link( horizontal );
|
||||
|
||||
Vertical* vertical = dynamic_cast<Vertical*>(entity);
|
||||
if (vertical) return PyVertical_Link( vertical );
|
||||
|
||||
Contact* contact = dynamic_cast<Contact*>(entity);
|
||||
if (contact) return PyContact_Link( contact );
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
PyTypeRootObjectDefinitions(Entity)
|
||||
|
||||
#endif // Shared Library Code Part (1).
|
||||
|
||||
} // extern "C".
|
||||
|
||||
|
||||
#if !defined(__PYTHON_MODULE__)
|
||||
|
||||
Hurricane::Entity* EntityCast ( PyObject* derivedObject ) {
|
||||
if (IsPyHorizontal(derivedObject)) return PYHORIZONTAL_O(derivedObject);
|
||||
if (IsPyVertical (derivedObject)) return PYVERTICAL_O(derivedObject);
|
||||
if (IsPyContact (derivedObject)) return PYCONTACT_O(derivedObject);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif // Shared Library Code Part (2).
|
||||
|
||||
} // Isobar namespace.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
4.3 Intermediate Class Header
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`3.1 Class Associated Header File` are:
|
||||
|
||||
#. As for ``PyEntity``, and because this is still an abstract class,
|
||||
there is no ``PyComponent_Link()`` function.
|
||||
|
||||
#. The definition of the ``PyComponent`` |struct| is differs. There is
|
||||
no ``PyObject_HEAD`` (it is a Python *derived* class). The only
|
||||
field is of the base class type ``PyEntity`` and for use with
|
||||
Coriolis macros, **it must** be named ``_baseObject`` (note that
|
||||
this is *not* a pointer but a whole object).
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#ifndef ISOBAR_PY_COMPONENT_H
|
||||
#define ISOBAR_PY_COMPONENT_H
|
||||
|
||||
#include "hurricane/isobar/PyEntity.h"
|
||||
#include "hurricane/Component.h"
|
||||
|
||||
namespace Isobar {
|
||||
extern "C" {
|
||||
|
||||
typedef struct {
|
||||
PyEntity _baseObject;
|
||||
} PyComponent;
|
||||
|
||||
extern PyTypeObject PyTypeComponent;
|
||||
extern PyMethodDef PyComponent_Methods[];
|
||||
extern void PyComponent_LinkPyType ();
|
||||
|
||||
#define IsPyComponent(v) ((v)->ob_type == &PyTypeComponent)
|
||||
#define PYCOMPONENT(v) ((PyComponent*)(v))
|
||||
#define PYCOMPONENT_O(v) (static_cast<Component*>(PYCOMPONENT(v)->_baseObject._object))
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
4.4 Intermediate Class File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`3.2 Class Associated File` are:
|
||||
|
||||
1. Redefinition of the default macros ``ACCESS_OBJECT`` and ``ACCESS_CLASS``.
|
||||
|
||||
* The pointer to the C++ encapsulated object (attribute ``_object``) is hold
|
||||
by the base class ``PyEntity``. The ``ACCESS_OBJECT`` macro which is tasked
|
||||
to give access to that attribute is then ``_baseObject._object`` as
|
||||
``PyComponent`` is a direct derived class of ``PyEntity``.
|
||||
|
||||
* ``ACCESS_CLASS`` is similar to ``ACCESS_OBJECT`` for accessing the base
|
||||
class, that is a pointer to ``PyEntity``.
|
||||
|
||||
|newpage|
|
||||
|
||||
2. For defining the ``PyTypeComponent`` Python type, we call a yet different
|
||||
macro: ``PyTypeInheritedObjectDefinitions()``, dedicated to derived classes.
|
||||
For this this macro we need to give as argument the derived class and the
|
||||
base class.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyComponent.h"
|
||||
#include "hurricane/isobar/PyNet.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
#undef ACCESS_OBJECT
|
||||
#undef ACCESS_CLASS
|
||||
#define ACCESS_OBJECT _baseObject._object
|
||||
#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject)
|
||||
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Component,component,function)
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
DirectGetLongAttribute(PyComponent_getX,getX,PyComponent,Component)
|
||||
DirectGetLongAttribute(PyComponent_getY,getY,PyComponent,Component)
|
||||
DBoDestroyAttribute(PyComponent_destroy,PyComponent)
|
||||
|
||||
static PyObject* PyComponent_getNet ( PyComponent *self )
|
||||
{
|
||||
Net* net = NULL;
|
||||
HTRY
|
||||
METHOD_HEAD( "Component.getNet()" )
|
||||
net = component->getNet( );
|
||||
HCATCH
|
||||
return PyNet_Link( net );
|
||||
}
|
||||
|
||||
PyMethodDef PyComponent_Methods[] =
|
||||
{ { "getX" , (PyCFunction)PyComponent_getX , METH_NOARGS
|
||||
, "Return the Component X value." }
|
||||
, { "getY" , (PyCFunction)PyComponent_getY , METH_NOARGS
|
||||
, "Return the Component Y value." }
|
||||
, { "getNet" , (PyCFunction)PyComponent_getNet , METH_NOARGS
|
||||
, "Returns the net owning the component." }
|
||||
, { "destroy", (PyCFunction)PyComponent_destroy, METH_NOARGS
|
||||
, "destroy associated hurricane object, the python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
DBoDeleteMethod(Component)
|
||||
PyTypeObjectLinkPyType(Component)
|
||||
|
||||
#else // Python Module Code Part.
|
||||
|
||||
PyTypeInheritedObjectDefinitions(Component, Entity)
|
||||
|
||||
#endif // Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
|
||||
4.5 Terminal Class Header
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The contents of this file is almost identical to `4.3 Intermediate Class Header`_,
|
||||
save for the presence of a ``PyContact_Link()`` function. She is present
|
||||
at this level because the class is a concrete one and can be instanciated.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#ifndef ISOBAR_PY_CONTACT_H
|
||||
#define ISOBAR_PY_CONTACT_H
|
||||
|
||||
#include "hurricane/isobar/PyComponent.h"
|
||||
#include "hurricane/Contact.h"
|
||||
|
||||
namespace Isobar {
|
||||
extern "C" {
|
||||
|
||||
typedef struct {
|
||||
PyComponent _baseObject;
|
||||
} PyContact;
|
||||
|
||||
extern PyTypeObject PyTypeContact;
|
||||
extern PyMethodDef PyContact_Methods[];
|
||||
extern PyObject* PyContact_Link ( Hurricane::Contact* object );
|
||||
extern void PyContact_LinkPyType ();
|
||||
|
||||
#define IsPyContact(v) ( (v)->ob_type == &PyTypeContact )
|
||||
#define PYCONTACT(v) ( (PyContact*)(v) )
|
||||
#define PYCONTACT_O(v) ( PYCONTACT(v)->_baseObject._baseObject._object )
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif // ISOBAR_PY_CONTACT_H
|
||||
|
||||
|
||||
4.6 Terminal Class File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from `4.4 Intermediate Class File`_ are:
|
||||
|
||||
#. As previously, we have to redefine the macros ``ACCESS_OBJECT`` and ``ACCESS_CLASS``.
|
||||
But, as we are one level deeper into the hierarchy, one more level of
|
||||
indirection using ``_baseObject`` must be used.
|
||||
|
||||
* ``ACCESS_OBJECT`` becomes ``_baseObject._baseObject._object``.
|
||||
|
||||
* ``ACCESS_CLASS`` becomes ``&(_pyObject->_baseObject._baseObject)``.
|
||||
|
||||
#. For defining the ``PyTypeContact`` Python type, we call again
|
||||
``PyTypeInheritedObjectDefinitions()``. It is the same whether the class is
|
||||
terminal or not.
|
||||
|
||||
#. And, this time, as the Python class is concrete, we call the macro
|
||||
``DBoLinkCreateMethod()`` to create the ``PyContact_Link()`` function.
|
||||
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyContact.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
#undef ACCESS_OBJECT
|
||||
#undef ACCESS_CLASS
|
||||
#define ACCESS_OBJECT _baseObject._baseObject._object
|
||||
#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject._baseObject)
|
||||
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Contact,contact,function)
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
DirectGetLongAttribute(PyContact_getWidth , getWidth , PyContact,Contact)
|
||||
DirectGetLongAttribute(PyContact_getHeight, getHeight, PyContact,Contact)
|
||||
DBoDestroyAttribute(PyContact_destroy, PyContact)
|
||||
|
||||
static PyObject* PyContact_create ( PyObject*, PyObject *args )
|
||||
{
|
||||
Contact* contact = NULL;
|
||||
HTRY
|
||||
// Usual signature then arguments parsing.
|
||||
HCATCH
|
||||
return PyContact_Link(contact);
|
||||
}
|
||||
|
||||
PyMethodDef PyContact_Methods[] =
|
||||
{ { "create" , (PyCFunction)PyContact_create , METH_VARARGS|METH_STATIC
|
||||
, "Create a new Contact." }
|
||||
, { "destroy" , (PyCFunction)PyContact_destroy , METH_NOARGS
|
||||
, "Destroy associated hurricane object, the python object remains." }
|
||||
, { "getWidth" , (PyCFunction)PyContact_getWidth , METH_NOARGS
|
||||
, "Return the contact width." }
|
||||
, { "getHeight", (PyCFunction)PyContact_getHeight, METH_NOARGS
|
||||
, "Return the contact height." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
DBoDeleteMethod(Contact)
|
||||
PyTypeObjectLinkPyType(Contact)
|
||||
|
||||
#else // Python Module Code Part.
|
||||
|
||||
DBoLinkCreateMethod(Contact)
|
||||
PyTypeInheritedObjectDefinitions(Contact, Component)
|
||||
|
||||
#endif // Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
|
||||
4.8 Python Module
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DL_EXPORT(void) initHurricane ()
|
||||
{
|
||||
PyEntity_LinkPyType(); // step 1.
|
||||
PyComponent_LinkPyType();
|
||||
PyContact_LinkPyType();
|
||||
|
||||
PYTYPE_READY( Entity ) // step 2.
|
||||
PYTYPE_READY_SUB( Component, Entity )
|
||||
PYTYPE_READY_SUB( Contact , Component )
|
||||
|
||||
__cs.addType( "ent" , &PyTypeEntity , "<Entity>" , false ); // step 3.
|
||||
__cs.addType( "comp" , &PyTypeComponent, "<Component>", false, "ent" );
|
||||
__cs.addType( "contact", &PyTypeContact , "<Contact>" , false, "comp" );
|
||||
|
||||
PyObject* module = Py_InitModule( "Hurricane", PyHurricane_Methods );
|
||||
if (module == NULL) {
|
||||
cerr << "[ERROR]\n"
|
||||
<< " Failed to initialize Hurricane module." << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
Py_INCREF( &PyTypeContact ); // step 4.
|
||||
PyModule_AddObject( module, "Contact", (PyObject*)&PyTypeContact ); // step 4.
|
||||
}
|
|
@ -0,0 +1,395 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
3. Case 1 - DBo Derived, Standalone
|
||||
======================================
|
||||
|
||||
As example, we take ``Library``. This a ``DBo`` derived class, but we
|
||||
choose not to export the parent classes. From Python, it will appear
|
||||
as a base class.
|
||||
|
||||
.. _3.1:
|
||||
|
||||
.. _3.1 Class Associated Header File:
|
||||
|
||||
3.1 Class Associated Header File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here is the typical content of a header file (for ``PyLibrary``):
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#ifndef PY_LIBRARY_H
|
||||
#define PY_LIBRARY_H
|
||||
|
||||
#include "hurricane/isobar/PyHurricane.h"
|
||||
#include "hurricane/Library.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
Library* _object;
|
||||
} PyLibrary;
|
||||
|
||||
extern PyTypeObject PyTypeLibrary;
|
||||
extern PyMethodDef PyLibrary_Methods[];
|
||||
extern PyObject* PyLibrary_Link ( Hurricane::Library* lib );
|
||||
extern void PyLibrary_LinkPyType ();
|
||||
|
||||
|
||||
#define IsPyLibrary(v) ( (v)->ob_type == &PyTypeLibrary )
|
||||
#define PYLIBRARY(v) ( (PyLibrary*)(v) )
|
||||
#define PYLIBRARY_O(v) ( PYLIBRARY(v)->_object )
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif // PY_LIBRARY_H
|
||||
|
||||
|
||||
The code is organized as follow:
|
||||
|
||||
1. It must have, *as the first include* ``PyHurricane.h``, which provides
|
||||
the complete bunch of macros needed to build the module. Then the include
|
||||
of the C++ class we want to wrap (``Library.h``).
|
||||
|
||||
2. As Python is written in C, all the wrapper code has to be but inside
|
||||
an ``extern "C"`` namespace.
|
||||
|
||||
3. Definition of the wrapped |struct|, ``PyLibrary``. It is standard Python here.
|
||||
|
||||
.. note::
|
||||
For our set of macros to work, the name of the pointer to the
|
||||
C++ class must always be **_object**, and the various functions and
|
||||
macros defined here must take the name of the class (either in
|
||||
lowercase, camel case or capitals).
|
||||
|
||||
4. Declaration of the Python type ``PyTypeLibrary`` (standard).
|
||||
|
||||
5. Declaration of the Python type table of methods ``PyLibrary_Methods`` (standard).
|
||||
|
||||
.. _3.6:
|
||||
|
||||
6. Declaration of ``PyLibrary_Link()``, helper to convert a C++ ``Lybrary`` into
|
||||
a ``PyLibrary`` (put in the support shared library).
|
||||
|
||||
7. Declaration of ``PyLibrary_LinkPyType()``, this function setup the class-level
|
||||
function of the new Python type (here, ``PyTypeLibrary``).
|
||||
|
||||
8. And, lastly, three macros to:
|
||||
|
||||
* ``IsPylibrary()``, know if a Python object is a ``PyLibrary``
|
||||
* ``PYLIBRARY()``, force cast (C style) of a ``PyObject`` into a ``PyLibrary``.
|
||||
* ``PYLIBRARY_O()``, extract the C++ object (``Library*``) from the Python
|
||||
object (``PyLibrary``).
|
||||
|
||||
|
||||
.. _3.2 Class Associated File:
|
||||
|
||||
3.2 Class Associated File
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
3.2.1 Head of the file
|
||||
------------------------
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyLibrary.h"
|
||||
#include "hurricane/isobar/PyDataBase.h"
|
||||
#include "hurricane/isobar/PyCell.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Library,lib,function)
|
||||
|
||||
As for the header, all the code must be put inside a ``extern "C"`` namespace.
|
||||
|
||||
A convenience macro ``METHOD_HEAD()`` must be defined, by refining
|
||||
``GENERIC_METHOD_HEAD()``. This macro will be used in the method wrappers
|
||||
below to cast the ``_object`` field of the Python object into the
|
||||
appropriate C++ class, this is done using a C-style cast.
|
||||
The parameters of that macro are:
|
||||
|
||||
#. The C++ encapsulated class (``Library``).
|
||||
#. The name of the *variable* that will be used to store a pointer
|
||||
to the C++ working object.
|
||||
#. The name of the C++ method which is to be wrapped.
|
||||
|
||||
|
||||
3.2.2 The Python Module Part
|
||||
------------------------------
|
||||
|
||||
First, we have to build all the wrappers to the C++ methods of
|
||||
the class. For common predicates, accessors, and mutators macros
|
||||
are supplied.
|
||||
|
||||
Wrapping of the ``Library::getCell()`` method:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyLibrary_getCell ( PyLibrary* self, PyObject* args )
|
||||
{
|
||||
Cell* cell = NULL;
|
||||
|
||||
HTRY
|
||||
METHOD_HEAD( "Library.getCell()" )
|
||||
char* name = NULL;
|
||||
if (PyArg_ParseTuple(args,"s:Library.getCell", &name)) {
|
||||
cell = lib->getCell( Name(name) );
|
||||
} else {
|
||||
PyErr_SetString( ConstructorError
|
||||
, "invalid number of parameters for Library::getCell." );
|
||||
return NULL;
|
||||
}
|
||||
HCATCH
|
||||
|
||||
return PyCell_Link(cell);
|
||||
}
|
||||
|
||||
Key points about this method wrapper:
|
||||
|
||||
#. The ``HTRY`` / ``HCATCH`` macros provides an insulation from the C++
|
||||
exceptions. If one is emitted, it will be catched and transformed in
|
||||
a Python one. This way, the Python program will be cleanly interrupted
|
||||
and the usual stack trace displayed.
|
||||
|
||||
#. The returned value of this method is of type ``Cell*``, we have to
|
||||
transform it into a Python one. This is done with ``PyCell_Link()``.
|
||||
This macro is supplied by the ``PyCell.h`` header and this is why
|
||||
it must be included.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Wrapping of the ``Library::create()`` method:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyLibrary_create( PyObject*, PyObject* args )
|
||||
{
|
||||
PyObject* arg0;
|
||||
PyObject* arg1;
|
||||
Library* library = NULL;
|
||||
|
||||
HTRY
|
||||
__cs.init( "Library.create" ); // Step (1).
|
||||
if (not PyArg_ParseTuple( args, "O&O&:Library.create"
|
||||
, Converter, &arg0
|
||||
, Converter, &arg1 )) { // Step (2).
|
||||
PyErr_SetString( ConstructorError
|
||||
, "invalid number of parameters for Library constructor." );
|
||||
return NULL;
|
||||
}
|
||||
if (__cs.getObjectIds() == ":db:string") { // Step (3.a)
|
||||
DataBase* db = PYDATABASE_O(arg0);
|
||||
library = Library::create( db, Name(PyString_AsString(arg1)) );
|
||||
} else if (__cs.getObjectIds() == ":library:string") { // Step (3.b)
|
||||
Library* masterLibrary = PYLIBRARY_O(arg0);
|
||||
library = Library::create( masterLibrary, Name(PyString_AsString(arg1)) );
|
||||
} else {
|
||||
PyErr_SetString( ConstructorError
|
||||
, "invalid number of parameters for Library constructor." );
|
||||
return NULL;
|
||||
}
|
||||
HCATCH
|
||||
|
||||
return PyLibrary_Link( library );
|
||||
}
|
||||
|
||||
Key point about this constructor:
|
||||
|
||||
#. We want the Python interface to mimic as closely as possible the
|
||||
C++ API. As such, Python object will be created using a static
|
||||
``.create()`` method. So we do not use the usual Python allocation
|
||||
mechanism.
|
||||
|
||||
#. As it is a *static* method, there is no first argument.
|
||||
|
||||
#. Python do not allow function overload like C++. To emulate that
|
||||
behavior we use the ``__cs`` object (which is a global variable).
|
||||
|
||||
#. Init/reset the ``__cs`` object: see *step (1)*.
|
||||
|
||||
#. Call ``PyArg_ParseTuple()``, read every mandatory or optional
|
||||
argument as a Python object (``"O&"``) and use ``Converter``
|
||||
on each one. ``Converter`` will determine the real type of
|
||||
the Python object given as argument by looking at the
|
||||
encapsulated C++ class. It then update the ``__cs`` object.
|
||||
Done in *step (2)*
|
||||
|
||||
#. After the call to ``PyArg_ParseTuple()``, the function
|
||||
``__cs.getObjectIds()`` will return the *signature* of
|
||||
the various arguments. In our case, the valid signatures
|
||||
will be ``":db:string"`` (*step (3.a)*a) and ``":library:string"``
|
||||
(*step (3.b)*).
|
||||
|
||||
#. Call the C++ method after extracting the C++ objects from
|
||||
the Python arguments. Note the use of the ``PYLIBRARY_O()``
|
||||
and ``PYDATABSE_O()`` macros to perform the conversion.
|
||||
|
||||
#. Return the result, encapsulated through a call to ``PyLibrary_Link()``.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Wrapping of the ``Library::destroy()`` method:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DBoDestroyAttribute(PyLibrary_destroy, PyLibrary)
|
||||
|
||||
For C++ classes **that are derived** from ``DBo``, the destroy method
|
||||
wrapper must be defined using the macro ``DBoDestroyAttribute()``.
|
||||
This macro implements the bi-directional communication mechanism
|
||||
using ``Hurricane::Property``. It **must not** be used for
|
||||
non ``DBo`` derived classes.
|
||||
|
||||
|
||||
Defining the method table of the PyLibrary type:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
PyMethodDef PyLibrary_Methods[] =
|
||||
{ { "create" , (PyCFunction)PyLibrary_create , METH_VARARGS|METH_STATIC
|
||||
, "Creates a new library." }
|
||||
, { "getCell" , (PyCFunction)PyLibrary_getCell, METH_VARARGS
|
||||
, "Get the cell of name <name>" }
|
||||
, { "destroy" , (PyCFunction)PyLibrary_destroy, METH_NOARGS
|
||||
, "Destroy associated hurricane object The python object remains." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
|
||||
This is standard Python/C API. The name of the ``PyMethodDef`` table must be
|
||||
named from the class: ``PyLibrary_Methods``.
|
||||
|
||||
|
||||
3.2.3 Python Type Linking
|
||||
---------------------------
|
||||
|
||||
Defining the ``PyTypeLibrary`` class methods and the type linking function.
|
||||
|
||||
Those are the functions for the Python object itself to work, not the
|
||||
wrapped method from the C++ class.
|
||||
|
||||
.. note::
|
||||
At this point we **do not** define the ``PyTypeLibrary`` itself.
|
||||
Only it's functions and a function to set them up *once* the
|
||||
type will be defined.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DBoDeleteMethod(Library)
|
||||
PyTypeObjectLinkPyType(Library)
|
||||
|
||||
|
||||
The macro ``DBoDeleteMethod()`` define the function to delete a
|
||||
``PyLibrary`` *Python* object. Again, do not mistake it for the deletion
|
||||
of the C++ class (implemented by ``DBoDestroyAttribute()``).
|
||||
Here again, ``DBoDeleteMethod()`` is specially tailored for
|
||||
``DBo`` derived classes.
|
||||
|
||||
.. _PyLibrary_LinkPyType():
|
||||
|
||||
To define ``PyLibrary_LinkPyType()``, use the ``PyTypeObjectLinkPyType()``
|
||||
macro. This macro is specific for ``DBo`` derived classes that are seen as
|
||||
base classes under Python (i.e. we don't bother exposing the base
|
||||
class under Python). ``PyLibrary_LinkPyType()`` setup the class functions
|
||||
in the ``PyTypeLibrary`` type object, it **must** be called in the
|
||||
Python module this class is part of (in this case: ``PyHurricane.cpp``).
|
||||
This particular flavor of the macro *will define* and setup the
|
||||
following class functions:
|
||||
|
||||
* ``PyTypeLibrary.tp_compare`` (defined by the macro).
|
||||
* ``PyTypeLibrary.tp_repr`` (defined by the macro).
|
||||
* ``PyTypeLibrary.tp_str`` (defined by the macro).
|
||||
* ``PyTypeLibrary.tp_hash`` (defined by the macro).
|
||||
* ``PyTypeLibrary.tp_methods`` sets to the previously defined ``PyLibrary_Methods`` table.
|
||||
* ``PyTypeLibrary.tp_dealloc`` is set to a function that *must* be named ``PyLibrary_DeAlloc``,
|
||||
this is what ``DBoDeleteMethod`` does. It is *not* done by ``PyTypeObjectLinkPyType``.
|
||||
|
||||
Defining the ``PyTypeLibrary`` type:
|
||||
|
||||
|
||||
3.2.4 The Shared Library Part
|
||||
-------------------------------
|
||||
|
||||
This part will be put in a separate supporting shared library, allowing
|
||||
other Python module to link against it (and make use of its symbols).
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DBoLinkCreateMethod(Library)
|
||||
PyTypeObjectDefinitions(Library)
|
||||
|
||||
|
||||
To define ``PyTypeLibrary``, use the ``PyTypeObjectDefinitions()`` macro.
|
||||
This macro is specific for classes that, as exposed by Python,
|
||||
are neither *derived* classes nor *base* classes for others.
|
||||
That is, they are standalone from the inheritance point of view.
|
||||
|
||||
The ``DBoLinkCreateMethod()`` macro will define the ``PyLibrary_Link()``
|
||||
function which is responsible for encapsulating a C++ ``Library`` object
|
||||
into a Python ``PyLibrary`` one.
|
||||
|
||||
|
||||
3.3 Python Module (C++ namespace)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
We use the Python module to replicate the C++ *namespace*. Thus, for the
|
||||
``Hurricane`` namespace we create a Python ``Hurricane`` module which is
|
||||
defined in the ``PyHurricane.cpp`` file, then we add into that module
|
||||
dictionary all the Python types encapsulating the C++ classes of that
|
||||
namespace.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DL_EXPORT(void) initHurricane ()
|
||||
{
|
||||
PyLibrary_LinkPyType(); // step 1.
|
||||
|
||||
PYTYPE_READY( Library ) // step 2.
|
||||
|
||||
__cs.addType( "library", &PyTypeLibrary, "<Library>", false ); // step 3.
|
||||
|
||||
PyObject* module = Py_InitModule( "Hurricane", PyHurricane_Methods );
|
||||
if (module == NULL) {
|
||||
cerr << "[ERROR]\n"
|
||||
<< " Failed to initialize Hurricane module." << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
Py_INCREF( &PyTypeLibrary ); // step 4.
|
||||
PyModule_AddObject( module, "Library", (PyObject*)&PyTypeLibrary ); // step 4.
|
||||
}
|
||||
|
||||
The ``initHurricane()`` initialisation function shown above has
|
||||
been scrubbed of everything not relevant to the ``PyLibrary`` class.
|
||||
The integration of the ``PyLibrary`` class into the module needs
|
||||
four steps:
|
||||
|
||||
#. A call to `PyLibrary_LinkPyType()`_ to hook the Python type functions
|
||||
in the Python type object.
|
||||
|
||||
#. A call to the ``PYTYPE_READY()`` macro (standard Python).
|
||||
|
||||
#. Registering the type into the ``__cs`` object, with ``addType()``.
|
||||
The arguments are self explanatory, save for the last which is a
|
||||
boolean to tell if this is a *derived* class or not.
|
||||
|
||||
#. Adding the type object (``PyTypeLibrary``) into the dictionnary of
|
||||
the module itself. This allow to mimic closely the C++ syntax:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import Hurricane
|
||||
lib = Hurricane.Library.create( db, 'root' )
|
|
@ -0,0 +1,67 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
6. Encapsulating DbU
|
||||
======================
|
||||
|
||||
While ``Hurricane::DbU`` is a class, the ``Hurricane::DbU::Unit`` is only
|
||||
a ``typedef`` over ``uint64_t``. The ``DbU`` class only provides a set of
|
||||
static methods to manipulate and convert to and from other units.
|
||||
At Python level, ``DbU::Unit`` will be stored in plain ``long long``.
|
||||
|
||||
When a ``DbU::Unit`` argument is expected in a Python functions, just use
|
||||
the ``DbU::Unit PyAny_AsLong( PyObject* )`` function to convert it.
|
||||
|
||||
For example, if we explicit the expension of:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point)
|
||||
|
||||
|newpage|
|
||||
|
||||
We would get:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyPoint_setX ( PyPoint *self, PyObject* args )
|
||||
{
|
||||
Point* cobject = static_cast<Point*>( self->_object );
|
||||
if (cobject == NULL) {
|
||||
PyErr_SetString( ProxyError
|
||||
, "Attempt to call Point.setX() on an unbound Hurricane object" );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
HTRY
|
||||
PyObject* arg0 = NULL;
|
||||
if (not PyArg_ParseTuple( args, "O:Point.setX()", &arg0 ))
|
||||
return ( NULL );
|
||||
cobject->setX( Isobar::PyAny_AsLong(arg0) );
|
||||
HCATCH
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
For the other way around, use ``PyObject* PyDbU_FromLong( DbU::Unit )``.
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
DirectGetLongAttribute(PyPoint_GetX,getX,PyPoint,Point)
|
||||
|
||||
We would get:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyPoint_GetX ( PyPoint *self, PyObject* args )
|
||||
{
|
||||
Point* cobject = static_cast<Point*>( self->_object );
|
||||
if (cobject == NULL) {
|
||||
PyErr_SetString( ProxyError
|
||||
, "Attempt to call Point.getX() on an unbound Hurricane object" );
|
||||
return NULL;
|
||||
}
|
||||
return Isobar::PyDbU_FromLong(cobject->getX());
|
||||
}
|
|
@ -0,0 +1,185 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
1. Introduction
|
||||
=================
|
||||
|
||||
* This document is written for people already familiar with the
|
||||
`Python/C API Reference Manual`_.
|
||||
|
||||
* The macros provided by the Hurricane Python/C API are written using
|
||||
the standard Python C/API. That is, you may not use them and write
|
||||
directly your functions with the original API or any mix between.
|
||||
You only have to respect some naming convention.
|
||||
|
||||
* Coriolis is build against Python 2.7.
|
||||
|
||||
|
||||
1.1 First, A Disclaimer
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The Hurricane Python/C++ API has been written about ten years ago, at a time
|
||||
my mastering of template programming was less than complete. This is why this
|
||||
interface is build with old fashioned C macro instead of C++ template.
|
||||
|
||||
It is my hope that at some point in the future I will have time to completly
|
||||
rewrite it, borrowing the interface from ``boost::python``.
|
||||
|
||||
|
||||
1.2 About Technical Choices
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Some would say, why not use *off the shelf* wrappers like ``swig``
|
||||
or ``boost::python``, here are some clues.
|
||||
|
||||
#. **Partial exposure of the C++ class tree.** We expose at Python level
|
||||
C++ base classes, only if they provides common methods that we want
|
||||
to see. Otherwise, we just show them as base classes under Python.
|
||||
For instance ``Library`` is derived from ``DBo``, but we won't see
|
||||
it under Python.
|
||||
|
||||
#. **Bi-directional communication.** When a Python object is deleted, the
|
||||
wrapper obviously has a pointer toward the underlying C++ object and
|
||||
is able to delete it. But, the reverse case can occurs, meaning that
|
||||
you have a C++ object wrapped in Python and the database delete the
|
||||
underlying object. The wrapped Python object *must* be informed that
|
||||
it no longer refer a valid C++ one. Moreover, as we do not control
|
||||
when Python objects gets deleteds (that is, when their reference count
|
||||
reaches zero), we can have valid Python object with a dangling
|
||||
C++ pointer. So our Python objects can be warned by the C++ objects
|
||||
that they are no longer valid and any other operation than the
|
||||
deletion should result in a severe non-blocking error.
|
||||
|
||||
To be precise, this apply to persistent object in the C++ database,
|
||||
like ``Cell``, ``Net``, ``Instance`` or ``Component``. Short lived
|
||||
objects like ``Box`` or ``Point`` retains the classic Python behavior.
|
||||
|
||||
Another aspect is that, for all derived ``DBo`` objects, one and only
|
||||
one Python object is associated. For one given ``Instance`` object we
|
||||
will always return the *same* ``PyInstance`` object, thanks to the
|
||||
bi-directional link. Obviously, the *reference count* of the
|
||||
``PyInstance`` is managed accordingly. This mechanism is implemented
|
||||
by the ``PyInstance_Link()`` function.
|
||||
|
||||
#. **Linking accross modules.** As far as I understand, the wrappers
|
||||
are for monolithic libraries. That is, you wrap the entire library
|
||||
in one go. But Hurricane has a modular design, the core database
|
||||
then various tools. We do not, and cannot, have one gigantic wrapper
|
||||
that would encompass all the libraries in one go. We do one Python
|
||||
module for one C++ library.
|
||||
|
||||
This brings another issue, at Python level this time. The Python
|
||||
modules for the libraries have to share some functions. Python
|
||||
provides a mechanism to pass C function pointers accross modules,
|
||||
but I did found it cumbersome. Instead, all our modules are split
|
||||
in two:
|
||||
|
||||
* The first part contains the classic Python module code.
|
||||
* The second part is to be put in a separate dynamic library that
|
||||
will hold the shared functions. The Python module is dynamically linked
|
||||
against that library like any other. And any other Python module
|
||||
requiring the functions will link against the associated shared
|
||||
library.
|
||||
|
||||
Each module file will be compiled *twice*, once to build the Python
|
||||
module (``__PYTHON_MODULE`` is defined) and once to build the supporting
|
||||
shared library (``__PYTHON_MODULE__`` **not** defined). This tricky
|
||||
double compilation is taken care of though the ``add_python_module``
|
||||
``cmake`` macro.
|
||||
|
||||
For the core Hurricane library we will have:
|
||||
|
||||
* ``Hurricane.so`` the Python module (use with: ``import Hurricane``).
|
||||
* ``libisobar.so.1.0`` the supporting shared library.
|
||||
|
||||
The ``PyLibrary.cpp`` file will have the following structure:
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyLibrary.h"
|
||||
|
||||
namespace Isobar {
|
||||
|
||||
extern "C" {
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
// +=================================================================+
|
||||
// | "PyLibrary" Python Module Code Part |
|
||||
// +=================================================================+
|
||||
//
|
||||
// The classic part of a Python module. Goes into Hurricane.so.
|
||||
|
||||
|
||||
#else // End of Python Module Code Part.
|
||||
|
||||
// x=================================================================x
|
||||
// | "PyLibrary" Shared Library Code Part |
|
||||
// x=================================================================x
|
||||
//
|
||||
// Functions here will be part of the associated shared library and
|
||||
// made available to all other Python modules. Goes into libisobar.so.1.0
|
||||
|
||||
|
||||
# endif // Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
|
||||
} // Isobar namespace.
|
||||
|
||||
|
||||
This way, we do not rely upon a pointer transmission through Python
|
||||
modules, but directly uses linker capabilities.
|
||||
|
||||
|
||||
1.3 Botched Design
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The mechanism to compute the signature of a call to a Python function,
|
||||
the ``__cs`` object, is much too complex and, in fact, not needed.
|
||||
At some point I may root it out, but it is used in so many places...
|
||||
|
||||
What I should have used the ``"O!"`` capablity of ``PyArg_ParseTuple()``,
|
||||
like in the code below:
|
||||
|
||||
|newpage|
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
static PyObject* PyContact_create ( PyObject*, PyObject *args )
|
||||
{
|
||||
Contact* contact = NULL;
|
||||
HTRY
|
||||
PyNet* pyNet = NULL;
|
||||
PyLayer* pyLayer = NULL;
|
||||
PyComponent* pyComponent = NULL;
|
||||
DbU::Unit x = 0;
|
||||
DbU::Unit y = 0;
|
||||
DbU::Unit width = 0;
|
||||
DbU::Unit height = 0;
|
||||
|
||||
if (PyArg_ParseTuple( args, "O!O!ll|ll:Contact.create"
|
||||
, &PyTypeNet , &pyNet
|
||||
, &PyTypeLayer, &pyLayer
|
||||
, &x, &y, &width, &height)) {
|
||||
contact = Contact::create( PYNET_O(pyNet), PYLAYER_O(pyLayer)
|
||||
, x, y, width, height );
|
||||
} else {
|
||||
PyErr_Clear();
|
||||
if (PyArg_ParseTuple( args, "O!O!ll|ll:Contact.create"
|
||||
, &PyTypeComponent, &pyComponent
|
||||
, &PyTypeLayer , &pyLayer
|
||||
, &x, &y, &width, &height)) {
|
||||
contact = Contact::create( PYCOMPONENT_O(pyComponent), PYLAYER_O(pyLayer)
|
||||
, x, y, width, height );
|
||||
} else {
|
||||
PyErr_SetString( ConstructorError
|
||||
, "invalid number of parameters for Contact constructor." );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
HCATCH
|
||||
return PyContact_Link( contact );
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
7. No C++ Hurricane::Name encapsulation
|
||||
==========================================
|
||||
|
||||
To be written.
|
|
@ -0,0 +1,171 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
5. Case 3 - Non-DBo Standalone Classe
|
||||
=======================================
|
||||
|
||||
Let's have a look at the encapsulation of ``Hurricane::Point``.
|
||||
|
||||
Non-BDo derived classes do not support the bi-directionnal communication.
|
||||
So each Python object is associated with one C++ object. The C++ object
|
||||
is created and deleted along with the Python one. This behavior implies
|
||||
that the C++ object is *copy constructible* (which should be the case).
|
||||
|
||||
|
||||
5.1 Class Header
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`3.1 Class Associated Header File`:
|
||||
|
||||
* There is no ``PyPoint_Link()`` function, as it's related to the
|
||||
bi-directional communication mechanism.
|
||||
|
||||
.. note::
|
||||
**About the _object attribute** of the PyPoint. As the C++ object life span
|
||||
(``Point``) is linked to the Python (``PyPoint``) one, we may have used a
|
||||
value instead of a pointer. It is best to keep a pointer as the macros
|
||||
written for ``DBo`` derived classes will remain usables.
|
||||
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#ifndef ISOBAR_PY_POINT_H
|
||||
#define ISOBAR_PY_POINT_H
|
||||
|
||||
#include "hurricane/isobar/PyHurricane.h"
|
||||
#include "hurricane/Point.h"
|
||||
|
||||
namespace Isobar {
|
||||
extern "C" {
|
||||
|
||||
typedef struct {
|
||||
PyObject_HEAD
|
||||
Hurricane::Point* _object;
|
||||
} PyPoint;
|
||||
|
||||
extern PyTypeObject PyTypePoint;
|
||||
extern PyMethodDef PyPoint_Methods[];
|
||||
extern void PyPoint_LinkPyType();
|
||||
|
||||
#define IsPyPoint(v) ( (v)->ob_type == &PyTypePoint )
|
||||
#define PYPOINT(v) ( (PyPoint*)(v) )
|
||||
#define PYPOINT_O(v) ( PYPOINT(v)->_object )
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
#endif // ISOBAR_PY_POINT_H
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
5.2 Class File
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Changes from :ref:`3.2 Class Associated File`:
|
||||
|
||||
* As there is no ``PyPoint_Link()`` function, there is no call to any
|
||||
flavor of the ``DBoLinkcreatemethod()`` macro (obvious as it's *not*
|
||||
a ``DBo``).
|
||||
|
||||
* To use the standard Python constructor, we have to define ``PyPoint_NEW()``
|
||||
and ``PyPoint_Init()`` functions, I'm not absolutely certain that the later
|
||||
needs to be defined (that part is still not clear to me from the Python doc).
|
||||
|
||||
* As it's not a ``DBo`` there is no ``destroy()`` method, so no call to
|
||||
``DirectDestroyMethod()``
|
||||
|
||||
* Lastly, as this object has a ``PyPoint_NEW()`` (field ``tp_new``) and
|
||||
a ``PyPoint_Init()`` (field ``tp_init``) we have to use the macro
|
||||
``PyTypeObjectLinkPyTypeNewInit()`` to define ``PyPoint_LinkPyType()``.
|
||||
|
||||
|
||||
.. code-block:: c++
|
||||
|
||||
#include "hurricane/isobar/PyPoint.h"
|
||||
|
||||
namespace Isobar {
|
||||
using namespace Hurricane;
|
||||
|
||||
extern "C" {
|
||||
|
||||
#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(Point,point,function)
|
||||
|
||||
#if defined(__PYTHON_MODULE__)
|
||||
|
||||
static PyObject* PyPoint_NEW ( PyObject* module, PyObject *args )
|
||||
{
|
||||
Point* point = NULL;
|
||||
HTRY
|
||||
PyObject* arg0 = NULL;
|
||||
PyObject* arg1 = NULL;
|
||||
|
||||
__cs.init( "Point.Point" );
|
||||
if (not PyArg_ParseTuple( args,"|O&O&:Point.Point"
|
||||
, Converter,&arg0
|
||||
, Converter,&arg1 )) {
|
||||
PyErr_SetString ( ConstructorError
|
||||
, "invalid number of parameters for Point constructor." );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (__cs.getObjectIds() == "")
|
||||
{ point = new Point()); }
|
||||
else if (__cs.getObjectIds() == ":point")
|
||||
{ point = new Point( *PYPOINT_O(arg0) ); }
|
||||
else if (__cs.getObjectIds() == ":int:int")
|
||||
{ point = new Point( PyAny_AsLong(arg0), PyAny_AsLong(arg1) ); }
|
||||
else {
|
||||
PyErr_SetString ( ConstructorError
|
||||
, "invalid number of parameters for Point constructor." );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyPoint* pyPoint = PyObject_NEW( PyPoint, &PyTypePoint );
|
||||
if (pyPoint == NULL) { delete point; return NULL; }
|
||||
pyPoint->_object = point;
|
||||
HCATCH
|
||||
|
||||
return (PyObject*)pyPoint;
|
||||
}
|
||||
|
||||
static int PyPoint_Init ( PyPoint* self, PyObject* args, PyObject* kwargs )
|
||||
{ return 0; }
|
||||
|
||||
DirectGetLongAttribute(PyPoint_getX,getX,PyPoint,Point)
|
||||
DirectGetLongAttribute(PyPoint_getY,getY,PyPoint,Point)
|
||||
DirectSetLongAttribute(PyPoint_SetX,setX,PyPoint,Point)
|
||||
DirectSetLongAttribute(PyPoint_SetY,setY,PyPoint,Point)
|
||||
|
||||
PyMethodDef PyPoint_Methods[] =
|
||||
{ { "getX" , (PyCFunction)PyPoint_getX , METH_NOARGS
|
||||
, "Return the Point X value." }
|
||||
, { "getY" , (PyCFunction)PyPoint_getY , METH_NOARGS
|
||||
, "Return the Point Y value." }
|
||||
, { "setX" , (PyCFunction)PyPoint_SetX , METH_VARARGS
|
||||
, "Modify the Point X value." }
|
||||
, { "setY" , (PyCFunction)PyPoint_SetY , METH_VARARGS
|
||||
, "Modify the Point Y value." }
|
||||
, {NULL, NULL, 0, NULL} /* sentinel */
|
||||
};
|
||||
|
||||
DirectDeleteMethod(PyPoint_DeAlloc,PyPoint)
|
||||
PyTypeObjectLinkPyTypeNewInit(Point)
|
||||
|
||||
#else // Python Module Code Part.
|
||||
|
||||
PyTypeObjectDefinitions(Point)
|
||||
|
||||
#endif // Shared Library Code Part.
|
||||
|
||||
} // extern "C".
|
||||
} // Isobar namespace.
|
||||
|
||||
|
||||
5.2 Class File
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
To put it bluntly, there is no difference in the Python module for
|
||||
a standalone ``DBo`` class and a non-``DBo`` class.
|
Binary file not shown.
|
@ -0,0 +1,23 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "index.rst<PythonCpp>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================================
|
||||
Hurricane Python/C++ API Tutorial
|
||||
===================================
|
||||
|
||||
Printable version of this document `PythonCpp.pdf <../../../pdf/main/PythonCpp.pdf>`_.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
Introduction.rst
|
||||
Configuration.rst
|
||||
DBoStandalone.rst
|
||||
DBoHierarchy.rst
|
||||
NonDBo.rst
|
||||
DbU.rst
|
||||
Name.rst
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================================
|
||||
Hurricane Python/C++ API Tutorial
|
||||
===================================
|
||||
|
||||
|pagestylefancy|
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|newpage|
|
|
@ -1,22 +0,0 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-html(raw)
|
||||
:format: html
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
|
||||
.. For HTML backend
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| replace:: :raw-html:`<center><img src="./images/RDS_VW.png" alt="RDS Variable Width Rule"></center>`
|
||||
.. |RDS_LCW| replace:: :raw-html:`<center><img src="./images/RDS_LCW.png" alt="RDS Left Constant Width Rule"></center>`
|
||||
.. |SegmentOrientation| replace:: :raw-html:`<center><img src="./images/SegmentOrientation.png" alt="Symbolic Segment Orientations"></center>`
|
||||
.. |BIGVIA_1| replace:: :raw-html:`<center><img src="./images/bigvia-1.png" alt="BIGVIA holes"></center>`
|
||||
.. |BIGVIA_2| replace:: :raw-html:`<center><img src="./images/bigvia-2.png" alt="BIGVIA holes overlap"></center>`
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-html:` `
|
||||
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |medskip| replace:: :raw-html:`<br>`
|
||||
.. |newpage| replace:: :raw-html:`<br>`
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-latex(raw)
|
||||
:format: latex
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
|
||||
.. |DONE| replace:: :raw-latex:`\marginpar{\fbox{\small\ding{56}}}`
|
||||
|
||||
.. For LaTeX/PDF backend.
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.7\textwidth]{./images/RDS_VW.eps}}\end{center}`
|
||||
.. |RDS_LCW| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.4\textwidth]{./images/RDS_LCW.eps}}\end{center}`
|
||||
.. |SegmentOrientation| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/SegmentOrientation.eps}}\end{center}`
|
||||
.. |BIGVIA_1| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/bigvia-1.eps}}\end{center}`
|
||||
.. |BIGVIA_2| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.5\textwidth]{./images/bigvia-2.eps}}\end{center}`
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-latex:`\dotfill`
|
||||
.. |noindent| replace:: :raw-latex:`\noindent`
|
||||
.. |medskip| replace:: :raw-latex:`\medskip`
|
||||
.. |newpage| replace:: :raw-latex:`\newpage`
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -1,5 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: HTML_defs.rst
|
||||
.. include:: RDS.rst
|
|
@ -1,4 +0,0 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: LaTeX_defs.rst
|
||||
.. include:: RDS.rst
|
|
@ -1,18 +1,7 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: ul
|
||||
.. role:: cb
|
||||
.. role:: sc
|
||||
.. role:: fboxtt
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. Acronyms & names.
|
||||
.. |GNU| replace:: :sc:`gnu`
|
||||
.. |LGPL| replace:: :sc:`lgpl`
|
||||
.. |GPL| replace:: :sc:`gpl`
|
||||
.. |UPMC| replace:: :sc:`upmc`
|
||||
.. |Alliance| replace:: :sc:`Alliance`
|
||||
.. |MBK| replace:: :sc:`mbk`
|
||||
.. |RDS| replace:: :sc:`rds`
|
||||
|
||||
.. Tools
|
||||
.. |ocp| replace:: ``ocp``
|
||||
|
@ -48,7 +37,6 @@
|
|||
.. |PTIE| replace:: ``PTIE``
|
||||
.. |NDIF| replace:: ``NDIF``
|
||||
.. |PDIF| replace:: ``PDIF``
|
||||
.. |NWELL| replace:: ``NWELL``
|
||||
.. |PWELL| replace:: ``PWELL``
|
||||
.. |NTRANS| replace:: ``NTRANS``
|
||||
.. |PTRANS| replace:: ``PTRANS``
|
||||
|
@ -68,26 +56,33 @@
|
|||
.. |RDS_POLY| replace:: ``RDS_POLY``
|
||||
.. |RDS_ALU1| replace:: ``RDS_ALU1``
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |RDS_VW| image:: ./images/RDS_VW.png
|
||||
:alt: RDS Variable Width Rule
|
||||
:align: middle
|
||||
:width: 60%
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
.. |RDS_LCW| image:: ./images/RDS_LCW.png
|
||||
:alt: RDS Left Constant Width Rule
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|medskip|
|
||||
.. |SegmentOrientation| image:: ./images/SegmentOrientation.png
|
||||
:alt: Symbolic Segment Orientations
|
||||
:align: middle
|
||||
:width: 50%
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
.. |BIGVIA_1| image:: ./images/bigvia-1.png
|
||||
:alt: BIGVIA holes
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|medskip|
|
||||
|
||||
=========================================
|
||||
Symbolic to Real Conversion In Alliance
|
||||
=========================================
|
||||
.. |BIGVIA_2| image:: ./images/bigvia-2.png
|
||||
:alt: BIGVIA holes overlap
|
||||
:align: middle
|
||||
:width: 40%
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|medskip|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
@ -189,7 +184,7 @@ In |Alliance|, segments are oriented (up, down, left, right). This disambiguate
|
|||
the left or right side when using the ``LCW`` and ``RCW`` rules in the |RDS| file.
|
||||
It allows to generate, if needed, asymetric object in the real layout file.
|
||||
|
||||
|SegmentOrientation|
|
||||
|bcenter| |SegmentOrientation| |ecenter|
|
||||
|
||||
|newpage|
|
||||
|
||||
|
@ -261,14 +256,14 @@ The translation method of a symbolic segment is as follow:
|
|||
original one. In those rules, the third number is not used, it is only here
|
||||
to make the life easier for the parser...
|
||||
|
||||
|RDS_VW|
|
||||
|bcenter| |RDS_VW| |ecenter|
|
||||
|
||||
* |LCW| or |RCW| for Left/Right Constant Width, create an off-center rectangle
|
||||
of fixed width relatively to the real segment. Note that the ``SP`` number
|
||||
is the distance *between the edge* of the real segment and the edge of the
|
||||
generated real rectangle (*not* from the axis). It is often zero.
|
||||
|
||||
|RDS_LCW|
|
||||
|bcenter| |RDS_LCW| |ecenter|
|
||||
|
||||
|
||||
|newpage|
|
||||
|
@ -383,11 +378,11 @@ The |MBK_TO_RDS_BIGVIA_HOLE| table define the global hole matrix for the whole
|
|||
design. The first number is the individual hole side and the second the grid step
|
||||
(edge to edge). The figure below show the hole generation.
|
||||
|
||||
|BIGVIA_1|
|
||||
|bcenter| |BIGVIA_1| |ecenter|
|
||||
|
||||
Example of BIGVIA overlap:
|
||||
|
||||
|BIGVIA_2|
|
||||
|bcenter| |BIGVIA_2| |ecenter|
|
||||
|
||||
Example: ::
|
||||
|
||||
|
@ -407,8 +402,6 @@ Example: ::
|
|||
``1.5 * step``, the BIGVIA is demoted to a simple VIA.
|
||||
|
||||
|
||||
|newpage|
|
||||
|
||||
The |MBK_TO_RDS_BIGVIA_METAL| table
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
@ -438,12 +431,9 @@ Example: ::
|
|||
|
||||
CONT_VIA5 RDS_ALU5 0.0 0.09 ALL \
|
||||
RDS_ALU6 0.0 0.18 ALL
|
||||
|
||||
END
|
||||
|
||||
|
||||
|newpage|
|
||||
|
||||
The |MBK_WIRESETTING| table
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -1,750 +0,0 @@
|
|||
|
||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 96%;
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
p, li {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.sc {
|
||||
font-variant: small-caps;
|
||||
font-size: 120%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
h1 { text-align: center;
|
||||
border-top: 2px solid #09550b;
|
||||
border-bottom: 2px solid #09550b;
|
||||
padding-top: 7pt;
|
||||
padding-bottom: 7pt;
|
||||
}
|
||||
h2, h3, h4, h5, h6 { text-align: left; }
|
||||
h1, h2, h3 { font-family: "Open Sans";
|
||||
}
|
||||
h1 { font-weight: normal; font-size: 170%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h2 { font-weight: normal; font-size: 140%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h3 { font-weight: bold; font-size: 118%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
/*
|
||||
background: #09550B;
|
||||
background-color: white;
|
||||
*/
|
||||
background-position: top left;
|
||||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 0 0 0;
|
||||
padding: 20pt;
|
||||
width: 550pt;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
-moz-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
box-shadow: 4px 4px 5px 3px #ccc;
|
||||
}
|
||||
|
||||
hr {
|
||||
color: #09550b;
|
||||
border: 1px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
padding-top: 10pt;
|
||||
padding-bottom: 10pt;
|
||||
}
|
||||
|
||||
div#contents {
|
||||
margin: 30pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: #fff676;
|
||||
-moz-box-shadow: 4px 4px 5px 2px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 2px #ccc;
|
||||
box-shadow: 4px 4px 5px 2px #ccc;
|
||||
|
||||
/* Shadow explanation:
|
||||
* The shadow is a rectangle the same size as the box. It is then shifted
|
||||
* blurred according to the following parameters.
|
||||
*
|
||||
* 1. The horizontal offset of the shadow, positive means the shadow will be
|
||||
* on the right of the box, a negative offset will put the shadow on the
|
||||
* left of the box.
|
||||
* 2. The vertical offset of the shadow, a negative one means the box-shadow
|
||||
* will be above the box, a positive one means the shadow will be below
|
||||
* the box.
|
||||
* 3. The blur radius (optional), if set to 0 the shadow will be sharp,
|
||||
* the higher the number, the more blurred it will be.
|
||||
* 4. The spread radius (optional), positive values increase the size of the
|
||||
* shadow, negative values decrease the size. Default is 0 (the shadow is
|
||||
* same size as blur).
|
||||
* 5. Color
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
div#centered {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
pre, tt, code {
|
||||
font-family: "courrier", "andale mono", monospace;
|
||||
font-size: 100%;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
tt {
|
||||
color: #09550b;
|
||||
}
|
||||
|
||||
pre.wiki, div.code, pre.literal-block {
|
||||
font-size: 90%;
|
||||
padding: 5pt;
|
||||
margin-left: 4%;
|
||||
margin-right: 4%;
|
||||
border: dashed;
|
||||
border-width: thin;
|
||||
border-color: #FC8676;
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
a:link, a:active {
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
a:hover, a:focus, a:visited {
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
h1 a:link {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
p.credit {
|
||||
margin-left: 10%;
|
||||
margin-right: 10%;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
p.credit span.left {
|
||||
float: left;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
p.credit span.right {
|
||||
float: right;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
img.addborder {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
div#header {
|
||||
margin: 0px;
|
||||
padding: 0pt;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#header_logo {
|
||||
margin: 0px;
|
||||
padding: 10px 0px 10px 12pt;
|
||||
background-color: white;
|
||||
width: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div#header_menus {
|
||||
background-color: white;
|
||||
width: 55%;
|
||||
float: right;
|
||||
padding-top: 60pt;
|
||||
padding-right: 10pt;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus ul {
|
||||
padding-top: 45pt;
|
||||
list-style: none;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus li {
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
display: inline;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/*
|
||||
div#header_menus a {
|
||||
border-left: 1px solid #d7d7d7;
|
||||
padding: 0 .75em;
|
||||
}
|
||||
|
||||
div#header_menus a.first {
|
||||
border-left: none;
|
||||
}
|
||||
*/
|
||||
|
||||
div#header a:link, div#header a:active, div#header a:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid black;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a:hover, div#header a:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a.current:link, div#header a.current:active, div#header a.current:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header a.current:hover, div#header a.current:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header_ancestors {
|
||||
padding: 4px 0px 4px 12pt;
|
||||
background-color: #09550B;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div#header_ancestors ul, div#header_ancestors * li {
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding: 0px 0px 0px 0pt;
|
||||
}
|
||||
|
||||
div#header_ancestors a:link, div#header_ancestors a:active, div#header_ancestors a:visited {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
div#header_ancestors a:hover, div#header_ancestors a:focus {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-top: 1px dotted #09550b;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div#searchform {
|
||||
width: 80%;
|
||||
background-color: #ccffcd;
|
||||
padding: 15pt 10pt 15pt 10pt;
|
||||
margin-top: 50pt;
|
||||
margin-bottom: 50pt;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div#searchform input#id_q {
|
||||
background-color: white;
|
||||
border: 1px solid #09550b;
|
||||
padding: 2pt;
|
||||
width: 80%;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.queryref {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#searchform ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div#searchform li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
hr#search_vs_results {
|
||||
color: #09550b;
|
||||
border: 2px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#search_results {
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
div#sidebar hr#separator {
|
||||
color: white;
|
||||
border: 0px;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
img.footer-logo {
|
||||
height: 24px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
hr#site_vs_page {
|
||||
color: white;
|
||||
border: 3px dotted white;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#sidebar {
|
||||
/*
|
||||
background: #09550B;
|
||||
background: #ccffcd;
|
||||
*/
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#sidebar div#sitemenu, div#sidebar div#pagemenu {
|
||||
/*
|
||||
background: white;
|
||||
*/
|
||||
background: #09550b;
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
padding: 5pt 10pt;
|
||||
}
|
||||
|
||||
div#sidebar * li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div#sidebar * ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:link,
|
||||
div#sitemenu ul li a:active,
|
||||
div#sitemenu ul lu a:visited
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:focus,
|
||||
div#sitemenu ul lu a:hover
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul li a:link,
|
||||
div#sitemenu ul ul li a:active,
|
||||
div#sitemenu ul ul lu a:visited,
|
||||
div#sitemenu ul ul li a:focus,
|
||||
div#sitemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*border-bottom: 1px dotted white;*/
|
||||
}
|
||||
|
||||
div#pagemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul ul {
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:link,
|
||||
div#pagemenu ul li a:active,
|
||||
div#pagemenu ul lu a:visited
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:focus,
|
||||
div#pagemenu ul lu a:hover
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul li a:link,
|
||||
div#pagemenu ul ul li a:active,
|
||||
div#pagemenu ul ul lu a:visited,
|
||||
div#pagemenu ul ul li a:focus,
|
||||
div#pagemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted white;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
div#sidebar ul.ancestor * li {
|
||||
padding-top: 0pt;
|
||||
}
|
||||
|
||||
div#sidebar ul {
|
||||
padding-bottom: 8pt;
|
||||
}
|
||||
|
||||
div#sidebar a:link, div#sidebar a:active, div#sidebar a:visited {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sidebar a:hover, div#sidebar a:focus {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#main {
|
||||
border-left: 1px solid #09550b;
|
||||
}
|
||||
|
||||
div#main ul#summary {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
div#main ul#summary * ul {
|
||||
padding-left: 12pt;
|
||||
padding-bottom: 14pt;
|
||||
font-size: 95%;
|
||||
}
|
||||
|
||||
div.code * {
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
div.note {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #fff01c;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #fff676 url('./images/clipboard.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
div.error {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #dd0000;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #ffddcc url('./images/i-core.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
margin: 5pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: fff676;
|
||||
}
|
||||
|
||||
div.topic p.first {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
table.wiki th, table th {
|
||||
color: black;
|
||||
background: #FFFFCC;
|
||||
}
|
||||
|
||||
table.docutils {
|
||||
margin-left: 10%;
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
table.wiki, table.wiki th, table.wiki td { border: 1px solid black; }
|
||||
table.wiki th * p { text-align: center; }
|
||||
table.wiki * p { margin: 0pt; }
|
||||
table.wiki * blockquote { margin: 0pt; }
|
||||
table { border-collapse: collapse; }
|
||||
table th, table td { border: 1px solid black;
|
||||
padding: 2px 10px 2px 10px; }
|
||||
|
||||
table.docinfo {
|
||||
margin-top: 10pt;
|
||||
margin-left: auto;
|
||||
margin-right: 0pt;
|
||||
border: 10px solid #303030;
|
||||
border-collapse: collapse;
|
||||
background: #303030;
|
||||
font-size: 90%;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
table.docinfo tr {
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
th.docinfo-name,
|
||||
table.docinfo td,
|
||||
table.docinfo td a:link,
|
||||
table.docinfo td a:active,
|
||||
table.docinfo td a:visited,
|
||||
table.docinfo td a:focus,
|
||||
table.docinfo td a:hover
|
||||
{
|
||||
border: 0px solid white;
|
||||
background: #303030;
|
||||
color: white;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
th.docinfo-name {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
table.docinfo td {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.ul {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
* span.smallcaps {
|
||||
/*font-variant: "small-caps";*/
|
||||
text-transform: "uppercase";
|
||||
font-size: "smaller";
|
||||
}
|
||||
|
||||
|
||||
span.cb {
|
||||
font-family: "andale mono", monospace;
|
||||
font-weight: bold;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
span.fboxtt {
|
||||
border: 1px solid black;
|
||||
padding: 0px 4px;
|
||||
font-family: "andale mono", monospace;
|
||||
font-weight: bold;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
#notice.system-message, .notice.system-message {
|
||||
color: black;
|
||||
background: #DDFFDD;
|
||||
padding-top: 5pt;
|
||||
padding-bottom: 5pt;
|
||||
border: 1px none #55BB55;
|
||||
border-top-width: 4px;
|
||||
border-top-style: solid;
|
||||
}
|
||||
|
||||
#content.error .message, div.system-message {
|
||||
color: #550000;
|
||||
background: #ffddcc;
|
||||
border: 2px none #dd0000;
|
||||
border-top-width: 4px;
|
||||
border-top-style: solid;
|
||||
padding: .5em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
#main {
|
||||
float: right;
|
||||
width: 70%;
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
min-height: 700px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#main h1 {
|
||||
border-bottom: 2px solid #09550b;
|
||||
}
|
||||
|
||||
div#main div.section h1 {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#cmscontent {
|
||||
padding: 0pt 4% 10pt 4%;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents {
|
||||
padding: 10pt 4% 10pt 4%;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents span.cs {
|
||||
font-size: 80%;
|
||||
font-family: "andale mono", monospace;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents hr.lang_separator {
|
||||
border: 1px dotted black;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 10pt;
|
||||
}
|
||||
|
||||
#embedcontent {
|
||||
border: 0pt;
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 29.9%;
|
||||
padding: 0 0 0 0;
|
||||
margin: 0 0 0 0;
|
||||
color: white;
|
||||
background: #09550B;
|
||||
/*
|
||||
min-height: 300px;
|
||||
background: #f2f2f2;
|
||||
border-right: 1px solid #ccc;
|
||||
padding: 0 0 0 10px;
|
||||
*/
|
||||
}
|
Binary file not shown.
|
@ -1,238 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: RDS_LCW.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Mon Sep 15 18:23:48 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 233 348
|
||||
%Magnification: 0.8000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 348 moveto 0 0 lineto 233 0 lineto 233 348 lineto closepath clip newpath
|
||||
-114.1 389.4 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04800 0.04800 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 3900 5700 m 3900 2700 l 4800 2700 l 4800 5700 l
|
||||
cp gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 55
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 5100 6600 m 5100 1800 l 6300 1800 l 6300 6600 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
45.000 slw
|
||||
n 5625 1725 m
|
||||
5775 1875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 1875 m
|
||||
5775 1725 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 6525 m
|
||||
5775 6675 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5625 6675 m
|
||||
5775 6525 l gs col0 s gr
|
||||
% Polyline
|
||||
15.000 slw
|
||||
n 2400 900 m 5775 900 l 5775 1275 l 2400 1275 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
2550 1200 m
|
||||
gs 1 -1 sc (LCW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
3450 1200 m
|
||||
gs 1 -1 sc (dL) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
5250 1200 m
|
||||
gs 1 -1 sc (SP) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
4350 1200 m
|
||||
gs 1 -1 sc (W) col18 sh gr
|
||||
% Polyline
|
||||
[90 45 15 45] 0 sd
|
||||
n 5700 1800 m
|
||||
5700 6600 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 3225 2700 m
|
||||
3825 2700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5025 1800 m
|
||||
3225 1800 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3825 5700 m
|
||||
3225 5700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5025 6600 m
|
||||
3225 6600 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3900 5775 m
|
||||
3900 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 4800 5775 m
|
||||
4800 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 6675 m 5100 6900 l 5400 7200 l
|
||||
5400 7575 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
3270 2564 m 3270 2715 l 3330 2715 l 3330 2564 l 3330 2564 l 3300 2684 l 3270 2564 l cp
|
||||
3330 1936 m 3330 1785 l 3270 1785 l 3270 1936 l 3270 1936 l 3300 1816 l 3330 1936 l cp
|
||||
eoclip
|
||||
n 3300 1800 m
|
||||
3300 2700 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 3330 1936 m 3300 1816 l 3270 1936 l 3330 1936 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 3270 2564 m 3300 2684 l 3330 2564 l 3270 2564 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
3270 6464 m 3270 6615 l 3330 6615 l 3330 6464 l 3330 6464 l 3300 6584 l 3270 6464 l cp
|
||||
3330 5836 m 3330 5685 l 3270 5685 l 3270 5836 l 3270 5836 l 3300 5716 l 3330 5836 l cp
|
||||
eoclip
|
||||
n 3300 5700 m
|
||||
3300 6600 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 3330 5836 m 3300 5716 l 3270 5836 l 3330 5836 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 3270 6464 m 3300 6584 l 3330 6464 l 3270 6464 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
4664 7530 m 4815 7530 l 4815 7470 l 4664 7470 l 4664 7470 l 4784 7500 l 4664 7530 l cp
|
||||
4036 7470 m 3885 7470 l 3885 7530 l 4036 7530 l 4036 7530 l 3916 7500 l 4036 7470 l cp
|
||||
eoclip
|
||||
n 3900 7500 m
|
||||
4800 7500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4036 7470 m 3916 7500 l 4036 7530 l 4036 7470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 4664 7530 m 4784 7500 l 4664 7470 l 4664 7530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5264 7530 m 5415 7530 l 5415 7470 l 5264 7470 l 5264 7470 l 5384 7500 l 5264 7530 l cp
|
||||
4936 7470 m 4785 7470 l 4785 7530 l 4936 7530 l 4936 7530 l 4816 7500 l 4936 7470 l cp
|
||||
eoclip
|
||||
n 4800 7500 m
|
||||
5400 7500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4936 7470 m 4816 7500 l 4936 7530 l 4936 7470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 5264 7530 m 5384 7500 l 5264 7470 l 5264 7530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
n 2400 900 m 7200 900 l 7200 8100 l 2400 8100 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
5100 7425 m
|
||||
gs 1 -1 sc (SP) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4350 7425 m
|
||||
gs 1 -1 sc (W) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3225 2250 m
|
||||
gs 1 -1 sc 90.0 rot (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3225 6150 m
|
||||
gs 1 -1 sc 90.0 rot (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
Binary file not shown.
|
@ -1,243 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: RDS_VW.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Mon Sep 15 18:24:04 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 489 255
|
||||
%Magnification: 1.0000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 255 moveto 0 0 lineto 489 0 lineto 489 255 lineto closepath clip newpath
|
||||
-106.7 306.7 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.06000 0.06000 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 2400 1800 m 8400 1800 l 8400 3600 l 2400 3600 l
|
||||
cp gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 55
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 3000 2100 m 7800 2100 l 7800 3300 l 3000 3300 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 1800 900 m 5175 900 l 5175 1275 l 1800 1275 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
1950 1200 m
|
||||
gs 1 -1 sc (VW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
2850 1200 m
|
||||
gs 1 -1 sc (dL) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
3750 1200 m
|
||||
gs 1 -1 sc (dW) col18 sh gr
|
||||
/Courier-Bold ff 300.00 scf sf
|
||||
4650 1200 m
|
||||
gs 1 -1 sc (dX) col0 sh gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 7875 2100 m
|
||||
9375 2100 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8475 1800 m 8700 1800 l 9000 1500 l
|
||||
9375 1500 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7875 3300 m
|
||||
9375 3300 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8475 3600 m 8700 3600 l 9000 3900 l
|
||||
9375 3900 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 3375 m
|
||||
7800 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 8400 3675 m
|
||||
8400 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 2400 3675 m
|
||||
2400 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3000 3375 m
|
||||
3000 4575 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
9270 1964 m 9270 2115 l 9330 2115 l 9330 1964 l 9330 1964 l 9300 2084 l 9270 1964 l cp
|
||||
9330 1636 m 9330 1485 l 9270 1485 l 9270 1636 l 9270 1636 l 9300 1516 l 9330 1636 l cp
|
||||
eoclip
|
||||
n 9300 1500 m
|
||||
9300 2100 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 9330 1636 m 9300 1516 l 9270 1636 l 9330 1636 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 9270 1964 m 9300 2084 l 9330 1964 l 9270 1964 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
9270 3764 m 9270 3915 l 9330 3915 l 9330 3764 l 9330 3764 l 9300 3884 l 9270 3764 l cp
|
||||
9330 3436 m 9330 3285 l 9270 3285 l 9270 3436 l 9270 3436 l 9300 3316 l 9330 3436 l cp
|
||||
eoclip
|
||||
n 9300 3300 m
|
||||
9300 3900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 9330 3436 m 9300 3316 l 9270 3436 l 9330 3436 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 9270 3764 m 9300 3884 l 9330 3764 l 9270 3764 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
8264 4530 m 8415 4530 l 8415 4470 l 8264 4470 l 8264 4470 l 8384 4500 l 8264 4530 l cp
|
||||
7936 4470 m 7785 4470 l 7785 4530 l 7936 4530 l 7936 4530 l 7816 4500 l 7936 4470 l cp
|
||||
eoclip
|
||||
n 7800 4500 m
|
||||
8400 4500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 7936 4470 m 7816 4500 l 7936 4530 l 7936 4470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 8264 4530 m 8384 4500 l 8264 4470 l 8264 4530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
2864 4530 m 3015 4530 l 3015 4470 l 2864 4470 l 2864 4470 l 2984 4500 l 2864 4530 l cp
|
||||
2536 4470 m 2385 4470 l 2385 4530 l 2536 4530 l 2536 4530 l 2416 4500 l 2536 4470 l cp
|
||||
eoclip
|
||||
n 2400 4500 m
|
||||
3000 4500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 2536 4470 m 2416 4500 l 2536 4530 l 2536 4470 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 2864 4530 m 2984 4500 l 2864 4470 l 2864 4530 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 2925 2625 m
|
||||
3075 2775 l gs col0 s gr
|
||||
% Polyline
|
||||
n 2925 2775 m
|
||||
3075 2625 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7725 2625 m
|
||||
7875 2775 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7725 2775 m
|
||||
7875 2625 l gs col0 s gr
|
||||
% Polyline
|
||||
15.000 slw
|
||||
[90 45 15 45] 0 sd
|
||||
n 3000 2700 m
|
||||
7800 2700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 1800 900 m 9900 900 l 9900 5100 l 1800 5100 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
2700 4425 m
|
||||
gs 1 -1 sc (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
8100 4425 m
|
||||
gs 1 -1 sc (dL) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
9225 3600 m
|
||||
gs 1 -1 sc 90.0 rot (dW/2) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
9225 1800 m
|
||||
gs 1 -1 sc 90.0 rot (dW/2) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,283 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: SegmentOrientation.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 17:55:45 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 507 471
|
||||
%Magnification: 1.0000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 471 moveto 0 0 lineto 507 0 lineto 507 471 lineto closepath clip newpath
|
||||
-88.7 595.3 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/DrawEllipse {
|
||||
/endangle exch def
|
||||
/startangle exch def
|
||||
/yrad exch def
|
||||
/xrad exch def
|
||||
/y exch def
|
||||
/x exch def
|
||||
/savematrix mtrx currentmatrix def
|
||||
x y tr xrad yrad sc 0 0 1 startangle endangle arc
|
||||
closepath
|
||||
savematrix setmatrix
|
||||
} def
|
||||
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.06000 0.06000 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 2775 4200 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
45.000 slw
|
||||
n 3300 2700 m 3900 2700 l 3900 5700 l 3300 5700 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 3600 2700 m
|
||||
3600 5700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 3450 5550 m
|
||||
3750 5850 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3450 5850 m
|
||||
3750 5550 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3600 2700 m
|
||||
3450 3000 l gs col0 s gr
|
||||
% Polyline
|
||||
n 3600 2700 m
|
||||
3750 3000 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 4425 4200 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 7500 5700 m 8100 5700 l 8100 2700 l 7500 2700 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 7800 5700 m
|
||||
7800 2700 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 7650 2850 m
|
||||
7950 2550 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7650 2550 m
|
||||
7950 2850 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 5700 m
|
||||
7650 5400 l gs col0 s gr
|
||||
% Polyline
|
||||
n 7800 5700 m
|
||||
7950 5400 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 6975 4200 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Ellipse
|
||||
n 8625 4200 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 6300 8400 m 6300 7800 l 9300 7800 l 9300 8400 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 6300 8100 m
|
||||
9300 8100 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 9150 8250 m
|
||||
9450 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 9450 8250 m
|
||||
9150 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 6300 8100 m
|
||||
6600 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 6300 8100 m
|
||||
6600 7950 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 7800 8925 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Ellipse
|
||||
n 7800 7275 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 5100 7800 m 5100 8400 l 2100 8400 l 2100 7800 l
|
||||
cp gs col0 s gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
[60 30 15 30] 0 sd
|
||||
n 5100 8100 m
|
||||
2100 8100 l gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
45.000 slw
|
||||
n 2250 7950 m
|
||||
1950 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1950 7950 m
|
||||
2250 8250 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 8100 m
|
||||
4800 7950 l gs col0 s gr
|
||||
% Polyline
|
||||
n 5100 8100 m
|
||||
4800 8250 l gs col0 s gr
|
||||
% Ellipse
|
||||
15.000 slw
|
||||
n 3525 7275 450 450 0 360 DrawEllipse gs col18 0.50 tnt ef gr gs col18 s gr
|
||||
|
||||
% Ellipse
|
||||
n 3525 8925 450 450 0 360 DrawEllipse gs col12 0.50 tnt ef gr gs col12 s gr
|
||||
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
2775 4275 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4425 4275 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
6975 4275 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
8625 4275 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
7800 9000 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
7800 7350 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3525 7350 m
|
||||
gs 1 -1 sc (left) dup sw pop 2 div neg 0 rm col18 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3525 9000 m
|
||||
gs 1 -1 sc (right) dup sw pop 2 div neg 0 rm col12 sh gr
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
15.000 slw
|
||||
n 5700 2100 m
|
||||
5700 9900 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 6300 m
|
||||
9900 6300 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 2100 m 9900 2100 l 9900 9900 l 1500 9900 l
|
||||
cp gs col0 s gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
1650 2400 m
|
||||
gs 1 -1 sc (Up) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
1650 6600 m
|
||||
gs 1 -1 sc (Right) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
5850 6600 m
|
||||
gs 1 -1 sc (Left) col0 sh gr
|
||||
/Courier-Bold ff 266.67 scf sf
|
||||
5850 2400 m
|
||||
gs 1 -1 sc (Down) col0 sh gr
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,259 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: bigvia-1.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 22:43:59 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 275 269
|
||||
%Magnification: 0.7000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 269 moveto 0 0 lineto 275 0 lineto 275 269 lineto closepath clip newpath
|
||||
-3.2 331.3 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04200 0.04200 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
0.000 slw
|
||||
n 900 6300 m 1500 6300 l 1500 6900 l 900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 6300 m 3000 6300 l 3000 6900 l 2400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 6300 m 4500 6300 l 4500 6900 l 3900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 6300 m 6000 6300 l 6000 6900 l 5400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 4800 m 1500 4800 l 1500 5400 l 900 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 3300 m 1500 3300 l 1500 3900 l 900 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 1800 m 1500 1800 l 1500 2400 l 900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 4800 m 3000 4800 l 3000 5400 l 2400 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 3300 m 3000 3300 l 3000 3900 l 2400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 3300 m 4500 3300 l 4500 3900 l 3900 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 4800 m 4500 4800 l 4500 5400 l 3900 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 1800 m 3000 1800 l 3000 2400 l 2400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 1800 m 4500 1800 l 4500 2400 l 3900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 1800 m 6000 1800 l 6000 2400 l 5400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 3300 m 6000 3300 l 6000 3900 l 5400 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 4800 m 6000 4800 l 6000 5400 l 5400 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 5400 6900 m
|
||||
5400 7875 l gs col7 0.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 6000 6900 m 6000 7200 l 6300 7500 l
|
||||
6300 7875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1500 5775 m
|
||||
1500 7875 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1425 5700 m
|
||||
225 5700 l gs col0 s gr
|
||||
% Polyline
|
||||
n 1425 2700 m
|
||||
225 2700 l gs col0 s gr
|
||||
% Polyline
|
||||
gs clippath
|
||||
270 5564 m 270 5715 l 330 5715 l 330 5564 l 330 5564 l 300 5684 l 270 5564 l cp
|
||||
330 2836 m 330 2685 l 270 2685 l 270 2836 l 270 2836 l 300 2716 l 330 2836 l cp
|
||||
eoclip
|
||||
n 300 2700 m
|
||||
300 5700 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 330 2836 m 300 2716 l 270 2836 l 330 2836 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 270 5564 m 300 5684 l 330 5564 l 270 5564 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
4364 7830 m 4515 7830 l 4515 7770 l 4364 7770 l 4364 7770 l 4484 7800 l 4364 7830 l cp
|
||||
1636 7770 m 1485 7770 l 1485 7830 l 1636 7830 l 1636 7830 l 1516 7800 l 1636 7770 l cp
|
||||
eoclip
|
||||
n 1500 7800 m
|
||||
4500 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 1636 7770 m 1516 7800 l 1636 7830 l 1636 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 4364 7830 m 4484 7800 l 4364 7770 l 4364 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5264 7830 m 5415 7830 l 5415 7770 l 5264 7770 l 5264 7770 l 5384 7800 l 5264 7830 l cp
|
||||
4636 7770 m 4485 7770 l 4485 7830 l 4636 7830 l 4636 7830 l 4516 7800 l 4636 7770 l cp
|
||||
eoclip
|
||||
n 4500 7800 m
|
||||
5400 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 4636 7770 m 4516 7800 l 4636 7830 l 4636 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 5264 7830 m 5384 7800 l 5264 7770 l 5264 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
6164 7830 m 6315 7830 l 6315 7770 l 6164 7770 l 6164 7770 l 6284 7800 l 6164 7830 l cp
|
||||
5536 7770 m 5385 7770 l 5385 7830 l 5536 7830 l 5536 7830 l 5416 7800 l 5536 7770 l cp
|
||||
eoclip
|
||||
n 5400 7800 m
|
||||
6300 7800 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 5536 7770 m 5416 7800 l 5536 7830 l 5536 7770 l cp gs 0.00 setgray ef gr col0 s
|
||||
% arrowhead
|
||||
n 6164 7830 m 6284 7800 l 6164 7770 l 6164 7830 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
n 4500 5775 m
|
||||
4500 7875 l gs col0 s gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
3000 7725 m
|
||||
gs 1 -1 sc (width) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
4950 7725 m
|
||||
gs 1 -1 sc (step) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
5850 7725 m
|
||||
gs 1 -1 sc (side) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
/Courier-Bold ff 200.00 scf sf
|
||||
225 4200 m
|
||||
gs 1 -1 sc 90.0 rot (height) dup sw pop 2 div neg 0 rm col0 sh gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
6343 6960 m 6615 6960 l 6615 6840 l 6343 6840 l 6343 6840 l 6583 6900 l 6343 6960 l cp
|
||||
eoclip
|
||||
n 600 6900 m
|
||||
6600 6900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 6343 6960 m 6583 6900 l 6343 6840 l col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
960 1757 m 960 1485 l 840 1485 l 840 1757 l 840 1757 l 900 1517 l 960 1757 l cp
|
||||
eoclip
|
||||
n 900 7200 m
|
||||
900 1500 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 960 1757 m 900 1517 l 840 1757 l col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
[150 75 15 75] 0 sd
|
||||
n 1500 2700 m 4500 2700 l 4500 5700 l 1500 5700 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
|
@ -1,184 +0,0 @@
|
|||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: bigvia-2.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri Sep 26 22:28:01 2014
|
||||
%%For: jpc@lepka (Jean-Paul Chaput)
|
||||
%%BoundingBox: 0 0 254 254
|
||||
%Magnification: 0.7000
|
||||
%%EndComments
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
save
|
||||
newpath 0 254 moveto 0 0 lineto 254 0 lineto 254 254 lineto closepath clip newpath
|
||||
-24.7 302.9 translate
|
||||
1 -1 scale
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.04200 0.04200 sc
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 60
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
0.000 slw
|
||||
n 900 6300 m 1500 6300 l 1500 6900 l 900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 6300 m 3000 6300 l 3000 6900 l 2400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 6300 m 4500 6300 l 4500 6900 l 3900 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 6300 m 6000 6300 l 6000 6900 l 5400 6900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 4800 m 1500 4800 l 1500 5400 l 900 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 3300 m 1500 3300 l 1500 3900 l 900 3900 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 900 1800 m 1500 1800 l 1500 2400 l 900 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 2400 4800 m 3000 4800 l 3000 5400 l 2400 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 3300 m 3000 3300 l 3000 3900 l 2400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 3300 m 4500 3300 l 4500 3900 l 3900 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 3900 4800 m 4500 4800 l 4500 5400 l 3900 5400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2400 1800 m 3000 1800 l 3000 2400 l 2400 2400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 5400 4800 m 6000 4800 l 6000 5400 l 5400 5400 l
|
||||
cp gs col7 0.80 shd ef gr
|
||||
% Polyline
|
||||
n 3900 1800 m 4500 1800 l 4500 2400 l 3900 2400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 5400 1800 m 6000 1800 l 6000 2400 l 5400 2400 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 5400 3300 m 6000 3300 l 6000 3900 l 5400 3900 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 50
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
6343 6960 m 6615 6960 l 6615 6840 l 6343 6840 l 6343 6840 l 6583 6900 l 6343 6960 l cp
|
||||
eoclip
|
||||
n 600 6900 m
|
||||
6600 6900 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 6343 6960 m 6583 6900 l 6343 6840 l col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
960 1457 m 960 1185 l 840 1185 l 840 1457 l 840 1457 l 900 1217 l 960 1457 l cp
|
||||
eoclip
|
||||
n 900 7200 m
|
||||
900 1200 l gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 960 1457 m 900 1217 l 840 1457 l col0 s
|
||||
% Polyline
|
||||
45.000 slw
|
||||
[150 75 15 75] 0 sd
|
||||
n 1500 2700 m 4500 2700 l 4500 5700 l 1500 5700 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% Polyline
|
||||
[150 75 15 75] 0 sd
|
||||
n 3600 1500 m 6300 1500 l 6300 4200 l 3600 4200 l
|
||||
cp gs col0 s gr [] 0 sd
|
||||
% here ends figure;
|
||||
$F2psEnd
|
||||
rs
|
||||
showpage
|
||||
%%Trailer
|
||||
%EOF
|
Binary file not shown.
|
@ -0,0 +1,26 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "index.rst<RDS>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
|
||||
|
||||
=========================================
|
||||
Symbolic to Real Conversion in Alliance
|
||||
=========================================
|
||||
|
||||
Printable version of this document `RDS.pdf <../../../pdf/main/RDS.pdf>`_.
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
RDSpage.rst
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
.. -*- mode: rst; explicit-buffer-name: "pdfHeader.rst<RDS>" -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
:Date: 26, september 2014
|
||||
:Authors: Jean-Paul Chaput
|
||||
:Contact: <alliance-users@soc.lip6.fr>
|
||||
:Version: 0.2
|
||||
|
||||
|medskip|
|
||||
|
||||
**Disclaimer:** This document is still far from complete.
|
||||
|
||||
|medskip|
|
||||
|
||||
|
||||
=========================================
|
||||
Symbolic To Real Conversion in Alliance
|
||||
=========================================
|
||||
|
||||
|pagestylefancy|
|
||||
|
||||
|
||||
.. contents::
|
||||
|
||||
|newpage|
|
|
@ -1,86 +0,0 @@
|
|||
|
||||
\usepackage[default,osfigures,scale=0.95]{opensans}
|
||||
\usepackage{xspace}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{enumitem}
|
||||
\usepackage[sf,bf]{titlesec}
|
||||
\usepackage{titletoc}
|
||||
\usepackage[paper=a4paper,headheight=30pt,tmargin=1.5in,bmargin=1in]{geometry}
|
||||
%\usepackage{layouts}
|
||||
|
||||
\renewlist{itemize}{itemize}{9}
|
||||
\setlist[itemize]{label=\textbullet}
|
||||
|
||||
% The LaTeX Companion -- p. 204.
|
||||
% Miniature display of the page layout.
|
||||
%\newcommand{\showpage}{%
|
||||
% \setlayoutscale{0.65}\setlabelfont{\tiny}%
|
||||
% \printheadingsfalse\printparametersfalse%
|
||||
% \currentpage\pagedesign%
|
||||
%}
|
||||
|
||||
\titlecontents{section}[0pc]
|
||||
{\sffamily\bfseries} % above code.
|
||||
{\contentslabel{1pc}} % numbered entry format.
|
||||
{} % numberless entry format.
|
||||
{\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format.
|
||||
\titlecontents{subsection}[0pc]
|
||||
{\sffamily} % above code.
|
||||
{\contentslabel{2pc}} % numbered entry format.
|
||||
{} % numberless entry format.
|
||||
{\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format.
|
||||
\titlecontents{subsubsection}[1pc]
|
||||
{\sffamily} % above code.
|
||||
{\contentslabel{2pc}} % numbered entry format.
|
||||
{} % numberless entry format.
|
||||
{\titlerule*[8pt]{.}\textsc{\textbf{{\contentspage}}}} % page format.
|
||||
|
||||
\newcommand{\key}[1]{\raisebox{-0.5\baselineskip}{\rule{0pt}{1.5\baselineskip}}\fbox{\textsf{#1}}}
|
||||
|
||||
\newcommand{\DUroleul}[1]{\underline{#1}\xspace}
|
||||
\newcommand{\DUrolesc}[1]{\textsc{#1}\xspace}
|
||||
\newcommand{\DUrolecb}[1]{\textbf{\texttt{#1}}\xspace}
|
||||
\newcommand{\DUrolefboxtt}[1]{\fbox{\texttt{#1}}\xspace}
|
||||
|
||||
\newcommand{\DUtitlenote}[1]{\noindent\textbf{#1}\smallskip}
|
||||
|
||||
\newcommand{\DUadmonitionnote}[1]{%
|
||||
\begin{center}
|
||||
\sffamily
|
||||
\begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}}
|
||||
\raisebox{0.0cm}{\includegraphics[scale=0.5]{./images/clipboard.eps}} &
|
||||
\begin{minipage}[t]{.85\textwidth} #1
|
||||
\end{minipage} \\
|
||||
\end{array}
|
||||
\end{center}
|
||||
}
|
||||
|
||||
\newcommand{\DUtitleerror}[1]{\noindent\textbf{\color{red}#1}\smallskip}
|
||||
|
||||
\newcommand{\DUadmonitionerror}[1]{%
|
||||
\begin{center}
|
||||
\sffamily
|
||||
\begin{array}[t]{m{1cm}!{\vrule width 1pt}m{.90\textwidth}}
|
||||
\raisebox{0.0cm}{\includegraphics[scale=0.5]{./images/i-core.eps}} &
|
||||
\begin{minipage}[t]{.85\textwidth} #1
|
||||
\end{minipage} \\
|
||||
\end{array}
|
||||
\end{center}
|
||||
}
|
||||
|
||||
\newcommand{\UPMC} {\textsc{upmc}\xspace}
|
||||
\newcommand{\LIP} {\textsc{lip6}\xspace}
|
||||
\newcommand{\SoC} {\textsc{S}o\textsc{C}\xspace}
|
||||
|
||||
\renewcommand{\headrulewidth}{0.2mm}
|
||||
\renewcommand{\footrulewidth}{0.2mm}
|
||||
\renewcommand{\sectionmark}[1]{\markboth{\thesection\ #1}{\thesection\ #1}}
|
||||
\renewcommand{\subsectionmark}[1]{}
|
||||
\lhead[]{\textsc{SoC} Documentation}
|
||||
\rhead[]{September 2014}
|
||||
\lfoot[]{\UPMC/\LIP/\SoC}
|
||||
\rfoot[]{\thepage}
|
||||
\cfoot[]{}
|
||||
|
||||
\pagestyle{fancy}
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================
|
||||
Stratus Reference
|
||||
===================
|
||||
|
||||
The Stratus Language reference is generated by LaTeX2HTML_ and is
|
||||
available here: `Stratus <file:../../stratus/index.html>`_
|
|
@ -0,0 +1,11 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
===================
|
||||
Unicorn Reference
|
||||
===================
|
||||
|
||||
The Unicorn C++ API reference is generated by Doxygen_ and is
|
||||
available here: `Unicorn <file:../../unicorn/index.html>`_
|
|
@ -1,36 +0,0 @@
|
|||
# -*- mode: CMAKE; explicit-buffer-name: "CMakeLists.txt<UsersGuide>" -*-
|
||||
|
||||
set ( htmlInstallDir share/doc/coriolis2/en/html/users-guide )
|
||||
set ( latexInstallDir share/doc/coriolis2/en/latex/users-guide )
|
||||
|
||||
add_custom_target ( doc_HTML ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& rst2html --link-stylesheet --stylesheet=./SoC.css,./Pygments.css UsersGuide_HTML.rst UsersGuide.html )
|
||||
add_dependencies ( doc_HTML SoC.css Pygments.css UsersGuide_HTML.rst UsersGuide.rst )
|
||||
|
||||
add_custom_target ( doc_LaTeX ALL
|
||||
cd ${DOCUMENTATION_SOURCE_DIR}/UsersGuide
|
||||
&& rst2latex --use-latex-toc --stylesheet=./socstyle.tex UsersGuide_LaTeX.rst UsersGuide-raw.tex
|
||||
&& sed 's, \\& \\\\multicolumn{2}{l|}{, \\& \\\\multicolumn{2}{p{0.6\\\\DUtablewidth}|}{,' UsersGuide-raw.tex > UsersGuide.tex
|
||||
&& latex UsersGuide
|
||||
&& latex UsersGuide
|
||||
&& latex UsersGuide
|
||||
&& dvipdfm UsersGuide
|
||||
)
|
||||
add_dependencies ( doc_HTML socstyle.tex UsersGuide_LaTeX.rst UsersGuide.rst )
|
||||
|
||||
install ( DIRECTORY images/
|
||||
DESTINATION ${htmlInstallDir}/images
|
||||
FILES_MATCHING PATTERN "*.png" )
|
||||
install ( FILES SoC.css
|
||||
Pygments.css
|
||||
UsersGuide.html DESTINATION ${htmlInstallDir} )
|
||||
|
||||
install ( DIRECTORY images/
|
||||
DESTINATION ${latexInstallDir}/images
|
||||
FILES_MATCHING PATTERN "*.pdf"
|
||||
PATTERN "*.eps"
|
||||
PATTERN "*.bb" )
|
||||
|
||||
install ( FILES socstyle.tex
|
||||
UsersGuide.tex DESTINATION ${latexInstallDir} )
|
|
@ -0,0 +1,342 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: file:///usr/share/doc/coriolis2/index.html
|
||||
|
||||
|
||||
|
||||
.. |CoriolisSoftSchema| image:: ./images/Coriolis-Soft-Schema.png
|
||||
:alt: Coriolis Software Schematic
|
||||
:align: middle
|
||||
:width: 60%
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Coriolis Configuration & Initialisation
|
||||
=======================================
|
||||
|
||||
|
||||
General Software Architecture
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|Coriolis| has been build with respect of the classical paradigm that the
|
||||
computational instensive parts have been written in C++, and almost
|
||||
everything else in |Python|. To build the |Python| interface we used
|
||||
two methods:
|
||||
|
||||
* For self-contained modules :cb:`boost::python` (mainly in :cb:`vlsisapd`).
|
||||
* For all modules based on |Hurricane|, we created our own wrappers due
|
||||
to very specific requirements such as shared functions between modules
|
||||
or C++/|Python| secure bi-directional object deletion.
|
||||
|
||||
.. note:: **Python Documentation:**
|
||||
Most of the documentation is related to the C++ API and implemetation of
|
||||
the tools. However, the |Python| bindings have been created so they
|
||||
mimic *as closely as possible* the C++ interface, so the documentation
|
||||
applies to both languages with only minor syntactic changes.
|
||||
|
||||
|bcenter| |CoriolisSoftSchema| |ecenter|
|
||||
|
||||
All configuration & initialization files are Python scripts, despite their
|
||||
|dot_conf| extention. From a syntactic point of view, there is no difference
|
||||
between the system-wide configuration files and the user's configuration,
|
||||
they may use the same Python helpers.
|
||||
|medskip|
|
||||
|
||||
Configuration is done in two stages:
|
||||
|
||||
#. Selecting the symbolic technology.
|
||||
#. Loading the complete configuration for the given technology.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
First Stage: Symbolic Technology Selection
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|noindent|
|
||||
The initialization process is done by executing, in order, the following
|
||||
file(s):
|
||||
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| Order | Meaning | File |
|
||||
+=======+==================================+==============================================+
|
||||
| **1** | The system setting | :cb:`/etc/coriolis2/techno.conf` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **2** | The user's global setting | :cb:`${HOME}/.coriolis2/techno.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **3** | The user's local setting | :cb:`<CWD>/.coriolis2/techno.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
|
||||
Thoses files must provides only two variables, the name of the symbolic technology
|
||||
and the one of the real technology. For example: ::
|
||||
|
||||
# -*- Mode:Python -*-
|
||||
|
||||
symbolicTechno = 'cmos'
|
||||
realTechno = 'hcmos9'
|
||||
|
||||
|
||||
Second Stage: Technology Configuration Loading
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|noindent|
|
||||
The :cb:`TECHNO` variable is set by the first stage and it's the name of the
|
||||
symbolic technology. A directory of that name, with all the configuration files,
|
||||
must exists in the configuration directory. In addition to the technology-specific
|
||||
directories, a :cb:`common/` directory is there to provides a trunk for all the
|
||||
identical datas across the various technologies. The initialization process is done
|
||||
by executing, in order, the following file(s):
|
||||
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| Order | Meaning | File |
|
||||
+=======+==================================+==============================================+
|
||||
| **1** | The system initialization | :cb:`/etc/coriolis2/<TECHNO>/<TOOL>.conf` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **2** | The user's global initialization | :cb:`${HOME}/.coriolis2/settings.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
| **3** | The user's local initialization | :cb:`<CWD>/.coriolis2/settings.py` |
|
||||
+-------+----------------------------------+----------------------------------------------+
|
||||
|
||||
.. note:: *The loading policy is not hard-coded.* It is implemented
|
||||
at Python level in :cb:`/etc/coriolis2/coriolisInit.py`, and thus may be easily be
|
||||
amended to whatever site policy.
|
||||
|
||||
The truly mandatory requirement is the existence of :cb:`coriolisInit.py`
|
||||
which *must* contain a :cb:`coriolisConfigure()` function with no argument.
|
||||
|
||||
|
||||
Configuration Helpers
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To ease the writing of configuration files, a set of small helpers
|
||||
is available. They allow to setup the configuration parameters through
|
||||
simple assembly of tuples. The helpers are installed under the directory: ::
|
||||
|
||||
<install>/etc/coriolis2/
|
||||
|
||||
Where :cb:`<install>/` is the root of the installation.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
.. _Alliance Helper:
|
||||
|
||||
|Alliance| Helper
|
||||
-----------------
|
||||
|
||||
The configuration file must provide a :cb:`allianceConfig` tuple of
|
||||
the form: ::
|
||||
|
||||
cellsTop = '/usr/share/alliance/cells/'
|
||||
|
||||
allianceConfig = \
|
||||
( ( 'SYMBOLIC_TECHNOLOGY', helpers.sysConfDir+'/technology.symbolic.xml' )
|
||||
, ( 'REAL_TECHNOLOGY' , helpers.sysConfDir+'/technology.cmos130.s2r.xml')
|
||||
, ( 'DISPLAY' , helpers.sysConfDir+'/display.xml' )
|
||||
, ( 'CATALOG' , 'CATAL')
|
||||
, ( 'WORKING_LIBRARY' , '.')
|
||||
, ( 'SYSTEM_LIBRARY' , ( (cellsTop+'sxlib' , Environment.Append)
|
||||
, (cellsTop+'dp_sxlib', Environment.Append)
|
||||
, (cellsTop+'ramlib' , Environment.Append)
|
||||
, (cellsTop+'romlib' , Environment.Append)
|
||||
, (cellsTop+'rflib' , Environment.Append)
|
||||
, (cellsTop+'rf2lib' , Environment.Append)
|
||||
, (cellsTop+'pxlib' , Environment.Append) ) )
|
||||
, ( 'SCALE_X' , 100)
|
||||
, ( 'IN_LO' , 'vst')
|
||||
, ( 'IN_PH' , 'ap')
|
||||
, ( 'OUT_LO' , 'vst')
|
||||
, ( 'OUT_PH' , 'ap')
|
||||
, ( 'POWER' , 'vdd')
|
||||
, ( 'GROUND' , 'vss')
|
||||
, ( 'CLOCK' , '^ck.*')
|
||||
, ( 'BLOCKAGE' , '^blockageNet*')
|
||||
)
|
||||
|
||||
|
||||
|noindent| The example above shows the system configuration file, with all the
|
||||
available settings. Some important remarks about thoses settings:
|
||||
|
||||
* In it's configuration file, the user do not need to redefine all the settings,
|
||||
just the one he wants to change. In most of the cases, the ``SYSTEM_LIBRARY``,
|
||||
the ``WORKING_LIBRARY`` and the special net names (at this point there is not
|
||||
much alternatives for the others settings).
|
||||
|
||||
* ``SYSTEM_LIBRARY`` setting: Setting up the library search path.
|
||||
Each library entry in the tuple will be added to the search path according
|
||||
to the second parameter:
|
||||
|
||||
* :cb:`Environment::Append`: append to the search path.
|
||||
|
||||
* :cb:`Environment::Prepend`: insert in head of the search path.
|
||||
|
||||
* :cb:`Environment::Replace`: look for a library of the same name and replace
|
||||
it, whithout changing the search path order. If no library of that name
|
||||
already exists, it is appended.
|
||||
|
||||
A library is identified by it's name, this name is the last component of the
|
||||
path name. For instance: ``/soc/alliance/sxlib`` will be named ``sxlib``.
|
||||
Implementing the |Alliance| specification, when looking for a |Cell| ``name``,
|
||||
the system will browse sequentially trought the library list and returns
|
||||
the first |Cell| whose name match.
|
||||
|
||||
* For ``POWER``, ``GROUND``, ``CLOCK`` and ``BLOCKAGE`` net names, a regular
|
||||
expression (|GNU| regexp) is expected.
|
||||
|
||||
* The ``helpers.sysConfDir`` variable is supplied by the helpers, it is the
|
||||
directory in which the system-wide configuration files are locateds.
|
||||
For a standard installation it would be: ``/soc/coriolis2``.
|
||||
|
||||
.. * Trick and naming convention about ``SYMBOLIC_TECHNOLOGY``, ``REAL_TECHNOLOGY``
|
||||
.. and ``DISPLAY``. In the previous releases, thoses files where to read by
|
||||
.. XML parsers, and still do if you triggers the XML compatibility mode.
|
||||
.. But now, they have Python conterparts. In the configuration files, you
|
||||
.. still have to name them as XML files, the Python file name will be
|
||||
.. deduced from this one with thoses two translation rules:
|
||||
..
|
||||
.. #. In the filename, all dots, except for the last (the file extention),
|
||||
.. are replaced by underscores.
|
||||
..
|
||||
.. #. The ``.xml`` extention is substituted by a ``.conf``.
|
||||
..
|
||||
.. For the symbolic technology, it would give: ::
|
||||
..
|
||||
.. /soc/coriolis2/technology.symbolic.xml
|
||||
.. --> /soc/coriolis2/technology_symbolic.conf
|
||||
|
||||
A typical user's configuration file would be: ::
|
||||
|
||||
import os
|
||||
|
||||
homeDir = os.getenv('HOME')
|
||||
|
||||
allianceConfig = \
|
||||
( ('WORKING_LIBRARY' , homeDir+'/worklib')
|
||||
, ('SYSTEM_LIBRARY' , ( (homeDir+'/mylib', Environment.Append) ) )
|
||||
, ('POWER' , 'vdd.*')
|
||||
, ('GROUND' , 'vss.*')
|
||||
)
|
||||
|
||||
|
||||
Tools Configuration Helpers
|
||||
---------------------------
|
||||
|
||||
All the tools uses the same helper to load their configuration (a.k.a.
|
||||
*Configuration Helper*). Currently the following configuration system-wide
|
||||
configuration files are defined:
|
||||
|
||||
* :cb:`misc.conf`: commons settings or not belonging specifically to a tool.
|
||||
* :cb:`etesian.conf`: for the |Etesian| tool.
|
||||
* :cb:`kite.conf`: for the |Kite| tool.
|
||||
* :cb:`stratus1.conf`: for the |stratus1| tool.
|
||||
|
||||
Here is the contents of :cb:`etesian.conf`: ::
|
||||
|
||||
# Etesian parameters.
|
||||
parametersTable = \
|
||||
( ('etesian.aspectRatio' , TypePercentage, 100 , { 'min':10, 'max':1000 } )
|
||||
, ('etesian.spaceMargin' , TypePercentage, 5 )
|
||||
, ('etesian.uniformDensity' , TypeBool , False )
|
||||
, ('etesian.routingDriven' , TypeBool , False )
|
||||
, ("etesian.effort" , TypeEnumerate , 2
|
||||
, { 'values':( ("Fast" , 1)
|
||||
, ("Standard", 2)
|
||||
, ("High" , 3)
|
||||
, ("Extreme" , 4) ) }
|
||||
)
|
||||
, ("etesian.graphics" , TypeEnumerate , 2
|
||||
, { 'values':( ("Show every step" , 1)
|
||||
, ("Show lower bound" , 2)
|
||||
, ("Show result only" , 3) ) }
|
||||
)
|
||||
)
|
||||
|
||||
layoutTable = \
|
||||
( (TypeTab , 'Etesian', 'etesian')
|
||||
|
||||
, (TypeTitle , 'Placement area')
|
||||
, (TypeOption, "etesian.aspectRatio" , "Aspect Ratio, X/Y (%)", 0 )
|
||||
, (TypeOption, "etesian.spaceMargin" , "Space Margin" , 1 )
|
||||
, (TypeRule ,)
|
||||
, (TypeTitle , 'Etesian - Placer')
|
||||
, (TypeOption, "etesian.uniformDensity", "Uniform density" , 0 )
|
||||
, (TypeOption, "etesian.routingDriven" , "Routing driven" , 0 )
|
||||
, (TypeOption, "etesian.effort" , "Placement effort" , 1 )
|
||||
, (TypeOption, "etesian.graphics" , "Placement view" , 1 )
|
||||
, (TypeRule ,)
|
||||
)
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Taxonomy of the file:
|
||||
|
||||
* It must contains, at least, the two tables:
|
||||
|
||||
* ``parametersTable``, defines & initialise the configuration variables.
|
||||
|
||||
* ``layoutTables``, defines how the various parameters will be displayed
|
||||
in the configuration window (:ref:`The Settings Tab`).
|
||||
|
||||
* The ``parametersTable``, is a tuple (list) of tuples. Each entry in the list
|
||||
describe a configuration parameter. In it's simplest form, it's a quadruplet
|
||||
:cb:`(TypeOption, 'paramId', ParameterType, DefaultValue)` with:
|
||||
|
||||
#. ``TypeOption``, tells that this tuple describe a parameter.
|
||||
|
||||
#. ``paramId``, the identifier of the parameter. Identifiers are defined
|
||||
by the tools. The list of parameters is detailed in each tool section.
|
||||
|
||||
#. ``ParameterType``, the kind of parameter. Could be:
|
||||
|
||||
* ``TypeBool``, boolean.
|
||||
* ``TypeInt``, signed integer.
|
||||
* ``TypeEnumerate``, enumerated type, needs extra entry.
|
||||
* ``TypePercentage``, percentage, expressed between 0 and 100.
|
||||
* ``TypeDouble``, float.
|
||||
* ``TypeString``, character string.
|
||||
|
||||
#. ``DefaultValue``, the default value for that parameter.
|
||||
|
||||
|
||||
Hacking the Configuration Files
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Asides from the symbols that gets used by the configuration helpers like
|
||||
:cb:`allianceConfig` or :cb:`parametersTable`, you can put pretty much anything
|
||||
in :cb:`<CWD>/.coriolis2/settings.py` (that is, written in |Python|).
|
||||
|
||||
For example: ::
|
||||
|
||||
# -*- Mode:Python -*-
|
||||
|
||||
defaultStyle = 'Alliance.Classic [black]'
|
||||
|
||||
# Regular Coriolis configuration.
|
||||
parametersTable = \
|
||||
( ('misc.catchCore' , TypeBool , False )
|
||||
, ('misc.info' , TypeBool , False )
|
||||
, ('misc.paranoid' , TypeBool , False )
|
||||
, ('misc.bug' , TypeBool , False )
|
||||
, ('misc.logMode' , TypeBool , True )
|
||||
, ('misc.verboseLevel1' , TypeBool , False )
|
||||
, ('misc.verboseLevel2' , TypeBool , True )
|
||||
, ('misc.minTraceLevel' , TypeInt , 0 )
|
||||
, ('misc.maxTraceLevel' , TypeInt , 0 )
|
||||
)
|
||||
|
||||
# Some ordinary Python script...
|
||||
import os
|
||||
|
||||
print ' o Cleaning up ClockTree previous run.'
|
||||
for fileName in os.listdir('.'):
|
||||
if fileName.endswith('.ap') or (fileName.find('_clocked.') >= 0):
|
||||
print ' - <%s>' % fileName
|
||||
os.unlink(fileName)
|
||||
|
||||
|
||||
See :ref:`Python Interface to Coriolis` for more details those capabilities.
|
|
@ -1,49 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-html(raw)
|
||||
:format: html
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: file:///usr/share/doc/coriolis2/index.html
|
||||
.. _Stratus Documentation: file:///usr/share/doc/coriolis2/en/html/stratus/index.html
|
||||
.. _Here: file:///usr/share/doc/coriolis2/en/latex/users-guide/UsersGuide.pdf
|
||||
|
||||
.. For HTML backend
|
||||
.. |rightarrow| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_P&R| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_StepByStep| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |menu_KiteSaveGlobalRouting| image:: ./images/PR-SBS-SaveGlobal.png
|
||||
.. |menu_KiteLoadGlobalRouting| image:: ./images/PR-SBS-LoadGlobal.png
|
||||
.. |menu_KiteGlobalRoute| image:: ./images/PR-GlobalRoute.png
|
||||
.. |menu_KiteDetailedRoute| image:: ./images/PR-DetailedRoute.png
|
||||
.. |menu_KiteDetailedPreRoute| image:: ./images/PR-DetailedPreRoute.png
|
||||
.. |menu_KiteFinalizeRoute| image:: ./images/PR-FinalizeRoute.png
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |ViewerSnapshot_1| replace:: :raw-html:`<center><img class="addborder" src="./images/Viewer-1.png" alt="Viewer Basic Snapshot"></center>`
|
||||
.. |ControllerSnapshot_1| replace:: :raw-html:`<center><img src="./images/Controller-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLook_1| replace:: :raw-html:`<center><img src="./images/Controller-Look-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerFilter_1| replace:: :raw-html:`<center><img src="./images/Controller-Filter-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerLayersGos_1| replace:: :raw-html:`<center><img src="./images/Controller-LayersGos-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerNetlist_1| replace:: :raw-html:`<center><img src="./images/Controller-Netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ViewerNetlist_1| replace:: :raw-html:`<center><img src="./images/Viewer-Netlist-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSelection_1| replace:: :raw-html:`<center><img src="./images/Controller-Selection-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_1| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_2| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-2.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerInspector_3| replace:: :raw-html:`<center><img src="./images/Controller-Inspector-3.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |ControllerSettings_1| replace:: :raw-html:`<center><img src="./images/Controller-Settings-1.png" alt="Controller Basic Snapshot"></center>`
|
||||
.. |CoriolisSoftSchema| replace:: :raw-html:`<center><img src="./images/Coriolis-Soft-Schema.png" alt="Coriolis Software Schematic"></center>`
|
||||
.. |ChipStructure-1| replace:: :raw-html:`<center><img src="./images/chip-structure-1.png" alt="Chip Top Structure"></center>`
|
||||
.. |Etesian-1| replace:: :raw-html:`<center><img src="./images/etesian-1.png" alt="Etesian Abutment Box"></center>`
|
||||
|
||||
.. |BigMouse| image:: ./images/ComputerMouse.png
|
||||
:scale: 25%
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-html:` `
|
||||
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
|
||||
.. |medskip| replace:: :raw-html:`<br>`
|
||||
.. |newpage| replace:: :raw-html:`<hr>`
|
||||
.. |br| replace:: :raw-html:`<br>`
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
.. note::
|
||||
As the sources are being released, the binary packaging is dropped.
|
||||
You still may find older version here: http://asim.lip6.fr/pub/coriolis/2.0 .
|
||||
|
||||
In a nutshell, building source consist in pulling the |git| repository then
|
||||
running the |ccb| installer.
|
||||
|
||||
Main building prerequisites:
|
||||
|
||||
* cmake
|
||||
* C++11-capable compiler
|
||||
* RapidJSON_
|
||||
* python2.7
|
||||
* boost
|
||||
* libxml2
|
||||
* bzip2
|
||||
* yacc & lex
|
||||
* Qt 4 or Qt 5
|
||||
|
||||
Building documentation prerequisites:
|
||||
|
||||
* doxygen
|
||||
* latex
|
||||
* latex2html
|
||||
* python-docutils (for reStructuredText)
|
||||
|
||||
Optional libraries:
|
||||
|
||||
* LEF/DEF (from `SI2 <https://www.si2.org/>`_)
|
||||
|
||||
For other distributions, refer to their own packaging system.
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Fixed Directory Tree
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In order to simplificate the work of the |ccb| installer, the source, build
|
||||
and installation tree is fixed. To successfully compile |Coriolis| you must
|
||||
follow it exactly. The tree is relative to the home directory of the user
|
||||
building it (noted :fboxtt:`~/` or :fboxtt:`$HOME/`). Only the source
|
||||
directory needs to be manually created by the user, all others will be
|
||||
automatically created either by |ccb| or the build system.
|
||||
|
||||
+--------------------------------------------------------------------------------------------------------------+
|
||||
| **Sources** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Sources root | | ~/coriolis-2.x/src |
|
||||
| | **under git** | | ~/coriolis-2.x/src/coriolis |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **Architecture Dependant Build** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Linux, SL 7, 64b | | ~/coriolis-2.x/Linux.el7_64/Release.Shared/build/<tool> |
|
||||
| | Linux, SL 6, 32b | | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/build/<tool> |
|
||||
| | Linux, SL 6, 64b | | ~/coriolis-2.x/Linux.slsoc6x_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 64b | | ~/coriolis-2.x/Linux.fc_64/Release.Shared/build/<tool> |
|
||||
| | Linux, Fedora, 32b | | ~/coriolis-2.x/Linux.fc/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 32b | | ~/coriolis-2.x/FreeBSD.8x.i386/Release.Shared/build/<tool> |
|
||||
| | FreeBSD 8, 64b | | ~/coriolis-2.x/FreeBSD.8x.amd64/Release.Shared/build/<tool> |
|
||||
| | Windows 7, 32b | | ~/coriolis-2.x/Cygwin.W7/Release.Shared/build/<tool> |
|
||||
| | Windows 7, 64b | | ~/coriolis-2.x/Cygwin.W7_64/Release.Shared/build/<tool> |
|
||||
| | Windows 8.x, 32b | | ~/coriolis-2.x/Cygwin.W8/Release.Shared/build/<tool> |
|
||||
| | Windows 8.x, 64b | | ~/coriolis-2.x/Cygwin.W8_64/Release.Shared/build/<tool> |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **Architecture Dependant Install** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| Linux, SL 6, 32b | ~/coriolis-2.x/Linux.slsoc6x/Release.Shared/install/ |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| **FHS Compliant Structure under Install** |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
| | Binaries | | .../install/bin |
|
||||
| | Libraries (Python) | | .../install/lib |
|
||||
| | Include by tool | | .../install/include/coriolis2/<project>/<tool> |
|
||||
| | Configuration files | | .../install/etc/coriolis2/ |
|
||||
| | Doc, by tool | | .../install/share/doc/coriolis2/en/html/<tool> |
|
||||
+------------------------------+-------------------------------------------------------------------------------+
|
||||
|
||||
.. note:: *Alternate build types:* the ``Release.Shared`` means an optimized build
|
||||
with shared libraries. But there are also available ``Static`` instead of ``Shared``
|
||||
and ``Debug`` instead of ``Release`` and any combination of them.
|
||||
|
||||
``Static`` do not work because I don't know yet to mix statically linked binaries
|
||||
and Python modules (which must be dynamic).
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Building Coriolis
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
First step is to install the prerequisites. Currently, only RapidJSON_.
|
||||
As RapidJSON is evolving fast, if you encounter compatibility problems,
|
||||
the exact version we compiled against is given below. ::
|
||||
|
||||
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src/support
|
||||
dummy@lepka:~$ cd ~/coriolis-2.x/src/support
|
||||
dummy@lepka:~$ git clone http://github.com/miloyip/rapidjson
|
||||
dummy@lepka:~$ git checkout ec322005072076ef53984462fb4a1075c27c7dfd
|
||||
|
||||
The second step is to create the source directory and pull the |git| repository: ::
|
||||
|
||||
dummy@lepka:~$ mkdir -p ~/coriolis-2.x/src
|
||||
dummy@lepka:~$ cd ~/coriolis-2.x/src
|
||||
dummy@lepka:~$ git clone https://www-soc.lip6.fr/git/coriolis.git
|
||||
|
||||
Third and final step, build & install: ::
|
||||
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=support \
|
||||
--project=coriolis \
|
||||
--make="-j4 install"
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=support \
|
||||
--project=coriolis \
|
||||
--doc --make="-j1 install"
|
||||
|
||||
We need to separate to perform a separate installation of the documentation because it
|
||||
do not support to be generated with a parallel build. So we compile & install in a first
|
||||
stage in ``-j4`` (or whatever) then we generate the documentation in ``-j1``
|
||||
|
||||
Under |RHEL6| or clones, you must build using the |devtoolset2|: ::
|
||||
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis \
|
||||
--devtoolset-2 --make="-j4 install"
|
||||
|
||||
If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument.
|
||||
|
||||
The complete list of |ccb| functionalities can be accessed with the ``--help`` argument.
|
||||
It also may be run in graphical mode (``--gui``).
|
||||
|
||||
|
||||
Building the Devel Branch
|
||||
-------------------------
|
||||
|
||||
In the |Coriolis| |git| repository, two branches are present:
|
||||
|
||||
* The :cb:`master` branch, which contains the latest stable version. This is the
|
||||
one used by default if you follow the above instructions.
|
||||
|
||||
* The :cb:`devel` branch, which obviously contains the latest commits from the
|
||||
development team. To use it instead of the :cb:`master` one, do the following
|
||||
command just after the first step: ::
|
||||
|
||||
dummy@lepka:~$ git checkout devel
|
||||
dummy@lepka:src$ ./bootstrap/ccb.py --project=coriolis \
|
||||
--make="-j4 install" --debug
|
||||
|
||||
Be aware that it may requires newer versions of the dependencies and may introduce
|
||||
incompatibilites with the stable version.
|
||||
|
||||
In the (unlikely) event of a crash of |cgt|, as it is a |Python| script, the right
|
||||
command to run |gdb| on it is: ::
|
||||
|
||||
dummy@lepka:work$ gdb python core.XXXX
|
||||
|
||||
|newpage|
|
||||
|
||||
|
||||
Additionnal Requirement under |MacOS|
|
||||
-------------------------------------
|
||||
|
||||
|Coriolis| make uses of the :cb:`boost::python` module, but the |macports| |boost|
|
||||
seems unable to work with the |Python| bundled with |MacOS|. So you have to install
|
||||
both of them from |macports|: ::
|
||||
|
||||
dummy@macos:~$ port install boost +python27
|
||||
dummy@macos:~$ port select python python27
|
||||
dummy@macos:-$ export DYLD_FRAMEWORK_PATH=/opt/local/Library/Frameworks
|
||||
|
||||
The last two lines tell |MacOS| to use the |Python| from |macports| and *not* from
|
||||
the system.
|
||||
|
||||
Then proceed with the generic install instructions.
|
||||
|
||||
|
||||
Packaging Coriolis
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Packager should not uses |ccb|, instead ``bootstrap/Makefile.package`` is provided
|
||||
to emulate a top-level ``autotool`` makefile. Just copy it in the root of the
|
||||
|Coriolis| git repository (``~/corriolis-2.x/src/coriolis/``) and build.
|
||||
|
||||
Sligthly outaded packaging configuration files can also be found under ``bootstrap/``:
|
||||
|
||||
* ``bootstrap/coriolis2.spec.in`` for |rpm| based distributions.
|
||||
* ``bootstrap/debian`` for |Debian| based distributions.
|
||||
|
||||
|
||||
Hooking up into |Alliance|
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|Coriolis| relies on |Alliance| for the cell libraries. So after installing or
|
||||
packaging, you must configure it so that it can found those libraries.
|
||||
|
||||
This is done by editing the one variable :cb:`cellsTop` in the |Alliance| helper
|
||||
(see :ref:`Alliance Helper`). This variable must point to the directory of the
|
||||
cells libraries. In a typical installation, this is generally
|
||||
:cb:`/usr/share/alliance/cells`.
|
||||
|
||||
|
||||
Setting up the Environment (coriolisEnv.py)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To simplify the tedious task of configuring your environment, a helper is provided
|
||||
in the ``bootstrap`` source directory (also installed in the directory
|
||||
``.../install/etc/coriolis2/``) : ::
|
||||
|
||||
~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py
|
||||
|
||||
Use it like this: ::
|
||||
|
||||
dummy@lepka:~> eval `~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`
|
||||
|
||||
.. note:: **Do not call that script in your environement initialisation.**
|
||||
When used under |RHEL6| or clones, it needs to be run in the |devtoolset2|
|
||||
environement. The script then launch a new shell, which may cause an
|
||||
infinite loop if it's called again in, say :cb:`~/.bashrc`.
|
||||
|
||||
Instead you may want to create an alias: ::
|
||||
|
||||
alias c2r='eval "`~/coriolis-2.x/src/coriolis/bootstrap/coriolisEnv.py`"'
|
|
@ -1,50 +0,0 @@
|
|||
|
||||
.. -*- Mode: rst -*-
|
||||
|
||||
.. role:: raw-latex(raw)
|
||||
:format: latex
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Coriolis Tools Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/
|
||||
.. _Stratus Documentation: https://www-soc.lip6.fr/sesi-docs/coriolis2-docs/coriolis2/en/html/stratus/index.html
|
||||
|
||||
.. |DONE| replace:: :raw-latex:`\marginpar{\fbox{\small\ding{56}}}`
|
||||
|
||||
.. For LaTeX/PDF backend.
|
||||
.. |rightarrow| replace:: :raw-latex:`$\rightarrow$`
|
||||
.. |menu_P&R| replace:: :raw-latex:`\fbox{\textsf{\textbf{{P\&R}}}}`
|
||||
.. |menu_StepByStep| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{S}tep by Step}}}}`
|
||||
.. |menu_KiteSaveGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{S}ave Global Routing}}}}`
|
||||
.. |menu_KiteLoadGlobalRouting| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{L}oad Global Routing}}}}`
|
||||
.. |menu_KiteGlobalRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{G}lobal Route}}}}`
|
||||
.. |menu_KiteDetailedRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Route}}}}`
|
||||
.. |menu_KiteDetailedPreRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{D}etailed Pre-Route}}}}`
|
||||
.. |menu_KiteFinalizeRoute| replace:: :raw-latex:`\fbox{\textsf{\textbf{{\underline{F}inalize Route}}}}`
|
||||
|
||||
.. Stand-alone images.
|
||||
.. |ViewerSnapshot_1| replace:: :raw-latex:`\begin{center}\fbox{\includegraphics[width=.7\textwidth]{./images/Viewer-1.eps}}\end{center}`
|
||||
.. |ControllerSnapshot_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-1.eps}\end{center}`
|
||||
.. |ControllerLook_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Look-1.eps}\end{center}`
|
||||
.. |ControllerFilter_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Filter-1.eps}\end{center}`
|
||||
.. |ControllerLayersGos_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-LayersGos-1.eps}\end{center}`
|
||||
.. |ControllerNetlist_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Netlist-1.eps}\end{center}`
|
||||
.. |ViewerNetlist_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Viewer-Netlist-1.eps}\end{center}`
|
||||
.. |ControllerSelection_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Selection-1.eps}\end{center}`
|
||||
.. |ControllerInspector_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-1.eps}\end{center}`
|
||||
.. |ControllerInspector_2| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-2.eps}\end{center}`
|
||||
.. |ControllerInspector_3| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Inspector-3.eps}\end{center}`
|
||||
.. |ControllerSettings_1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Controller-Settings-1.eps}\end{center}`
|
||||
.. |CoriolisSoftSchema| replace:: :raw-latex:`\begin{center}\includegraphics[width=.7\textwidth]{./images/Coriolis-Soft-Schema.eps}\end{center}`
|
||||
.. |ChipStructure-1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.95\textwidth]{./images/chip-structure-1.eps}\end{center}`
|
||||
.. |Etesian-1| replace:: :raw-latex:`\begin{center}\includegraphics[width=.95\textwidth]{./images/etesian-1.eps}\end{center}`
|
||||
|
||||
.. |BigMouse| image:: ./images/ComputerMouse.eps
|
||||
:scale: 25%
|
||||
|
||||
.. Direct LaTeX commands encapsulation.
|
||||
.. |dotfill| replace:: :raw-latex:`\dotfill`
|
||||
.. |noindent| replace:: :raw-latex:`\noindent`
|
||||
.. |medskip| replace:: :raw-latex:`\medskip`
|
||||
.. |newpage| replace:: :raw-latex:`\newpage`
|
||||
.. |br| replace:: :raw-latex:`\\`
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
Credits & License
|
||||
=================
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<p class="credit"><span class="left"><span class="sc">Hurricane</span></span>
|
||||
<span class="right">Rémy <span class="sc">Escassut</span> &
|
||||
Christian <span class="sc">Masson</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Etesian</span></span>
|
||||
<span class="right">Gabriel <span class="sc">Gouvine</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Stratus</span></span>
|
||||
<span class="right">Sophie <span class="sc">Belloeil</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Knik</span></span>
|
||||
<span class="right">Damien <span class="sc">Dupuis</span></span></p>
|
||||
<br>
|
||||
<p class="credit"><span class="left"><span class="sc">Kite</span>,
|
||||
<span class="sc">Unicorn</span></span></span>
|
||||
<span class="right">Jean-Paul <span class="sc">Chaput</span></span></p>
|
||||
<br>
|
||||
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\begin{center}\begin{minipage}[t]{.8\textwidth}
|
||||
\noindent\DUrole{sc}{Hurricane} \dotfill Rémy \DUrole{sc}{Escassut} \&
|
||||
Christian \DUrole{sc}{Masson} \\
|
||||
\noindent\DUrole{sc}{Etesian} \dotfill Gabriel \DUrole{sc}{Gouvine} \\
|
||||
\noindent\DUrole{sc}{Stratus} \dotfill Sophie \DUrole{sc}{Belloeil} \\
|
||||
\noindent\DUrole{sc}{Knik} \dotfill Damien \DUrole{sc}{Dupuis} \\
|
||||
\noindent\DUrole{sc}{Kite},
|
||||
\DUrole{sc}{Unicorn} \dotfill Jean-Paul \DUrole{sc}{Chaput} \\
|
||||
\end{minipage}\end{center}
|
||||
|
||||
|
||||
|medskip|
|
||||
|
||||
The |Hurricane| data-base is copyright© |Bull| 2000-2016 and is
|
||||
released under the terms of the |LGPL| license. All other tools are
|
||||
copyright© |UPMC| 2008-2016 and released under the |GPL|
|
||||
license.
|
||||
|
||||
Others important contributors to |Coriolis| are Christophe |Alexandre|,
|
||||
Hugo |Clement|, Marek |Sroka| and Wu |Yifei|.
|
||||
|
||||
The |Knik| router makes use of the |Flute| software, which is
|
||||
copyright© Chris C. N. |Chu| from the Iowa State University
|
||||
(http://home.eng.iastate.edu/~cnchu/).
|
|
@ -1,41 +0,0 @@
|
|||
div.codeblock { font-size: 90%;
|
||||
margin: 10pt;
|
||||
padding: 5pt;
|
||||
border: dashed;
|
||||
border-width: thin;
|
||||
background-color: #ffffcc;
|
||||
border-color: #fc8676;
|
||||
}
|
||||
.codeblock * .hll { background-color: #ffffcc }
|
||||
.codeblock * .c { color: #008000 } /* Comment */
|
||||
.codeblock * .err { border: 1px solid #FF0000 } /* Error */
|
||||
.codeblock * .k { color: #0000ff } /* Keyword */
|
||||
.codeblock * .cm { color: #008000 } /* Comment.Multiline */
|
||||
.codeblock * .cp { color: #0000ff } /* Comment.Preproc */
|
||||
.codeblock * .c1 { color: #008000 } /* Comment.Single */
|
||||
.codeblock * .cs { color: #008000 } /* Comment.Special */
|
||||
.codeblock * .ge { font-style: italic } /* Generic.Emph */
|
||||
.codeblock * .gh { font-weight: bold } /* Generic.Heading */
|
||||
.codeblock * .gp { font-weight: bold } /* Generic.Prompt */
|
||||
.codeblock * .gs { font-weight: bold } /* Generic.Strong */
|
||||
.codeblock * .gu { font-weight: bold } /* Generic.Subheading */
|
||||
.codeblock * .kc { color: #0000ff } /* Keyword.Constant */
|
||||
.codeblock * .kd { color: #0000ff } /* Keyword.Declaration */
|
||||
.codeblock * .kn { color: #0000ff } /* Keyword.Namespace */
|
||||
.codeblock * .kp { color: #0000ff } /* Keyword.Pseudo */
|
||||
.codeblock * .kr { color: #0000ff } /* Keyword.Reserved */
|
||||
.codeblock * .kt { color: #2b91af } /* Keyword.Type */
|
||||
.codeblock * .s { color: #a31515 } /* Literal.String */
|
||||
.codeblock * .nc { color: #2b91af } /* Name.Class */
|
||||
.codeblock * .ow { color: #0000ff } /* Operator.Word */
|
||||
.codeblock * .sb { color: #a31515 } /* Literal.String.Backtick */
|
||||
.codeblock * .sc { color: #a31515 } /* Literal.String.Char */
|
||||
.codeblock * .sd { color: #a31515 } /* Literal.String.Doc */
|
||||
.codeblock * .s2 { color: #a31515 } /* Literal.String.Double */
|
||||
.codeblock * .se { color: #a31515 } /* Literal.String.Escape */
|
||||
.codeblock * .sh { color: #a31515 } /* Literal.String.Heredoc */
|
||||
.codeblock * .si { color: #a31515 } /* Literal.String.Interpol */
|
||||
.codeblock * .sx { color: #a31515 } /* Literal.String.Other */
|
||||
.codeblock * .sr { color: #a31515 } /* Literal.String.Regex */
|
||||
.codeblock * .s1 { color: #a31515 } /* Literal.String.Single */
|
||||
.codeblock * .ss { color: #a31515 } /* Literal.String.Symbol */
|
|
@ -0,0 +1,102 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
|
||||
Release Notes
|
||||
=============
|
||||
|
||||
Release 1.0.1475
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
This is the first preliminary release of the |Coriolis2| framework.
|
||||
|
||||
This release mainly ships the global router |Knik| and the detailed router
|
||||
|Kite|. Together they aim to replace the |Alliance| |Nero| router.
|
||||
Unlike |Nero|, |Kite| is based on an innovating routing modeling and ad-hoc
|
||||
algorithm. Although it is released under |GPL| license, the source code
|
||||
will be avalaible later.
|
||||
|medskip|
|
||||
|
||||
|
||||
|noindent| Contents of this release:
|
||||
|
||||
1. A graphical user interface (viewer only).
|
||||
2. The |Knik| global router.
|
||||
3. The |Kite| detailed router.
|
||||
|
||||
|noindent| Supported input/output formats:
|
||||
|
||||
* |Alliance| |vst| (netlist) & |ap| (physical) formats.
|
||||
* Even if there are some references to the |Cadence| |LEFDEF| format, its
|
||||
support is not included because it depends on a library only available
|
||||
to |Si2| affiliated members.
|
||||
|
||||
|
||||
Release 1.0.1963
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Release 1963 is alpha. All the tools from |Coriolis1| have been ported into
|
||||
this release.
|
||||
|
||||
|noindent| Contents of this release:
|
||||
|
||||
#. The |Stratus| netlist capture language (|GenLib| replacement).
|
||||
#. The |Mauka| placer (still contains bugs).
|
||||
#. A graphical user interface (viewer only).
|
||||
#. The |Knik| global router.
|
||||
#. The |Kite| detailed router.
|
||||
#. Partially implemented python support for configuration files
|
||||
(alternative to |XML|).
|
||||
#. A documentation (imcomplete/obsoleted in |Hurricane|'s case).
|
||||
|
||||
|
||||
Release 1.0.2049
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Release `2049` is Alpha.
|
||||
|
||||
|noindent| Changes of this release:
|
||||
|
||||
#. The |Hurricane| documentation is now accurate. Documentation
|
||||
for the Cell viewer and |CRLcore| has been added.
|
||||
#. More extensive Python support for all the components of
|
||||
|Coriolis|.
|
||||
#. Configuration is now completly migrated under Python.
|
||||
|XML| loaders can still be useds for compatibilty.
|
||||
#. The |cgt| main has been rewritten in Python.
|
||||
|
||||
|
||||
Release v2.0.1
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
#. Migrated the repository from |svn| to |git|, and release complete sources.
|
||||
As a consequence, we drop the distribution packaging support and give
|
||||
public read-only access to the repository.
|
||||
#. Deep rewrite of the |Katabatic| database and |Kite| detailed router,
|
||||
achieve a speedup factor greater than 20...
|
||||
|
||||
|
||||
Release v2.1
|
||||
~~~~~~~~~~~~
|
||||
|
||||
#. Replace the old simulated annealing placer |Mauka| by the analytical placer
|
||||
|Etesian| and its legalization and detailed placement tools.
|
||||
#. Added a Blif format parser to process circuits generated by the Yosys and ABC
|
||||
logic synthetizers.
|
||||
#. The multiples user defined configuration files are now grouped under
|
||||
a common hidden (dot) directory ``.coriolis2`` and the file extension
|
||||
is back from ``.conf`` to ``.py``.
|
||||
|
||||
.. #. Under |RHEL7| / |SL7|, there is a known bug in the graphical visualizer.
|
||||
.. When shifting to the left, the right-half part of the screen gets
|
||||
.. badly redrawn. Uses |CTRL_L| to refresh. It will be corrected as soon
|
||||
.. as possible.
|
||||
|
||||
|
||||
**Release v2.2**
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
#. Added JSON import/export of the whole Hurricane DataBase. Two save mode
|
||||
are supported: *Cell* mode (standalone) or *Blob* mode, which dump the
|
||||
whole design down and including the standard cells.
|
|
@ -0,0 +1,332 @@
|
|||
.. -*- Mode: rst -*-
|
||||
|
||||
.. include:: ../etc/definitions.rst
|
||||
|
||||
.. URLs that changes between the various backends.
|
||||
.. _Stratus Documentation: file:///usr/share/doc/coriolis2/en/html/stratus/index.html
|
||||
|
||||
.. |ChipStructure-1| image:: ./images/chip-structure-1.png
|
||||
:alt: Chip Top Structure
|
||||
:align: middle
|
||||
:width: 90%
|
||||
|
||||
|
||||
.. _Python Interface to Coriolis:
|
||||
|
||||
Python Interface for |Hurricane| / |Coriolis|
|
||||
=============================================
|
||||
|
||||
The (almost) complete interface of |Hurricane| is exported as a |Python| module
|
||||
and some part of the other components of |Coriolis| (each one in a separate
|
||||
module). The interface has been made to mirror as closely as possible the
|
||||
C++ one, so the C++ doxygen documentation could be used to write code with
|
||||
either languages.
|
||||
|
||||
`Summary of the C++ Documentation <file:../../../index.html>`_
|
||||
|
||||
A script could be run directly in text mode from the command line or through
|
||||
the graphical interface (see :ref:`Python Scripts in Cgt`).
|
||||
|
||||
Asides for this requirement, the python script can contain anything valid
|
||||
in |Python|, so don't hesitate to use any package or extention.
|
||||
|
||||
Small example of Python/Stratus script: ::
|
||||
|
||||
from Hurricane import *
|
||||
from Stratus import *
|
||||
|
||||
def doSomething ():
|
||||
# ...
|
||||
return
|
||||
|
||||
def ScriptMain ( **kw ):
|
||||
editor = None
|
||||
if kw.has_key('editor') and kw['editor']:
|
||||
editor = kw['editor']
|
||||
stratus.setEditor( editor )
|
||||
|
||||
doSomething()
|
||||
return
|
||||
|
||||
if __name__ == "__main__" :
|
||||
kw = {}
|
||||
success = ScriptMain( **kw )
|
||||
shellSuccess = 0
|
||||
if not success: shellSuccess = 1
|
||||
|
||||
sys.exit( shellSuccess )
|
||||
ScriptMain ()
|
||||
|
||||
This typical script can be executed in two ways:
|
||||
|
||||
#. Run directly as a |Python| script, thanks to the ::
|
||||
|
||||
if __name__ == "__main__" :
|
||||
|
||||
part (this is standart |Python|). It is a simple adapter that will
|
||||
calls :cb:`ScriptMain()`.
|
||||
#. Through |cgt|, either in text or graphical mode. In that case, the
|
||||
:cb:`ScriptMain()` is directly called trough a sub-interpreter.
|
||||
The arguments of the script are passed through the ``**kw`` dictionnary.
|
||||
|
||||
+----------------------+-----------------------------------------------+
|
||||
| \*\*kw Dictionnary |
|
||||
+----------------------+-----------------------------------------------+
|
||||
| Parameter Key/Name | Contents type |
|
||||
+======================+===============================================+
|
||||
| ``'cell'`` | A Hurricane cell on which to work. Depending |
|
||||
| | on the context, it may be ``None``. |
|
||||
| | For example, when run from |cgt|, it the cell |
|
||||
| | currently loaded in the viewer, if any. |
|
||||
+----------------------+-----------------------------------------------+
|
||||
| ``'editor'`` | The viewer from which the script is run, when |
|
||||
| | lauched through |cgt|. |
|
||||
+----------------------+-----------------------------------------------+
|
||||
|
||||
|
||||
Plugins
|
||||
~~~~~~~
|
||||
|
||||
Plugins are |Python| scripts specially crafted to integrate with |cgt|.
|
||||
Their entry point is a :cb:`ScriptMain()` method as described in
|
||||
`Python Interface to Coriolis`_. They can be called by user scripts
|
||||
through this method.
|
||||
|
||||
|
||||
|
||||
Chip Placement
|
||||
--------------
|
||||
|
||||
Automatically perform the placement of a complete chip. This plugin, as well
|
||||
as the other P&R tools expect a specific top-level hierarchy for the design.
|
||||
The top-level hierarchy must contains the instances of all the I/O pads and
|
||||
**exactly one** instance of the chip's core model.
|
||||
|
||||
|bcenter| |ChipStructure-1| |ecenter|
|
||||
|
||||
The designer must provide a configuration file that define the rules for the
|
||||
placement of the top-level hierarchy (that is, the pads and the core).
|
||||
This file must be named after the chip's name, by appending ``_chip.py``
|
||||
(obviously, it is a |Python| file). For instance if the chip netlist file
|
||||
is called ``amd2901_crl.vst``, then the configuration file must be named
|
||||
``amd2901_crl_chip.vst``.
|
||||
|
||||
Example of chip placement configuration file (for ``AM2901``): ::
|
||||
|
||||
chip = \
|
||||
{ 'pads.south' : [ 'p_a3' , 'p_a2' , 'p_a1' , 'p_r0'
|
||||
, 'p_vddick0', 'p_vssick0', 'p_a0' , 'p_i6'
|
||||
, 'p_i8' , 'p_i7' , 'p_r3' ]
|
||||
, 'pads.east' : [ 'p_zero' , 'p_i0' , 'p_i1' , 'p_i2'
|
||||
, 'p_vddeck0', 'p_vsseck0', 'p_q3' , 'p_b0'
|
||||
, 'p_b1' , 'p_b2' , 'p_b3' ]
|
||||
, 'pads.north' : [ 'p_noe' , 'p_y3' , 'p_y2' , 'p_y1'
|
||||
, 'p_y0' , 'p_vddeck1', 'p_vsseck1', 'p_np'
|
||||
, 'p_ovr' , 'p_cout' , 'p_ng' ]
|
||||
, 'pads.west' : [ 'p_cin' , 'p_i4' , 'p_i5' , 'p_i3'
|
||||
, 'p_ck' , 'p_d0' , 'p_d1' , 'p_d2'
|
||||
, 'p_d3' , 'p_q0' , 'p_f3' ]
|
||||
, 'core.size' : ( 1500, 1500 )
|
||||
, 'chip.size' : ( 3000, 3000 )
|
||||
, 'chip.clockTree' : True
|
||||
}
|
||||
|
||||
The file must contain *one dictionnary* named ``chip``.
|
||||
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| Chip Dictionnary |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| Parameter Key/Name | Value/Contents type |
|
||||
+======================+=======================================================+
|
||||
| ``'pad.south'`` | Ordered list (left to right) of pad instances names |
|
||||
| | to put on the south side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.east'`` | Ordered list (down to up) of pad instances names |
|
||||
| | to put on the east side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.north'`` | Ordered list (left to right) of pad instances names |
|
||||
| | to put on the north side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'pad.west'`` | Ordered list (down to up) of pad instances names |
|
||||
| | to put on the west side of the chip |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'core.size'`` | The size of the core (to be used by the placer) |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'chip.size'`` | The size of the whole chip. The sides must be great |
|
||||
| | enough to accomodate all the pads |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
| ``'chip.clockTree'`` | Whether to generate a clock tree or not. This calls |
|
||||
| | the ClockTree plugin |
|
||||
+----------------------+-------------------------------------------------------+
|
||||
|
||||
Configuration parameters, defaults are defined in ``etc/coriolis2/<STECHNO>/plugins.conf``.
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **Chip Plugin Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.count`` | TypeInt | :cb:`5` |
|
||||
| +------------------+----------------------------+
|
||||
| | The minimum number of rails around the core |
|
||||
| | block. Must be odd and suppérior to 5. |
|
||||
| | One rail for the clock and at least two pairs |
|
||||
| | of power/grounds |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.hWidth`` | TypeInt | :cb:`12` |
|
||||
| +------------------+----------------------------+
|
||||
| | The horizontal with of the rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.vWidth`` | TypeInt | :cb:`12` |
|
||||
| +------------------+----------------------------+
|
||||
| | The vertical with of the rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.hSpacing`` | TypeInt | :cb:`6` |
|
||||
| +------------------+----------------------------+
|
||||
| | The spacing, *edge to edge* of two adjacent |
|
||||
| | horizontal rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.block.rails.vSpacing`` | TypeInt | :cb:`6` |
|
||||
| +------------------+----------------------------+
|
||||
| | The spacing, *edge to edge* of two adjacent |
|
||||
| | vertical rails |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pck`` | TypeString | :cb:`pck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | chip external clock |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvddeck`` | TypeString | :cb:`pvddeck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vdde`` (external power) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvsseck`` | TypeString | :cb:`pvsseck_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vsse`` (external ground) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvddick`` | TypeString | :cb:`pvddick_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vddi`` (internal power) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``chip.pad.pvssick`` | TypeString | :cb:`pvssick_px` |
|
||||
| +------------------+----------------------------+
|
||||
| | The model name of the pad connected to the |
|
||||
| | ``vssi`` (internal ground) and suppling it to |
|
||||
| | the core |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|
||||
.. note::
|
||||
If no clock tree is generated, then the clock rail is *not* created.
|
||||
So even if the requested number of rails ``chip.block.rails.count`` is, say 5,
|
||||
only four rails (2* ``power``, 2* ``ground``) will be generateds.
|
||||
|
||||
|
||||
Clock Tree
|
||||
----------
|
||||
|
||||
Insert a clock tree into a block. The clock tree uses the H strategy.
|
||||
The clock net is splitted into sub-nets, one for each branch of the
|
||||
tree.
|
||||
|
||||
* On **chips** design, the sub-nets are createds in the model of the
|
||||
core block (then trans-hierarchically flattened to be shown at
|
||||
chip level).
|
||||
* On **blocks**, the sub nets are created directly in the top block.
|
||||
* The sub-nets are named according to a simple geometrical scheme.
|
||||
A common prefix ``ck_htree``, then one postfix by level telling
|
||||
on which quarter of plane the sub-clock is located:
|
||||
|
||||
#. ``_bl``: bottom left plane quarter.
|
||||
#. ``_br``: bottom right plane quarter.
|
||||
#. ``_tl``: top left plane quarter.
|
||||
#. ``_tr``: top right plane quarter.
|
||||
|
||||
We can have ``ck_htree_bl``, ``ck_htree_bl_bl``, ``ch_htree_bl_tl`` and so on.
|
||||
|
||||
The clock tree plugin works in four steps:
|
||||
|
||||
#. Build the clock tree: creates the top-block abutment box, compute the
|
||||
levels of H tree neededs and place the clock buffers.
|
||||
#. Once the clock buffers are placed, calls the placer (|etesian|) to place
|
||||
the ordinary standart cells, whithout disturbing clock H-tree buffers.
|
||||
#. At this point we know the exact positions of all the DFFs, so we can
|
||||
connect them to the nearest H-tree leaf clock signal.
|
||||
#. Leaf clock signals that are not connecteds to any DFFs are removed.
|
||||
|
||||
Netlist reorganisation:
|
||||
|
||||
* Obviously the top block or chip core model netlist is modificated to
|
||||
contains all the clock sub-nets. The interface is *not* changed.
|
||||
* If the top block contains instances of other models *and* those models
|
||||
contains DFFs that get re-connecteds to the clock sub-nets (from the
|
||||
top level). Change both the model netlist and interface to propagate
|
||||
the relevant clock sub-nets to the instanciated model. The new model
|
||||
with the added clock signal is renamed with a ``_clocked`` suffix.
|
||||
For example, the sub-block model ``ram.vst`` will become ``ram_clocked.vst``.
|
||||
|
||||
.. note::
|
||||
If you are to re-run the clock tree plugin on a netlist, be careful
|
||||
to erase any previously generated ``_clocked`` file (both netlist and
|
||||
layout: ``rm *.clocked.{ap,vst}``). And restart |cgt| to clear it's
|
||||
memory cache.
|
||||
|
||||
Configuration parameters, defaults are defined in ``etc/coriolis2/<STECHNO>/plugins.conf``.
|
||||
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
| Parameter Identifier | Type | Default |
|
||||
+===================================+==================+============================+
|
||||
| **ClockTree Plugin Parameters** |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.minimumSide`` | TypeInt | :cb:`300` |
|
||||
| +------------------+----------------------------+
|
||||
| | The minimum size below which the clock tree |
|
||||
| | will stop to perform quadri-partitions |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.buffer`` | TypeString | :cb:`buf_x2` |
|
||||
| +------------------+----------------------------+
|
||||
| | The buffer model to use to drive sub-nets |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|``clockTree.placerEngine`` | TypeString | :cb:`Etesian` |
|
||||
| +------------------+----------------------------+
|
||||
| | The placer to use. Other value is ``Mauka`` |
|
||||
| | the simulated annealing placer which will go |
|
||||
| | into retirement very soon |
|
||||
+-----------------------------------+------------------+----------------------------+
|
||||
|
||||
|
||||
Recursive-Save (RSave)
|
||||
----------------------
|
||||
|
||||
Perform a recursive top down save of all the models from the top cell
|
||||
loaded in |cgt|. Force a write of any non-terminal model. This plugin is used
|
||||
by the clock tree plugin after the netlist clock sub-nets creation.
|
||||
|
||||
|
||||
A Simple Example: AM2901
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
To illustrate the capabilities of |Coriolis| tools and |Python| scripting, a small
|
||||
example, derived from the |Alliance| :cb:`AM2901` is supplied.
|
||||
|
||||
This example contains only the synthetized netlists and the :cb:`doChip.py` script
|
||||
which perform the whole P&R of the design.
|
||||
|
||||
You can generate the chip using one of the following method:
|
||||
|
||||
#. **Command line mode:** directly run the script: ::
|
||||
|
||||
dummy@lepka:AM2901$ ./doChip -V --cell=amd2901
|
||||
|
||||
#. **Graphic mode:** launch |cgt|, load chip netlist ``amd2901`` (the top cell)
|
||||
then run the |Python| script :cb:`doChip.py`.
|
||||
|
||||
.. note::
|
||||
Between two consecutive run, be sure to erase the netlist/layout generateds: ::
|
||||
|
||||
dummy@lepka:AM2901$ rm *_clocked*.vst *.ap
|
|
@ -1,796 +0,0 @@
|
|||
|
||||
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 96%;
|
||||
font-family: "Open Sans", verdana, sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
color: black;
|
||||
background: white;
|
||||
/*
|
||||
background: #09550B;
|
||||
background-color: white;
|
||||
*/
|
||||
background-position: top left;
|
||||
background-attachment: fixed;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 0 0 0;
|
||||
padding: 20pt;
|
||||
width: 550pt;
|
||||
margin-right: 10%;
|
||||
margin-left: 30%;
|
||||
-moz-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
-webkit-box-shadow: 4px 4px 5px 3px #ccc;
|
||||
box-shadow: 4px 4px 5px 3px #ccc;
|
||||
}
|
||||
|
||||
body.gsummary {
|
||||
margin-right: 10%;
|
||||
margin-left: 10%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 { font-family: "Open Sans", verdana, sans-serif; }
|
||||
h1 { text-align: center;
|
||||
border-top: 2px solid #09550b;
|
||||
border-bottom: 2px solid #09550b;
|
||||
padding-top: 7pt;
|
||||
padding-bottom: 7pt;
|
||||
}
|
||||
h2, h3, h4, h5, h6 { text-align: left; }
|
||||
h1, h2, h3 { font-family: "Open Sans";
|
||||
}
|
||||
h1 { font-weight: normal; font-size: 170%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h2 { font-weight: normal; font-size: 140%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h3 { font-weight: bold; font-size: 118%; padding-top: 7pt; margin-top: 25pt; }
|
||||
h4 { font-weight: bold; font-size: 100%; }
|
||||
h5 { font-style: italic; font-size: 100%; }
|
||||
h6 { font-variant: small-caps; font-size: 100%; }
|
||||
|
||||
body.gsummary h1 { text-align: center; font-size: 220%; }
|
||||
|
||||
h1 a:link { border-bottom: 0px; }
|
||||
|
||||
|
||||
hr {
|
||||
color: #09550b;
|
||||
border: 1px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
padding-top: 10pt;
|
||||
padding-bottom: 10pt;
|
||||
}
|
||||
|
||||
div#contents {
|
||||
margin: 30pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: #fff676;
|
||||
}
|
||||
|
||||
div#centered {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p, li {
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
.sc {
|
||||
font-variant: small-caps;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
pre, tt, code {
|
||||
font-family: "courrier", "andale mono", monospace;
|
||||
font-size: 100%;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
tt {
|
||||
color: #09550b;
|
||||
}
|
||||
|
||||
pre.wiki, div.code, pre.literal-block {
|
||||
font-size: 90%;
|
||||
padding: 5pt;
|
||||
margin-left: 4%;
|
||||
margin-right: 4%;
|
||||
border: dashed;
|
||||
border-width: thin;
|
||||
border-color: #FC8676;
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
a:link, a:active {
|
||||
font-weight: normal;
|
||||
text-decoration: none;
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
a:hover, a:focus, a:visited {
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
border-bottom: 1px dotted #09550b;
|
||||
}
|
||||
|
||||
body.gsummary a:link, a:active {
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
color: #09550b;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted #09550b;
|
||||
*/
|
||||
}
|
||||
|
||||
body.gsummary a:hover, a:focus, a:visited {
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
text-decoration: none;
|
||||
/*
|
||||
color: #A40010;
|
||||
border-bottom: 1px dotted #A40010;
|
||||
*/
|
||||
color: #09550b;
|
||||
/*
|
||||
border-bottom: 1px dotted #09550b;
|
||||
*/
|
||||
}
|
||||
|
||||
p.credit {
|
||||
margin-left: 10%;
|
||||
margin-right: 10%;
|
||||
font-size: 110%;
|
||||
}
|
||||
|
||||
p.credit span.left {
|
||||
float: left;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
p.credit span.right {
|
||||
float: right;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
img.addborder {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
div#header {
|
||||
margin: 0px;
|
||||
padding: 0pt;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div#header_logo {
|
||||
margin: 0px;
|
||||
padding: 10px 0px 10px 12pt;
|
||||
background-color: white;
|
||||
width: 40%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
div#header_menus {
|
||||
background-color: white;
|
||||
width: 55%;
|
||||
float: right;
|
||||
padding-top: 60pt;
|
||||
padding-right: 10pt;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus ul {
|
||||
padding-top: 45pt;
|
||||
list-style: none;
|
||||
text-align: right;
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
div#header_menus li {
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
display: inline;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
/*
|
||||
div#header_menus a {
|
||||
border-left: 1px solid #d7d7d7;
|
||||
padding: 0 .75em;
|
||||
}
|
||||
|
||||
div#header_menus a.first {
|
||||
border-left: none;
|
||||
}
|
||||
*/
|
||||
|
||||
div#header a:link, div#header a:active, div#header a:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px solid black;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a:hover, div#header a:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: normal;
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
div#header a.current:link, div#header a.current:active, div#header a.current:visited {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header a.current:hover, div#header a.current:focus {
|
||||
margin: 0pt;
|
||||
padding: 0pt 5pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
font-size: 120%;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 4px solid #09550b;
|
||||
border-left: 0px;
|
||||
border-right: 0px;
|
||||
background-color: #09550b;
|
||||
}
|
||||
|
||||
div#header_ancestors {
|
||||
padding: 4px 0px 4px 12pt;
|
||||
background-color: #09550B;
|
||||
color: white;
|
||||
}
|
||||
|
||||
div#header_ancestors ul, div#header_ancestors * li {
|
||||
display: inline;
|
||||
list-style-type: none;
|
||||
padding: 0px 0px 0px 0pt;
|
||||
}
|
||||
|
||||
div#header_ancestors a:link, div#header_ancestors a:active, div#header_ancestors a:visited {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
div#header_ancestors a:hover, div#header_ancestors a:focus {
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
div#footer {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-top: 1px dotted #09550b;
|
||||
background-color: white;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div#searchform {
|
||||
width: 80%;
|
||||
background-color: #ccffcd;
|
||||
padding: 15pt 10pt 15pt 10pt;
|
||||
margin-top: 50pt;
|
||||
margin-bottom: 50pt;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
div#searchform input#id_q {
|
||||
background-color: white;
|
||||
border: 1px solid #09550b;
|
||||
padding: 2pt;
|
||||
width: 80%;
|
||||
font-size: 110%;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.queryref {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div#searchform ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div#searchform li {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
hr#search_vs_results {
|
||||
color: #09550b;
|
||||
border: 2px dotted #09550b;
|
||||
border-style: none none dotted;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#search_results {
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
div#sidebar hr#separator {
|
||||
color: white;
|
||||
border: 0px;
|
||||
margin-top: 0pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
img.footer-logo {
|
||||
height: 24px;
|
||||
padding: 0px 2px;
|
||||
}
|
||||
|
||||
hr#site_vs_page {
|
||||
color: white;
|
||||
border: 3px dotted white;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 20pt;
|
||||
}
|
||||
|
||||
div#sidebar {
|
||||
/*
|
||||
background: #09550B;
|
||||
background: #ccffcd;
|
||||
*/
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#sidebar div#sitemenu, div#sidebar div#pagemenu {
|
||||
/*
|
||||
background: white;
|
||||
*/
|
||||
background: #09550b;
|
||||
width: 85%;
|
||||
margin: auto;
|
||||
padding: 5pt 10pt;
|
||||
}
|
||||
|
||||
div#sidebar * li {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div#sidebar * ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul ul {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sitemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:link,
|
||||
div#sitemenu ul li a:active,
|
||||
div#sitemenu ul lu a:visited
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul li a:focus,
|
||||
div#sitemenu ul lu a:hover
|
||||
{
|
||||
font-size: 140%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#sitemenu ul ul li a:link,
|
||||
div#sitemenu ul ul li a:active,
|
||||
div#sitemenu ul ul lu a:visited,
|
||||
div#sitemenu ul ul li a:focus,
|
||||
div#sitemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*border-bottom: 1px dotted white;*/
|
||||
}
|
||||
|
||||
div#pagemenu ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul {
|
||||
list-style-type: none;
|
||||
padding-left: 0pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul ul {
|
||||
padding-left: 12pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li {
|
||||
padding-top: 3pt;
|
||||
padding-bottom: 5pt;
|
||||
border-top: 1px dotted white;
|
||||
}
|
||||
|
||||
div#pagemenu ul li ul li ul li {
|
||||
border-top: none;
|
||||
padding-top: 1pt;
|
||||
padding-bottom: 1pt;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:link,
|
||||
div#pagemenu ul li a:active,
|
||||
div#pagemenu ul lu a:visited
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul li a:focus,
|
||||
div#pagemenu ul lu a:hover
|
||||
{
|
||||
font-size: 120%;
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
div#pagemenu ul ul li a:link,
|
||||
div#pagemenu ul ul li a:active,
|
||||
div#pagemenu ul ul lu a:visited,
|
||||
div#pagemenu ul ul li a:focus,
|
||||
div#pagemenu ul ul lu a:hover
|
||||
{
|
||||
font-size: 90%;
|
||||
font-weight: normal;
|
||||
border-bottom: none;
|
||||
/*
|
||||
border-bottom: 1px dotted white;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
div#sidebar ul.ancestor * li {
|
||||
padding-top: 0pt;
|
||||
}
|
||||
|
||||
div#sidebar ul {
|
||||
padding-bottom: 8pt;
|
||||
}
|
||||
|
||||
div#sidebar a:link, div#sidebar a:active, div#sidebar a:visited {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#sidebar a:hover, div#sidebar a:focus {
|
||||
/*
|
||||
font-weight: normal;
|
||||
*/
|
||||
color: white;
|
||||
text-align: left;
|
||||
text-decoration: none;
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
div#main {
|
||||
border-left: 1px solid #09550b;
|
||||
}
|
||||
|
||||
div#main ul#summary {
|
||||
list-style-type: square;
|
||||
padding-left: 12pt;
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
div#main ul#summary * ul {
|
||||
padding-left: 12pt;
|
||||
padding-bottom: 14pt;
|
||||
font-size: 95%;
|
||||
}
|
||||
|
||||
div.code * {
|
||||
background-color: #FCFCE1;
|
||||
}
|
||||
|
||||
div.note {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #fff01c;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #fff676 url('./images/clipboard.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
div.error {
|
||||
margin: 8px 2% 0px 2%;
|
||||
border: 1px none #dd0000;
|
||||
border-left-width: 4px;
|
||||
border-left-style: solid;
|
||||
padding: 1px 10pt 1px 55px;
|
||||
background: #ffddcc url('./images/i-core.png') no-repeat 0% 50%;;
|
||||
font-size: 90%
|
||||
}
|
||||
|
||||
p.admonition-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.topic {
|
||||
margin: 5pt;
|
||||
padding: 2pt 10pt;
|
||||
background-color: fff676;
|
||||
}
|
||||
|
||||
div.topic p.first {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
body.gsummary table {
|
||||
border-collapse: collapse;
|
||||
border-color: transparent;
|
||||
width: 60%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
body.gsummary table th {
|
||||
}
|
||||
*/
|
||||
|
||||
body.gsummary table td {
|
||||
border: none;
|
||||
}
|
||||
|
||||
/*
|
||||
body.gsummary table tr td ul {
|
||||
margin: 0pt;
|
||||
border-left: 1px solid black;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
body.gsummary table tr td ul li {
|
||||
border-bottom: 2px dotted black;
|
||||
}
|
||||
*/
|
||||
|
||||
body.gsummary li {
|
||||
padding: 0%;
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
body.gsummary ul {
|
||||
padding: 0px 0px 10px 0px;
|
||||
margin: 0%;
|
||||
border-bottom: 1px dotted black;
|
||||
}
|
||||
|
||||
table.wiki th, table th {
|
||||
color: black;
|
||||
background: #FFFFCC;
|
||||
}
|
||||
|
||||
table.docutils {
|
||||
margin-left: 5%;
|
||||
margin-right: 5%;
|
||||
}
|
||||
|
||||
table.wiki, table.wiki th, table.wiki td { border: 1px solid black; }
|
||||
table.wiki th * p { text-align: center; }
|
||||
table.wiki * p { margin: 0pt; }
|
||||
table.wiki * blockquote { margin: 0pt; }
|
||||
table { border-collapse: collapse; }
|
||||
table th, table td { border: 1px solid black;
|
||||
padding: 2px 10px 2px 10px; }
|
||||
|
||||
table.docinfo {
|
||||
margin-top: 10pt;
|
||||
margin-left: auto;
|
||||
margin-right: 0pt;
|
||||
border: 10px solid #303030;
|
||||
border-collapse: collapse;
|
||||
background: #303030;
|
||||
font-size: 90%;
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
table.docinfo tr {
|
||||
border-bottom: 1px dotted white;
|
||||
}
|
||||
|
||||
th.docinfo-name,
|
||||
table.docinfo td,
|
||||
table.docinfo td a:link,
|
||||
table.docinfo td a:active,
|
||||
table.docinfo td a:visited,
|
||||
table.docinfo td a:focus,
|
||||
table.docinfo td a:hover
|
||||
{
|
||||
border: 0px solid white;
|
||||
background: #303030;
|
||||
color: white;
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
th.docinfo-name {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
table.docinfo td {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
span.ul {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
* span.smallcaps {
|
||||
/*font-variant: "small-caps";*/
|
||||
text-transform: "uppercase";
|
||||
font-size: "smaller";
|
||||
}
|
||||
|
||||
|
||||
span.cb {
|
||||
font-family: "andale mono", monospace;
|
||||
font-weight: bold;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
span.fboxtt {
|
||||
border: 1px solid black;
|
||||
padding: 0px 4px;
|
||||
font-family: "andale mono", monospace;
|
||||
font-weight: bold;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
#notice.system-message, .notice.system-message {
|
||||
color: black;
|
||||
background: #DDFFDD;
|
||||
padding-top: 5pt;
|
||||
padding-bottom: 5pt;
|
||||
border: 1px none #55BB55;
|
||||
border-top-width: 4px;
|
||||
border-top-style: solid;
|
||||
}
|
||||
|
||||
#content.error .message, div.system-message {
|
||||
color: #550000;
|
||||
background: #ffddcc;
|
||||
border: 2px none #dd0000;
|
||||
border-top-width: 4px;
|
||||
border-top-style: solid;
|
||||
padding: .5em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
#main {
|
||||
float: right;
|
||||
width: 70%;
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
min-height: 700px;
|
||||
background: white;
|
||||
}
|
||||
|
||||
div#main h1 {
|
||||
border-bottom: 2px solid #09550b;
|
||||
}
|
||||
|
||||
div#main div.section h1 {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
#cmscontent {
|
||||
padding: 0pt 4% 10pt 4%;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents {
|
||||
padding: 10pt 4% 10pt 4%;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents span.cs {
|
||||
font-size: 80%;
|
||||
font-family: "andale mono", monospace;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
div#htmlerrorcontents hr.lang_separator {
|
||||
border: 1px dotted black;
|
||||
border-style: none none dotted;
|
||||
margin-top: 20pt;
|
||||
margin-bottom: 10pt;
|
||||
}
|
||||
|
||||
#embedcontent {
|
||||
border: 0pt;
|
||||
padding: 0pt;
|
||||
margin: 0pt;
|
||||
}
|
||||
|
||||
#sidebar {
|
||||
float: left;
|
||||
width: 29.9%;
|
||||
padding: 0 0 0 0;
|
||||
margin: 0 0 0 0;
|
||||
color: white;
|
||||
background: #09550B;
|
||||
/*
|
||||
min-height: 300px;
|
||||
background: #f2f2f2;
|
||||
border-right: 1px solid #ccc;
|
||||
padding: 0 0 0 10px;
|
||||
*/
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue