Merge branch 'devel_anabatic' into devel_stratus

This commit is contained in:
Roselyne Chotin-Avot 2017-08-02 14:56:43 +02:00
commit a9a006a161
461 changed files with 44920 additions and 14017 deletions

View File

@ -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"
)))))

2
.gitignore vendored
View File

@ -8,6 +8,8 @@ TAGS
GTAGS
GPATH
GRTAGS
dir-locals.el
.projectile
man/

View File

@ -1,6 +0,0 @@
-*.fig
-*.png
-*.eps
-*.pdf
-*.aux
-*.bb

View File

@ -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

View File

@ -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)

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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 );

View File

@ -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))
{ }

View File

@ -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;

View File

@ -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)

View File

@ -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

View File

@ -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"

View File

@ -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); }

View File

@ -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;

View File

@ -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" );

View File

@ -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();

View File

@ -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 );
}
}
}

View File

@ -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; }

View File

@ -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; }

View File

@ -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; }

View File

@ -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.

View File

@ -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;

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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() );
}

View File

@ -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)
{}

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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.

View File

@ -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

View File

@ -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); }

View File

@ -7,6 +7,7 @@
FindLibexecinfo.cmake
FindLibbfd.cmake
FindQwt.cmake
FindSphinx.cmake
GetGitRevisionDescription.cmake
GetGitRevisionDescription.cmake.in
)

View File

@ -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 )

View File

@ -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)

View File

@ -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)

View File

@ -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 {

View File

@ -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 })
)
# ----------------------------------------------------------------------

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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 )

View File

@ -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

View File

@ -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>`_

View File

@ -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>`_

View File

@ -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>`_

View File

@ -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**.

View File

@ -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]`).

153
documentation/Makefile Normal file
View File

@ -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."

View File

@ -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>`_

View File

@ -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.
)

View File

@ -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.
}

View File

@ -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' )

View File

@ -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());
}

View File

@ -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 );
}

View File

@ -0,0 +1,9 @@
.. -*- Mode: rst -*-
.. include:: ../etc/definitions.rst
7. No C++ Hurricane::Name encapsulation
==========================================
To be written.

View File

@ -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.

View File

@ -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

View File

@ -0,0 +1,15 @@
.. -*- Mode: rst -*-
.. include:: ../etc/definitions.rst
===================================
Hurricane Python/C++ API Tutorial
===================================
|pagestylefancy|
.. contents::
|newpage|

View File

@ -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:`&nbsp;&nbsp;`
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
.. |medskip| replace:: :raw-html:`<br>`
.. |newpage| replace:: :raw-html:`<br>`

View File

@ -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

BIN
documentation/RDS/RDS.pdf Normal file

Binary file not shown.

View File

@ -1,5 +0,0 @@
.. -*- Mode: rst -*-
.. include:: HTML_defs.rst
.. include:: RDS.rst

View File

@ -1,4 +0,0 @@
.. -*- Mode: rst -*-
.. include:: LaTeX_defs.rst
.. include:: RDS.rst

View File

@ -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
~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -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;
*/
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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|

View File

@ -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}

View File

@ -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>`_

View File

@ -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>`_

View File

@ -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} )

View File

@ -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.

View File

@ -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:`&nbsp;&nbsp;`
.. |noindent| replace:: :raw-html:`<p class="empty"></p>`
.. |medskip| replace:: :raw-html:`<br>`
.. |newpage| replace:: :raw-html:`<hr>`
.. |br| replace:: :raw-html:`<br>`

View File

@ -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`"'

View File

@ -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:`\\`

View File

@ -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> &amp;
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/).

View File

@ -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 */

View File

@ -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.

View File

@ -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

View File

@ -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