diff --git a/Makefile b/Makefile index 8ccdbbb5..c03bfee1 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,16 @@ - UNAME_S = $(shell uname -s) - UNAME_R = $(shell uname -r) + UNAME_S = $(shell uname -s) + UNAME_R = $(shell uname -r) + DEVTOOLSET_VERSION = 7 -# We must use devtoolset-2 only under RHEL6 & clones. +# We must use devtoolset only under RHEL6 & clones. DEVTOOLSET_OPTION = ifeq ($(UNAME_S),Linux) - ifneq ($(findstring .el6.,$(UNAME_R)),) - DEVTOOLSET_OPTION = --devtoolset-2 + ifneq ($(findstring .el7.,$(UNAME_R)),) + DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION) endif ifneq ($(findstring .slsoc6.,$(UNAME_R)),) - DEVTOOLSET_OPTION = --devtoolset-2 + DEVTOOLSET_OPTION = --devtoolset=$(DEVTOOLSET_VERSION) endif endif diff --git a/anabatic/CMakeLists.txt b/anabatic/CMakeLists.txt index 43651e8e..ce2e393b 100644 --- a/anabatic/CMakeLists.txt +++ b/anabatic/CMakeLists.txt @@ -20,6 +20,7 @@ find_package(PythonLibs 2 REQUIRED) find_package(PythonSitePackages REQUIRED) + find_package(FLUTE REQUIRED) find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index f835cc86..f56c29ec 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -504,6 +504,24 @@ namespace Anabatic { } + void AnabaticEngine::exclude ( const Name& netName ) + { + Net* net = _cell->getNet( netName ); + if (not net) return; + + exclude( net ); + } + + + void AnabaticEngine::exclude ( Net* net ) + { + NetDatas::iterator inet =_netDatas.find( net->getId() ); + if (inet == _netDatas.end()) return; + + (*inet).second->setExcluded( true ); + } + + void AnabaticEngine::updateMatrix() { _matrix.setCell( getCell(), Session::getSliceHeight() ); @@ -1028,7 +1046,7 @@ namespace Anabatic { void AnabaticEngine::updateNetTopology ( Net* net ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(149,0) << "Anabatic::updateNetTopology( " << net << " )" << endl; cdebug_tabw(145,1); @@ -1069,7 +1087,7 @@ namespace Anabatic { void AnabaticEngine::_alignate ( Net* net ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(149,0) << "Anabatic::_alignate( " << net << " )" << endl; cdebug_tabw(145,1); @@ -1127,7 +1145,7 @@ namespace Anabatic { void AnabaticEngine::_computeNetTerminals ( Net* net ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(149,0) << "Anabatic::_computeNetTerminals( " << net << " )" << endl; cdebug_tabw(145,1); @@ -1146,7 +1164,7 @@ namespace Anabatic { void AnabaticEngine::_saveNet ( Net* net ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(145,0) << "Anabatic::_saveNet() " << net << endl; cdebug_tabw(145,1); diff --git a/anabatic/src/AutoContact.cpp b/anabatic/src/AutoContact.cpp index a52d6253..77b23abd 100644 --- a/anabatic/src/AutoContact.cpp +++ b/anabatic/src/AutoContact.cpp @@ -110,7 +110,7 @@ namespace Anabatic { void AutoContact::_preDestroy () { - DebugSession::open( _contact->getNet(), 140, 150 ); + DebugSession::open( _contact->getNet(), 145, 150 ); cdebug_log(145,0) << "AutoContact::_preDestroy() - " << endl; @@ -552,6 +552,20 @@ namespace Anabatic { } + void AutoContact::setLayerAndWidth ( size_t delta, size_t depth ) + { + if (delta == 0) { + setLayer( Session::getRoutingLayer(depth) ); + setSizes( Session::getWireWidth (depth) + , Session::getWireWidth (depth) ); + } else { + setLayer( Session::getContactLayer(depth) ); + setSizes( Session::getViaWidth (depth) + , Session::getViaWidth (depth) ); + } + } + + AutoContact* AutoContact::createFrom ( Contact* hurricaneContact ) { AutoContact* autoContact = NULL; diff --git a/anabatic/src/AutoContactHTee.cpp b/anabatic/src/AutoContactHTee.cpp index 154029f3..baf0cdf1 100644 --- a/anabatic/src/AutoContactHTee.cpp +++ b/anabatic/src/AutoContactHTee.cpp @@ -200,7 +200,7 @@ namespace Anabatic { void AutoContactHTee::updateCache () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; @@ -249,7 +249,7 @@ namespace Anabatic { void AutoContactHTee::updateGeometry () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; @@ -277,7 +277,7 @@ namespace Anabatic { void AutoContactHTee::updateTopology () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; @@ -309,10 +309,10 @@ namespace Anabatic { if (depthH1 == depthH2) { // Dogleg on the vertical. switch ( delta ) { - case 0: setLayer( rg->getRoutingLayer(minDepth) ); break; - case 1: setLayer( rg->getContactLayer(minDepth) ); break; + case 0: + case 1: setLayerAndWidth( delta, minDepth ); break; default: - setLayer( rg->getContactLayer( depthH1 + ((depthH1==minDepth)?0:-1) ) ); + setLayerAndWidth( delta, depthH1 + ((depthH1==minDepth)?0:-1) ); _vertical1 = static_cast( _vertical1->makeDogleg(this) ); break; } @@ -322,12 +322,12 @@ namespace Anabatic { int deltaH2 = (int)depthH2 - (int)depthV1; if (std::abs(deltaH1) > std::abs(deltaH2)) { - setLayer( rg->getContactLayer( depthH2 + ((depthH2( _horizontal1->makeDogleg(this) ); _horizontal1->makeDogleg(this); cdebug_log(145,0) << "New h1:" << _horizontal1 << endl; } else { - setLayer( rg->getContactLayer( depthH1 + ((depthH1( _horizontal2->makeDogleg(this) ); _horizontal2->makeDogleg(this); cdebug_log(145,0) << "New h2:" << _horizontal2 << endl; diff --git a/anabatic/src/AutoContactTerminal.cpp b/anabatic/src/AutoContactTerminal.cpp index 3485c198..c93ea0fa 100644 --- a/anabatic/src/AutoContactTerminal.cpp +++ b/anabatic/src/AutoContactTerminal.cpp @@ -347,7 +347,7 @@ namespace Anabatic { void AutoContactTerminal::cacheAttach ( AutoSegment* segment ) { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::cacheAttach() " << this << endl; @@ -379,7 +379,7 @@ namespace Anabatic { void AutoContactTerminal::updateCache () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; @@ -438,7 +438,7 @@ namespace Anabatic { void AutoContactTerminal::updateGeometry () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; @@ -522,7 +522,7 @@ namespace Anabatic { void AutoContactTerminal::updateTopology () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; @@ -550,8 +550,8 @@ namespace Anabatic { cdebug_log(145,0) << "Update seg: " << _segment << endl; delta = abssub( anchorDepth, rg->getLayerDepth( _segment->getLayer() ) ); } - else if (delta == 0) setLayer( rg->getRoutingLayer(anchorDepth) ); - else if (delta == 1) setLayer( rg->getContactLayer(std::min(anchorDepth,segmentDepth)) ); + else if (delta == 0) setLayerAndWidth( delta, anchorDepth ); + else if (delta == 1) setLayerAndWidth( delta, std::min(anchorDepth,segmentDepth) ); } _segment->invalidate( this ); diff --git a/anabatic/src/AutoContactTurn.cpp b/anabatic/src/AutoContactTurn.cpp index d6121f83..1d502e6f 100644 --- a/anabatic/src/AutoContactTurn.cpp +++ b/anabatic/src/AutoContactTurn.cpp @@ -154,7 +154,7 @@ namespace Anabatic { void AutoContactTurn::updateCache () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateCache() " << this << endl; @@ -195,7 +195,7 @@ namespace Anabatic { void AutoContactTurn::updateGeometry () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateGeometry() " << this << endl; @@ -223,7 +223,7 @@ namespace Anabatic { void AutoContactTurn::updateTopology () { - DebugSession::open ( getNet(), 140, 150 ); + DebugSession::open ( getNet(), 145, 150 ); cdebug_log(145,1) << _getTypeName() << "::updateTopology() " << this << endl; @@ -263,7 +263,7 @@ namespace Anabatic { delta = abssub ( depthH1, depthV1 ); } - setLayer ( (delta == 0) ? rg->getRoutingLayer(depthContact) : rg->getContactLayer(depthContact) ); + setLayerAndWidth( delta, depthContact ); } _horizontal1->invalidate( this ); diff --git a/anabatic/src/AutoContactVTee.cpp b/anabatic/src/AutoContactVTee.cpp index e7a4bf56..24ed5ea0 100644 --- a/anabatic/src/AutoContactVTee.cpp +++ b/anabatic/src/AutoContactVTee.cpp @@ -169,7 +169,7 @@ namespace Anabatic { void AutoContactVTee::updateCache () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << "AutoContactVTee::updateCache() " << this << endl; @@ -215,7 +215,7 @@ namespace Anabatic { void AutoContactVTee::updateGeometry () { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(145,1) << "AutoContactVTee::updateGeometry() " << this << endl; @@ -243,7 +243,7 @@ namespace Anabatic { void AutoContactVTee::updateTopology () { - DebugSession::open ( getNet(), 140, 150 ); + DebugSession::open ( getNet(), 145, 150 ); cdebug_log(145,1) << "AutoContactVTee::updateTopology() " << this << endl; @@ -278,11 +278,11 @@ namespace Anabatic { cdebug_log(145,0) << "depthV1 == depthV2 (" << depthV1 << ")" << endl; // Dogleg on the horizontal. switch ( delta ) { - case 0: setLayer( rg->getRoutingLayer(minDepth) ); break; - case 1: setLayer( rg->getContactLayer(minDepth) ); break; + case 0: + case 1: setLayerAndWidth( delta, minDepth ); break; default: cdebug_log(145,0) << "Restore connectivity: dogleg on h1." << endl; - setLayer( rg->getContactLayer( depthV1 + ((depthV1==minDepth)?0:-1) ) ); + setLayerAndWidth( delta, depthV1 + ((depthV1==minDepth)?0:-1) ); _horizontal1 = static_cast( _horizontal1->makeDogleg(this) ); break; } @@ -292,11 +292,11 @@ namespace Anabatic { int deltaV2 = (int)depthV2 - (int)depthH1; if (std::abs(deltaV1) > std::abs(deltaV2)) { - setLayer( rg->getContactLayer( depthV2 + ((depthV2( _vertical1->makeDogleg(this) ); _vertical1->makeDogleg(this); } else { - setLayer( rg->getContactLayer( depthV1 + ((depthV1( _vertical2->makeDogleg(this) ); _vertical2->makeDogleg(this); } diff --git a/anabatic/src/AutoHorizontal.cpp b/anabatic/src/AutoHorizontal.cpp index faadf0b0..c1744fab 100644 --- a/anabatic/src/AutoHorizontal.cpp +++ b/anabatic/src/AutoHorizontal.cpp @@ -762,7 +762,7 @@ namespace Anabatic { Flags AutoHorizontal::_makeDogleg ( GCell* doglegGCell, Flags flags ) { - DebugSession::open( getNet(), 140, 150 ); + DebugSession::open( getNet(), 145, 150 ); cdebug_log(149,0) << "AutoHorizontal::_makeDogleg(GCell*) in " << doglegGCell << endl; cdebug_tabw(149,1); @@ -804,8 +804,9 @@ namespace Anabatic { upLayer = (depth+1 <= Session::getConfiguration()->getAllowedDepth()); } + size_t doglegDepth = depth + ((upLayer)?1:-1); Layer* contactLayer = Session::getRoutingGauge()->getContactLayer( depth + ((upLayer)?0:-1) ); - const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer( depth + ((upLayer)?1:-1) ); + const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer( doglegDepth ); Session::dogleg( this ); targetDetach(); @@ -814,7 +815,7 @@ namespace Anabatic { AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer ); AutoContact* dlContact2 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer ); AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, Flags::Vertical ); - segment1->setLayer( doglegLayer ); + segment1->setLayer( doglegDepth ); segment1->_setAxis( doglegAxis ); segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned ); @@ -825,7 +826,7 @@ namespace Anabatic { targetAttach( dlContact1 ); AutoSegment* segment2 = AutoSegment::create( dlContact2 , autoTarget, Flags::Horizontal ); autoTarget->cacheAttach( segment2 ); - segment2->setLayer( getLayer() ); + segment2->setLayer( depth ); segment2->_setAxis( getY() ); segment2->setFlags( (isSlackened()?SegSlackened:0) ); Session::dogleg( segment2 ); diff --git a/anabatic/src/AutoSegment.cpp b/anabatic/src/AutoSegment.cpp index 2ee677f1..e30d82c4 100644 --- a/anabatic/src/AutoSegment.cpp +++ b/anabatic/src/AutoSegment.cpp @@ -1632,7 +1632,7 @@ namespace Anabatic { const Layer* newLayer = Session::getRoutingGauge()->getRoutingLayer(depth); if (getLayer() != newLayer) { - setLayer( newLayer ); + setLayer( depth ); getAutoSource()->invalidate( Flags::Topology|Flags::NoCheckLayer ); getAutoTarget()->invalidate( Flags::Topology|Flags::NoCheckLayer ); } @@ -2110,18 +2110,18 @@ namespace Anabatic { if (getLayer()->above(from->getLayer())) { cdebug_log(149,0) << "Go Down from depth " << segmentDepth << endl; - doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth-1) ); + doglegs[ index + 1 ]->setLayer( segmentDepth-1 ); cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1] << endl; if (isSource) { - doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) ); + doglegs[ index + 0 ]->setLayer( segmentDepth-2 ); doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-2) ); doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-1) ); cdebug_log(149,0) << "doglegs[i+0]: " << doglegs[index+0] << endl; cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; } else { - doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) ); + doglegs[ index + 2 ]->setLayer( segmentDepth-2 ); doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-2) ); doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-1) ); cdebug_log(149,0) << "doglegs[i+2]: " << doglegs[index+2] << endl; @@ -2131,18 +2131,18 @@ namespace Anabatic { } else { cdebug_log(149,0) << "Go Up from depth " << segmentDepth << endl; - doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth+1) ); + doglegs[ index + 1 ]->setLayer( segmentDepth+1 ); cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1] << endl; if (isSource) { - doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) ); + doglegs[ index + 0 ]->setLayer( segmentDepth+2 ); doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth+1) ); doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth ) ); cdebug_log(149,0) << "doglegs[i+0]: " << doglegs[index+0] << endl; cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; cdebug_log(149,0) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; } else { - doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) ); + doglegs[ index + 2 ]->setLayer( segmentDepth+2 ); doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth+1) ); doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth ) ); cdebug_log(149,0) << "doglegs[i+2]: " << doglegs[index+2] << endl; diff --git a/anabatic/src/AutoVertical.cpp b/anabatic/src/AutoVertical.cpp index bbf8dec6..b5038068 100644 --- a/anabatic/src/AutoVertical.cpp +++ b/anabatic/src/AutoVertical.cpp @@ -712,8 +712,9 @@ namespace Anabatic { upLayer = (depth+1 <= Session::getConfiguration()->getAllowedDepth()); } + size_t doglegDepth = depth + ((upLayer)?1:-1); Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) ); - const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); + const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer ( doglegDepth ); Session::dogleg( this ); targetDetach(); @@ -725,7 +726,7 @@ namespace Anabatic { cdebug_log(149,0) << dlContact2 << endl; AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, Flags::Horizontal ); cdebug_log(149,0) << segment1 << endl; - segment1->setLayer( doglegLayer ); + segment1->setLayer( doglegDepth ); segment1->_setAxis( doglegAxis ); segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned ); cdebug_log(149,0) << "New " << dlContact1->base() << "." << endl; @@ -735,7 +736,7 @@ namespace Anabatic { targetAttach( dlContact1 ); AutoSegment* segment2 = AutoVertical::create ( dlContact2, autoTarget, Flags::Vertical ); autoTarget->cacheAttach( segment2 ); - segment2->setLayer( getLayer() ); + segment2->setLayer( depth ); segment2->_setAxis( getX() ); segment2->setFlags( (isSlackened()?SegSlackened:0) ); Session::dogleg( segment2 ); diff --git a/anabatic/src/CMakeLists.txt b/anabatic/src/CMakeLists.txt index c4456355..ae1c93c7 100644 --- a/anabatic/src/CMakeLists.txt +++ b/anabatic/src/CMakeLists.txt @@ -8,6 +8,7 @@ endif ( CHECK_DETERMINISM ) ${CORIOLIS_INCLUDE_DIR} ${HURRICANE_INCLUDE_DIR} ${CONFIGURATION_INCLUDE_DIR} + ${FLUTE_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${QtX_INCLUDE_DIR} ${PYTHON_INCLUDE_PATH} @@ -76,6 +77,7 @@ endif ( CHECK_DETERMINISM ) ${CONFIGURATION_LIBRARY} ${CIF_LIBRARY} ${AGDS_LIBRARY} + ${FLUTE_LIBRARIES} ${LEFDEF_LIBRARIES} ${OA_LIBRARIES} ${QtX_LIBRARIES} diff --git a/anabatic/src/Configuration.cpp b/anabatic/src/Configuration.cpp index 698b2061..4ea94084 100644 --- a/anabatic/src/Configuration.cpp +++ b/anabatic/src/Configuration.cpp @@ -92,11 +92,14 @@ namespace Anabatic { GCell::setDisplayMode( Cfg::getParamEnumerate("anabatic.gcell.displayMode", GCell::Boundary)->asInt() ); if (cg == NULL) cg = AllianceFramework::get()->getCellGauge(); + if (cg == NULL) + throw Error( "AnabaticEngine::Configuration(): Unable to find default cell gauge." ); + if (rg == NULL) { string gaugeName = Cfg::getParamString("anabatic.routingGauge","sxlib")->asString(); rg = AllianceFramework::get()->getRoutingGauge( gaugeName ); if (rg == NULL) - throw Error( "Anabatic::Configuration(): No routing gauge named \"%s\"", gaugeName.c_str() ); + throw Error( "AnabaticEngine::Configuration(): No routing gauge named \"%s\"", gaugeName.c_str() ); } _cg = cg->getClone(); _rg = rg->getClone(); @@ -424,7 +427,13 @@ namespace Anabatic { cdebug_tabw(112,-1); return true; } - + +#define BETTER_FOR_TSMC 0 +#if BETTER_FOR_TSMC + rp->setOnBestComponent( RoutingPad::BiggestArea ); + cdebug_tabw(112,-1); + return true; +#else Box ab = rp->getCell()->getAbutmentBox(); const Layer* metal1 = getLayerGauge( 0 )->getLayer(); RoutingLayerGauge* gauge = getLayerGauge( 1 ); @@ -506,6 +515,7 @@ namespace Anabatic { cdebug_tabw(112,-1); return false; +#endif } diff --git a/anabatic/src/Constants.cpp b/anabatic/src/Constants.cpp index 2df94361..f4c7147b 100644 --- a/anabatic/src/Constants.cpp +++ b/anabatic/src/Constants.cpp @@ -54,6 +54,8 @@ namespace Anabatic { const BaseFlags Flags::DestroyBaseSegment = (1L << 9); // Flags for NetDatas objects states only. const BaseFlags Flags::GlobalRouted = (1L << 5); + const BaseFlags Flags::GlobalEstimated = (1L << 6); + const BaseFlags Flags::ExcludeRoute = (1L << 7); // Masks. const BaseFlags Flags::WestSide = Horizontal|Target; const BaseFlags Flags::EastSide = Horizontal|Source; @@ -113,6 +115,7 @@ namespace Anabatic { const BaseFlags Flags::CheckLowDensity = (1L << 30); const BaseFlags Flags::CheckLowUpDensity = (1L << 31); const BaseFlags Flags::NoUpdate = (1L << 32); + const BaseFlags Flags::NorthPath = (1L << 33); Flags::~Flags () diff --git a/anabatic/src/Dijkstra.cpp b/anabatic/src/Dijkstra.cpp index ba7f6749..207af8d8 100644 --- a/anabatic/src/Dijkstra.cpp +++ b/anabatic/src/Dijkstra.cpp @@ -1334,6 +1334,31 @@ namespace Anabatic { } +// ------------------------------------------------------------------- +// Class : "Anabatic::PrioriryQueue::CompareByDistance". + + + PriorityQueue* PriorityQueue::CompareByDistance::_pqueue = NULL; + + + bool PriorityQueue::CompareByDistance::operator() ( const Vertex* lhs, const Vertex* rhs ) + { + if (lhs->getDistance() == rhs->getDistance()) { + if (_pqueue and _pqueue->hasAttractor()) { + DbU::Unit lhsDistance = _pqueue->getAttractor().manhattanDistance( lhs->getCenter() ); + DbU::Unit rhsDistance = _pqueue->getAttractor().manhattanDistance( rhs->getCenter() ); + + cdebug_log(112,0) << "CompareByDistance: lhs:" << DbU::getValueString(lhsDistance) + << " rhs:" << DbU::getValueString(rhsDistance) << endl; + + if (lhsDistance != rhsDistance) return lhsDistance < rhsDistance; + } + return lhs->getBranchId() > rhs->getBranchId(); + } + return lhs->getDistance() < rhs->getDistance(); + } + + // ------------------------------------------------------------------- // Class : "Anabatic::Dijkstra". @@ -1754,6 +1779,7 @@ namespace Anabatic { //_checkEdges(); _sources.clear(); _targets.clear(); + _queue.clear(); _searchArea.makeEmpty(); _connectedsId = 0; } @@ -2184,6 +2210,7 @@ namespace Anabatic { } _queue.clear(); + _queue.setAttractor( _searchArea.getCenter() ); _connectedsId = (*_sources.begin())->getConnexId(); for ( Vertex* source : _sources ) { _queue.push( source ); diff --git a/anabatic/src/Edge.cpp b/anabatic/src/Edge.cpp index 6e5f2a80..ba7c6ae0 100644 --- a/anabatic/src/Edge.cpp +++ b/anabatic/src/Edge.cpp @@ -197,7 +197,7 @@ namespace Anabatic { DbU::Unit dy = targetCenter.getY() - sourceCenter.getY(); if (dx < 0) dx = -dx; - if (dx) dx += DbU::fromLambda( 0.1 ); + //if (dx) dx += DbU::fromLambda( 0.1 ); return dx + ((dy > 0) ? dy : -dy); } diff --git a/anabatic/src/Edges.cpp b/anabatic/src/Edges.cpp index ae1b83c8..a4e299c7 100644 --- a/anabatic/src/Edges.cpp +++ b/anabatic/src/Edges.cpp @@ -20,6 +20,7 @@ namespace Anabatic { + using std::cerr; using std::endl; @@ -141,4 +142,144 @@ namespace Anabatic { } +// ------------------------------------------------------------------- +// Class : "Anabatic::Path_Edges". + + Path_Edges::Locator::Locator ( const GCell* source, const GCell* target, Flags pathFlags ) + : EdgesHL() + , _source (source) + , _target (target) + , _stateFlags(Flags::NoFlags) + , _uprobe (0) + , _edge (NULL) + { + if (_source == _target) return; + + Interval hoverlap = _source->getHSide().getIntersection( _target->getHSide() ); + Interval voverlap = _source->getVSide().getIntersection( _target->getVSide() ); + + if (not voverlap.isEmpty()) { + if (_source->getXMin() > _target->getXMin()) std::swap( _source, _target ); + _stateFlags |= Flags::EastSide; + _uprobe = voverlap.getCenter(); + } else if (not hoverlap.isEmpty()) { + if (_source->getYMin() > _target->getYMin()) std::swap( _source, _target ); + _stateFlags |= Flags::NorthSide; + _uprobe = hoverlap.getCenter(); + } else { + if (_source->getXMin() > _target->getXMin()) { + std::swap( _source, _target ); + } + + if (_source->getYMin() < _target->getYMin()) { + if (pathFlags & Flags::NorthPath) { + _stateFlags |= Flags::NorthSide; + _uprobe = _source->getXCenter(); + } else { + _stateFlags |= Flags::EastSide; + _uprobe = _source->getYCenter(); + } + } else { + if (pathFlags & Flags::NorthPath) { + _stateFlags |= Flags::EastSide; + _uprobe = _source->getYCenter(); + } else { + _stateFlags |= Flags::SouthSide; + _uprobe = _source->getXCenter(); + } + } + } + + _edge = _source->getEdgeAt( _stateFlags, _uprobe ); + } + + + EdgesHL* Path_Edges::Locator::getClone () const + { return new Locator (*this); } + + + Edge* Path_Edges::Locator::getElement () const + { return _edge; } + + + bool Path_Edges::Locator::isValid () const + { return (_edge != NULL); } + + + void Path_Edges::Locator::progress () + { + if (not _edge) return; + + GCell* neighbor = NULL; + if (_stateFlags.contains(Flags::SouthSide) or _stateFlags.contains(Flags::WestSide)) neighbor = _edge->getSource(); + if (_stateFlags.contains(Flags::NorthSide) or _stateFlags.contains(Flags::EastSide)) neighbor = _edge->getTarget(); + + if (neighbor == _target) { _edge = NULL; return; } + + if (_stateFlags.contains(Flags::EastSide)) { + Interval overlap = neighbor->getHSide().getIntersection( _target->getHSide() ); + + if (not overlap.isEmpty()) { + overlap = neighbor->getVSide().getIntersection( _target->getVSide() ); + if (not overlap.isEmpty()) { _edge = NULL; return; } + + _stateFlags.reset( Flags::EastSide ); + _stateFlags |= (_target->getYMin() < _source->getYMin()) ? Flags::SouthSide + : Flags::NorthSide; + _uprobe = overlap.getCenter(); + } + } else if (_stateFlags.contains(Flags::SouthSide)) { + Interval overlap = neighbor->getVSide().getIntersection( _target->getVSide() ); + + if (not overlap.isEmpty()) { + overlap = neighbor->getHSide().getIntersection( _target->getHSide() ); + if (not overlap.isEmpty()) { + _edge = NULL; return; } + + _stateFlags.reset( Flags::SouthSide ); + _stateFlags |= Flags::EastSide; + _uprobe = overlap.getCenter(); + } + } else if (_stateFlags.contains(Flags::NorthSide)) { + Interval overlap = neighbor->getVSide().getIntersection( _target->getVSide() ); + + if (not overlap.isEmpty()) { + overlap = neighbor->getHSide().getIntersection( _target->getHSide() ); + if (not overlap.isEmpty()) { _edge = NULL; return; } + + _stateFlags.reset( Flags::NorthSide ); + _stateFlags |= Flags::EastSide; + _uprobe = overlap.getCenter(); + } + } + + _edge = neighbor->getEdgeAt( _stateFlags, _uprobe ); + } + + + string Path_Edges::Locator::_getString () const + { + string s = ""; + return s; + } + + + EdgesHC* Path_Edges::getClone () const + { return new Path_Edges( *this ); } + + + EdgesHL* Path_Edges::getLocator () const + { return new Locator (_source,_target,_pathFlags); } + + + string Path_Edges::_getString () const + { + string s = ""; + return s; + } + + } // Anabatic namespace. diff --git a/anabatic/src/GCell.cpp b/anabatic/src/GCell.cpp index 3e80d156..25a036e6 100644 --- a/anabatic/src/GCell.cpp +++ b/anabatic/src/GCell.cpp @@ -273,6 +273,8 @@ namespace Anabatic { Name GCell::_extensionName = "Anabatic::GCell"; uint32_t GCell::_displayMode = GCell::Boundary; + DbU::Unit GCell::_matrixHSide = 0; + DbU::Unit GCell::_matrixVSide = 0; uint32_t GCell::getDisplayMode () { return _displayMode; } @@ -304,6 +306,14 @@ namespace Anabatic { , _globalsCount (new float [_depth]) , _key (this,1) { + if (not _matrixHSide) { + _matrixVSide = Session::getSliceHeight(); + _matrixHSide = Session::getSliceHeight(); + + if (_matrixHSide % Session::getSliceStep()) + _matrixHSide += Session::getSliceStep() - _matrixHSide % Session::getSliceStep(); + } + for ( size_t i=0 ; i<_depth ; i++ ) { _blockages [i] = 0; _densities [i] = 0.0; @@ -774,15 +784,11 @@ namespace Anabatic { bool openSession = Session::isOpen(); if (not openSession) getAnabatic()->openSession(); - DbU::Unit vside = Session::getSliceHeight(); - DbU::Unit hside = Session::getSliceHeight(); + DbU::Unit vside = getMatrixVSide(); + DbU::Unit hside = getMatrixHSide(); Interval hspan = getSide( Flags::Horizontal ); Interval vspan = getSide( Flags::Vertical ); - if (hside % Session::getSliceStep()) { - hside += Session::getSliceStep() - hside % Session::getSliceStep(); - } - // if (hspan.getSize() < 2*hside) { // cerr << Error( "GCell::doGrid(): GCell is too narrow (dx:%s) to build a grid.\n" // " (%s)" diff --git a/anabatic/src/LayerAssign.cpp b/anabatic/src/LayerAssign.cpp index 0f3f01c1..2b616f40 100644 --- a/anabatic/src/LayerAssign.cpp +++ b/anabatic/src/LayerAssign.cpp @@ -117,8 +117,14 @@ namespace Anabatic { } global++; - if ((*isegment)->getLayer() == Session::getRoutingLayer(1)) (*isegment)->setLayer( Session::getRoutingLayer(3) ); - if ((*isegment)->getLayer() == Session::getRoutingLayer(2)) (*isegment)->setLayer( Session::getRoutingLayer(4) ); + if ((*isegment)->getLayer() == Session::getRoutingLayer(1)) { + (*isegment)->setLayer( Session::getRoutingLayer(3) ); + (*isegment)->setWidth( Session::getWireWidth (3) ); + } + if ((*isegment)->getLayer() == Session::getRoutingLayer(2)) { + (*isegment)->setLayer( Session::getRoutingLayer(4) ); + (*isegment)->setWidth( Session::getWireWidth (4) ); + } } } @@ -142,7 +148,7 @@ namespace Anabatic { void AnabaticEngine::_layerAssignByTrunk ( Net* net, set& globalNets, unsigned long& total, unsigned long& global ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(149,0) << "Anabatic::_layerAssignByTrunk ( " << net << " )" << endl; cdebug_tabw(145,1); @@ -172,8 +178,14 @@ namespace Anabatic { netGlobal++; cdebug_log(145,0) << "Migrate to M4/M5: " << autoSegment << endl; - if (autoSegment->isHorizontal()) autoSegment->setLayer( Session::getRoutingLayer(3) ); - if (autoSegment->isVertical ()) autoSegment->setLayer( Session::getRoutingLayer(4) ); + if (autoSegment->isHorizontal()) { + autoSegment->setLayer( Session::getRoutingLayer(3) ); + autoSegment->setWidth( Session::getWireWidth (3) ); + } + if (autoSegment->isVertical()) { + autoSegment->setLayer( Session::getRoutingLayer(4) ); + autoSegment->setWidth( Session::getWireWidth (4) ); + } } } } @@ -316,7 +328,7 @@ namespace Anabatic { void AnabaticEngine::moveULeft ( AutoSegment* seed, set& globalNets, GCell::Set& invalidateds ) { Net* net = seed->getNet(); - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(9000,0) << "Deter| Move left: " << seed << endl; @@ -353,7 +365,7 @@ namespace Anabatic { void AnabaticEngine::moveURight ( AutoSegment* seed, set& globalNets, GCell::Set& invalidateds ) { Net* net = seed->getNet(); - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(9000,0) << "Deter| Move right: " << seed << endl; @@ -393,7 +405,7 @@ namespace Anabatic { Net* net = seed->getNet(); unsigned int seedDepth = Session::getRoutingGauge()->getLayerDepth(seed->getLayer()); - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(9000,0) << "Deter| moveUpNetTrunk() depth:" << seedDepth << " " << seed << endl; if (not seed->canMoveUp( 1.0, Flags::Propagate|Flags::AllowTerminal|Flags::NoCheckLayer) ) { diff --git a/anabatic/src/NetBuilder.cpp b/anabatic/src/NetBuilder.cpp index cb092993..6947fad6 100644 --- a/anabatic/src/NetBuilder.cpp +++ b/anabatic/src/NetBuilder.cpp @@ -385,7 +385,7 @@ namespace Anabatic { _sourceContact = sourceContact; _fromHook = fromHook; - cdebug_log(145,1) << "NetBuilder::NetBuilder()" << endl; + cdebug_log(145,1) << "NetBuilder::setStartHook()" << endl; cdebug_log(145,0) << "* _fromHook: " << fromHook << endl; cdebug_log(145,0) << "* _sourceContact:" << sourceContact << endl; @@ -614,10 +614,14 @@ namespace Anabatic { // End xG cascaded cases. // Optimized specific cases. case Conn_1G_1PinM2: _do_1G_1PinM2 (); break; + case Conn_2G_1PinM2: + case Conn_3G_1PinM2: _do_xG_1PinM2 (); break; + case Conn_1G_1PinM3: _do_1G_1PinM3 (); break; + case Conn_2G_1PinM3: + case Conn_3G_1PinM3: _do_xG_1PinM3 (); break; case Conn_1G_1M1_1M2: _do_xG_1M1_1M2(); break; case Conn_1G_1M1_1M3: _do_1G_xM1 (); break; case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break; - case Conn_2G_1PinM2: _do_xG_xM2 (); break; default: if (not isTwoMetals()) throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n" @@ -955,6 +959,27 @@ namespace Anabatic { } + bool NetBuilder::_do_xG_1PinM2 () + { + cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM2() method *not* reimplemented from base class." << endl; + return false; + } + + + bool NetBuilder::_do_1G_1PinM3 () + { + cdebug_log(145,0) << getTypeName() << "::_do_1G_1PinM3() method *not* reimplemented from base class." << endl; + return false; + } + + + bool NetBuilder::_do_xG_1PinM3 () + { + cdebug_log(145,0) << getTypeName() << "::_do_xG_1PinM3() method *not* reimplemented from base class." << endl; + return false; + } + + bool NetBuilder::_do_1G_1M1 () { cdebug_log(145,0) << getTypeName() << "::_do_1G_1M1() method *not* reimplemented from base class." << endl; diff --git a/anabatic/src/NetBuilderVH.cpp b/anabatic/src/NetBuilderVH.cpp index 9d895e5d..3919e4b5 100644 --- a/anabatic/src/NetBuilderVH.cpp +++ b/anabatic/src/NetBuilderVH.cpp @@ -32,6 +32,7 @@ #include "hurricane/RoutingPad.h" #include "hurricane/RoutingPads.h" #include "hurricane/Pad.h" +#include "hurricane/Pin.h" #include "hurricane/Plug.h" #include "hurricane/Cell.h" #include "hurricane/Instance.h" @@ -55,6 +56,7 @@ namespace Anabatic { using Hurricane::Transformation; using Hurricane::Warning; using Hurricane::Error; + using Hurricane::Pin; NetBuilderVH::NetBuilderVH () @@ -253,13 +255,151 @@ namespace Anabatic { } + bool NetBuilderVH::_do_1G_1PinM2 () + { + cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM2() [Managed Configuration - Optimized] " << getTopology() << endl; + + Pin* pin = dynamic_cast( getRoutingPads()[0]->getOccurrence().getEntity() ); + if ( (pin->getAccessDirection() != Pin::AccessDirection::SOUTH) + and (pin->getAccessDirection() != Pin::AccessDirection::NORTH) ) { + cerr << Error( "%s::do_1G_1PinM2(): %s *must* be north or south." + , getTypeName().c_str() + , getString(pin).c_str() ) << endl; + } + + uint64_t flags = NoFlags; + if (east()) { flags |= HAccess|VSmall; } + else if (west()) { flags |= HAccess|VSmall; } + + setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) ); + + cdebug_tabw(145,-1); + return true; + } + + + bool NetBuilderVH::_do_xG_1PinM2 () + { + cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM2() [Managed Configuration] " << getTopology() << endl; + + Pin* pin = dynamic_cast( getRoutingPads()[0]->getOccurrence().getEntity() ); + if ( (pin->getAccessDirection() != Pin::AccessDirection::SOUTH) + and (pin->getAccessDirection() != Pin::AccessDirection::NORTH) ) { + cerr << Error( "%s::do_xG_1PinM2(): %s *must* be north or south." + , getTypeName().c_str() + , getString(pin).c_str() ) << endl; + } + + RoutingPad* rp = getRoutingPads()[0]; + AutoContact* pinContact = NULL; + doRp_AutoContacts( getGCell(), rp, pinContact, pinContact, HSmall|VSmall ); + + if (not north() and not south()) { + AutoContact* subContact1 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( pinContact, subContact1, Flags::Vertical ); + setBothCornerContacts( subContact1 ); + } else { + AutoContact* subContact1 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( pinContact, subContact1, Flags::Vertical ); + + if (east() and west()) { + AutoContact* subContact2 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( subContact1, subContact2, Flags::Vertical ); + + setSouthWestContact( (south()) ? subContact1 : subContact2 ); + setNorthEastContact( (south()) ? subContact2 : subContact1 ); + } else + setBothCornerContacts( subContact1 ); + } + + cdebug_tabw(145,-1); + return true; + } + + + bool NetBuilderVH::_do_1G_1PinM3 () + { + cdebug_log(145,1) << getTypeName() << "::_do_1G_1PinM3() [Managed Configuration - Optimized] " << getTopology() << endl; + + Pin* pin = dynamic_cast( getRoutingPads()[0]->getOccurrence().getEntity() ); + if ( (pin->getAccessDirection() != Pin::AccessDirection::EAST) + and (pin->getAccessDirection() != Pin::AccessDirection::WEST) ) { + cerr << Error( "%s::do_1G_1PinM2(): %s *must* be east or west." + , getTypeName().c_str() + , getString(pin).c_str() ) << endl; + } + + AutoContact* pinContact = NULL; + doRp_AutoContacts( getGCell(), getRoutingPads()[0], pinContact, pinContact, HSmall|VSmall ); + + if (east() or west()) { + AutoContact* subContact1 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact2 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) ); + + AutoSegment::create( pinContact , subContact1, Flags::Horizontal ); + AutoSegment::create( subContact1, subContact2, Flags::Vertical ); + pinContact = subContact2; + } else { + AutoContact* subContact1 = NULL; + subContact1 = AutoContactTurn::create( getGCell(), getRoutingPads()[0]->getNet(), Session::getContactLayer(1) ); + + AutoSegment::create( pinContact, subContact1, Flags::Horizontal ); + pinContact = subContact1; + } + + setBothCornerContacts( pinContact ); + + cdebug_tabw(145,-1); + return true; + } + + + bool NetBuilderVH::_do_xG_1PinM3 () + { + cdebug_log(145,1) << getTypeName() << "::_do_xG_1PinM3() [Managed Configuration] " << getTopology() << endl; + + RoutingPad* rp = getRoutingPads()[0]; + Pin* pin = dynamic_cast( rp->getOccurrence().getEntity() ); + if ( (pin->getAccessDirection() != Pin::AccessDirection::EAST) + and (pin->getAccessDirection() != Pin::AccessDirection::WEST) ) { + cerr << Error( "%s::do_xG_1PinM3(): %s *must* be east or west." + , getTypeName().c_str() + , getString(pin).c_str() ) << endl; + } + + AutoContact* pinContact = NULL; + doRp_AutoContacts( getGCell(), rp, pinContact, pinContact, HSmall|VSmall ); + + if (not east() and not west()) { + AutoContact* subContact1 = AutoContactVTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( pinContact, subContact1, Flags::Horizontal ); + setBothCornerContacts( subContact1 ); + } else { + AutoContact* subContact1 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( pinContact, subContact1, Flags::Horizontal ); + + if (north() and south()) { + AutoContact* subContact2 = AutoContactHTee::create( getGCell(), rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( subContact1, subContact2, Flags::Horizontal ); + + setSouthWestContact( (west()) ? subContact1 : subContact2 ); + setNorthEastContact( (west()) ? subContact2 : subContact1 ); + } else + setBothCornerContacts( subContact1 ); + } + + cdebug_tabw(145,-1); + return true; + } + + bool NetBuilderVH::_do_1G_1M1 () { cdebug_log(145,1) << getTypeName() << "::_do_1G_1M1() [Managed Configuration - Optimized] " << getTopology() << endl; uint64_t flags = NoFlags; - if (east() ) { flags |= HAccess|VSmall; } - else if (west() ) { flags |= HAccess|VSmall; } + if (east()) { flags |= HAccess|VSmall; } + else if (west()) { flags |= HAccess|VSmall; } setBothCornerContacts( doRp_Access(getGCell(),getRoutingPads()[0],flags) ); diff --git a/anabatic/src/NetConstraints.cpp b/anabatic/src/NetConstraints.cpp index bf94f88a..0e500090 100644 --- a/anabatic/src/NetConstraints.cpp +++ b/anabatic/src/NetConstraints.cpp @@ -161,7 +161,7 @@ namespace Anabatic { void AnabaticEngine::computeNetConstraints ( Net* net ) { - DebugSession::open( net, 140, 150); + DebugSession::open( net, 145, 150); cdebug_log(149,0) << "Anabatic::computeNetConstraints( " << net << " )" << endl; cdebug_tabw(145,1); diff --git a/anabatic/src/NetOptimals.cpp b/anabatic/src/NetOptimals.cpp index d08b2f3b..66c17ce2 100644 --- a/anabatic/src/NetOptimals.cpp +++ b/anabatic/src/NetOptimals.cpp @@ -61,7 +61,7 @@ namespace Anabatic { void AnabaticEngine::toOptimals ( Net* net ) { - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); cdebug_log(149,0) << "Anabatic::_toOptimals( " << net << " )" << endl; cdebug_tabw(145,1); diff --git a/anabatic/src/anabatic/AnabaticEngine.h b/anabatic/src/anabatic/AnabaticEngine.h index 8868ab74..cbda82ae 100644 --- a/anabatic/src/anabatic/AnabaticEngine.h +++ b/anabatic/src/anabatic/AnabaticEngine.h @@ -103,9 +103,11 @@ namespace Anabatic { class NetData { public: NetData ( Net* ); + inline bool isGlobalEstimated () const; inline bool isGlobalRouted () const; inline bool isMixedPreRoute () const; inline bool isFixed () const; + inline bool isExcluded () const; inline Net* getNet () const; inline NetRoutingState* getNetRoutingState () const; inline const Box& getSearchArea () const; @@ -114,7 +116,9 @@ namespace Anabatic { inline DbU::Unit getSparsity () const; inline void setNetRoutingState ( NetRoutingState* ); inline void setSearchArea ( Box ); + inline void setGlobalEstimated ( bool ); inline void setGlobalRouted ( bool ); + inline void setExcluded ( bool ); inline void setRpCount ( size_t ); private: NetData ( const NetData& ); @@ -130,9 +134,11 @@ namespace Anabatic { }; + inline bool NetData::isGlobalEstimated () const { return _flags & Flags::GlobalEstimated; } inline bool NetData::isGlobalRouted () const { return _flags & Flags::GlobalRouted; } inline bool NetData::isMixedPreRoute () const { return (_state) ? _state->isMixedPreRoute() : false; } inline bool NetData::isFixed () const { return (_state) ? _state->isFixed () : false; } + inline bool NetData::isExcluded () const { return _flags & Flags::ExcludeRoute; } inline Net* NetData::getNet () const { return _net; } inline NetRoutingState* NetData::getNetRoutingState () const { return _state; } inline const Box& NetData::getSearchArea () const { return _searchArea; } @@ -140,7 +146,9 @@ namespace Anabatic { inline size_t NetData::getRpCount () const { return _rpCount; } inline void NetData::setNetRoutingState ( NetRoutingState* state ) { _state=state; } inline DbU::Unit NetData::getSparsity () const { return _sparsity; } - inline void NetData::setGlobalRouted ( bool state ) { _flags.set(Flags::GlobalRouted,state); } + inline void NetData::setGlobalEstimated ( bool state ) { _flags.set(Flags::GlobalEstimated,state); } + inline void NetData::setGlobalRouted ( bool state ) { _flags.set(Flags::GlobalRouted ,state); } + inline void NetData::setExcluded ( bool state ) { _flags.set(Flags::ExcludeRoute ,state); } inline void NetData::setRpCount ( size_t count ) { _rpCount=count; _update(); } @@ -195,6 +203,7 @@ namespace Anabatic { inline GCell* getGCellUnder ( DbU::Unit x, DbU::Unit y ) const; inline GCell* getGCellUnder ( Point ) const; inline GCellsUnder getGCellsUnder ( Segment* ) const; + inline Edges getEdgesUnderPath ( GCell* source, GCell* target, Flags pathFlags=Flags::NorthPath ) const; Interval getUSide ( Flags direction ) const; int getCapacity ( Interval, Flags ) const; size_t getNetsFromEdge ( const Edge*, NetSet& ); @@ -206,6 +215,8 @@ namespace Anabatic { inline const NetDatas& getNetDatas () const; NetData* getNetData ( Net*, Flags flags=Flags::NoFlags ); void setupNetDatas (); + void exclude ( const Name& netName ); + void exclude ( Net* ); void updateMatrix (); // Dijkstra related functions. inline int getStamp () const; @@ -330,6 +341,7 @@ 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( new RawGCellsUnder(this,s) ); } + inline Edges AnabaticEngine::getEdgesUnderPath ( GCell* source, GCell* target, Flags pathFlags ) const { return new Path_Edges(source,target,pathFlags); } 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; } diff --git a/anabatic/src/anabatic/AutoContact.h b/anabatic/src/anabatic/AutoContact.h index e48961a8..e2de5a63 100644 --- a/anabatic/src/anabatic/AutoContact.h +++ b/anabatic/src/anabatic/AutoContact.h @@ -178,6 +178,7 @@ namespace Anabatic { , Flags flags=Flags::WarnOnError ); void restoreNativeConstraintBox (); void migrateConstraintBox ( AutoContact* other ); + void setLayerAndWidth ( size_t delta, size_t depth ); void destroy (); // Inspector Management. Record* _getRecord () const; diff --git a/anabatic/src/anabatic/AutoSegment.h b/anabatic/src/anabatic/AutoSegment.h index ddb0cfc1..b98ec0e4 100644 --- a/anabatic/src/anabatic/AutoSegment.h +++ b/anabatic/src/anabatic/AutoSegment.h @@ -178,6 +178,8 @@ namespace Anabatic { inline DbU::Unit getTargetY () const; inline void invert (); inline void setLayer ( const Layer* ); + inline void setLayer ( size_t depth ); + inline void setWidth ( DbU::Unit ); // Predicates. inline bool isHorizontal () const; inline bool isVertical () const; @@ -538,6 +540,7 @@ namespace Anabatic { 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); _flags|=SegInvalidatedLayer; } + inline void AutoSegment::setWidth ( DbU::Unit width ) { base()->setWidth(width); } inline void AutoSegment::setOptimalMin ( DbU::Unit min ) { _optimalMin = (unsigned int)DbU::getLambda(min-getOrigin()); } inline void AutoSegment::setOptimalMax ( DbU::Unit max ) { _optimalMax = (unsigned int)DbU::getLambda(max-getOrigin()); } inline void AutoSegment::mergeNativeMin ( DbU::Unit min ) { _nativeConstraints.getVMin() = std::max( min, _nativeConstraints.getVMin() ); } @@ -547,6 +550,17 @@ namespace Anabatic { inline void AutoSegment::resetUserConstraints () { _userConstraints = Interval(false); } + inline void AutoSegment::setLayer ( size_t depth ) + { + RoutingLayerGauge* layerGauge = Session::getLayerGauge( depth ); + base()->setLayer( layerGauge->getLayer () ); + base()->setWidth( layerGauge->getWireWidth() ); + + _depth = depth; + _flags|=SegInvalidatedLayer; + } + + inline DbU::Unit AutoSegment::getContactWidth () const { return getWidth() + Session::getViaWidth(getLayer()) - Session::getWireWidth(getLayer()); } diff --git a/anabatic/src/anabatic/Constants.h b/anabatic/src/anabatic/Constants.h index 4c7f3014..4ff880b9 100644 --- a/anabatic/src/anabatic/Constants.h +++ b/anabatic/src/anabatic/Constants.h @@ -54,6 +54,8 @@ namespace Anabatic { static const BaseFlags DestroyBaseSegment ; // = (1 << 9); // Flags for NetDatas objects states only. static const BaseFlags GlobalRouted ; // = (1 << 5); + static const BaseFlags GlobalEstimated ; // = (1 << 6); + static const BaseFlags ExcludeRoute ; // = (1 << 7); // Masks. static const BaseFlags WestSide ; // = Horizontal|Target; static const BaseFlags EastSide ; // = Horizontal|Source; @@ -96,6 +98,7 @@ namespace Anabatic { static const BaseFlags CheckLowDensity ; static const BaseFlags CheckLowUpDensity ; static const BaseFlags NoUpdate ; + static const BaseFlags NorthPath ; public: inline Flags ( uint64_t flags = NoFlags ); inline Flags ( const Hurricane::BaseFlags& ); diff --git a/anabatic/src/anabatic/Dijkstra.h b/anabatic/src/anabatic/Dijkstra.h index 9601ef3f..14f945ac 100644 --- a/anabatic/src/anabatic/Dijkstra.h +++ b/anabatic/src/anabatic/Dijkstra.h @@ -414,40 +414,50 @@ namespace Anabatic { class PriorityQueue { public: - inline PriorityQueue (); - inline ~PriorityQueue (); - inline bool empty () const; - inline size_t size () const; - inline void push ( Vertex* ); - inline void erase ( Vertex* ); - inline Vertex* top (); - inline void pop (); - inline void clear (); - inline void dump () const; + inline PriorityQueue (); + inline ~PriorityQueue (); + inline bool empty () const; + inline size_t size () const; + inline void push ( Vertex* ); + inline void erase ( Vertex* ); + inline Vertex* top (); + inline void pop (); + inline void clear (); + inline void dump () const; + inline void setAttractor ( const Point& ); + inline const Point& getAttractor () const; + inline bool hasAttractor () const; private: class CompareByDistance { public: - inline bool operator() ( const Vertex* lhs, const Vertex* rhs ); + inline CompareByDistance (); + bool operator() ( const Vertex* lhs, const Vertex* rhs ); + static inline void setQueue ( PriorityQueue* ); + private: + static PriorityQueue* _pqueue; }; private: + bool _hasAttractor; + Point _attractor; multiset _queue; }; - inline bool PriorityQueue::CompareByDistance::operator() ( const Vertex* lhs, const Vertex* rhs ) - { - if (lhs->getDistance() == rhs->getDistance()) return lhs->getBranchId() > rhs->getBranchId(); - return lhs->getDistance() < rhs->getDistance(); - } + inline PriorityQueue::CompareByDistance::CompareByDistance () { } + + inline void PriorityQueue::CompareByDistance::setQueue ( PriorityQueue* pqueue ) { _pqueue = pqueue; } - inline PriorityQueue::PriorityQueue () : _queue() { } - inline PriorityQueue::~PriorityQueue () { } - inline bool PriorityQueue::empty () const { return _queue.empty(); } - inline size_t PriorityQueue::size () const { return _queue.size(); } - inline void PriorityQueue::push ( Vertex* v ) { _queue.insert(v); } - inline Vertex* PriorityQueue::top () { return _queue.empty() ? NULL : *_queue.begin(); } - inline void PriorityQueue::clear () { _queue.clear(); } + inline PriorityQueue::PriorityQueue () : _hasAttractor(false), _attractor(), _queue() { PriorityQueue::CompareByDistance::setQueue(this); } + inline PriorityQueue::~PriorityQueue () { } + inline bool PriorityQueue::empty () const { return _queue.empty(); } + inline size_t PriorityQueue::size () const { return _queue.size(); } + inline void PriorityQueue::push ( Vertex* v ) { _queue.insert(v); } + inline Vertex* PriorityQueue::top () { return _queue.empty() ? NULL : *_queue.begin(); } + inline void PriorityQueue::clear () { _queue.clear(); _hasAttractor=false; } + inline void PriorityQueue::setAttractor ( const Point& p ) { _attractor=p; _hasAttractor=true; } + inline bool PriorityQueue::hasAttractor () const { return _hasAttractor; } + inline const Point& PriorityQueue::getAttractor () const { return _attractor; } inline void PriorityQueue::pop () { @@ -512,7 +522,7 @@ namespace Anabatic { void run ( Mode mode=Mode::Standart ); inline const VertexSet& getSources () const; private: - Dijkstra ( const Dijkstra& ); + Dijkstra ( const Dijkstra& ); Dijkstra& operator= ( const Dijkstra& ); static DbU::Unit _distance ( const Vertex*, const Vertex*, const Edge* ); Point _getPonderedPoint () const; diff --git a/anabatic/src/anabatic/Edge.h b/anabatic/src/anabatic/Edge.h index 0796ed94..8e92f42b 100644 --- a/anabatic/src/anabatic/Edge.h +++ b/anabatic/src/anabatic/Edge.h @@ -63,7 +63,7 @@ namespace Anabatic { inline unsigned int getReservedCapacity () const; inline unsigned int getCapacity ( size_t depth ) const; inline unsigned int getRealOccupancy () const; - inline unsigned int getEstimateOccupancy () const; + inline float getEstimateOccupancy () const; inline float getHistoricCost () const; DbU::Unit getDistance () const; inline GCell* getSource () const; @@ -82,6 +82,7 @@ namespace Anabatic { inline void setRealOccupancy ( int ); void incRealOccupancy ( int ); void incRealOccupancy2 ( int ); + inline void incEstimateOccupancy ( float ); inline void setHistoricCost ( float ); bool isEnding ( Segment* ) const; void add ( Segment* ); @@ -139,7 +140,7 @@ namespace Anabatic { inline unsigned int Edge::getCapacity ( size_t depth ) const { return (_capacities) ? _capacities->getCapacity(depth) : 0; } inline unsigned int Edge::getReservedCapacity () const { return _reservedCapacity; } inline unsigned int Edge::getRealOccupancy () const { return _realOccupancy; } - inline unsigned int Edge::getEstimateOccupancy () const { return _estimateOccupancy; } + inline float Edge::getEstimateOccupancy () const { return _estimateOccupancy; } inline float Edge::getHistoricCost () const { return _historicCost; } inline GCell* Edge::getSource () const { return _source; } inline GCell* Edge::getTarget () const { return _target; } @@ -150,6 +151,7 @@ namespace Anabatic { //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 void Edge::incEstimateOccupancy ( float delta ) { _estimateOccupancy += delta; } inline const Flags& Edge::flags () const { return _flags; } inline Flags& Edge::flags () { return _flags; } inline Flags& Edge::setFlags ( Flags mask ) { _flags |= mask; return _flags; } diff --git a/anabatic/src/anabatic/Edges.h b/anabatic/src/anabatic/Edges.h index c9aa36dc..488bb414 100644 --- a/anabatic/src/anabatic/Edges.h +++ b/anabatic/src/anabatic/Edges.h @@ -19,6 +19,7 @@ #include #include +#include "hurricane/DbU.h" #include "hurricane/Collection.h" #include "anabatic/Constants.h" @@ -27,6 +28,7 @@ namespace Anabatic { using std::string; using std::vector; + using Hurricane::DbU; using Hurricane::Record; using Hurricane::Filter; using Hurricane::Locator; @@ -110,12 +112,82 @@ namespace Anabatic { { } +// ------------------------------------------------------------------- +// Class : "Path_Edges". + + class Path_Edges : public EdgesHC { + public: + // Sub-Class: Locator. + class Locator : public EdgesHL { + public: + Locator ( const GCell* source, const GCell* target, Flags pathFlags ); + inline Locator ( const Locator& ); + virtual Edge* getElement () const; + virtual EdgesHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + const GCell* _source; + const GCell* _target; + Flags _stateFlags; + DbU::Unit _uprobe; + Edge* _edge; + }; + + // GCell_Edges. + public: + inline Path_Edges ( const GCell* source, const GCell* target, Flags pathFlags=Flags::NorthPath ); + inline Path_Edges ( const Path_Edges& ); + virtual EdgesHC* getClone () const; + virtual EdgesHL* getLocator () const; + virtual string _getString () const; + protected: + const GCell* _source; + const GCell* _target; + Flags _pathFlags; + }; + + + inline Path_Edges::Locator::Locator ( const Locator &locator ) + : EdgesHL() + , _source (locator._source) + , _target (locator._target) + , _stateFlags(locator._stateFlags) + , _uprobe (locator._uprobe) + , _edge (locator._edge) + { + // cdebug_log(110,0) << "GCell_Edges::Locator::Locator(const Locator&)" << std::endl; + } + + + inline Path_Edges::Path_Edges ( const GCell* source, const GCell* target, Flags pathFlags ) + : EdgesHC() + , _source (source) + , _target (target) + , _pathFlags(pathFlags) + { } + + + inline Path_Edges::Path_Edges ( const Path_Edges& path ) + : EdgesHC() + , _source (path._source) + , _target (path._target) + , _pathFlags(path._pathFlags) + { } + + } // Anabatic namespace. GETSTRING_POINTER_SUPPORT(Anabatic::GCell_Edges); GETSTRING_POINTER_SUPPORT(Anabatic::GCell_Edges::Locator); +GETSTRING_POINTER_SUPPORT(Anabatic::Path_Edges); +GETSTRING_POINTER_SUPPORT(Anabatic::Path_Edges::Locator); + IOSTREAM_POINTER_SUPPORT(Anabatic::GCell_Edges); IOSTREAM_POINTER_SUPPORT(Anabatic::GCell_Edges::Locator); +IOSTREAM_POINTER_SUPPORT(Anabatic::Path_Edges); +IOSTREAM_POINTER_SUPPORT(Anabatic::Path_Edges::Locator); #endif // ANABATIC_EDGES_H diff --git a/anabatic/src/anabatic/GCell.h b/anabatic/src/anabatic/GCell.h index e2d0d42b..d4d8712b 100644 --- a/anabatic/src/anabatic/GCell.h +++ b/anabatic/src/anabatic/GCell.h @@ -128,6 +128,8 @@ namespace Anabatic { static uint32_t getDisplayMode (); static void setDisplayMode ( uint32_t ); static Box getBorder ( const GCell*, const GCell* ); + static inline DbU::Unit getMatrixHSide (); + static inline DbU::Unit getMatrixVSide (); public: static GCell* create ( AnabaticEngine* ); public: @@ -168,6 +170,8 @@ namespace Anabatic { 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 Interval getHSide ( int shrink=0 ) const; + inline Interval getVSide ( int shrink=0 ) const; inline Point getCenter () const; inline Box getConstraintBox () const; inline const vector& getWestEdges () const; @@ -299,6 +303,8 @@ namespace Anabatic { private: static Name _extensionName; static uint32_t _displayMode; + static DbU::Unit _matrixHSide; + static DbU::Unit _matrixVSide; Observable _observable; AnabaticEngine* _anabatic; Flags _flags; @@ -324,58 +330,62 @@ namespace Anabatic { }; - inline bool GCell::isHFlat () const { return getYMin() == getYMax(); } - inline bool GCell::isVFlat () const { return getXMin() == getXMax(); } - inline bool GCell::isFlat () const { return isHFlat() or isVFlat(); } - inline bool GCell::isDevice () const { return _flags & Flags::DeviceGCell; } - inline bool GCell::isHChannel () const { return _flags & Flags::HChannelGCell; } - inline bool GCell::isVChannel () const { return _flags & Flags::VChannelGCell; } - inline bool GCell::isStrut () const { return _flags & Flags::StrutGCell; } - inline bool GCell::isAnalog () const { return _flags & Flags::AnalogGCellMask; } - inline bool GCell::isMatrix () const { return _flags & Flags::MatrixGCell; } - inline bool GCell::isRow () const { return _flags & Flags::RowGCellMask; } - inline bool GCell::isIoPad () const { return _flags & Flags::IoPadGCell; } - inline bool GCell::isHRail () const { return _flags & Flags::HRailGCell; } - inline bool GCell::isVRail () const { return _flags & Flags::VRailGCell; } - inline bool GCell::isStdCellRow () const { return _flags & Flags::StdCellRow; } - inline bool GCell::isChannelRow () const { return _flags & Flags::ChannelRow; } - inline bool GCell::isSaturated () const { return _flags & Flags::Saturated; } - inline bool GCell::isInvalidated () const { return _flags & Flags::Invalidated; } - inline Flags GCell::getType () const { return _flags & Flags::GCellTypeMask; } - inline AnabaticEngine* GCell::getAnabatic () const { return _anabatic; } - inline DbU::Unit GCell::getXMin () const { return _xmin; } - inline DbU::Unit GCell::getYMin () const { return _ymin; } - inline Edges GCell::getEdges ( Flags sides ) const { return new GCell_Edges(this,sides); } - inline const vector& GCell::getWestEdges () const { return _westEdges; } - inline const vector& GCell::getEastEdges () const { return _eastEdges; } - inline const vector& GCell::getNorthEdges () const { return _northEdges; } - inline const vector& GCell::getSouthEdges () const { return _southEdges; } - inline GCell* GCell::getWest () const { return _westEdges.empty() ? NULL : _westEdges[0]->getOpposite(this); } - 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 bool GCell::isHFlat () const { return getYMin() == getYMax(); } + inline bool GCell::isVFlat () const { return getXMin() == getXMax(); } + inline bool GCell::isFlat () const { return isHFlat() or isVFlat(); } + inline bool GCell::isDevice () const { return _flags & Flags::DeviceGCell; } + inline bool GCell::isHChannel () const { return _flags & Flags::HChannelGCell; } + inline bool GCell::isVChannel () const { return _flags & Flags::VChannelGCell; } + inline bool GCell::isStrut () const { return _flags & Flags::StrutGCell; } + inline bool GCell::isAnalog () const { return _flags & Flags::AnalogGCellMask; } + inline bool GCell::isMatrix () const { return _flags & Flags::MatrixGCell; } + inline bool GCell::isRow () const { return _flags & Flags::RowGCellMask; } + inline bool GCell::isIoPad () const { return _flags & Flags::IoPadGCell; } + inline bool GCell::isHRail () const { return _flags & Flags::HRailGCell; } + inline bool GCell::isVRail () const { return _flags & Flags::VRailGCell; } + inline bool GCell::isStdCellRow () const { return _flags & Flags::StdCellRow; } + inline bool GCell::isChannelRow () const { return _flags & Flags::ChannelRow; } + inline bool GCell::isSaturated () const { return _flags & Flags::Saturated; } + inline bool GCell::isInvalidated () const { return _flags & Flags::Invalidated; } + inline DbU::Unit GCell::getMatrixHSide () { return _matrixHSide; } + inline DbU::Unit GCell::getMatrixVSide () { return _matrixVSide; } + inline Flags GCell::getType () const { return _flags & Flags::GCellTypeMask; } + inline AnabaticEngine* GCell::getAnabatic () const { return _anabatic; } + inline DbU::Unit GCell::getXMin () const { return _xmin; } + inline DbU::Unit GCell::getYMin () const { return _ymin; } + inline Interval GCell::getHSide ( int shrink ) const { return getSide(Flags::Horizontal,shrink); } + inline Interval GCell::getVSide ( int shrink ) const { return getSide(Flags::Vertical ,shrink); } + inline Edges GCell::getEdges ( Flags sides ) const { return new GCell_Edges(this,sides); } + inline const vector& GCell::getWestEdges () const { return _westEdges; } + inline const vector& GCell::getEastEdges () const { return _eastEdges; } + inline const vector& GCell::getNorthEdges () const { return _northEdges; } + inline const vector& GCell::getSouthEdges () const { return _southEdges; } + inline GCell* GCell::getWest () const { return _westEdges.empty() ? NULL : _westEdges[0]->getOpposite(this); } + 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 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& GCell::getGContacts () const { return _gcontacts; } - inline size_t GCell::getDepth () const { return _depth; } - const vector& GCell::getVSegments () const { return _vsegments; } - inline const vector& GCell::getHSegments () const { return _hsegments; } - inline const vector& GCell::getContacts () const { return _contacts; } - - inline DbU::Unit GCell::getWidth () const { return (getXMax()-getXMin()); } - inline DbU::Unit GCell::getHeight () const { return (getYMax()-getYMin()); } - inline float GCell::getDensity ( size_t depth ) const { return (depth<_depth) ? _densities[depth] : 0.0; } - - inline const GCell::Key& GCell::getKey () const { return _key; } - inline void GCell::setType ( Flags type ) { _flags.reset(Flags::GCellTypeMask); _flags |= (type&Flags::GCellTypeMask); }; - inline void GCell::updateKey ( size_t depth ) { _key.update(depth); } - inline const Flags& GCell::flags () const { return _flags; } - inline Flags& GCell::flags () { return _flags; } + inline GCell* GCell::getUnder ( Point p ) const { return getUnder(p.getX(),p.getY()); } + inline const vector& GCell::getGContacts () const { return _gcontacts; } + inline size_t GCell::getDepth () const { return _depth; } + const vector& GCell::getVSegments () const { return _vsegments; } + inline const vector& GCell::getHSegments () const { return _hsegments; } + inline const vector& GCell::getContacts () const { return _contacts; } + + inline DbU::Unit GCell::getWidth () const { return (getXMax()-getXMin()); } + inline DbU::Unit GCell::getHeight () const { return (getYMax()-getYMin()); } + inline float GCell::getDensity ( size_t depth ) const { return (depth<_depth) ? _densities[depth] : 0.0; } + + inline const GCell::Key& GCell::getKey () const { return _key; } + inline void GCell::setType ( Flags type ) { _flags.reset(Flags::GCellTypeMask); _flags |= (type&Flags::GCellTypeMask); }; + inline void GCell::updateKey ( size_t depth ) { _key.update(depth); } + inline const Flags& GCell::flags () const { return _flags; } + inline Flags& GCell::flags () { return _flags; } inline DbU::Unit GCell::getXMax ( int shrink ) const { return _eastEdges.empty() ? getCell()->getAbutmentBox().getXMax() - shrink diff --git a/anabatic/src/anabatic/NetBuilder.h b/anabatic/src/anabatic/NetBuilder.h index 6721a546..8cf01331 100644 --- a/anabatic/src/anabatic/NetBuilder.h +++ b/anabatic/src/anabatic/NetBuilder.h @@ -203,6 +203,9 @@ namespace Anabatic { virtual bool _do_2G (); virtual bool _do_xG_1Pad (); virtual bool _do_1G_1PinM2 (); + virtual bool _do_xG_1PinM2 (); + virtual bool _do_1G_1PinM3 (); + virtual bool _do_xG_1PinM3 (); virtual bool _do_1G_1M1 (); virtual bool _do_2G_1M1 (); virtual bool _do_1G_xM1 (); @@ -234,7 +237,7 @@ namespace Anabatic { + ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \ + ((pins) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize+PadsBSize)) - // Connexity Name | G|M1|M2|M2|Pad|Pin| + // Connexity Name | G|M1|M2|M3|Pad|Pin| enum ConnexityFlag { Conn_0G = CONNEXITY_VALUE( 0, 0, 0, 0, 0 , 0 ) , Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 ) , Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 ) @@ -257,7 +260,7 @@ namespace Anabatic { , Conn_1G_4M3 = CONNEXITY_VALUE( 1, 0, 0, 4, 0 , 0 ) , Conn_1G_1M1_1M2 = CONNEXITY_VALUE( 1, 1, 1, 0, 0 , 0 ) , Conn_1G_1M1_1M3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 0 ) - // Connexity Name | G|M1|M2|M2|Pad|Pin| + // Connexity Name | G|M1|M2|M3|Pad|Pin| , Conn_2G_1M1 = CONNEXITY_VALUE( 2, 1, 0, 0, 0 , 0 ) , Conn_2G_2M1 = CONNEXITY_VALUE( 2, 2, 0, 0, 0 , 0 ) , Conn_2G_3M1 = CONNEXITY_VALUE( 2, 3, 0, 0, 0 , 0 ) @@ -272,7 +275,7 @@ namespace Anabatic { , Conn_2G_3M3 = CONNEXITY_VALUE( 2, 0, 0, 3, 0 , 0 ) , Conn_2G_4M3 = CONNEXITY_VALUE( 2, 0, 0, 4, 0 , 0 ) , Conn_2G_1M1_1M2 = CONNEXITY_VALUE( 2, 1, 1, 0, 0 , 0 ) - // Connexity Name | G|M1|M2|M2|Pad|Pin| + // Connexity Name | G|M1|M2|M3|Pad|Pin| , Conn_3G_1M1 = CONNEXITY_VALUE( 3, 1, 0, 0, 0 , 0 ) , Conn_3G_2M1 = CONNEXITY_VALUE( 3, 2, 0, 0, 0 , 0 ) , Conn_3G_3M1 = CONNEXITY_VALUE( 3, 3, 0, 0, 0 , 0 ) @@ -283,7 +286,7 @@ namespace Anabatic { , Conn_3G_2M3 = CONNEXITY_VALUE( 3, 0, 0, 2, 0 , 0 ) , Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 ) , Conn_3G_4M3 = CONNEXITY_VALUE( 3, 0, 0, 4, 0 , 0 ) - // Connexity Name | G|M1|M2|M2|Pad|Pin| + // Connexity Name | G|M1|M2|M3|Pad|Pin| , Conn_4G_1M1 = CONNEXITY_VALUE( 4, 1, 0, 0, 0 , 0 ) , Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 0, 0, 0 , 0 ) , Conn_4G_3M1 = CONNEXITY_VALUE( 4, 3, 0, 0, 0 , 0 ) @@ -295,6 +298,10 @@ namespace Anabatic { , Conn_3G_1Pad = CONNEXITY_VALUE( 3, 0, 0, 0, 1 , 0 ) , Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 ) , Conn_2G_1PinM2 = CONNEXITY_VALUE( 2, 0, 1, 0, 0 , 1 ) + , Conn_3G_1PinM2 = CONNEXITY_VALUE( 3, 0, 1, 0, 0 , 1 ) + , Conn_1G_1PinM3 = CONNEXITY_VALUE( 1, 0, 0, 1, 0 , 1 ) + , Conn_2G_1PinM3 = CONNEXITY_VALUE( 2, 0, 0, 1, 0 , 1 ) + , Conn_3G_1PinM3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 1 ) }; #undef CONNEXITY_VALUE diff --git a/anabatic/src/anabatic/NetBuilderVH.h b/anabatic/src/anabatic/NetBuilderVH.h index 90a4a713..43a628b0 100644 --- a/anabatic/src/anabatic/NetBuilderVH.h +++ b/anabatic/src/anabatic/NetBuilderVH.h @@ -32,6 +32,10 @@ namespace Anabatic { virtual void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, uint64_t flags ); virtual AutoContact* doRp_Access ( GCell*, Component*, uint64_t flags ); private: + virtual bool _do_1G_1PinM2 (); + virtual bool _do_xG_1PinM2 (); + virtual bool _do_1G_1PinM3 (); + virtual bool _do_xG_1PinM3 (); virtual bool _do_1G_1M1 (); virtual bool _do_1G_xM1 (); virtual bool _do_2G_1M1 (); diff --git a/bootstrap/Makefile.package b/bootstrap/Makefile.package index 403a900e..c5dca5a5 100644 --- a/bootstrap/Makefile.package +++ b/bootstrap/Makefile.package @@ -38,12 +38,13 @@ build: FORCE esac; \ case "$${X_SCLS}" in \ *"devtoolset"*) \ - cmakeArgs="$${cmakeArgs} -D Boost_NO_SYSTEM_PATHS:STRING=TRUE"; \ - BOOST_INCLUDEDIR="/opt/rh/devtoolset-2/root/usr/include"; \ - BOOST_LIBRARYDIR="/opt/rh/devtoolset-2/root/usr/lib"; \ - export BOOST_INCLUDEDIR BOOST_LIBRARYDIR; \ - echo "** Using $${X_SCLS}."; \ - ;; \ + version="`echo $${X_SCLS} | sed 's,devtoolset-,,'`"; \ + cmakeArgs="$${cmakeArgs} -D Boost_NO_SYSTEM_PATHS:STRING=TRUE"; \ + BOOST_INCLUDEDIR="/opt/rh/devtoolset-$${version}/root/usr/include"; \ + BOOST_LIBRARYDIR="/opt/rh/devtoolset-$${version}/root/usr/lib"; \ + export BOOST_INCLUDEDIR BOOST_LIBRARYDIR; \ + echo "** Using $${X_SCLS}."; \ + ;; \ esac; \ for tool in $(tools); do \ echo "** Building tool $${tool}"; \ diff --git a/bootstrap/build.conf b/bootstrap/build.conf index de43eaeb..da0558b7 100644 --- a/bootstrap/build.conf +++ b/bootstrap/build.conf @@ -14,6 +14,7 @@ projects = [ , { 'name' : "coriolis" , 'tools' : [ "bootstrap" , "lefdef" + , "flute" , "vlsisapd" , "hurricane" , "crlcore" diff --git a/bootstrap/builder/Builder.py b/bootstrap/builder/Builder.py index 0d78e2b5..4e97b8af 100644 --- a/bootstrap/builder/Builder.py +++ b/bootstrap/builder/Builder.py @@ -37,7 +37,7 @@ class Builder: self._clang = False self._noSystemBoost = False self._macports = False - self._devtoolset2 = False + self._devtoolset = 0 self._qt5 = False self._openmp = False self._enableShared = "ON" @@ -66,8 +66,8 @@ class Builder: elif attribute == "macports": self._macports = value if value: self._noSystemBoost = True - elif attribute == "devtoolset2": - self._devtoolset2 = value + elif attribute == "devtoolset": + self._devtoolset = value if value: self._noSystemBoost = True elif attribute == "qt5": self._qt5 = value elif attribute == "openmp": self._openmp = value @@ -132,14 +132,15 @@ class Builder: def _execute ( self, command, error ): - if self._devtoolset2 == True: - print 'Using devtoolset-2 (scl enable devtoolset-2 ...)' + if self._devtoolset: + print 'Using devtoolset-%(v)d (scl enable devtoolset-%(v)d ...)' % {'v':self._devtoolset} commandAsString = '' for i in range(len(command)): if i: commandAsString += ' ' if ' ' in command[i]: commandAsString += '"'+command[i]+'"' else: commandAsString += command[i] - command = [ 'scl', 'enable', 'devtoolset-2', commandAsString ] + command = [ 'scl', 'enable', 'devtoolset-%d' % self._devtoolset + , commandAsString ] #print command sys.stdout.flush () @@ -174,7 +175,10 @@ class Builder: command = [ 'cmake' ] if self._ninja: command += [ "-G", "Ninja" ] - if self._noSystemBoost: command += [ "-D", "Boost_NO_SYSTEM_PATHS:STRING=TRUE" ] + if self._noSystemBoost: command += [ "-D", "Boost_NO_SYSTEM_PATHS:STRING=TRUE" + , "-D", "BOOST_INCLUDEDIR:STRING=/usr/include/boost157" + , "-D", "BOOST_LIBRARYDIR:STRING=/usr/lib/boost157" + ] if self._qt5: command += [ "-D", "WITH_QT5:STRING=TRUE" ] if self._openmp: command += [ "-D", "WITH_OPENMP:STRING=TRUE" ] @@ -182,7 +186,7 @@ class Builder: #, "-D", "BUILD_SHARED_LIBS:STRING=%s" % self.enableShared , "-D", "CMAKE_INSTALL_PREFIX:STRING=%s" % self.installDir , "-D", "CMAKE_INSTALL_DIR:STRING=%s" % cmakeInstallDir - #, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules + #, "-D", "CMAKE_MODULE_PATH:STRING=%s" % cmakeModules , toolSourceDir ] if not os.path.isdir(toolBuildDir): @@ -206,6 +210,8 @@ class Builder: if self._checkDeterminism == 'ON': command += [ "-D", "CHECK_DETERMINISM:STRING=ON" ] command += [ toolSourceDir ] + print self._noSystemBoost + print command self._execute ( command, "Second CMake failed" ) if self._doBuild: @@ -295,9 +301,9 @@ class Builder: if self._clang: self._environment[ 'CC' ] = '/usr/bin/clang' self._environment[ 'CXX' ] = '/usr/bin/clang++' - if self._devtoolset2: - self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/rh/devtoolset-2/root/usr/include' - self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/rh/devtoolset-2/root/usr/lib' + if self._devtoolset: + self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/rh/devtoolset-%d/root/usr/include' % self._devtoolset + self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/rh/devtoolset-%d/root/usr/lib' % self._devtoolset if self._macports: self._environment[ 'BOOST_INCLUDEDIR' ] = '/opt/local/include' self._environment[ 'BOOST_LIBRARYDIR' ] = '/opt/local/lib' @@ -430,8 +436,8 @@ class Builder: , "--define", "_tmppath %s" % self.tmppathDir #, "--define", "_enable_debug_packages 0" , "--with", "binarytar" ] - if self._devtoolset2 == True: - command += [ "--define", "scl devtoolset-2" ] + if self._devtoolset: + command += [ "--define", "scl devtoolset-%d"%self._devtoolset ] command += [ "-ba", "--clean", rpmSpecFile ] self._execute ( command, "Rebuild rpm packages" ) diff --git a/bootstrap/builder/CompileWidget.py b/bootstrap/builder/CompileWidget.py index b5a7e81d..a589e3de 100644 --- a/bootstrap/builder/CompileWidget.py +++ b/bootstrap/builder/CompileWidget.py @@ -139,14 +139,14 @@ class CompileWidget ( QWidget ): if self.conf.rootDir: command += [ '--root=%s'%self.conf.rootDir ] - #if self.options.svnUpdate: command += [ '--svn-update' ] - #if self.options.svnStatus: command += [ '--svn-update' ] - if self.options.enableDoc: command += [ '--doc' ] - if self.options.devtoolset2: command += [ '--devtoolset-2' ] - if self.options.qt5: command += [ '--qt5' ] - if self.options.noCache: command += [ '--no-cache' ] - if self.options.rmBuild: command += [ '--rm-build' ] - if self.options.verbose: command += [ '--verbose' ] + #if self.options.svnUpdate: command += [ '--svn-update' ] + #if self.options.svnStatus: command += [ '--svn-update' ] + if self.options.enableDoc: command += [ '--doc' ] + if self.options.devtoolset: command += [ '--devtoolset-8' ] + if self.options.qt5: command += [ '--qt5' ] + if self.options.noCache: command += [ '--no-cache' ] + if self.options.rmBuild: command += [ '--rm-build' ] + if self.options.verbose: command += [ '--verbose' ] if self.options.make: makeArguments='install '+self.options.threads command += [ '--make=%s'%makeArguments ] diff --git a/bootstrap/builder/OptionsWidget.py b/bootstrap/builder/OptionsWidget.py index eea9759b..7ce71d83 100644 --- a/bootstrap/builder/OptionsWidget.py +++ b/bootstrap/builder/OptionsWidget.py @@ -65,7 +65,7 @@ class OptionsWidget ( QWidget ): #self._svnStatus = QCheckBox( 'SVN Status' ) self._make = QCheckBox( 'Build' ) self._enableDoc = QCheckBox( 'Build Documentation' ) - self._devtoolset2 = QCheckBox( 'Build with devtoolset 2' ) + self._devtoolset = QCheckBox( 'Build with devtoolset 8' ) self._qt5 = QCheckBox( 'Build with Qt 5 (Qt 4 default)' ) self._noCache = QCheckBox( 'Remove previous CMake cache' ) self._rmBuild = QCheckBox( 'Cleanup Build Directory' ) @@ -91,7 +91,7 @@ class OptionsWidget ( QWidget ): vLayout = QVBoxLayout() vLayout.addWidget( self._buildMode ) vLayout.addWidget( self._enableDoc ) - vLayout.addWidget( self._devtoolset2 ) + vLayout.addWidget( self._devtoolset ) vLayout.addWidget( self._qt5 ) vLayout.addWidget( self._noCache ) vLayout.addWidget( self._rmBuild ) @@ -130,7 +130,7 @@ class OptionsWidget ( QWidget ): #def _getSvnStatus ( self ): return self._svnStatus.isChecked() def _getMake ( self ): return self._make.isChecked() def _getEnableDoc ( self ): return self._enableDoc.isChecked() - def _getDevtoolset2 ( self ): return self._devtoolset2.isChecked() + def _getDevtoolset ( self ): return self._devtoolset.isChecked() def _getQt5 ( self ): return self._qt5.isChecked() def _getNoCache ( self ): return self._noCache.isChecked() def _getRmBuild ( self ): return self._rmBuild.isChecked() @@ -143,7 +143,7 @@ class OptionsWidget ( QWidget ): #svnStatus = property( _getSvnStatus ) make = property( _getMake ) enableDoc = property( _getEnableDoc ) - devtoolset2 = property( _getDevtoolset2 ) + devtoolset = property( _getDevtoolset ) qt5 = property( _getQt5 ) noCache = property( _getNoCache ) rmBuild = property( _getRmBuild ) @@ -156,7 +156,7 @@ class OptionsWidget ( QWidget ): #self._svnStatus .setChecked( settings.value('builder/svnStatus').toBool() ) self._make .setChecked( settings.value('builder/make' ).toBool() ) self._enableDoc .setChecked( settings.value('builder/enableDoc').toBool() ) - self._devtoolset2.setChecked( settings.value('builder/devtoolset2').toBool() ) + self._devtoolset .setChecked( settings.value('builder/devtoolset').toBool() ) self._qt5 .setChecked( settings.value('builder/qt5').toBool() ) self._noCache .setChecked( settings.value('builder/noCache' ).toBool() ) self._rmBuild .setChecked( settings.value('builder/rmBuild' ).toBool() ) @@ -176,17 +176,17 @@ class OptionsWidget ( QWidget ): def saveSettings ( self ): settings = QSettings() - #settings.setValue('builder/svnUpdate' , self._svnUpdate .isChecked() ) - #settings.setValue('builder/svnStatus' , self._svnStatus .isChecked() ) - settings.setValue('builder/make' , self._make .isChecked() ) - settings.setValue('builder/enableDoc' , self._enableDoc .isChecked() ) - settings.setValue('builder/devtoolset2', self._devtoolset2.isChecked() ) - settings.setValue('builder/qt5' , self._qt5 .isChecked() ) - settings.setValue('builder/buildMode' , self._buildMode .currentText() ) - settings.setValue('builder/noCache' , self._noCache .isChecked() ) - settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() ) - settings.setValue('builder/verbose' , self._verbose .isChecked() ) - settings.setValue('builder/threads' , self._threads .currentText() ) + #settings.setValue('builder/svnUpdate' , self._svnUpdate .isChecked() ) + #settings.setValue('builder/svnStatus' , self._svnStatus .isChecked() ) + settings.setValue('builder/make' , self._make .isChecked() ) + settings.setValue('builder/enableDoc' , self._enableDoc .isChecked() ) + settings.setValue('builder/devtoolset', self._devtoolset.isChecked() ) + settings.setValue('builder/qt5' , self._qt5 .isChecked() ) + settings.setValue('builder/buildMode' , self._buildMode .currentText() ) + settings.setValue('builder/noCache' , self._noCache .isChecked() ) + settings.setValue('builder/rmBuild' , self._rmBuild .isChecked() ) + settings.setValue('builder/verbose' , self._verbose .isChecked() ) + settings.setValue('builder/threads' , self._threads .currentText() ) for project in self._projects: project.saveToSettings() return diff --git a/bootstrap/ccb.py b/bootstrap/ccb.py index 45faceb8..db7f2223 100755 --- a/bootstrap/ccb.py +++ b/bootstrap/ccb.py @@ -208,7 +208,7 @@ parser.add_option ( "--no-build" , action="store_true" , parser.add_option ( "--no-cache" , action="store_true" , dest="noCache" , help="Remove previous CMake cache before building." ) parser.add_option ( "--rm-build" , action="store_true" , dest="rmBuild" , help="Remove previous build directoty before building." ) parser.add_option ( "--macports" , action="store_true" , dest="macports" , help="Build against MacPorts." ) -parser.add_option ( "--devtoolset-2" , action="store_true" , dest="devtoolset2" , help="Build against TUV Dev Toolset 2." ) +parser.add_option ( "--devtoolset" , action="store" , type="int" , dest="devtoolset" , help="Build against TUV Dev Toolset 8." ) parser.add_option ( "--qt5" , action="store_true" , dest="qt5" , help="Build against Qt 5 (default: Qt 4)." ) parser.add_option ( "--openmp" , action="store_true" , dest="openmp" , help="Enable the use of OpenMP in Gcc." ) parser.add_option ( "--ninja" , action="store_true" , dest="ninja" , help="Use Ninja instead of UNIX Makefile." ) @@ -286,7 +286,7 @@ else: if options.ninja: builder.ninja = True if options.clang: builder.clang = True if options.macports: builder.macports = True - if options.devtoolset2: builder.devtoolset2 = True + if options.devtoolset: builder.devtoolset = options.devtoolset if options.qt5: builder.qt5 = True if options.openmp: builder.openmp = True if options.makeArguments: builder.makeArguments = options.makeArguments diff --git a/bootstrap/cmake_modules/FindBootstrap.cmake b/bootstrap/cmake_modules/FindBootstrap.cmake index fff95462..5720a67d 100644 --- a/bootstrap/cmake_modules/FindBootstrap.cmake +++ b/bootstrap/cmake_modules/FindBootstrap.cmake @@ -85,8 +85,8 @@ set(ADDTIONAL_FLAGS "") set(CXX_STANDARD "c++11") endif() - set(CMAKE_C_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) - set(CMAKE_C_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE) + set(CMAKE_C_FLAGS_DEBUG " -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) + set(CMAKE_C_FLAGS_RELEASE " -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE) set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE) @@ -294,10 +294,10 @@ # macro(setup_sysconfdir INSTALLDIR) message("-- Checking installation directory <${INSTALLDIR}>") - string(REGEX MATCH "^/opt/rh/devtoolset-2/root/usr$" IS_OPT_RH ${INSTALLDIR}) + string(REGEX MATCH "^/opt/rh/devtoolset-[0-9]+/root" IS_OPT_RH ${INSTALLDIR}) if(IS_OPT_RH) - message("-- Using devtoolset-2 install tree /opt/rh/devtoolset-2/root/etc.") - set(SYS_CONF_DIR "/opt/rh/devtoolset-2/root/etc" CACHE STRING "System configuration directory (/etc)" FORCE) + message("-- Using devtoolset-X install tree ${IS_OPT_RH}/etc.") + set(SYS_CONF_DIR ${IS_OPT_RH} CACHE STRING "System configuration directory (/etc)" FORCE) else() string(REGEX MATCH "^/usr$" IS_USR ${INSTALLDIR}) string(REGEX MATCH "^/opt$" IS_OPT ${INSTALLDIR}) diff --git a/bootstrap/coriolisEnv.py b/bootstrap/coriolisEnv.py index 037e09f0..dea6d07e 100755 --- a/bootstrap/coriolisEnv.py +++ b/bootstrap/coriolisEnv.py @@ -41,7 +41,7 @@ def scrubPath ( pathName ): def guessOs (): - useDevtoolset2 = False + useDevtoolset = False osSlsoc7x_64 = re.compile (".*Linux.*el7.*x86_64.*") osSlsoc6x_64 = re.compile (".*Linux.*el6.*x86_64.*") osSlsoc6x = re.compile (".*Linux.*(el|slsoc)6.*") @@ -74,10 +74,10 @@ def guessOs (): elif osSlsoc6x_64.match(lines[0]): osType = "Linux.slsoc6x_64" libDir = "lib64" - useDevtoolset2 = True + useDevtoolset = True elif osSlsoc6x.match(lines[0]): osType = "Linux.slsoc6x" - useDevtoolset2 = True + useDevtoolset = True elif osSLSoC5x_64.match(lines[0]): osType = "Linux.SLSoC5x_64" libDir = "lib64" @@ -132,12 +132,12 @@ def guessOs (): print " (using: \"%s\")" % osType ldLibraryPath = os.getenv('LD_LIBRARY_PATH') - if ldLibraryPath and 'devtoolset' in ldLibraryPath: useDevtoolset2 = False + if ldLibraryPath and 'devtoolset' in ldLibraryPath: useDevtoolset = False if libDir == 'lib64' and not os.path.exists('/usr/lib64'): libDir = 'lib' - return (osType,libDir,useDevtoolset2) + return (osType,libDir,useDevtoolset) def guessShell (): @@ -170,7 +170,7 @@ def guessShell (): if __name__ == "__main__": - osType,libDir,useDevtoolset2 = guessOs() + osType,libDir,useDevtoolset = guessOs() buildType = "Release" linkType = "Shared" rootDir = None @@ -226,6 +226,8 @@ if __name__ == "__main__": # 'setenv STRATUS_MAPPING_NAME "%(SYSCONF_DIR)s/stratus2sxlib.xml";' \ + reDevtoolset = re.compile( r'/opt/rh/devtoolset-(?P\d+)/root/etc/coriolis2.*' ) + buildDir = buildType + "." + linkType scriptDir = os.path.dirname ( os.path.abspath(__file__) ) #print "echo \"Script Location: %s\";" % scriptDir, @@ -233,26 +235,29 @@ if __name__ == "__main__": coriolisTop = "/usr" sysconfDir = scriptDir shellMessage = "Using system-wide Coriolis 2 (/usr)" - elif scriptDir.startswith("/opt/rh/devtoolset-2/root/etc/coriolis2"): - coriolisTop = "/opt/rh/devtoolset-2/root/usr" - sysconfDir = scriptDir - shellMessage = "Using system-wide devtoolset-2 Coriolis 2 (/opt/rh/devtoolset-2/root/usr)" - elif scriptDir.startswith(os.getenv("HOME")+"/nightly/coriolis-2.x/"): - rootDir = os.getenv("HOME") + "/nightly/coriolis-2.x" - coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir ) - sysconfDir = scriptDir - shellMessage = "Using Nightly build Coriolis 2 (%s)" % coriolisTop - elif scriptDir.startswith("/users/outil/coriolis/coriolis-2.x/") \ - or scriptDir.startswith("/soc/coriolis2/"): - coriolisTop = "/soc/coriolis2" - sysconfDir = coriolisTop + "/etc/coriolis2" - shellMessage = "Using SoC network-wide Coriolis 2 (/soc/coriolis2)" else: - if not rootDir: - rootDir = os.getenv("HOME") + "/coriolis-2.x" - coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir ) - sysconfDir = coriolisTop + "/etc/coriolis2" - shellMessage = "Using user-selected Coriolis 2 (%s)" % rootDir + m = reDevtoolset.match( scriptDir ) + if m: + coriolisTop = "/opt/rh/devtoolset-%d/root/usr" % m.group('version') + sysconfDir = scriptDir + shellMessage = "Using system-wide devtoolset-%(v)d Coriolis 2 (/opt/rh/devtoolset-%(v)d/root/usr)" \ + % { 'v':m.group('version') } + elif scriptDir.startswith(os.getenv("HOME")+"/nightly/coriolis-2.x/"): + rootDir = os.getenv("HOME") + "/nightly/coriolis-2.x" + coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir ) + sysconfDir = scriptDir + shellMessage = "Using Nightly build Coriolis 2 (%s)" % coriolisTop + elif scriptDir.startswith("/users/outil/coriolis/coriolis-2.x/") \ + or scriptDir.startswith("/soc/coriolis2/"): + coriolisTop = "/soc/coriolis2" + sysconfDir = coriolisTop + "/etc/coriolis2" + shellMessage = "Using SoC network-wide Coriolis 2 (/soc/coriolis2)" + else: + if not rootDir: + rootDir = os.getenv("HOME") + "/coriolis-2.x" + coriolisTop = "%s/%s/%s/install" % ( rootDir, osType, buildDir ) + sysconfDir = coriolisTop + "/etc/coriolis2" + shellMessage = "Using user-selected Coriolis 2 (%s)" % rootDir if osType.startswith("Cygwin"): strippedPath = "%s/%s:%s" % ( coriolisTop, libDir, strippedPath ) @@ -304,10 +309,10 @@ if __name__ == "__main__": if isBourneShell: shellScript = shellScriptSh else: shellScript = shellScriptCsh - if useDevtoolset2: + if useDevtoolset: shellScript += \ - ' echo "Launching a devtoolset-2 subshell though scl (CTRL+D to exit).";' \ - ' scl enable devtoolset-2 %(SHELL)s' + ' echo "Launching a devtoolset-8 subshell though scl (CTRL+D to exit).";' \ + ' scl enable devtoolset-8 %(SHELL)s' evalScript = shellScript % { "PATH" : strippedPath , "LD_LIBRARY_PATH" : strippedLibraryPath diff --git a/bootstrap/socInstaller.py b/bootstrap/socInstaller.py index 9ef2bbd3..11ba8ae0 100755 --- a/bootstrap/socInstaller.py +++ b/bootstrap/socInstaller.py @@ -499,11 +499,11 @@ try: [ ( conf.targets['SL7_64'], buildCommand % (3,conf.debugArg) , conf.fds['build' ] ) , ( conf.targets['SL7_64'], buildCommand % (1,conf.debugArg+' --doc') , conf.fds['build' ] ) , ( conf.targets['SL7_64'], benchsCommand , conf.fds['benchs'] ) - , ( conf.targets['SL6_64'], buildCommand % (6,conf.debugArg+' --devtoolset-2') , conf.fds['build' ] ) - , ( conf.targets['SL6_64'], buildCommand % (1,conf.debugArg+' --devtoolset-2 --doc'), conf.fds['build' ] ) + , ( conf.targets['SL6_64'], buildCommand % (6,conf.debugArg+' --devtoolset-8') , conf.fds['build' ] ) + , ( conf.targets['SL6_64'], buildCommand % (1,conf.debugArg+' --devtoolset-8 --doc'), conf.fds['build' ] ) , ( conf.targets['SL6_64'], benchsCommand , conf.fds['benchs'] ) - , ( conf.targets['SL6'] , buildCommand % (2,conf.debugArg+' --devtoolset-2') , conf.fds['build' ] ) - , ( conf.targets['SL6'] , buildCommand % (1,conf.debugArg+' --devtoolset-2 --doc'), conf.fds['build' ] ) + , ( conf.targets['SL6'] , buildCommand % (2,conf.debugArg+' --devtoolset-8') , conf.fds['build' ] ) + , ( conf.targets['SL6'] , buildCommand % (1,conf.debugArg+' --devtoolset-8 --doc'), conf.fds['build' ] ) , ( conf.targets['SL6'] , benchsCommand , conf.fds['benchs'] ) ] diff --git a/bora/CMakeLists.txt b/bora/CMakeLists.txt index a05c86b9..d834b59c 100644 --- a/bora/CMakeLists.txt +++ b/bora/CMakeLists.txt @@ -23,6 +23,7 @@ find_package(PythonSitePackages REQUIRED) find_package(LEFDEF REQUIRED) find_package(VLSISAPD REQUIRED) + find_package(FLUTE REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) find_package(ANABATIC REQUIRED) diff --git a/bora/src/CMakeLists.txt b/bora/src/CMakeLists.txt index bdaef0b0..589c47be 100644 --- a/bora/src/CMakeLists.txt +++ b/bora/src/CMakeLists.txt @@ -85,6 +85,7 @@ ${CONFIGURATION_LIBRARY} ${CIF_LIBRARY} ${AGDS_LIBRARY} + ${FLUTE_LIBRARIES} ${LEFDEF_LIBRARIES} ${OA_LIBRARIES} ${QWT_LIBRARY} diff --git a/coloquinte/src/legalizer.cxx b/coloquinte/src/legalizer.cxx index 31485144..439296e3 100644 --- a/coloquinte/src/legalizer.cxx +++ b/coloquinte/src/legalizer.cxx @@ -2,6 +2,7 @@ #include "coloquinte/legalizer.hxx" #include "coloquinte/optimization_subproblems.hxx" +#include #include #include #include @@ -272,7 +273,8 @@ std::vector good_legalize( } else{ // If it is a fixed cell, we use fixed locations - throw std::runtime_error("I don't handle fucking macros\n"); + std::cerr << "cell.nbr_rows:" << cell.nbr_rows << std::endl; + throw std::runtime_error("I don't handle fucking macros (good_legalize)\n"); } }; @@ -330,7 +332,7 @@ std::vector good_legalize( } } else{ - throw std::runtime_error("I don't handle fucking macros\n"); + throw std::runtime_error("I don't handle fucking macros (here)\n"); } } } diff --git a/crlcore/etc/45/ispd18/alliance.conf b/crlcore/etc/45/ispd18/alliance.conf new file mode 100644 index 00000000..c15196ea --- /dev/null +++ b/crlcore/etc/45/ispd18/alliance.conf @@ -0,0 +1,39 @@ +# -*- Mode:Python; explicit-buffer-name: "alliance.conf" -*- + +import os +from helpers.Alliance import AddMode +from helpers.Alliance import Gauge + + +allianceTop = None +if os.environ.has_key('ALLIANCE_TOP'): + allianceTop = os.environ['ALLIANCE_TOP'] + if not os.path.isdir(allianceTop): + allianceTop = None + +if not allianceTop: allianceTop = '/soc/alliance' + +cellsTop = allianceTop+'/cells/' + + +allianceConfig = \ + ( ( 'CATALOG' , 'CATAL') + , ( 'WORKING_LIBRARY' , '.') + , ( 'SYSTEM_LIBRARY' , ( (cellsTop+'/nsxlib' , Environment.Append) + , (cellsTop+'/mpxlib' , Environment.Append)) ) + , ( 'SCALE_X' , 100) + , ( 'IN_LO' , 'vst') + , ( 'IN_PH' , 'ap') + , ( 'OUT_LO' , 'vst') + , ( 'OUT_PH' , 'ap') + , ( 'POWER' , 'vdd') + , ( 'GROUND' , 'vss') + , ( 'CLOCK' , '^ck.*') + , ( 'BLOCKAGE' , '^blockage[Nn]et*') + , ( 'PAD' , '.*_mpx$') + # The following are only read by the Alliance tool wrappers. + , ( 'ALLIANCE_TOP' , allianceTop) + , ( 'MBK_TARGET_LIB' , cellsTop+'/msxlib') + , ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/scn6m_deep_09.rds') + , ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds') + ) diff --git a/crlcore/etc/45/ispd18/analog.conf b/crlcore/etc/45/ispd18/analog.conf new file mode 100644 index 00000000..e8bc341d --- /dev/null +++ b/crlcore/etc/45/ispd18/analog.conf @@ -0,0 +1,10 @@ +# -*- Mode:Python; explicit-buffer-name: "analog.conf" -*- + +import helpers + + +parametersTable = \ + ( ('analog.techno' , TypeString, 'Analog_technology_is_disabled', + { 'flags':Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist } ) + , ('analog.devices', TypeString, helpers.technoDir+'/devices.conf' ) + ) diff --git a/crlcore/etc/45/ispd18/display.conf b/crlcore/etc/45/ispd18/display.conf new file mode 100644 index 00000000..c17aea70 --- /dev/null +++ b/crlcore/etc/45/ispd18/display.conf @@ -0,0 +1,11 @@ +# -*- Mode:Python; explicit-buffer-name: "display.conf" -*- + +import helpers + +# Provides standard settings for: +# - +# - + +scale = 0.5 + +execfile( helpers.sysConfDir+'/common/display.conf' ) diff --git a/crlcore/etc/45/ispd18/etesian.conf b/crlcore/etc/45/ispd18/etesian.conf new file mode 100644 index 00000000..333ec4c5 --- /dev/null +++ b/crlcore/etc/45/ispd18/etesian.conf @@ -0,0 +1,13 @@ +# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/etesian.conf' ) + +parametersTable = helpers.overload \ + ( parametersTable + , ( ('etesian.feedNames', TypeString, 'FILL' ) + , ('etesian.cell.zero', TypeString, 'missing_tie_low' ) + , ('etesian.cell.one' , TypeString, 'missing_tie_high') + ) + ) diff --git a/crlcore/etc/45/ispd18/hMetis.conf b/crlcore/etc/45/ispd18/hMetis.conf new file mode 100644 index 00000000..1336de6c --- /dev/null +++ b/crlcore/etc/45/ispd18/hMetis.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "hMetis.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/hMetis.conf' ) diff --git a/crlcore/etc/45/ispd18/kite.conf b/crlcore/etc/45/ispd18/kite.conf new file mode 100644 index 00000000..7bddb4f7 --- /dev/null +++ b/crlcore/etc/45/ispd18/kite.conf @@ -0,0 +1,68 @@ +# -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- + +import helpers +from helpers import l, u, n + +# Contains the layout (shared by all technologies). +execfile( helpers.sysConfDir+'/common/kite.conf' ) + + +parametersTable = \ + ( ('lefImport.minTerminalWidth' ,TypeDouble ,0.065 ) + , ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters. + , ("katabatic.saturateRatio" ,TypePercentage,90 ) + , ("katabatic.saturateRp" ,TypeInt ,10 ) + , ('katabatic.topRoutingLayer' ,TypeString , 'metal9') + , ('anabatic.routingGauge' ,TypeString , 'ispd18') + , ('crlcore.groundName' ,TypeString , 'VSS' ) + , ('crlcore.powerName' ,TypeString , 'VDD' ) + # Kite parameters. + , ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } ) + , ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } ) + , ("kite.eventsLimit" ,TypeInt ,4000002 ) + , ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } ) + , ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) + , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) + , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + # Anabatic parameters are temporarily hosted here. + , ("anabatic.edgeLength" ,TypeInt ,24 ) + , ("anabatic.edgeWidth" ,TypeInt ,4 ) + , ("anabatic.edgeCostH" ,TypeDouble ,9.0 ) + , ("anabatic.edgeCostK" ,TypeDouble ,-10.0 ) + , ("anabatic.edgeHScaling" ,TypeDouble ,1.0 ) + , ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } ) + , ("anabatic.gcell.displayMode" ,TypeEnumerate ,1 + , { 'values':( ("Boundary" , 1) + , ("Density" , 2) ) } + ) + ) + + +# Format of routingGaugesTable (dictionary): +# A list of entry of the form: +# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width, obs_dw) ) + +routingGaugesTable = {} + +routingGaugesTable['ispd18'] = \ + ( ( 'symbolic', False ) + , ( 'metal1' , ( Gauge.Horizontal, Gauge.PinOnly, 0, 0.0, u(0.095), u(0.190), u(0.060), u(0.070), u(7) ) ) + , ( 'metal2' , ( Gauge.Vertical , Gauge.Default, 1, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) ) + , ( 'metal3' , ( Gauge.Horizontal, Gauge.Default, 2, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) ) + , ( 'metal4' , ( Gauge.Vertical , Gauge.Default, 3, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) ) + , ( 'metal5' , ( Gauge.Horizontal, Gauge.Default, 4, 0.0, u(0.100), u(0.200), u(0.070), u(0.070), u(8) ) ) + , ( 'metal6' , ( Gauge.Vertical , Gauge.Default, 5, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) ) + , ( 'metal7' , ( Gauge.Horizontal, Gauge.Default, 6, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) ) + , ( 'metal8' , ( Gauge.Vertical , Gauge.Default, 7, 0.0, u(0.100), u(0.200), u(0.070), u(0.360), u(8) ) ) + , ( 'metal9' , ( Gauge.Horizontal, Gauge.Default, 8, 0.0, u(0.475), u(0.330), u(0.070), u(0.360), u(8) ) ) + ) + + +# Format of cellGaugesTable (dictionary): +# A list of entry of the form: +# ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) + +cellGaugesTable = {} +cellGaugesTable['ispd18'] = ('metal2', u(0.2), u(1.71), u(0.2)) + diff --git a/crlcore/etc/45/ispd18/mauka.conf b/crlcore/etc/45/ispd18/mauka.conf new file mode 100644 index 00000000..9e3b89a4 --- /dev/null +++ b/crlcore/etc/45/ispd18/mauka.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "mauka.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/mauka.conf' ) diff --git a/crlcore/etc/45/ispd18/misc.conf b/crlcore/etc/45/ispd18/misc.conf new file mode 100644 index 00000000..23e41634 --- /dev/null +++ b/crlcore/etc/45/ispd18/misc.conf @@ -0,0 +1,9 @@ +# -*- Mode:Python; explicit-buffer-name: "misc.conf" -*- + +import helpers + +# Provides standard settings for: +# # - +# # - +# +execfile( helpers.sysConfDir+'/common/misc.conf' ) diff --git a/crlcore/etc/45/ispd18/nimbus.conf b/crlcore/etc/45/ispd18/nimbus.conf new file mode 100644 index 00000000..df8b61ff --- /dev/null +++ b/crlcore/etc/45/ispd18/nimbus.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "nimbus.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/nimbus.conf' ) diff --git a/crlcore/etc/45/ispd18/patterns.conf b/crlcore/etc/45/ispd18/patterns.conf new file mode 100644 index 00000000..9242ac3d --- /dev/null +++ b/crlcore/etc/45/ispd18/patterns.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "patterns.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/patterns.conf' ) diff --git a/crlcore/etc/45/ispd18/plugins.conf b/crlcore/etc/45/ispd18/plugins.conf new file mode 100644 index 00000000..6af21f6b --- /dev/null +++ b/crlcore/etc/45/ispd18/plugins.conf @@ -0,0 +1,27 @@ +# -*- Mode:Python; explicit-buffer-name: "plugins.conf" -*- + +import helpers + +# Contains the layout (shared by all technologies). +#execfile( helpers.sysConfDir+'/common/plugins.conf' ) + + +# WARNING: Those values have not been adjusted yet for this technologies. +# Must be done. +# +# Parameters for chip plugin. +parametersTable = \ + ( ("chip.block.rails.count" , TypeInt , 5 ) + , ("chip.block.rails.hWidth" , TypeInt , 24 ) + , ("chip.block.rails.vWidth" , TypeInt , 24 ) + , ("chip.block.rails.hSpacing" , TypeInt , 12 ) + , ("chip.block.rails.vSpacing" , TypeInt , 12 ) + , ('chip.pad.pck' , TypeString, 'pck_mpx') + , ('chip.pad.pvddick' , TypeString, 'pvddick_mpx') + , ('chip.pad.pvssick' , TypeString, 'pvssick_mpx') + , ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx') + , ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx') + , ('clockTree.minimumSide' , TypeInt , 1000) + , ('clockTree.buffer' , TypeString, 'buf_x2') + , ('clockTree.placerEngine' , TypeString, 'Etesian') + ) diff --git a/crlcore/etc/45/ispd18/stratus1.conf b/crlcore/etc/45/ispd18/stratus1.conf new file mode 100644 index 00000000..8afa3b66 --- /dev/null +++ b/crlcore/etc/45/ispd18/stratus1.conf @@ -0,0 +1,13 @@ +# -*- Mode:Python; explicit-buffer-name: "stratus1.conf" -*- + +import helpers + + +# Status1 parameters. +parametersTable = \ + ( ("stratus1.format" , TypeString, "vst") + , ("stratus1.simulator" , TypeString, "asimut") + ,) + + +execfile( helpers.sysConfDir+'/common/stratus1.conf' ) diff --git a/crlcore/etc/45/ispd18/technology.conf b/crlcore/etc/45/ispd18/technology.conf new file mode 100644 index 00000000..6bc44f66 --- /dev/null +++ b/crlcore/etc/45/ispd18/technology.conf @@ -0,0 +1,148 @@ +# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- +# +# FreePDK 45 nanometers. +# +# Provides standard settings for: +# - +# - +# - +# - + +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno + +initTechno( { 'name' : 'ispd18' + , 'precision' : 2 + , 'gridValue' : 0.0005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 10 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 1.0 + } ) + +# Contains the layers +execfile( helpers.sysConfDir+'/common/technology.conf' ) + + +# Format of : +# Each entry is a pair of (string, value). +# * string: a synthetic way to designate the real or symbolic layer on +# which it applies, an optional sub layer (BasicLayer) in case +# where there is more than one, and the dimension name. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. + +layersExtensionsTable = symbolicLayersExtensionsTable + \ + [ ('metal1.minimalSpacing' , u( 0.1 )) + , ('metal2.minimalSpacing' , u( 0.15 )) + , ('metal3.minimalSpacing' , u( 0.15 )) + , ('metal4.minimalSpacing' , u( 0.15 )) + , ('metal5.minimalSpacing' , u( 0.15 )) + , ('metal6.minimalSpacing' , u( 0.15 )) + , ('metal7.minimalSpacing' , u( 0.15 )) + , ('metal8.minimalSpacing' , u( 0.15 )) + , ('metal9.minimalSpacing' , u( 0.15 )) + , ('metal10.minimalSpacing' , u( 0.15 )) + + # VIAs (i.e. Metal <--> Metal) (real). + , ('via12.minimum.side' , u(0.070)) + , ('via12.metal1.enclosure' , (u(0.030 ), u(0.0 )) ) + , ('via12.metal2.enclosure' , (u(0.0 ), u(0.030)) ) + , ('via23.minimum.side' , u(0.070 )) + , ('via23.metal2.enclosure' , (u(0.0 ), u(0.030)) ) + , ('via23.metal3.enclosure' , (u(0.030 ), u(0.0 )) ) + , ('via34.minimum.side' , u(0.070)) + , ('via34.metal3.enclosure' , (u(0.030 ), u(0.0 )) ) + , ('via34.metal4.enclosure' , (u(0.0 ), u(0.030)) ) + , ('via45.minimum.side' , u(0.070 )) + , ('via45.metal4.enclosure' , (u(0.0 ), u(0.030)) ) + , ('via45.metal5.enclosure' , (u(0.030 ), u(0.0 )) ) + , ('via56.minimum.side' , u(0.070)) + , ('via56.metal5.enclosure' , (u(0.030 ), u(0.0 )) ) + , ('via56.metal6.enclosure' , (u(0.0 ), u(0.030)) ) + , ('via67.minimum.side' , u(0.360)) + , ('via67.metal6.enclosure' , (u(0.02 ), u(0.08 )) ) + , ('via67.metal7.enclosure' , (u(0.08 ), u(0.02 )) ) + , ('via78.minimum.side' , u(0.360)) + , ('via78.metal7.enclosure' , (u(0.08 ), u(0.02 )) ) + , ('via78.metal8.enclosure' , (u(0.02 ), u(0.08 )) ) + , ('via89.minimum.side' , u(0.360)) + , ('via89.metal8.enclosure' , (u(0.02 ), u(0.08 )) ) + , ('via89.metal9.enclosure' , (u(0.08 ), u(0.02 )) ) + ] + + +# Table guessed from the Cadence configuration files: +# FreePDK45/ncsu_basekit/techfile/FreePDK45.tf +# +# Format of an entry in the table: +# (Symbolic_Name, CIF_Name, GDSII_Number) +#gdsLayersTable = \ +# ( ("pWell" , "CWN" , 2, 0) +# , ("nWell" , "CWP" , 3, 0) +# , ("active" , "CAA" , 1, 0) +# , ("pImplant", "CSP" , 5, 0) +# , ("nImplant", "CSN" , 4, 0) +# , ("poly" , "CPG" , 9, 0) +# , ("cut0" , "CCC" , 10, 0) +# , ("metal1" , "CM1" , 11, 0) +# , ("cut1" , "CV1" , 12, 0) +# , ("metal2" , "CM2" , 13, 0) +# , ("cut2" , "CV2" , 14, 0) +# , ("metal3" , "CM3" , 15, 0) +# , ("cut3" , "CV3" , 16, 0) +# , ("metal4" , "CM4" , 17, 0) +# , ("cut4" , "CV4" , 18, 0) +# , ("metal5" , "CM5" , 19, 0) +# , ("cut5" , "CV5" , 20, 0) +# , ("metal6" , "CM6" , 21, 0) +# , ("cut6" , "CV6" , 22, 0) +# , ("metal7" , "CM7" , 23, 0) +# , ("cut7" , "CV7" , 24, 0) +# , ("metal8" , "CM8" , 25, 0) +# , ("cut8" , "CV8" , 26, 0) +# , ("metal9" , "CM9" , 27, 0) +# , ("cut9" , "CV9" , 28, 0) +# , ("metal10" , "CM10" , 29, 0) +# ) + + +# Table guessed from the GDSII layouts of the cells. +# FreePDK45/osu_soc/lib/source/gds/*.gds +# +# Format of an entry in the table: +# (Symbolic_Name, CIF_Name, GDSII_Number) +gdsLayersTable = \ + ( ("pWell" , "CWN" , 2, 0) + , ("nWell" , "CWP" , 1, 0) + , ("active" , "CAA" , 5, 0) + , ("pImplant", "CSP" , 8, 0) + , ("nImplant", "CSN" , 7, 0) + , ("poly" , "CPG" , 15, 0) + , ("cut0" , "CCC" , 16, 0) + , ("metal1" , "CM1" , 21, 0) + , ("cut1" , "CV1" , 22, 0) + , ("metal2" , "CM2" , 23, 0) + , ("cut2" , "CV2" , 24, 0) + , ("metal3" , "CM3" , 25, 0) + , ("cut3" , "CV3" , 26, 0) + , ("metal4" , "CM4" , 27, 0) + , ("cut4" , "CV4" , 28, 0) + , ("metal5" , "CM5" , 29, 0) + , ("cut5" , "CV5" , 30, 0) + , ("metal6" , "CM6" , 31, 0) + , ("cut6" , "CV6" , 32, 0) + , ("metal7" , "CM7" , 33, 0) + , ("cut7" , "CV7" , 34, 0) + , ("metal8" , "CM8" , 35, 0) + , ("cut8" , "CV8" , 36, 0) + , ("metal9" , "CM9" , 37, 0) + , ("cut9" , "CV9" , 38, 0) + , ("metal10" , "CM10" , 39, 0) + ) diff --git a/crlcore/etc/common/display.conf b/crlcore/etc/common/display.conf index cde60d96..d0832f59 100644 --- a/crlcore/etc/common/display.conf +++ b/crlcore/etc/common/display.conf @@ -403,7 +403,7 @@ stylesTable = \ , (Drawing, 'gmetalh' , { 'color':'128,255,200', 'pattern':'light_antihash0.8' , 'border':1 }) , (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 }) - , (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4 }) + , (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':2 }) + , (Drawing, 'Anabatic::GCell', { 'color':'Black' , 'pattern':'0000000000000000', 'border':2, 'threshold':0.80*scale }) ) ) diff --git a/crlcore/etc/symbolic/cmos/analog.conf b/crlcore/etc/symbolic/cmos/analog.conf index 33cdd8d7..4d4cf6a2 100644 --- a/crlcore/etc/symbolic/cmos/analog.conf +++ b/crlcore/etc/symbolic/cmos/analog.conf @@ -1,4 +1,4 @@ -# -*- Mode:Python; explicit-buffer-name: "analog.conf" -*- +# -*- Mode:Python; explicit-buffer-name: "analog.conf" -*- import helpers diff --git a/crlcore/etc/symbolic/cmos/kite.conf b/crlcore/etc/symbolic/cmos/kite.conf index e9c70335..b020336e 100644 --- a/crlcore/etc/symbolic/cmos/kite.conf +++ b/crlcore/etc/symbolic/cmos/kite.conf @@ -13,7 +13,6 @@ parametersTable = \ , ("katabatic.saturateRatio" ,TypePercentage,80 ) , ("katabatic.saturateRp" ,TypeInt ,8 ) , ('katabatic.topRoutingLayer' ,TypeString , 'METAL5') - , ('anabatic.routingGauge' ,TypeString , 'sxlib' ) # Kite parameters. , ("kite.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) , ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) @@ -23,17 +22,31 @@ parametersTable = \ , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) - # Anabatic parameters are temporarily hosted here. + # Anabatic & Katana parameters are temporarily hosted here. + , ('anabatic.routingGauge' ,TypeString , 'sxlib' ) + , ("anabatic.globalLengthThreshold" ,TypeInt ,1450 ) + , ("anabatic.saturateRatio" ,TypePercentage,80 ) + , ("anabatic.saturateRp" ,TypeInt ,8 ) + , ('anabatic.topRoutingLayer' ,TypeString , 'METAL5') , ("anabatic.edgeLength" ,TypeInt ,24 ) , ("anabatic.edgeWidth" ,TypeInt ,4 ) - , ("anabatic.edgeCostH" ,TypeDouble ,9.0 ) - , ("anabatic.edgeCostK" ,TypeDouble ,-10.0 ) + , ("anabatic.edgeCostH" ,TypeDouble ,19.0 ) + , ("anabatic.edgeCostK" ,TypeDouble ,-60.0 ) , ("anabatic.edgeHScaling" ,TypeDouble ,1.0 ) , ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } ) , ("anabatic.gcell.displayMode" ,TypeEnumerate ,1 , { 'values':( ("Boundary" , 1) , ("Density" , 2) ) } ) + , ("katana.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) + , ("katana.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) + , ("katana.eventsLimit" ,TypeInt ,4000002 ) + , ("katana.ripupCost" ,TypeInt ,3 , { 'min':0 } ) + , ("katana.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) + , ("katana.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) + , ("katana.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ("katana.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ('chip.padCoreSide' ,TypeString ,'South' ) ) @@ -64,4 +77,5 @@ routingGaugesTable['sxlib-2M'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['sxlib'] = ('metal2', l(5.0), l(50.0), l(5.0)) +cellGaugesTable['sxlib'] = ('metal2', l(5.0), l( 50.0), l( 5.0)) +cellGaugesTable['pxlib'] = ('metal2', l(5.0), l(400.0), l(200.0)) diff --git a/crlcore/etc/symbolic/cmos/technology.conf b/crlcore/etc/symbolic/cmos/technology.conf index 032ea1b7..8bdfb8ca 100644 --- a/crlcore/etc/symbolic/cmos/technology.conf +++ b/crlcore/etc/symbolic/cmos/technology.conf @@ -14,7 +14,7 @@ from helpers.Technology import initTechno # - # - -initTechno( { 'name' : 'cmos' +initTechno( { 'name' : 'cmos45' , 'precision' : 2 , 'gridValue' : 0.005 , 'gridUnit' : DbU.UnitPowerMicro diff --git a/crlcore/etc/symbolic/cmos45/alliance.conf b/crlcore/etc/symbolic/cmos45/alliance.conf new file mode 100644 index 00000000..1fa575f1 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/alliance.conf @@ -0,0 +1,39 @@ +# -*- Mode:Python; explicit-buffer-name: "alliance.conf" -*- + +import os +from helpers.Alliance import AddMode +from helpers.Alliance import Gauge + + +allianceTop = None +if os.environ.has_key('ALLIANCE_TOP'): + allianceTop = os.environ['ALLIANCE_TOP'] + if not os.path.isdir(allianceTop): + allianceTop = None + +if not allianceTop: allianceTop = '/soc/alliance' + +cellsTop = allianceTop+'/cells/' + + +allianceConfig = \ + ( ( 'CATALOG' , 'CATAL') + , ( 'WORKING_LIBRARY' , '.') + , ( 'SYSTEM_LIBRARY' , ( (cellsTop+'/nsxlib' , Environment.Append) + , (cellsTop+'/mpxlib' , Environment.Append)) ) + , ( 'SCALE_X' , 100) + , ( 'IN_LO' , 'vst') + , ( 'IN_PH' , 'ap') + , ( 'OUT_LO' , 'vst') + , ( 'OUT_PH' , 'ap') + , ( 'POWER' , 'vdd') + , ( 'GROUND' , 'vss') + , ( 'CLOCK' , '^ck.*') + , ( 'BLOCKAGE' , '^blockage[Nn]et*') + , ( 'PAD' , '.*_mpx$') + # The following are only read by the Alliance tool wrappers. + , ( 'ALLIANCE_TOP' , allianceTop) + , ( 'MBK_TARGET_LIB' , cellsTop+'/msxlib') + , ( 'RDS_TECHNO_NAME' , allianceTop+'/etc/scn6m_deep_09.rds') + , ( 'GRAAL_TECHNO_NAME' , allianceTop+'/etc/graal.rds') + ) diff --git a/crlcore/etc/symbolic/cmos45/analog.conf b/crlcore/etc/symbolic/cmos45/analog.conf new file mode 100644 index 00000000..e7ff617e --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/analog.conf @@ -0,0 +1,6 @@ +# -*- Mode:Python; explicit-buffer-name: "analog.conf" -*- + +import helpers + + +execfile( helpers.ndaConfDir+'/common/analog.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/devices.conf b/crlcore/etc/symbolic/cmos45/devices.conf new file mode 100644 index 00000000..96342ade --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/devices.conf @@ -0,0 +1,6 @@ +# -*- Mode:Python; explicit-buffer-name: "devices.conf" -*- + +import helpers + + +execfile( helpers.ndaConfDir+'/common/devices.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/display.conf b/crlcore/etc/symbolic/cmos45/display.conf new file mode 100644 index 00000000..86083d7d --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/display.conf @@ -0,0 +1,11 @@ +# -*- Mode:Python; explicit-buffer-name: "display.conf" -*- + +import helpers + +# Provides standard settings for: +# - +# - + +scale = 0.5 + +execfile( helpers.sysConfDir+'/common/display.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/etesian.conf b/crlcore/etc/symbolic/cmos45/etesian.conf new file mode 100644 index 00000000..0c16f79f --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/etesian.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "etesian.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/etesian.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/hMetis.conf b/crlcore/etc/symbolic/cmos45/hMetis.conf new file mode 100644 index 00000000..720cdc23 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/hMetis.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "hMetis.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/hMetis.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/kite.conf b/crlcore/etc/symbolic/cmos45/kite.conf new file mode 100644 index 00000000..5cc4766e --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/kite.conf @@ -0,0 +1,68 @@ +# -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- + +import helpers +from helpers import l, u, n + +# Contains the layout (shared by all technologies). +execfile( helpers.sysConfDir+'/common/kite.conf' ) + + +parametersTable = \ + ( ('lefImport.minTerminalWidth' ,TypeDouble ,0.0 ) + , ("katabatic.globalLengthThreshold",TypeInt ,1450 ) # Katabatic parameters. + , ("katabatic.saturateRatio" ,TypePercentage,80 ) + , ("katabatic.saturateRp" ,TypeInt ,8 ) + , ('katabatic.topRoutingLayer' ,TypeString , 'METAL6') + # Kite parameters. + , ("kite.hTracksReservedLocal" ,TypeInt ,4 , { 'min':0, 'max':18 } ) + , ("kite.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':18 } ) + , ("kite.eventsLimit" ,TypeInt ,4000002 ) + , ("kite.ripupCost" ,TypeInt ,3 , { 'min':0 } ) + , ("kite.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) + , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) + , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + # Anabatic parameters are temporarily hosted here. + , ("anabatic.routingGauge" ,TypeString ,'msxlib' ) + , ("anabatic.edgeLength" ,TypeInt ,48 ) + , ("anabatic.edgeWidth" ,TypeInt ,8 ) + , ("anabatic.edgeCostH" ,TypeDouble ,19.0 ) + , ("anabatic.edgeCostK" ,TypeDouble ,-60.0 ) + , ("anabatic.edgeHInc" ,TypeDouble ,1.0 ) + , ("anabatic.edgeHScaling" ,TypeDouble ,1.0 ) + , ("anabatic.globalIterations" ,TypeInt ,20 , { 'min':1, 'max':100 } ) + , ("anabatic.gcell.displayMode" ,TypeEnumerate ,1 + , { 'values':( ("Boundary" , 1) + , ("Density" , 2) ) } + ) + ) + + +# Format of routingGaugesTable (dictionary): +# A list of entry of the form: +# ( METAL_NAME, (Direction, Type, depth, density, offset, pitch, wire_width, via_width, obs_dw) ) + +routingGaugesTable = {} + +routingGaugesTable['msxlib'] = \ + ( ( 'METAL1' , ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(10), l(3), l(2), l(7) ) ) + , ( 'METAL2' , ( Gauge.Horizontal, Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(2), l(8) ) ) + , ( 'METAL3' , ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(10), l(3), l(2), l(8) ) ) + , ( 'METAL4' , ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(20), l(6), l(4), l(8) ) ) + , ( 'METAL5' , ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(20), l(6), l(4), l(8) ) ) + , ( 'METAL6' , ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(20), l(6), l(4), l(8) ) ) + ) + +routingGaugesTable['msxlib-2M'] = \ + ( ( 'METAL1', ( Gauge.Horizontal, Gauge.Default, 0, 0.0, l(0), l(10), l(3), l(3), l(7) ) ) + , ( 'METAL2', ( Gauge.Vertical , Gauge.Default, 1, 0.0, l(0), l(10), l(3), l(3), l(8) ) ) + ) + + +# Format of cellGaugesTable (dictionary): +# A list of entry of the form: +# ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) + +cellGaugesTable = {} +cellGaugesTable['msxlib'] = ('metal2', l(10), l(100), l(10)) + diff --git a/crlcore/etc/symbolic/cmos45/mauka.conf b/crlcore/etc/symbolic/cmos45/mauka.conf new file mode 100644 index 00000000..99e1379d --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/mauka.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "mauka.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/mauka.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/misc.conf b/crlcore/etc/symbolic/cmos45/misc.conf new file mode 100644 index 00000000..010234c0 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/misc.conf @@ -0,0 +1,9 @@ +# -*- Mode:Python; explicit-buffer-name: "misc.conf" -*- + +import helpers + +# Provides standard settings for: +# # - +# # - +# +execfile( helpers.sysConfDir+'/common/misc.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/nimbus.conf b/crlcore/etc/symbolic/cmos45/nimbus.conf new file mode 100644 index 00000000..e47b7a17 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/nimbus.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "nimbus.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/nimbus.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/patterns.conf b/crlcore/etc/symbolic/cmos45/patterns.conf new file mode 100644 index 00000000..7069c3e3 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/patterns.conf @@ -0,0 +1,5 @@ +# -*- Mode:Python; explicit-buffer-name: "patterns.conf" -*- + +import helpers + +execfile( helpers.sysConfDir+'/common/patterns.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/plugins.conf b/crlcore/etc/symbolic/cmos45/plugins.conf new file mode 100644 index 00000000..e97203d0 --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/plugins.conf @@ -0,0 +1,27 @@ +# -*- Mode:Python; explicit-buffer-name: "plugins.conf" -*- + +import helpers + +# Contains the layout (shared by all technologies). +#execfile( helpers.sysConfDir+'/common/plugins.conf' ) + + +# WARNING: Those values have not been adjusted yet for this technologies. +# Must be done. +# +# Parameters for chip plugin. +parametersTable = \ + ( ("chip.block.rails.count" , TypeInt , 5 ) + , ("chip.block.rails.hWidth" , TypeInt , 24 ) + , ("chip.block.rails.vWidth" , TypeInt , 24 ) + , ("chip.block.rails.hSpacing" , TypeInt , 12 ) + , ("chip.block.rails.vSpacing" , TypeInt , 12 ) + , ('chip.pad.pck' , TypeString, 'pck_mpx') + , ('chip.pad.pvddick' , TypeString, 'pvddick_mpx') + , ('chip.pad.pvssick' , TypeString, 'pvssick_mpx') + , ('chip.pad.pvddeck' , TypeString, 'pvddeck_mpx') + , ('chip.pad.pvsseck' , TypeString, 'pvsseck_mpx') + , ('clockTree.minimumSide' , TypeInt , 1000) + , ('clockTree.buffer' , TypeString, 'buf_x2') + , ('clockTree.placerEngine' , TypeString, 'Etesian') + ) diff --git a/crlcore/etc/symbolic/cmos45/stratus1.conf b/crlcore/etc/symbolic/cmos45/stratus1.conf new file mode 100644 index 00000000..e8fb52ba --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/stratus1.conf @@ -0,0 +1,13 @@ +# -*- Mode:Python; explicit-buffer-name: "stratus1.conf" -*- + +import helpers + + +# Status1 parameters. +parametersTable = \ + ( ("stratus1.format" , TypeString, "vst") + , ("stratus1.simulator" , TypeString, "asimut") + ,) + + +execfile( helpers.sysConfDir+'/common/stratus1.conf' ) diff --git a/crlcore/etc/symbolic/cmos45/technology.conf b/crlcore/etc/symbolic/cmos45/technology.conf new file mode 100644 index 00000000..3a1df4ad --- /dev/null +++ b/crlcore/etc/symbolic/cmos45/technology.conf @@ -0,0 +1,242 @@ +# -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- + +from Hurricane import DbU +from helpers import sysConfDir +from helpers import l, u, n +from helpers.Technology import initTechno + +# The informations here are extracted from the Alliance ".rds" file, +# and must be consistent with it. +# +# Provides standard settings for: +# - +# - +# - +# - + + +# MOSIS SCN6M_DEEP is a portable technology where lengths are expresseds +# in symbolic unit (lambda). We only know that the lambda is equal to half +# the value of the technology, that is 180nm gives 90nm. We have no information +# about the foundry grid. +# +# We set the foundry grid to .0025um and set the gridsPerLambda to 10. + +initTechno( { 'name' : 'cmos45' + , 'precision' : 2 + , 'gridValue' : 0.0025 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 10 + , 'symbolicGridStep': 1.0 + , 'polygonStep' : 10.0 + } ) + +execfile( sysConfDir+'/common/technology.conf' ) + + +# Format of : +# Each entry is a pair of (string, value). +# * string: a synthetic way to designate the real or symbolic layer on +# which it applies, an optional sub layer (BasicLayer) in case +# where there is more than one, and the dimension name. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. + +def scaleUp ( extensionsTable ): + scaled = [] + for entry in extensionsTable: + scaled.append( ( entry[0], 2*entry[1] ) ) + return scaled + +#layersExtensionsTable = \ +# [ ('METAL1.minimalSpacing' , l( 6.0)) +# , ('METAL2.minimalSpacing' , l( 6.0)) +# , ('METAL3.minimalSpacing' , l( 6.0)) +# , ('METAL4.minimalSpacing' , l( 6.0)) +# , ('METAL5.minimalSpacing' , l( 6.0)) +# , ('METAL6.minimalSpacing' , l( 6.0)) +# ] + \ +# scaleUp( symbolicLayersExtensionsTable ) + +layersExtensionsTable = \ + ( ('METAL1.minimalSpacing' , l( 6.0)) + , ('METAL2.minimalSpacing' , l( 6.0)) + , ('METAL3.minimalSpacing' , l( 6.0)) + , ('METAL4.minimalSpacing' , l( 6.0)) + , ('METAL5.minimalSpacing' , l( 6.0)) + , ('METAL6.minimalSpacing' , l( 6.0)) + + , ('NWELL.nWell.extention.cap' , l( 4.0)) + , ('PWELL.pWell.extention.cap' , l( 4.0)) + + , ('NTIE.minimum.width' , l( 3.0)) + , ('NTIE.nWell.extention.cap' , l( 3.0)) + , ('NTIE.nWell.extention.width' , l( 2.0)) + , ('NTIE.nImplant.extention.cap' , l( 2.5)) + , ('NTIE.nImplant.extention.width' , l( 1.5)) + , ('NTIE.active.extention.cap' , l( 0.5)) + , ('NTIE.active.extention.width' , l(-0.5)) + + , ('PTIE.minimum.width' , l( 3.0)) + , ('PTIE.pWell.extention.cap' , l( 3.0)) + , ('PTIE.pWell.extention.width' , l( 2.0)) + , ('PTIE.pImplant.extention.cap' , l( 2.5)) + , ('PTIE.pImplant.extention.width' , l( 1.5)) + , ('PTIE.active.extention.cap' , l( 0.5)) + , ('PTIE.active.extention.width' , l(-0.5)) + + , ('NDIF.minimum.width' , l( 3.0)) + , ('NDIF.nImplant.extention.cap' , l( 4.0)) + , ('NDIF.nImplant.extention.width' , l( 2.0)) + , ('NDIF.active.extention.cap' , l( 2.0)) + , ('NDIF.active.extention.width' , l( 0.0)) + + , ('PDIF.minimum.width' , l( 3.0)) + , ('PDIF.pImplant.extention.cap' , l( 4.0)) + , ('PDIF.pImplant.extention.width' , l( 2.0)) + , ('PDIF.active.extention.cap' , l( 2.0)) + , ('PDIF.active.extention.width' , l( 0.0)) + + , ('GATE.minimum.width' , l( 2.0)) + , ('GATE.poly.extention.cap' , l( 2.5)) + + , ('NTRANS.minimum.width' , l( 2.0)) + , ('NTRANS.nImplant.extention.cap' , l( 2.0)) + , ('NTRANS.nImplant.extention.width' , l( 7.0)) + , ('NTRANS.active.extention.cap' , l( 0.0)) + , ('NTRANS.active.extention.width' , l( 3.0)) + , ('NTRANS.poly.extention.cap' , l( 3.0)) + , ('NTRANS.poly.extention.width' , l( 0.0)) + + , ('PTRANS.minimum.width' , l( 2.0)) + , ('PTRANS.nWell.extention.cap' , l( 2.5)) + , ('PTRANS.nWell.extention.width' , l( 7.5)) + , ('PTRANS.pImplant.extention.cap' , l( 2.0)) + , ('PTRANS.pImplant.extention.width' , l( 7.0)) + , ('PTRANS.active.extention.cap' , l( 0.0)) + , ('PTRANS.active.extention.width' , l( 3.0)) + , ('PTRANS.poly.extention.cap' , l( 3.0)) + , ('PTRANS.poly.extention.width' , l( 0.0)) + + , ('POLY.minimum.width' , l( 2.0)) + , ('POLY.poly.extention.cap' , l( 1.0)) + , ('POLY2.minimum.width' , l( 2.0)) + , ('POLY2.poly2.extention.cap' , l( 2.0)) + + # Routing Layers (symbolic). + , ('METAL1.minimum.width' , l( 2.0)) + , ('METAL1.metal1.extention.cap' , l( 2.0)) + , ('METAL1.metal1.extention.width' , l( 1.0)) + , ('METAL2.minimum.width' , l( 4.0)) + , ('METAL2.metal2.extention.cap' , l( 2.0)) + , ('METAL3.minimum.width' , l( 4.0)) + , ('METAL3.metal3.extention.cap' , l( 2.0)) + , ('METAL4.minimum.width' , l( 4.0)) + , ('METAL4.metal4.extention.cap' , l( 2.0)) + , ('METAL5.minimum.width' , l( 4.0)) + , ('METAL5.metal5.extention.cap' , l( 2.0)) + , ('METAL6.minimum.width' , l(10.0)) + , ('METAL6.metal6.extention.cap' , l( 5.0)) + #, ('METAL7.minimum.width' , l( 2.0)) + #, ('METAL7.metal7.extention.cap' , l( 2.5)) + #, ('METAL8.minimum.width' , l( 2.0)) + #, ('METAL8.metal8.extention.cap' , l( 2.5)) + + # Blockages (symbolic). + , ('BLOCKAGE1.minimum.width' , l( 4.0)) + , ('BLOCKAGE1.blockage1.extention.cap' , l( 2.0)) + , ('BLOCKAGE1.blockage1.extention.width', l( 0.5)) + , ('BLOCKAGE2.minimum.width' , l( 4.0)) + , ('BLOCKAGE2.blockage2.extention.cap' , l( 2.0)) + , ('BLOCKAGE3.minimum.width' , l( 4.0)) + , ('BLOCKAGE3.blockage3.extention.cap' , l( 2.0)) + , ('BLOCKAGE4.minimum.width' , l( 4.0)) + , ('BLOCKAGE4.blockage4.extention.cap' , l( 2.0)) + , ('BLOCKAGE5.minimum.width' , l( 4.0)) + , ('BLOCKAGE5.blockage5.extention.cap' , l( 2.0)) + , ('BLOCKAGE6.minimum.width' , l( 8.0)) + , ('BLOCKAGE6.blockage6.extention.cap' , l( 2.5)) + #, ('BLOCKAGE7.minimum.width' , l( 2.0)) + #, ('BLOCKAGE7.blockage6.extention.cap' , l( 4.0)) + #, ('BLOCKAGE8.minimum.width' , l( 2.0)) + #, ('BLOCKAGE8.blockage6.extention.cap' , l( 4.0)) + + # Contacts (i.e. Active <--> Metal) (symbolic). + , ('CONT_BODY_N.minimum.side' , l( 2.0)) + , ('CONT_BODY_N.nWell.enclosure' , l( 4.0)) + , ('CONT_BODY_N.nImplant.enclosure' , l( 3.5)) + , ('CONT_BODY_N.active.enclosure' , l( 1.5)) + , ('CONT_BODY_N.metal1.enclosure' , l( 1.0)) + + , ('CONT_BODY_P.minimum.side' , l( 2.0)) + , ('CONT_BODY_P.pWell.enclosure' , l( 4.0)) + , ('CONT_BODY_P.pImplant.enclosure' , l( 3.5)) + , ('CONT_BODY_P.active.enclosure' , l( 1.5)) + , ('CONT_BODY_P.metal1.enclosure' , l( 1.0)) + + , ('CONT_DIF_N.minimum.side' , l( 2.0)) + , ('CONT_DIF_N.nImplant.enclosure' , l( 4.0)) + , ('CONT_DIF_N.active.enclosure' , l( 2.0)) + , ('CONT_DIF_N.metal1.enclosure' , l( 1.0)) + + , ('CONT_DIF_P.minimum.side' , l( 2.0)) + , ('CONT_DIF_P.pImplant.enclosure' , l( 4.0)) + , ('CONT_DIF_P.active.enclosure' , l( 2.0)) + , ('CONT_DIF_P.metal1.enclosure' , l( 1.0)) + + , ('CONT_POLY.minimum.width' , l( 2.0)) + , ('CONT_POLY.poly.enclosure' , l( 2.0)) + , ('CONT_POLY.metal1.enclosure' , l( 1.0)) + + # VIAs (i.e. Metal <--> Metal) (symbolic). + , ('VIA12.minimum.side' , l( 2.0)) + , ('VIA12.metal1.enclosure' , l( 1.0)) + , ('VIA12.metal2.enclosure' , l( 1.0)) + , ('VIA23.minimum.side' , l( 2.0)) + , ('VIA23.metal2.enclosure' , l( 1.0)) + , ('VIA23.metal3.enclosure' , l( 1.0)) + , ('VIA34.minimum.side' , l( 2.0)) + , ('VIA34.metal3.enclosure' , l( 1.0)) + , ('VIA34.metal4.enclosure' , l( 1.0)) + , ('VIA45.minimum.side' , l( 2.0)) + , ('VIA45.metal4.enclosure' , l( 1.0)) + , ('VIA45.metal5.enclosure' , l( 1.0)) + , ('VIA56.minimum.side' , l( 5.0)) + , ('VIA56.metal5.enclosure' , l( 1.0)) + , ('VIA56.metal6.enclosure' , l( 1.5)) + #, ('VIA67.minimum.side' , l( 2.0)) + #, ('VIA67.metal6.enclosure' , l( 3.0)) + #, ('VIA67.metal7.enclosure' , l( 3.0)) + #, ('VIA78.minimum.side' , l( 2.0)) + #, ('VIA78.metal7.enclosure' , l( 3.0)) + #, ('VIA78.metal8.enclosure' , l( 3.0)) + ) + + +# Format of an entry in the table: +# (Symbolic_Name, CIF_Name, GDSII_Number) +gdsLayersTable = \ + ( ("pWell" , "CWN" , 41, 0) + , ("nWell" , "CWP" , 42, 0) + , ("active" , "CAA" , 43, 0) + , ("pImplant", "CSP" , 44, 0) + , ("nImplant", "CSN" , 45, 0) + , ("poly" , "CPG" , 46, 0) + , ("poly2" , "CM1" , 49, 0) # poly2 is in fact metal1. + , ("cut0" , "CCC" , 25, 0) + , ("metal1" , "CM1" , 49, 0) + , ("cut1" , "CV1" , 50, 0) + , ("metal2" , "CM2" , 51, 0) + , ("cut2" , "CV2" , 61, 0) + , ("metal3" , "CM3" , 62, 0) + , ("cut3" , "CV3" , 30, 0) + , ("metal4" , "CM4" , 31, 0) + , ("cut4" , "CV4" , 32, 0) + , ("metal5" , "CM5" , 33, 0) + , ("cut5" , "CV5" , 36, 0) + , ("metal6" , "CM6" , 37, 0) + ) diff --git a/crlcore/etc/symbolic/ispd05/analog.conf b/crlcore/etc/symbolic/ispd05/analog.conf new file mode 100644 index 00000000..4d4cf6a2 --- /dev/null +++ b/crlcore/etc/symbolic/ispd05/analog.conf @@ -0,0 +1,10 @@ +# -*- Mode:Python; explicit-buffer-name: "analog.conf" -*- + +import helpers + + +parametersTable = \ + ( ('analog.techno' , TypeString, 'Analog_technology_is_disabled', + { 'flags':Cfg.Parameter.Flags.NeedRestart|Cfg.Parameter.Flags.MustExist } ) + , ('analog.devices', TypeString, helpers.technoDir+'/devices.conf' ) + ) diff --git a/crlcore/etc/symbolic/ispd05/kite.conf b/crlcore/etc/symbolic/ispd05/kite.conf index 1844876a..359c336d 100644 --- a/crlcore/etc/symbolic/ispd05/kite.conf +++ b/crlcore/etc/symbolic/ispd05/kite.conf @@ -1,6 +1,7 @@ -# -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- +# -*- Mode:Python; explicit-buffer-name: "kite.conf" -*- import helpers +from helpers import l, u, n # Contains the layout (shared by all technologies). execfile( helpers.sysConfDir+'/common/kite.conf' ) @@ -21,8 +22,31 @@ parametersTable = \ , ("kite.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) , ("kite.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) , ("kite.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + # Anabatic & Katana parameters are temporarily hosted here. + , ('anabatic.routingGauge' ,TypeString , 'sxlib' ) + , ("anabatic.globalLengthThreshold" ,TypeInt ,1450 ) + , ("anabatic.saturateRatio" ,TypePercentage,80 ) + , ("anabatic.saturateRp" ,TypeInt ,8 ) + , ('anabatic.topRoutingLayer' ,TypeString , 'METAL5') + , ("anabatic.edgeLength" ,TypeInt ,24 ) + , ("anabatic.edgeWidth" ,TypeInt ,4 ) + , ("anabatic.edgeCostH" ,TypeDouble ,19.0 ) + , ("anabatic.edgeCostK" ,TypeDouble ,-60.0 ) , ("anabatic.edgeHScaling" ,TypeDouble ,1.0 ) , ("anabatic.globalIterations" ,TypeInt ,10 , { 'min':1, 'max':100 } ) + , ("anabatic.gcell.displayMode" ,TypeEnumerate ,1 + , { 'values':( ("Boundary" , 1) + , ("Density" , 2) ) } + ) + , ("katana.hTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) + , ("katana.vTracksReservedLocal" ,TypeInt ,3 , { 'min':0, 'max':20 } ) + , ("katana.eventsLimit" ,TypeInt ,4000002 ) + , ("katana.ripupCost" ,TypeInt ,3 , { 'min':0 } ) + , ("katana.strapRipupLimit" ,TypeInt ,16 , { 'min':1 } ) + , ("katana.localRipupLimit" ,TypeInt ,9 , { 'min':1 } ) + , ("katana.globalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ("katana.longGlobalRipupLimit" ,TypeInt ,5 , { 'min':1 } ) + , ('chip.padCoreSide' ,TypeString ,'South' ) ) @@ -33,13 +57,13 @@ parametersTable = \ routingGaugesTable = {} routingGaugesTable['sxlib'] = \ - ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, 0, 5, 2, 1, 4 ) ) - , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, 0, 5, 2, 1, 4 ) ) - #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, 0, 5, 2, 1, 4 ) ) + ( ( 'METAL1', ( Gauge.Vertical , Gauge.PinOnly, 0, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL2', ( Gauge.Horizontal, Gauge.Default, 1, 7.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL3', ( Gauge.Vertical , Gauge.Default, 2, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL4', ( Gauge.Horizontal, Gauge.Default, 3, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + , ( 'METAL5', ( Gauge.Vertical , Gauge.Default, 4, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL6', ( Gauge.Horizontal, Gauge.Default, 5, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) + #, ( 'METAL7', ( Gauge.Vertical , Gauge.Default, 6, 0.0, l(0), l(5), l(2), l(1), l(4) ) ) ) @@ -48,5 +72,5 @@ routingGaugesTable['sxlib'] = \ # ( METAL_PIN, xy_common_pitch, slice_height, slice_step ) cellGaugesTable = {} -cellGaugesTable['ispd05'] = ('metal2', 5.0, 60.0, 5.0) +cellGaugesTable['ispd05'] = ('metal2', l(5.0), l(60.0), l(5.0)) diff --git a/crlcore/etc/symbolic/ispd05/technology.conf b/crlcore/etc/symbolic/ispd05/technology.conf index 0f81fb0b..990cad34 100644 --- a/crlcore/etc/symbolic/ispd05/technology.conf +++ b/crlcore/etc/symbolic/ispd05/technology.conf @@ -1,6 +1,7 @@ # -*- Mode:Python; explicit-buffer-name: "technology.conf" -*- import helpers +from helpers.Technology import initTechno from Hurricane import DbU # Provides standard settings for: @@ -9,168 +10,33 @@ from Hurricane import DbU # - # - + +initTechno( { 'name' : 'IPSD05/symbolic' + , 'precision' : 2 + , 'gridValue' : 0.005 + , 'gridUnit' : DbU.UnitPowerMicro + , 'gridsPerLambda' : 24 + , 'symbolicGridStep' : 1.0 + , 'polygonStep' : 24.0 + } ) + + execfile( helpers.sysConfDir+'/common/technology.conf' ) -technoConfig = { 'name' : 'ISPD05/symbolic' - , 'precision' : 2 - , 'gridValue' : 0.005 - , 'gridUnit' : DbU.UnitPowerMicro - , 'gridsPerLambda' : 24 - , 'symbolicGridStep' : 1.0 - , 'polygonStep' : 24.0 - } - - # Format of : # Each entry is a pair of (string, value). # * string: a synthetic way to designate the real or symbolic layer on # which it applies, an optional sub layer (BasicLayer) in case # where there is more than one, and the dimension name. -# * value : the rule (dimension) value. If the main layer is symbolic it -# must be expressed in lambda, if it is for a real layers it -# must be expressed in microns. +# * value : the rule (dimension) value. +# Values/dimensions must be given using one of the following conversion +# function: +# * l(value) : value expressed in lambda (symbolic). +# * u(value) : value is expressed in microns. +# * n(value) : value is expressed in nanometers. -layersExtensionsTable = \ - ( ('NWELL.nWell.extention.cap' , 0.0) - , ('PWELL.pWell.extention.cap' , 0.0) - - , ('NTIE.minimum.width' , 3.0) - , ('NTIE.nWell.extention.cap' , 1.5) - , ('NTIE.nWell.extention.width' , 0.5) - , ('NTIE.nImplant.extention.cap' , 1.0) - , ('NTIE.nImplant.extention.width' , 0.5) - , ('NTIE.active.extention.cap' , 0.5) - , ('NTIE.active.extention.width' , 0.0) - - , ('PTIE.minimum.width' , 3.0) - , ('PTIE.pWell.extention.cap' , 1.5) - , ('PTIE.pWell.extention.width' , 0.5) - , ('PTIE.pImplant.extention.cap' , 1.0) - , ('PTIE.pImplant.extention.width' , 0.5) - , ('PTIE.active.extention.cap' , 0.5) - , ('PTIE.active.extention.width' , 0.0) - - , ('NDIF.minimum.width' , 3.0) - , ('NDIF.nImplant.extention.cap' , 1.0) - , ('NDIF.nImplant.extention.width' , 0.5) - , ('NDIF.active.extention.cap' , 0.5) - , ('NDIF.active.extention.width' , 0.0) - - , ('PDIF.minimum.width' , 3.0) - , ('PDIF.pImplant.extention.cap' , 1.0) - , ('PDIF.pImplant.extention.width' , 0.5) - , ('PDIF.active.extention.cap' , 0.5) - , ('PDIF.active.extention.width' , 0.0) - - , ('GATE.minimum.width' , 1.0) - , ('GATE.poly.extention.cap' , 1.5) - - , ('NTRANS.minimum.width' , 1.0) - , ('NTRANS.nImplant.extention.cap' , -1.0) - , ('NTRANS.nImplant.extention.width' , 2.5) - , ('NTRANS.active.extention.cap' , -1.5) - , ('NTRANS.active.extention.width' , 2.0) - - , ('PTRANS.minimum.width' , 1.0) - , ('PTRANS.nWell.extention.cap' , -1.0) - , ('PTRANS.nWell.extention.width' , 4.5) - , ('PTRANS.pImplant.extention.cap' , -1.0) - , ('PTRANS.pImplant.extention.width' , 4.0) - , ('PTRANS.active.extention.cap' , -1.5) - , ('PTRANS.active.extention.width' , 3.0) - - , ('POLY.minimum.width' , 1.0) - , ('POLY.poly.extention.cap' , 0.5) - , ('POLY2.minimum.width' , 1.0) - , ('POLY2.poly.extention.cap' , 0.5) - - # Routing Layers (symbolic). - , ('METAL1.minimum.width' , 1.0) - , ('METAL1.metal1.extention.cap' , 0.5) - , ('METAL2.minimum.width' , 1.0) - , ('METAL2.metal2.extention.cap' , 1.0) - , ('METAL3.minimum.width' , 1.0) - , ('METAL3.metal3.extention.cap' , 1.0) - , ('METAL4.minimum.width' , 1.0) - , ('METAL4.metal4.extention.cap' , 1.0) - , ('METAL5.minimum.width' , 2.0) - , ('METAL5.metal5.extention.cap' , 1.0) - , ('METAL6.minimum.width' , 2.0) - , ('METAL6.metal6.extention.cap' , 1.0) - , ('METAL7.minimum.width' , 2.0) - , ('METAL7.metal6.extention.cap' , 1.0) - , ('METAL8.minimum.width' , 2.0) - , ('METAL8.metal6.extention.cap' , 1.0) - - # Contacts (i.e. Active <--> Metal) (symbolic). - , ('CONT_BODY_N.minimum.side' , 1.0) - , ('CONT_BODY_N.nWell.enclosure' , 1.5) - , ('CONT_BODY_N.nImplant.enclosure' , 1.5) - , ('CONT_BODY_N.active.enclosure' , 1.0) - , ('CONT_BODY_N.metal1.enclosure' , 0.5) - - , ('CONT_BODY_P.minimum.side' , 1.0) - , ('CONT_BODY_P.pWell.enclosure' , 1.5) - , ('CONT_BODY_P.pImplant.enclosure' , 1.5) - , ('CONT_BODY_P.active.enclosure' , 1.0) - , ('CONT_BODY_P.metal1.enclosure' , 0.5) - - , ('CONT_DIF_N.minimum.side' , 1.0) - , ('CONT_DIF_N.nImplant.enclosure' , 1.0) - , ('CONT_DIF_N.active.enclosure' , 0.5) - , ('CONT_DIF_N.metal1.enclosure' , 0.5) - - , ('CONT_DIF_P.minimum.side' , 1.0) - , ('CONT_DIF_P.pImplant.enclosure' , 1.0) - , ('CONT_DIF_P.active.enclosure' , 0.5) - , ('CONT_DIF_P.metal1.enclosure' , 0.5) - - , ('CONT_POLY.minimum.width' , 1.0) - , ('CONT_POLY.poly.enclosure' , 0.5) - , ('CONT_POLY.metal1.enclosure' , 0.5) - - # VIAs (i.e. Metal <--> Metal) (symbolic). - , ('VIA12.minimum.side' , 1.0) - , ('VIA12.metal1.enclosure' , 0.5) - , ('VIA12.metal2.enclosure' , 0.5) - , ('VIA23.minimum.side' , 1.0) - , ('VIA23.metal2.enclosure' , 0.5) - , ('VIA23.metal3.enclosure' , 0.5) - , ('VIA34.minimum.side' , 1.0) - , ('VIA34.metal3.enclosure' , 0.5) - , ('VIA34.metal4.enclosure' , 0.5) - , ('VIA45.minimum.side' , 1.0) - , ('VIA45.metal4.enclosure' , 0.5) - , ('VIA45.metal5.enclosure' , 0.5) - , ('VIA56.minimum.side' , 1.0) - , ('VIA56.metal5.enclosure' , 0.5) - , ('VIA56.metal6.enclosure' , 0.5) - , ('VIA67.minimum.side' , 1.0) - , ('VIA67.metal6.enclosure' , 0.5) - , ('VIA67.metal7.enclosure' , 0.5) - , ('VIA78.minimum.side' , 1.0) - , ('VIA78.metal7.enclosure' , 0.5) - , ('VIA78.metal8.enclosure' , 0.5) - - # Blockages (symbolic). - , ('BLOCKAGE1.minimum.width' , 1.0) - , ('BLOCKAGE1.blockage1.extention.cap' , 0.5) - , ('BLOCKAGE2.minimum.width' , 2.0) - , ('BLOCKAGE2.blockage2.extention.cap' , 0.5) - , ('BLOCKAGE3.minimum.width' , 2.0) - , ('BLOCKAGE3.blockage3.extention.cap' , 0.5) - , ('BLOCKAGE4.minimum.width' , 2.0) - , ('BLOCKAGE4.blockage4.extention.cap' , 0.5) - , ('BLOCKAGE5.minimum.width' , 2.0) - , ('BLOCKAGE5.blockage5.extention.cap' , 1.0) - , ('BLOCKAGE6.minimum.width' , 2.0) - , ('BLOCKAGE6.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE7.minimum.width' , 2.0) - , ('BLOCKAGE7.blockage6.extention.cap' , 1.0) - , ('BLOCKAGE8.minimum.width' , 2.0) - , ('BLOCKAGE8.blockage6.extention.cap' , 1.0) - ) +layersExtensionsTable = symbolicLayersExtensionsTable gdsLayersTable = \ diff --git a/crlcore/src/LibraryManager/CellsModel.cpp b/crlcore/src/LibraryManager/CellsModel.cpp index d7d2fb2b..96ae2693 100644 --- a/crlcore/src/LibraryManager/CellsModel.cpp +++ b/crlcore/src/LibraryManager/CellsModel.cpp @@ -103,7 +103,7 @@ namespace CRL { , "BLIF (Yosys/ABC)" , CellLoader::Importer|CellLoader::MultiCell , Catalog::State::Logical - , std::bind( &Blif::load, placeholders::_1 ) ) ); + , std::bind( &Blif::load, placeholders::_1, true ) ) ); } } diff --git a/crlcore/src/ccore/AllianceFramework.cpp b/crlcore/src/ccore/AllianceFramework.cpp index 3e2bf68a..52c6b5f2 100644 --- a/crlcore/src/ccore/AllianceFramework.cpp +++ b/crlcore/src/ccore/AllianceFramework.cpp @@ -29,6 +29,8 @@ #include "crlcore/RoutingLayerGauge.h" #include "crlcore/AllianceFramework.h" +#include "hurricane/SharedName.h" + namespace CRL { @@ -753,7 +755,38 @@ namespace CRL { } _cellGauges [ gauge->getName() ] = gauge; - _defaultCellGauge = gauge; + if (not _defaultCellGauge) _defaultCellGauge = gauge; + } + + + CellGauge* AllianceFramework::matchCellGauge ( DbU::Unit width, DbU::Unit height ) const + { + for ( const auto item : _cellGauges ) { + CellGauge* cg = item.second; + DbU::Unit hcount = width / cg->getSliceStep (); + DbU::Unit hremains = width % cg->getSliceStep (); + DbU::Unit vcount = height / cg->getSliceHeight(); + DbU::Unit vremains = height % cg->getSliceHeight(); + + if ( (hcount) and (not hremains) and (vcount == 1) and (not vremains) ) + return cg; + } + + return NULL; + } + + + CellGauge* AllianceFramework::matchCellGaugeByHeight ( DbU::Unit height ) const + { + for ( const auto item : _cellGauges ) { + CellGauge* cg = item.second; + DbU::Unit vcount = height / cg->getSliceHeight(); + DbU::Unit vremains = height % cg->getSliceHeight(); + + if ( (vcount == 1) and (not vremains) ) return cg; + } + + return NULL; } diff --git a/crlcore/src/ccore/CellGauge.cpp b/crlcore/src/ccore/CellGauge.cpp index c00e65c5..69509561 100644 --- a/crlcore/src/ccore/CellGauge.cpp +++ b/crlcore/src/ccore/CellGauge.cpp @@ -38,6 +38,7 @@ namespace CRL { , _pitch (pitch) , _sliceHeight (sliceHeight) , _sliceStep (sliceStep) + , _flags (Flags::NoFlags) { } @@ -47,6 +48,7 @@ namespace CRL { , _pitch (other._pitch) , _sliceHeight (other._sliceHeight) , _sliceStep (other._sliceStep) + , _flags (other._flags) { } @@ -100,11 +102,12 @@ namespace CRL { Record* CellGauge::_getRecord () const { Record* record = new Record ( getString(this) ); - record->add( getSlot ( "Name" , &_name ) ); - record->add( getSlot ( "PinLayerName" , &_pinLayerName ) ); - record->add( DbU::getValueSlot( "pitch" , &_pitch ) ); - record->add( DbU::getValueSlot( "sliceHeight" , &_sliceHeight ) ); - record->add( DbU::getValueSlot( "sliceStep" , &_sliceStep ) ); + record->add( getSlot ( "_name" , &_name ) ); + record->add( getSlot ( "_pinLayerName" , &_pinLayerName ) ); + record->add( DbU::getValueSlot( "_pitch" , &_pitch ) ); + record->add( DbU::getValueSlot( "_sliceHeight" , &_sliceHeight ) ); + record->add( DbU::getValueSlot( "_sliceStep" , &_sliceStep ) ); + record->add( getSlot ( "_flags" , &_flags ) ); return ( record ); } @@ -118,6 +121,7 @@ namespace CRL { jsonWrite( w, "_pitch" , _pitch ); jsonWrite( w, "_sliceHeight" , _sliceHeight ); jsonWrite( w, "_sliceStep" , _sliceStep ); + jsonWrite( w, "_flags" , _flags ); w->endObject(); } @@ -162,6 +166,7 @@ namespace CRL { DbU::Unit pitch = get( stack, "_pitch" ); DbU::Unit sliceHeight = get( stack, "_sliceHeight" ); DbU::Unit sliceStep = get( stack, "_sliceStep" ); + unsigned long flags = get( stack, "_flags" ); if (stack.issetFlags(JsonWriter::TechnoMode)) { if (af) { @@ -172,6 +177,7 @@ namespace CRL { , sliceHeight , sliceStep ); + cg->setFlags( flags ); af->addCellGauge( cg ); } } else { diff --git a/crlcore/src/ccore/RoutingGauge.cpp b/crlcore/src/ccore/RoutingGauge.cpp index a8497280..53166a6c 100644 --- a/crlcore/src/ccore/RoutingGauge.cpp +++ b/crlcore/src/ccore/RoutingGauge.cpp @@ -123,7 +123,8 @@ namespace CRL { RoutingLayerGauge* RoutingGauge::getHorizontalGauge () const { for ( RoutingLayerGauge* gauge : _layerGauges ) { - if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isHorizontal() ) + //if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isHorizontal() ) + if (gauge->isHorizontal()) return gauge; } return NULL; @@ -133,7 +134,8 @@ namespace CRL { RoutingLayerGauge* RoutingGauge::getVerticalGauge () const { for ( RoutingLayerGauge* gauge : _layerGauges ) { - if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isVertical() ) + //if ( (gauge->getType() != Constant::LayerGaugeType::PinOnly) and gauge->isVertical() ) + if (gauge->isVertical()) return gauge; } return NULL; diff --git a/crlcore/src/ccore/RoutingLayerGauge.cpp b/crlcore/src/ccore/RoutingLayerGauge.cpp index 5515d370..b82b5192 100644 --- a/crlcore/src/ccore/RoutingLayerGauge.cpp +++ b/crlcore/src/ccore/RoutingLayerGauge.cpp @@ -267,9 +267,7 @@ namespace CRL { DbU::Unit RoutingLayerGauge::getTrackPosition ( DbU::Unit start, unsigned depth ) const - { - return depth * _pitch + _offset + start; - } + { return depth * _pitch + _offset + start; } string RoutingLayerGauge::_getTypeName () const diff --git a/crlcore/src/ccore/Utilities.cpp b/crlcore/src/ccore/Utilities.cpp index 9acaf3b6..31dfff6b 100644 --- a/crlcore/src/ccore/Utilities.cpp +++ b/crlcore/src/ccore/Utilities.cpp @@ -281,6 +281,10 @@ namespace CRL { ); } + if ( arguments.count("coriolis_top") ) { + _pathes.insert ( make_pair("coriolis_top", arguments["coriolis_top"].as()) ); + } + Utilities::Path sysConfDir ( SYS_CONF_DIR ); if ( not sysConfDir.absolute() ) { if ( arguments.count("coriolis_top") ) { diff --git a/crlcore/src/ccore/blif/BlifParser.cpp b/crlcore/src/ccore/blif/BlifParser.cpp index efa7a696..8e0531a9 100644 --- a/crlcore/src/ccore/blif/BlifParser.cpp +++ b/crlcore/src/ccore/blif/BlifParser.cpp @@ -667,7 +667,7 @@ namespace CRL { { if (library) _libraries.push_back( library ); } - Cell* Blif::load ( string cellPath ) + Cell* Blif::load ( string cellPath, bool enforceVhdl ) { using namespace std; @@ -824,7 +824,7 @@ namespace CRL { Model::orderModels(); Model::connectModels(); - Model::toVhdlModels(); + if (enforceVhdl) Model::toVhdlModels(); Model::clearStatic(); UpdateSession::close(); diff --git a/crlcore/src/ccore/crlcore/AllianceFramework.h b/crlcore/src/ccore/crlcore/AllianceFramework.h index f17f1904..3e46ce96 100644 --- a/crlcore/src/ccore/crlcore/AllianceFramework.h +++ b/crlcore/src/ccore/crlcore/AllianceFramework.h @@ -32,6 +32,7 @@ namespace CRL { using Hurricane::BaseObserver; using Hurricane::JsonObject; using Hurricane::JsonStack; + using Hurricane::DbU; using Hurricane::Cell; using Hurricane::Net; class RoutingGauge; @@ -98,6 +99,8 @@ namespace CRL { void saveLibrary ( AllianceLibrary* ); RoutingGauge* getRoutingGauge ( const Name& name="" ); CellGauge* getCellGauge ( const Name& name="" ); + CellGauge* matchCellGauge ( DbU::Unit width, DbU::Unit height ) const; + CellGauge* matchCellGaugeByHeight ( DbU::Unit height ) const; inline const Name getDefaultCGPinLayerName () const; // Modifiers. RoutingGauge* setRoutingGauge ( const Name& name="" ); diff --git a/crlcore/src/ccore/crlcore/Blif.h b/crlcore/src/ccore/crlcore/Blif.h index ef644e77..a23f553d 100644 --- a/crlcore/src/ccore/crlcore/Blif.h +++ b/crlcore/src/ccore/crlcore/Blif.h @@ -56,7 +56,7 @@ namespace CRL { class Blif { public: - static Cell* load ( std::string netlist ); + static Cell* load ( std::string netlist, bool enforceVhdl=true ); static void add ( Library* ); static inline const std::vector& getLibraries (); private: diff --git a/crlcore/src/ccore/crlcore/CellGauge.h b/crlcore/src/ccore/crlcore/CellGauge.h index fc5ee456..dc0803b6 100644 --- a/crlcore/src/ccore/crlcore/CellGauge.h +++ b/crlcore/src/ccore/crlcore/CellGauge.h @@ -41,38 +41,40 @@ namespace CRL { // Class : "CRL::CellGauge". class CellGauge { - public: - // Constructors & Destructor. + enum Flags { NoFlags = 0, Pad = ( 1<<0) }; + public: static CellGauge* create ( const char* name , const char* pinLayerName , const DbU::Unit pitch =0 , const DbU::Unit sliceHeight =0 , const DbU::Unit sliceStep =0 ); virtual void destroy (); - // Accessors + inline bool isPad () const; inline const Name& getName () const; + inline unsigned long getFlags () const; inline const Name& getPinLayerName () const; inline const DbU::Unit getPitch () const; inline const DbU::Unit getSliceHeight () const; inline const DbU::Unit getSliceStep () const; CellGauge* getClone () const; - // Hurricane management. + inline void setFlags ( unsigned long flags ); + inline void resetFlags ( unsigned long flags ); + inline void setPitch ( DbU::Unit ); + inline void setSliceHeight ( DbU::Unit ); + inline void setSliceStep ( DbU::Unit ); void toJson ( JsonWriter* ) const; virtual string _getTypeName () const; virtual string _getString () const; virtual Record* _getRecord () const; - protected: - // Internal: Attributes. Name _name; Name _pinLayerName; DbU::Unit _pitch; DbU::Unit _sliceHeight; DbU::Unit _sliceStep; - + unsigned long _flags; protected: - // Internal: Constructors & Destructors. CellGauge ( const char* name , const char* pinLayerName , const DbU::Unit pitch @@ -91,11 +93,18 @@ namespace CRL { // Inline Functions. - inline const Name& CellGauge::getName () const { return _name; } - inline const Name& CellGauge::getPinLayerName () const { return _pinLayerName; } - inline const DbU::Unit CellGauge::getPitch () const { return _pitch; } - inline const DbU::Unit CellGauge::getSliceHeight () const { return _sliceHeight; } - inline const DbU::Unit CellGauge::getSliceStep () const { return _sliceStep; } + inline bool CellGauge::isPad () const { return _flags & Flags::Pad; } + inline const Name& CellGauge::getName () const { return _name; } + inline const Name& CellGauge::getPinLayerName () const { return _pinLayerName; } + inline const DbU::Unit CellGauge::getPitch () const { return _pitch; } + inline const DbU::Unit CellGauge::getSliceHeight () const { return _sliceHeight; } + inline const DbU::Unit CellGauge::getSliceStep () const { return _sliceStep; } + inline unsigned long CellGauge::getFlags () const { return _flags; } + inline void CellGauge::setFlags ( unsigned long flags ) { _flags |= flags; } + inline void CellGauge::resetFlags ( unsigned long flags ) { _flags &= ~flags; } + inline void CellGauge::setPitch ( DbU::Unit pitch ) { _pitch = pitch; } + inline void CellGauge::setSliceHeight ( DbU::Unit height ) { _sliceHeight = height; } + inline void CellGauge::setSliceStep ( DbU::Unit step ) { _sliceStep = step; } // ------------------------------------------------------------------- diff --git a/crlcore/src/ccore/crlcore/DefImport.h b/crlcore/src/ccore/crlcore/DefImport.h index b369e245..6e23441f 100644 --- a/crlcore/src/ccore/crlcore/DefImport.h +++ b/crlcore/src/ccore/crlcore/DefImport.h @@ -8,7 +8,7 @@ // | C a d e n c e D E F I m p o r t e r | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./crlcore/DefImport.h" | // +-----------------------------------------------------------------+ @@ -31,7 +31,8 @@ namespace CRL { public: enum Flags { FitAbOnCells=0x1 }; public: - static Hurricane::Cell* load ( std::string design, unsigned int flags ); + static void reset (); + static Hurricane::Cell* load ( std::string design, unsigned int flags ); }; diff --git a/crlcore/src/ccore/gds/GdsDriver.cpp b/crlcore/src/ccore/gds/GdsDriver.cpp index d4ac19a0..74c492e9 100644 --- a/crlcore/src/ccore/gds/GdsDriver.cpp +++ b/crlcore/src/ccore/gds/GdsDriver.cpp @@ -608,23 +608,33 @@ namespace { } } } else { - Diagonal* diagonal = dynamic_cast(component); - if (diagonal) { + Rectilinear* rectilinear = dynamic_cast(component); + if (rectilinear) { for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) { (*this) << BOUNDARY; (*this) << layer; - (*this) << diagonal->getContour(); + (*this) << rectilinear->getPoints(); (*this) << ENDEL; } - } else if ( dynamic_cast(component) - or dynamic_cast(component) - or dynamic_cast(component) - or dynamic_cast(component)) { - for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) { - (*this) << BOUNDARY; - (*this) << layer; - (*this) << component->getBoundingBox(layer); - (*this) << ENDEL; + } else { + Diagonal* diagonal = dynamic_cast(component); + if (diagonal) { + for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) { + (*this) << BOUNDARY; + (*this) << layer; + (*this) << diagonal->getContour(); + (*this) << ENDEL; + } + } else if ( dynamic_cast(component) + or dynamic_cast(component) + or dynamic_cast(component) + or dynamic_cast(component)) { + for ( const BasicLayer* layer : component->getLayer()->getBasicLayers() ) { + (*this) << BOUNDARY; + (*this) << layer; + (*this) << component->getBoundingBox(layer); + (*this) << ENDEL; + } } } } diff --git a/crlcore/src/ccore/ispd05/Ispd05Bookshelf.cpp b/crlcore/src/ccore/ispd05/Ispd05Bookshelf.cpp index 82f039b9..214fe60f 100644 --- a/crlcore/src/ccore/ispd05/Ispd05Bookshelf.cpp +++ b/crlcore/src/ccore/ispd05/Ispd05Bookshelf.cpp @@ -154,6 +154,7 @@ namespace CRL { AllianceFramework* af = AllianceFramework::get(); pitch = af->getCellGauge()->getPitch(); + size_t count = 0; UpdateSession::open (); unique_ptr circuit ( Bookshelf::Circuit::parse( benchmark @@ -172,6 +173,11 @@ namespace CRL { for ( auto net : circuit->getNets() ) { dots.dot(); Net::create ( cell, net->getName() ); + + if (++count % 1000) { + UpdateSession::close (); + UpdateSession::open (); + } } dots.finish( Dots::Reset|Dots::FirstDot ); @@ -196,6 +202,11 @@ namespace CRL { Net* masterNet = master->getNet( netName ); instance->getPlug( masterNet )->setNet( cell->getNet(netName) ); } + + if (++count % 1000) { + UpdateSession::close (); + UpdateSession::open (); + } } dots.finish( Dots::Reset|Dots::FirstDot ); diff --git a/crlcore/src/ccore/lefdef/DefImport.cpp b/crlcore/src/ccore/lefdef/DefImport.cpp index 1204a082..cdae7413 100644 --- a/crlcore/src/ccore/lefdef/DefImport.cpp +++ b/crlcore/src/ccore/lefdef/DefImport.cpp @@ -65,6 +65,8 @@ namespace { class DefParser { public: static AllianceFramework* getFramework (); + static Cell* getLefCell ( string name ); + static void setUnits ( double ); static DbU::Unit fromDefUnits ( int ); static Transformation::Orientation fromDefOrientation ( int orient ); @@ -98,6 +100,7 @@ namespace { void toHurricaneName ( string& ); inline void mergeToFitOnCellsDieArea ( const Box& ); private: + static int _unitsCbk ( defrCallbackType_e, double , defiUserData ); static int _busBitCbk ( defrCallbackType_e, const char* , defiUserData ); static int _designEndCbk ( defrCallbackType_e, void* , defiUserData ); static int _dieAreaCbk ( defrCallbackType_e, defiBox* , defiUserData ); @@ -111,6 +114,7 @@ namespace { private: static double _defUnits; static AllianceFramework* _framework; + static Library* _lefRootLibrary; string _file; unsigned int _flags; AllianceLibrary* _library; @@ -125,8 +129,9 @@ namespace { }; - double DefParser::_defUnits = 0.01; - AllianceFramework* DefParser::_framework = NULL; + double DefParser::_defUnits = 0.01; + AllianceFramework* DefParser::_framework = NULL; + Library* DefParser::_lefRootLibrary = NULL; DefParser::DefParser ( string& file, AllianceLibrary* library, unsigned int flags ) @@ -143,6 +148,7 @@ namespace { , _errors () { defrInit (); + defrSetUnitsCbk ( _unitsCbk ); defrSetBusBitCbk ( _busBitCbk ); defrSetDesignEndCbk ( _designEndCbk ); defrSetDieAreaCbk ( _dieAreaCbk ); @@ -162,7 +168,8 @@ namespace { AllianceFramework* DefParser::getFramework () { return _framework; } - inline DbU::Unit DefParser::fromDefUnits ( int u ) { return DbU::lambda(_defUnits*(double)u); } + inline void DefParser::setUnits ( double units ) { _defUnits = 1/units; } + inline DbU::Unit DefParser::fromDefUnits ( int u ) { return DbU::fromPhysical(_defUnits*(double)u,DbU::UnitPower::Micro); } inline bool DefParser::hasErrors () { return not _errors.empty(); } inline unsigned int DefParser::getFlags () const { return _flags; } inline string DefParser::getBusBits () const { return _busBits; } @@ -182,6 +189,32 @@ namespace { inline void DefParser::mergeToFitOnCellsDieArea ( const Box& box ) { _fitOnCellsDieArea.merge(box); } + Cell* DefParser::getLefCell ( string name ) + { + if (not _lefRootLibrary) { + DataBase* db = DataBase::getDB(); + Library* rootLibrary = db->getRootLibrary(); + + if (rootLibrary) { + _lefRootLibrary = rootLibrary->getLibrary( "LEF" ); + } + } + + Cell* masterCell = NULL; + if (_lefRootLibrary) { + for ( Library* library : _lefRootLibrary->getLibraries() ) { + masterCell = library->getCell( name ); + if (masterCell) break; + } + } + + if (not masterCell) + masterCell = DefParser::getFramework()->getCell ( name, Catalog::State::Views ); + + return masterCell; + } + + Transformation::Orientation DefParser::fromDefOrientation ( int orient ) { // Note : the codes between DEF & Hurricane matches. @@ -273,6 +306,14 @@ namespace { } + int DefParser::_unitsCbk ( defrCallbackType_e c, double defUnits, lefiUserData ud ) + { + DefParser* parser = (DefParser*)ud; + parser->setUnits( defUnits ); + return 0; + } + + int DefParser::_busBitCbk ( defrCallbackType_e c, const char* busbits, lefiUserData ud ) { DefParser* parser = (DefParser*)ud; @@ -343,8 +384,8 @@ namespace { string componentName = component->name(); string componentId = component->id(); + Cell* masterCell = getLefCell( componentName ); - Cell* masterCell = DefParser::getFramework()->getCell ( componentName, Catalog::State::Views ); if ( masterCell == NULL ) { ostringstream message; message << "Unknown model/Cell (LEF MACRO) " << componentName << " in <%s>."; @@ -375,6 +416,9 @@ namespace { parser->mergeToFitOnCellsDieArea ( instance->getAbutmentBox() ); } + //cerr << "Create " << componentId << " of " << masterCell + // << " ab:" << masterCell->getAbutmentBox() << " @" << placement << endl; + return 0; } @@ -412,13 +456,13 @@ namespace { name.erase ( 0, name.size()-75 ); name.insert( 0, 3, '.' ); } - name.insert( 0, "<" ); - name.insert( name.size(), ">" ); + name.insert( 0, "\"" ); + name.insert( name.size(), "\"" ); if (name.size() < 80) name.insert( name.size(), 80-name.size(), ' ' ); if (tty::enabled()) { - cmess2 << " " - << tty::bold << setw(7) << setfill('0') << ++netCount << ":" << setfill(' ') + cmess2 << " " << setfill(' ') << tty::reset << setw(80) << name << tty::cr; cmess2.flush (); } @@ -573,7 +617,7 @@ namespace { } -} // End of anonymous namespace. +} // Anonymous namespace. #endif // HAVE_LEFDEF @@ -606,4 +650,10 @@ namespace CRL { } -} // End of CRL namespace. + void DefImport::reset () + { + // DefParser::reset(); + } + + +} // CRL namespace. diff --git a/crlcore/src/ccore/lefdef/LefImport.cpp b/crlcore/src/ccore/lefdef/LefImport.cpp index 55ae22dc..81bdc09a 100644 --- a/crlcore/src/ccore/lefdef/LefImport.cpp +++ b/crlcore/src/ccore/lefdef/LefImport.cpp @@ -84,6 +84,8 @@ namespace { inline Library* getLibrary ( bool create=false ); inline Cell* getCell () const; inline void setCell ( Cell* ); + inline CellGauge* getCellGauge () const; + inline void setCellGauge ( CellGauge* ); inline Net* getNet () const; inline void setNet ( Net* ); static void setCoreSite ( DbU::Unit x, DbU::Unit y ); @@ -103,17 +105,18 @@ namespace { inline int getNthCut () const; inline void incNthCut (); inline RoutingGauge* getRoutingGauge () const; - inline CellGauge* getCellGauge () const; inline void addPinSegment ( string name, Segment* ); inline void clearPinSegments (); private: - static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData ); - static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData ); - static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData ); - static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData ); - static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData ); - static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData ); - void _pinPostProcess (); + static int _unitsCbk ( lefrCallbackType_e, lefiUnits* , lefiUserData ); + static int _layerCbk ( lefrCallbackType_e, lefiLayer* , lefiUserData ); + static int _siteCbk ( lefrCallbackType_e, lefiSite* , lefiUserData ); + static int _obstructionCbk ( lefrCallbackType_e, lefiObstruction*, lefiUserData ); + static int _macroCbk ( lefrCallbackType_e, lefiMacro* , lefiUserData ); + static int _macroSiteCbk ( lefrCallbackType_e, const lefiMacroSite* , lefiUserData ); + static int _pinCbk ( lefrCallbackType_e, lefiPin* , lefiUserData ); + void _pinStdPostProcess (); + void _pinPadPostProcess (); private: string _file; string _libraryName; @@ -141,6 +144,7 @@ namespace { inline Library* LefParser::getLibrary ( bool create ) { if (not _library and create) createLibrary(); return _library; } inline Cell* LefParser::getCell () const { return _cell; } inline void LefParser::setCell ( Cell* cell ) { _cell=cell; } + inline void LefParser::setCellGauge ( CellGauge* gauge ) { _cellGauge=gauge; } inline Net* LefParser::getNet () const { return _net; } inline void LefParser::setNet ( Net* net ) { _net=net; } inline DbU::Unit LefParser::fromUnitsMicrons ( double d ) const { return DbU::fromPhysical(d,DbU::Micro); } @@ -219,6 +223,7 @@ namespace { lefrSetSiteCbk ( _siteCbk ); lefrSetObstructionCbk( _obstructionCbk ); lefrSetMacroCbk ( _macroCbk ); + lefrSetMacroSiteCbk ( _macroSiteCbk ); lefrSetPinCbk ( _pinCbk ); } @@ -341,27 +346,48 @@ namespace { int LefParser::_siteCbk ( lefrCallbackType_e c, lefiSite* site, lefiUserData ud ) { - LefParser* parser = (LefParser*)ud; + LefParser* parser = (LefParser*)ud; + AllianceFramework* af = AllianceFramework::get(); if (site->hasClass()) { string siteClass = site->siteClass(); boost::to_upper( siteClass ); - if (siteClass == "CORE") { - CellGauge* gauge = parser->getCellGauge(); + DbU::Unit lefSiteWidth = DbU::fromPhysical( site->sizeX(), DbU::Micro ); + DbU::Unit lefSiteHeight = DbU::fromPhysical( site->sizeY(), DbU::Micro ); - DbU::Unit lefSliceStep = DbU::fromPhysical( site->sizeX(), DbU::Micro ); - DbU::Unit lefSliceHeight = DbU::fromPhysical( site->sizeY(), DbU::Micro ); - DbU::Unit crlSliceStep = gauge->getSliceStep (); - DbU::Unit crlSliceHeight = gauge->getSliceHeight(); + if (siteClass == "CORE") { + CellGauge* gauge = parser->getCellGauge(); + DbU::Unit crlSliceStep = gauge->getSliceStep (); + DbU::Unit crlSliceHeight = gauge->getSliceHeight(); if (not parser->getCoreSiteX() or ((parser->getCoreSiteX() != crlSliceStep) and (parser->getCoreSiteY() != crlSliceHeight)) ) { - parser->setCoreSite( lefSliceStep, lefSliceHeight ); + parser->setCoreSite( lefSiteWidth, lefSiteHeight ); - if ( (crlSliceStep == lefSliceStep) and (crlSliceHeight == lefSliceHeight) ) + if ( (crlSliceStep == lefSiteWidth) and (crlSliceHeight == lefSiteHeight) ) cerr << " - Site \"" << site->name() << "\" of class CORE match the Coriolis Cell gauge." << endl; } + } else if (siteClass == "PAD") { + string name = string("LEF.") + site->name(); + CellGauge* cg = af->getCellGauge( name ); + + if (cg) { + if ( (cg->getSliceStep() != lefSiteWidth) or (cg->getSliceHeight() != lefSiteHeight)) { + cerr << " - Site \"" << site->name() << "\" of class PAD has mismatched redefinition OVERWRITING." << endl; + cerr << " width: " << DbU::getValueString(cg->getSliceStep ()) << " vs. " << DbU::getValueString(lefSiteWidth) + << " height: " << DbU::getValueString(cg->getSliceHeight()) << " vs. " << DbU::getValueString(lefSiteHeight) + << endl; + //cg->setPitch ( lefSiteWidth ); + cg->setSliceStep ( lefSiteWidth ); + cg->setSliceHeight( lefSiteHeight ); + } + cg->setFlags( CellGauge::Flags::Pad ); + } else { + cg = CellGauge::create( name.c_str(), "unknown", lefSiteWidth, lefSiteHeight, lefSiteWidth ); + cg->setFlags( CellGauge::Flags::Pad ); + af->addCellGauge( cg ); + } } } @@ -421,7 +447,10 @@ namespace { int LefParser::_macroCbk ( lefrCallbackType_e c, lefiMacro* macro, lefiUserData ud ) { - LefParser* parser = (LefParser*)ud; + AllianceFramework* af = AllianceFramework::get(); + LefParser* parser = (LefParser*)ud; + + parser->setCellGauge( NULL ); string cellName = macro->name(); DbU::Unit width = 0; @@ -441,17 +470,47 @@ namespace { cell->setAbutmentBox( Box( 0, 0, width, height ) ); } - parser->_pinPostProcess(); + bool isPad = false; + string gaugeName = "Unknown SITE"; + if (macro->hasSiteName()) { + gaugeName = string("LEF.") + macro->siteName(); + CellGauge* cg = af->getCellGauge( gaugeName ); + if (cg) { + isPad = cg->isPad(); + if (cg->getSliceHeight() != height) { + cerr << Warning( "LefParser::_macroCbk(): Cell height %s do not match CellGauge/SITE \"%s\" of %s." + , DbU::getValueString(height).c_str() + , getString(cg->getName()).c_str() + , DbU::getValueString(cg->getSliceHeight()).c_str() + ) << endl; + } + parser->setCellGauge( cg ); + } else { + cerr << Warning( "LefParser::_macroCbk(): No CellGauge associated to SITE \"%s\"." + , macro->siteName() ) << endl; + } + } + + if (not isPad) parser->_pinStdPostProcess(); + else parser->_pinPadPostProcess(); parser->clearPinSegments(); cerr << " - " << cellName - << " " << DbU::getValueString(width) << " " << DbU::getValueString(height) << endl; + << " " << DbU::getValueString(width) << " " << DbU::getValueString(height) + << " " << gaugeName; + if (isPad) cerr << " (PAD)"; + cerr << endl; + parser->setCell( NULL ); return 0; } + int LefParser::_macroSiteCbk ( lefrCallbackType_e c, const lefiMacroSite* site, lefiUserData ud ) + { return 0; } + + int LefParser::_pinCbk ( lefrCallbackType_e c, lefiPin* pin, lefiUserData ud ) { LefParser* parser = (LefParser*)ud; @@ -519,6 +578,10 @@ namespace { //cerr << " | " << segment << endl; continue; } + if (geoms->itemType(igeom) == lefiGeomClassE) { + // Ignore CLASS . Deduced from segments positions. + continue; + } string geomTypeName; switch ( geoms->itemType(igeom) ) { @@ -550,13 +613,13 @@ namespace { } - void LefParser::_pinPostProcess () + void LefParser::_pinStdPostProcess () { const Layer* metal1 = _routingGauge->getLayerGauge( (size_t)0 )->getLayer(); const RoutingLayerGauge* gaugeMetal2 = _routingGauge->getLayerGauge( 1 ); Box ab = _cell->getAbutmentBox(); - //cerr << " @ _pinPostProcess" << endl; + //cerr << " @ _pinStdPostProcess" << endl; for ( auto element : _pinSegments ) { string pinName = element.first; @@ -612,8 +675,11 @@ namespace { } if (ongrids.empty()) { - cerr << Warning( "LefParser::_pinPostProcess(): Pin \"%s\" has no terminal ongrid." + cerr << Warning( "LefParser::_pinStdPostProcess(): Pin \"%s\" has no terminal ongrid." , pinName.c_str() ) << endl; + for ( Segment* segment : segments ) { + NetExternalComponents::setExternal( segment ); + } } else { for ( Segment* segment : ongrids ) { NetExternalComponents::setExternal( segment ); @@ -623,6 +689,112 @@ namespace { } + void LefParser::_pinPadPostProcess () + { + Box ab = getCell()->getAbutmentBox(); + bool isCornerPad = (_cellGauge) and (_cellGauge->getSliceHeight() == _cellGauge->getSliceStep()); + + for ( auto element : _pinSegments ) { + string pinName = element.first; + vector& segments = element.second; + vector ongrids; + + if (segments.empty()) continue; + + Net* net = segments[0]->getNet(); + + for ( size_t i=0 ; igetBoundingBox(); + Interval hspan = Interval( bb.getXMin(), bb.getXMax() ); + Interval vspan = Interval( bb.getYMin(), bb.getYMax() ); + Segment* capSegment = NULL; + + if (segments[i]->getLayer()->isBlockage()) continue; + + if (net->isSupply()) { + if (hspan.contains(ab.getXMin())) { + capSegment = Horizontal::create( net + , segments[i]->getLayer() + , vspan.getCenter() + , vspan.getSize() + , ab.getXMin() + , hspan.getVMax() + ); + } else if (hspan.contains(ab.getXMax())) { + capSegment = Horizontal::create( net + , segments[i]->getLayer() + , vspan.getCenter() + , vspan.getSize() + , hspan.getVMin() + , ab.getXMax() + ); + } + } + + if (not capSegment) { + vector distanceToSide; + distanceToSide.push_back( std::abs(bb.getXMin() - ab.getXMin()) ); // West. + distanceToSide.push_back( std::abs(ab.getXMax() - bb.getXMax()) ); // East. + distanceToSide.push_back( std::abs(bb.getYMin() - ab.getYMin()) ); // South. + distanceToSide.push_back( std::abs(ab.getYMax() - bb.getYMax()) ); // North. + + size_t closestSide = ((isCornerPad) ? 0 : 2); + for ( size_t i=closestSide ; i < distanceToSide.size() ; ++i ) { + if (distanceToSide[i] < distanceToSide[closestSide]) + closestSide = i; + } + + switch ( closestSide ) { + default: + case 0: // West. + capSegment = Horizontal::create( net + , segments[i]->getLayer() + , vspan.getCenter() + , vspan.getSize() + , ab.getXMin() + , hspan.getVMax() + ); + break; + case 1: // East. + capSegment = Horizontal::create( net + , segments[i]->getLayer() + , vspan.getCenter() + , vspan.getSize() + , hspan.getVMin() + , ab.getXMax() + ); + break; + case 2: // South. + capSegment = Vertical::create( net + , segments[i]->getLayer() + , hspan.getCenter() + , hspan.getSize() + , ab.getYMin() + , vspan.getVMax() + ); + break; + case 3: // North. + capSegment = Vertical::create( net + , segments[i]->getLayer() + , hspan.getCenter() + , hspan.getSize() + , vspan.getVMin() + , ab.getYMax() + ); + break; + } + } + + if (capSegment) { + NetExternalComponents::setExternal( capSegment ); + segments[i]->destroy(); + segments[i] = NULL; + } + } + } + } + + int LefParser::flushErrors () { int code = (hasErrors()) ? 1 : 0; diff --git a/crlcore/src/cyclop/CMakeLists.txt b/crlcore/src/cyclop/CMakeLists.txt index a8352187..21b92dfe 100644 --- a/crlcore/src/cyclop/CMakeLists.txt +++ b/crlcore/src/cyclop/CMakeLists.txt @@ -21,9 +21,9 @@ link_directories ( ${CRLCORE_BINARY_DIR}/src/ccore ) -if(NOT WITH_QT5) + if(NOT WITH_QT5) list ( APPEND cpps ${mocCpps} ) -endif() + endif() add_executable ( cyclop ${cpps} ) target_link_libraries ( cyclop crlcore diff --git a/crlcore/src/pyCRL/CMakeLists.txt b/crlcore/src/pyCRL/CMakeLists.txt index 0134ecda..7e74aec0 100644 --- a/crlcore/src/pyCRL/CMakeLists.txt +++ b/crlcore/src/pyCRL/CMakeLists.txt @@ -46,6 +46,7 @@ PyBlif.cpp PyGds.cpp PyLefImport.cpp + PyDefImport.cpp ) set( pyIncludes crlcore/PyBanner.h crlcore/PyCatalog.h @@ -65,6 +66,7 @@ crlcore/PyBlif.h crlcore/PyGds.h crlcore/PyLefImport.h + crlcore/PyDefImport.h ) set( depLibs crlcore ${HURRICANE_PYTHON_LIBRARIES} diff --git a/crlcore/src/pyCRL/PyAllianceFramework.cpp b/crlcore/src/pyCRL/PyAllianceFramework.cpp index b15acf5c..5831f1b1 100644 --- a/crlcore/src/pyCRL/PyAllianceFramework.cpp +++ b/crlcore/src/pyCRL/PyAllianceFramework.cpp @@ -440,6 +440,39 @@ extern "C" { } + static PyObject* PyAllianceFramework_matchCellGauge ( PyAllianceFramework* self, PyObject* args ) + { + cdebug_log(30,0) << "PyAllianceFramework_matchCellGauge()" << endl; + + CellGauge* cg = NULL; + HTRY + METHOD_HEAD( "AllianceFramework.matchCellGauge()" ) + + PyObject* arg0; + PyObject* arg1; + __cs.init( "AllianceFramework.matchCellGauge" ); + if (not PyArg_ParseTuple( args + , "O&O&|O&:AllianceFramework.matchCellGauge" + , Converter, &arg0 + , Converter, &arg1 + )) { + PyErr_SetString( ConstructorError, "Invalid number of parameters for AllianceFramework.matchCellGauge()." ); + return NULL; + } + + if (__cs.getObjectIds() == ":int:int") { + cg = af->matchCellGauge( PyAny_AsLong(arg0), PyAny_AsLong(arg1) ); + } else { + PyErr_SetString( ConstructorError, "Bad parameter type for AllianceFramework.matchCelGauge()." ); + return NULL; + } + HCATCH + + if (cg == NULL) Py_RETURN_NONE; + return PyCellGauge_Link(cg); + } + + static PyObject* PyAllianceFramework_loadLibraryCells ( PyAllianceFramework* self, PyObject* args ) { cdebug_log(30,0) << "PyAllianceFramework_loadLibraryCells()" << endl; @@ -505,6 +538,8 @@ extern "C" { , "Add a new cell gauge." } , { "getCellGauge" , (PyCFunction)PyAllianceFramework_getCellGauge , METH_VARARGS , "Get a cell gauge (whithout a name, return the default)." } + , { "matchCellGauge" , (PyCFunction)PyAllianceFramework_matchCellGauge , METH_VARARGS + , "Find the first CellGauge comptible with width and height." } , { "addRoutingGauge" , (PyCFunction)PyAllianceFramework_addRoutingGauge , METH_VARARGS , "Add a new routing gauge." } , { "getRoutingGauge" , (PyCFunction)PyAllianceFramework_getRoutingGauge , METH_VARARGS diff --git a/crlcore/src/pyCRL/PyBlif.cpp b/crlcore/src/pyCRL/PyBlif.cpp index 45f67954..945f87b5 100644 --- a/crlcore/src/pyCRL/PyBlif.cpp +++ b/crlcore/src/pyCRL/PyBlif.cpp @@ -87,10 +87,13 @@ extern "C" { Cell* cell = NULL; HTRY - char* benchName = NULL; + char* benchName = NULL; + PyObject* pyEnforceVhdl = NULL; - if (PyArg_ParseTuple( args, "s:Blif.load", &benchName )) { - cell = Blif::load( benchName ); + if (PyArg_ParseTuple( args, "s|O:Blif.load", &benchName, &pyEnforceVhdl )) { + bool enforceVhdl = true; + if (pyEnforceVhdl and (PyObject_IsTrue(pyEnforceVhdl) == 0)) enforceVhdl = false; + cell = Blif::load( benchName, enforceVhdl ); } else { PyErr_SetString ( ConstructorError, "Blif.load(): Bad type or bad number of parameters." ); return NULL; diff --git a/crlcore/src/pyCRL/PyCRL.cpp b/crlcore/src/pyCRL/PyCRL.cpp index 985e54a9..71a03f38 100644 --- a/crlcore/src/pyCRL/PyCRL.cpp +++ b/crlcore/src/pyCRL/PyCRL.cpp @@ -34,6 +34,7 @@ #include "crlcore/PyBlif.h" #include "crlcore/PyGds.h" #include "crlcore/PyLefImport.h" +#include "crlcore/PyDefImport.h" #include "crlcore/VhdlEntity.h" @@ -124,6 +125,7 @@ extern "C" { PyBlif_LinkPyType (); PyGds_LinkPyType (); PyLefImport_LinkPyType (); + PyDefImport_LinkPyType (); PYTYPE_READY ( Banner ); PYTYPE_READY ( CatalogState ); @@ -144,6 +146,7 @@ extern "C" { PYTYPE_READY ( Blif ); PYTYPE_READY ( Gds ); PYTYPE_READY ( LefImport ); + PYTYPE_READY ( DefImport ); // Identifier string can take up to 10 characters. __cs.addType ( "alcLib" , &PyTypeAllianceLibrary , "" , false ); @@ -198,6 +201,8 @@ extern "C" { PyModule_AddObject ( module, "Gds", (PyObject*)&PyTypeGds ); Py_INCREF ( &PyTypeLefImport ); PyModule_AddObject ( module, "LefImport", (PyObject*)&PyTypeLefImport ); + Py_INCREF ( &PyTypeDefImport ); + PyModule_AddObject ( module, "DefImport", (PyObject*)&PyTypeDefImport ); PyCatalog_postModuleInit (); PyEnvironment_postModuleInit (); diff --git a/crlcore/src/pyCRL/PyCellGauge.cpp b/crlcore/src/pyCRL/PyCellGauge.cpp index 85dfadd4..84eadbe2 100644 --- a/crlcore/src/pyCRL/PyCellGauge.cpp +++ b/crlcore/src/pyCRL/PyCellGauge.cpp @@ -56,9 +56,11 @@ extern "C" { // +=================================================================+ + DirectGetBoolAttribute(PyCellGauge_isPad ,isPad ,PyCellGauge,CellGauge) DirectGetLongAttribute(PyCellGauge_getSliceHeight,getSliceHeight,PyCellGauge,CellGauge) DirectGetLongAttribute(PyCellGauge_getSliceStep ,getSliceStep ,PyCellGauge,CellGauge) DirectGetLongAttribute(PyCellGauge_getPitch ,getPitch ,PyCellGauge,CellGauge) + DirectGetNameAttribute(PyCellGauge_getName ,getName ,PyCellGauge,CellGauge) static PyObject* PyCellGauge_create ( PyObject*, PyObject* args ) @@ -113,9 +115,11 @@ extern "C" { PyMethodDef PyCellGauge_Methods[] = { { "create" , (PyCFunction)PyCellGauge_create , METH_VARARGS|METH_STATIC , "Create a new CellGauge." } + , { "isPad" , (PyCFunction)PyCellGauge_isPad , METH_NOARGS , "Is the gauge for the IO pads." } , { "getSliceHeight" , (PyCFunction)PyCellGauge_getSliceHeight, METH_NOARGS , "Return the slice height." } , { "getSliceStep" , (PyCFunction)PyCellGauge_getSliceStep , METH_NOARGS , "Return the slice step." } , { "getPitch" , (PyCFunction)PyCellGauge_getPitch , METH_NOARGS , "Return the smallest common pitch." } + , { "getName" , (PyCFunction)PyCellGauge_getName , METH_NOARGS , "Return the gauge name." } //, { "destroy" , (PyCFunction)PyCellGauge_destroy , METH_VARARGS // , "Destroy the associated hurricane object. The python object remains." } , {NULL, NULL, 0, NULL} /* sentinel */ diff --git a/crlcore/src/pyCRL/PyDefImport.cpp b/crlcore/src/pyCRL/PyDefImport.cpp new file mode 100644 index 00000000..74046cae --- /dev/null +++ b/crlcore/src/pyCRL/PyDefImport.cpp @@ -0,0 +1,121 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2018, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | Alliance / Hurricane Interface | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./PyDefImport.cpp" | +// +-----------------------------------------------------------------+ + + +#include "crlcore/PyDefImport.h" +#include "hurricane/isobar/PyCell.h" +#include +#include + + +namespace CRL { + + using std::cerr; + using std::endl; + using std::hex; + using std::string; + using std::ostringstream; + using Hurricane::tab; + using Hurricane::Exception; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::Cell; + using Isobar::ProxyProperty; + using Isobar::ProxyError; + using Isobar::ConstructorError; + using Isobar::HurricaneError; + using Isobar::HurricaneWarning; + using Isobar::ParseOneArg; + using Isobar::ParseTwoArg; + using Isobar::__cs; + using Isobar::PyCell_Link; + + +extern "C" { + + +#if defined(__PYTHON_MODULE__) + +// +=================================================================+ +// | "PyDefImport" Python Module Code Part | +// +=================================================================+ + + + static PyObject* PyDefImport_load ( PyObject*, PyObject* args ) + { + cdebug_log(30,0) << "PyDefImport_load()" << endl; + + Cell* cell = NULL; + + HTRY + char* defFile = NULL; + + if (PyArg_ParseTuple( args, "s:DefImport.load", &defFile )) { + cell = DefImport::load( defFile, 0 ); + } else { + PyErr_SetString ( ConstructorError, "DefImport.load(): Bad type or bad number of parameters." ); + return NULL; + } + HCATCH + + return (PyObject*)PyCell_Link( cell ); + } + + + static PyObject* PyDefImport_reset ( PyObject*, PyObject* ) + { + cdebug_log(30,0) << "PyDefImport_reset()" << endl; + HTRY + DefImport::reset(); + HCATCH + Py_RETURN_NONE; + } + + + // Standart Destroy (Attribute). + + + PyMethodDef PyDefImport_Methods[] = + { { "load" , (PyCFunction)PyDefImport_load , METH_VARARGS|METH_STATIC + , "Load a complete Cadence LEF library." } + , { "reset" , (PyCFunction)PyDefImport_reset , METH_NOARGS|METH_STATIC + , "Reset the Cadence LEF parser (clear technology)." } + //, { "destroy" , (PyCFunction)PyDefImport_destroy , METH_VARARGS + // , "Destroy the associated hurricane object. The python object remains." } + , {NULL, NULL, 0, NULL} /* sentinel */ + }; + + + NoObjectDeleteMethod(DefImport) + PyTypeObjectLinkPyTypeWithoutObject(DefImport,DefImport) + + +#else // End of Python Module Code Part. + + +// +=================================================================+ +// | "PyDefImport" Shared Library Code Part | +// +=================================================================+ + + // Type Definition. + PyTypeObjectDefinitionsOfModule(CRL,DefImport) + + +#endif // End of Shared Library Code Part. + +} // extern "C". + +} // CRL namespace. diff --git a/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp b/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp index 561fecf5..47abc85c 100644 --- a/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp +++ b/crlcore/src/pyCRL/PyRoutingLayerGauge.cpp @@ -245,7 +245,7 @@ extern "C" { unsigned int depth = 0; if (PyArg_ParseTuple( args, "OI:RoutingLayerGauge.getTrackIndex", &pyStart, &depth)) { - trackPosition = rlg->getTrackNumber( PyAny_AsLong(pyStart), depth); + trackPosition = rlg->getTrackPosition( PyAny_AsLong(pyStart), depth); } else { PyErr_SetString ( ConstructorError, "Bad parameters given to RoutingLayerGauge.getTrackPosition()." ); return NULL; diff --git a/crlcore/src/pyCRL/crlcore/PyDefImport.h b/crlcore/src/pyCRL/crlcore/PyDefImport.h new file mode 100644 index 00000000..5060e1a2 --- /dev/null +++ b/crlcore/src/pyCRL/crlcore/PyDefImport.h @@ -0,0 +1,55 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2017-2018, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | Alliance / Hurricane Interface | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./crlcore/PyDefImport.h" | +// +-----------------------------------------------------------------+ + + +#ifndef CRL_PY_DEF_IMPORT_H +#define CRL_PY_DEF_IMPORT_H + +#include "hurricane/isobar/PyHurricane.h" +#include "crlcore/DefImport.h" + + +namespace CRL { + +extern "C" { + + +// ------------------------------------------------------------------- +// Python Object : "PyDefImport". + + typedef struct { + PyObject_HEAD + } PyDefImport; + + +// ------------------------------------------------------------------- +// Functions & Types exported to "PyCRL.ccp". + + extern PyTypeObject PyTypeDefImport; + extern PyMethodDef PyDefImport_Methods[]; + + extern void PyDefImport_LinkPyType(); + + +#define IsPyDefImport(v) ( (v)->ob_type == &PyTypeDefImport ) +#define PY_DEFIMPORT(v) ( (PyDefImport*)(v) ) + + +} // extern "C". + +} // CRL namespace. + +#endif // CRL_PY_DEF_IMPORT_H diff --git a/cumulus/src/plugins/ChipPlugin.py b/cumulus/src/plugins/ChipPlugin.py index 7504fe51..d0f04a18 100644 --- a/cumulus/src/plugins/ChipPlugin.py +++ b/cumulus/src/plugins/ChipPlugin.py @@ -183,8 +183,10 @@ class PlaceCore ( chip.Configuration.ChipConfWrapper ): # Plugin hook functions, unicornHook:menus, ScritMain:call def unicornHook ( **kw ): - plugins.kwUnicornHook( 'plugins.chip' - , 'Chip Placement' + kw['beforeAction'] = 'placeAndRoute.stepByStep' + + plugins.kwUnicornHook( 'placeAndRoute.placeChip' + , 'PLace Chip' , 'Place a Complete Chip (pads && core)' , sys.modules[__name__].__file__ , **kw diff --git a/cumulus/src/plugins/ClockTreePlugin.py b/cumulus/src/plugins/ClockTreePlugin.py index 5cc31b6f..60bb8d38 100755 --- a/cumulus/src/plugins/ClockTreePlugin.py +++ b/cumulus/src/plugins/ClockTreePlugin.py @@ -20,6 +20,7 @@ try: import math import Cfg import Hurricane + from Hurricane import Breakpoint import Viewer import CRL from CRL import RoutingLayerGauge @@ -55,9 +56,11 @@ except Exception, e: # Plugin hook functions, unicornHook:menus, ScritMain:call def unicornHook ( **kw ): - plugins.kwUnicornHook( 'plugins.clockTree' - , 'ClockTree' - , 'Build a buffered H-Tree for the clock' + kw['beforeAction'] = 'placeAndRoute.placeChip' + + plugins.kwUnicornHook( 'placeAndRoute.clockTree' + , 'Place Block && Clock Tree' + , 'Place a block with a buffered H-Tree for the clock' , sys.modules[__name__].__file__ , **kw ) diff --git a/cumulus/src/plugins/RSavePlugin.py b/cumulus/src/plugins/RSavePlugin.py index 357e10c8..ac05777e 100644 --- a/cumulus/src/plugins/RSavePlugin.py +++ b/cumulus/src/plugins/RSavePlugin.py @@ -78,9 +78,9 @@ def rsave ( cell, views=CRL.Catalog.State.Physical, depth=0 ): # Plugin hook functions, unicornHook:menus, ScritMain:call def unicornHook ( **kw ): - plugins.kwUnicornHook( 'plugins.rsave' - , 'R-Save Cell (layout)' - , 'Recursively Save Top Cell and it\'s Instances' + plugins.kwUnicornHook( 'tools.rsave' + , 'Recursive Save (layout)' + , 'Recursively save layout of the top cell and it\'s instances' , sys.modules[__name__].__file__ , **kw ) diff --git a/cumulus/src/plugins/RSavePluginAll.py b/cumulus/src/plugins/RSavePluginAll.py index 23b18f36..621dd0fc 100644 --- a/cumulus/src/plugins/RSavePluginAll.py +++ b/cumulus/src/plugins/RSavePluginAll.py @@ -73,9 +73,9 @@ def rsave ( cell, depth=0 ): # Plugin hook functions, unicornHook:menus, ScritMain:call def unicornHook ( **kw ): - plugins.kwUnicornHook( 'plugins.rsaveAll' - , 'R-Save Cell (All)' - , 'Recursively Save Top Cell and it\'s Instances' + plugins.kwUnicornHook( 'tools.rsaveAll' + , 'Rercursive Save (all)' + , 'Recursively save layout and netlist of top cell and it\'s Instances' , sys.modules[__name__].__file__ , **kw ) diff --git a/cumulus/src/plugins/__init__.py b/cumulus/src/plugins/__init__.py index 5684eb98..0906568e 100644 --- a/cumulus/src/plugins/__init__.py +++ b/cumulus/src/plugins/__init__.py @@ -52,7 +52,10 @@ def kwUnicornHook ( menuPath, menuName, menuTip, moduleFile, **kw ): if moduleFile.endswith('.pyc') or moduleFile.endswith('.pyo'): moduleFile = moduleFile[:-1] - editor.addToMenu( menuPath, menuName, menuTip, moduleFile ) + if kw.has_key('beforeAction'): + editor.addToMenu( menuPath, menuName, menuTip, moduleFile, kw['beforeAction'] ) + else: + editor.addToMenu( menuPath, menuName, menuTip, moduleFile ) return diff --git a/cumulus/src/plugins/chip/Configuration.py b/cumulus/src/plugins/chip/Configuration.py index 0d5fb309..69638c81 100644 --- a/cumulus/src/plugins/chip/Configuration.py +++ b/cumulus/src/plugins/chip/Configuration.py @@ -176,6 +176,20 @@ class GaugeConf ( object ): , self._routingGauge.getLayerGauge(depth).getViaWidth() ) + def _getNearestHorizontalTrack ( self, bb, y, flags ): + if flags & GaugeConf.DeepDepth: depth = self._horizontalDeepDepth + else: depth = self._horizontalDepth + + index = self._routingGauge.getLayerGauge(depth).getTrackIndex( bb.getYMin(), bb.getYMax(), y, RoutingLayerGauge.Nearest ) + return self._routingGauge.getLayerGauge(depth).getTrackPosition( bb.getYMin(), index ) + + def _getNearestVerticalTrack ( self, bb, x, flags ): + if flags & GaugeConf.DeepDepth: depth = self._verticalDeepDepth + else: depth = self._verticalDepth + + index = self._routingGauge.getLayerGauge(depth).getTrackIndex( bb.getXMin(), bb.getXMax(), x, RoutingLayerGauge.Nearest ) + return self._routingGauge.getLayerGauge(depth).getTrackPosition( bb.getXMin(), index ) + def _createHorizontal ( self, source, target, y, flags ): if flags & GaugeConf.DeepDepth: depth = self._horizontalDeepDepth else: depth = self._horizontalDepth @@ -309,6 +323,25 @@ class GaugeConf ( object ): def _rpAccessByPlugName ( self, instance, plugName, net, flags=0 ): return self._rpAccess( self._rpByPlugName(instance,plugName,net), flags ) + def _setStackPosition ( self, topContact, x, y ): + topContact.setX( x ) + topContact.setY( y ) + + count = 0 + for component in topContact.getSlaveComponents(): + segment = component + count += 1 + if count != 1: + print ErrorMessage( 1, 'GaugeConf::_setStackPosition(): There must be exactly one segment connected, not %d.' % count) + + if isinstance(segment,Horizontal): + segment.setY( y ) + segment.getOppositeAnchor( topContact ).setY( y ) + elif isinstance(segment,Vertical): + segment.setX( x ) + segment.getOppositeAnchor( topContact ).setX( x ) + return + # ------------------------------------------------------------------- # Class : "Configuration.GaugeConfWrapper". @@ -364,6 +397,15 @@ class GaugeConfWrapper ( object ): def createVertical ( self, source, target, x, flags=0 ): return self._gaugeConf._createVertical( source, target, x, flags ) + def getNearestHorizontalTrack ( self, bb, y, flags ): + return self._gaugeConf._getNearestHorizontalTrack ( bb, y, flags ) + + def getNearestVerticalTrack ( self, bb, x, flags ): + return self._gaugeConf._getNearestVerticalTrack( bb, x, flags ) + + def setStackPosition ( self, topContact, x, y ): + self._gaugeConf._setStackPosition( topContact, x, y ) + # ------------------------------------------------------------------- # Class : "Configuration.ChipConf". diff --git a/cumulus/src/plugins/clocktree/ClockTree.py b/cumulus/src/plugins/clocktree/ClockTree.py index 5fcfe592..1808e352 100755 --- a/cumulus/src/plugins/clocktree/ClockTree.py +++ b/cumulus/src/plugins/clocktree/ClockTree.py @@ -87,7 +87,8 @@ class HTree ( GaugeConfWrapper ): % aspectRatio ) ht = HTree( conf, cell, clockNet, clockBox ) - print ' o Creating Clock H-Tree for <%s>.' % cell.getName() + print ' o Creating clock H-Tree for "%s".' % cell.getName() + print ' - Clock is "%s"' % ht.masterClock.getName() ht.build() trace( 550, '\tht.build() OK\n' ) ht.place() @@ -482,6 +483,8 @@ class HTreeNode ( object ): leafCk = deepPlug.getMasterNet() plugOccurrence.getEntity().setNet( leafCk ) + trace( 550, '\tLeaf clock set to <%s>.\n' % plugOccurrence.getEntity() ) + return def getLeafBufferUnder ( self, point ): @@ -526,12 +529,34 @@ class HTreeNode ( object ): trContact = self.topTree.rpAccessByPlugName( self.trBuffer , self.topTree.bufferIn , self.ckNet ) leftContact = self.topTree.createContact( self.ckNet, blContact.getX(), leftSourceContact.getY() ) rightContact = self.topTree.createContact( self.ckNet, brContact.getX(), rightSourceContact.getY() ) - self.topTree.createHorizontal( leftContact , leftSourceContact, leftSourceContact.getY() , 0 ) - self.topTree.createHorizontal( rightSourceContact, rightContact , rightSourceContact.getY(), 0 ) - self.topTree.createVertical ( leftContact , blContact , leftContact.getX() , 0 ) - self.topTree.createVertical ( tlContact , leftContact , leftContact.getX() , 0 ) - self.topTree.createVertical ( rightContact , brContact , rightContact.getX() , 0 ) - self.topTree.createVertical ( trContact , rightContact , rightContact.getX() , 0 ) + + leftSourceX = self.topTree.getNearestVerticalTrack ( self.topTree.area, leftSourceContact.getX(), 0 ) + leftSourceY = self.topTree.getNearestHorizontalTrack( self.topTree.area, leftSourceContact.getY(), 0 ) + rightSourceX = self.topTree.getNearestVerticalTrack ( self.topTree.area, rightSourceContact.getX(), 0 ) + rightSourceY = self.topTree.getNearestHorizontalTrack( self.topTree.area, rightSourceContact.getY(), 0 ) + leftX = self.topTree.getNearestVerticalTrack ( self.topTree.area, leftContact.getX(), 0 ) + rightX = self.topTree.getNearestVerticalTrack ( self.topTree.area, rightContact.getX(), 0 ) + tlY = self.topTree.getNearestHorizontalTrack( self.topTree.area, tlContact.getY(), 0 ) + blY = self.topTree.getNearestHorizontalTrack( self.topTree.area, blContact.getY(), 0 ) + + self.topTree.setStackPosition( leftSourceContact, leftSourceX, leftSourceY ) + self.topTree.setStackPosition( rightSourceContact, rightSourceX, rightSourceY ) + self.topTree.setStackPosition( tlContact, leftX, tlY ) + self.topTree.setStackPosition( blContact, leftX, blY ) + self.topTree.setStackPosition( trContact, rightX, tlY ) + self.topTree.setStackPosition( brContact, rightX, blY ) + + leftContact .setX( leftX ) + leftContact .setY( leftSourceY ) + rightContact.setX( rightX ) + rightContact.setY( rightSourceY ) + + self.topTree.createHorizontal( leftContact , leftSourceContact, leftSourceY , 0 ) + self.topTree.createHorizontal( rightSourceContact, rightContact , rightSourceY, 0 ) + self.topTree.createVertical ( leftContact , blContact , leftX , 0 ) + self.topTree.createVertical ( tlContact , leftContact , leftX , 0 ) + self.topTree.createVertical ( rightContact , brContact , rightX , 0 ) + self.topTree.createVertical ( trContact , rightContact , rightX , 0 ) for child in self.childs: child.route() return diff --git a/documentation/PythonCpp/PythonCpp.pdf b/documentation/PythonCpp/PythonCpp.pdf index 53103ab5..5651a0b7 100644 Binary files a/documentation/PythonCpp/PythonCpp.pdf and b/documentation/PythonCpp/PythonCpp.pdf differ diff --git a/documentation/PythonTutorial/Environment.rst b/documentation/PythonTutorial/Environment.rst index cf8919ca..e8ce2573 100644 --- a/documentation/PythonTutorial/Environment.rst +++ b/documentation/PythonTutorial/Environment.rst @@ -26,7 +26,7 @@ Use it like this (don't forget the ``eval`` **and** the backquotes): dummy@lepka:~> eval `/etc/coriolis2/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| + When used under |RHEL6| or clones, it needs to be run in the |devtoolset| environement. The script then launch a new shell, which may cause an infinite loop if it's called again in, say :cb:`~/.bashrc`. diff --git a/documentation/PythonTutorial/PythonTutorial.pdf b/documentation/PythonTutorial/PythonTutorial.pdf index f81a434f..098d3180 100644 Binary files a/documentation/PythonTutorial/PythonTutorial.pdf and b/documentation/PythonTutorial/PythonTutorial.pdf differ diff --git a/documentation/RDS/RDS.pdf b/documentation/RDS/RDS.pdf index 85ab930a..ecdabf13 100644 Binary files a/documentation/RDS/RDS.pdf and b/documentation/RDS/RDS.pdf differ diff --git a/documentation/Stratus/Stratus.pdf b/documentation/Stratus/Stratus.pdf index 76bebce8..ace9f8ec 100644 Binary files a/documentation/Stratus/Stratus.pdf and b/documentation/Stratus/Stratus.pdf differ diff --git a/documentation/UsersGuide/Installation.rst b/documentation/UsersGuide/Installation.rst index a2bed64a..cb264d3c 100644 --- a/documentation/UsersGuide/Installation.rst +++ b/documentation/UsersGuide/Installation.rst @@ -34,9 +34,10 @@ Building documentation prerequisites: * latex2html * python-docutils (for reStructuredText) -Optional libraries: +The following libraries gets directly bundled with |Coriolis|: * LEF/DEF (from `SI2 `_) +* FLUTE (from `Chris C. N. Chu `_) For other distributions, refer to their own packaging system. @@ -127,10 +128,11 @@ We need to separate to perform a separate installation of the documentation beca 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|: :: +Under |RHEL6| or clones, you must build using the |devtoolset|, the version is to +be given as argument: :: dummy@lepka:src> ./bootstrap/ccb.py --project=coriolis \ - --devtoolset-2 --make="-j4 install" + --devtoolset=8 --make="-j4 install" If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument. diff --git a/documentation/UsersGuide/UsersGuide.pdf b/documentation/UsersGuide/UsersGuide.pdf index 9714a89f..7ba9c498 100644 Binary files a/documentation/UsersGuide/UsersGuide.pdf and b/documentation/UsersGuide/UsersGuide.pdf differ diff --git a/documentation/_build/doctrees/Analog/Analog.doctree b/documentation/_build/doctrees/Analog/Analog.doctree index ecae7d83..f7b9eed2 100644 Binary files a/documentation/_build/doctrees/Analog/Analog.doctree and b/documentation/_build/doctrees/Analog/Analog.doctree differ diff --git a/documentation/_build/doctrees/CrlCore/CrlCore.doctree b/documentation/_build/doctrees/CrlCore/CrlCore.doctree index 721eb25a..c7844e08 100644 Binary files a/documentation/_build/doctrees/CrlCore/CrlCore.doctree and b/documentation/_build/doctrees/CrlCore/CrlCore.doctree differ diff --git a/documentation/_build/doctrees/Hurricane/Hurricane.doctree b/documentation/_build/doctrees/Hurricane/Hurricane.doctree index 90c44943..be0760c4 100644 Binary files a/documentation/_build/doctrees/Hurricane/Hurricane.doctree and b/documentation/_build/doctrees/Hurricane/Hurricane.doctree differ diff --git a/documentation/_build/doctrees/Katabatic/Katabatic.doctree b/documentation/_build/doctrees/Katabatic/Katabatic.doctree index 67f029f1..2edc7296 100644 Binary files a/documentation/_build/doctrees/Katabatic/Katabatic.doctree and b/documentation/_build/doctrees/Katabatic/Katabatic.doctree differ diff --git a/documentation/_build/doctrees/Kite/Kite.doctree b/documentation/_build/doctrees/Kite/Kite.doctree index 755bead0..70b0f0f5 100644 Binary files a/documentation/_build/doctrees/Kite/Kite.doctree and b/documentation/_build/doctrees/Kite/Kite.doctree differ diff --git a/documentation/_build/doctrees/Oroshi/Oroshi.doctree b/documentation/_build/doctrees/Oroshi/Oroshi.doctree index 96467b30..59b8f16e 100644 Binary files a/documentation/_build/doctrees/Oroshi/Oroshi.doctree and b/documentation/_build/doctrees/Oroshi/Oroshi.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/Configuration.doctree b/documentation/_build/doctrees/PythonCpp/Configuration.doctree index 4a47fa86..80145419 100644 Binary files a/documentation/_build/doctrees/PythonCpp/Configuration.doctree and b/documentation/_build/doctrees/PythonCpp/Configuration.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/DBoHierarchy.doctree b/documentation/_build/doctrees/PythonCpp/DBoHierarchy.doctree index 1d09129c..dd77c30b 100644 Binary files a/documentation/_build/doctrees/PythonCpp/DBoHierarchy.doctree and b/documentation/_build/doctrees/PythonCpp/DBoHierarchy.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/DBoStandalone.doctree b/documentation/_build/doctrees/PythonCpp/DBoStandalone.doctree index 32a97c42..0bd0ef9f 100644 Binary files a/documentation/_build/doctrees/PythonCpp/DBoStandalone.doctree and b/documentation/_build/doctrees/PythonCpp/DBoStandalone.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/DbU.doctree b/documentation/_build/doctrees/PythonCpp/DbU.doctree index 185d33be..02e91924 100644 Binary files a/documentation/_build/doctrees/PythonCpp/DbU.doctree and b/documentation/_build/doctrees/PythonCpp/DbU.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/Introduction.doctree b/documentation/_build/doctrees/PythonCpp/Introduction.doctree index 48135ac5..90275438 100644 Binary files a/documentation/_build/doctrees/PythonCpp/Introduction.doctree and b/documentation/_build/doctrees/PythonCpp/Introduction.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/Name.doctree b/documentation/_build/doctrees/PythonCpp/Name.doctree index cba9ed93..56c85e72 100644 Binary files a/documentation/_build/doctrees/PythonCpp/Name.doctree and b/documentation/_build/doctrees/PythonCpp/Name.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/NonDBo.doctree b/documentation/_build/doctrees/PythonCpp/NonDBo.doctree index 0c010f87..180715b7 100644 Binary files a/documentation/_build/doctrees/PythonCpp/NonDBo.doctree and b/documentation/_build/doctrees/PythonCpp/NonDBo.doctree differ diff --git a/documentation/_build/doctrees/PythonCpp/index.doctree b/documentation/_build/doctrees/PythonCpp/index.doctree index dd906f9e..6c288e14 100644 Binary files a/documentation/_build/doctrees/PythonCpp/index.doctree and b/documentation/_build/doctrees/PythonCpp/index.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/AdvancedTopics.doctree b/documentation/_build/doctrees/PythonTutorial/AdvancedTopics.doctree index 9d3bd976..02e5b0ed 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/AdvancedTopics.doctree and b/documentation/_build/doctrees/PythonTutorial/AdvancedTopics.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/CellNetComponent.doctree b/documentation/_build/doctrees/PythonTutorial/CellNetComponent.doctree index 2a83b05d..6858b45e 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/CellNetComponent.doctree and b/documentation/_build/doctrees/PythonTutorial/CellNetComponent.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/CgtScript.doctree b/documentation/_build/doctrees/PythonTutorial/CgtScript.doctree index c6274606..d3b20690 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/CgtScript.doctree and b/documentation/_build/doctrees/PythonTutorial/CgtScript.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/Collections.doctree b/documentation/_build/doctrees/PythonTutorial/Collections.doctree index ca28596d..85c6dd81 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/Collections.doctree and b/documentation/_build/doctrees/PythonTutorial/Collections.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/Environment.doctree b/documentation/_build/doctrees/PythonTutorial/Environment.doctree index a10fbb4e..0a992967 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/Environment.doctree and b/documentation/_build/doctrees/PythonTutorial/Environment.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/Introduction.doctree b/documentation/_build/doctrees/PythonTutorial/Introduction.doctree index aa84f027..991851f8 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/Introduction.doctree and b/documentation/_build/doctrees/PythonTutorial/Introduction.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/Netlist.doctree b/documentation/_build/doctrees/PythonTutorial/Netlist.doctree index 5ea63019..1b42a225 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/Netlist.doctree and b/documentation/_build/doctrees/PythonTutorial/Netlist.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/RealDesigns.doctree b/documentation/_build/doctrees/PythonTutorial/RealDesigns.doctree index 298c6991..384d2157 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/RealDesigns.doctree and b/documentation/_build/doctrees/PythonTutorial/RealDesigns.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/ToolEngines.doctree b/documentation/_build/doctrees/PythonTutorial/ToolEngines.doctree index 7e13a1f6..99ef85e9 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/ToolEngines.doctree and b/documentation/_build/doctrees/PythonTutorial/ToolEngines.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/index.doctree b/documentation/_build/doctrees/PythonTutorial/index.doctree index 87481c4f..816fa144 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/index.doctree and b/documentation/_build/doctrees/PythonTutorial/index.doctree differ diff --git a/documentation/_build/doctrees/PythonTutorial/pdfHeader.doctree b/documentation/_build/doctrees/PythonTutorial/pdfHeader.doctree index 19cb4cee..e492eb5d 100644 Binary files a/documentation/_build/doctrees/PythonTutorial/pdfHeader.doctree and b/documentation/_build/doctrees/PythonTutorial/pdfHeader.doctree differ diff --git a/documentation/_build/doctrees/RDS/RDSpage.doctree b/documentation/_build/doctrees/RDS/RDSpage.doctree index 6dd7c110..135d4fb4 100644 Binary files a/documentation/_build/doctrees/RDS/RDSpage.doctree and b/documentation/_build/doctrees/RDS/RDSpage.doctree differ diff --git a/documentation/_build/doctrees/RDS/index.doctree b/documentation/_build/doctrees/RDS/index.doctree index c28579b3..9d9998b3 100644 Binary files a/documentation/_build/doctrees/RDS/index.doctree and b/documentation/_build/doctrees/RDS/index.doctree differ diff --git a/documentation/_build/doctrees/Stratus/index.doctree b/documentation/_build/doctrees/Stratus/index.doctree index a9b28674..4ef5a28e 100644 Binary files a/documentation/_build/doctrees/Stratus/index.doctree and b/documentation/_build/doctrees/Stratus/index.doctree differ diff --git a/documentation/_build/doctrees/Unicorn/Unicorn.doctree b/documentation/_build/doctrees/Unicorn/Unicorn.doctree index 1b38bfe7..ca704005 100644 Binary files a/documentation/_build/doctrees/Unicorn/Unicorn.doctree and b/documentation/_build/doctrees/Unicorn/Unicorn.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/Configuration.doctree b/documentation/_build/doctrees/UsersGuide/Configuration.doctree index 20ee5970..04d21a11 100644 Binary files a/documentation/_build/doctrees/UsersGuide/Configuration.doctree and b/documentation/_build/doctrees/UsersGuide/Configuration.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/Installation.doctree b/documentation/_build/doctrees/UsersGuide/Installation.doctree index 5510df00..3d4b3734 100644 Binary files a/documentation/_build/doctrees/UsersGuide/Installation.doctree and b/documentation/_build/doctrees/UsersGuide/Installation.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/LicenseCredits.doctree b/documentation/_build/doctrees/UsersGuide/LicenseCredits.doctree index f0999765..bf97af59 100644 Binary files a/documentation/_build/doctrees/UsersGuide/LicenseCredits.doctree and b/documentation/_build/doctrees/UsersGuide/LicenseCredits.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/Releases.doctree b/documentation/_build/doctrees/UsersGuide/Releases.doctree index 44ac17e4..76c0acfb 100644 Binary files a/documentation/_build/doctrees/UsersGuide/Releases.doctree and b/documentation/_build/doctrees/UsersGuide/Releases.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/ScriptsPlugins.doctree b/documentation/_build/doctrees/UsersGuide/ScriptsPlugins.doctree index 3bf49d01..dcc9784c 100644 Binary files a/documentation/_build/doctrees/UsersGuide/ScriptsPlugins.doctree and b/documentation/_build/doctrees/UsersGuide/ScriptsPlugins.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/ViewerTools.doctree b/documentation/_build/doctrees/UsersGuide/ViewerTools.doctree index 17f49257..7bb81ac3 100644 Binary files a/documentation/_build/doctrees/UsersGuide/ViewerTools.doctree and b/documentation/_build/doctrees/UsersGuide/ViewerTools.doctree differ diff --git a/documentation/_build/doctrees/UsersGuide/index.doctree b/documentation/_build/doctrees/UsersGuide/index.doctree index 187fa7ec..1efdcb7c 100644 Binary files a/documentation/_build/doctrees/UsersGuide/index.doctree and b/documentation/_build/doctrees/UsersGuide/index.doctree differ diff --git a/documentation/_build/doctrees/Viewer/Viewer.doctree b/documentation/_build/doctrees/Viewer/Viewer.doctree index 1b7cbc19..0e1f0154 100644 Binary files a/documentation/_build/doctrees/Viewer/Viewer.doctree and b/documentation/_build/doctrees/Viewer/Viewer.doctree differ diff --git a/documentation/_build/doctrees/defapi/defapi.doctree b/documentation/_build/doctrees/defapi/defapi.doctree index de34a476..87bf15f9 100644 Binary files a/documentation/_build/doctrees/defapi/defapi.doctree and b/documentation/_build/doctrees/defapi/defapi.doctree differ diff --git a/documentation/_build/doctrees/environment.pickle b/documentation/_build/doctrees/environment.pickle index c9b0d496..5027c02f 100644 Binary files a/documentation/_build/doctrees/environment.pickle and b/documentation/_build/doctrees/environment.pickle differ diff --git a/documentation/_build/doctrees/etc/definitions.doctree b/documentation/_build/doctrees/etc/definitions.doctree index 8ebbbc78..842067c0 100644 Binary files a/documentation/_build/doctrees/etc/definitions.doctree and b/documentation/_build/doctrees/etc/definitions.doctree differ diff --git a/documentation/_build/doctrees/lefapi/lefapi.doctree b/documentation/_build/doctrees/lefapi/lefapi.doctree index b05f8ccf..0a687d6f 100644 Binary files a/documentation/_build/doctrees/lefapi/lefapi.doctree and b/documentation/_build/doctrees/lefapi/lefapi.doctree differ diff --git a/documentation/_build/doctrees/lefdef/lefdef.doctree b/documentation/_build/doctrees/lefdef/lefdef.doctree index ab1c31fb..de0e18a7 100644 Binary files a/documentation/_build/doctrees/lefdef/lefdef.doctree and b/documentation/_build/doctrees/lefdef/lefdef.doctree differ diff --git a/documentation/_build/html/Analog/Analog.html b/documentation/_build/html/Analog/Analog.html index 1697b673..6a3b60d9 100644 --- a/documentation/_build/html/Analog/Analog.html +++ b/documentation/_build/html/Analog/Analog.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Contents.html b/documentation/_build/html/Contents.html index 11d08429..be4c6194 100644 --- a/documentation/_build/html/Contents.html +++ b/documentation/_build/html/Contents.html @@ -1119,7 +1119,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/CrlCore/CrlCore.html b/documentation/_build/html/CrlCore/CrlCore.html index edee37d4..30c47acf 100644 --- a/documentation/_build/html/CrlCore/CrlCore.html +++ b/documentation/_build/html/CrlCore/CrlCore.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Hurricane/Hurricane.html b/documentation/_build/html/Hurricane/Hurricane.html index b1ba1f45..95c1a918 100644 --- a/documentation/_build/html/Hurricane/Hurricane.html +++ b/documentation/_build/html/Hurricane/Hurricane.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Katabatic/Katabatic.html b/documentation/_build/html/Katabatic/Katabatic.html index 9355655f..17d1bab3 100644 --- a/documentation/_build/html/Katabatic/Katabatic.html +++ b/documentation/_build/html/Katabatic/Katabatic.html @@ -528,7 +528,7 @@ mixed signal conterpart Anabatic.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Kite/Kite.html b/documentation/_build/html/Kite/Kite.html index f51ff946..fc4abc14 100644 --- a/documentation/_build/html/Kite/Kite.html +++ b/documentation/_build/html/Kite/Kite.html @@ -528,7 +528,7 @@ mixed-signal conterpart Katana (Kit[e]-Ana[logic]).

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Oroshi/Oroshi.html b/documentation/_build/html/Oroshi/Oroshi.html index f13cf780..f0a77fca 100644 --- a/documentation/_build/html/Oroshi/Oroshi.html +++ b/documentation/_build/html/Oroshi/Oroshi.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/Configuration.html b/documentation/_build/html/PythonCpp/Configuration.html index 5eab92b1..ddf43124 100644 --- a/documentation/_build/html/PythonCpp/Configuration.html +++ b/documentation/_build/html/PythonCpp/Configuration.html @@ -556,7 +556,7 @@ associated C++ namespace. Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/DBoHierarchy.html b/documentation/_build/html/PythonCpp/DBoHierarchy.html index 93a329ce..8cef5f0c 100644 --- a/documentation/_build/html/PythonCpp/DBoHierarchy.html +++ b/documentation/_build/html/PythonCpp/DBoHierarchy.html @@ -928,7 +928,7 @@ terminal or not. Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/DBoStandalone.html b/documentation/_build/html/PythonCpp/DBoStandalone.html index a88fe40c..c93208a9 100644 --- a/documentation/_build/html/PythonCpp/DBoStandalone.html +++ b/documentation/_build/html/PythonCpp/DBoStandalone.html @@ -858,7 +858,7 @@ the module itself. This allow to mimic closely the C++ syntax:

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/DbU.html b/documentation/_build/html/PythonCpp/DbU.html index 366b0c2c..e7bac3c7 100644 --- a/documentation/_build/html/PythonCpp/DbU.html +++ b/documentation/_build/html/PythonCpp/DbU.html @@ -572,7 +572,7 @@ the DbU::Unit  Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/Introduction.html b/documentation/_build/html/PythonCpp/Introduction.html index 009ae652..c8c80139 100644 --- a/documentation/_build/html/PythonCpp/Introduction.html +++ b/documentation/_build/html/PythonCpp/Introduction.html @@ -686,7 +686,7 @@ like in the code below:

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/Name.html b/documentation/_build/html/PythonCpp/Name.html index 21b616d3..15e4489b 100644 --- a/documentation/_build/html/PythonCpp/Name.html +++ b/documentation/_build/html/PythonCpp/Name.html @@ -525,7 +525,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/NonDBo.html b/documentation/_build/html/PythonCpp/NonDBo.html index 4aa7ca73..974b4c56 100644 --- a/documentation/_build/html/PythonCpp/NonDBo.html +++ b/documentation/_build/html/PythonCpp/NonDBo.html @@ -675,7 +675,7 @@ a standalone DBo Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonCpp/index.html b/documentation/_build/html/PythonCpp/index.html index 34693336..690ee718 100644 --- a/documentation/_build/html/PythonCpp/index.html +++ b/documentation/_build/html/PythonCpp/index.html @@ -557,7 +557,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/AdvancedTopics.html b/documentation/_build/html/PythonTutorial/AdvancedTopics.html index e3118a1f..5b1cc0f1 100644 --- a/documentation/_build/html/PythonTutorial/AdvancedTopics.html +++ b/documentation/_build/html/PythonTutorial/AdvancedTopics.html @@ -544,7 +544,7 @@ go through all the components of a trans-hierarchical net.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/CellNetComponent.html b/documentation/_build/html/PythonTutorial/CellNetComponent.html index 63c5d502..a3d378fe 100644 --- a/documentation/_build/html/PythonTutorial/CellNetComponent.html +++ b/documentation/_build/html/PythonTutorial/CellNetComponent.html @@ -835,7 +835,7 @@ explanation of that part of the code, refer to Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/CgtScript.html b/documentation/_build/html/PythonTutorial/CgtScript.html index 74209c3c..06abd766 100644 --- a/documentation/_build/html/PythonTutorial/CgtScript.html +++ b/documentation/_build/html/PythonTutorial/CgtScript.html @@ -594,7 +594,7 @@ The Breakpoint.stop() Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/Collections.html b/documentation/_build/html/PythonTutorial/Collections.html index a918b19a..4ae0cfd2 100644 --- a/documentation/_build/html/PythonTutorial/Collections.html +++ b/documentation/_build/html/PythonTutorial/Collections.html @@ -595,7 +595,7 @@ they may unexpectedly shadow cells from the libraries.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/Environment.html b/documentation/_build/html/PythonTutorial/Environment.html index 71e89c06..353026b3 100644 --- a/documentation/_build/html/PythonTutorial/Environment.html +++ b/documentation/_build/html/PythonTutorial/Environment.html @@ -518,7 +518,7 @@ or C-Shell like).

Note

Do not call that script in your environement initialisation. -When used under rhel6 or clones, it needs to be run in the devtoolset2 +When used under rhel6 or clones, it needs to be run in the devtoolset environement. The script then launch a new shell, which may cause an infinite loop if it’s called again in, say ~/.bashrc.

Instead you may want to create an alias:

@@ -600,7 +600,7 @@ in CGT - The Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/Introduction.html b/documentation/_build/html/PythonTutorial/Introduction.html index 78b70a38..b4d2a3de 100644 --- a/documentation/_build/html/PythonTutorial/Introduction.html +++ b/documentation/_build/html/PythonTutorial/Introduction.html @@ -657,7 +657,7 @@ to be explicitly deleted.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/Netlist.html b/documentation/_build/html/PythonTutorial/Netlist.html index 3440f52e..238ac8a5 100644 --- a/documentation/_build/html/PythonTutorial/Netlist.html +++ b/documentation/_build/html/PythonTutorial/Netlist.html @@ -883,7 +883,7 @@ directory (under the the root of the Coriolis installati Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/RealDesigns.html b/documentation/_build/html/PythonTutorial/RealDesigns.html index 89491f92..4c047775 100644 --- a/documentation/_build/html/PythonTutorial/RealDesigns.html +++ b/documentation/_build/html/PythonTutorial/RealDesigns.html @@ -561,7 +561,7 @@ the one of the FreePDK45, you must load it prior to calling the Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/ToolEngines.html b/documentation/_build/html/PythonTutorial/ToolEngines.html index fbeb8b8f..1e63a50a 100644 --- a/documentation/_build/html/PythonTutorial/ToolEngines.html +++ b/documentation/_build/html/PythonTutorial/ToolEngines.html @@ -724,7 +724,7 @@ case it is around 3% Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/definitions.html b/documentation/_build/html/PythonTutorial/definitions.html index b602bdf1..cc95299b 100644 --- a/documentation/_build/html/PythonTutorial/definitions.html +++ b/documentation/_build/html/PythonTutorial/definitions.html @@ -507,7 +507,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/index.html b/documentation/_build/html/PythonTutorial/index.html index a714edb0..79c63444 100644 --- a/documentation/_build/html/PythonTutorial/index.html +++ b/documentation/_build/html/PythonTutorial/index.html @@ -586,7 +586,7 @@ and hierarchical design.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/PythonTutorial/pdfHeader.html b/documentation/_build/html/PythonTutorial/pdfHeader.html index 7a833875..11f186f8 100644 --- a/documentation/_build/html/PythonTutorial/pdfHeader.html +++ b/documentation/_build/html/PythonTutorial/pdfHeader.html @@ -522,7 +522,7 @@ and hierarchical design.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/RDS/RDSpage.html b/documentation/_build/html/RDS/RDSpage.html index fb0c60fc..68c61884 100644 --- a/documentation/_build/html/RDS/RDSpage.html +++ b/documentation/_build/html/RDS/RDSpage.html @@ -982,7 +982,7 @@ wire width and minimal spacing for the routers. They are patly redundant.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/RDS/index.html b/documentation/_build/html/RDS/index.html index c1b24420..2034ad29 100644 --- a/documentation/_build/html/RDS/index.html +++ b/documentation/_build/html/RDS/index.html @@ -541,7 +541,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Stratus/Developper.html b/documentation/_build/html/Stratus/Developper.html index 91b40e38..cbb99432 100644 --- a/documentation/_build/html/Stratus/Developper.html +++ b/documentation/_build/html/Stratus/Developper.html @@ -794,7 +794,7 @@ by default) Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Stratus/DpGen.html b/documentation/_build/html/Stratus/DpGen.html index a30c393f..2de3ea45 100644 --- a/documentation/_build/html/Stratus/DpGen.html +++ b/documentation/_build/html/Stratus/DpGen.html @@ -3801,7 +3801,7 @@ flip-flop Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Stratus/Language.html b/documentation/_build/html/Stratus/Language.html index d6f6b0f8..c91d2ebd 100644 --- a/documentation/_build/html/Stratus/Language.html +++ b/documentation/_build/html/Stratus/Language.html @@ -2940,7 +2940,7 @@ The mapping file is not given in the environment variable. Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Stratus/Patterns.html b/documentation/_build/html/Stratus/Patterns.html index c69202a4..3cdf0bb9 100644 --- a/documentation/_build/html/Stratus/Patterns.html +++ b/documentation/_build/html/Stratus/Patterns.html @@ -754,7 +754,7 @@ vectors.

Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Stratus/index.html b/documentation/_build/html/Stratus/index.html index 9f3bc43f..54a57fc7 100644 --- a/documentation/_build/html/Stratus/index.html +++ b/documentation/_build/html/Stratus/index.html @@ -531,7 +531,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Unicorn/Unicorn.html b/documentation/_build/html/Unicorn/Unicorn.html index 83b08d35..2acb05d0 100644 --- a/documentation/_build/html/Unicorn/Unicorn.html +++ b/documentation/_build/html/Unicorn/Unicorn.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/Configuration.html b/documentation/_build/html/UsersGuide/Configuration.html index 380973b3..5bb32717 100644 --- a/documentation/_build/html/UsersGuide/Configuration.html +++ b/documentation/_build/html/UsersGuide/Configuration.html @@ -865,7 +865,7 @@ in <CWD>/.coriolis2/settings.py (that is, written Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/Installation.html b/documentation/_build/html/UsersGuide/Installation.html index 7752ff8e..f10e34c4 100644 --- a/documentation/_build/html/UsersGuide/Installation.html +++ b/documentation/_build/html/UsersGuide/Installation.html @@ -528,9 +528,10 @@ running the ccb installer.

  • latex2html
  • python-docutils (for reStructuredText)
  • -

    Optional libraries:

    +

    The following libraries gets directly bundled with Coriolis:

    For other distributions, refer to their own packaging system.

    @@ -657,9 +658,10 @@ the exact version we compiled against is given below.

    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:

    +

    Under rhel6 or clones, you must build using the devtoolset, the version is to +be given as argument:

    dummy@lepka:src> ./bootstrap/ccb.py --project=coriolis \
    -                                    --devtoolset-2 --make="-j4 install"
    +                                    --devtoolset=8 --make="-j4 install"
     

    If you want to uses Qt 5 instead of Qt 4, you may add the --qt5 argument.

    @@ -741,7 +743,7 @@ in the bootstrap

    Note

    Do not call that script in your environement initialisation. -When used under rhel6 or clones, it needs to be run in the devtoolset2 +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 ~/.bashrc.

    Instead you may want to create an alias:

    @@ -773,7 +775,7 @@ infinite loop if it’s called again in, say ~/.bashrc Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/LicenseCredits.html b/documentation/_build/html/UsersGuide/LicenseCredits.html index 3735a95a..5452f5aa 100644 --- a/documentation/_build/html/UsersGuide/LicenseCredits.html +++ b/documentation/_build/html/UsersGuide/LicenseCredits.html @@ -550,7 +550,7 @@ copyright© Chris C. N. Chu from the Iowa State Universi Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/Releases.html b/documentation/_build/html/UsersGuide/Releases.html index 369953a2..3870350f 100644 --- a/documentation/_build/html/UsersGuide/Releases.html +++ b/documentation/_build/html/UsersGuide/Releases.html @@ -607,7 +607,7 @@ whole design down and including the standard cells. Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/ScriptsPlugins.html b/documentation/_build/html/UsersGuide/ScriptsPlugins.html index 7ef84ed7..271a7d26 100644 --- a/documentation/_build/html/UsersGuide/ScriptsPlugins.html +++ b/documentation/_build/html/UsersGuide/ScriptsPlugins.html @@ -905,7 +905,7 @@ then run the Python script doChip.py Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/ViewerTools.html b/documentation/_build/html/UsersGuide/ViewerTools.html index 23072ca4..60743904 100644 --- a/documentation/_build/html/UsersGuide/ViewerTools.html +++ b/documentation/_build/html/UsersGuide/ViewerTools.html @@ -1397,7 +1397,7 @@ is deleted, you will crash the application...

    Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/UsersGuide/index.html b/documentation/_build/html/UsersGuide/index.html index 8458cb72..08cedd3d 100644 --- a/documentation/_build/html/UsersGuide/index.html +++ b/documentation/_build/html/UsersGuide/index.html @@ -562,7 +562,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/Viewer/Viewer.html b/documentation/_build/html/Viewer/Viewer.html index c9905eea..93b67076 100644 --- a/documentation/_build/html/Viewer/Viewer.html +++ b/documentation/_build/html/Viewer/Viewer.html @@ -523,7 +523,7 @@ available here: Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png b/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png index a3b0297f..16687fc4 100644 Binary files a/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png and b/documentation/_build/html/_images/math/0b37db03668389c8e33d766f186469af280334bb.png differ diff --git a/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png b/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png index 730bef5a..e121fb14 100644 Binary files a/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png and b/documentation/_build/html/_images/math/0d59c123dd2cd130ca29a2ba930fabbc4f547771.png differ diff --git a/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png b/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png index 022c2ee4..ea41cf7e 100644 Binary files a/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png and b/documentation/_build/html/_images/math/44344a23b2a3007fed067629259108385790ee6a.png differ diff --git a/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png b/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png index 16560a4a..7725368f 100644 Binary files a/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png and b/documentation/_build/html/_images/math/8080e7327f421afe79e142b39735819ab9631cb9.png differ diff --git a/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png b/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png index 234602ed..e9cb6050 100644 Binary files a/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png and b/documentation/_build/html/_images/math/9354e2441491d324ef5fd162920f581bdf022af5.png differ diff --git a/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png b/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png index c24c7c6e..8d585e6a 100644 Binary files a/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png and b/documentation/_build/html/_images/math/ab9c214f89790a2afdc94a731f08c35d0fafa77d.png differ diff --git a/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png b/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png index 11dfba1e..8f9725e8 100644 Binary files a/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png and b/documentation/_build/html/_images/math/db2555e54bec0d091b2124dccd645c2d7ddaae68.png differ diff --git a/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png b/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png index b6741ccc..3fdb4dfe 100644 Binary files a/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png and b/documentation/_build/html/_images/math/e6bc812a13677a4608e3f0624c560af92a3d7887.png differ diff --git a/documentation/_build/html/_sources/PythonTutorial/Environment.txt b/documentation/_build/html/_sources/PythonTutorial/Environment.txt index cf8919ca..e8ce2573 100644 --- a/documentation/_build/html/_sources/PythonTutorial/Environment.txt +++ b/documentation/_build/html/_sources/PythonTutorial/Environment.txt @@ -26,7 +26,7 @@ Use it like this (don't forget the ``eval`` **and** the backquotes): dummy@lepka:~> eval `/etc/coriolis2/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| + When used under |RHEL6| or clones, it needs to be run in the |devtoolset| environement. The script then launch a new shell, which may cause an infinite loop if it's called again in, say :cb:`~/.bashrc`. diff --git a/documentation/_build/html/_sources/UsersGuide/Installation.txt b/documentation/_build/html/_sources/UsersGuide/Installation.txt index a2bed64a..cb264d3c 100644 --- a/documentation/_build/html/_sources/UsersGuide/Installation.txt +++ b/documentation/_build/html/_sources/UsersGuide/Installation.txt @@ -34,9 +34,10 @@ Building documentation prerequisites: * latex2html * python-docutils (for reStructuredText) -Optional libraries: +The following libraries gets directly bundled with |Coriolis|: * LEF/DEF (from `SI2 `_) +* FLUTE (from `Chris C. N. Chu `_) For other distributions, refer to their own packaging system. @@ -127,10 +128,11 @@ We need to separate to perform a separate installation of the documentation beca 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|: :: +Under |RHEL6| or clones, you must build using the |devtoolset|, the version is to +be given as argument: :: dummy@lepka:src> ./bootstrap/ccb.py --project=coriolis \ - --devtoolset-2 --make="-j4 install" + --devtoolset=8 --make="-j4 install" If you want to uses Qt 5 instead of Qt 4, you may add the ``--qt5`` argument. diff --git a/documentation/_build/html/_sources/etc/definitions.txt b/documentation/_build/html/_sources/etc/definitions.txt index 013d3088..7329285c 100644 --- a/documentation/_build/html/_sources/etc/definitions.txt +++ b/documentation/_build/html/_sources/etc/definitions.txt @@ -105,7 +105,7 @@ .. |Python| replace:: :sc:`Python` .. |Linux| replace:: :sc:`Linux` .. |MacPorts| replace:: :sc:`MacPorts` -.. |devtoolset2| replace:: :cb:`devtoolset2` +.. |devtoolset| replace:: :cb:`devtoolset` .. |boost| replace:: :cb:`boost` .. |Qt| replace:: :sc:`qt` .. |tty| replace:: :cb:`tty` diff --git a/documentation/_build/html/defapi/defapi.html b/documentation/_build/html/defapi/defapi.html index 21f0218d..c3ca3e03 100644 --- a/documentation/_build/html/defapi/defapi.html +++ b/documentation/_build/html/defapi/defapi.html @@ -524,7 +524,7 @@ under the Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/etc/definitions.html b/documentation/_build/html/etc/definitions.html index 13b85d95..d3931e18 100644 --- a/documentation/_build/html/etc/definitions.html +++ b/documentation/_build/html/etc/definitions.html @@ -507,7 +507,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/genindex.html b/documentation/_build/html/genindex.html index 6a1b1d5c..ae5a7b30 100644 --- a/documentation/_build/html/genindex.html +++ b/documentation/_build/html/genindex.html @@ -514,7 +514,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/index.html b/documentation/_build/html/index.html index 6e33c254..45dbf04e 100644 --- a/documentation/_build/html/index.html +++ b/documentation/_build/html/index.html @@ -498,7 +498,7 @@

    Coriolis 2 documentation

    - Documentation generated on Oct 18, 2018. + Documentation generated on Mar 04, 2019.

    Documentation Topics

    @@ -596,7 +596,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/lefapi/lefapi.html b/documentation/_build/html/lefapi/lefapi.html index e8bd82a2..fbe042aa 100644 --- a/documentation/_build/html/lefapi/lefapi.html +++ b/documentation/_build/html/lefapi/lefapi.html @@ -555,7 +555,7 @@ and configured when the subsequent Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/lefdef/lefdef.html b/documentation/_build/html/lefdef/lefdef.html index b089c7bb..aba01ce3 100644 --- a/documentation/_build/html/lefdef/lefdef.html +++ b/documentation/_build/html/lefdef/lefdef.html @@ -521,7 +521,7 @@ under the Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/search.html b/documentation/_build/html/search.html index 025ecf05..381f437e 100644 --- a/documentation/_build/html/search.html +++ b/documentation/_build/html/search.html @@ -517,7 +517,7 @@ Generated by Sphinx - using a RTD theme on Oct 18, 2018. + using a RTD theme on Mar 04, 2019. diff --git a/documentation/_build/html/searchindex.js b/documentation/_build/html/searchindex.js index fd166bf4..e145d7aa 100644 --- a/documentation/_build/html/searchindex.js +++ b/documentation/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:49,filenames:["Analog/Analog","Contents","CrlCore/CrlCore","Hurricane/Hurricane","Katabatic/Katabatic","Kite/Kite","Oroshi/Oroshi","PythonCpp/Configuration","PythonCpp/DBoHierarchy","PythonCpp/DBoStandalone","PythonCpp/DbU","PythonCpp/Introduction","PythonCpp/Name","PythonCpp/NonDBo","PythonCpp/index","PythonTutorial/AdvancedTopics","PythonTutorial/CellNetComponent","PythonTutorial/CgtScript","PythonTutorial/Collections","PythonTutorial/Environment","PythonTutorial/Introduction","PythonTutorial/Netlist","PythonTutorial/RealDesigns","PythonTutorial/ToolEngines","PythonTutorial/definitions","PythonTutorial/index","PythonTutorial/pdfHeader","RDS/RDSpage","RDS/index","Stratus/Developper","Stratus/DpGen","Stratus/Language","Stratus/Patterns","Stratus/index","Unicorn/Unicorn","UsersGuide/Configuration","UsersGuide/Installation","UsersGuide/LicenseCredits","UsersGuide/Releases","UsersGuide/ScriptsPlugins","UsersGuide/ViewerTools","UsersGuide/index","Viewer/Viewer","defapi/defapi","etc/definitions","index","lefapi/lefapi","lefdef/lefdef"],objects:{},objnames:{},objtypes:{},terms:{"005\u00b5m":27,"01\u00b5m":46,"09\u00b5m":27,"0b0001":30,"0b000111":30,"0b0010":31,"0b0110":31,"0b10":31,"0b1001":31,"0b1010":30,"0b1100":30,"0b1110":31,"0b1111":30,"0x0000ffff":30,"0x14":31,"100k":40,"150k":40,"180nm":35,"18\u00b5m":27,"1\u00b5m":27,"2\u00b5m":27,"32b":36,"32x32":40,"45nm":[19,22],"64b":36,"abstract":8,"boolean":[1,9,29],"case":1,"catch":9,"char":9,"class":[1,7],"const":[30,31],"default":[8,19,27,29,30,31,32,35,36,39,40,46],"else":30,"export":[7,8,9,20,36,38,39],"final":[16,27,36,40],"float":[16,32,35],"function":[1,7,8,9,10,11,13],"goto":40,"import":[8,9,11,16,20,21,22,23,30,31,35,37,38,39,40],"int":13,"long":[10,20,40],"new":[8,9,13],"null":[8,9,10,11,13,30],"public":[20,38],"r\u00e9my":37,"return":[8,9,10,11,13,16,17,18,20,21,23,30,31,35,39,40],"short":11,"static":[8,9,10,11,13,20,22,30,36],"supp\u00e9rior":39,"transient":[16,46],"true":[16,17,19,21,23,27,29,30,31,35,39,40],"try":[16,31,35,40],"void":[8,9,13,20],"while":[10,16,18,20,21,40,46],__add__:29,__and__:29,__c:[8,9,11,13],__div__:29,__geslice__:29,__getitem__:29,__init__:29,__invert__:29,__le__:29,__main__:39,__mul__:29,__name__:39,__or__:29,__python_module:11,__python_module__:[8,11,13],__str__:20,__xor__:29,_add:29,_alia:29,_and:29,_ariti:29,_baseobject:8,_bl:39,_br:39,_buff:29,_chip:39,_clock:[35,39],_comp:29,_db:29,_direct:29,_div:29,_ext:29,_h_type:29,_hur_cel:29,_hur_inst:29,_hur_mastercel:29,_hur_net:29,_ind:29,_insref:29,_lib0:29,_map:29,_model:29,_mult:29,_mux:29,_name:[29,32],_nb_alims_vertical:29,_nb_inst:29,_nb_pin:29,_nb_vdd_pin:29,_nb_vss_pin:29,_not:29,_object:[8,9,10,13],_or:29,_param:29,_plac:29,_px:35,_pyobject:8,_real_model:29,_real_net:29,_reg:29,_shift:29,_st_cell:29,_st_ck:29,_st_inst:29,_st_mastercel:29,_st_merg:29,_st_port:29,_st_sig:29,_st_vdd:29,_st_vsss:29,_stim:31,_sym:29,_tab_nets_cat:29,_tab_nets_out:29,_tl:39,_to_cat:29,_to_merg:29,_tr:39,_type:29,_undercel:29,_xor:29,a2_1:[21,23],a2_2:[21,23],a2_x2:[21,23,31],abc:38,abil:31,abl:[11,17,20,22],about:[1,9],abov:[9,16,17,31,35,36,40],absolut:[13,16,32],abtument:31,abut:[16,21,23,31,39,40],abutmentbox:31,accept:[32,40],access:[8,18,21,31,32,36,38,40],access_class:8,access_object:8,accessor:9,accomod:39,accord:[27,35,39,40],accordingli:11,account:40,accross:11,accumul:32,accur:38,accuraci:40,achiev:38,acknowledg:30,across:[27,35,40],act:7,action:40,activ:[17,27,40],actual:[27,30,32,40],adapt:[19,39],add:[1,9,17,21],add_python_modul:[7,11],add_sub:30,addaccu:1,addd:31,added:38,adder:[30,31],adder_8:30,adding:9,addit:[19,30,31,35,40],addition:31,additionn:1,addmode:35,addpat:1,address:30,addtyp:[8,9],adjac:[15,39],adopt:16,adr:30,advis:40,adw:30,affect:1,affect_ani:1,affect_fix:1,affect_int:1,affili:38,after:[9,16,17,21,22,23,29,31,32,36,39,40],afterward:30,again:[8,9,19,22,36],against:[9,11,22,36,40],ago:11,aim:[20,38],alc_env:36,alexandr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],algorithm:[18,38,40],alia:[19,29,31,36],alias:40,alim:31,alimconnector:31,aliment:[1,29],alimhorizontalrail:31,alimverticalrail:31,all:[9,11,15,16,18,20,21,23,27,29,31,32,35,36,37,38,39,40],allianc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27],alliance_top:35,allianceconfig:35,alliancetop:35,alloc:[9,20,40],allow:[9,15,16,18,21,27,30,31,32,35,40],almost:[8,19,35,39,40],alon:16,along:[13,40],alpha:38,alphanumer:31,alreadi:[11,18,25,26,31,35,40],also:[5,16,18,20,21,22,27,31,36,40],altern:[35,38,40],alternat:36,although:[27,38,40],alu1:[27,31],alu2:31,alu3:31,alu4:31,alu5:31,alu6:31,alu:31,alux:27,alwai:[9,11,21,30,31,32,40,46],am2901:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38],amd2901:39,amd2901_crl:39,amd2901_crl_chip:39,amd64:36,amend:35,among:16,amount:[30,46],amp:37,ana:5,anabat:[4,23],analysi:40,analyt:[38,40],and2:[30,31],and2_8:30,and3:30,and3_16:30,and4:30,and4_2:30,anded:30,ani:[11,13,16,17,18,19,20,21,22,27,31,32,36,39,40],anneal:[38,39],anonym:18,anoth:[1,11,22,29],another:11,ansi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],anti:40,any:40,anymor:27,anyth:[35,39,40],anywher:40,apach:[43,46,47],api:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],appart:40,appear:[9,21,40],append:[18,31,35,39],appertur:40,appli:[11,21,27,30,31,32,35],applic:40,appropri:[9,31],approx:40,architectur:1,archiv:22,area:[21,23,27,35,40],arg0:[9,10,13],arg1:[9,13],arg:[8,9,10,11,13,31],argument:[1,8,9,10,16,17,21,29,30],arith:31,arithmet:[1,29,30],ariti:[29,31,32],army:40,around:[10,23,31,39,40],arrow:40,art:40,articul:[16,21],aside:[35,39],asign:32,asim:[31,36],asimut:31,ask:[21,27],aspect:[11,23,35,40],aspectratio:[23,35,40],assembl:35,assign:40,assignment:40,associ:[7,8,9,11,13,21,27,40],associat:[1,8],assum:[22,25,26,40],assume:21,asymetr:27,attempt:10,attribut:[1,8,13,20],author:31,autocmd:31,automat:[19,23,29,31,32,36,39,40],automaticali:31,autotool:36,auxsc35:40,avail:[0,2,3,4,5,6,11,16,19,31,34,35,36,38,42,43,46,47],avala:[38,40],avoid:[21,27,40,46],avot:32,awar:[21,27,30,36,40],axi:27,back:[31,38],background:40,backquot:19,bad:8,balanc:40,base:[1,4,5],bashrc:[19,36],basi:30,basic:1,basiclay:40,bdo:13,becaus:[8,17,23,27,36,38,40],becom:[8,20,31,39,40],bee:[31,40],been:[9,11,16,17,18,20,21,29,30,31,35,38,39,40],befor:[17,21,29,31,32,36,40,46],before:32,beforehand:40,begin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],behav:30,behavior:[9,11,13,29,30,31],behaviour:40,belloeil:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],belong:[16,31,35,46],below:[9,11,20,21,23,27,29,31,35,36,39,40],benchmark:40,bend:27,best:[13,40],better:21,between:[11,15,20,21,27,30,31,32,35,39,40],bewteen:21,big:[27,31,40],bigger:40,biggest:21,biggestarea:21,bigvia:27,biject:21,bin:[16,21,23,31,36],binari:[31,32,36,40],bind:35,bit:[27,29,30,31,40],black:[19,35],blif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],blink:40,blob:38,block:[11,20,30,39],blockag:[27,35],blockage:35,bluntli:13,blur:40,boil:27,bood:31,boost:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],booth:31,bootstrap:36,borrow:11,botch:1,both:[16,23,27,29,31,35,36,39,40],bother:9,bottom:[27,31,39],bound:[35,40],bourn:19,box:11,brace:20,branch:1,breakpoint:16,bring:11,brows:[35,40],buf:31,buf_x2:39,buff_32:30,buffer:[1,29,30],bufnewfil:31,bufread:31,bug:[19,35,38,40],build:[1,7,9,11,16,21,27,35],buildfulladd:[21,23],buildinvertor:[16,17],bull:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],bunch:9,bundl:36,buri:15,buse:[29,31],buse_8:30,buss:30,button:40,bzip2:36,c2r:[19,36],c30:30,c31:30,c_temp:31,c_x_n:27,c_x_p:27,ca2:[31,32],cach:39,cad:31,cadenc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],calcul:[31,32],call:[8,9,10,11,13,16,17,18,19,20,21,22,23,29,30,31,32,36,39,40,45],callback:45,calu1:31,calu2:31,calu3:31,calu4:31,calu5:31,calu6:31,calu:31,calux:27,camel:9,can:[8,11,15,16,17,18,19,20,21,22,23,27,30,31,32,35,36,38,39,40,46],candid:21,cannot:[11,16,20,21,27,30,40],capabl:[11,35,36,39,40],capac:40,capacitor:30,capit:9,captur:1,care:[11,23,31,39,40],carry_1:[21,23],carry_2:[21,23],cast:[8,9],cat:31,catal:35,catalog:[16,18,21,23,35],catchcor:[19,35,40],categori:40,caus:[19,36],cbug:40,ccb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cdebug:40,ceil:30,cell:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],cell_1:31,cellnet:18,cellstop:35,cellview:[17,40],center:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],centerend:27,cerr:[8,9],certain:[13,32],cfg:35,cgt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],ch_htree_bl_tl:39,cham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],chang:[8,13,20,21,30,31,35,38,39,40],chaput:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],charact:[30,35],check:[22,30,31,40],checkbox:40,checker:27,checkout:36,chip:[1,31],chmod:31,choic:1,choos:[9,31,40],chosen:[29,31],chotin:32,chri:37,christian:37,christoph:37,chu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cif:27,cin:[21,23,31],cinfo:40,circuit:1,circular:31,circumv:40,ck_htree:39,ck_htree_bl:39,ck_htree_bl_bl:39,ckin:[29,31,32],ckok:30,clariti:[8,16],class_nam:31,classic:[11,19,35],clean:35,cleaner:21,cleanli:9,clear:[13,39,40],clearer:31,clement:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],click:40,clock:[1,29,30,31,35],clocktre:[35,39],clone:[19,36,40],close:[9,16,17,20,21,23,35,39,40],closer:31,clue:11,cluster:40,cmake:[0,1,2,3,4,5,6],cmd0:31,cmd1:31,cmd2:31,cmd:[30,31],cmo:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cnchu:37,cobject:10,code:[8,9,11,13,16,19,20,21,35,38,39],coher:[20,40],collect:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],collector:20,coloquint:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],color:31,com:[36,43,46,47],combin:[21,36],come:40,command:[1,31,36,39],commit:36,common:[9,11,27,30,31,35,38,39,40],commpos:40,commun:[9,11,13],comp:8,compar:32,comparaison:31,comparison:[1,29],compat:36,compatibilti:38,compil:[11,36,40],complement:[30,32],complet:[7,9,11],completli:[11,16,38,40],complex:[11,27],compliant:36,compnent:40,compon:[1,8,11,15],compos:[21,40],compris:40,comput:[11,16,21,30,31,32,35,39,40],concaten:31,concept:[16,20,21,25,26],conceptor:[29,31],concret:[8,31],conditionn:30,conf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],configur:1,confus:21,congest:40,conjunct:40,connect:[16,20],connectmap:31,connector:[1,16,27],connexion:[15,20,21,29,31],consecut:39,consequ:[8,21,27,38,46],consid:[7,21,27],consist:36,const_0x0000ffff:30,constant:[1,27,30],construct:[13,20,21,31],constructor:[9,11,13],constructorerror:[9,11,13],constval0:30,constval1:30,constval2:30,constval3:30,constval:30,cont_body_n:[27,31],cont_body_p:[27,31],cont_dif_n:[16,27,31],cont_dif_p:[16,27,31],cont_poly:[16,27,31],cont_turn1:31,cont_turn2:31,cont_turn3:31,cont_turn4:31,cont_turn5:31,cont_turn6:31,cont_via2:27,cont_via3:27,cont_via4:27,cont_via5:27,cont_via:27,cont_viax:27,contact1:21,contact2:21,contact:[8,11,16,21,27,31,40],contain:[7,11,16,17,18,19,20,22,27,31,32,35,36,38,39,40],contdifn:16,contdifp:16,conterpart:[4,5,27],contest:40,context:39,contpoli:16,contributor:37,control:[1,11,20,21,27,30,31],conveni:9,convent:[11,16],convers:[1,9,16,18],convert:[9,10,13,16,20,27,32],coodin:31,coordin:[16,20,21,27,29,31,40],copi:[13,20,31,36,40],copuupseg:31,copyright:[37,43,46,47],copyupseg:1,copyupsegmentseccopi:31,cordin:31,core:1,corioli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34],coriolis2:[7,16,19,21,23,35,36,38,39],coriolis_install:19,coriolis_top:19,coriolisconfigur:35,coriolisenv:[1,19],coriolisinit:35,corner:[16,21,27,31],correct:[31,40],correctli:[23,31],correspond:[29,31,32,40],corrioli:36,cost:40,cougar:27,could:[18,20,31,35,39,40],count:[11,39,40],coupl:40,cours:20,cout:[18,21,23,31],cover:27,cpp:[7,9,11],craft:39,crash:[36,40],creat:[7,8,9,11,13],createcel:[16,17,21,23],creation:[1,16,20,21,23,29],credit:1,crl:[0,1],crl_cata_lib:31,crlcore:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],crude:40,csh:36,ctrl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cumbersom:11,current:[16,23,31,32,35,36,39,40],cursor:40,cwd:35,cycl:32,cyclop:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cygwin:36,damien:37,dangl:11,darwin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],data:[1,30],databas:[9,11,16,18,20,21,29,38,40,46],database:46,datain0:30,datain1:30,datain:30,dataout:30,date:32,dbit:31,dbo:1,dbodeletemethod:[8,9],dbodestroyattribut:[8,9],dbolinkcreatemethod:[8,9,13],dbu:1,debian:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],debug:[17,36,40],decim:31,declar:[1,9,16],declar_interfac:1,decod:30,decor:40,decreas:40,dedic:[8,20,31],deep:38,deeper:8,deepli:[15,40],def:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42],defab:1,defaultstyl:[19,35],defaultvalu:35,defin:[7,8,9,11,13,16,27,29,30,31,32,35,38,39,40],define:27,definit:[7,8,9,19],degre:31,delet:[9,11,13,18,20,29,35,40],delta:[27,31],demot:27,denser:40,densiti:[35,40],depend:[7,27,31,36,38,39],deplib:7,depth:40,deriv:1,derivedobject:8,describ:[22,27,31,32,35,39],descript:[1,8],descrob:31,design:1,design_kit:40,desir:31,despit:35,destroi:[8,9,13,18,20],detail:[1,16,19,21,23,35,38],detector:30,deterior:31,determin:9,determinist:40,devel:1,develop:[23,36,40],developp:1,devic:40,devtoolset2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],devtoolset:36,dff:39,dff_4:30,dfft_4:30,dialog:40,dict:[18,31],dictionari:[9,18],dictionnari:[9,17,29,31,39],did:[11,22,40],differ:[8,13,18,21,27,29,30,31,35,40],differenti:40,diffus:27,digit:[23,31],digitalinit:23,dimens:[27,31,40],direct:[8,9,11,13,27,29,31,32,35,40],directdeletemethod:13,directdestroymethod:13,directgetlongattribut:[8,10,13],directionn:13,directli:[11,17,20,22,23,32,39,40],directori:[1,16,19,21,22,23,31,35],directsetlongattribut:[10,13],disabl:[20,32,40],disambigu:27,disclaim:1,disconnect:21,discrep:22,diseappear:27,displac:40,displai:[9,21,35,40],display:40,distanc:[22,27,46],distinguish:[27,40],distribut:[36,38],disturb:39,ditch:40,divid:32,divis:31,dksdir:22,dl_export:[8,9],dobreak:[16,17,21,23],doc:[13,16,21,23,31,36],dochip:39,document:[11,14,15,20,21,25,28,31,33,35,36,38,39,40,41],docutil:36,doe:[9,31],doesn:[31,40],dogleg:40,don:[9,19,20,36,39],done:[9,16,31,35,40],dosometh:[20,39],dot:[38,40],dotfil:37,doubl:11,down:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],download:40,doxygen:[0,2,3,4,5,6,34,36,39,42],dozen:40,dp_sxlib:35,dpgen:1,dpgenadsb2f:1,dpgenand2:1,dpgenand3:1,dpgenand4:1,dpgenbuff:1,dpgenbus:1,dpgenconst:1,dpgendff:1,dpgendfft:1,dpgenfifo:1,dpgeninv:1,dpgenmux2:1,dpgennand2:1,dpgennand2mask:1,dpgennand3:1,dpgennand4:1,dpgennbus:1,dpgennmux2:1,dpgennor2:1,dpgennor2mask:1,dpgennor3:1,dpgennor4:1,dpgennul:1,dpgenor2:1,dpgenor3:1,dpgenor4:1,dpgenram:1,dpgenrf1:1,dpgenrf1d:1,dpgenrf1dr0:30,dpgenrf1r0:30,dpgenrom2:1,dpgenrom4:1,dpgensff:1,dpgensfft:1,dpgenshift:1,dpgenshrot:1,dpgenxnor2:1,dpgenxnor2mask:1,dpgenxor2:1,dpi:40,drain:27,draw:[16,27,40],drawn:40,drc:27,drive:[30,39],driven:35,drop:[36,38],druc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],due:[35,40],dumb:35,dummi:[19,35,36,39],dump:[18,38,40],duplic:31,dupui:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dure:[32,40],durole:37,dx1:31,dx2:31,dy1:31,dy2:31,dyld_framework_path:36,dyld_library_path:19,dynam:[11,20,30,36],dynamic_cast:8,each:[9,11,13,21,27,29,30,31,32,35,39,40],eas:[17,35],easi:31,easier:[27,29,31],easiest:36,easili:[20,35,40],east:[31,39],ec322005072076ef53984462fb4a1075c27c7dfd:36,edg:[27,39,40],editor:[1,16,17,21,23,27,29],edu:37,effect:[30,32,40],effort:[23,35,40],egin:32,ego:17,eight:31,either:[9,27,30,31,32,36,39,40],el7_64:36,electr:20,electric:27,element:[16,18,29,40],elif:31,els:[8,9,11,13,31,35],emit:9,empti:[30,40],emul:[9,36],enabl:[30,40],encapsul:[1,8,9],encompass:11,encount:[36,46],end:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],endif:[8,9,11,13],endl:[8,9,18],endswith:[18,35],enforc:21,eng:37,engin:23,engineloadgrbynet:23,enginenonetlayerassign:23,enough:[21,31,39],enrich:20,ent:8,enter:40,entir:11,entiti:8,entitycast:8,entri:[19,35,39,40],enumer:[31,35],env:31,envelop:31,envenli:40,environ:[1,16],eplac:40,eponym:40,equal:[30,31,40],equival:[20,21,31,40,46],eras:[39,40],error:[1,8,9,11,23,30],esc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],escap:40,escassut:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],especi:16,essai:31,etc:[16,19,31,35,36,39],etesian:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],etesianengin:23,eval:[19,36],even:[21,27,30,38,39],evenli:40,event:[32,36,40],eventslimit:40,ever:18,everi:[9,29,31,35,40],everybodi:23,everyth:[9,35,40],evolv:36,exacltli:27,exact:[16,36,39],exactli:[17,27,36,39,40],exampl:[1,7,8,9,10],except:[9,16,29,31],excess:40,execut:1,exempl:[29,31,40],exist:[18,19,31,35,40,46],exit:[39,40],expand:27,expansion:31,expect:[10,21,35,39],expens:10,experi:40,explain:21,explan:[16,40],explanat:27,explanatori:[9,20],explicit:[10,16,21],explicitli:20,expor:40,expos:[9,11,18],exposur:11,express:[16,20,22,27,31,35,40,46],ext:27,extand:31,extend:[27,29,31],extens:[1,16,17],extent:[35,39,40],extern:[8,9,11,13,16,20,21,29,31,39],extra:[35,40],extract:[9,32],extractor:27,extreme:35,face:31,facil:1,fact:[8,11],factor:[38,40,46],fail:[8,9],failsaf:40,failur:40,fairli:40,fals:[8,9,19,29,30,31,35,40],familiar:[11,25,26],fanci:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],far:[11,28],fashion:11,fast:[35,36,40],fc13:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fc_64:36,featur:40,fedora:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],feedthru:40,feel:20,fgr:40,fhs:36,field:[8,9,13,40],fifo:30,fifo_4_16:30,figur:[27,31,40],file:1,file_nam:31,filenam:[31,32,35],fillcel:1,filler:21,filler_1:21,filler_2:21,filter:[1,21],find:[21,31,35,36],fine:40,finger:40,finish:[16,29,31],first:[1,7,9],fit:[16,17,21,23,31,40],five:27,fix:[1,16,27,32],flag:[16,20,21,23,27,30,40],flatten:[15,39,40],flavor:[9,13],flip:30,flop:30,flow:[31,40],flute:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fly:21,follow:[7,8,9,11,16,20,27,30,31,32,35,36,39,40],fonction:31,footprint:40,forc:[9,32,39,40],forget:19,forgotten:31,form:[31,35,40],format:[22,31,32,38,40],found:[11,16,21,23,31,35,36],founder:27,foundri:[16,27],four:[9,27,30,39,40],fourth:30,framework:[16,18,21,23,36,38],franck:27,free:[23,40],freebsd:36,freed:20,freedpk:19,freepdk45:22,freepdk:22,freepdk_45:19,from:[8,9,10,11,13,16,18,20],fromlambda:[16,20,21,23],full:30,fulladd:[21,23,31],fulli:[16,23],fuse:[16,20],futur:11,gabriel:37,gap:40,garbag:20,gate:[27,30,40],gaug:[27,35,40],gcell:40,gdb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gdsii:40,gener:[0,1,2,3,4,5,6],generic_method_head:[8,9,13],genlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],geometr:[27,31,39],get:[9,10,11,15],get_cata_lib:29,getcel:[8,9,18,21,23],getcompon:18,getdb:[16,21],getenv:35,getheight:8,getlay:[16,21],getmasternet:21,getnam:18,getnet:[8,18,21,23],getobjectid:[9,13],getplug:[21,23],getrefxy:1,getstr:[20,40],gettechnolog:[16,21],getwidth:8,getx:[8,10,13],gety:[8,13],ghdl:31,gigant:11,git:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],github:36,give:[7,8,16,27,29,30,31,38,40],given:[8,9,11,16,17,21,27,29,30,31,32,35,36,40],global:[1,9,21,27,35,38],globallengththreshold:40,globalripuplimit:40,gnu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],goal:20,goe:11,good:[7,40],gouvin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],graal:27,graphic:[1,19,35,36,38,39],great:39,greater:[31,38],grew:40,grid:[1,16],ground:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,46,47],group:[20,38],gscl45nm:22,guarded:30,gui:36,guid:1,hack:1,had:27,halfadd:31,hand:27,handl:[16,31],hard:[30,35],has_kei:[16,17,21,23,35,39],hasn:40,have:[8,9,11,13,16,18,20,21,23,27,29,30,31,32,35,36,38,39,40,46],haven:31,hcatch:[8,9,10,11,13],head:1,header:1,hecadecim:31,height:[8,11,27,31,40],help:[17,36],helper:[1,9,19],here:[0,2,3,4,5,6,9,11,21,22,27,32,34,35,36,40,42,43,46,47],herit:29,hesit:39,hexa:31,hexadecim:[31,32],hidden:38,hide:40,hierach:31,hierarchi:1,high:[23,35,40],highest:40,highlight:1,highlit:40,himself:[29,31],histor:27,hmeti:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],hoc:[38,40],hold:[8,11,16,40],holder:15,hole:27,home:[17,22,31,35,36,37],homedir:35,hook:[1,9],hope:11,horizont:[8,16,20,21,27,31,39,40],how:[1,15,16,18,20,21,27,30],howev:[35,40],hspace:39,html:[31,36],htracksreservedloc:40,htry:[8,9,10,11,13],http:[36,37,43,46,47],hugo:37,hundredth:16,hur_techno_name:31,hurricaneerror:8,hurricaneplug:29,hwidth:39,hypernet:[0,2,3,4,5,6,7,8,9,10,11,12,13,14],i0_20:31,i386:36,iastat:37,ident:[8,31,35,40],identifi:[35,39,40],ifndef:[8,9,13],illegal:31,illustr:[16,21,22,39],imag:40,imcomplet:38,immediatli:40,implant:27,implement:[9,11,20,23,35,38,40,45],implemet:35,impli:[13,20],imposs:31,improv:40,in0:31,in1:[30,31],in2:[30,31],in3:[30,31],in4:30,in_lo:35,in_ph:35,includ:[7,8,9,11,13,20,31,36,38,40],include:36,inclus:40,incompat:31,incompatibilit:36,increas:[27,40],inde:40,indeed:[29,31],indent:20,index:[27,31,45],indic:[29,31],indirect:8,individu:[27,40],infinit:[19,36,40],info:[19,35,40],inform:[11,16,17,27,40,46],inherit:[9,29],init:[9,13],inithurrican:[8,9],initi:[8,9,32,35,40],initialis:[1,9,19,29,31,32],innov:38,inout:[29,31],input:[29,30,31,32,38],insert:[16,35,39],insid:[9,16,17,23,27,40],inspect:40,inspector:1,inst:[29,30,31],inst_adsb2f:30,inst_and2:30,inst_and3:30,inst_and4:30,inst_buff:30,inst_bus:30,inst_const:30,inst_dff:30,inst_dfft:30,inst_fifo:30,inst_inv:30,inst_mux2:30,inst_nand2:30,inst_nand2mask:30,inst_nand3:30,inst_nand4:30,inst_nbus:30,inst_nmux2:30,inst_nor2:30,inst_nor2mask:30,inst_nor3:30,inst_nor4:30,inst_nul:30,inst_or2:30,inst_or3:30,inst_or4:30,inst_ram:30,inst_rf1:30,inst_rf1d:30,inst_rom2:30,inst_rom4:30,inst_sff:30,inst_sfft:30,inst_shift:30,inst_shrot:30,inst_xnor2:30,inst_xnor2mask:30,inst_xor2:30,instal:[7,16,19,21,22,23,35,36,40],install:36,installat:1,instanc:[1,11,16,20],instanci:[1,8,29],instanciat:[1,29],instanti:1,instantiat:[29,31],instead:[8,11,13,19,22,31,36,40],instens:35,insti:30,insto:30,instop:30,instruct:[31,36,40],instshamt:30,insul:9,integ:[16,32,35],integer_word_length:32,integr:[9,39],intend:40,interact:17,interfac:[1,9,11,16,19,20,21,29,30,31,32,35,38],intermedi:1,intern:[29,31,32,39],interpret:[19,39],interrupt:9,intersect:27,intert:30,interv:31,introduc:[16,36,40],introduct:1,inv:31,inv_54:30,inv_x1:18,invalid:[8,9,11,13],inversor:31,invert:[27,30],inverter:30,invertor:[16,17],invok:31,iowa:37,isdir:35,isn:[31,32],isobar:[7,8,9,10,11,13],isobar_py_component_h:8,isobar_py_contact_h:8,isobar_py_entity_h:8,isobar_py_point_h:13,ispd:40,ispycompon:8,ispycontact:8,ispyentiti:8,ispyhorizont:8,ispylibrari:9,ispypoint:13,ispyvert:8,issu:[11,23],istself:7,ital:40,item:40,iter:[18,40],itself:[9,27],iwl:32,jean:37,json:38,just:[10,11,17,18,21,22,27,31,35,36,40],katabat:[0,2,3],katana:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],katanaengin:23,keep:[13,23],kei:[9,29,31,39,40],kept:27,keyword:17,kgr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],kind:[16,18,19],kit:5,kite:[0,1,2,3,4],knife:40,knik:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39],know:[9,36,39],known:[21,40,46],kwarg:13,lambda:[1,16,22],lanch:19,languag:[1,31,32],larg:40,last:[9,32,35,36,40],lastli:[9,13],latch:30,later:[13,16,21,38,40],latest:[31,36],latex2html:36,latex:36,lauch:39,launch:[17,19,36,39],layer:1,layerassign:23,layout:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],layoutt:35,lbd:16,lcw:27,ld_library_path:19,lead:40,leaf:[15,39,40],least:[35,39],lef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],lefconvertfactor:46,lefdef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lefimport:22,lefimporttmpcel:46,left:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],legal:[31,32,38],leght:31,lenght:31,length:[16,27,32],lepka:[19,36,39],less:[11,27,40],let:[13,40],letter:31,level:[8,9,10,11,15,16,17,21,27,35,36,39,40],lex:36,lgpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lib:[9,22,36,40],liberti:40,libisobar:11,librari:[1,7,8],libxml2:36,licens:1,life:[13,27],like:[8,9,11,17,18,19,20,23,29,30,31,35,36],limit:[20,21,40],line:[1,36,39],linear:40,linebreak:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],link:1,linker:11,linux:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lip6:36,list:[1,7,18,21,29],listdir:35,littl:[17,27,40],live:[11,40],load:[1,16,17],loader:[22,38],loadglobalrout:23,local:[35,36,40],localripuplimit:40,locat:[31,39,40],lofig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],log2:30,log:40,logic:[5,16,20,21,22,31,32,38,40],logicin:29,logicinout:29,logicout:29,logicunknown:29,logmod:[19,35,40],longer:[11,40],longglobalripuplimit:40,look:[1,9,13,16,22,35,36],loop:[18,19,30,31,36,40],lot:[21,46],low:40,lower:[16,21,30,31,35,40],lowercas:[9,16],lsb:[29,31],lybrari:9,maco:36,macos:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35],macport:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],macro:[7,8,9,11,13,30,40,46],made:[11,21,23,27,29,30,31,39,40],mai:[11,13,16,17,18,19,20,21,27,31,35,36,39,40],main:[20,36,38,40],mainli:[35,38,40],maintain:40,make:[9,15],makefil:36,manag:[11,16,20,22],mandatori:[9,16,19,29,30,31,35],mani:[11,20,27,31],manipul:10,manual:[1,11],map:[1,18,29,30],marek:37,margin:[23,35],mark:32,mask:30,masson:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],master:[11,21,23,29,36,40],mastercel:[29,31],masterlibrari:9,masternet:21,match:[18,31,35,40],materi:40,matrix:27,mauka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],max:35,maxim:40,maximum:40,maxtracelevel:[35,40],mayb:31,mbk:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mbk_:16,mbk_to_rds_bigvia_hole:1,mbk_to_rds_bigvia_metal:1,mbk_to_rds_segment:1,mbk_to_rds_via:1,mbk_wiresetting:1,mean:[11,18,20,22,27,31,35,36,40,46],meaning:[27,30,31],mechan:[9,11,13,15],medskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],member:38,memento:1,memori:[16,18,20,39,40],menu:[17,40],merg:29,messag:[16,17,21,40],metal1:[16,27],metal2:[21,27],metal3:21,metal5:40,metal:[27,40],meth_noargs:[8,9,13],meth_static:[8,9],meth_varargs:[8,9,13],method:[1,9,10,11,13,20,27],method_head:[8,9,13],micromet:[27,46],micron:22,microns:46,middl:31,migrat:38,million:40,miloyip:36,mimic:[9,35],min:35,minim:27,minimum:[39,40],minimumsid:39,minipag:37,minor:[35,40],mintracelevel:[35,40],minut:40,mip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mirror:39,misc:[19,35,40],miscellan:1,miss:40,mistak:[9,16,31],mistral:31,mix:[4,5,11,23,36],mkdir:36,mode:1,model:[1,16,20,21,27],modelnam:[30,31],modif:[16,18,31,39,40],modifi:[13,18,19,31,40],modul:[1,7],modular:11,modules_stratu:31,mofic:17,monolith:11,more:[8,16,18,20,27,31,35,38,40],moreov:11,mosi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],most:[31,35,40],mostli:[7,20,40],mous:40,movabl:40,move:40,msb:[29,31],much:[11,29,31,35,40],multipl:[22,27,31,38,40,46],multiplex:30,multiplexor:[1,29],multipli:[27,31],must:[7,8,9,11,16,17,19,20,21,22,27,31,32,35,36,39,40],mutat:9,mux2_8:30,mux:[29,31],mx2:31,my_addaccu_:31,my_and2_4bit:31,my_dpgen_and2:31,my_inv:16,myclass:[29,31],myfunc:20,myinst1:31,myinst2:31,myinst3:31,myinst:31,mylib:35,mymap:29,mynet:31,myparam:29,myref:31,myself:15,na2:31,na3:31,na4:31,name:[1,7,8,9,11],namespac:[1,7,8],nand2:30,nand2_8:30,nand2mask_0x0000ffff:30,nand3:30,nand3_20:30,nand4:30,nand4_9:30,nand:30,narrow:40,navig:18,nbit:[30,31],nbit_cmd:30,nbsp:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nbuse29:30,nck:35,ncsu:22,ndif:[16,27,31],nearest:39,need:[7,8,9,11,13,16,19,20,21,23,27,31,35,36,39,40],neg:31,neither:[9,31],nero:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],net8:31,net:[1,8,11,15],neta:31,netb:31,netc:31,netck:31,netcmd:31,netcout:31,netexternalcompon:[16,21],neti0:31,neti1:31,netin:31,netinput:29,netlist:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],netnam:31,neton:31,netout:31,netq:31,nets:31,netv:31,netvdd:31,netvss:31,never:18,nevertheless:31,newer:36,newli:[16,31],newnet:31,newpag:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],next:[31,32,36],nimbu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nmux2_5:30,nmx2:31,no2:31,no3:31,no4:31,noflag:23,noindent:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],non:[1,9,11],none:[16,17,21,23,29,35,39,40],nor2:30,nor2_8:30,nor2mask_000111:30,nor3:30,nor3_3:30,nor4:30,nor4_15:30,nor:[9,30,31],normal:[23,40],north:[31,39],nosym:[30,31],notat:[29,31,40],note:[1,8,9,27,30,31,36],now:[8,21,38,40],nterfac:32,ntie:[16,27,31],ntran:[16,31],ntrans:[16,27,31],nul:30,nul_4:30,number:[9,11,13,16,27,29,30,31,32,39,40],nutshel:36,nwell:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nword:[30,31],nxr2:31,nymous_:18,o2_1:[21,23],o2_x2:[21,23],ob_typ:[8,9,13],object:[8,9,10,11,13,16,17,18,20,21,27,31,35,40],observ:32,obsolet:38,obtain:[27,31,40],obviou:[13,40],obvious:[11,36,39],obviousli:[11,21,27,39],occur:[11,16,30,31],occurr:8,ocp:27,octal:32,odd:[27,39],off:[11,27,31],offset:[27,31],offsetx:31,offsety:31,often:[27,40],old:[11,23,38],older:[36,40],ommit:40,onc:[9,11,31],once:[16,39,40],one:[8,21,30,31,39,40],onli:[8,10,11,15,16,17,18,20,21,22,23,27,29,30,31,32,35,36,38,39,40],only:[9,29,30,31,36],open:[16,17,20,21,23,29,31,40],opencham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],oper:[1,11,20,21,29,30],operand:30,operat:30,opt:36,optim:[30,36],option:[1,9,17,19,29,30,31,32],optional:[32,36],optionn:[30,31],or2:[30,31],or2_8:30,or3:30,or3_5:30,or4:30,or4_16:30,order:[18,21,29,30,31,35,36,40,45],ordere:39,ordinari:[21,35,39],ored:30,organ:[9,18],orient:27,orientat:21,origin:[11,27,40],osu_soc:22,other:[9,10,11,16,17,20,21,27,31,32,35,36,37,39,40],otherwis:[11,29,30,31,40],ouput:30,our:[9,11,20,35],out:[11,29,30,31],out_lo:35,out_ph:35,outad:36,outil:31,outlin:40,output:[29,30,31,32,38,40],outsid:[7,16,18],over:[10,18,21,23,27],overflow:30,overhang:27,overlap:[27,40],overload:[9,16],overloard:[29,31],overrid:19,overwritten:40,own:[8,31,35,36,40],owner:16,p_a0:39,p_a1:39,p_a2:39,p_a3:39,p_b0:39,p_b1:39,p_b2:39,p_b3:39,p_cin:[31,39],p_ck:39,p_cout:[31,39],p_d0:39,p_d1:39,p_d2:39,p_d3:39,p_f3:39,p_i0:39,p_i1:39,p_i2:39,p_i3:39,p_i4:39,p_i5:39,p_i6:39,p_i7:39,p_i8:39,p_ng:[31,39],p_noe:39,p_np:[31,39],p_ovr:39,p_q0:39,p_q3:39,p_r0:39,p_r3:39,p_vddeck0:[31,39],p_vddeck1:[31,39],p_vddick0:39,p_vsseck0:39,p_vsseck1:[31,39],p_vssick0:[31,39],p_y0:39,p_y1:39,p_y2:39,p_y3:39,p_y:31,p_zero:39,packag:1,pad:[1,16],pad_east:29,pad_north:29,pad_south:29,pad_west:29,padeast:31,padlib:35,padnorth:31,padsouth:31,padwest:31,page:[21,45],pair:[16,31,39],paper:40,para:31,paradigm:35,parallel:36,param:[1,29,30],paramet:[1,9,11,13,21,23],parameterst:[19,23,35],parametertyp:35,paramid:35,paranoid:[19,35],parent:9,pars:[8,31],parser:[27,38],part:[1,8],partial:[8,11,38],particular:[9,17,20],partit:39,paseast:31,pass:[11,21,39],paswest:31,pat:32,patamet:31,path:1,pathnam:31,patli:27,pattern:[1,29],pattern_begin:1,pattern_end:1,patwrit:1,paul:37,pck:39,pck_px:39,pdf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],pdif:[16,27,31],peopl:11,per:31,percentag:35,perform:[9,30,31,35,36,39,40],perhap:40,peripheri:31,permit:[30,31],persist:11,phfig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],phseg:27,phvia:27,physic:[1,16,20],physical:31,physical_grid:27,pictur:[31,40],piec:31,pin:[20,21,31,46],pitch:[27,31],pixel:40,pixmap:40,place:[1,11,15,16,20],placeandrout:23,placebottom:1,placecentr:1,placecontact:1,placed:21,placeglu:1,placeleft:1,placement:[1,21,23,29,31,35,38],placementstatu:21,placepin:1,placer:1,placeref:1,placerengin:39,placeright:1,placeseg:1,placetop:1,plain:10,plane:39,pleas:[16,31],plot:31,plu:31,plug:[15,16,20],plugin:1,point1:31,point2:31,point:[9,10,11,13,16,20,21,27,31,32,35,39,40],pointer:[8,9,11,13],poli:[16,27,31],polici:35,poly:[16,27,31],polysilicium:27,pop:30,popup:40,port:[29,31,32,36,38],posit:[16,27,31,39,40],possibl:[9,17,20,21,27,31,35,39,40],postfix:39,power:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],powerr:1,practic:[7,27],pre:40,preced:32,precis:[11,16,31,46],predic:9,prefix:[27,39,40],preliminari:38,prepend:35,prerequisit:36,presenc:8,present:[8,18,20,36,40],press:40,pretti:[22,35],previou:[27,31,35,40],previous:[8,9,23,39],price:40,print:[1,18,20,35],printabl:[14,25,28,33,41],printer:40,prior:[16,22,23,40],problem:36,proce:36,procedur:[31,32,33,40],process:[18,19,21,31,35,38,40],produc:32,profil:36,progess:20,program:[9,11,31],programm:30,progress:17,project:36,propag:[39,40],properti:[9,32],proprieti:32,protocol:18,provid:[1,9,10,11,16,19],proxyerror:10,ptie:[27,31],ptran:[16,31],ptrans:[16,27,31],pub:36,pull:36,pure:[19,20,35,40],purist:27,purpos:[17,31,40],push:30,pust:31,put:[9,11,13,27,31,35,39,40],pvddeck:39,pvddeck_px:39,pvddick:39,pvddick_px:39,pvsseck:39,pvsseck_px:39,pvssick:39,pvssick_px:39,pwell:[27,31],pxlib:35,py_incref:[8,9],py_initmodul:[8,9],py_library_h:9,py_return_none:[8,10],pyany_aslong:[10,13],pyarg_parsetupl:[9,10,11,13],pycel:[8,9],pycell_link:[8,9],pycfunct:[8,9,13],pycompon:[8,11],pycomponent:8,pycomponent_destroi:8,pycomponent_getnet:8,pycomponent_getx:8,pycomponent_gety:8,pycomponent_link:8,pycomponent_linkpytyp:8,pycomponent_method:8,pycomponent_o:[8,11],pycontact:8,pycontact_cr:[8,11],pycontact_destroi:8,pycontact_getheight:8,pycontact_getwidth:8,pycontact_link:[8,11],pycontact_linkpytyp:8,pycontact_method:8,pycontact_o:8,pycpp:7,pydatabas:9,pydatabase_o:9,pydatabse_o:9,pydbu_fromlong:10,pyentiti:8,pyentity:8,pyentity_destroi:8,pyentity_getcel:8,pyentity_link:8,pyentity_linkpytyp:8,pyentity_method:8,pyentity_new:8,pyentity_o:8,pyerr_clear:11,pyerr_setstr:[8,9,10,11,13],pyhorizont:8,pyhorizontal_link:8,pyhorizontal_o:8,pyhurrican:[7,8,9,13],pyhurricane_method:[8,9],pyinclud:7,pyinstanc:11,pyinstance_link:11,pylay:11,pylayer_o:11,pylibrari:[7,9,11],pylibrary:9,pylibrary_cr:9,pylibrary_dealloc:9,pylibrary_destroi:9,pylibrary_getcel:9,pylibrary_link:9,pylibrary_linkpytyp:9,pylibrary_method:9,pylibrary_o:9,pymethoddef:[8,9,13],pymodule_addobject:[8,9],pynet:[8,11],pynet_link:8,pynet_o:11,pyobject:[8,9,10,11,13],pyobject_head:[8,9,13],pyobject_new:13,pypoint:[10,13],pypoint_dealloc:13,pypoint_getx:[10,13],pypoint_gety:13,pypoint_init:13,pypoint_link:13,pypoint_linkpytyp:13,pypoint_method:13,pypoint_new:13,pypoint_o:13,pypoint_setx:[10,13],pypoint_sety:13,pyseg:8,pystring_asstr:9,python27:36,python2:36,python:[0,1,2,3,4,5,6,7],pythoncpp:14,pythonpath:[19,40],pythontutori:25,pytype_ready:[8,9],pytype_ready_sub:8,pytypecompon:[8,11],pytypecontact:8,pytypeent:8,pytypeinheritedobjectdefinit:8,pytypelay:11,pytypelibrari:[7,9],pytypenet:11,pytypeobject:[8,9,13],pytypeobjectdefinit:[9,13],pytypeobjectlinkpytyp:[8,9],pytypeobjectlinkpytypenewinit:13,pytypepoint:13,pytyperootobjectdefinit:8,pyvert:8,pyvertical_link:8,pyvertical_o:8,qt5:36,quadri:39,quadruplet:35,quadtre:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],qualiti:40,quarter:39,queri:16,quit:[29,40],rail:1,ram:[30,39],ram_32_32:30,ram_clock:39,ramlib:35,rang:[31,32],rapidjson:36,rather:40,ratio:[23,35,40],rcw:27,rds:1,rds_activ:27,rds_alu1:27,rds_alu2:27,rds_alu3:27,rds_alu4:27,rds_alu5:27,rds_alu6:27,rds_cont:27,rds_gate:27,rds_ndif:27,rds_nimp:27,rds_pdif:27,rds_pimp:27,rds_poly:27,rds_via1:27,rds_via2:27,rds_via3:27,rds_via4:27,rds_via5:27,reach:[11,40],reachabl:40,read:[9,30,35,38,46],readabl:40,readi:16,real:[1,9,16,18],realli:40,reason:27,recent:[27,31],recommand:40,recommended:32,record:40,rectang:27,rectangl:27,recurs:1,red:40,redefin:[8,35],redefinit:8,redhat:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],redirect:40,redraw:40,redund:27,ref:30,refin:9,reflect:40,refnam:31,refresh:[29,31,40],reg:[29,31],regard:[20,31],regexp:35,regist:[1,7,9,29,30],regnumb:30,rel:[16,27,31,32,36],relat:[8,13,21,32,35,40],releas:[1,36,37],relev:[8,9,39],reli:[11,27,36,40],reload:40,remain:[8,9,13,18,40],remark:[8,35,40],rememb:8,remind:15,remov:[18,39,40],ren:30,renam:[39,46],render:40,reopen:17,reorganis:39,repeatedli:40,replac:[20,35,38,40],replic:9,repositori:[36,38],repres:[21,27,31,32,40,46],represent:40,request:[18,30,39],requir:[1,11,29,35],reserv:40,reset:[9,30,40],resizeab:1,resolut:[20,40],respect:[11,35,40],respons:[9,40],rest:[17,23],restart:[39,40],restructuredtext:36,result:[9,11,17,18,20,21,30,35,40],retain:11,retir:39,revers:[8,11],rewrit:[11,38],rewritten:38,rf1_4_16:30,rf1d_4_16:30,rf2lib:35,rflib:35,rhel6:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rhel7:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],right:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],ring:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rip:40,ripup:40,ripupcost:40,rise:[27,31],risk:27,rok:30,rom2_0b1010_0b1100:30,rom4_0b1010_0b1100_0b1111_0b0001:30,rom:30,romlib:35,root:[9,11,16,21,23,35,36],roselyn:32,rot_m:31,rot_p:31,rotat:[21,30,31],rotop:30,rout:[1,20,23,27,29],routabl:40,routag:40,routageck:31,routeck:1,router:[1,16],routingdriven:[35,40],row:21,rowend_x0:21,rp1:21,rp2:21,rpm:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rsave:1,rubber:40,rule:[27,39,40],ruler:40,run:[16,17,19,22,23,31,35,36,39,40],runglobalrout:23,runnabl:16,runnegoci:23,runtim:40,s2r:27,safeti:40,sai:[11,19,21,36,39],said:16,sake:[8,16],same:[7,8,11,16,18,21,27,29,31,32,35,40],sarri:30,satur:40,saturateratio:40,saturaterp:40,save:[1,8,9],savecel:[16,21,23],scan:30,scarri:40,scheme:[39,40],scientif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],scin:30,scn6m_deep_09:35,scope:20,scout:30,screen:40,script:[1,16],scriptmain:[16,17,21,23,39,40],scrub:9,search:[18,35,45],second:[1,11,16,21,27,30,31],section:[35,36,46],secur:35,see:[9,11,16,17,20,21,27,29,31,32,35,36,39,40],seem:[27,31,36,46],seen:[9,23],sefl:31,segment:[1,16,21],sel0:30,sel1:30,sel:30,select:[1,21,30],self:[8,9,10,13,20,29,30,31,32,35],selr:30,selram:30,selw:30,semant:20,send:27,sensit:31,sentinel:[8,9,13],separ:[9,11,27,29,36,39,40],sequenc:[23,31,40],sequenti:35,serv:[4,5],set:[1,7,9,10],setabutmentbox:[16,17,21],setadd:31,setand:31,setbuff:31,setcel:[16,17,21,23],setcomp:31,setdiv:31,seteditor:39,setextern:[16,21,23],setglob:[16,21,23],setmult:31,setmux:31,setnet:[21,23],setnot:31,setor:31,setplacementstatu:21,setrefin:1,setreg:31,setshift:31,settermin:[16,17],settransform:21,setup:[9,16,19,23,35,36],setx:[10,13],setxor:31,sety:13,seven:40,sever:[11,29,31,40],sff2:31,sff3:31,sff:31,sff_4:30,sfft_4:30,shadow:18,shamt:30,shape:[23,27],share:[1,7,8],she:8,shelf:11,shell:[19,31,36],shellsuccess:39,shift:[29,30,31,40],shifter:[1,29,30],shifter_4:30,ship:38,shortcut:1,should:[11,13,19,31,32,36,40],shouldn:27,show:[11,16,18,27,35,40],shown:[9,27,31,35,39],shrot_4:30,si2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],side:[27,31,39,40],sig:29,sign:[30,31,35],signal:[1,4,5,21,29,30],signalin:[30,31,32],signalinout:[30,31,32],signalout:[30,31,32],signalunknown:31,signatur:[8,9,11],silli:27,similar:[8,40],similarli:32,simpl:[1,22,27,35],simplest:[16,35],simpli:[16,18,27,31],simplif:[21,36],simplifi:[19,31,36],simul:[31,32,38,39],sinc:18,singl:40,site:35,size:[27,30,31,32,39,40],skip:18,slanski:31,slice:31,slight:20,sligthli:36,slot:40,slow:40,slsoc6x:36,slsoc6x_64:36,small:[23,25,26,27,31,35,39,40],smallest:[30,46],smallskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],snapshot:1,snx:22,soc:[35,36],socket:40,softwar:1,sole:17,solut:40,solv:40,some:[1,11,16,18,20,27,29],someth:[16,20],sometim:21,somewhat:21,soon:39,sophi:[29,30,31,37],sourc:[16,27,31,36,38,40],sout:[21,23,31],sout_1:[21,23],south:[31,39],space:[23,27,31,35,39,40],spacemargin:[23,35,40],span:13,spec:36,special:[9,19,20],specif:[9,20,35,39,40],specifi:[30,31,40],speed:40,speedup:38,spl1:31,split:[11,39,40],spread:[23,40],squar:[23,27],src:36,sroka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],st_config:31,stabl:36,stack:9,stage:1,stai:27,stamp:32,stand:40,standalon:1,standard:[9,11,13],standard_instances_list:29,standart:39,standpoint:27,start:[20,27,31,40],starter:15,state:[16,18,20,21,23,37,40],statement:46,static_cast:[8,10],statu:21,stechno:39,step:[8,9,27,31,35,36,39,40,46],still:[8,13,28,36,38,40],stimuli:1,stimulu:32,stl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stop:[16,17,21,23,39,40],storag:46,store:[9,10,16,20,30,40],straightforward:22,straigthforward:21,strap:40,strapripuplimit:40,strategi:39,stratu:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],stratus1:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus:31,stratus_mapping_name:31,stream:40,strict:[21,27],string:[9,16,20,30,31,32,35],stroke:40,strongli:40,strongly:32,struct:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],structur:1,stuck:[27,30],stuff:29,style:[9,40],sub:[19,31,32,39],subject:40,subsequ:46,substract:[30,31],substractor:30,subtli:18,success:39,successful:40,successfulli:[36,40],suffer:40,suffic:[21,40],suffix:39,suit:40,summar:20,summari:39,superpos:40,supli:30,suppl:39,suppli:[9,16],support:[7,9,11,13,20,23,32,36,38,40],suppress:40,sure:39,svn:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],swig:11,swiss:40,sxlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],sy_rm:31,sy_rp:31,sym:31,sym_x:31,sym_y:31,symbol:[1,9,16,19,22],symetr:31,symetri:[29,31],symmetri:21,symxy:31,sync:40,synch:40,synonym:23,synopsi:1,syntact:35,syntax:[1,9,20],synthesi:[1,22],synthet:[1,22,38,39],system:[21,31,35,36],system_library:35,tab:[1,21,29,31,35],table:27,tailor:9,take:[9,16,17,23,31,32,40],taken:[11,31,32],talu1:31,talu2:31,talu3:31,talu4:31,talu5:31,talu6:31,talux:27,target:[16,27],task:[8,19,36],taxonomi:35,team:36,technic:1,technolog:[1,16,19,21,22,31],tediou:[19,21,36],tee:40,tell:[9,16,19,27,29,30,35,36,39],temp:31,temp_ext:31,tempext:31,templat:11,temporari:[40,46],ten:11,term:[31,37],termin:1,terminolog:16,test:[1,29],testbench:31,text:[31,39,40],textwidth:37,than:[11,27,31,38,40],thank:[11,29,31,39,40],thei:[9,11,16,18,19,20,27,29,31,35,38,39,40],them:[9,11,20,23,27,36,39,40],therefor:[21,30],thesi:40,thi:[8,9,11,13,14,15,16,18,19,20,21,23,25,26,27,28,29,30,31,32,33,35,36,38,39,40,41,46],thing:32,third:[21,27,30,36],thispagestyl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],those:[8,9,18,19,21,27,29,30,31,35,36,39,40],though:11,three:[7,9,21,27,30,40],through:[9,11,15,16],througout:27,thu:[9,20,35,40],tie:27,tie_x0:21,time:[8,11,31,32,40],tmp:20,todai:16,todbu:[16,17,21,23],togeth:[30,38],toggl:40,tolambda:16,too:[11,23,27,31,40],tool:[1,11,17,19,20],toolchain:40,toolengin:23,top:[31,36,39,40],topolog:40,toproutinglay:40,total:40,toward:[11,19,31],tp_compar:9,tp_dealloc:9,tp_hash:9,tp_init:13,tp_method:9,tp_new:13,tp_repr:9,tp_str:9,trace:[9,40],track:40,track_spacing_alu1:27,track_spacing_alu2:27,track_spacing_alu3:27,track_spacing_alu4:27,track_spacing_alu5:27,track_spacing_alu6:27,track_spacing_alu7:27,track_spacing_alu8:27,track_width_alu1:27,track_width_alu2:27,track_width_alu3:27,track_width_alu4:27,track_width_alu5:27,track_width_alu6:27,track_width_alu7:27,track_width_alu8:27,transform:[9,20],transistor:27,transit:32,translat:[21,27],transmiss:11,transpar:27,tree:[1,8,11,31],tricki:11,trigger:[35,40],tristat:[29,30,31,32],tristate:29,trough:39,trought:35,truli:35,trunk:35,tty:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],tupl:35,turn:[16,21,40],tutori:1,tweak:40,twenti:31,twentu:31,twice:[11,18,31],two:[8,11,15,16,17,19,20,21,23,27,29,30,31,32,35,36,38,39,40],type:[1,7,8],typebool:[19,23,35,40],typedef:[8,9,10,13],typedoubl:35,typeenumer:[23,35],typeint:[35,39,40],typeopt:35,typepercentag:[23,35,40],typerul:35,typestr:[35,39,40],typetab:35,typetitl:35,typic:[9,35,39],ubuntu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],uint64_t:10,unabl:36,unbound:10,uncheck:21,undef:[8,31],undefined:31,under:[1,9,11,16,17,19,21,22,23,27,35],underli:11,underscor:31,understand:[11,36,45],uneed:21,unexpectedli:18,unicorn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33],unifi:40,uniform:[23,35],uniformdens:[23,35,40],uniquif:40,unit:[10,11],units:46,univers:37,unknown:29,unlik:36,unlike:[15,16,38],unlink:35,unmov:40,unplaced:29,unpredict:18,unrout:40,unselect:40,unsign:30,unsupport:40,until:[21,23,40],unzoom:40,updat:9,updatesess:[16,17,20,21,23],upmc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],upon:[11,31,33],upper:[16,27,30,31,40],uppercas:16,usabl:[13,16,27],usage:[27,40],use:[19,31,32,36],used:[30,40],useful:[1,29],user:1,usersguid:41,using:16,usr:[16,21,23,31],usual:[8,9,16,20],utf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],val0:30,val1:30,val2:30,val3:30,valid:[9,11,30,39],valu:[1,8,9,13,19],variabl:[9,16,19,27,31,35],variant:30,variou:[9,11,16],vbe:[29,40],vdd:[16,21,23,29,30,31,32,35],vdde:39,vddi:39,vddin:[29,30,31,32],vector:[18,31,32],verbos:40,verboselevel1:[19,35,40],verboselevel2:[19,35,40],veri:[23,35,39,40],version:[7,14,25,28,33,36,40,41,43,46,47],vertic:[8,16,21,27,31,39,40],vertiv:31,vhdl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],via12:[21,31],via1:31,via23:[21,31],via24:31,via25:31,via26:31,via2:31,via34:31,via35:31,via36:31,via3:31,via45:31,via46:31,via4:31,via56:31,via5:31,via:27,view:[9,16,18,20],viewer:[0,1,16,17,21,35,38,39],vim:31,vimrc:31,violet:40,virtual:[1,15],visibl:[16,40],visual:[27,40],visualis:16,vlsi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vlsisapd:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vspace:39,vss:[16,21,23,29,30,31,32,35],vsse:39,vssi:39,vssin:[29,30,31,32],vst:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vtracksreservedloc:40,vwidth:39,w7_64:36,w8_64:36,wai:[9,10,11,16,20,23,27,31,36,39,40],walk:40,walkthrough:18,wallac:31,want:[8,9,11,16,17,18,19,21,29,31,35,36,40],warn:11,weak:40,weakli:16,weari:18,weekli:21,well:[15,16,18,21,27,29,31,39,40],wen:30,were:40,west:[31,39],wether:31,what:[9,11,17,21,27,31,40],whatev:[35,36,40],when:[10,11,19,27,29,30,31,35,36,39,40,46],where:[7,21,22,32,35,40],whether:[8,18,39,40],which:[7,8,9,13,16,17,19,20,21,27,29,31,32,35,36,37,38,39,40,46],white:40,whitespac:40,whithout:[35,39],whitout:40,whole:[8,27,30,38,39,40,46],whose:[20,35],why:[9,11],wich:31,wide:35,wider:40,width:[8,11,16,27,30,31,40],width_vdd:27,width_vss:27,wil:18,window:[35,36,40],wirelength:40,witch:17,within:[31,40],without:[16,17,27,29,30,31,40],wok:30,won:11,word:[30,31,32],word_length:32,work:[9,16,17,20],work_dir:16,work_lib:18,workhors:15,working_library:35,worklib:35,world:16,wors:40,would:[10,11,18,31,35],wrap:[7,9,11],wrapper:[9,11,23,35],write:[11,15,18,30,31,32,35,39,40],written:[9,11,12,13,16,18,20,35],wrong:31,www:[36,43,46,47],wysiwyg:40,x_grid:27,xml:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],xnor2:30,xnor2_8:30,xnor2mask_0b000111:30,xnor:30,xor2:[30,31],xor2_8:30,xor:30,xored:30,xoring:30,xr2:31,xr2_1:[21,23],xr2_2:[21,23],xr2_x1:[21,23],xr2_x2:[21,23],xxxx:36,y_grid:27,y_slice:27,yacc:36,year:[11,40],yet:[8,31,36,40],yield:31,yifei:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],yosi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],you:[11,16,17,18,19,20,21,22,23,25,26,27,30,31,32,35,36,39,40],your:[1,11,16,17,19,22],zero:[11,27,30,31],zoom:40},titles:["Hurricane/Analog Reference","Comprenhensive Table of Contents","CRL Core Reference","Hurricane Reference","Katabatic Reference","Kite Reference","Oroshi Reference","2. Basic File Structure and CMake configuration","4. Case 2 - Hierarchy of DBo Derived Classes","3. Case 1 - DBo Derived, Standalone","6. Encapsulating DbU","1. Introduction","7. No C++ Hurricane::Name encapsulation","5. Case 3 - Non-DBo Standalone Classe","Hurricane Python/C++ API Tutorial","9. Advanced Topics","3. Making a Standard Cell – Layout","5. Make a script runnable through cgt","4. Manipulating Cells, Nets and Components","2. Setting up the Environment","1. Introduction","6. Making a hierarchical Cell – Netlist","7. Working in real mode","8. Tool Engines (CRL Core)","<no title>","Hurricane+Python Tutorial","Hurricane+Python Tutorial","Symbolic Layout","RDS – Symbolic to Real Conversion in Alliance","Stratus Developper’s Guide","DpGen generators manual","Stratus User’s Guide","Patterns module User’s Guide","Stratus : Netlist Capture Language","Unicorn Reference","Coriolis Configuration & Initialisation","Installation","Credits & License","Release Notes","Python Interface for Hurricane / Coriolis","CGT - The Graphical Interface","Coriolis User’s Guide","Viewer Reference","DEF API Reference","<no title>","Welcome to Coriolis’s documentation!","LEF API Reference","LEF/DEF Language Reference"],titleterms:{"boolean":31,"case":[8,9,13,21],"class":[8,9,13,29],"function":[15,31],"new":16,about:[11,18],abutment:16,add:31,addaccu:31,adding:16,additionn:36,addpat:32,advanc:15,affect:31,affect_ani:32,affect_fix:32,affect_int:32,aliment:31,allianc:[28,35,36,40],allianceframework:[16,18],am2901:39,analog:0,anoth:31,api:[14,43,46],architectur:35,argument:31,arithmet:31,associat:9,attribut:29,base:[8,40],basic:7,blif:22,botch:11,box:16,branch:36,breakpoint:17,buffer:31,build:36,call:46,callback:46,captur:[33,40],cell:[16,18,21,31],cgt:[17,40],chip:39,choic:11,circuit:31,clock:39,cmake:7,collect:18,command:40,comparison:31,complet:[16,21,23],compon:[16,18,27],comprenhens:1,configur:[7,19,31,35,40],connect:21,connector:31,constant:31,constructor:20,content:[1,26],control:40,convers:28,copyupseg:31,core:[2,16,23],corioli:[35,36,39,41,45],coriolisenv:36,creat:[16,21],creation:31,credit:37,crl:[2,16,23],data:[31,40],dbo:[8,9,13],dbu:[10,16],declar:32,declar_interfac:32,def:[43,47],defab:31,deriv:[8,9],descript:[29,31,32],design:[11,40],detail:40,devel:36,developp:29,directori:36,disclaim:11,disk:16,document:45,dpgen:[30,31],dpgenadsb2f:30,dpgenand2:30,dpgenand3:30,dpgenand4:30,dpgenbuff:30,dpgenbus:30,dpgenconst:30,dpgendff:30,dpgendfft:30,dpgenfifo:30,dpgeninv:30,dpgenmux2:30,dpgennand2:30,dpgennand2mask:30,dpgennand3:30,dpgennand4:30,dpgennbus:30,dpgennmux2:30,dpgennor2:30,dpgennor2mask:30,dpgennor3:30,dpgennor4:30,dpgennul:30,dpgenor2:30,dpgenor3:30,dpgenor4:30,dpgenram:30,dpgenrf1:30,dpgenrf1d:30,dpgenrom2:30,dpgenrom4:30,dpgensff:30,dpgensfft:30,dpgenshift:30,dpgenshrot:30,dpgenxnor2:30,dpgenxnor2mask:30,dpgenxor2:30,editor:31,encapsul:[10,12],engine:23,environ:[19,36],error:31,etesian:[23,40],exampl:[16,21,23,31,32,39],execut:[31,40],extens:31,facil:31,file:[7,8,9,13,16,19,21,22,27,31,35],fillcel:31,filter:40,first:[11,35],fix:36,from:21,gener:[20,30,31,35],get:16,getrefxy:31,global:40,graphic:40,grid:27,guid:[29,31,32,41],hack:35,head:9,header:[8,9,13],helper:35,hierarch:[15,21],hierarchi:8,highlight:31,hook:36,how:31,hurrican:[0,3,12,14,16,18,25,26,39,40],hypernet:15,implement:46,indice:45,initialis:35,inspector:40,installat:36,instanc:[21,29,31],instanci:31,instanciat:31,instanti:31,interfac:[39,40],intermedi:8,introduct:[11,20,31],katabat:4,katana:23,kind:20,kite:[5,40],knik:40,lambda:27,languag:[33,47],layer:[16,40],layout:[16,27,31],lef:[22,46,47],librari:[9,31],licens:37,line:40,link:[9,31],list:31,load:[18,22,35,40],look:40,macos:36,make:[16,17,21],manipul:18,manual:30,map:31,mbk_to_rds_bigvia_hole:27,mbk_to_rds_bigvia_metal:27,mbk_to_rds_segment:27,mbk_to_rds_via:27,mbk_wiresetting:27,measur:16,mechan:16,memento:40,method:[29,31,32],miscella:15,miscellan:40,mode:[22,40],model:29,modul:[8,9,31,32],multiplexor:31,name:[12,31],namespac:9,net:[16,18,21,29,31],netlist:[21,31,33,40],non:13,note:[38,46],occurrenc:15,oper:31,option:40,order:46,oroshi:6,packag:[31,36],pad:31,param:31,paramet:[29,31,32,40],part:[9,32],path:[19,31],pattern:[31,32],pattern_begin:32,pattern_end:32,patwrit:32,physic:[21,27],place:[21,31],placebottom:31,placecentr:31,placecontact:31,placeglu:31,placeleft:31,placement:39,placepin:31,placer:[23,40],placeref:31,placeright:31,placeseg:31,placetop:31,plug:21,plugin:39,power:21,powerr:31,print:40,provid:31,python:[8,9,14,25,26,39,40],rail:31,rds:[27,28],real:[22,28],recurs:39,refer:[0,2,3,4,5,6,34,42,43,46,47],regist:31,regular:21,releas:38,requir:36,resizeab:31,restrict:18,rout:31,routeck:31,router:[23,40],routingpad:[15,21],rsave:39,runnabl:17,save:[16,39],script:[17,40],second:35,segment:27,select:[35,40],session:16,set:[16,19,36,40],setrefin:31,share:9,shifter:31,shortcut:40,signal:31,simpl:39,snapshot:40,softwar:35,some:31,special:21,stage:35,standalon:[9,13],standard:16,stimuli:31,stratu:[29,31,33,40],structur:7,suppli:21,symbol:[27,28],synopsi:[29,31],syntax:[31,32],synthesi:40,synthet:40,tab:40,tabl:[1,27,45],technic:11,techno:19,technolog:35,termin:8,terminolog:20,test:31,through:17,tool:[23,35,40],topic:15,tran:15,transform:21,tree:[36,39],tutori:[14,25,26],type:9,under:[36,40],understand:46,unicorn:34,unit:[16,46],useful:31,user:[19,31,32,41],using:17,valu:[27,31],variou:20,view:21,viewer:[40,42],virtual:31,welcom:45,wire:21,work:22,yosi:[22,40],your:31}}) \ No newline at end of file +Search.setIndex({envversion:49,filenames:["Analog/Analog","Contents","CrlCore/CrlCore","Hurricane/Hurricane","Katabatic/Katabatic","Kite/Kite","Oroshi/Oroshi","PythonCpp/Configuration","PythonCpp/DBoHierarchy","PythonCpp/DBoStandalone","PythonCpp/DbU","PythonCpp/Introduction","PythonCpp/Name","PythonCpp/NonDBo","PythonCpp/index","PythonTutorial/AdvancedTopics","PythonTutorial/CellNetComponent","PythonTutorial/CgtScript","PythonTutorial/Collections","PythonTutorial/Environment","PythonTutorial/Introduction","PythonTutorial/Netlist","PythonTutorial/RealDesigns","PythonTutorial/ToolEngines","PythonTutorial/definitions","PythonTutorial/index","PythonTutorial/pdfHeader","RDS/RDSpage","RDS/index","Stratus/Developper","Stratus/DpGen","Stratus/Language","Stratus/Patterns","Stratus/index","Unicorn/Unicorn","UsersGuide/Configuration","UsersGuide/Installation","UsersGuide/LicenseCredits","UsersGuide/Releases","UsersGuide/ScriptsPlugins","UsersGuide/ViewerTools","UsersGuide/index","Viewer/Viewer","defapi/defapi","etc/definitions","index","lefapi/lefapi","lefdef/lefdef"],objects:{},objnames:{},objtypes:{},terms:{"005\u00b5m":27,"01\u00b5m":46,"09\u00b5m":27,"0b0001":30,"0b000111":30,"0b0010":31,"0b0110":31,"0b10":31,"0b1001":31,"0b1010":30,"0b1100":30,"0b1110":31,"0b1111":30,"0x0000ffff":30,"0x14":31,"100k":40,"150k":40,"180nm":35,"18\u00b5m":27,"1\u00b5m":27,"2\u00b5m":27,"32b":36,"32x32":40,"45nm":[19,22],"64b":36,"abstract":8,"boolean":[1,9,29],"case":1,"catch":9,"char":9,"class":[1,7],"const":[30,31],"default":[8,19,27,29,30,31,32,35,36,39,40,46],"else":30,"export":[7,8,9,20,36,38,39],"final":[16,27,36,40],"float":[16,32,35],"function":[1,7,8,9,10,11,13],"goto":40,"import":[8,9,11,16,20,21,22,23,30,31,35,37,38,39,40],"int":13,"long":[10,20,40],"new":[8,9,13],"null":[8,9,10,11,13,30],"public":[20,38],"r\u00e9my":37,"return":[8,9,10,11,13,16,17,18,20,21,23,30,31,35,39,40],"short":11,"static":[8,9,10,11,13,20,22,30,36],"supp\u00e9rior":39,"transient":[16,46],"true":[16,17,19,21,23,27,29,30,31,35,39,40],"try":[16,31,35,40],"void":[8,9,13,20],"while":[10,16,18,20,21,40,46],__add__:29,__and__:29,__c:[8,9,11,13],__div__:29,__geslice__:29,__getitem__:29,__init__:29,__invert__:29,__le__:29,__main__:39,__mul__:29,__name__:39,__or__:29,__python_module:11,__python_module__:[8,11,13],__str__:20,__xor__:29,_add:29,_alia:29,_and:29,_ariti:29,_baseobject:8,_bl:39,_br:39,_buff:29,_chip:39,_clock:[35,39],_comp:29,_db:29,_direct:29,_div:29,_ext:29,_h_type:29,_hur_cel:29,_hur_inst:29,_hur_mastercel:29,_hur_net:29,_ind:29,_insref:29,_lib0:29,_map:29,_model:29,_mult:29,_mux:29,_name:[29,32],_nb_alims_vertical:29,_nb_inst:29,_nb_pin:29,_nb_vdd_pin:29,_nb_vss_pin:29,_not:29,_object:[8,9,10,13],_or:29,_param:29,_plac:29,_px:35,_pyobject:8,_real_model:29,_real_net:29,_reg:29,_shift:29,_st_cell:29,_st_ck:29,_st_inst:29,_st_mastercel:29,_st_merg:29,_st_port:29,_st_sig:29,_st_vdd:29,_st_vsss:29,_stim:31,_sym:29,_tab_nets_cat:29,_tab_nets_out:29,_tl:39,_to_cat:29,_to_merg:29,_tr:39,_type:29,_undercel:29,_xor:29,a2_1:[21,23],a2_2:[21,23],a2_x2:[21,23,31],abc:38,abil:31,abl:[11,17,20,22],about:[1,9],abov:[9,16,17,31,35,36,40],absolut:[13,16,32],abtument:31,abut:[16,21,23,31,39,40],abutmentbox:31,accept:[32,40],access:[8,18,21,31,32,36,38,40],access_class:8,access_object:8,accessor:9,accomod:39,accord:[27,35,39,40],accordingli:11,account:40,accross:11,accumul:32,accur:38,accuraci:40,achiev:38,acknowledg:30,across:[27,35,40],act:7,action:40,activ:[17,27,40],actual:[27,30,32,40],adapt:[19,39],add:[1,9,17,21],add_python_modul:[7,11],add_sub:30,addaccu:1,addd:31,added:38,adder:[30,31],adder_8:30,adding:9,addit:[19,30,31,35,40],addition:31,additionn:1,addmode:35,addpat:1,address:30,addtyp:[8,9],adjac:[15,39],adopt:16,adr:30,advis:40,adw:30,affect:1,affect_ani:1,affect_fix:1,affect_int:1,affili:38,after:[9,16,17,21,22,23,29,31,32,36,39,40],afterward:30,again:[8,9,19,22,36],against:[9,11,22,36,40],ago:11,aim:[20,38],alc_env:36,alexandr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],algorithm:[18,38,40],alia:[19,29,31,36],alias:40,alim:31,alimconnector:31,aliment:[1,29],alimhorizontalrail:31,alimverticalrail:31,all:[9,11,15,16,18,20,21,23,27,29,31,32,35,36,37,38,39,40],allianc:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27],alliance_top:35,allianceconfig:35,alliancetop:35,alloc:[9,20,40],allow:[9,15,16,18,21,27,30,31,32,35,40],almost:[8,19,35,39,40],alon:16,along:[13,40],alpha:38,alphanumer:31,alreadi:[11,18,25,26,31,35,40],also:[5,16,18,20,21,22,27,31,36,40],altern:[35,38,40],alternat:36,although:[27,38,40],alu1:[27,31],alu2:31,alu3:31,alu4:31,alu5:31,alu6:31,alu:31,alux:27,alwai:[9,11,21,30,31,32,40,46],am2901:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38],amd2901:39,amd2901_crl:39,amd2901_crl_chip:39,amd64:36,amend:35,among:16,amount:[30,46],amp:37,ana:5,anabat:[4,23],analysi:40,analyt:[38,40],and2:[30,31],and2_8:30,and3:30,and3_16:30,and4:30,and4_2:30,anded:30,ani:[11,13,16,17,18,19,20,21,22,27,31,32,36,39,40],anneal:[38,39],anonym:18,anoth:[1,11,22,29],another:11,ansi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],anti:40,any:40,anymor:27,anyth:[35,39,40],anywher:40,apach:[43,46,47],api:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],appart:40,appear:[9,21,40],append:[18,31,35,39],appertur:40,appli:[11,21,27,30,31,32,35],applic:40,appropri:[9,31],approx:40,architectur:1,archiv:22,area:[21,23,27,35,40],arg0:[9,10,13],arg1:[9,13],arg:[8,9,10,11,13,31],argument:[1,8,9,10,16,17,21,29,30],arith:31,arithmet:[1,29,30],ariti:[29,31,32],army:40,around:[10,23,31,39,40],arrow:40,art:40,articul:[16,21],aside:[35,39],asign:32,asim:[31,36],asimut:31,ask:[21,27],aspect:[11,23,35,40],aspectratio:[23,35,40],assembl:35,assign:40,assignment:40,associ:[7,8,9,11,13,21,27,40],associat:[1,8],assum:[22,25,26,40],assume:21,asymetr:27,attempt:10,attribut:[1,8,13,20],author:31,autocmd:31,automat:[19,23,29,31,32,36,39,40],automaticali:31,autotool:36,auxsc35:40,avail:[0,2,3,4,5,6,11,16,19,31,34,35,36,38,42,43,46,47],avala:[38,40],avoid:[21,27,40,46],avot:32,awar:[21,27,30,36,40],axi:27,back:[31,38],background:40,backquot:19,bad:8,balanc:40,base:[1,4,5],bashrc:[19,36],basi:30,basic:1,basiclay:40,bdo:13,becaus:[8,17,23,27,36,38,40],becom:[8,20,31,39,40],bee:[31,40],been:[9,11,16,17,18,20,21,29,30,31,35,38,39,40],befor:[17,21,29,31,32,36,40,46],before:32,beforehand:40,begin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],behav:30,behavior:[9,11,13,29,30,31],behaviour:40,belloeil:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],belong:[16,31,35,46],below:[9,11,20,21,23,27,29,31,35,36,39,40],benchmark:40,bend:27,best:[13,40],better:21,between:[11,15,20,21,27,30,31,32,35,39,40],bewteen:21,big:[27,31,40],bigger:40,biggest:21,biggestarea:21,bigvia:27,biject:21,bin:[16,21,23,31,36],binari:[31,32,36,40],bind:35,bit:[27,29,30,31,40],black:[19,35],blif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],blink:40,blob:38,block:[11,20,30,39],blockag:[27,35],blockage:35,bluntli:13,blur:40,boil:27,bood:31,boost:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],booth:31,bootstrap:36,borrow:11,botch:1,both:[16,23,27,29,31,35,36,39,40],bother:9,bottom:[27,31,39],bound:[35,40],bourn:19,box:11,brace:20,branch:1,breakpoint:16,bring:11,brows:[35,40],buf:31,buf_x2:39,buff_32:30,buffer:[1,29,30],bufnewfil:31,bufread:31,bug:[19,35,38,40],build:[1,7,9,11,16,21,27,35],buildfulladd:[21,23],buildinvertor:[16,17],bull:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],bunch:9,bundl:36,buri:15,buse:[29,31],buse_8:30,buss:30,button:40,bzip2:36,c2r:[19,36],c30:30,c31:30,c_temp:31,c_x_n:27,c_x_p:27,ca2:[31,32],cach:39,cad:31,cadenc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],calcul:[31,32],call:[8,9,10,11,13,16,17,18,19,20,21,22,23,29,30,31,32,36,39,40,45],callback:45,calu1:31,calu2:31,calu3:31,calu4:31,calu5:31,calu6:31,calu:31,calux:27,camel:9,can:[8,11,15,16,17,18,19,20,21,22,23,27,30,31,32,35,36,38,39,40,46],candid:21,cannot:[11,16,20,21,27,30,40],capabl:[11,35,36,39,40],capac:40,capacitor:30,capit:9,captur:1,care:[11,23,31,39,40],carry_1:[21,23],carry_2:[21,23],cast:[8,9],cat:31,catal:35,catalog:[16,18,21,23,35],catchcor:[19,35,40],categori:40,caus:[19,36],cbug:40,ccb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cdebug:40,ceil:30,cell:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],cell_1:31,cellnet:18,cellstop:35,cellview:[17,40],center:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],centerend:27,cerr:[8,9],certain:[13,32],cfg:35,cgt:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],ch_htree_bl_tl:39,cham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],chang:[8,13,20,21,30,31,35,38,39,40],chaput:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],charact:[30,35],check:[22,30,31,40],checkbox:40,checker:27,checkout:36,chip:[1,31],chmod:31,choic:1,choos:[9,31,40],chosen:[29,31],chotin:32,chri:[36,37],christian:37,christoph:37,chu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cif:27,cin:[21,23,31],cinfo:40,circuit:1,circular:31,circumv:40,ck_htree:39,ck_htree_bl:39,ck_htree_bl_bl:39,ckin:[29,31,32],ckok:30,clariti:[8,16],class_nam:31,classic:[11,19,35],clean:35,cleaner:21,cleanli:9,clear:[13,39,40],clearer:31,clement:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],click:40,clock:[1,29,30,31,35],clocktre:[35,39],clone:[19,36,40],close:[9,16,17,20,21,23,35,39,40],closer:31,clue:11,cluster:40,cmake:[0,1,2,3,4,5,6],cmd0:31,cmd1:31,cmd2:31,cmd:[30,31],cmo:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cnchu:37,cobject:10,code:[8,9,11,13,16,19,20,21,35,38,39],coher:[20,40],collect:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],collector:20,coloquint:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],color:31,com:[36,43,46,47],combin:[21,36],come:40,command:[1,31,36,39],commit:36,common:[9,11,27,30,31,35,38,39,40],commpos:40,commun:[9,11,13],comp:8,compar:32,comparaison:31,comparison:[1,29],compat:36,compatibilti:38,compil:[11,36,40],complement:[30,32],complet:[7,9,11],completli:[11,16,38,40],complex:[11,27],compliant:36,compnent:40,compon:[1,8,11,15],compos:[21,40],compris:40,comput:[11,16,21,30,31,32,35,39,40],concaten:31,concept:[16,20,21,25,26],conceptor:[29,31],concret:[8,31],conditionn:30,conf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],configur:1,confus:21,congest:40,conjunct:40,connect:[16,20],connectmap:31,connector:[1,16,27],connexion:[15,20,21,29,31],consecut:39,consequ:[8,21,27,38,46],consid:[7,21,27],consist:36,const_0x0000ffff:30,constant:[1,27,30],construct:[13,20,21,31],constructor:[9,11,13],constructorerror:[9,11,13],constval0:30,constval1:30,constval2:30,constval3:30,constval:30,cont_body_n:[27,31],cont_body_p:[27,31],cont_dif_n:[16,27,31],cont_dif_p:[16,27,31],cont_poly:[16,27,31],cont_turn1:31,cont_turn2:31,cont_turn3:31,cont_turn4:31,cont_turn5:31,cont_turn6:31,cont_via2:27,cont_via3:27,cont_via4:27,cont_via5:27,cont_via:27,cont_viax:27,contact1:21,contact2:21,contact:[8,11,16,21,27,31,40],contain:[7,11,16,17,18,19,20,22,27,31,32,35,36,38,39,40],contdifn:16,contdifp:16,conterpart:[4,5,27],contest:40,context:39,contpoli:16,contributor:37,control:[1,11,20,21,27,30,31],conveni:9,convent:[11,16],convers:[1,9,16,18],convert:[9,10,13,16,20,27,32],coodin:31,coordin:[16,20,21,27,29,31,40],copi:[13,20,31,36,40],copuupseg:31,copyright:[37,43,46,47],copyupseg:1,copyupsegmentseccopi:31,cordin:31,core:1,corioli:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34],coriolis2:[7,16,19,21,23,35,36,38,39],coriolis_install:19,coriolis_top:19,coriolisconfigur:35,coriolisenv:[1,19],coriolisinit:35,corner:[16,21,27,31],correct:[31,40],correctli:[23,31],correspond:[29,31,32,40],corrioli:36,cost:40,cougar:27,could:[18,20,31,35,39,40],count:[11,39,40],coupl:40,cours:20,cout:[18,21,23,31],cover:27,cpp:[7,9,11],craft:39,crash:[36,40],creat:[7,8,9,11,13],createcel:[16,17,21,23],creation:[1,16,20,21,23,29],credit:1,crl:[0,1],crl_cata_lib:31,crlcore:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],crude:40,csh:36,ctrl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cumbersom:11,current:[16,23,31,32,35,36,39,40],cursor:40,cwd:35,cycl:32,cyclop:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],cygwin:36,damien:37,dangl:11,darwin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],data:[1,30],databas:[9,11,16,18,20,21,29,38,40,46],database:46,datain0:30,datain1:30,datain:30,dataout:30,date:32,dbit:31,dbo:1,dbodeletemethod:[8,9],dbodestroyattribut:[8,9],dbolinkcreatemethod:[8,9,13],dbu:1,debian:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],debug:[17,36,40],decim:31,declar:[1,9,16],declar_interfac:1,decod:30,decor:40,decreas:40,dedic:[8,20,31],deep:38,deeper:8,deepli:[15,40],def:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42],defab:1,defaultstyl:[19,35],defaultvalu:35,defin:[7,8,9,11,13,16,27,29,30,31,32,35,38,39,40],define:27,definit:[7,8,9,19],degre:31,delet:[9,11,13,18,20,29,35,40],delta:[27,31],demot:27,denser:40,densiti:[35,40],depend:[7,27,31,36,38,39],deplib:7,depth:40,deriv:1,derivedobject:8,describ:[22,27,31,32,35,39],descript:[1,8],descrob:31,design:1,design_kit:40,desir:31,despit:35,destroi:[8,9,13,18,20],detail:[1,16,19,21,23,35,38],detector:30,deterior:31,determin:9,determinist:40,devel:1,develop:[23,36,40],developp:1,devic:40,devtoolset2:36,devtoolset:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dff:39,dff_4:30,dfft_4:30,dialog:40,dict:[18,31],dictionari:[9,18],dictionnari:[9,17,29,31,39],did:[11,22,40],differ:[8,13,18,21,27,29,30,31,35,40],differenti:40,diffus:27,digit:[23,31],digitalinit:23,dimens:[27,31,40],direct:[8,9,11,13,27,29,31,32,35,40],directdeletemethod:13,directdestroymethod:13,directgetlongattribut:[8,10,13],directionn:13,directli:[11,17,20,22,23,32,36,39,40],directori:[1,16,19,21,22,23,31,35],directsetlongattribut:[10,13],disabl:[20,32,40],disambigu:27,disclaim:1,disconnect:21,discrep:22,diseappear:27,displac:40,displai:[9,21,35,40],display:40,distanc:[22,27,46],distinguish:[27,40],distribut:[36,38],disturb:39,ditch:40,divid:32,divis:31,dksdir:22,dl_export:[8,9],dobreak:[16,17,21,23],doc:[13,16,21,23,31,36],dochip:39,document:[11,14,15,20,21,25,28,31,33,35,36,38,39,40,41],docutil:36,doe:[9,31],doesn:[31,40],dogleg:40,don:[9,19,20,36,39],done:[9,16,31,35,40],dosometh:[20,39],dot:[38,40],dotfil:37,doubl:11,down:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],download:40,doxygen:[0,2,3,4,5,6,34,36,39,42],dozen:40,dp_sxlib:35,dpgen:1,dpgenadsb2f:1,dpgenand2:1,dpgenand3:1,dpgenand4:1,dpgenbuff:1,dpgenbus:1,dpgenconst:1,dpgendff:1,dpgendfft:1,dpgenfifo:1,dpgeninv:1,dpgenmux2:1,dpgennand2:1,dpgennand2mask:1,dpgennand3:1,dpgennand4:1,dpgennbus:1,dpgennmux2:1,dpgennor2:1,dpgennor2mask:1,dpgennor3:1,dpgennor4:1,dpgennul:1,dpgenor2:1,dpgenor3:1,dpgenor4:1,dpgenram:1,dpgenrf1:1,dpgenrf1d:1,dpgenrf1dr0:30,dpgenrf1r0:30,dpgenrom2:1,dpgenrom4:1,dpgensff:1,dpgensfft:1,dpgenshift:1,dpgenshrot:1,dpgenxnor2:1,dpgenxnor2mask:1,dpgenxor2:1,dpi:40,drain:27,draw:[16,27,40],drawn:40,drc:27,drive:[30,39],driven:35,drop:[36,38],druc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],due:[35,40],dumb:35,dummi:[19,35,36,39],dump:[18,38,40],duplic:31,dupui:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],dure:[32,40],durole:37,dx1:31,dx2:31,dy1:31,dy2:31,dyld_framework_path:36,dyld_library_path:19,dynam:[11,20,30,36],dynamic_cast:8,each:[9,11,13,21,27,29,30,31,32,35,39,40],eas:[17,35],easi:31,easier:[27,29,31],easiest:36,easili:[20,35,40],east:[31,39],ec322005072076ef53984462fb4a1075c27c7dfd:36,edg:[27,39,40],editor:[1,16,17,21,23,27,29],edu:37,effect:[30,32,40],effort:[23,35,40],egin:32,ego:17,eight:31,either:[9,27,30,31,32,36,39,40],el7_64:36,electr:20,electric:27,element:[16,18,29,40],elif:31,els:[8,9,11,13,31,35],emit:9,empti:[30,40],emul:[9,36],enabl:[30,40],encapsul:[1,8,9],encompass:11,encount:[36,46],end:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47],endif:[8,9,11,13],endl:[8,9,18],endswith:[18,35],enforc:21,eng:37,engin:23,engineloadgrbynet:23,enginenonetlayerassign:23,enough:[21,31,39],enrich:20,ent:8,enter:40,entir:11,entiti:8,entitycast:8,entri:[19,35,39,40],enumer:[31,35],env:31,envelop:31,envenli:40,environ:[1,16],eplac:40,eponym:40,equal:[30,31,40],equival:[20,21,31,40,46],eras:[39,40],error:[1,8,9,11,23,30],esc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],escap:40,escassut:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],especi:16,essai:31,etc:[16,19,31,35,36,39],etesian:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],etesianengin:23,eval:[19,36],even:[21,27,30,38,39],evenli:40,event:[32,36,40],eventslimit:40,ever:18,everi:[9,29,31,35,40],everybodi:23,everyth:[9,35,40],evolv:36,exacltli:27,exact:[16,36,39],exactli:[17,27,36,39,40],exampl:[1,7,8,9,10],except:[9,16,29,31],excess:40,execut:1,exempl:[29,31,40],exist:[18,19,31,35,40,46],exit:[39,40],expand:27,expansion:31,expect:[10,21,35,39],expens:10,experi:40,explain:21,explan:[16,40],explanat:27,explanatori:[9,20],explicit:[10,16,21],explicitli:20,expor:40,expos:[9,11,18],exposur:11,express:[16,20,22,27,31,35,40,46],ext:27,extand:31,extend:[27,29,31],extens:[1,16,17],extent:[35,39,40],extern:[8,9,11,13,16,20,21,29,31,39],extra:[35,40],extract:[9,32],extractor:27,extreme:35,face:31,facil:1,fact:[8,11],factor:[38,40,46],fail:[8,9],failsaf:40,failur:40,fairli:40,fals:[8,9,19,29,30,31,35,40],familiar:[11,25,26],fanci:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],far:[11,28],fashion:11,fast:[35,36,40],fc13:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fc_64:36,featur:40,fedora:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],feedthru:40,feel:20,fgr:40,fhs:36,field:[8,9,13,40],fifo:30,fifo_4_16:30,figur:[27,31,40],file:1,file_nam:31,filenam:[31,32,35],fillcel:1,filler:21,filler_1:21,filler_2:21,filter:[1,21],find:[21,31,35,36],fine:40,finger:40,finish:[16,29,31],first:[1,7,9],fit:[16,17,21,23,31,40],five:27,fix:[1,16,27,32],flag:[16,20,21,23,27,30,40],flatten:[15,39,40],flavor:[9,13],flip:30,flop:30,flow:[31,40],flute:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],fly:21,follow:[7,8,9,11,16,20,27,30,31,32,35,36,39,40],fonction:31,footprint:40,forc:[9,32,39,40],forget:19,forgotten:31,form:[31,35,40],format:[22,31,32,38,40],found:[11,16,21,23,31,35,36],founder:27,foundri:[16,27],four:[9,27,30,39,40],fourth:30,framework:[16,18,21,23,36,38],franck:27,free:[23,40],freebsd:36,freed:20,freedpk:19,freepdk45:22,freepdk:22,freepdk_45:19,from:[8,9,10,11,13,16,18,20],fromlambda:[16,20,21,23],full:30,fulladd:[21,23,31],fulli:[16,23],fuse:[16,20],futur:11,gabriel:37,gap:40,garbag:20,gate:[27,30,40],gaug:[27,35,40],gcell:40,gdb:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gdsii:40,gener:[0,1,2,3,4,5,6],generic_method_head:[8,9,13],genlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],geometr:[27,31,39],get:[9,10,11,15],get_cata_lib:29,getcel:[8,9,18,21,23],getcompon:18,getdb:[16,21],getenv:35,getheight:8,getlay:[16,21],getmasternet:21,getnam:18,getnet:[8,18,21,23],getobjectid:[9,13],getplug:[21,23],getrefxy:1,getstr:[20,40],gettechnolog:[16,21],getwidth:8,getx:[8,10,13],gety:[8,13],ghdl:31,gigant:11,git:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],github:36,give:[7,8,16,27,29,30,31,38,40],given:[8,9,11,16,17,21,27,29,30,31,32,35,36,40],global:[1,9,21,27,35,38],globallengththreshold:40,globalripuplimit:40,gnu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],goal:20,goe:11,good:[7,40],gouvin:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],gpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],graal:27,graphic:[1,19,35,36,38,39],great:39,greater:[31,38],grew:40,grid:[1,16],ground:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,33,34,35,36,37,38,39,40,41,42,43,44,46,47],group:[20,38],gscl45nm:22,guarded:30,gui:36,guid:1,hack:1,had:27,halfadd:31,hand:27,handl:[16,31],hard:[30,35],has_kei:[16,17,21,23,35,39],hasn:40,have:[8,9,11,13,16,18,20,21,23,27,29,30,31,32,35,36,38,39,40,46],haven:31,hcatch:[8,9,10,11,13],head:1,header:1,hecadecim:31,height:[8,11,27,31,40],help:[17,36],helper:[1,9,19],here:[0,2,3,4,5,6,9,11,21,22,27,32,34,35,36,40,42,43,46,47],herit:29,hesit:39,hexa:31,hexadecim:[31,32],hidden:38,hide:40,hierach:31,hierarchi:1,high:[23,35,40],highest:40,highlight:1,highlit:40,himself:[29,31],histor:27,hmeti:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],hoc:[38,40],hold:[8,11,16,40],holder:15,hole:27,home:[17,22,31,35,36,37],homedir:35,hook:[1,9],hope:11,horizont:[8,16,20,21,27,31,39,40],how:[1,15,16,18,20,21,27,30],howev:[35,40],hspace:39,html:[31,36],htracksreservedloc:40,htry:[8,9,10,11,13],http:[36,37,43,46,47],hugo:37,hundredth:16,hur_techno_name:31,hurricaneerror:8,hurricaneplug:29,hwidth:39,hypernet:[0,2,3,4,5,6,7,8,9,10,11,12,13,14],i0_20:31,i386:36,iastat:37,ident:[8,31,35,40],identifi:[35,39,40],ifndef:[8,9,13],illegal:31,illustr:[16,21,22,39],imag:40,imcomplet:38,immediatli:40,implant:27,implement:[9,11,20,23,35,38,40,45],implemet:35,impli:[13,20],imposs:31,improv:40,in0:31,in1:[30,31],in2:[30,31],in3:[30,31],in4:30,in_lo:35,in_ph:35,includ:[7,8,9,11,13,20,31,36,38,40],include:36,inclus:40,incompat:31,incompatibilit:36,increas:[27,40],inde:40,indeed:[29,31],indent:20,index:[27,31,45],indic:[29,31],indirect:8,individu:[27,40],infinit:[19,36,40],info:[19,35,40],inform:[11,16,17,27,40,46],inherit:[9,29],init:[9,13],inithurrican:[8,9],initi:[8,9,32,35,40],initialis:[1,9,19,29,31,32],innov:38,inout:[29,31],input:[29,30,31,32,38],insert:[16,35,39],insid:[9,16,17,23,27,40],inspect:40,inspector:1,inst:[29,30,31],inst_adsb2f:30,inst_and2:30,inst_and3:30,inst_and4:30,inst_buff:30,inst_bus:30,inst_const:30,inst_dff:30,inst_dfft:30,inst_fifo:30,inst_inv:30,inst_mux2:30,inst_nand2:30,inst_nand2mask:30,inst_nand3:30,inst_nand4:30,inst_nbus:30,inst_nmux2:30,inst_nor2:30,inst_nor2mask:30,inst_nor3:30,inst_nor4:30,inst_nul:30,inst_or2:30,inst_or3:30,inst_or4:30,inst_ram:30,inst_rf1:30,inst_rf1d:30,inst_rom2:30,inst_rom4:30,inst_sff:30,inst_sfft:30,inst_shift:30,inst_shrot:30,inst_xnor2:30,inst_xnor2mask:30,inst_xor2:30,instal:[7,16,19,21,22,23,35,36,40],install:36,installat:1,instanc:[1,11,16,20],instanci:[1,8,29],instanciat:[1,29],instanti:1,instantiat:[29,31],instead:[8,11,13,19,22,31,36,40],instens:35,insti:30,insto:30,instop:30,instruct:[31,36,40],instshamt:30,insul:9,integ:[16,32,35],integer_word_length:32,integr:[9,39],intend:40,interact:17,interfac:[1,9,11,16,19,20,21,29,30,31,32,35,38],intermedi:1,intern:[29,31,32,39],interpret:[19,39],interrupt:9,intersect:27,intert:30,interv:31,introduc:[16,36,40],introduct:1,inv:31,inv_54:30,inv_x1:18,invalid:[8,9,11,13],inversor:31,invert:[27,30],inverter:30,invertor:[16,17],invok:31,iowa:37,isdir:35,isn:[31,32],isobar:[7,8,9,10,11,13],isobar_py_component_h:8,isobar_py_contact_h:8,isobar_py_entity_h:8,isobar_py_point_h:13,ispd:40,ispycompon:8,ispycontact:8,ispyentiti:8,ispyhorizont:8,ispylibrari:9,ispypoint:13,ispyvert:8,issu:[11,23],istself:7,ital:40,item:40,iter:[18,40],itself:[9,27],iwl:32,jean:37,json:38,just:[10,11,17,18,21,22,27,31,35,36,40],katabat:[0,2,3],katana:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],katanaengin:23,keep:[13,23],kei:[9,29,31,39,40],kept:27,keyword:17,kgr:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],kind:[16,18,19],kit:5,kite:[0,1,2,3,4],knife:40,knik:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39],know:[9,36,39],known:[21,40,46],kwarg:13,lambda:[1,16,22],lanch:19,languag:[1,31,32],larg:40,last:[9,32,35,36,40],lastli:[9,13],latch:30,later:[13,16,21,38,40],latest:[31,36],latex2html:36,latex:36,lauch:39,launch:[17,19,36,39],layer:1,layerassign:23,layout:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],layoutt:35,lbd:16,lcw:27,ld_library_path:19,lead:40,leaf:[15,39,40],least:[35,39],lef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],lefconvertfactor:46,lefdef:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lefimport:22,lefimporttmpcel:46,left:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],legal:[31,32,38],leght:31,lenght:31,length:[16,27,32],lepka:[19,36,39],less:[11,27,40],let:[13,40],letter:31,level:[8,9,10,11,15,16,17,21,27,35,36,39,40],lex:36,lgpl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lib:[9,22,36,40],liberti:40,libisobar:11,librari:[1,7,8],libxml2:36,licens:1,life:[13,27],like:[8,9,11,17,18,19,20,23,29,30,31,35,36],limit:[20,21,40],line:[1,36,39],linear:40,linebreak:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],link:1,linker:11,linux:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],lip6:36,list:[1,7,18,21,29],listdir:35,littl:[17,27,40],live:[11,40],load:[1,16,17],loader:[22,38],loadglobalrout:23,local:[35,36,40],localripuplimit:40,locat:[31,39,40],lofig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],log2:30,log:40,logic:[5,16,20,21,22,31,32,38,40],logicin:29,logicinout:29,logicout:29,logicunknown:29,logmod:[19,35,40],longer:[11,40],longglobalripuplimit:40,look:[1,9,13,16,22,35,36],loop:[18,19,30,31,36,40],lot:[21,46],low:40,lower:[16,21,30,31,35,40],lowercas:[9,16],lsb:[29,31],lybrari:9,maco:36,macos:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35],macport:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],macro:[7,8,9,11,13,30,40,46],made:[11,21,23,27,29,30,31,39,40],mai:[11,13,16,17,18,19,20,21,27,31,35,36,39,40],main:[20,36,38,40],mainli:[35,38,40],maintain:40,make:[9,15],makefil:36,manag:[11,16,20,22],mandatori:[9,16,19,29,30,31,35],mani:[11,20,27,31],manipul:10,manual:[1,11],map:[1,18,29,30],marek:37,margin:[23,35],mark:32,mask:30,masson:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],master:[11,21,23,29,36,40],mastercel:[29,31],masterlibrari:9,masternet:21,match:[18,31,35,40],materi:40,matrix:27,mauka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],max:35,maxim:40,maximum:40,maxtracelevel:[35,40],mayb:31,mbk:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mbk_:16,mbk_to_rds_bigvia_hole:1,mbk_to_rds_bigvia_metal:1,mbk_to_rds_segment:1,mbk_to_rds_via:1,mbk_wiresetting:1,mean:[11,18,20,22,27,31,35,36,40,46],meaning:[27,30,31],mechan:[9,11,13,15],medskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],member:38,memento:1,memori:[16,18,20,39,40],menu:[17,40],merg:29,messag:[16,17,21,40],metal1:[16,27],metal2:[21,27],metal3:21,metal5:40,metal:[27,40],meth_noargs:[8,9,13],meth_static:[8,9],meth_varargs:[8,9,13],method:[1,9,10,11,13,20,27],method_head:[8,9,13],micromet:[27,46],micron:22,microns:46,middl:31,migrat:38,million:40,miloyip:36,mimic:[9,35],min:35,minim:27,minimum:[39,40],minimumsid:39,minipag:37,minor:[35,40],mintracelevel:[35,40],minut:40,mip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],mirror:39,misc:[19,35,40],miscellan:1,miss:40,mistak:[9,16,31],mistral:31,mix:[4,5,11,23,36],mkdir:36,mode:1,model:[1,16,20,21,27],modelnam:[30,31],modif:[16,18,31,39,40],modifi:[13,18,19,31,40],modul:[1,7],modular:11,modules_stratu:31,mofic:17,monolith:11,more:[8,16,18,20,27,31,35,38,40],moreov:11,mosi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],most:[31,35,40],mostli:[7,20,40],mous:40,movabl:40,move:40,msb:[29,31],much:[11,29,31,35,40],multipl:[22,27,31,38,40,46],multiplex:30,multiplexor:[1,29],multipli:[27,31],must:[7,8,9,11,16,17,19,20,21,22,27,31,32,35,36,39,40],mutat:9,mux2_8:30,mux:[29,31],mx2:31,my_addaccu_:31,my_and2_4bit:31,my_dpgen_and2:31,my_inv:16,myclass:[29,31],myfunc:20,myinst1:31,myinst2:31,myinst3:31,myinst:31,mylib:35,mymap:29,mynet:31,myparam:29,myref:31,myself:15,na2:31,na3:31,na4:31,name:[1,7,8,9,11],namespac:[1,7,8],nand2:30,nand2_8:30,nand2mask_0x0000ffff:30,nand3:30,nand3_20:30,nand4:30,nand4_9:30,nand:30,narrow:40,navig:18,nbit:[30,31],nbit_cmd:30,nbsp:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nbuse29:30,nck:35,ncsu:22,ndif:[16,27,31],nearest:39,need:[7,8,9,11,13,16,19,20,21,23,27,31,35,36,39,40],neg:31,neither:[9,31],nero:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],net8:31,net:[1,8,11,15],neta:31,netb:31,netc:31,netck:31,netcmd:31,netcout:31,netexternalcompon:[16,21],neti0:31,neti1:31,netin:31,netinput:29,netlist:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],netnam:31,neton:31,netout:31,netq:31,nets:31,netv:31,netvdd:31,netvss:31,never:18,nevertheless:31,newer:36,newli:[16,31],newnet:31,newpag:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],next:[31,32,36],nimbu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nmux2_5:30,nmx2:31,no2:31,no3:31,no4:31,noflag:23,noindent:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],non:[1,9,11],none:[16,17,21,23,29,35,39,40],nor2:30,nor2_8:30,nor2mask_000111:30,nor3:30,nor3_3:30,nor4:30,nor4_15:30,nor:[9,30,31],normal:[23,40],north:[31,39],nosym:[30,31],notat:[29,31,40],note:[1,8,9,27,30,31,36],now:[8,21,38,40],nterfac:32,ntie:[16,27,31],ntran:[16,31],ntrans:[16,27,31],nul:30,nul_4:30,number:[9,11,13,16,27,29,30,31,32,39,40],nutshel:36,nwell:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],nword:[30,31],nxr2:31,nymous_:18,o2_1:[21,23],o2_x2:[21,23],ob_typ:[8,9,13],object:[8,9,10,11,13,16,17,18,20,21,27,31,35,40],observ:32,obsolet:38,obtain:[27,31,40],obviou:[13,40],obvious:[11,36,39],obviousli:[11,21,27,39],occur:[11,16,30,31],occurr:8,ocp:27,octal:32,odd:[27,39],off:[11,27,31],offset:[27,31],offsetx:31,offsety:31,often:[27,40],old:[11,23,38],older:[36,40],ommit:40,onc:[9,11,31],once:[16,39,40],one:[8,21,30,31,39,40],onli:[8,10,11,15,16,17,18,20,21,22,23,27,29,30,31,32,35,36,38,39,40],only:[9,29,30,31,36],open:[16,17,20,21,23,29,31,40],opencham:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],oper:[1,11,20,21,29,30],operand:30,operat:30,opt:36,optim:[30,36],option:[1,9,17,19,29,30,31,32],optional:32,optionn:[30,31],or2:[30,31],or2_8:30,or3:30,or3_5:30,or4:30,or4_16:30,order:[18,21,29,30,31,35,36,40,45],ordere:39,ordinari:[21,35,39],ored:30,organ:[9,18],orient:27,orientat:21,origin:[11,27,40],osu_soc:22,other:[9,10,11,16,17,20,21,27,31,32,35,36,37,39,40],otherwis:[11,29,30,31,40],ouput:30,our:[9,11,20,35],out:[11,29,30,31],out_lo:35,out_ph:35,outad:36,outil:31,outlin:40,output:[29,30,31,32,38,40],outsid:[7,16,18],over:[10,18,21,23,27],overflow:30,overhang:27,overlap:[27,40],overload:[9,16],overloard:[29,31],overrid:19,overwritten:40,own:[8,31,35,36,40],owner:16,p_a0:39,p_a1:39,p_a2:39,p_a3:39,p_b0:39,p_b1:39,p_b2:39,p_b3:39,p_cin:[31,39],p_ck:39,p_cout:[31,39],p_d0:39,p_d1:39,p_d2:39,p_d3:39,p_f3:39,p_i0:39,p_i1:39,p_i2:39,p_i3:39,p_i4:39,p_i5:39,p_i6:39,p_i7:39,p_i8:39,p_ng:[31,39],p_noe:39,p_np:[31,39],p_ovr:39,p_q0:39,p_q3:39,p_r0:39,p_r3:39,p_vddeck0:[31,39],p_vddeck1:[31,39],p_vddick0:39,p_vsseck0:39,p_vsseck1:[31,39],p_vssick0:[31,39],p_y0:39,p_y1:39,p_y2:39,p_y3:39,p_y:31,p_zero:39,packag:1,pad:[1,16],pad_east:29,pad_north:29,pad_south:29,pad_west:29,padeast:31,padlib:35,padnorth:31,padsouth:31,padwest:31,page:[21,45],pair:[16,31,39],paper:40,para:31,paradigm:35,parallel:36,param:[1,29,30],paramet:[1,9,11,13,21,23],parameterst:[19,23,35],parametertyp:35,paramid:35,paranoid:[19,35],parent:9,pars:[8,31],parser:[27,38],part:[1,8],partial:[8,11,38],particular:[9,17,20],partit:39,paseast:31,pass:[11,21,39],paswest:31,pat:32,patamet:31,path:1,pathnam:31,patli:27,pattern:[1,29],pattern_begin:1,pattern_end:1,patwrit:1,paul:37,pck:39,pck_px:39,pdf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],pdif:[16,27,31],peopl:11,per:31,percentag:35,perform:[9,30,31,35,36,39,40],perhap:40,peripheri:31,permit:[30,31],persist:11,phfig:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],phseg:27,phvia:27,physic:[1,16,20],physical:31,physical_grid:27,pictur:[31,40],piec:31,pin:[20,21,31,46],pitch:[27,31],pixel:40,pixmap:40,place:[1,11,15,16,20],placeandrout:23,placebottom:1,placecentr:1,placecontact:1,placed:21,placeglu:1,placeleft:1,placement:[1,21,23,29,31,35,38],placementstatu:21,placepin:1,placer:1,placeref:1,placerengin:39,placeright:1,placeseg:1,placetop:1,plain:10,plane:39,pleas:[16,31],plot:31,plu:31,plug:[15,16,20],plugin:1,point1:31,point2:31,point:[9,10,11,13,16,20,21,27,31,32,35,39,40],pointer:[8,9,11,13],poli:[16,27,31],polici:35,poly:[16,27,31],polysilicium:27,pop:30,popup:40,port:[29,31,32,36,38],posit:[16,27,31,39,40],possibl:[9,17,20,21,27,31,35,39,40],postfix:39,power:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],powerr:1,practic:[7,27],pre:40,preced:32,precis:[11,16,31,46],predic:9,prefix:[27,39,40],preliminari:38,prepend:35,prerequisit:36,presenc:8,present:[8,18,20,36,40],press:40,pretti:[22,35],previou:[27,31,35,40],previous:[8,9,23,39],price:40,print:[1,18,20,35],printabl:[14,25,28,33,41],printer:40,prior:[16,22,23,40],problem:36,proce:36,procedur:[31,32,33,40],process:[18,19,21,31,35,38,40],produc:32,profil:36,progess:20,program:[9,11,31],programm:30,progress:17,project:36,propag:[39,40],properti:[9,32],proprieti:32,protocol:18,provid:[1,9,10,11,16,19],proxyerror:10,ptie:[27,31],ptran:[16,31],ptrans:[16,27,31],pub:36,pull:36,pure:[19,20,35,40],purist:27,purpos:[17,31,40],push:30,pust:31,put:[9,11,13,27,31,35,39,40],pvddeck:39,pvddeck_px:39,pvddick:39,pvddick_px:39,pvsseck:39,pvsseck_px:39,pvssick:39,pvssick_px:39,pwell:[27,31],pxlib:35,py_incref:[8,9],py_initmodul:[8,9],py_library_h:9,py_return_none:[8,10],pyany_aslong:[10,13],pyarg_parsetupl:[9,10,11,13],pycel:[8,9],pycell_link:[8,9],pycfunct:[8,9,13],pycompon:[8,11],pycomponent:8,pycomponent_destroi:8,pycomponent_getnet:8,pycomponent_getx:8,pycomponent_gety:8,pycomponent_link:8,pycomponent_linkpytyp:8,pycomponent_method:8,pycomponent_o:[8,11],pycontact:8,pycontact_cr:[8,11],pycontact_destroi:8,pycontact_getheight:8,pycontact_getwidth:8,pycontact_link:[8,11],pycontact_linkpytyp:8,pycontact_method:8,pycontact_o:8,pycpp:7,pydatabas:9,pydatabase_o:9,pydatabse_o:9,pydbu_fromlong:10,pyentiti:8,pyentity:8,pyentity_destroi:8,pyentity_getcel:8,pyentity_link:8,pyentity_linkpytyp:8,pyentity_method:8,pyentity_new:8,pyentity_o:8,pyerr_clear:11,pyerr_setstr:[8,9,10,11,13],pyhorizont:8,pyhorizontal_link:8,pyhorizontal_o:8,pyhurrican:[7,8,9,13],pyhurricane_method:[8,9],pyinclud:7,pyinstanc:11,pyinstance_link:11,pylay:11,pylayer_o:11,pylibrari:[7,9,11],pylibrary:9,pylibrary_cr:9,pylibrary_dealloc:9,pylibrary_destroi:9,pylibrary_getcel:9,pylibrary_link:9,pylibrary_linkpytyp:9,pylibrary_method:9,pylibrary_o:9,pymethoddef:[8,9,13],pymodule_addobject:[8,9],pynet:[8,11],pynet_link:8,pynet_o:11,pyobject:[8,9,10,11,13],pyobject_head:[8,9,13],pyobject_new:13,pypoint:[10,13],pypoint_dealloc:13,pypoint_getx:[10,13],pypoint_gety:13,pypoint_init:13,pypoint_link:13,pypoint_linkpytyp:13,pypoint_method:13,pypoint_new:13,pypoint_o:13,pypoint_setx:[10,13],pypoint_sety:13,pyseg:8,pystring_asstr:9,python27:36,python2:36,python:[0,1,2,3,4,5,6,7],pythoncpp:14,pythonpath:[19,40],pythontutori:25,pytype_ready:[8,9],pytype_ready_sub:8,pytypecompon:[8,11],pytypecontact:8,pytypeent:8,pytypeinheritedobjectdefinit:8,pytypelay:11,pytypelibrari:[7,9],pytypenet:11,pytypeobject:[8,9,13],pytypeobjectdefinit:[9,13],pytypeobjectlinkpytyp:[8,9],pytypeobjectlinkpytypenewinit:13,pytypepoint:13,pytyperootobjectdefinit:8,pyvert:8,pyvertical_link:8,pyvertical_o:8,qt5:36,quadri:39,quadruplet:35,quadtre:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],qualiti:40,quarter:39,queri:16,quit:[29,40],rail:1,ram:[30,39],ram_32_32:30,ram_clock:39,ramlib:35,rang:[31,32],rapidjson:36,rather:40,ratio:[23,35,40],rcw:27,rds:1,rds_activ:27,rds_alu1:27,rds_alu2:27,rds_alu3:27,rds_alu4:27,rds_alu5:27,rds_alu6:27,rds_cont:27,rds_gate:27,rds_ndif:27,rds_nimp:27,rds_pdif:27,rds_pimp:27,rds_poly:27,rds_via1:27,rds_via2:27,rds_via3:27,rds_via4:27,rds_via5:27,reach:[11,40],reachabl:40,read:[9,30,35,38,46],readabl:40,readi:16,real:[1,9,16,18],realli:40,reason:27,recent:[27,31],recommand:40,recommended:32,record:40,rectang:27,rectangl:27,recurs:1,red:40,redefin:[8,35],redefinit:8,redhat:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],redirect:40,redraw:40,redund:27,ref:30,refin:9,reflect:40,refnam:31,refresh:[29,31,40],reg:[29,31],regard:[20,31],regexp:35,regist:[1,7,9,29,30],regnumb:30,rel:[16,27,31,32,36],relat:[8,13,21,32,35,40],releas:[1,36,37],relev:[8,9,39],reli:[11,27,36,40],reload:40,remain:[8,9,13,18,40],remark:[8,35,40],rememb:8,remind:15,remov:[18,39,40],ren:30,renam:[39,46],render:40,reopen:17,reorganis:39,repeatedli:40,replac:[20,35,38,40],replic:9,repositori:[36,38],repres:[21,27,31,32,40,46],represent:40,request:[18,30,39],requir:[1,11,29,35],reserv:40,reset:[9,30,40],resizeab:1,resolut:[20,40],respect:[11,35,40],respons:[9,40],rest:[17,23],restart:[39,40],restructuredtext:36,result:[9,11,17,18,20,21,30,35,40],retain:11,retir:39,revers:[8,11],rewrit:[11,38],rewritten:38,rf1_4_16:30,rf1d_4_16:30,rf2lib:35,rflib:35,rhel6:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rhel7:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],right:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,30,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],ring:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rip:40,ripup:40,ripupcost:40,rise:[27,31],risk:27,rok:30,rom2_0b1010_0b1100:30,rom4_0b1010_0b1100_0b1111_0b0001:30,rom:30,romlib:35,root:[9,11,16,21,23,35,36],roselyn:32,rot_m:31,rot_p:31,rotat:[21,30,31],rotop:30,rout:[1,20,23,27,29],routabl:40,routag:40,routageck:31,routeck:1,router:[1,16],routingdriven:[35,40],row:21,rowend_x0:21,rp1:21,rp2:21,rpm:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],rsave:1,rubber:40,rule:[27,39,40],ruler:40,run:[16,17,19,22,23,31,35,36,39,40],runglobalrout:23,runnabl:16,runnegoci:23,runtim:40,s2r:27,safeti:40,sai:[11,19,21,36,39],said:16,sake:[8,16],same:[7,8,11,16,18,21,27,29,31,32,35,40],sarri:30,satur:40,saturateratio:40,saturaterp:40,save:[1,8,9],savecel:[16,21,23],scan:30,scarri:40,scheme:[39,40],scientif:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],scin:30,scn6m_deep_09:35,scope:20,scout:30,screen:40,script:[1,16],scriptmain:[16,17,21,23,39,40],scrub:9,search:[18,35,45],second:[1,11,16,21,27,30,31],section:[35,36,46],secur:35,see:[9,11,16,17,20,21,27,29,31,32,35,36,39,40],seem:[27,31,36,46],seen:[9,23],sefl:31,segment:[1,16,21],sel0:30,sel1:30,sel:30,select:[1,21,30],self:[8,9,10,13,20,29,30,31,32,35],selr:30,selram:30,selw:30,semant:20,send:27,sensit:31,sentinel:[8,9,13],separ:[9,11,27,29,36,39,40],sequenc:[23,31,40],sequenti:35,serv:[4,5],set:[1,7,9,10],setabutmentbox:[16,17,21],setadd:31,setand:31,setbuff:31,setcel:[16,17,21,23],setcomp:31,setdiv:31,seteditor:39,setextern:[16,21,23],setglob:[16,21,23],setmult:31,setmux:31,setnet:[21,23],setnot:31,setor:31,setplacementstatu:21,setrefin:1,setreg:31,setshift:31,settermin:[16,17],settransform:21,setup:[9,16,19,23,35,36],setx:[10,13],setxor:31,sety:13,seven:40,sever:[11,29,31,40],sff2:31,sff3:31,sff:31,sff_4:30,sfft_4:30,shadow:18,shamt:30,shape:[23,27],share:[1,7,8],she:8,shelf:11,shell:[19,31,36],shellsuccess:39,shift:[29,30,31,40],shifter:[1,29,30],shifter_4:30,ship:38,shortcut:1,should:[11,13,19,31,32,36,40],shouldn:27,show:[11,16,18,27,35,40],shown:[9,27,31,35,39],shrot_4:30,si2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],side:[27,31,39,40],sig:29,sign:[30,31,35],signal:[1,4,5,21,29,30],signalin:[30,31,32],signalinout:[30,31,32],signalout:[30,31,32],signalunknown:31,signatur:[8,9,11],silli:27,similar:[8,40],similarli:32,simpl:[1,22,27,35],simplest:[16,35],simpli:[16,18,27,31],simplif:[21,36],simplifi:[19,31,36],simul:[31,32,38,39],sinc:18,singl:40,site:35,size:[27,30,31,32,39,40],skip:18,slanski:31,slice:31,slight:20,sligthli:36,slot:40,slow:40,slsoc6x:36,slsoc6x_64:36,small:[23,25,26,27,31,35,39,40],smallest:[30,46],smallskip:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],snapshot:1,snx:22,soc:[35,36],socket:40,softwar:1,sole:17,solut:40,solv:40,some:[1,11,16,18,20,27,29],someth:[16,20],sometim:21,somewhat:21,soon:39,sophi:[29,30,31,37],sourc:[16,27,31,36,38,40],sout:[21,23,31],sout_1:[21,23],south:[31,39],space:[23,27,31,35,39,40],spacemargin:[23,35,40],span:13,spec:36,special:[9,19,20],specif:[9,20,35,39,40],specifi:[30,31,40],speed:40,speedup:38,spl1:31,split:[11,39,40],spread:[23,40],squar:[23,27],src:36,sroka:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],st_config:31,stabl:36,stack:9,stage:1,stai:27,stamp:32,stand:40,standalon:1,standard:[9,11,13],standard_instances_list:29,standart:39,standpoint:27,start:[20,27,31,40],starter:15,state:[16,18,20,21,23,37,40],statement:46,static_cast:[8,10],statu:21,stechno:39,step:[8,9,27,31,35,36,39,40,46],still:[8,13,28,36,38,40],stimuli:1,stimulu:32,stl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stop:[16,17,21,23,39,40],storag:46,store:[9,10,16,20,30,40],straightforward:22,straigthforward:21,strap:40,strapripuplimit:40,strategi:39,stratu:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28],stratus1:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus2:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],stratus:31,stratus_mapping_name:31,stream:40,strict:[21,27],string:[9,16,20,30,31,32,35],stroke:40,strongli:40,strongly:32,struct:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],structur:1,stuck:[27,30],stuff:29,style:[9,40],sub:[19,31,32,39],subject:40,subsequ:46,substract:[30,31],substractor:30,subtli:18,success:39,successful:40,successfulli:[36,40],suffer:40,suffic:[21,40],suffix:39,suit:40,summar:20,summari:39,superpos:40,supli:30,suppl:39,suppli:[9,16],support:[7,9,11,13,20,23,32,36,38,40],suppress:40,sure:39,svn:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],swig:11,swiss:40,sxlib:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],sy_rm:31,sy_rp:31,sym:31,sym_x:31,sym_y:31,symbol:[1,9,16,19,22],symetr:31,symetri:[29,31],symmetri:21,symxy:31,sync:40,synch:40,synonym:23,synopsi:1,syntact:35,syntax:[1,9,20],synthesi:[1,22],synthet:[1,22,38,39],system:[21,31,35,36],system_library:35,tab:[1,21,29,31,35],table:27,tailor:9,take:[9,16,17,23,31,32,40],taken:[11,31,32],talu1:31,talu2:31,talu3:31,talu4:31,talu5:31,talu6:31,talux:27,target:[16,27],task:[8,19,36],taxonomi:35,team:36,technic:1,technolog:[1,16,19,21,22,31],tediou:[19,21,36],tee:40,tell:[9,16,19,27,29,30,35,36,39],temp:31,temp_ext:31,tempext:31,templat:11,temporari:[40,46],ten:11,term:[31,37],termin:1,terminolog:16,test:[1,29],testbench:31,text:[31,39,40],textwidth:37,than:[11,27,31,38,40],thank:[11,29,31,39,40],thei:[9,11,16,18,19,20,27,29,31,35,38,39,40],them:[9,11,20,23,27,36,39,40],therefor:[21,30],thesi:40,thi:[8,9,11,13,14,15,16,18,19,20,21,23,25,26,27,28,29,30,31,32,33,35,36,38,39,40,41,46],thing:32,third:[21,27,30,36],thispagestyl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],those:[8,9,18,19,21,27,29,30,31,35,36,39,40],though:11,three:[7,9,21,27,30,40],through:[9,11,15,16],througout:27,thu:[9,20,35,40],tie:27,tie_x0:21,time:[8,11,31,32,40],tmp:20,todai:16,todbu:[16,17,21,23],togeth:[30,38],toggl:40,tolambda:16,too:[11,23,27,31,40],tool:[1,11,17,19,20],toolchain:40,toolengin:23,top:[31,36,39,40],topolog:40,toproutinglay:40,total:40,toward:[11,19,31],tp_compar:9,tp_dealloc:9,tp_hash:9,tp_init:13,tp_method:9,tp_new:13,tp_repr:9,tp_str:9,trace:[9,40],track:40,track_spacing_alu1:27,track_spacing_alu2:27,track_spacing_alu3:27,track_spacing_alu4:27,track_spacing_alu5:27,track_spacing_alu6:27,track_spacing_alu7:27,track_spacing_alu8:27,track_width_alu1:27,track_width_alu2:27,track_width_alu3:27,track_width_alu4:27,track_width_alu5:27,track_width_alu6:27,track_width_alu7:27,track_width_alu8:27,transform:[9,20],transistor:27,transit:32,translat:[21,27],transmiss:11,transpar:27,tree:[1,8,11,31],tricki:11,trigger:[35,40],tristat:[29,30,31,32],tristate:29,trough:39,trought:35,truli:35,trunk:35,tty:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],tupl:35,turn:[16,21,40],tutori:1,tweak:40,twenti:31,twentu:31,twice:[11,18,31],two:[8,11,15,16,17,19,20,21,23,27,29,30,31,32,35,36,38,39,40],type:[1,7,8],typebool:[19,23,35,40],typedef:[8,9,10,13],typedoubl:35,typeenumer:[23,35],typeint:[35,39,40],typeopt:35,typepercentag:[23,35,40],typerul:35,typestr:[35,39,40],typetab:35,typetitl:35,typic:[9,35,39],ubuntu:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],uint64_t:10,unabl:36,unbound:10,uncheck:21,undef:[8,31],undefined:31,under:[1,9,11,16,17,19,21,22,23,27,35],underli:11,underscor:31,understand:[11,36,45],uneed:21,unexpectedli:18,unicorn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33],unifi:40,uniform:[23,35],uniformdens:[23,35,40],uniquif:40,unit:[10,11],units:46,univers:37,unknown:29,unlik:36,unlike:[15,16,38],unlink:35,unmov:40,unplaced:29,unpredict:18,unrout:40,unselect:40,unsign:30,unsupport:40,until:[21,23,40],unzoom:40,updat:9,updatesess:[16,17,20,21,23],upmc:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],upon:[11,31,33],upper:[16,27,30,31,40],uppercas:16,usabl:[13,16,27],usage:[27,40],use:[19,31,32,36],used:[30,40],useful:[1,29],user:1,usersguid:41,using:16,usr:[16,21,23,31],usual:[8,9,16,20],utf:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],val0:30,val1:30,val2:30,val3:30,valid:[9,11,30,39],valu:[1,8,9,13,19],variabl:[9,16,19,27,31,35],variant:30,variou:[9,11,16],vbe:[29,40],vdd:[16,21,23,29,30,31,32,35],vdde:39,vddi:39,vddin:[29,30,31,32],vector:[18,31,32],verbos:40,verboselevel1:[19,35,40],verboselevel2:[19,35,40],veri:[23,35,39,40],version:[7,14,25,28,33,36,40,41,43,46,47],vertic:[8,16,21,27,31,39,40],vertiv:31,vhdl:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],via12:[21,31],via1:31,via23:[21,31],via24:31,via25:31,via26:31,via2:31,via34:31,via35:31,via36:31,via3:31,via45:31,via46:31,via4:31,via56:31,via5:31,via:27,view:[9,16,18,20],viewer:[0,1,16,17,21,35,38,39],vim:31,vimrc:31,violet:40,virtual:[1,15],visibl:[16,40],visual:[27,40],visualis:16,vlsi:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vlsisapd:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vspace:39,vss:[16,21,23,29,30,31,32,35],vsse:39,vssi:39,vssin:[29,30,31,32],vst:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],vtracksreservedloc:40,vwidth:39,w7_64:36,w8_64:36,wai:[9,10,11,16,20,23,27,31,36,39,40],walk:40,walkthrough:18,wallac:31,want:[8,9,11,16,17,18,19,21,29,31,35,36,40],warn:11,weak:40,weakli:16,weari:18,weekli:21,well:[15,16,18,21,27,29,31,39,40],wen:30,were:40,west:[31,39],wether:31,what:[9,11,17,21,27,31,40],whatev:[35,36,40],when:[10,11,19,27,29,30,31,35,36,39,40,46],where:[7,21,22,32,35,40],whether:[8,18,39,40],which:[7,8,9,13,16,17,19,20,21,27,29,31,32,35,36,37,38,39,40,46],white:40,whitespac:40,whithout:[35,39],whitout:40,whole:[8,27,30,38,39,40,46],whose:[20,35],why:[9,11],wich:31,wide:35,wider:40,width:[8,11,16,27,30,31,40],width_vdd:27,width_vss:27,wil:18,window:[35,36,40],wirelength:40,witch:17,within:[31,40],without:[16,17,27,29,30,31,40],wok:30,won:11,word:[30,31,32],word_length:32,work:[9,16,17,20],work_dir:16,work_lib:18,workhors:15,working_library:35,worklib:35,world:16,wors:40,would:[10,11,18,31,35],wrap:[7,9,11],wrapper:[9,11,23,35],write:[11,15,18,30,31,32,35,39,40],written:[9,11,12,13,16,18,20,35],wrong:31,www:[36,43,46,47],wysiwyg:40,x_grid:27,xml:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,31,33,34,35,36,37,38,39,40,41,42,43,44,46,47],xnor2:30,xnor2_8:30,xnor2mask_0b000111:30,xnor:30,xor2:[30,31],xor2_8:30,xor:30,xored:30,xoring:30,xr2:31,xr2_1:[21,23],xr2_2:[21,23],xr2_x1:[21,23],xr2_x2:[21,23],xxxx:36,y_grid:27,y_slice:27,yacc:36,year:[11,40],yet:[8,31,36,40],yield:31,yifei:[0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,33,34,35,36,37,38,39,40,41,42,43,44,46,47],yosi:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21],you:[11,16,17,18,19,20,21,22,23,25,26,27,30,31,32,35,36,39,40],your:[1,11,16,17,19,22],zero:[11,27,30,31],zoom:40},titles:["Hurricane/Analog Reference","Comprenhensive Table of Contents","CRL Core Reference","Hurricane Reference","Katabatic Reference","Kite Reference","Oroshi Reference","2. Basic File Structure and CMake configuration","4. Case 2 - Hierarchy of DBo Derived Classes","3. Case 1 - DBo Derived, Standalone","6. Encapsulating DbU","1. Introduction","7. No C++ Hurricane::Name encapsulation","5. Case 3 - Non-DBo Standalone Classe","Hurricane Python/C++ API Tutorial","9. Advanced Topics","3. Making a Standard Cell – Layout","5. Make a script runnable through cgt","4. Manipulating Cells, Nets and Components","2. Setting up the Environment","1. Introduction","6. Making a hierarchical Cell – Netlist","7. Working in real mode","8. Tool Engines (CRL Core)","<no title>","Hurricane+Python Tutorial","Hurricane+Python Tutorial","Symbolic Layout","RDS – Symbolic to Real Conversion in Alliance","Stratus Developper’s Guide","DpGen generators manual","Stratus User’s Guide","Patterns module User’s Guide","Stratus : Netlist Capture Language","Unicorn Reference","Coriolis Configuration & Initialisation","Installation","Credits & License","Release Notes","Python Interface for Hurricane / Coriolis","CGT - The Graphical Interface","Coriolis User’s Guide","Viewer Reference","DEF API Reference","<no title>","Welcome to Coriolis’s documentation!","LEF API Reference","LEF/DEF Language Reference"],titleterms:{"boolean":31,"case":[8,9,13,21],"class":[8,9,13,29],"function":[15,31],"new":16,about:[11,18],abutment:16,add:31,addaccu:31,adding:16,additionn:36,addpat:32,advanc:15,affect:31,affect_ani:32,affect_fix:32,affect_int:32,aliment:31,allianc:[28,35,36,40],allianceframework:[16,18],am2901:39,analog:0,anoth:31,api:[14,43,46],architectur:35,argument:31,arithmet:31,associat:9,attribut:29,base:[8,40],basic:7,blif:22,botch:11,box:16,branch:36,breakpoint:17,buffer:31,build:36,call:46,callback:46,captur:[33,40],cell:[16,18,21,31],cgt:[17,40],chip:39,choic:11,circuit:31,clock:39,cmake:7,collect:18,command:40,comparison:31,complet:[16,21,23],compon:[16,18,27],comprenhens:1,configur:[7,19,31,35,40],connect:21,connector:31,constant:31,constructor:20,content:[1,26],control:40,convers:28,copyupseg:31,core:[2,16,23],corioli:[35,36,39,41,45],coriolisenv:36,creat:[16,21],creation:31,credit:37,crl:[2,16,23],data:[31,40],dbo:[8,9,13],dbu:[10,16],declar:32,declar_interfac:32,def:[43,47],defab:31,deriv:[8,9],descript:[29,31,32],design:[11,40],detail:40,devel:36,developp:29,directori:36,disclaim:11,disk:16,document:45,dpgen:[30,31],dpgenadsb2f:30,dpgenand2:30,dpgenand3:30,dpgenand4:30,dpgenbuff:30,dpgenbus:30,dpgenconst:30,dpgendff:30,dpgendfft:30,dpgenfifo:30,dpgeninv:30,dpgenmux2:30,dpgennand2:30,dpgennand2mask:30,dpgennand3:30,dpgennand4:30,dpgennbus:30,dpgennmux2:30,dpgennor2:30,dpgennor2mask:30,dpgennor3:30,dpgennor4:30,dpgennul:30,dpgenor2:30,dpgenor3:30,dpgenor4:30,dpgenram:30,dpgenrf1:30,dpgenrf1d:30,dpgenrom2:30,dpgenrom4:30,dpgensff:30,dpgensfft:30,dpgenshift:30,dpgenshrot:30,dpgenxnor2:30,dpgenxnor2mask:30,dpgenxor2:30,editor:31,encapsul:[10,12],engine:23,environ:[19,36],error:31,etesian:[23,40],exampl:[16,21,23,31,32,39],execut:[31,40],extens:31,facil:31,file:[7,8,9,13,16,19,21,22,27,31,35],fillcel:31,filter:40,first:[11,35],fix:36,from:21,gener:[20,30,31,35],get:16,getrefxy:31,global:40,graphic:40,grid:27,guid:[29,31,32,41],hack:35,head:9,header:[8,9,13],helper:35,hierarch:[15,21],hierarchi:8,highlight:31,hook:36,how:31,hurrican:[0,3,12,14,16,18,25,26,39,40],hypernet:15,implement:46,indice:45,initialis:35,inspector:40,installat:36,instanc:[21,29,31],instanci:31,instanciat:31,instanti:31,interfac:[39,40],intermedi:8,introduct:[11,20,31],katabat:4,katana:23,kind:20,kite:[5,40],knik:40,lambda:27,languag:[33,47],layer:[16,40],layout:[16,27,31],lef:[22,46,47],librari:[9,31],licens:37,line:40,link:[9,31],list:31,load:[18,22,35,40],look:40,macos:36,make:[16,17,21],manipul:18,manual:30,map:31,mbk_to_rds_bigvia_hole:27,mbk_to_rds_bigvia_metal:27,mbk_to_rds_segment:27,mbk_to_rds_via:27,mbk_wiresetting:27,measur:16,mechan:16,memento:40,method:[29,31,32],miscella:15,miscellan:40,mode:[22,40],model:29,modul:[8,9,31,32],multiplexor:31,name:[12,31],namespac:9,net:[16,18,21,29,31],netlist:[21,31,33,40],non:13,note:[38,46],occurrenc:15,oper:31,option:40,order:46,oroshi:6,packag:[31,36],pad:31,param:31,paramet:[29,31,32,40],part:[9,32],path:[19,31],pattern:[31,32],pattern_begin:32,pattern_end:32,patwrit:32,physic:[21,27],place:[21,31],placebottom:31,placecentr:31,placecontact:31,placeglu:31,placeleft:31,placement:39,placepin:31,placer:[23,40],placeref:31,placeright:31,placeseg:31,placetop:31,plug:21,plugin:39,power:21,powerr:31,print:40,provid:31,python:[8,9,14,25,26,39,40],rail:31,rds:[27,28],real:[22,28],recurs:39,refer:[0,2,3,4,5,6,34,42,43,46,47],regist:31,regular:21,releas:38,requir:36,resizeab:31,restrict:18,rout:31,routeck:31,router:[23,40],routingpad:[15,21],rsave:39,runnabl:17,save:[16,39],script:[17,40],second:35,segment:27,select:[35,40],session:16,set:[16,19,36,40],setrefin:31,share:9,shifter:31,shortcut:40,signal:31,simpl:39,snapshot:40,softwar:35,some:31,special:21,stage:35,standalon:[9,13],standard:16,stimuli:31,stratu:[29,31,33,40],structur:7,suppli:21,symbol:[27,28],synopsi:[29,31],syntax:[31,32],synthesi:40,synthet:40,tab:40,tabl:[1,27,45],technic:11,techno:19,technolog:35,termin:8,terminolog:20,test:31,through:17,tool:[23,35,40],topic:15,tran:15,transform:21,tree:[36,39],tutori:[14,25,26],type:9,under:[36,40],understand:46,unicorn:34,unit:[16,46],useful:31,user:[19,31,32,41],using:17,valu:[27,31],variou:20,view:21,viewer:[40,42],virtual:31,welcom:45,wire:21,work:22,yosi:[22,40],your:31}}) \ No newline at end of file diff --git a/documentation/etc/definitions.rst b/documentation/etc/definitions.rst index 013d3088..7329285c 100644 --- a/documentation/etc/definitions.rst +++ b/documentation/etc/definitions.rst @@ -105,7 +105,7 @@ .. |Python| replace:: :sc:`Python` .. |Linux| replace:: :sc:`Linux` .. |MacPorts| replace:: :sc:`MacPorts` -.. |devtoolset2| replace:: :cb:`devtoolset2` +.. |devtoolset| replace:: :cb:`devtoolset` .. |boost| replace:: :cb:`boost` .. |Qt| replace:: :sc:`qt` .. |tty| replace:: :cb:`tty` diff --git a/etesian/src/AddFeeds.cpp b/etesian/src/AddFeeds.cpp index 0b34b057..40c91cd6 100644 --- a/etesian/src/AddFeeds.cpp +++ b/etesian/src/AddFeeds.cpp @@ -298,7 +298,6 @@ namespace { namespace Etesian { - using Hurricane::ForEachIterator; using Hurricane::DataBase; using Hurricane::UpdateSession; using Hurricane::Occurrence; @@ -312,14 +311,14 @@ namespace Etesian { Box topCellAb = getCell()->getAbutmentBox(); if (not topCellAb.isEmpty()) { - forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() ) + for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() ) { - Instance* instance = static_cast((*ioccurrence).getEntity()); + Instance* instance = static_cast(occurrence.getEntity()); Cell* masterCell = instance->getMasterCell(); Box instanceAb = masterCell->getAbutmentBox(); Transformation instanceTransf = instance->getTransformation(); - (*ioccurrence).getPath().getTransformation().applyOn( instanceTransf ); + occurrence.getPath().getTransformation().applyOn( instanceTransf ); instanceTransf.applyOn( instanceAb ); if (not topCellAb.contains(instanceAb)) continue; @@ -371,9 +370,9 @@ namespace Etesian { sliceHoles.setSpinSlice0( _yspinSlice0 ); - forEach ( Occurrence, ioccurrence, getCell()->getLeafInstanceOccurrences() ) + for ( Occurrence occurrence : getCell()->getLeafInstanceOccurrences() ) { - Instance* instance = static_cast((*ioccurrence).getEntity()); + Instance* instance = static_cast(occurrence.getEntity()); Cell* masterCell = instance->getMasterCell(); if (CatalogExtension::isFeed(masterCell)) { @@ -384,7 +383,7 @@ namespace Etesian { Box instanceAb = masterCell->getAbutmentBox(); Transformation instanceTransf = instance->getTransformation(); - (*ioccurrence).getPath().getTransformation().applyOn( instanceTransf ); + occurrence.getPath().getTransformation().applyOn( instanceTransf ); instanceTransf.applyOn( instanceAb ); if (not topCellAb.contains(instanceAb)) { diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp index cf16728c..204dacc6 100644 --- a/etesian/src/EtesianEngine.cpp +++ b/etesian/src/EtesianEngine.cpp @@ -83,7 +83,10 @@ namespace { if (not rp->getOccurrence().getPath().getHeadPath().isEmpty()) name << getString(rp->getOccurrence().getPath().getHeadPath().getName()) << ":"; - name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName()); + if (rp->getOccurrence().getPath().getTailInstance()) + name << "I." << getString(rp->getOccurrence().getPath().getTailInstance()->getName()); + else + name << "C"; return name.str(); } @@ -129,6 +132,7 @@ namespace { { Cell* masterCell = rp->getOccurrence().getMasterCell(); Component* component = rp->_getEntityAsComponent(); + // TODO: verify that it doesn't assume that the orientation is North Box masterBox = masterCell->getAbutmentBox(); @@ -373,12 +377,6 @@ namespace Etesian { double rows = std::ceil( sqrt( gcellLength/aspectRatio ) ); double columns = std::ceil( gcellLength / rows ); - cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0) - << "% aspect ratio:" << (aspectRatio*100.0) - << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight())) - << ")" << endl; - cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl; - UpdateSession::open(); for ( auto ioccurrence : feedOccurrences ) { static_cast(ioccurrence.getEntity())->destroy(); @@ -395,6 +393,13 @@ namespace Etesian { ) ); UpdateSession::close(); if (_viewer) _viewer->getCellWidget()->fitToContents(); + + cmess1 << " o Creating abutment box (margin:" << (spaceMargin*100.0) + << "% aspect ratio:" << (aspectRatio*100.0) + << "% g-length:" << (cellLength/DbU::toLambda(getSliceHeight())) + << ")" << endl; + cmess1 << " - " << getCell()->getAbutmentBox() << endl; + cmess1 << " - GCell grid: [" << (int)columns << "x" << (int)rows << "]" << endl; } @@ -445,15 +450,17 @@ namespace Etesian { void EtesianEngine::toColoquinte () { - cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl; - - resetPlacement(); - - Dots dots ( cmess2, " ", 80, 1000 ); AllianceFramework* af = AllianceFramework::get(); DbU::Unit hpitch = getHorizontalPitch(); DbU::Unit vpitch = getVerticalPitch(); + cmess1 << " o Converting <" << getCell()->getName() << "> into Coloquinte." << endl; + cmess1 << ::Dots::asString(" - H-pitch" , DbU::getValueString(hpitch)) << endl; + cmess1 << ::Dots::asString(" - V-pitch" , DbU::getValueString(vpitch)) << endl; + + resetPlacement(); + + Dots dots ( cmess2, " ", 80, 1000 ); if (not cmess2.enabled()) dots.disable(); size_t instancesNb = 0; @@ -544,6 +551,13 @@ namespace Etesian { int_t xpos = instanceAb.getXMin() / vpitch; int_t ypos = instanceAb.getYMin() / hpitch; + // if ( (ysize != 1) and not instance->isFixed() ) { + // cerr << Error( "EtesianEngine::toColoquinte(): Instance \"%s\" of \"%s\" is a block (height: %d)." + // , instanceName.c_str() + // , getString(masterCell->getName()).c_str() + // , ysize ) << endl; + // } + instances[instanceId].size = point( xsize, ysize ); instances[instanceId].list_index = instanceId; instances[instanceId].area = static_cast(xsize) * static_cast(ysize); @@ -644,7 +658,9 @@ namespace Etesian { _progressReport2(" [---]" ); } - void EtesianEngine::roughLegalize( float minDisruption, unsigned options ){ + + void EtesianEngine::roughLegalize ( float minDisruption, unsigned options ) + { using namespace coloquinte::gp; // Create a legalizer and bipartition it until we have sufficient precision auto legalizer = (options & ForceUniformDensity) != 0 ? @@ -669,7 +685,9 @@ namespace Etesian { get_rough_legalization( _circuit, _placementUB, legalizer ); } - void EtesianEngine::feedRoutingBack(){ + + void EtesianEngine::feedRoutingBack () + { using namespace Katabatic; using namespace Kite; /* @@ -712,7 +730,14 @@ namespace Etesian { // Expand areas: TODO } - void EtesianEngine::globalPlace ( float initPenalty, float minDisruption, float targetImprovement, float minInc, float maxInc, unsigned options ){ + + void EtesianEngine::globalPlace ( float initPenalty + , float minDisruption + , float targetImprovement + , float minInc + , float maxInc + , unsigned options ) + { using namespace coloquinte::gp; float_t penaltyIncrease = minInc; @@ -781,7 +806,9 @@ namespace Etesian { _updatePlacement( _placementUB ); } - void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options ){ + + void EtesianEngine::detailedPlace ( int iterations, int effort, unsigned options ) + { using namespace coloquinte::gp; using namespace coloquinte::dp; @@ -841,6 +868,7 @@ namespace Etesian { _updatePlacement( _placementUB ); } + void EtesianEngine::place () { if(getCell()->isPlaced()){ diff --git a/etesian/src/GraphicEtesianEngine.cpp b/etesian/src/GraphicEtesianEngine.cpp index 336dd219..bd37c00d 100644 --- a/etesian/src/GraphicEtesianEngine.cpp +++ b/etesian/src/GraphicEtesianEngine.cpp @@ -126,15 +126,17 @@ namespace Etesian { _viewer = viewer; - if (_viewer->hasMenuAction("placeAndRoute.etesianPlace")) { + if (_viewer->hasMenuAction("placeAndRoute.etesianPlaceBlock")) { cerr << Warning( "GraphicEtesianEngine::addToMenu() - Etesian placer already hooked in." ) << endl; return; } - _viewer->addToMenu( "placeAndRoute.etesianPlace" - , "Etesian - Plac&e" - , "Run the Etesian placer" + _viewer->addToMenu( "placeAndRoute.etesianPlaceBlock" + , "Plac&e Block" + , "Place a block [Etesian]" , std::bind(&GraphicEtesianEngine::_place,this) + , QIcon() + , "placeAndRoute.placeChip" ); } diff --git a/etesian/src/PyEtesianEngine.cpp b/etesian/src/PyEtesianEngine.cpp index aa981c32..5378772d 100644 --- a/etesian/src/PyEtesianEngine.cpp +++ b/etesian/src/PyEtesianEngine.cpp @@ -89,7 +89,7 @@ extern "C" { HTRY PyObject* arg0; - if (not ParseOneArg("Etesian.get", args, CELL_ARG, &arg0)) return NULL; + if (not ParseOneArg("Etesian.create", args, CELL_ARG, &arg0)) return NULL; Cell* cell = PYCELL_O(arg0); etesian = EtesianEngine::get(cell); diff --git a/flute/CMakeLists.txt b/flute/CMakeLists.txt new file mode 100644 index 00000000..b876818e --- /dev/null +++ b/flute/CMakeLists.txt @@ -0,0 +1,20 @@ +# -*- mode: CMAKE explicit-buffer-name: "CMakeLists.txt" -*- + + set( CMAKE_LEGACY_CYGWIN_WIN32 0 ) + project( FLUTE ) + + cmake_minimum_required( VERSION 2.8.9 ) + + set( ignoreVariables "${BUILD_DOC}" ) + + list( INSERT CMAKE_MODULE_PATH 0 "${DESTDIR}$ENV{CORIOLIS_TOP}/share/cmake/Modules/" ) + find_package( Bootstrap REQUIRED ) + setup_project_paths( CORIOLIS ) + print_cmake_module_path() + + set_cmake_policies() + check_distribution() + setup_sysconfdir( "${CMAKE_INSTALL_PREFIX}" ) + + add_subdirectory( src ) + add_subdirectory( cmake_modules ) diff --git a/flute/cmake_modules/CMakeLists.txt b/flute/cmake_modules/CMakeLists.txt new file mode 100644 index 00000000..bd988de9 --- /dev/null +++ b/flute/cmake_modules/CMakeLists.txt @@ -0,0 +1,2 @@ + + install( FILES FindFLUTE.cmake DESTINATION share/cmake/Modules ) diff --git a/flute/cmake_modules/FindFLUTE.cmake b/flute/cmake_modules/FindFLUTE.cmake new file mode 100644 index 00000000..81fd8433 --- /dev/null +++ b/flute/cmake_modules/FindFLUTE.cmake @@ -0,0 +1,31 @@ +# - Find the FLUTE includes and libraries. +# The following variables are set if Coriolis is found. If FLUTE is not +# found, FLUTE_FOUND is set to false. +# FLUTE_FOUND - True when the Coriolis include directory is found. +# FLUTE_INCLUDE_DIR - the path to where the Coriolis include files are. +# FLUTE_LIBRARIES - The path to where the Coriolis library files are. + + +set( FLUTE_INCLUDE_PATH_DESCRIPTION "The directory containing the FLUTE include files. E.g /usr/local/include/coriolis/flute/3.1 or /soc/coriolis2/include/coriolis/flute/3.1" ) +set( FLUTE_DIR_MESSAGE "Set the FLUTE_INCLUDE_DIR cmake cache entry to the ${FLUTE_INCLUDE_PATH_DESCRIPTION}" ) + +if( UNIX ) + # + # Look for an installation. + # + find_path( FLUTE_INCLUDE_PATH NAMES flute.h + PATHS ${CORIOLIS_DIR_SEARCH} + PATH_SUFFIXES include/flute/3.1 + DOC "${FLUTE_INCLUDE_PATH_DESCRIPTION}" + ) + + find_library( FLUTE_LIBRARY_PATH NAMES flute + PATHS ${CORIOLIS_DIR_SEARCH} + PATH_SUFFIXES lib${LIB_SUFFIX} + DOC "${FLUTE_INCLUDE_PATH_DESCRIPTION}" + ) + + set_libraries_path (FLUTE FLUTE) + hurricane_check_libraries(FLUTE) + +endif( UNIX ) diff --git a/flute/src/3.1/CMakeLists.txt b/flute/src/3.1/CMakeLists.txt new file mode 100644 index 00000000..7629d145 --- /dev/null +++ b/flute/src/3.1/CMakeLists.txt @@ -0,0 +1,31 @@ +# -*- mode: CMAKE explicit-buffer-name: "CMakeLists.txt" -*- + + include_directories ( ${FLUTE_SOURCE_DIR}/src/3.1 + ) + + set ( includes flute.h + dl.h + mst2.h + err.h + heap.h + dist.h + global.h + neighbors.h + ) + set ( cpps flute.cpp + flute_mst.cpp + dist.cpp + dl.cpp + err.cpp + mst2.cpp + heap.cpp + neighbors.cpp + ) + + add_library ( flute ${cpps} ) + set_target_properties ( flute PROPERTIES VERSION 3.1 SOVERSION 3 ) + + install ( TARGETS flute DESTINATION lib${LIB_SUFFIX} ) + install ( FILES ${includes} DESTINATION include/flute/3.1 ) + install ( FILES POST9.dat + POWV9.dat DESTINATION share/flute/3.1 ) diff --git a/flute/src/3.1/ChangeLog.txt b/flute/src/3.1/ChangeLog.txt new file mode 100755 index 00000000..809cc42f --- /dev/null +++ b/flute/src/3.1/ChangeLog.txt @@ -0,0 +1,40 @@ +Version 1.0 [Apr. 2004] + * Wirelength estimation based on the idea of ICCAD 04 paper. + +Version 2.0 [Feb. 16, 2005] + * RSMT construction and Wirelength estimation based on the idea of ISPD + 05 paper. + +Version 2.1 [Mar. 18, 2005] + * The program flute-ckt and associated files are added to compute the + FLUTE wirelength for a circuit in bookshelf format. + +Version 2.2 [Oct. 16, 2005] + * The net breaking technique is improved by incorporating the HPWL based + estimation in ICCAD 04 paper. + * The option to remove duplicated pins is added. + * The code is reorganized. + +Version 2.3 [Sep. 23, 2006] + * PORT is renamed to POST (Potentially Optimal Steiner Tree) + * The function readLUT() is rewritten to significantly cut the POWV + and POST reading time. + +Version 2.4 [Jan. 16, 2007] + * Internal parameters of flutes_wl_MD() and flutes_MD() are tuned to + improve runtime-quality tradeoff. + * The file size of POST9.dat is reduced by improved encoding. + * The function readLUT() is improved to speed up the reading of POST9.dat. + * Bookshelf files for ibm01 is included to demonstrate program flute-ckt. + +Version 2.5 [Jun. 20, 2007] + * Local refinement technique is added to improve runtime-accuracy + tradeoff for high accuracy. + +Version 3.0 [Apr. 10, 2008] + * Implemented the net breaking and merging ideas of VLSIDAT 08 paper to + achieve much better scalability and accuracy for high-degree nets. + +Version 3.1 [Feb. 28, 2011] + * Functions in bookshelf_IO.c and memAlloc.c used by flute-ckt are + improved to speed up the reading of GSRC Bookshelf format circuits. diff --git a/flute/src/3.1/Makefile b/flute/src/3.1/Makefile new file mode 100755 index 00000000..eae3a599 --- /dev/null +++ b/flute/src/3.1/Makefile @@ -0,0 +1,26 @@ +CC = gcc +CFLAGS = -O3 -I. + +SRC = dist.c dl.c err.c heap.c mst2.c neighbors.c \ + bookshelf_IO.c memAlloc.c flute.c flute_mst.c +OBJ = $(SRC:.c=.o) + +all: flute-net flute-ckt rand-pts + +flute-net: flute-net.c ${OBJ} + $(CC) $(CFLAGS) -o flute-net flute-net.c ${OBJ} -lm + +flute-ckt: flute-ckt.c ${OBJ} + $(CC) $(CFLAGS) -o flute-ckt flute-ckt.c ${OBJ} -lm + +rand-pts: rand-pts.c + $(CC) $(CFLAGS) -o rand-pts rand-pts.c + +flute.o: flute.c flute.h + $(CC) $(CFLAGS) -c -o flute.o flute.c + +flute_mst.o: flute_mst.c flute.h + $(CC) $(CFLAGS) -c -o flute_mst.o flute_mst.c + +clean: + rm -f *.o core* diff --git a/knik/src/flute-3.1/etc/POST9.dat b/flute/src/3.1/POST9.dat old mode 100644 new mode 100755 similarity index 100% rename from knik/src/flute-3.1/etc/POST9.dat rename to flute/src/3.1/POST9.dat diff --git a/knik/src/flute-3.1/etc/POWV9.dat b/flute/src/3.1/POWV9.dat old mode 100644 new mode 100755 similarity index 100% rename from knik/src/flute-3.1/etc/POWV9.dat rename to flute/src/3.1/POWV9.dat diff --git a/flute/src/3.1/Readme b/flute/src/3.1/Readme new file mode 100755 index 00000000..5b9da7ae --- /dev/null +++ b/flute/src/3.1/Readme @@ -0,0 +1,40 @@ +-------------- FLUTE - Version 3.1 ----------------- + by + Chris C.-N. Chu + Dept. of ECpE, Iowa State University + Copyright (c) - 2005 + Iowa State University Research Foundation, Inc. +---------------------------------------------------- + +This package contains the following files: + + flute.c -- The rectilinear Steiner minimal tree and wirelength estimation + algorithm described in the ICCAD 04 and ISPD 05 papers with + some improvements described in TCAD 07 paper. + flute.h -- The interface to use flute. + flute_mst.c -- The net breaking and merging techniques described in the + VLSIDAT 08 paper. + dist.[ch], dl.[ch], err.[ch], heap.[ch], mst2.[ch], neighbors.[ch], + global.h -- Utility functions used by flute_mst.c + POWV9.dat -- The lookup-table of optimal POWVs up to degree 9. + POST9.dat -- The lookup-table for optimal Steiner trees up to degree 9. + flute-net.c -- A program to evaluate the wirelength of a net. It takes + input from stdin as a list of points. + rand-pts.c -- A program to generate a list of random points. + flute-ckt.c -- A program to find FLUTE and half-perimeter wirelength + of a circuit in bookshelf format. + bookshelf_IO.[ch] -- Functions for flute-ckt.c to read bookshelf files. + memAlloc.[ch] -- Functions for flute-ckt.c to allocate memory. + ibm01/ibm01.* -- ibm01 bookshelf files that can be read by flute-ckt.c + license.txt -- License agreement. + ChangeLog.txt + Makefile + Readme + +To run the programs, first do a 'make'. POWV9.dat and POST9.dat is assume +to be in the current directory. Some example commands: + + rand-pts | flute-net + rand-pts 20 | flute-net // 20-pin nets + rand-pts -r 20 | flute-net // randomized + flute-ckt ibm01 ibm01.aux ibm01/ibm01.pl diff --git a/flute/src/3.1/bookshelf_IO.cpp b/flute/src/3.1/bookshelf_IO.cpp new file mode 100755 index 00000000..216ccb0e --- /dev/null +++ b/flute/src/3.1/bookshelf_IO.cpp @@ -0,0 +1,1208 @@ +/* ----------- FastPlace - Version 3.1 ---------------- + by + Natarajan Viswanathan and Chris C.-N. Chu + Dept. of ECpE, Iowa State University + Copyright (c) - 2004 +Iowa State University Research Foundation, Inc. +--------------------------------------------------------*/ +/* -------------------------------------------------------------------------- + Contains routines to: + - Read and Write the benchmark files in Bookshelf format +----------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include + +#include "memAlloc.h" +#include "bookshelf_IO.h" + +namespace Flute { + +#define hashsize(n) ((uint32_t)1<<(n)) +#define hashmask(n) (hashsize(n)-1) +#define rot(x, k) (((x)<<(k)) | ((x)>>(32-(k)))) +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + + +/*-- extern variables --*/ + // from createHash() + char **cellName = NULL; + + // from readAuxFile() + char *nodesFile = NULL; + char *netsFile = NULL; + char *wtsFile = NULL; + char *sclFile = NULL; + char *plFile = NULL; + char *benchmarkName = NULL; + + // from readNodesFile() + int movableNodes, numTerminals; + float averageCellWidth; + float *cellWidth = NULL; + float *cellHeight = NULL; + float *cellArea = NULL; + + // from readNetsFile() + int numNets, numPins; + int *netlist = NULL; + int *netlistIndex = NULL; + float *xPinOffset = NULL; + float *yPinOffset = NULL; + char **netName = NULL; + + // from readPlFile() + float *xCellCoord = NULL; + float *yCellCoord = NULL; + char **cellOrientation = NULL; + + // from readSclFile() + ROW *core_row = NULL; + int numRows, numRowBlockages; + float siteOriginY, siteEndY, coreHeight; + float siteOriginX, siteEndX, coreWidth; + float minX, maxX, minY, maxY; + float coreRowHeight; + float *xRowBlockage = NULL; + float *yRowBlockage = NULL; + float *widthRowBlockage = NULL; + + // from readWtsFile() + float *netWeight = NULL; + + +/*-- global variables --*/ + typedef struct nodesHash NODES; + struct nodesHash { + char *name; + unsigned long index; + }; + NODES **NodesInfo = NULL; + NODES **NetsInfo = NULL; + long hashSize, hashBits; + unsigned long *RN = NULL; + unsigned char *hashFlag = NULL; + + int numNodes; + char error_text[BUFFERSIZE]; + + +/*-- functions --*/ + void createHash(char benchmarkPath[], char nodesFile[]); + inline uint32_t get_hashfunc(const void *key, size_t length, uint32_t initval); + void freeHash(); + void readAuxFile(char benchmarkPath[], char auxFile[]); + inline long getIndex(char temp[]); + void readNodesFile(char benchmarkPath[], char nodesFile[]); + void readNetsFile(char benchmarkPath[], char netsFile[]); + void readPlFile(char benchmarkPath[], char plFile[]); + void readSclFile(char benchmarkPath[], char sclFile[]); + void readWtsFile(char benchmarkPath[], char wtsFile[], int net_weights); + void writePlFile(char outputDir[], char fileName[], float xCoord[], float yCoord[], + int totalNodes); + + +/* ----------------------------------------------------------- + Reads the .nodes file and creates a hash linking cell name + to cell index for all the nodes in the circuit + (movable nodes + fixed nodes + I/O pads) + + creates extern vars: + cellName[] +----------------------------------------------------------- */ +void createHash(char benchmarkPath[], char nodesFile[]) +{ + FILE *fp; + char file_name[BUFFERSIZE], temp[BUFFERSIZE], node_type[50]; + char line[LINESIZE]; + float nodeWidth, nodeHeight; + long j, nonpin_ptr, pin_ptr; + long R, hashfunc, RN_index; + int node_count; + + + strcpy(file_name, benchmarkPath); + strcat(file_name, "/"); + strcat(file_name, nodesFile); + + if((fp=fopen(file_name, "r")) == NULL) { + sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name); + runtimeError(error_text); + } + + numNodes = numTerminals = 0; + while(!feof(fp)) { + fgets(line, LINESIZE, fp); + sscanf(line, "%s\t%*s\n", temp); + + if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0) + continue; + + if(strcmp(temp, "NumNodes") == 0) { + sscanf(line, "NumNodes\t:\t%d\n", &numNodes); + } else if(strcmp(temp, "NumTerminals") == 0) { + sscanf(line, "NumTerminals\t:\t%d\n", &numTerminals); + break; + } else {} + } + fclose(fp); + + if(numNodes == 0) { + sprintf(error_text, "bookshelf_IO: NumNodes = %d", numNodes); + runtimeError(error_text); + } + + // defining and allocating hash variables + hashBits = 3+(long)(log(numNodes)/log(2)); + hashSize = hashsize(hashBits); + + if(NodesInfo == NULL) { + NodesInfo = (NODES **) malloc(hashSize*sizeof(NODES *)); + if(!NodesInfo) + runtimeError("bookshelf_IO: allocation failure in createNodesHash()"); + } else { + runtimeError("bookshelf_IO: NodesHash is not NULL"); + } + for(j=0; j= hashSize) { + sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", temp); + runtimeError(error_text); + } + + NodesInfo[hashfunc] = (NODES *) malloc(sizeof(NODES)); + NodesInfo[hashfunc]->name = cellName[pin_ptr]; + NodesInfo[hashfunc]->index = pin_ptr; + hashFlag[hashfunc] = 1; + + pin_ptr++; + + } else { + + // create array to save cell name + cellName[nonpin_ptr] = (char *) malloc((strlen(temp)+1)*sizeof(char)); + strcpy(cellName[nonpin_ptr], temp); + + // create a hash table for name searching + hashfunc = (long)get_hashfunc(cellName[nonpin_ptr], + strlen(cellName[nonpin_ptr])*sizeof(char), + 13); + hashfunc = (hashfunc & hashmask(hashBits)); + + RN_index = 1; + while(hashFlag[hashfunc] != 0 && RN_index < hashSize) { + hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits)); + RN_index++; + } + + if(hashfunc >= hashSize) { + sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", temp); + runtimeError(error_text); + } + + NodesInfo[hashfunc] = (NODES *) malloc(sizeof(NODES)); + NodesInfo[hashfunc]->name = cellName[nonpin_ptr]; + NodesInfo[hashfunc]->index = nonpin_ptr; + hashFlag[hashfunc] = 1; + + nonpin_ptr++; + } + } + + fclose(fp); + if(node_count != numNodes) { + sprintf(error_text, "bookshelf_IO: NumNodes (%d) != Number of Node descriptions (%d)", + numNodes, node_count); + runtimeError(error_text); + } +} + + +/* ----------------------------------------------------------------------- + hash function generator + + By Bob Jenkins, 2006. bob_jenkins@burtleburtle.net. You may use this + code any way you wish, private, educational, or commercial. It's free. + http://burtleburtle.net/bob/hash/doobs.html +----------------------------------------------------------------------- */ +inline uint32_t get_hashfunc(const void *key, size_t length, uint32_t initval) +{ + uint32_t a,b,c; // internal state + + + // Set up the internal state + a = b = c = 0xdeadbeef + ((uint32_t)length) + initval; + + // need to read the key one byte at a time + const uint8_t *k = (const uint8_t *)key; + + // all but the last block: affect some 32 bits of (a,b,c) + while (length > 12) { + a += k[0]; + a += ((uint32_t)k[1])<<8; + a += ((uint32_t)k[2])<<16; + a += ((uint32_t)k[3])<<24; + b += k[4]; + b += ((uint32_t)k[5])<<8; + b += ((uint32_t)k[6])<<16; + b += ((uint32_t)k[7])<<24; + c += k[8]; + c += ((uint32_t)k[9])<<8; + c += ((uint32_t)k[10])<<16; + c += ((uint32_t)k[11])<<24; + mix(a,b,c); + length -= 12; + k += 12; + } + + // last block: affect all 32 bits of (c) + switch(length) { // all the case statements fall through + case 12: c+=((uint32_t)k[11])<<24; + case 11: c+=((uint32_t)k[10])<<16; + case 10: c+=((uint32_t)k[9])<<8; + case 9 : c+=k[8]; + case 8 : b+=((uint32_t)k[7])<<24; + case 7 : b+=((uint32_t)k[6])<<16; + case 6 : b+=((uint32_t)k[5])<<8; + case 5 : b+=k[4]; + case 4 : a+=((uint32_t)k[3])<<24; + case 3 : a+=((uint32_t)k[2])<<16; + case 2 : a+=((uint32_t)k[1])<<8; + case 1 : a+=k[0]; + break; + case 0 : return c; + } + + final(a,b,c); + + return c; +} + + +/* ----------------------------------------------------------- + frees hash elements +----------------------------------------------------------- */ +void freeHash() +{ + int j; + + + for(j=0; jname) == 0) { + break; + } else { + hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits)); + RN_index++; + } + } + + if(RN_index >= hashSize) { + sprintf(error_text, "bookshelf_IO: Cannot find %s in hash table", temp); + runtimeError(error_text); + } + + return NodesInfo[hashfunc]->index; +} + + +/* ----------------------------------------------------------- + Reads the .nodes file to get cell widths and heights + + creates extern vars: + movableNodes, numTerminals, averageCellWidth, + cellWidth[], cellHeight[], cellArea[] +----------------------------------------------------------- */ +void readNodesFile(char benchmarkPath[], char nodesFile[]) +{ + FILE *fp; + char file_name[BUFFERSIZE], temp[BUFFERSIZE], node_type[50]; + char line[LINESIZE]; + long nodeIndex; + float nodeWidth, nodeHeight, sumWidth; + int node_count; + + + strcpy(file_name, benchmarkPath); + strcat(file_name, "/"); + strcat(file_name, nodesFile); + + if((fp=fopen(file_name, "r")) == NULL) { + sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name); + runtimeError(error_text); + } +// printf("Reading %s ...\n", nodesFile); + + movableNodes = numNodes - numTerminals; // global var - num of movable cells + if(cellWidth == NULL && cellHeight == NULL && cellArea == NULL) { + cellWidth = vector(1, numNodes); // global vector giving cell widths + cellHeight = vector(1, numNodes); // global vector giving cell heights + cellArea = vector(1, numNodes); // global vector giving cell areas + } else { + runtimeError("bookshelf_IO: allocation error in readNodesFile()"); + } + + sumWidth = 0; + node_count = 0; + + while(!feof(fp)) { + *line = '\0'; + fgets(line, LINESIZE, fp); + sscanf(line, "%s\t%*s\n", temp); + + // intermediate lines can be blanks or begin with # + if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0) + continue; + + if(strcmp(temp, "NumNodes") == 0 || strcmp(temp, "NumTerminals") == 0) + continue; + + *node_type = '\0'; + sscanf(line, "%s%f%f%s\n", temp, &nodeWidth, &nodeHeight, node_type); + node_count++; + + nodeIndex = getIndex(temp); + + // store cellwidth, cellheight and cellarea corresponding to nodeIndex + cellWidth[nodeIndex] = nodeWidth; + cellHeight[nodeIndex] = nodeHeight; + cellArea[nodeIndex] = nodeWidth*nodeHeight; + if(nodeIndex <= movableNodes) + sumWidth += nodeWidth; + } + + // find average cell width + averageCellWidth = sumWidth/movableNodes; + averageCellWidth *= 100; + averageCellWidth = (int)averageCellWidth; + averageCellWidth /= 100; + + fclose(fp); + if(node_count != numNodes) { + sprintf(error_text, "bookshelf_IO: NumNodes (%d) != Number of Node descriptions (%d)", + numNodes, node_count); + runtimeError(error_text); + } + +#if(DEBUG) +int i; +for(i=1; i<=movableNodes+numTerminals; i++) { + printf("%d %s %.2f %.2f %.2f\n", i, cellName[i], cellWidth[i], cellHeight[i], cellArea[i]); +} + +printf("Avg Cell Width: %.2f \n", averageCellWidth); +#endif +} + + +/* ----------------------------------------------------------- + Reads the .nets file to get the netlist information + + creates extern vars: + numNets, numPins, + xPinOffset[], yPinOffset[], netlist[], netlistIndex[] +----------------------------------------------------------- */ +void readNetsFile(char benchmarkPath[], char netsFile[]) +{ + FILE *fp; + char file_name[BUFFERSIZE], temp[BUFFERSIZE], nodeName[BUFFERSIZE], pinDirection[5]; + char line[LINESIZE]; + long nodeIndex; + int degree, prevElements, netNo, k, startPointer; + float xOffset, yOffset; + + + strcpy(file_name, benchmarkPath); + strcat(file_name, "/"); + strcat(file_name, netsFile); + + if((fp=fopen(file_name, "r"))==NULL) { + sprintf(error_text, "bookshelf_IO: Cannot open %s file", file_name); + runtimeError(error_text); + } + + numNets = numPins = 0; + while(!feof(fp)) { + fgets(line, LINESIZE, fp); + sscanf(line, "%s\t%*s\n", temp); + + if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0) + continue; + + if(strcmp(temp, "NumNets") == 0) { + sscanf(line, "NumNets\t:\t%d\n", &numNets); + } else if(strcmp(temp, "NumPins") == 0) { + sscanf(line, "NumPins\t:\t%d\n", &numPins); + break; + } else {} + } + fclose(fp); + + if(numNets == 0 || numPins == 0) { + sprintf(error_text, "bookshelf_IO: NumNets = %d, NumPins = %d ", numNets, numPins); + runtimeError(error_text); + } + + if(netlist == NULL && xPinOffset == NULL && yPinOffset == NULL && + netlistIndex == NULL) { + // stores the netlist and pin offsets relative to the center of the cells + netlist = ivector(1,numPins+1); + xPinOffset = vector(1,numPins+1); + yPinOffset = vector(1,numPins+1); + + // index vector for the netlist and offset vectors + netlistIndex = ivector(0,numNets+1); + } else { + runtimeError("bookshelf_IO: allocation error in readNetsFile()"); + } + + // inverse map b/w net name and net no + netName = (char **) malloc((numNets+1)*sizeof(char *)); + + if((fp=fopen(file_name, "r"))==NULL) { + sprintf(error_text, "bookshelf_IO: Cannot open %s file", file_name); + runtimeError(error_text); + } +// printf("Reading %s ...\n", netsFile); + + startPointer = k = 1; + netlistIndex[0] = 1; + prevElements = 0; + netNo = 0; + + while(!feof(fp)) { + *line = '\0'; + fgets(line, LINESIZE, fp); + sscanf(line, "%s\t%*s\n", temp); + + if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0) + continue; + + if(strcmp(temp, "NumNets") == 0 || strcmp(temp, "NumPins") == 0) + continue; + + if(strcmp(temp, "NetDegree") == 0) { + netNo++; + *temp = '\0'; + sscanf(line, "NetDegree\t:\t%d\t%s\n", °ree, temp); + if(strcmp(temp, "") == 0) + sprintf(temp, "net_%d", netNo); + netName[netNo] = (char *) malloc((strlen(temp)+1)*sizeof(char)); + strcpy(netName[netNo], temp); + + netlistIndex[netNo] = netlistIndex[netNo-1] + prevElements; + startPointer = netlistIndex[netNo]; + prevElements = degree; + k = 1; + } else { + xOffset = yOffset = 0.0; + *pinDirection = '\0'; + + sscanf(line, "%s%s", nodeName, pinDirection); + if(pinDirection[0] == ':') + sscanf(line, "%*s%*s%f%f", &xOffset, &yOffset); + else + sscanf(line, "%s%s%*s%f%f", nodeName, pinDirection, &xOffset, &yOffset); + + if(strcmp(pinDirection, "") == 0 || pinDirection[0] == ':') + strcpy(pinDirection, "B"); + + nodeIndex = getIndex(nodeName); + + netlist[startPointer+k-1] = nodeIndex; + xPinOffset[startPointer+k-1] = xOffset; + yPinOffset[startPointer+k-1] = yOffset; + k++; + } + } + netlistIndex[numNets+1] = netlistIndex[numNets] + prevElements; + netlist[netlistIndex[numNets+1]] = 0; + + fclose(fp); + if(netNo != numNets) { + sprintf(error_text, "bookshelf_IO: NumNets (%d) != Number of Net descriptions (%d)", + numNets, netNo); + runtimeError(error_text); + } + + if(netlistIndex[numNets+1]-1 != numPins) { + sprintf(error_text, "bookshelf_IO: NumPins (%d) != Number of Pin descriptions (%d)", + numPins, netlistIndex[numNets+1]-1); + runtimeError(error_text); + } + +#if(DEBUG) +int i, j; +for(i=1; i<=numNets; i++) { + printf("**%d** ", netlistIndex[i+1]-netlistIndex[i]); + for(j=netlistIndex[i]; j 99) { + printf("Row (%d) at coordinate (%.2f) has more than 100 subrows \n", + row_count, core_row[row_count].y_low); + printf("Please decrease the number of subrows by \n"); + printf("creating dummy fixed nodes for the row blockages\n"); + runtimeError("bookshelf_IO: threshold reached for #subrows per row"); + } + sscanf(line, "%*s\t:\t%f\t%*s\t:\t%d\n", &subroworigin, &totalSites); + core_row[row_count].subrow_origin[subrow_count] = subroworigin; + core_row[row_count].subrow_end[subrow_count] = subroworigin + totalSites*core_row[row_count].siteSpacing; + subrow_count++; + } else if(strcmp(temp, "End")==0) { + break; + } else { + sprintf(error_text, "bookshelf_IO: Unknown parameter: %s", temp); + runtimeError(error_text); + } + } while(1); + + core_row[row_count].subrow_count = subrow_count; + core_row[row_count].x_low = core_row[row_count].subrow_origin[0]; + core_row[row_count].x_high = core_row[row_count].subrow_end[subrow_count-1]; + if(core_row[row_count].siteWidth < 0.0) + core_row[row_count].siteWidth = core_row[row_count].siteSpacing; + + row_count++; + } + } + + siteOriginX = core_row[0].x_low; + siteEndX = core_row[0].x_high; + for(j=1; j siteEndX) + siteEndX = core_row[j].x_high; + } + siteOriginY = core_row[0].y_low; + siteEndY = core_row[row_count-1].y_low + core_row[row_count-1].height; // possible that height=0 for some rows in Bookshelf + + coreRowHeight = (siteEndY-siteOriginY)/numRows; + coreHeight = siteEndY - siteOriginY; // height of placement area + coreWidth = siteEndX - siteOriginX; // width of placement area + + + // getting row blockage related information + rowBlockageCount = 0; + for(j=0; j 1) { + subrow_count = core_row[j].subrow_count; + if(core_row[j].subrow_origin[0] > siteOriginX) { + rowBlockageCount++; + } + + if(core_row[j].subrow_end[subrow_count-1] < siteEndX) { + rowBlockageCount++; + } + + for(k=1; k siteOriginX) { + rowBlockageCount++; + } + + // blockage is at right end of the row + if(core_row[j].x_high < siteEndX) { + rowBlockageCount++; + } + } + } + + xRowBlockage = vector(1, rowBlockageCount+1); + yRowBlockage = vector(1, rowBlockageCount+1); + widthRowBlockage = vector(1, rowBlockageCount+1); + + numRowBlockages = 0; + if(rowBlockageCount > 0) { + for(j=0; j 1) { + subrow_count = core_row[j].subrow_count; + if(core_row[j].subrow_origin[0] > siteOriginX) { + numRowBlockages++; + xRowBlockage[numRowBlockages] = siteOriginX + 0.5*(core_row[j].subrow_origin[0] - siteOriginX); + yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height; + widthRowBlockage[numRowBlockages] = core_row[j].subrow_origin[0] - siteOriginX; + } + + if(core_row[j].subrow_end[subrow_count-1] < siteEndX) { + numRowBlockages++; + xRowBlockage[numRowBlockages] = core_row[j].subrow_end[subrow_count-1] + + 0.5*(siteEndX - core_row[j].subrow_end[subrow_count-1]); + yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height; + widthRowBlockage[numRowBlockages] = siteEndX - core_row[j].subrow_end[subrow_count-1]; + } + + for(k=1; k siteOriginX) { + numRowBlockages++; + xRowBlockage[numRowBlockages] = siteOriginX + 0.5*(core_row[j].x_low - siteOriginX); + yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height; + widthRowBlockage[numRowBlockages] = core_row[j].x_low - siteOriginX; + } + + // blockage is at right end of the row + if(core_row[j].x_high < siteEndX) { + numRowBlockages++; + xRowBlockage[numRowBlockages] = core_row[j].x_high + 0.5*(siteEndX - core_row[j].x_high); + yRowBlockage[numRowBlockages] = core_row[j].y_low + 0.5*core_row[j].height; + widthRowBlockage[numRowBlockages] = siteEndX - core_row[j].x_high; + } + } + } + + if(numRowBlockages != rowBlockageCount) { + runtimeError("bookshelf_IO: error during createRowBlockage()"); + } + } + + + // getting the chip dimensions (if there are perimeter IOs) + maxX = siteEndX; + minX = siteOriginX; + maxY = siteEndY; + minY = siteOriginY; + for(j=movableNodes+1; j<=numNodes; j++) { + if(xCellCoord[j] > maxX) maxX = xCellCoord[j]; + else if(xCellCoord[j] < minX) minX = xCellCoord[j]; + + if(yCellCoord[j] > maxY) maxY = yCellCoord[j]; + else if(yCellCoord[j] < minY) minY = yCellCoord[j]; + } + + fclose(fp); + if(row_count != numRows) { + sprintf(error_text, "bookshelf_IO: NumRows (%d) != Number of Row descriptions (%d)", numRows, row_count); + runtimeError(error_text); + } +} + + +/* ----------------------------------------------------------- + Creates a hash linking netname to netNo + Reads the .wts file to get net-weights + + creates extern vars: + netWeight[] +----------------------------------------------------------- */ +void readWtsFile(char benchmarkPath[], char wtsFile[], int net_weights) +{ + FILE *fp; + char file_name[BUFFERSIZE], temp[BUFFERSIZE]; + char line[LINESIZE]; + float weight; + long netNo, j; + long R, hashfunc, RN_index; + + + if(netWeight == NULL) { + netWeight = vector(1, numNets); + for(netNo=1; netNo<=numNets; netNo++) + netWeight[netNo] = 1.0; + } else { + runtimeError("bookshelf_IO: allocation error in readWtsFile()"); + } + + if(net_weights) { + + // defining hash variables + hashBits = 3+(long)(log(numNets)/log(2)); + hashSize = hashsize(hashBits); + + if(NetsInfo == NULL) { + NetsInfo = (NODES **) malloc(hashSize*sizeof(NODES *)); + if(!NetsInfo) + runtimeError("bookshelf_IO: allocation failure in createNetsHash()"); + } else { + runtimeError("bookshelf_IO: NetsHash is not NULL"); + } + for(j=0; j= hashSize) { + sprintf(error_text, "bookshelf_IO: Cannot fill %s in hash table", netName[netNo]); + runtimeError(error_text); + } + + NetsInfo[hashfunc] = (NODES *) malloc(sizeof(NODES)); + NetsInfo[hashfunc]->name = netName[netNo]; + NetsInfo[hashfunc]->index = netNo; + hashFlag[hashfunc] = 1; + } + + strcpy(file_name, benchmarkPath); + strcat(file_name, "/"); + strcat(file_name, wtsFile); + + if((fp=fopen(file_name, "r")) == NULL) { + sprintf(error_text, "bookshelf_IO: Cannot open: %s file", file_name); + runtimeError(error_text); + } +// printf("Reading %s ...\n", wtsFile); + + while(!feof(fp)) { + *line = '\0'; + fgets(line, LINESIZE, fp); + sscanf(line, "%s\t%*s\n", temp); + + if(strlen(line) < 5 || temp[0] == '#' || strcmp(temp, "UCLA") == 0) + continue; + + sscanf(line, "%s%f\n", temp, &weight); + + // find the netNo corresponding to temp + hashfunc = (long)get_hashfunc(temp, strlen(temp)*sizeof(char), 13); + hashfunc = (hashfunc & hashmask(hashBits)); + + RN_index = 1; + while(RN_index < hashSize) { + if(NetsInfo[hashfunc] && strcmp(temp, NetsInfo[hashfunc]->name) == 0) { + break; + } else { + hashfunc = ((hashfunc + RN[RN_index]) & hashmask(hashBits)); + RN_index++; + } + } + + if(RN_index >= hashSize) { + sprintf(error_text, "bookshelf_IO: Cannot find %s in hash table", temp); + runtimeError(error_text); + } + + netNo = NetsInfo[hashfunc]->index; + + // store netWeight corresponding to netNo + netWeight[netNo] = weight; + } + + fclose(fp); + + for(j=0; j #include #include +namespace Flute { + dl_t dl_alloc() { dl_t dl = (dl_t)malloc(sizeof(dl_s)); @@ -159,3 +161,5 @@ void dl_sort(dl_t dl, size_t el_size, int(*compar)(void *, void *)) } } } + +} // Flute namespace. diff --git a/knik/src/flute-3.1/src/knik/dl.h b/flute/src/3.1/dl.h old mode 100644 new mode 100755 similarity index 98% rename from knik/src/flute-3.1/src/knik/dl.h rename to flute/src/3.1/dl.h index afa71614..4b108205 --- a/knik/src/flute-3.1/src/knik/dl.h +++ b/flute/src/3.1/dl.h @@ -1,9 +1,11 @@ -#ifndef DL_H -#define DL_H +#ifndef FLUTE_DL_H +#define FLUTE_DL_H #include #include +namespace Flute { + typedef struct dl_el_s { struct dl_el_s *prev, *next; } dl_el; @@ -177,4 +179,6 @@ void dl_sort(dl_t dl, size_t el_size, int(*compar)(void *, void *)); } dl_endfor; \ } +} // Flute namespace. + #endif diff --git a/knik/src/flute-3.1/src/err.cpp b/flute/src/3.1/err.cpp old mode 100644 new mode 100755 similarity index 90% rename from knik/src/flute-3.1/src/err.cpp rename to flute/src/3.1/err.cpp index 59cb4ff1..e3f951f2 --- a/knik/src/flute-3.1/src/err.cpp +++ b/flute/src/3.1/err.cpp @@ -1,6 +1,8 @@ #include #include +namespace Flute { + /**************************************************************************/ /* print error message and continue @@ -26,3 +28,4 @@ char* msg exit(1); } +} // Flute namespace. diff --git a/flute/src/3.1/err.h b/flute/src/3.1/err.h new file mode 100755 index 00000000..772f02ce --- /dev/null +++ b/flute/src/3.1/err.h @@ -0,0 +1,16 @@ +#ifndef FLUTE_ERR_H +#define FLUTE_ERR_H + +namespace Flute { + +void err_msg( +char* msg +); + +void err_exit( +char* msg +); + +} // Flute namespace. + +#endif diff --git a/flute/src/3.1/flute-ckt.cpp b/flute/src/3.1/flute-ckt.cpp new file mode 100755 index 00000000..ad9cc1c6 --- /dev/null +++ b/flute/src/3.1/flute-ckt.cpp @@ -0,0 +1,98 @@ +#include +#include +#include +#include "bookshelf_IO.h" +#include "memAlloc.h" +#include "flute.h" + +using namespace Flute; + +float HPwl(); +float flutewl(); + +int main (int argc, char *argv[]) +{ + char benchmarkPath[BUFFERSIZE], auxFile[BUFFERSIZE], placefile[BUFFERSIZE]; + + if(argc != 4) { + printf("Usage: %s \n", + argv[0]); + printf(" is the benchmark file directory.\n"); + printf(" is the bookshelf format auxiliary file"); + printf(" (assume in ).\n"); + printf(" is the placement file"); + printf(" (assume in current directory).\n"); + exit(1); + } + + strcpy(benchmarkPath, argv[1]); + strcpy(auxFile, argv[2]); + strcpy(placefile, argv[3]); + + readAuxFile(benchmarkPath, auxFile); + createHash(benchmarkPath, nodesFile); + readNodesFile(benchmarkPath, nodesFile); + readNetsFile(benchmarkPath, netsFile); + readPlFile(".", placefile); + freeHash(); + + readLUT(); + + printf("Half-perimeter wirelength: %.2f\n", HPwl()); + printf("FLUTE wirelength : %.2f\n", flutewl()); +} + +float HPwl() +{ + float totx, toty, xu, xl, yu, yl, xOffset, yOffset; + int i, j, k; + + totx = 0.0; toty = 0.0; + for (j=1; j<=numNets; j++) { + xl = yl = 1e9; + xu = yu = -1e9; + for (k=netlistIndex[j]; k +#include +#include "flute.h" + +using namespace Flute; + +int main() +{ + int d=0; + int x[MAXD], y[MAXD]; + Tree flutetree; + int flutewl; + + while (!feof(stdin)) { + scanf("%d %d\n", &x[d], &y[d]); + d++; + } + readLUT(); + + flutetree = flute(d, x, y, ACCURACY); + printf("FLUTE wirelength = %d\n", flutetree.length); + + flutewl = flute_wl(d, x, y, ACCURACY); + printf("FLUTE wirelength (without RSMT construction) = %d\n", flutewl); +} diff --git a/knik/src/flute-3.1/src/flute.cpp b/flute/src/3.1/flute.cpp old mode 100644 new mode 100755 similarity index 91% rename from knik/src/flute-3.1/src/flute.cpp rename to flute/src/3.1/flute.cpp index d29127aa..b9fb7f56 --- a/knik/src/flute-3.1/src/flute.cpp +++ b/flute/src/3.1/flute.cpp @@ -1,29 +1,22 @@ -// include added to be coriolis compliant -#include -using std::string; - -#include "hurricane/Error.h" -using Hurricane::Error; - -#include "crlcore/Environment.h" -#include "crlcore/AllianceFramework.h" -using CRL::Environment; -using CRL::AllianceFramework; - -// originals include #include #include #include #include -#include "knik/flute.h" +#include +using std::min; +using std::max; -#if D<=7 +#include "flute.h" + +namespace Flute { + +#if DPARAM<=7 #define MGROUP 5040/4 // Max. # of groups, 7! = 5040 #define MPOWV 15 // Max. # of POWVs per group -#elif D==8 +#elif DPARAM==8 #define MGROUP 40320/4 // Max. # of groups, 8! = 40320 #define MPOWV 33 // Max. # of POWVs per group -#elif D==9 +#elif DPARAM==9 #define MGROUP 362880/4 // Max. # of groups, 9! = 362880 #define MPOWV 79 // Max. # of POWVs per group #endif @@ -33,11 +26,11 @@ struct csoln { unsigned char parent; unsigned char seg[11]; // Add: 0..i, Sub: j..10; seg[i+1]=seg[j-1]=0 - unsigned char rowcol[D-2]; // row = rowcol[]/16, col = rowcol[]%16, - unsigned char neighbor[2*D-2]; + unsigned char rowcol[DPARAM-2]; // row = rowcol[]/16, col = rowcol[]%16, + unsigned char neighbor[2*DPARAM-2]; }; -struct csoln *LUT[D+1][MGROUP]; // storing 4 .. D -int numsoln[D+1][MGROUP]; +struct csoln *LUT[DPARAM+1][MGROUP]; // storing 4 .. D +int numsoln[DPARAM+1][MGROUP]; struct point { @@ -45,31 +38,32 @@ struct point int o; }; -void readLUT(); +void readLUT(string directory); DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc); DTYPE flutes_wl_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); DTYPE flutes_wl_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); DTYPE flutes_wl_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -FTree flute(int d, DTYPE x[], DTYPE y[], int acc); -FTree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); -FTree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -FTree dmergetree(FTree t1, FTree t2); -FTree hmergetree(FTree t1, FTree t2, int s[]); -FTree vmergetree(FTree t1, FTree t2); -void local_refinement(FTree *tp, int p); -DTYPE wirelength(FTree t); -void printtree(FTree t); -void plottree(FTree t); +Tree flute(int d, DTYPE x[], DTYPE y[], int acc); +Tree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); +Tree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +Tree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +Tree dmergetree(Tree t1, Tree t2); +Tree hmergetree(Tree t1, Tree t2, int s[]); +Tree vmergetree(Tree t1, Tree t2); +void local_refinement(Tree *tp, int p); +DTYPE wirelength(Tree t); +void printtree(Tree t); +void plottree(Tree t); - -void readLUT() +void readLUT( string directory ) { unsigned char charnum[256], line[32], *linep, c; FILE *fpwv, *fprt; struct csoln *p; int d, i, j, k, kk, ns, nn; + init_param(); + for (i=0; i<=255; i++) { if ('0'<=i && i<='9') charnum[i] = i - '0'; @@ -79,33 +73,30 @@ void readLUT() charnum[i] = 0; } - // added by d2 for coriolis : need to find the right path of .dat files. - Environment* env = AllianceFramework::get()->getEnvironment(); + + string file = POWVFILE; + if (not directory.empty()) file.insert( 0, directory + "/share/flute/3.1/" ); - string POWVFILE_string = env->getCORIOLIS_TOP(); - POWVFILE_string += "/share/coriolis2/flute-3.1/"; - POWVFILE_string += POWVFILE; - - fpwv=fopen(POWVFILE_string.c_str(), "r"); - if (fpwv == NULL) - throw Error ( "flute::readLUT(): cannot find/open file:\n" - " %s." - , POWVFILE_string.c_str() - ); + fpwv=fopen(file.c_str(), "r"); + if (fpwv == NULL) { + printf( "[ERROR] flute::readLUT(): Cannot find or open file:\n" + " \"%s\"\n", file.c_str()); + exit(1); + } #if ROUTING==1 - string POSTFILE_string = env->getCORIOLIS_TOP(); - POSTFILE_string += "/share/coriolis2/flute-3.1/"; - POSTFILE_string += POSTFILE; - fprt=fopen(POSTFILE_string.c_str(), "r"); - if (fprt == NULL) - throw Error ( "flute::readLUT(): cannot find/open file:\n" - " %s." - , POSTFILE_string.c_str() - ); + file = POSTFILE; + if (not directory.empty()) file.insert( 0, directory + "/share/flute/3.1/" ); + + fprt=fopen(file.c_str(), "r"); + if (fprt == NULL) { + printf( "[ERROR] flute::readLUT(): Cannot find or open file:\n" + " \"%s\"\n", file.c_str()); + exit(1); + } #endif - for (d=4; d<=D; d++) { + for (d=4; d<=DPARAM; d++) { fscanf(fpwv, "d=%d\n", &d); #if ROUTING==1 fscanf(fprt, "d=%d\n", &d); @@ -149,17 +140,13 @@ void readLUT() } } } - - fclose ( fpwv ); - fclose ( fprt ); } - DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc) { DTYPE xs[MAXD], ys[MAXD], minval, l, xu, xl, yu, yl; int s[MAXD]; - int i, j, minidx; + int i, j, k, minidx; struct point pt[MAXD], *ptp[MAXD], *tmpp; if (d==2) @@ -206,20 +193,17 @@ DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc) } #if REMOVE_DUPLICATE_PIN==1 - { - int k; - ptp[d] = &pt[d]; - ptp[d]->x = ptp[d]->y = -999999; - j = 0; - for (i=0; ix == ptp[i]->x; k++) - if (ptp[k]->y == ptp[i]->y) // pins k and i are the same - break; - if (ptp[k]->x != ptp[i]->x) - ptp[j++] = ptp[i]; - } - d = j; + ptp[d] = &pt[d]; + ptp[d]->x = ptp[d]->y = -999999; + j = 0; + for (i=0; ix == ptp[i]->x; k++) + if (ptp[k]->y == ptp[i]->y) // pins k and i are the same + break; + if (ptp[k]->x != ptp[i]->x) + ptp[j++] = ptp[i]; } + d = j; #endif for (i=0; ix = ptp[d]->y = -999999; - j = 0; - for (i=0; ix == ptp[i]->x; k++) - if (ptp[k]->y == ptp[i]->y) // pins k and i are the same - break; - if (ptp[k]->x != ptp[i]->x) - ptp[j++] = ptp[i]; - } - d = j; + ptp[d] = &pt[d]; + ptp[d]->x = ptp[d]->y = -999999; + j = 0; + for (i=0; ix == ptp[i]->x; k++) + if (ptp[k]->y == ptp[i]->y) // pins k and i are the same + break; + if (ptp[k]->x != ptp[i]->x) + ptp[j++] = ptp[i]; } + d = j; #endif for (i=0; ideg; root = tp->branch[p].n; @@ -1406,7 +1387,7 @@ void local_refinement(FTree *tp, int p) } } - if (4 <= dd && dd <= D) { + if (4 <= dd && dd <= DPARAM) { // Find Steiner nodes that are directly connected to root ii=dd; for (i=0; i + +namespace Flute { + + using std::string; + /*****************************/ /* User-Defined Parameters */ @@ -18,22 +26,22 @@ /*****************************/ /* User-Callable Functions */ /*****************************/ -// void readLUT(); +// void readLUT(string); // DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc); // DTYPE flutes_wl(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -// FTree flute(int d, DTYPE x[], DTYPE y[], int acc); -// FTree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -// DTYPE wirelength(FTree t); -// void printtree(FTree t); -// void plottree(FTree t); +// Tree flute(int d, DTYPE x[], DTYPE y[], int acc); +// Tree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +// DTYPE wirelength(Tree t); +// void printtree(Tree t); +// void plottree(Tree t); /*************************************/ /* Internal Parameters and Functions */ /*************************************/ #define POWVFILE "POWV9.dat" // LUT for POWV (Wirelength Vector) -#define POSTFILE "POST9.dat" // LUT for POST (Steiner FTree) -#define D 9 // LUT is used for d <= D, D <= 9 +#define POSTFILE "POST9.dat" // LUT for POST (Steiner Tree) +#define DPARAM 9 // LUT is used for d <= D, D <= 9 #define TAU(A) (8+1.3*(A)) #define D1(A) (25+120/((A)*(A))) // flute_mr is used for D1 < d <= D2 #define D2(A) ((A)<=6 ? 500 : 75+5*(A)) @@ -44,7 +52,7 @@ typedef struct int n; // index of neighbor } Branch; -struct FTree +struct Tree { int deg; // degree DTYPE length; // total wirelength @@ -52,24 +60,24 @@ struct FTree }; // User-Callable Functions -extern void readLUT(); +extern void readLUT(string directory); extern DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc); //Macro: DTYPE flutes_wl(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -extern FTree flute(int d, DTYPE x[], DTYPE y[], int acc); -//Macro: FTree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -extern DTYPE wirelength(FTree t); -extern void printtree(FTree t); -extern void plottree(FTree t); +extern Tree flute(int d, DTYPE x[], DTYPE y[], int acc); +//Macro: Tree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +extern DTYPE wirelength(Tree t); +extern void printtree(Tree t); +extern void plottree(Tree t); // Other useful functions extern void init_param(); extern DTYPE flutes_wl_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); extern DTYPE flutes_wl_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); extern DTYPE flutes_wl_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -extern FTree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); -extern FTree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -extern FTree flutes_HD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); -extern FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +extern Tree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]); +extern Tree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +extern Tree flutes_HD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); +extern Tree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); #if REMOVE_DUPLICATE_PIN==1 #define flutes_wl(d, xs, ys, s, acc) flutes_wl_RDP(d, xs, ys, s, acc) @@ -81,19 +89,20 @@ extern FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc); #define flutes_wl_ALLD(d, xs, ys, s, acc) flutes_wl_LMD(d, xs, ys, s, acc) #define flutes_ALLD(d, xs, ys, s, acc) \ - (d<=D ? flutes_LD(d, xs, ys, s) \ + (d<=DPARAM ? flutes_LD(d, xs, ys, s) \ : (d<=D1(acc) ? flutes_MD(d, xs, ys, s, acc) \ : flutes_HD(d, xs, ys, s, acc))) #define flutes_wl_LMD(d, xs, ys, s, acc) \ - (d<=D ? flutes_wl_LD(d, xs, ys, s) : flutes_wl_MD(d, xs, ys, s, acc)) + (d<=DPARAM ? flutes_wl_LD(d, xs, ys, s) : flutes_wl_MD(d, xs, ys, s, acc)) #define flutes_LMD(d, xs, ys, s, acc) \ - (d<=D ? flutes_LD(d, xs, ys, s) : flutes_MD(d, xs, ys, s, acc)) + (d<=DPARAM ? flutes_LD(d, xs, ys, s) : flutes_MD(d, xs, ys, s, acc)) -#define max(x,y) ((x)>(y)?(x):(y)) -#define min(x,y) ((x)<(y)?(x):(y)) -#define abs(x) ((x)<0?(-x):(x)) +//#define max(x,y) ((x)>(y)?(x):(y)) +//#define min(x,y) ((x)<(y)?(x):(y)) +//#define abs(x) ((x)<0?(-x):(x)) #define ADIFF(x,y) ((x)>(y)?(x-y):(y-x)) // Absolute difference -#endif +} // Flute namespace. +#endif /* FLUTE_FLUTE_H */ diff --git a/knik/src/flute-3.1/src/flute_mst.cpp b/flute/src/3.1/flute_mst.cpp old mode 100644 new mode 100755 similarity index 90% rename from knik/src/flute-3.1/src/flute_mst.cpp rename to flute/src/3.1/flute_mst.cpp index 938c78c3..117c0cdd --- a/knik/src/flute-3.1/src/flute_mst.cpp +++ b/flute/src/3.1/flute_mst.cpp @@ -4,9 +4,16 @@ #include #include #include -#include "knik/dl.h" -#include "knik/flute.h" -#include "knik/mst2.h" +#include +using std::min; +using std::max; + +#include "dl.h" +#include "flute.h" +#include "mst2.h" + + +namespace Flute { #define INFNTY INT_MAX @@ -14,7 +21,7 @@ #define MR_FOR_SMALL_CASES_ONLY 1 #if MR_FOR_SMALL_CASES_ONLY #define MAXPART D2M // max partition of an MST -#define MAXT (D2M/D*2) +#define MAXT (D2M/DPARAM*2) #else #define MAXPART (d/9*2) //(MAXD/THD*2) // max partition of an MST #define MAXPART2 ((t1.deg+t2.deg)/9*2) @@ -37,9 +44,9 @@ dl_t ht[D2M+1]; // hash table of subtrees indexed by degree unsigned int curr_mark=0; -FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2, DTYPE cx, DTYPE cy, int acc); -FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, DTYPE cx, DTYPE cy); -void color_tree(FTree t, int *color); +Tree wmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy, int acc); +Tree xmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy); +void color_tree(Tree t, int *color); int longest_path_edge(int i, int j, int *e, int *p, int *es); void preprocess_edges(int num_edges, int *edges, DTYPE *len, int *e, int *p, int *es); @@ -134,10 +141,12 @@ void extract_heap(node_pair *np) void init_param() { + int i; + heap = (node_pair*)malloc(sizeof(node_pair)*(max_heap_size+1)); } -FTree reftree; // reference for qsort +Tree reftree; // reference for qsort int cmp_branch(const void *a, const void *b) { int n; DTYPE x1, x2, x3; @@ -155,7 +164,7 @@ int cmp_branch(const void *a, const void *b) { return (x1 <= x2) ? -1 : 1; } -void update_dist2(FTree t, DTYPE **dist, DTYPE longest, +void update_dist2(Tree t, DTYPE **dist, DTYPE longest, int *host, int *min_node1, int *min_node2, int **nb) { @@ -541,14 +550,14 @@ void build_rmst(long d, DTYPE *x, DTYPE *y, int *edges, int *inMST) /* cached version */ -FTree flutes_c(int d, DTYPE *xs, DTYPE *ys, int *s, int acc) +Tree flutes_c(int d, DTYPE *xs, DTYPE *ys, int *s, int acc) { int i; //int orig_ht_flag; - FTree t, tdup; + Tree t, tdup; #if USE_HASHING - dl_forall(FTree, ht[d], t) { + dl_forall(Tree, ht[d], t) { for (i=0; i=0; i--) { tdup.branch[i] = t.branch[i]; } - dl_prepend(FTree, ht[d], tdup); + dl_prepend(Tree, ht[d], tdup); #endif return t; } -FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, +Tree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, int acc, int rounds, DTYPE **dist, DTYPE *threshold_x, DTYPE *threshold_y, DTYPE *threshold, @@ -595,7 +604,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, int i, j, k, m, n, itr, node1, node2; DTYPE min_dist, longest; DTYPE dist1, dist2; - FTree t, best_t, *subtree, ttmp; + Tree t, best_t, *subtree, ttmp; DTYPE min_x, max_x; #if MR_FOR_SMALL_CASES_ONLY @@ -770,7 +779,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, } } - subtree = (FTree*)malloc(num_subtree*sizeof(FTree)); + subtree = (Tree*)malloc(num_subtree*sizeof(Tree)); for (i=1; i<=num_subtree; i++) { if (tree_size[subroot[i-1]] <= 1) { subtree[i-1].deg = 0; @@ -845,7 +854,7 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, #if USE_HASHING if (new_ht) { for (i=0; i<=d; i++) { - dl_forall(FTree, ht[i], ttmp) { + dl_forall(Tree, ht[i], ttmp) { free(ttmp.branch); } dl_endfor; dl_free(ht[i]); @@ -856,12 +865,12 @@ FTree flute_mr(int d, DTYPE *xs, DTYPE *ys, int *s, return best_t; } -FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc, +Tree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc, DTYPE *threshold_x, DTYPE *threshold_y, DTYPE *threshold) { int i, j, k, m, n, itr, node1, node2; DTYPE smallest_gap, gap; - FTree t, t0, *subtree; + Tree t, t0, *subtree; int prev_effort; /* int num_subtree, subroot[MAXPART], suproot[MAXPART], isSuperRoot[MAXD]; @@ -1027,7 +1036,7 @@ FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc, } } - subtree = (FTree*)malloc(num_subtree*sizeof(FTree)); + subtree = (Tree*)malloc(num_subtree*sizeof(Tree)); for (i=1; i<=num_subtree; i++) { if (tree_size[subroot[i-1]] <= 1) { subtree[i-1].deg = 0; @@ -1063,10 +1072,10 @@ FTree flute_am(int d, DTYPE *xs, DTYPE *ys, int *s, int acc, return t; } -FTree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc) +Tree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc) { int i, A, orig_D3; - FTree t; + Tree t; //DTYPE *dist[MAXD], *dist_base; DTYPE **dist, *dist_base; DTYPE threshold, threshold_x, threshold_y; @@ -1124,7 +1133,7 @@ FTree flutes_HD(int d, DTYPE *xs, DTYPE *ys, int *s, int acc) return t; } -int pickWin(FTree t, DTYPE cx, DTYPE cy, int inWin[]) +int pickWin(Tree t, DTYPE cx, DTYPE cy, int inWin[]) { #if MR_FOR_SMALL_CASES_ONLY int i, j, n, dd, cnt, stack[D2M*2], top=0, prev, curr, next; @@ -1251,9 +1260,9 @@ int pickWin(FTree t, DTYPE cx, DTYPE cy, int inWin[]) /* merge tree t2 into tree t1, which have shared common nodes. The intention is to add the non-common tree nodes of t2 into t1, as well as the associated steiner nodes */ -FTree merge_into(FTree t1, FTree t2, int common[], int nc, int *o1, int *o2) +Tree merge_into(Tree t1, Tree t2, int common[], int nc, int *o1, int *o2) { - FTree t; + Tree t; DTYPE cx, cy; #if MR_FOR_SMALL_CASES_ONLY int i, j, k, d, n, offset, map[2*D2M], reachable[2*D2M]; @@ -1427,10 +1436,10 @@ FTree merge_into(FTree t1, FTree t2, int common[], int nc, int *o1, int *o2) } /* simply merge two trees at their common node */ -FTree smergetree(FTree t1, FTree t2, int *o1, int *o2, +Tree smergetree(Tree t1, Tree t2, int *o1, int *o2, DTYPE cx, DTYPE cy) { - FTree t; + Tree t; int d, i, j, k, n, ci, cn, mapped_cn, prev, curr, next, offset; #if MR_FOR_SMALL_CASES_ONLY int o[D2M+MAXPART], map[2*D2M]; @@ -1575,10 +1584,10 @@ FTree smergetree(FTree t1, FTree t2, int *o1, int *o2, } /* window-based heuristics */ -FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2, +Tree wmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy, int acc) { - FTree t, t3, t4; + Tree t, t3, t4; #if MR_FOR_SMALL_CASES_ONLY int s[D2M], inWin[2*D2M], d, d2, i, ci, n; int i1, i2, o[D2M], os[D2M], si[D2M]; @@ -1717,19 +1726,19 @@ FTree wmergetree(FTree t1, FTree t2, int *order1, int *order2, } /* xmerge heuristics */ -typedef struct FTreeNode_s{ - struct FTreeNode_s *parent; +typedef struct TreeNode_s{ + struct TreeNode_s *parent; dl_t children; int order, id; unsigned int mark; DTYPE x, y; DTYPE blen; // length of this edge (i.e. branch length) // longest edge from here, use child node of an edge to represent it - struct FTreeNode_s *e; + struct TreeNode_s *e; DTYPE len; // len of current e -} FTreeNode; +} TreeNode; -void redirect(FTree t, DTYPE cx, DTYPE cy) +void redirect(Tree t, DTYPE cx, DTYPE cy) { int i, root, prev, curr, next; @@ -1756,15 +1765,15 @@ void redirect(FTree t, DTYPE cx, DTYPE cy) t.branch[root].n = root; } -void update_subtree(FTreeNode *p, int id) +void update_subtree(TreeNode *p, int id) { - FTreeNode *child, *grandp; + TreeNode *child, *grandp; dl_t subtree=dl_alloc(); - dl_append(FTreeNode*, subtree, p); + dl_append(TreeNode*, subtree, p); while (dl_length(subtree)>0) { - dl_pop_first(FTreeNode*, subtree, p); + dl_pop_first(TreeNode*, subtree, p); p->e = p; grandp = p->parent; if (grandp) { @@ -1781,23 +1790,23 @@ void update_subtree(FTreeNode *p, int id) p->id = id; } - dl_forall(FTreeNode*, p->children, child) { - dl_prepend(FTreeNode*, subtree, child); + dl_forall(TreeNode*, p->children, child) { + dl_prepend(TreeNode*, subtree, child); } dl_endfor; } dl_free(subtree); } -FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes) +TreeNode *createRootedTree(Tree t, int *order, int id, dl_t list_of_nodes) { int i, dd, n; - FTreeNode *root=0, **nodes, *p; + TreeNode *root=0, **nodes, *p; dd = t.deg*2-2; - nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*dd); + nodes = (TreeNode**)malloc(sizeof(TreeNode*)*dd); for (i=0; imark = curr_mark; nodes[i]->children = dl_alloc(); } @@ -1820,7 +1829,7 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes) } else { p = nodes[n]; nodes[i]->parent = p; - dl_append(FTreeNode*, p->children, nodes[i]); + dl_append(TreeNode*, p->children, nodes[i]); } nodes[i]->order = (i < t.deg) ? order[i] : -1; nodes[i]->id = id; @@ -1836,7 +1845,7 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes) ADIFF(t.branch[i].x, t.branch[n].x)+ADIFF(t.branch[i].y, t.branch[n].y); */ - dl_append(FTreeNode*, list_of_nodes, nodes[i]); + dl_append(TreeNode*, list_of_nodes, nodes[i]); } //assert(root); @@ -1854,11 +1863,11 @@ FTreeNode *createRootedFTree(FTree t, int *order, int id, dl_t list_of_nodes) return root; } -void freeFTree(FTreeNode *t) +void freeTree(TreeNode *t) { - FTreeNode *child; - dl_forall(FTreeNode *, t->children, child) { - freeFTree(child); + TreeNode *child; + dl_forall(TreeNode *, t->children, child) { + freeTree(child); } dl_endfor; dl_free(t->children); free(t); @@ -1866,15 +1875,15 @@ void freeFTree(FTreeNode *t) int cmpNodeByYX(const void* a, const void* b) { - DTYPE ay = (*(FTreeNode**)a)->y; - DTYPE by = (*(FTreeNode**)b)->y; + DTYPE ay = (*(TreeNode**)a)->y; + DTYPE by = (*(TreeNode**)b)->y; DTYPE ax, bx; if (ay < by) return -1; if (ay > by) return 1; - ax = (*(FTreeNode**)a)->x; - bx = (*(FTreeNode**)b)->x; + ax = (*(TreeNode**)a)->x; + bx = (*(TreeNode**)b)->x; if (ax < bx) return -1; if (ax > bx) return 1; @@ -1883,25 +1892,25 @@ int cmpNodeByYX(const void* a, const void* b) int cmpNodeByXY(const void* a, const void* b) { - DTYPE ax = (*(FTreeNode**)a)->x; - DTYPE bx = (*(FTreeNode**)b)->x; + DTYPE ax = (*(TreeNode**)a)->x; + DTYPE bx = (*(TreeNode**)b)->x; DTYPE ay, by; if (ax < bx) return -1; if (ax > bx) return 1; - ay = (*(FTreeNode**)a)->y; - by = (*(FTreeNode**)b)->y; + ay = (*(TreeNode**)a)->y; + by = (*(TreeNode**)b)->y; if (ay < by) return -1; if (ay > by) return 1; return 0; } -void remove_child(dl_t children_list, FTreeNode* c) +void remove_child(dl_t children_list, TreeNode* c) { - FTreeNode *child; - dl_forall(FTreeNode*, children_list, child) { + TreeNode *child; + dl_forall(TreeNode*, children_list, child) { if (child==c) { dl_delete_current(); break; @@ -1909,13 +1918,13 @@ void remove_child(dl_t children_list, FTreeNode* c) } dl_endfor; } -void cleanFTree(FTreeNode* tn) +void cleanTree(TreeNode* tn) { /* - FTreeNode *c, *p; + TreeNode *c, *p; - dl_forall(FTreeNode*, tn->children, c) { - cleanFTree(c); + dl_forall(TreeNode*, tn->children, c) { + cleanTree(c); } dl_endfor; p = tn->parent; @@ -1928,9 +1937,9 @@ void cleanFTree(FTreeNode* tn) dl_free(tn->children); free(tn); } else if (dl_length(tn->children)<=1) { - c = dl_first(FTreeNode*, tn->children); + c = dl_first(TreeNode*, tn->children); c->parent = p; - dl_append(FTreeNode*, p->children, c); + dl_append(TreeNode*, p->children, c); remove_child(p->children, tn); dl_free(tn->children); free(tn); @@ -1938,15 +1947,15 @@ void cleanFTree(FTreeNode* tn) */ // non-recursive version - FTreeNode *c, *p; + TreeNode *c, *p; dl_t nlist=dl_alloc(); - dl_append(FTreeNode*, nlist, tn); + dl_append(TreeNode*, nlist, tn); while (dl_length(nlist)>0) { - dl_pop_first(FTreeNode*, nlist, tn); - dl_forall(FTreeNode*, tn->children, c) { - dl_append(FTreeNode*, nlist, c); + dl_pop_first(TreeNode*, nlist, tn); + dl_forall(TreeNode*, tn->children, c) { + dl_append(TreeNode*, nlist, c); } dl_endfor; p = tn->parent; @@ -1956,9 +1965,9 @@ void cleanFTree(FTreeNode* tn) dl_free(tn->children); free(tn); } else if (dl_length(tn->children)<=1) { - c = dl_first(FTreeNode*, tn->children); + c = dl_first(TreeNode*, tn->children); c->parent = p; - dl_append(FTreeNode*, p->children, c); + dl_append(TreeNode*, p->children, c); remove_child(p->children, tn); dl_free(tn->children); free(tn); @@ -1971,19 +1980,19 @@ void cleanFTree(FTreeNode* tn) int cmpNodeByOrder(void* a, void* b) { - int ax = (*(FTreeNode**)a)->order; - int bx = (*(FTreeNode**)b)->order; + int ax = (*(TreeNode**)a)->order; + int bx = (*(TreeNode**)b)->order; if (ax < bx) return -1; if (ax > bx) return 1; return 0; } -FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) +Tree mergeRootedTrees(TreeNode *tn1, TreeNode *tn2, int *order1) { int i, n, redundant; - FTree t; - FTreeNode *child, *p; + Tree t; + TreeNode *child, *p; dl_t list_of_nodes=dl_alloc(); dl_t pin_nodes=dl_alloc(), steiner_nodes=dl_alloc(); @@ -1991,26 +2000,26 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) /* merge tn2 to tn1 */ while (dl_length(tn2->children)>0) { - dl_pop_first(FTreeNode*, tn2->children, child); + dl_pop_first(TreeNode*, tn2->children, child); child->parent = tn1; - dl_append(FTreeNode*, tn1->children, child); + dl_append(TreeNode*, tn1->children, child); } dl_free(tn2->children); free(tn2); - cleanFTree(tn1); + cleanTree(tn1); - /* convert tn1 back to a FTree */ + /* convert tn1 back to a Tree */ - dl_append(FTreeNode*, list_of_nodes, tn1); + dl_append(TreeNode*, list_of_nodes, tn1); do { - dl_pop_first(FTreeNode*, list_of_nodes, child); + dl_pop_first(TreeNode*, list_of_nodes, child); if (child->order < 0) { if (dl_length(child->children)==1) { /* redundant steiner node */ - p = dl_first(FTreeNode*, child->children); + p = dl_first(TreeNode*, child->children); p->parent = child->parent; /* note that p->parent's children list is already gone */ - dl_append(FTreeNode*, list_of_nodes, p); + dl_append(TreeNode*, list_of_nodes, p); dl_free(child->children); free(child); continue; @@ -2019,24 +2028,24 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) free(child); continue; } - dl_append(FTreeNode*, steiner_nodes, child); + dl_append(TreeNode*, steiner_nodes, child); } else { - dl_append(FTreeNode*, pin_nodes, child); + dl_append(TreeNode*, pin_nodes, child); } dl_concat(list_of_nodes, child->children); } while (dl_length(list_of_nodes)>0); dl_free(list_of_nodes); - dl_sort(pin_nodes, sizeof(FTreeNode*), cmpNodeByOrder); + dl_sort(pin_nodes, sizeof(TreeNode*), cmpNodeByOrder); i=0; - dl_forall(FTreeNode*, pin_nodes, child) { + dl_forall(TreeNode*, pin_nodes, child) { child->id = i++; } dl_endfor; t.deg = i; - dl_forall(FTreeNode*, steiner_nodes, child) { + dl_forall(TreeNode*, steiner_nodes, child) { child->id = i++; } dl_endfor; @@ -2053,7 +2062,7 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) t.branch[tn1->id].n = -1; - dl_forall(FTreeNode*, pin_nodes, child) { + dl_forall(TreeNode*, pin_nodes, child) { i = child->id; if (child->order >= 0) { order1[i] = child->order; @@ -2075,7 +2084,7 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) } } } dl_endfor; - dl_forall(FTreeNode*, steiner_nodes, child) { + dl_forall(TreeNode*, steiner_nodes, child) { i = child->id; if (child->order >= 0) { order1[i] = child->order; @@ -2107,12 +2116,12 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) } } dl_endfor; - dl_forall(FTreeNode*, pin_nodes, child) { + dl_forall(TreeNode*, pin_nodes, child) { free(child); } dl_endfor; dl_free(pin_nodes); - dl_forall(FTreeNode*, steiner_nodes, child) { + dl_forall(TreeNode*, steiner_nodes, child) { free(child); } dl_endfor; dl_free(steiner_nodes); @@ -2121,32 +2130,32 @@ FTree mergeRootedFTrees(FTreeNode *tn1, FTreeNode *tn2, int *order1) return t; } -void collect_nodes(FTreeNode* tn, dl_t nlist) +void collect_nodes(TreeNode* tn, dl_t nlist) { /* - FTreeNode* c; + TreeNode* c; - dl_append(FTreeNode*, nlist, tn); - dl_forall(FTreeNode*, tn->children, c) { + dl_append(TreeNode*, nlist, tn); + dl_forall(TreeNode*, tn->children, c) { collect_nodes(c, nlist); }dl_endfor; */ // non-recursive version - FTreeNode* c; + TreeNode* c; dl_el *curr; - dl_append(FTreeNode*, nlist, tn); + dl_append(TreeNode*, nlist, tn); for (curr=nlist->last; curr; curr=curr->next) { - tn = dl_data(FTreeNode*, curr); - dl_forall(FTreeNode*, tn->children, c) { - dl_append(FTreeNode*, nlist, c); + tn = dl_data(TreeNode*, curr); + dl_forall(TreeNode*, tn->children, c) { + dl_append(TreeNode*, nlist, c); }dl_endfor; } } typedef struct { - FTreeNode *n1, *n2; + TreeNode *n1, *n2; DTYPE new_x, new_y, gain; } xdata; @@ -2159,10 +2168,10 @@ int cmpXdata(void *a, void *b) return 0; } -inline FTreeNode *cedge_lca(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1) +inline TreeNode *cedge_lca(TreeNode* n1, TreeNode* n2, DTYPE *len, int *n2ton1) { int i; - FTreeNode *curr, *lca, *e; + TreeNode *curr, *lca, *e; curr_mark++; @@ -2236,7 +2245,7 @@ inline FTreeNode *cedge_lca(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton } -FTreeNode *critical_edge(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1) +TreeNode *critical_edge(TreeNode* n1, TreeNode* n2, DTYPE *len, int *n2ton1) { if (n1->id != n2->id) { n1 = n1->parent; @@ -2254,9 +2263,9 @@ FTreeNode *critical_edge(FTreeNode* n1, FTreeNode* n2, DTYPE *len, int *n2ton1) return cedge_lca(n1, n2, len, n2ton1); } -void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e) +void splice2(TreeNode *n1, TreeNode *n2, TreeNode *e) { - FTreeNode *curr, *prev, *next, *s; + TreeNode *curr, *prev, *next, *s; //assert(n2->parent); //assert(e->id==n2->id); @@ -2267,7 +2276,7 @@ void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e) while (prev != e) { remove_child(curr->children, prev); curr->parent = prev; - dl_append(FTreeNode*, prev->children, curr); + dl_append(TreeNode*, prev->children, curr); prev = curr; curr = next; next = curr->parent; @@ -2275,31 +2284,31 @@ void splice2(FTreeNode *n1, FTreeNode *n2, FTreeNode *e) remove_child(curr->children, prev); n2->parent = n1; - dl_append(FTreeNode*, n1->children, n2); + dl_append(TreeNode*, n1->children, n2); update_subtree(n1, n1->parent->id); } -void cut_and_splice(FTreeNode *n1, FTreeNode *n2, +void cut_and_splice(TreeNode *n1, TreeNode *n2, DTYPE new_x, DTYPE new_y, DTYPE *x1, DTYPE *y1, DTYPE *x2, DTYPE *y2, - FTreeNode *e, int n2ton1) + TreeNode *e, int n2ton1) { - FTreeNode *p1, *node, *s; + TreeNode *p1, *node, *s; /* new steiner node */ p1 = n1->parent; remove_child(p1->children, n1); - node = (FTreeNode*)malloc(sizeof(FTreeNode)); + node = (TreeNode*)malloc(sizeof(TreeNode)); node->x = new_x; node->y = new_y; node->mark = curr_mark; node->parent = p1; - dl_append(FTreeNode*, p1->children, node); + dl_append(TreeNode*, p1->children, node); n1->parent = node; node->children = dl_alloc(); - dl_append(FTreeNode*, node->children, n1); + dl_append(TreeNode*, node->children, n1); node->order = -1; node->e = n1->e; @@ -2320,7 +2329,7 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2, /* n2 is a pin, need to replicate a steiner node */ s = n2->parent; if (s->x!=n2->x || s->y!=n2->y) { - s = (FTreeNode*)malloc(sizeof(FTreeNode)); + s = (TreeNode*)malloc(sizeof(TreeNode)); s->mark = curr_mark; s->order = -1; s->id = n2->id; @@ -2338,11 +2347,11 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2, n2->blen = 0; remove_child(n2->parent->children, n2); - dl_append(FTreeNode*, n2->parent->children, s); + dl_append(TreeNode*, n2->parent->children, s); s->parent = n2->parent; n2->parent = s; s->children = dl_alloc(); - dl_append(FTreeNode*, s->children, n2); + dl_append(TreeNode*, s->children, n2); } n2 = s; } @@ -2355,17 +2364,17 @@ void cut_and_splice(FTreeNode *n1, FTreeNode *n2, } typedef struct { - FTreeNode *n1, *n2; + TreeNode *n1, *n2; DTYPE min_dist, new_x, new_y; int n2ton1; } splice_info; -DTYPE exchange_branches_order_x(int num_nodes, FTreeNode **nodes, +DTYPE exchange_branches_order_x(int num_nodes, TreeNode **nodes, DTYPE threshold_x, DTYPE threshold_y, DTYPE max_len) { int n2ton1; - FTreeNode *n1, *p1, *n2, *p2, *node, *e, *s; + TreeNode *n1, *p1, *n2, *p2, *node, *e, *s; DTYPE x1, x2, y1, y2, min_dist, new_x, new_y, len; DTYPE gain=0; int i, j, curr_row, next_header, num_rows, start, end, mid; @@ -2512,12 +2521,12 @@ DTYPE exchange_branches_order_x(int num_nodes, FTreeNode **nodes, return gain; } -DTYPE exchange_branches_order_y(int num_nodes, FTreeNode **nodes, +DTYPE exchange_branches_order_y(int num_nodes, TreeNode **nodes, DTYPE threshold_x, DTYPE threshold_y, DTYPE max_len) { int n2ton1; - FTreeNode *n1, *p1, *n2, *p2, *node, *e, *s; + TreeNode *n1, *p1, *n2, *p2, *node, *e, *s; DTYPE x1, x2, y1, y2, min_dist, new_x, new_y, len; DTYPE gain=0; int i, j, curr_row, next_header, num_rows, start, end, mid; @@ -2664,12 +2673,12 @@ DTYPE exchange_branches_order_y(int num_nodes, FTreeNode **nodes, } /* cross exchange branches after merging */ -FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, +Tree xmergetree(Tree t1, Tree t2, int *order1, int *order2, DTYPE cx, DTYPE cy) { int i, num, cnt, order_by_x=1; - FTree t; - FTreeNode *tn1, *tn2, *n1, *p1, **nodes; + Tree t; + TreeNode *tn1, *tn2, *n1, *p1, **nodes; dl_t list_of_nodes=dl_alloc(); DTYPE threshold_x, threshold_y; DTYPE min_x, max_x, max_len, len, gain; @@ -2687,18 +2696,18 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, redirect(t2, cx, cy); curr_mark = 0; - tn1 = createRootedFTree(t1, order1, 1, list_of_nodes); - tn2 = createRootedFTree(t2, order2, 2, list_of_nodes); + tn1 = createRootedTree(t1, order1, 1, list_of_nodes); + tn2 = createRootedTree(t2, order2, 2, list_of_nodes); num = dl_length(list_of_nodes); - nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*num); + nodes = (TreeNode**)malloc(sizeof(TreeNode*)*num); i = 0; - dl_forall(FTreeNode*, list_of_nodes, n1) { + dl_forall(TreeNode*, list_of_nodes, n1) { nodes[i++] = n1; } dl_endfor; dl_clear(list_of_nodes); - qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByYX); + qsort(nodes, num, sizeof(TreeNode*), cmpNodeByYX); max_len = 0; min_x = max_x = nodes[0]->x; @@ -2748,19 +2757,19 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, free(nodes); num = dl_length(list_of_nodes); - nodes = (FTreeNode**)malloc(sizeof(FTreeNode*)*num); + nodes = (TreeNode**)malloc(sizeof(TreeNode*)*num); i = 0; - dl_forall(FTreeNode*, list_of_nodes, n1) { + dl_forall(TreeNode*, list_of_nodes, n1) { nodes[i++] = n1; } dl_endfor; dl_clear(list_of_nodes); if (order_by_x) { order_by_x = 0; - qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByXY); + qsort(nodes, num, sizeof(TreeNode*), cmpNodeByXY); } else { order_by_x = 1; - qsort(nodes, num, sizeof(FTreeNode*), cmpNodeByYX); + qsort(nodes, num, sizeof(TreeNode*), cmpNodeByYX); } } } @@ -2768,7 +2777,7 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, dl_free(list_of_nodes); free(nodes); - t = mergeRootedFTrees(tn1, tn2, order1); + t = mergeRootedTrees(tn1, tn2, order1); free(t1.branch); free(t2.branch); @@ -2776,3 +2785,5 @@ FTree xmergetree(FTree t1, FTree t2, int *order1, int *order2, return t; } +} // Flute namespace. + diff --git a/knik/src/flute-3.1/src/knik/global.h b/flute/src/3.1/global.h old mode 100644 new mode 100755 similarity index 60% rename from knik/src/flute-3.1/src/knik/global.h rename to flute/src/3.1/global.h index 96f8f89b..69dab0e1 --- a/knik/src/flute-3.1/src/knik/global.h +++ b/flute/src/3.1/global.h @@ -1,8 +1,10 @@ -#ifndef _GLOBAL_H_ -#define _GLOBAL_H_ +#ifndef FLUTE_GLOBAL_H +#define FLUTE_GLOBAL_H #include +namespace Flute { + #define TRUE 1 #define FALSE 0 #define MAXLONG 0x7fffffffL @@ -16,4 +18,6 @@ typedef struct point Point; typedef long nn_array[8]; -#endif /* _GLOBAL_H_ */ +} // Flute namespace. + +#endif /* FLUTE_GLOBAL_H */ diff --git a/knik/src/flute-3.1/src/heap.cpp b/flute/src/3.1/heap.cpp old mode 100644 new mode 100755 similarity index 96% rename from knik/src/flute-3.1/src/heap.cpp rename to flute/src/3.1/heap.cpp index d46fafd9..011b0cae --- a/knik/src/flute-3.1/src/heap.cpp +++ b/flute/src/3.1/heap.cpp @@ -5,9 +5,10 @@ */ #include -#include "knik/heap.h" -#include "knik/err.h" +#include "heap.h" +#include "err.h" +namespace Flute { Heap* _heap = (Heap*)NULL; long _max_heap_size = 0; @@ -24,7 +25,7 @@ void allocate_heap( long n ) _heap = (Heap*)realloc( (void*)_heap, (size_t)(n+1)*sizeof(Heap) ); if( ! _heap ) { - err_exit( (char*)"Cannot reallocate memory in allocate_heap!" ); + err_exit( "Cannot reallocate memory in allocate_heap!" ); } _max_heap_size = n; } @@ -175,3 +176,4 @@ long heap_delete_min() /****************************************************************************/ +} // Flute namespace. diff --git a/knik/src/flute-3.1/src/knik/heap.h b/flute/src/3.1/heap.h old mode 100644 new mode 100755 similarity index 83% rename from knik/src/flute-3.1/src/knik/heap.h rename to flute/src/3.1/heap.h index eaa51294..70d8b488 --- a/knik/src/flute-3.1/src/knik/heap.h +++ b/flute/src/3.1/heap.h @@ -1,8 +1,10 @@ -#ifndef _HEAP_H_ -#define _HEAP_H_ +#ifndef FLUTE_HEAP_H +#define FLUTE_HEAP_H #include "global.h" +namespace Flute { + struct heap_info { long key; @@ -28,4 +30,6 @@ void heap_insert( long p, long key ); void heap_decrease_key( long p, long new_key ); long heap_delete_min(); -#endif /* _HEAP_H_ */ +} // Flute namespace. + +#endif /* FLUTE_HEAP_H */ diff --git a/knik/src/flute-3.1/LICENSE.txt b/flute/src/3.1/license.txt old mode 100644 new mode 100755 similarity index 95% rename from knik/src/flute-3.1/LICENSE.txt rename to flute/src/3.1/license.txt index 6ed104e9..1951adf2 --- a/knik/src/flute-3.1/LICENSE.txt +++ b/flute/src/3.1/license.txt @@ -21,7 +21,7 @@ met. These conditions require a modest attribution to Dr. Chris C. N. Chu the Author's attribution information, which includes: (a) Dr. Chris C. N. Chu ("AUTHOR"), (b) Iowa State University ("PROFESSIONAL IDENTIFICATION"), and - (c) http://home.eng.iastate.edu/~cnchu/ ("URL"). + (c) http://home.engineering.iastate.edu/~cnchu/ ("URL"). 2. Users who intend to use the Code for commercial purposes will notify Author prior to such commercial use. diff --git a/flute/src/3.1/memAlloc.cpp b/flute/src/3.1/memAlloc.cpp new file mode 100755 index 00000000..52dfd7f5 --- /dev/null +++ b/flute/src/3.1/memAlloc.cpp @@ -0,0 +1,468 @@ +/* -------------------------------------------------------------------------- + Public domain memory allocation and de-allocation routines. + Taken from Appendix B of: + Numerical Recipes in C: The Art of Scientific Computing, Second Edition, + Cambridge University Press, 1992 +----------------------------------------------------------------------------*/ +#include +#include +#include + +#include "memAlloc.h" + +namespace Flute { + +#define MEM_END 1 +#define FREE_ARG char* + +void runtimeError(char error_text[]) +/* error handler */ +{ + fprintf(stderr, "ERROR: %s \n", error_text); + fprintf(stderr, "Aborting !! \n"); + fflush(stdout); + fflush(stderr); + exit(1); +} + +float *vector(long nl, long nh) +/* allocate a float vector with subscript range v[nl..nh] */ +{ + float *v; + v=(float *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(float))); + if (!v) runtimeError("allocation failure in vector()"); + return v-nl+MEM_END; +} + +int *ivector(long nl, long nh) +/* allocate an int vector with subscript range v[nl..nh] */ +{ + int *v; + v=(int *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(int))); + if (!v) runtimeError("allocation failure in ivector()"); + return v-nl+MEM_END; +} + +unsigned char *cvector(long nl, long nh) +/* allocate an unsigned char vector with subscript range v[nl..nh] */ +{ + unsigned char *v; + v=(unsigned char *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(unsigned char))); + if (!v) runtimeError("allocation failure in cvector()"); + return v-nl+MEM_END; +} + +unsigned long *lvector(long nl, long nh) +/* allocate an unsigned long vector with subscript range v[nl..nh] */ +{ + unsigned long *v; + v=(unsigned long *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(long))); + if (!v) runtimeError("allocation failure in lvector()"); + return v-nl+MEM_END; +} + +double *dvector(long nl, long nh) +/* allocate a double vector with subscript range v[nl..nh] */ +{ + double *v; + v=(double *)malloc((size_t) ((nh-nl+1+MEM_END)*sizeof(double))); + if (!v) runtimeError("allocation failure in dvector()"); + return v-nl+MEM_END; +} + +float **matrix(long nrl, long nrh, long ncl, long nch) +/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + float **m; + + /* allocate pointers to rows */ + m=(float **) malloc((size_t)((nrow+MEM_END)*sizeof(float*))); + if (!m) runtimeError("allocation failure 1 in matrix()"); + m += MEM_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(float *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(float))); + if (!m[nrl]) runtimeError("allocation failure 2 in matrix()"); + m[nrl] += MEM_END; + m[nrl] -= ncl; + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + /* return pointer to array of pointers to rows */ + return m; +} + +double **dmatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + double **m; + + /* allocate pointers to rows */ + m=(double **) malloc((size_t)((nrow+MEM_END)*sizeof(double*))); + if (!m) runtimeError("allocation failure 1 in dmatrix()"); + m += MEM_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(double *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(double))); + if (!m[nrl]) runtimeError("allocation failure 2 in dmatrix()"); + m[nrl] += MEM_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +int **imatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + int **m; + + /* allocate pointers to rows */ + m=(int **) malloc((size_t)((nrow+MEM_END)*sizeof(int*))); + if (!m) runtimeError("allocation failure 1 in imatrix()"); + m += MEM_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(int *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(int))); + if (!m[nrl]) runtimeError("allocation failure 2 in imatrix()"); + m[nrl] += MEM_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + + +char **cmatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a char matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + char **m; + + /* allocate pointers to rows */ + m=(char **) malloc((size_t)((nrow+MEM_END)*sizeof(char*))); + if (!m) runtimeError("allocation failure 1 in cmatrix()"); + m += MEM_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(char *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(char))); + if (!m[nrl]) runtimeError("allocation failure 2 in cmatrix()"); + m[nrl] += MEM_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + + +unsigned long **lmatrix(long nrl, long nrh, long ncl, long nch) +/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */ +{ + long i, nrow=nrh-nrl+1,ncol=nch-ncl+1; + unsigned long **m; + + /* allocate pointers to rows */ + m=(unsigned long **) malloc((size_t)((nrow+MEM_END)*sizeof(long*))); + if (!m) runtimeError("allocation failure 1 in lmatrix()"); + m += MEM_END; + m -= nrl; + + /* allocate rows and set pointers to them */ + m[nrl]=(unsigned long *) malloc((size_t)((nrow*ncol+MEM_END)*sizeof(long))); + if (!m[nrl]) runtimeError("allocation failure 2 in lmatrix()"); + m[nrl] += MEM_END; + m[nrl] -= ncl; + + for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + + +float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch, + long newrl, long newcl) +/* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */ +{ + long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl; + float **m; + + /* allocate array of pointers to rows */ + m=(float **) malloc((size_t) ((nrow+MEM_END)*sizeof(float*))); + if (!m) runtimeError("allocation failure in submatrix()"); + m += MEM_END; + m -= newrl; + + /* set pointers to rows */ + for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol; + + /* return pointer to array of pointers to rows */ + return m; +} + +float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch) +/* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix +declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1 +and ncol=nch-ncl+1. The routine should be called with the address +&a[0][0] as the first argument. */ +{ + long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1; + float **m; + + /* allocate pointers to rows */ + m=(float **) malloc((size_t) ((nrow+MEM_END)*sizeof(float*))); + if (!m) runtimeError("allocation failure in convert_matrix()"); + m += MEM_END; + m -= nrl; + + /* set pointers to rows */ + m[nrl]=a-ncl; + for(i=1,j=nrl+1;i *(float *)j) + return 1; + else + return 0; +} + + +int comp_int(const void *i, const void *j) { + return *(int *)i - *(int *)j; +} + +} // Flute namespace. diff --git a/flute/src/3.1/memAlloc.h b/flute/src/3.1/memAlloc.h new file mode 100755 index 00000000..ac6813ff --- /dev/null +++ b/flute/src/3.1/memAlloc.h @@ -0,0 +1,94 @@ +/* -------------------------------------------------------------------------- + Public domain memory allocation and de-allocation routine header file. + Taken from Appendix B of: + Numerical Recipes in C: The Art of Scientific Computing, Second Edition, + Cambridge University Press, 1992 +----------------------------------------------------------------------------*/ +#ifndef FLUTE_MEMALLOC_H +#define FLUTE_MEMALLOC_H + +namespace Flute { + +static float sqrarg; +#define SQR(a) ((sqrarg=(a)) == 0.0 ? 0.0 : sqrarg*sqrarg) + +static double dsqrarg; +#define DSQR(a) ((dsqrarg=(a)) == 0.0 ? 0.0 : dsqrarg*dsqrarg) + +static double dmaxarg1,dmaxarg2; +#define DMAX(a,b) (dmaxarg1=(a),dmaxarg2=(b),(dmaxarg1) > (dmaxarg2) ?\ +(dmaxarg1) : (dmaxarg2)) + +static double dminarg1,dminarg2; +#define DMIN(a,b) (dminarg1=(a),dminarg2=(b),(dminarg1) < (dminarg2) ?\ +(dminarg1) : (dminarg2)) + +static float maxarg1,maxarg2; +#define FMAX(a,b) (maxarg1=(a),maxarg2=(b),(maxarg1) > (maxarg2) ?\ +(maxarg1) : (maxarg2)) + +static float minarg1,minarg2; +#define FMIN(a,b) (minarg1=(a),minarg2=(b),(minarg1) < (minarg2) ?\ +(minarg1) : (minarg2)) + +static long lmaxarg1,lmaxarg2; +#define LMAX(a,b) (lmaxarg1=(a),lmaxarg2=(b),(lmaxarg1) > (lmaxarg2) ?\ +(lmaxarg1) : (lmaxarg2)) + +static long lminarg1,lminarg2; +#define LMIN(a,b) (lminarg1=(a),lminarg2=(b),(lminarg1) < (lminarg2) ?\ +(lminarg1) : (lminarg2)) + +static int imaxarg1,imaxarg2; +#define IMAX(a,b) (imaxarg1=(a),imaxarg2=(b),(imaxarg1) > (imaxarg2) ?\ +(imaxarg1) : (imaxarg2)) + +static int iminarg1,iminarg2; +#define IMIN(a,b) (iminarg1=(a),iminarg2=(b),(iminarg1) < (iminarg2) ?\ +(iminarg1) : (iminarg2)) + +#define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a)) +#define MAX(a,b) ((a)>(b) ? (a) : (b)) +#define MIN(a,b) ((a)<(b) ? (a) : (b)) + +void runtimeError(char error_text[]); +float *vector(long nl, long nh); +int *ivector(long nl, long nh); +unsigned char *cvector(long nl, long nh); +unsigned long *lvector(long nl, long nh); +double *dvector(long nl, long nh); +float **matrix(long nrl, long nrh, long ncl, long nch); +double **dmatrix(long nrl, long nrh, long ncl, long nch); +int **imatrix(long nrl, long nrh, long ncl, long nch); +char **cmatrix(long nrl, long nrh, long ncl, long nch); +unsigned long **lmatrix(long nrl, long nrh, long ncl, long nch); +float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch, + long newrl, long newcl); +float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch); +float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh); +unsigned long ***lmatrix3D(long nrl, long nrh, long ncl, long nch, long ndl, long ndh); +int ***imatrix3D(int nrl, int nrh, int ncl, int nch, int ndl, int ndh); + +void free_vector(float *v, long nl, long nh); +void free_ivector(int *v, long nl, long nh); +void free_cvector(unsigned char *v, long nl, long nh); +void free_lvector(unsigned long *v, long nl, long nh); +void free_dvector(double *v, long nl, long nh); +void free_matrix(float **m, long nrl, long nrh, long ncl, long nch); +void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch); +void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch); +void free_cmatrix(char **m, long nrl, long nrh, long ncl, long nch); +void free_lmatrix(unsigned long **m, long nrl, long nrh, long ncl, long nch); +void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch); +void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch); +void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch, + long ndl, long ndh); +void free_lmatrix3D(unsigned long ***t, long nrl, long nrh, long ncl, long nch, + long ndl, long ndh); +void free_imatrix3D(int ***t, int nrl, int nrh, int ncl, int nch, int ndl, int ndh); +int comp_float(const void *i, const void *j); +int comp_int(const void *i, const void *j); + +} // Flute namespace. + +#endif /* FLUTE_MEMALLOC_H */ diff --git a/knik/src/flute-3.1/src/mst2.cpp b/flute/src/3.1/mst2.cpp old mode 100644 new mode 100755 similarity index 92% rename from knik/src/flute-3.1/src/mst2.cpp rename to flute/src/3.1/mst2.cpp index a3fa0e9b..af59592b --- a/knik/src/flute-3.1/src/mst2.cpp +++ b/flute/src/3.1/mst2.cpp @@ -1,13 +1,13 @@ #include #include #include -#include "knik/global.h" -#include "knik/neighbors.h" -#include "knik/dist.h" -#include "knik/heap.h" -#include "knik/err.h" - +#include "global.h" +#include "neighbors.h" +#include "dist.h" +#include "heap.h" +#include "err.h" +namespace Flute { void mst2_package_init( long n ) { @@ -90,3 +90,4 @@ void mst2 /****************************************************************************/ /****************************************************************************/ +} // Flute namespace. diff --git a/knik/src/flute-3.1/src/knik/mst2.h b/flute/src/3.1/mst2.h old mode 100644 new mode 100755 similarity index 62% rename from knik/src/flute-3.1/src/knik/mst2.h rename to flute/src/3.1/mst2.h index e4650515..85312ed2 --- a/knik/src/flute-3.1/src/knik/mst2.h +++ b/flute/src/3.1/mst2.h @@ -1,11 +1,15 @@ -#ifndef _MST2_H_ -#define _MST2_H_ +#ifndef FLUTE_MST2_H +#define FLUTE_MST2_H #include "global.h" +namespace Flute { + void mst2_package_init( long n ); void mst2_package_done(); void mst2( long n, Point* pt, long* parent ); +} // Flute namespace. + #endif diff --git a/knik/src/flute-3.1/src/neighbors.cpp b/flute/src/3.1/neighbors.cpp old mode 100644 new mode 100755 similarity index 98% rename from knik/src/flute-3.1/src/neighbors.cpp rename to flute/src/3.1/neighbors.cpp index 0f9f823c..620e7bb5 --- a/knik/src/flute-3.1/src/neighbors.cpp +++ b/flute/src/3.1/neighbors.cpp @@ -1,9 +1,11 @@ #include #include #include -#include "knik/global.h" -#include "knik/err.h" -#include "knik/dist.h" +#include "global.h" +#include "err.h" +#include "dist.h" + +namespace Flute { long octant ( @@ -39,7 +41,7 @@ void allocate_nn_arrays( long n ) aux = (long*)realloc( (void*)aux, (size_t)n*sizeof(long) ); if( !nn || !sheared || !sorted || !aux ) { - err_exit( (char*)"Cannot allocate memory in allocate_nn_arrays!" ); + err_exit( "Cannot allocate memory in allocate_nn_arrays!" ); } max_arrays_size = n; } @@ -525,3 +527,4 @@ void check_nn /***************************************************************************/ /***************************************************************************/ +} // Flute namespace. diff --git a/knik/src/flute-3.1/src/knik/neighbors.h b/flute/src/3.1/neighbors.h old mode 100644 new mode 100755 similarity index 66% rename from knik/src/flute-3.1/src/knik/neighbors.h rename to flute/src/3.1/neighbors.h index 491a0a94..95c1ba1e --- a/knik/src/flute-3.1/src/knik/neighbors.h +++ b/flute/src/3.1/neighbors.h @@ -1,5 +1,11 @@ + +#ifndef FLUTE_NEIGHBORS_H +#define FLUTE_NEIGHBORS_H + #include "global.h" +namespace Flute { + void allocate_nn_arrays( long n ); void deallocate_nn_arrays(); @@ -17,3 +23,6 @@ void dq_nearest_neighbors nn_array* nn ); +} // Flute namespace. + +#endif /* FLUTE_NEIGHBORS_H */ diff --git a/flute/src/3.1/rand-pts.cpp b/flute/src/3.1/rand-pts.cpp new file mode 100755 index 00000000..24f7df4c --- /dev/null +++ b/flute/src/3.1/rand-pts.cpp @@ -0,0 +1,35 @@ +#include +#include +#include + +int main(int ac, char *av[]) +{ + int d=10, tmp, i; + int PNUM = 0; + + for (i=1; i] [-n] []\n", av[0]); + printf(" Output random points "); + printf("as lines of coordinate pairs.\n"); + printf(" Default is 10.\n"); + printf(" -r\t Randomize. Use getpid() as seed.\n"); + printf(" -s\t Set random seed to .\n"); + printf(" -n\t Write first before the random points.\n"); + exit(-1); + } + } + + if (PNUM) + printf("%d\n", d); + for (i=1; i<=d; i++) + printf("%4d %4d\n", (int) random()%10000, (int) random()%10000); +} diff --git a/flute/src/CMakeLists.txt b/flute/src/CMakeLists.txt new file mode 100644 index 00000000..c6ffb1a4 --- /dev/null +++ b/flute/src/CMakeLists.txt @@ -0,0 +1,2 @@ + + add_subdirectory(3.1) diff --git a/hurricane/doc/analog/MainPage.dox b/hurricane/doc/analog/MainPage.dox index 1d3d8ba1..f8ec3cde 100644 --- a/hurricane/doc/analog/MainPage.dox +++ b/hurricane/doc/analog/MainPage.dox @@ -69,33 +69,45 @@ Instance* instance = cell->getSlaveInstances().getFirst(); * * For the Transistor device: * - * -# The netlist is fixed and generated (in C++) in the Transistor, by - * instanciating one MetaTransistor. - * -# The layout is generated on the fly by calling the relevant - * python sceript. - * -# The parameters, which are commons to all the Transistor based - * devices are created in TransistorFamily. The parameters are created - * through the Device parameter factory and stored at the Device level. - * A pointer to the concrete type of Parameter is also kept at the - * TransistorFamily level. - * -# The Device::getParameters() method is implemented at this level - * and returns a TransistorArguments pointer. - * -# Parameters are used to set up the Device characteristics, either - * programmatically or through the Pharos graphical - * interface. - * -# Arguments, on the other hand, are mostly used to - * transmit the setting of a Device (i.e. it's Parameters values) - * to the Python script in charge of the layout generation. - * Arguments have Python wrapper PyArguments, and it is copies of - * the values that are transmitted. + * -# The netlist is fixed and generated (in C++) in the Transistor, by + * instanciating one MetaTransistor. + * + * -# The layout is generated on the fly by calling the relevant + * python script. + * + * -# The parameters, which are commons to all the Transistor based + * devices are created in TransistorFamily. The parameters are created + * through the Device parameter factory and stored at the Device level. + * A pointer to the concrete type of Parameter is also kept at the + * TransistorFamily level. + * + * -# The Device::getParameters() method is implemented at this level + * and returns a reference to the set of parameters. + * + * -# Parameters are used to set up the Device characteristics, either + * programmatically or through the graphical interface. + * + * The layout Python generation scripts also uses the Parameter + * to know the settings of a device. + * + * Deprecateds: + * + * -# Arguments where fully redundant with Parameters, so + * we did remove them. + * + * The Arguments must be removed from the UML schema. * * * \subsection ssecOpenQuestions Open questions * - * -# As Arguments are used to transmit parameters, why not simply - * encapsulate Parameters in a Python wrapper? Thus completly - * suppressing Arguments. And by the way, using pointers to - * to make the relationship bi-directionnal (event if it's not - * needed now). + * -# In Bora::channelRouting, what is implemented is in fact an + * interval tree (or segment tree). We should try to use their + * \c Boost implementation. + * + * -# In Bora::SlicingTree, whe should merge the list of user nodes + * (devices and hierarchical) with the routing nodes (channels and + * struts) to unify the underlying management. This sould enable + * us to move lots method implementation \e upward in the class + * hierarchy. */ diff --git a/hurricane/src/hurricane/Cell.cpp b/hurricane/src/hurricane/Cell.cpp index 60e9df28..ecd577c9 100644 --- a/hurricane/src/hurricane/Cell.cpp +++ b/hurricane/src/hurricane/Cell.cpp @@ -1575,16 +1575,30 @@ Cell::NetMap::NetMap() { } -Name Cell::NetMap::_getKey(Net* net) const +const Name& Cell::NetMap::_getKey(Net* net) const // *************************************** { return net->getName(); } -unsigned Cell::NetMap::_getHashValue(Name name) const -// ************************************************** +unsigned Cell::NetMap::_getHashValue(const Name& name) const +// ********************************************************* { - return (unsigned int)name._getSharedName()->getId() / 8; + unsigned long hash = 0; + unsigned long sum4 = 0; + const string& s = name._getSharedName()->_getSString(); + for ( size_t i=0 ; igetId() / 8; } Net* Cell::NetMap::_getNextElement(Net* net) const diff --git a/hurricane/src/hurricane/DBo.cpp b/hurricane/src/hurricane/DBo.cpp index 7393df2d..382828a9 100644 --- a/hurricane/src/hurricane/DBo.cpp +++ b/hurricane/src/hurricane/DBo.cpp @@ -30,6 +30,7 @@ #include "hurricane/Initializer.h" +#include "hurricane/Timer.h" #include "hurricane/DBo.h" #include "hurricane/Entity.h" #include "hurricane/Property.h" @@ -44,8 +45,101 @@ namespace Hurricane { // Class : "Hurricane::DBo". - DBo::DBo (): _propertySet() - { } + unsigned int DBo::_memoryLimit = 0; + unsigned long DBo::_flags = 0; + unsigned int DBo::_nextId = 0; + unsigned int DBo::_idCounterLimit = 0; + unsigned int DBo::_idCounter = 1; + + + void DBo::setIdCounterLimit ( unsigned int limit ) + { _idCounterLimit = limit; } + + + void DBo::setMemoryLimit ( unsigned int limit ) + { _memoryLimit = limit; } + + + unsigned int DBo::getIdCounter () + { return _idCounter; } + + + bool DBo::inForcedIdMode () + { return _flags & ForcedIdMode; } + + + void DBo::enableForcedIdMode () + { + if (_flags & ForcedIdMode) return; + if (_idCounter != 1) { + throw Error( "DBo::enableForcedIdMode(): DataBase must be reset before forcind ids." ); + } + _flags |= ForcedIdMode; + } + + + void DBo::disableForcedIdMode () + { + if (not (_flags & ForcedIdMode)) return; + _flags &= ~ForcedIdMode; + } + + + void DBo::setNextId ( unsigned int nid ) + { + if (not (_flags & ForcedIdMode)) { + cerr << Error("DBo::setNextId(): Not in forced id mode, ignored.") << endl; + return; + } + _nextId = nid; + if (nid > _idCounter) _idCounter = nid; + _flags |= NextIdSet; + } + + + unsigned int DBo::getNextId () + { + if (_flags & ForcedIdMode) { + if (_flags & NextIdSet) { + _flags &= ~NextIdSet; + cdebug_log(18,0) << demangle(typeid(*this).name()) + << "::getNextId(): Consuming the preset id:" << _nextId << endl; + return _nextId; + } else { + throw Error("DBo::getNextId(): Next id is not set, while in forced id mode."); + } + } + + return ++_idCounter; + } + + + + DBo::DBo () + : _id (getNextId()) + , _propertySet() + { + if (_idCounterLimit and (_id > _idCounterLimit)) { + throw Error( "DBo::DBo(): Identifier counter has reached user's limit (%d)." + , _idCounterLimit ); + } + if (_idCounter == std::numeric_limits::max()) { + throw Error( "DBo::DBo(): Identifier counter has reached type limit (%d bits)." + , std::numeric_limits::digits ); + } + + size_t memorySize = Timer::getMemorySize(); + if (_memoryLimit and ((memorySize >> 20) > _memoryLimit)) { + throw Error( "DBo::DBo(): Program has reached maximum allowed limit of %dMb." + , _memoryLimit ); + } + + // if (_id % 10000 == 0) { + // cerr << "Reached id:" << _id << " " << Timer::getStringMemory(memorySize) << endl; + // } + // if (_id == 75060) + // cerr << "DBo::DBo() " << this << endl; + } DBo::~DBo () @@ -91,6 +185,17 @@ namespace Hurricane { } + void DBo::setId ( unsigned int id ) + { + if (_flags & ForcedIdMode) { + _id = id; + if (_id > _idCounter) _idCounter = _id; + } else { + throw Error("DBo::setId(): Attempt to set id while not in forced id mode."); + } + } + + void DBo::put ( Property* property ) { if ( !property ) @@ -181,14 +286,15 @@ namespace Hurricane { string DBo::_getString () const { - return "<" + _getTypeName() + ">"; + return ""; } Record* DBo::_getRecord () const { Record* record = new Record ( getString(this) ); - record->add ( getSlot("_propertySet", &_propertySet) ); + record->add( getSlot("_id" , _id ) ); + record->add( getSlot("_propertySet", &_propertySet) ); return record; } diff --git a/hurricane/src/hurricane/Entity.cpp b/hurricane/src/hurricane/Entity.cpp index a042a179..f8c1a5d8 100644 --- a/hurricane/src/hurricane/Entity.cpp +++ b/hurricane/src/hurricane/Entity.cpp @@ -19,7 +19,6 @@ #include #include "hurricane/Error.h" -#include "hurricane/Timer.h" #include "hurricane/Entity.h" #include "hurricane/Quark.h" #include "hurricane/Cell.h" @@ -34,99 +33,16 @@ namespace Hurricane { // **************************************************************************************************** - unsigned int Entity::_memoryLimit = 0; - unsigned long Entity::_flags = 0; - unsigned int Entity::_nextId = 0; - unsigned int Entity::_idCounterLimit = 0; - unsigned int Entity::_idCounter = 1; - - - void Entity::setIdCounterLimit ( unsigned int limit ) - { _idCounterLimit = limit; } - - - void Entity::setMemoryLimit ( unsigned int limit ) - { _memoryLimit = limit; } - - - unsigned int Entity::getIdCounter () - { return _idCounter; } - - - bool Entity::inForcedIdMode () - { return _flags & ForcedIdMode; } - - - void Entity::enableForcedIdMode () - { - if (_flags & ForcedIdMode) return; - if (_idCounter != 1) { - throw Error( "Entity::enableForcedIdMode(): DataBase must be reset before forcind ids." ); - } - _flags |= ForcedIdMode; - } - - - void Entity::disableForcedIdMode () - { - if (not (_flags & ForcedIdMode)) return; - _flags &= ~ForcedIdMode; - } - - - void Entity::setNextId ( unsigned int nid ) - { - if (not (_flags & ForcedIdMode)) { - cerr << Error("Entity::setNextId(): Not in forced id mode, ignored.") << endl; - return; - } - _nextId = nid; - if (nid > _idCounter) _idCounter = nid; - _flags |= NextIdSet; - } - - - unsigned int Entity::getNextId () - { - if (_flags & ForcedIdMode) { - if (_flags & NextIdSet) { - _flags &= ~NextIdSet; - cdebug_log(18,0) << demangle(typeid(*this).name()) - << "::getNextId(): Consuming the preset id:" << _nextId << endl; - return _nextId; - } else { - throw Error("Entity::getNextId(): Next id is not set, while in forced id mode."); - } - } - - return _idCounter++; - } - - Entity::Entity() : Inherit() - , _id (getNextId()) + { } + + + void Entity::_postCreate() { - if (_idCounterLimit and (_id > _idCounterLimit)) { - throw Error( "Entity::Entity(): Identifier counter has reached user's limit (%d)." - , _idCounterLimit ); - } - if (_idCounter == std::numeric_limits::max()) { - throw Error( "Entity::Entity(): Identifier counter has reached type limit (%d bits)." - , std::numeric_limits::digits ); - } + Inherit::_postCreate(); - size_t memorySize = Timer::getMemorySize(); - if (_memoryLimit and ((memorySize >> 20) > _memoryLimit)) { - throw Error( "Entity::Entity(): Program has reached maximum allowed limit of %dMb." - , _memoryLimit ); - } - - // if (_id % 10000 == 0) { - // cerr << "Reached id:" << _id << " " << Timer::getStringMemory(memorySize) << endl; - // } - // if (_id == 75060) - // cerr << "Entity::Entity() " << this << endl; + //cerr << _getString() << endl; } @@ -174,17 +90,6 @@ namespace Hurricane { } - void Entity::setId ( unsigned int id ) - { - if (_flags & ForcedIdMode) { - _id = id; - if (_id > _idCounter) _idCounter = _id; - } else { - throw Error("Entity::setId(): Attempt to set id while not in forced id mode."); - } - } - - void Entity::_toJson ( JsonWriter* writer ) const { Inherit::_toJson( writer ); @@ -196,7 +101,6 @@ namespace Hurricane { string Entity::_getString() const { string s = Inherit::_getString(); - s.insert( 1, "id:"+getString(_id)+" " ); return s; } @@ -205,7 +109,6 @@ namespace Hurricane { { Record* record = Inherit::_getRecord(); if (record) { - record->add( getSlot("_id", _id) ); Occurrence occurrence = Occurrence(this); if (occurrence.hasProperty()) record->add( getSlot("Occurrence", occurrence) ); diff --git a/hurricane/src/hurricane/Instance.cpp b/hurricane/src/hurricane/Instance.cpp index 2f88d3f3..37f5cbb4 100644 --- a/hurricane/src/hurricane/Instance.cpp +++ b/hurricane/src/hurricane/Instance.cpp @@ -182,19 +182,19 @@ Instance::Instance(Cell* cell, const Name& name, Cell* masterCell, const Transfo _nextOfCellSlaveInstanceSet(NULL) { if (!_cell) - throw Error("Can't create " + _TName("Instance") + " : null cell"); + throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", NULL cell"); if (name.isEmpty()) - throw Error("Can't create " + _TName("Instance") + " : empty name"); + throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", empty name"); if (_cell->getInstance(_name)) - throw Error("Can't create " + _TName("Instance") + " " + getString(_name) + " : already exists"); + throw Error("Instance::Instance(): Can't create " + _TName("Instance") + " " + getString(_name) + ", already exists"); if (!_masterCell) - throw Error("Can't create " + _TName("Instance") + " : null master cell"); + throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", NULL master cell"); if (secureFlag && _cell->isCalledBy(_masterCell)) - throw Error("Can't create " + _TName("Instance") + " : cyclic construction"); + throw Error("Instance::Instance(): Can't create " + _TName("Instance") + ", cyclic construction"); } Instance* Instance::create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag) diff --git a/hurricane/src/hurricane/Layer.cpp b/hurricane/src/hurricane/Layer.cpp index 2bb977e1..bc51373d 100644 --- a/hurricane/src/hurricane/Layer.cpp +++ b/hurricane/src/hurricane/Layer.cpp @@ -56,6 +56,7 @@ namespace Hurricane { , _minimalSpacing(minimalSpacing) , _nextOfTechnologyLayerMap(NULL) , _symbolic(false) + , _blockage(false) { if ( !_technology ) throw Error ( "Can't create " + _TName("Layer") + " : null technology" ); diff --git a/hurricane/src/hurricane/Property.cpp b/hurricane/src/hurricane/Property.cpp index f3a5d17f..a2ad9f02 100644 --- a/hurricane/src/hurricane/Property.cpp +++ b/hurricane/src/hurricane/Property.cpp @@ -226,10 +226,11 @@ namespace Hurricane { void SharedProperty::_preDestroy () { - for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) { - _ownerSet[i]->_onDestroyed(this); - _ownerSet[i] = NULL; - } + for ( DBo* owner : _ownerSet ) owner->_onDestroyed( this ); + // for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) { + // _ownerSet[i]->_onDestroyed(this); + // _ownerSet[i] = NULL; + // } _ownerSet.clear(); // while (!_ownerSet.empty()) { @@ -244,36 +245,24 @@ namespace Hurricane { void SharedProperty::_erase ( DBo* owner ) { - for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) { - if (_ownerSet[i] == owner) { - std::swap( _ownerSet[i], _ownerSet[_ownerSet.size()-1] ); - _ownerSet.pop_back(); - } + auto iowner = _ownerSet.find( owner ); + if (iowner != _ownerSet.end()) { + _ownerSet.erase( iowner ); } } void SharedProperty::onCapturedBy ( DBo* owner ) { - for ( DBo* dbo : _ownerSet ) { - if (dbo == owner) return; - } - _ownerSet.push_back( owner ); - - //_ownerSet.insert(owner); + if (_ownerSet.find(owner) != _ownerSet.end()) return; + _ownerSet.insert(owner); } void SharedProperty::onReleasedBy ( DBo* owner ) { - for ( size_t i=0 ; i<_ownerSet.size() ; ++i ) { - if (_ownerSet[i] == owner) { - std::swap( _ownerSet[i], _ownerSet[_ownerSet.size()-1] ); - _ownerSet.pop_back(); - } - } - //_ownerSet.erase(owner); - + auto iowner = _ownerSet.find( owner ); + if (iowner != _ownerSet.end()) _ownerSet.erase( owner ); if (_ownerSet.empty()) onNotOwned(); } diff --git a/hurricane/src/hurricane/Timer.cpp b/hurricane/src/hurricane/Timer.cpp index 3507b219..4155863e 100644 --- a/hurricane/src/hurricane/Timer.cpp +++ b/hurricane/src/hurricane/Timer.cpp @@ -249,18 +249,19 @@ namespace Hurricane { string s; unsigned int hours = (unsigned int)duration / 3600; - if ( hours ) + if (hours) s += getString(hours) + "h "; unsigned int minutes = ((unsigned int)duration % 3600) / 60; - if ( hours || minutes ) + if (hours or minutes) s += getString(minutes) + "m "; double seconds = duration; - if ( hours || minutes ) { + if (hours or minutes) { minutes = ((unsigned int)duration) / 60; seconds = duration - ((float)minutes * 60.0); } + seconds = std::round(seconds * 100.0) / 100.0; s += getString((float)seconds) + "s"; diff --git a/hurricane/src/hurricane/hurricane/BasicLayer.h b/hurricane/src/hurricane/hurricane/BasicLayer.h index 4e34943c..d3c475f5 100644 --- a/hurricane/src/hurricane/hurricane/BasicLayer.h +++ b/hurricane/src/hurricane/hurricane/BasicLayer.h @@ -140,7 +140,7 @@ namespace Hurricane { inline unsigned BasicLayer::getGds2Layer () const { return _gds2Layer; } inline unsigned BasicLayer::getGds2Datatype () const { return _gds2Datatype; } inline const Name& BasicLayer::getRealName () const { return _realName; } - inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; } + inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; layer->setBlockage(true); } inline void BasicLayer::setGds2Layer ( unsigned int number ) { _gds2Layer=number; } inline void BasicLayer::setGds2Datatype ( unsigned int number ) { _gds2Datatype=number; } inline void BasicLayer::setRealName ( const char* realName) { _realName = realName; } diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h index fbad248b..7aecbe10 100644 --- a/hurricane/src/hurricane/hurricane/Cell.h +++ b/hurricane/src/hurricane/hurricane/Cell.h @@ -265,15 +265,15 @@ class Cell : public Entity { }; - public: class NetMap : public IntrusiveMap { - // ************************************************** + public: class NetMap : public IntrusiveMapConst { + // ********************************************************* - public: typedef IntrusiveMap Inherit; + public: typedef IntrusiveMapConst Inherit; public: NetMap(); - public: virtual Name _getKey(Net* net) const; - public: virtual unsigned _getHashValue(Name name) const; + public: virtual const Name& _getKey(Net* net) const; + public: virtual unsigned _getHashValue(const Name& name) const; public: virtual Net* _getNextElement(Net* net) const; public: virtual void _setNextElement(Net* net, Net* nextNet) const; diff --git a/hurricane/src/hurricane/hurricane/Collection.h b/hurricane/src/hurricane/hurricane/Collection.h index 9a6042ac..1f3b5664 100644 --- a/hurricane/src/hurricane/hurricane/Collection.h +++ b/hurricane/src/hurricane/hurricane/Collection.h @@ -206,6 +206,7 @@ template class Collection { class iterator { public: iterator ( Locator* l ) : _locator(l) {} + ~iterator () { delete _locator; } bool operator== ( const iterator& o) const { return not (*this != o); } iterator& operator++ () { _locator->progress(); return *this; } Type operator* () { return _locator->getElement(); } diff --git a/hurricane/src/hurricane/hurricane/DBo.h b/hurricane/src/hurricane/hurricane/DBo.h index 0d12dd70..4a4096d4 100644 --- a/hurricane/src/hurricane/hurricane/DBo.h +++ b/hurricane/src/hurricane/hurricane/DBo.h @@ -45,43 +45,70 @@ namespace Hurricane { class DBo { public: - virtual void destroy (); - inline set& _getPropertySet (); - void _onDestroyed ( Property* property ); - Property* getProperty ( const Name& ) const; - Properties getProperties () const; - inline bool hasProperty () const; - void put ( Property* ); - void remove ( Property* ); - void removeProperty ( const Name& ); - void clearProperties (); - virtual string _getTypeName () const; - virtual string _getString () const; - virtual Record* _getRecord () const; - virtual void _toJson ( JsonWriter* ) const; - virtual void _toJsonCollections ( JsonWriter* ) const; - virtual void _toJsonSignature ( JsonWriter* ) const; - void toJson ( JsonWriter* ) const; - void toJsonSignature ( JsonWriter* ) const; - - private: - mutable set _propertySet; - + enum DBoFlags { ForcedIdMode = (1<<0) + , NextIdSet = (1<<1) + }; + public: + static void setMemoryLimit ( unsigned int ); + static void setIdCounterLimit ( unsigned int ); + static unsigned int getIdCounter (); + unsigned int getNextId (); + static void setNextId ( unsigned int ); + static bool inForcedIdMode (); + static void enableForcedIdMode (); + static void disableForcedIdMode (); + static void useIdCounter2 (); + public: + virtual void destroy (); + inline set& _getPropertySet (); + void _onDestroyed ( Property* property ); + inline unsigned int getId () const; + Property* getProperty ( const Name& ) const; + Properties getProperties () const; + inline bool hasProperty () const; + void setId ( unsigned int ); + void put ( Property* ); + void remove ( Property* ); + void removeProperty ( const Name& ); + void clearProperties (); + virtual string _getTypeName () const; + virtual string _getString () const; + virtual Record* _getRecord () const; + virtual void _toJson ( JsonWriter* ) const; + virtual void _toJsonCollections ( JsonWriter* ) const; + virtual void _toJsonSignature ( JsonWriter* ) const; + void toJson ( JsonWriter* ) const; + void toJsonSignature ( JsonWriter* ) const; protected: - DBo (); - virtual ~DBo (); - virtual void _postCreate (); - virtual void _preDestroy (); - - private: - DBo ( const DBo& ); - DBo& operator= ( const DBo& ); + DBo (); + virtual ~DBo (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + DBo ( const DBo& ); + DBo& operator= ( const DBo& ); + private: + static unsigned int _memoryLimit; + static unsigned long _flags; + static unsigned int _nextId; + static unsigned int _idCounter; + static unsigned int _idCounterLimit; + unsigned int _id; + mutable set _propertySet; + public: + struct CompareById : public std::binary_function { + inline bool operator() ( const DBo* lhs, const DBo* rhs ) const; + }; }; // Inline Functions. inline set& DBo::_getPropertySet () { return _propertySet; } inline bool DBo::hasProperty () const { return !_propertySet.empty(); } + inline unsigned int DBo::getId () const { return _id; } + + inline bool DBo::CompareById::operator() ( const DBo* lhs, const DBo* rhs ) const + { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); } // ------------------------------------------------------------------- diff --git a/hurricane/src/hurricane/hurricane/Entity.h b/hurricane/src/hurricane/hurricane/Entity.h index 8ba92e52..02e206ed 100644 --- a/hurricane/src/hurricane/hurricane/Entity.h +++ b/hurricane/src/hurricane/hurricane/Entity.h @@ -39,51 +39,20 @@ namespace Hurricane { { public: typedef DBo Inherit; - public: - enum EntityFlags { ForcedIdMode = (1<<0) - , NextIdSet = (1<<1) - }; - public: - static void setMemoryLimit ( unsigned int ); - static void setIdCounterLimit ( unsigned int ); - static unsigned int getIdCounter (); - unsigned int getNextId (); - static void setNextId ( unsigned int ); - static bool inForcedIdMode (); - static void enableForcedIdMode (); - static void disableForcedIdMode (); public: - inline unsigned int getId () const; virtual Cell* getCell () const = 0; virtual Box getBoundingBox () const = 0; - void setId ( unsigned int ); virtual void _toJson ( JsonWriter* ) const; virtual string _getString () const; virtual Record* _getRecord () const; Quark* _getQuark ( SharedPath* sharedPath = NULL ) const; protected: Entity (); + virtual void _postCreate (); virtual void _preDestroy (); - private: - static unsigned int _memoryLimit; - static unsigned long _flags; - static unsigned int _nextId; - static unsigned int _idCounter; - static unsigned int _idCounterLimit; - unsigned int _id; - - public: - struct CompareById : public std::binary_function { - inline bool operator() ( const Entity* lhs, const Entity* rhs ) const; - }; }; - inline unsigned int Entity::getId () const { return _id; } - inline bool Entity::CompareById::operator() ( const Entity* lhs, const Entity* rhs ) const - { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); } - - // ------------------------------------------------------------------- // Class : "Hurricane::JsonEntity". diff --git a/hurricane/src/hurricane/hurricane/IntrusiveMap.h b/hurricane/src/hurricane/hurricane/IntrusiveMap.h index 31c84223..7ca44572 100644 --- a/hurricane/src/hurricane/hurricane/IntrusiveMap.h +++ b/hurricane/src/hurricane/hurricane/IntrusiveMap.h @@ -507,6 +507,487 @@ inline void jsonWrite ( JsonWriter* w, const std::string& key, Hurricane::Intru w->endArray(); } + + + +namespace Hurricane { + +// **************************************************************************************************** +// IntrusiveMapConst declaration +// **************************************************************************************************** + +template class IntrusiveMapConst { +// ******************************************************** + +// Types +// ***** + + class Elements : public Collection { + // ***************************************** + + // Types + // ***** + + public: typedef Collection Inherit; + + public: class Locator : public Hurricane::Locator { + // ******************************************************** + + // Types + // ***** + + public: typedef Hurricane::Locator Inherit; + + // Attributes + // ********** + + private: const IntrusiveMapConst* _map; + private: unsigned _index; + private: Element* _element; + + // Constructors + // ************ + + public: Locator(const IntrusiveMapConst* map = NULL) + // ******************************************** + : Inherit(), + _map(map), + _index(0), + _element(NULL) + { + if (_map) { + unsigned length = _map->_getLength(); + do { + _element = _map->_getArray()[_index++]; + } while (!_element && (_index < length)); + } + }; + + public: Locator(const Locator& locator) + // ************************************ + : Inherit(), + _map(locator._map), + _index(locator._index), + _element(locator._element) + { + }; + + // Operators + // ********* + + public: Locator& operator=(const Locator& locator) + // *********************************************** + { + _map = locator._map; + _index = locator._index; + _element = locator._element; + return *this; + }; + + // Accessors + // ********* + + public: virtual Element* getElement() const + // **************************************** + { + return _element; + }; + + public: virtual Hurricane::Locator* getClone() const + // *********************************************************** + { + return new Locator(*this); + }; + + // Predicates + // ********** + + public: virtual bool isValid() const + // ********************************* + { + return (_element != NULL); + }; + + // Updators + // ******** + + public: virtual void progress() + // **************************** + { + if (_element) { + cdebug_log(0,0) << "IntrusiveMapConst::progress() from:" + << " -> " << tsetw(4) << _index + << " + " << _map->_getHashValue(_map->_getKey(_element)) + << "/" << _map->_getKey(_element) << ":" << _element << endl; + + _element = _map->_getNextElement(_element); + if (!_element) { + unsigned length = _map->_getLength(); + if (_index < length) { + do { + cdebug_log(0,0) << "next bucket: " << _index+1 << endl; + _element = _map->_getArray()[_index++]; + } while (!_element && (_index < length)); + } + + if (_element) + cdebug_log(0,0) << "IntrusiveMapConst::progress() to:" + << " -> " << tsetw(4) << _index + << " + " << _map->_getHashValue(_map->_getKey(_element)) + << "/" << _map->_getKey(_element) << ":" << _element << endl; + } + } + }; + + // Others + // ****** + + public: virtual string _getString() const + // ************************************** + { + string s = "<" + _TName("IntrusiveMapConst::Elements::Locator"); + if (_map) s += " " + getString(_map); + s += ">"; + return s; + }; + + }; + + // Attributes + // ********** + + private: const IntrusiveMapConst* _map; + + // Constructors + // ************ + + public: Elements(const IntrusiveMapConst* map = NULL) + // ********************************************* + : Inherit(), + _map(map) + { + }; + + public: Elements(const Elements& elements) + // *************************************** + : Inherit(), + _map(elements._map) + { + }; + + // Operators + // ********* + + public: Elements& operator=(const Elements& elements) + // ************************************************** + { + _map = elements._map; + return *this; + }; + + // Accessors + // ********* + + public: virtual Collection* getClone() const + // *************************************************** + { + return new Elements(*this); + }; + + public: virtual Hurricane::Locator* getLocator() const + // ************************************************************* + { + return new Locator(_map); + }; + + // Others + // ****** + + public: virtual string _getString() const + // ************************************** + { + string s = "<" + _TName("IntrusiveMapConst::Elements"); + if (_map) s += " " + getString(_map); + s += ">"; + return s; + }; + + }; + +// Attributes +// ********** + + private: unsigned _size; + private: unsigned _length; + private: Element** _array; + +// Constructors +// ************ + + public: IntrusiveMapConst() + // ******************* + : _size(0), + _length(1), + _array(new Element*[1]) + { + _array[0] = NULL; + }; + + private: IntrusiveMapConst(const IntrusiveMapConst& map); // not implemented to forbid copy + +// Destructor +// ********** + + public: virtual ~IntrusiveMapConst() + // **************************** + { + for (unsigned index = 0; index < _length; index++) { + Element* element = _array[index]; + while (element) { + _array[index] = _getNextElement(element); + _setNextElement(element, NULL); + element = _array[index]; + } + _array[index] = NULL; + } + delete[] _array; + }; + +// Operators +// ********* + + private: IntrusiveMapConst& operator=(const IntrusiveMapConst& map); // not implemented to forbid assignment + +// Accessors +// ********* + + public: Element* getElement(const Key& key) const + // ********************************************** + { + unsigned index = (_getHashValue(key) / 8) % _length; + Element* element = _array[index]; + while (element && (_getKey(element) != key)) element = _getNextElement(element); + return element; + }; + + public: Elements getElements() const + // ********************************* + { + return Elements(this); + }; + +// Predicates +// ********** + + public: bool isEmpty() const + // ************************* + { + return (_size == 0); + }; + +// Overridables +// ************ + + public: virtual const Key& _getKey(Element* element) const = 0; + + public: virtual unsigned _getHashValue(const Key& key) const = 0; + + // public: virtual Element* _getNextElement(Element* element) const = 0; // AD + public: virtual Element* _getNextElement(Element* element) const + // ************************************************************* + { + throw Error(_TName("IntrusiveMapConst") + "::_getNextElement(...) : should be overrided"); + return NULL; + }; + + // public: virtual void _setNextElement(Element* element, Element* nextElement) const = 0; // AD + public: virtual void _setNextElement(Element* element, Element* nextElement) const + // ******************************************************************************* + { + throw Error(_TName("IntrusiveMapConst") + "::_setNextElement(...) : should be overrided"); + }; + +// Others +// ****** + + public: string _getTypeName() const + // ******************************** + { + return _TName("IntrusiveMapConst"); + } + + public: string _getString() const + // ****************************** + { + if (isEmpty()) + return "<" + _getTypeName() + " empty>"; + else + return "<" + _getTypeName() + " " + getString(_size) + ">"; + }; + + public: Record* _getRecord() const + // ************************* + { + Record* record = NULL; + if (!isEmpty()) { + record = new Record(getString(this)); + unsigned n = 1; + for (unsigned index = 0; index < _length; index++) { + n = 1; + Element* element = _array[index]; + while (element) { + record->add(getSlot(getString(index) + ":" + getString(n++), element)); + element = _getNextElement(element); + } + } + } + return record; + }; + + public: unsigned _getSize() const + // ****************************** + { + return _size; + }; + + public: unsigned _getLength() const + // ******************************** + { + return _length; + }; + + public: Element** _getArray() const + // ******************************** + { + return _array; + }; + + public: bool _contains(Element* element) const + // ******************************************* + { + unsigned index = (_getHashValue(_getKey(element)) / 8) % _length; + Element* currentElement = _array[index]; + while (currentElement && (currentElement != element)) + currentElement = _getNextElement(currentElement); + return (currentElement != NULL); + }; + + public: void _insert(Element* element) + // *********************************** + { + if (!_contains(element)) { + unsigned index = (_getHashValue(_getKey(element)) / 8) % _length; + _setNextElement(element, _array[index]); + _array[index] = element; + _size++; + _resize(); + } + }; + + public: void _remove(Element* element) + // *********************************** + { + if (_contains(element)) { + unsigned index = (_getHashValue(_getKey(element)) / 8) % _length; + Element* currentElement = _array[index]; + if (currentElement) { + if (currentElement == element) { + _array[index] = _getNextElement(element); + _setNextElement(element, NULL); + _size--; + } + else { + while (_getNextElement(currentElement) && (_getNextElement(currentElement) != element)) + currentElement = _getNextElement(currentElement); + if (currentElement && (_getNextElement(currentElement) == element)) { + _setNextElement(currentElement, _getNextElement(element)); + _setNextElement(element, NULL); + _size--; + } + } + } + } + }; + + public: void _resize() + // ******************* + { + unsigned newLength = _length; + double ratio = (double)_size / (double)_length; + if (ratio < 3.0) newLength = max(_size / 8, (unsigned)1); + else if (ratio > 10.0) newLength = min(_size / 5, (unsigned)512); + + if (newLength != _length) { + cdebug_log(0,0) << "IntrusiveMapConst::_resize() " << _length << " -> " << newLength << endl; + + unsigned oldLength = _length; + Element** oldArray = _array; + _length = newLength; + _array = new Element* [_length]; + memset( _array, 0, _length * sizeof(Element*) ); + + for ( unsigned index = 0; index < oldLength; ++index ) { + Element* element = oldArray[index]; + if (not element) + cdebug_log(0,0) << "| entry:" << tsetw(4) << index << " empty" << endl; + + while ( element ) { + Element* nextElement = _getNextElement(element); + unsigned newIndex = (_getHashValue(_getKey(element)) / 8) % _length; + _setNextElement(element, _array[newIndex]); + _array[ newIndex ] = element; + + cdebug_log(0,0) << "| entry:" << tsetw(4) << index + << " -> " << tsetw(4) << newIndex + << " + " << _getHashValue(_getKey(element)) + << "/" << _getKey(element) << ":" << element << endl; + + element = nextElement; + } + } + delete [] oldArray; + } + }; + +}; + + + template + inline GenericCollection getCollection(const IntrusiveMapConst& intrusiveMap) + // ******************************************************************************************** + { + return intrusiveMap.getElements(); + } + + +} // End of Hurricane namespace. + + +template +inline std::string getString ( Hurricane::IntrusiveMapConst* intrusiveMap ) + { return intrusiveMap->_getString(); } + +template +inline std::string getString ( const Hurricane::IntrusiveMapConst* intrusiveMap ) + { return intrusiveMap->_getString(); } + +template +inline Hurricane::Record* getRecord ( Hurricane::IntrusiveMapConst* intrusiveMap ) + { return intrusiveMap->_getRecord(); } + +template +inline Hurricane::Record* getRecord ( const Hurricane::IntrusiveMapConst* intrusiveMap ) + { return intrusiveMap->_getRecord(); } + + +template +inline void jsonWrite ( JsonWriter* w, const std::string& key, Hurricane::IntrusiveMapConst* intrusiveMap ) +{ + w->key( key ); + w->startArray(); + for ( Element* element : intrusiveMap->getElements() ) jsonWrite( w, element ); + w->endArray(); +} #endif // HURRICANE_INTRUSIVE_MAP diff --git a/hurricane/src/hurricane/hurricane/Layer.h b/hurricane/src/hurricane/hurricane/Layer.h index ab3358e5..bbc873af 100644 --- a/hurricane/src/hurricane/hurricane/Layer.h +++ b/hurricane/src/hurricane/hurricane/Layer.h @@ -93,9 +93,11 @@ namespace Hurricane { bool contains ( const Layer* layer ) const; bool intersect ( const Layer* layer ) const; inline bool isSymbolic () const; + inline bool isBlockage () const; // Updators void setName ( const Name& name ); inline void setSymbolic ( bool ); + inline void setBlockage ( bool ); void setMinimalSize ( const DbU::Unit& minimalSize ); void setMinimalSpacing ( const DbU::Unit& minimalSpacing ); virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit, uint32_t flags ); @@ -122,6 +124,7 @@ namespace Hurricane { DbU::Unit _minimalSpacing; Layer* _nextOfTechnologyLayerMap; bool _symbolic; + bool _blockage; protected: // Internal: Constructors & Destructors. @@ -143,6 +146,7 @@ namespace Hurricane { // Inline Functions. inline bool Layer::isSymbolic () const { return _symbolic; } + inline bool Layer::isBlockage () const { return _blockage; } inline bool Layer::above ( const Layer* layer ) const { return _mask > layer->getMask(); } inline bool Layer::below ( const Layer* layer ) const { return _mask < layer->getMask(); } inline Technology* Layer::getTechnology () const { return _technology; } @@ -152,6 +156,7 @@ namespace Hurricane { inline const DbU::Unit& Layer::getMinimalSize () const { return _minimalSize; } inline const DbU::Unit& Layer::getMinimalSpacing () const { return _minimalSpacing; } inline void Layer::setSymbolic ( bool state ) { _symbolic = state; } + inline void Layer::setBlockage ( bool state ) { _blockage = state; } inline Layer* Layer::_getNextOfTechnologyLayerMap () const { return _nextOfTechnologyLayerMap; } inline void Layer::_setMask ( const Mask& mask ) { _mask = mask; } inline void Layer::_setExtractMask ( const Mask& extractMask ) { _extractMask = extractMask; } diff --git a/hurricane/src/hurricane/hurricane/Property.h b/hurricane/src/hurricane/hurricane/Property.h index 3672db72..51fa4861 100644 --- a/hurricane/src/hurricane/hurricane/Property.h +++ b/hurricane/src/hurricane/hurricane/Property.h @@ -396,8 +396,8 @@ namespace Hurricane { unsigned int _count; }; public: - typedef vector DBoSet; - typedef map OrphanedMap; + typedef set DBoSet; + typedef map OrphanedMap; public: static const OrphanedMap& getOrphaneds (); static SharedProperty* getOrphaned ( const string& ); diff --git a/hurricane/src/hurricane/hurricane/Rectilinear.h b/hurricane/src/hurricane/hurricane/Rectilinear.h index 670e4a85..1df05c38 100644 --- a/hurricane/src/hurricane/hurricane/Rectilinear.h +++ b/hurricane/src/hurricane/hurricane/Rectilinear.h @@ -48,34 +48,39 @@ namespace Hurricane { typedef Component Super; public: - static Rectilinear* create ( Net*, const Layer*, const vector& ); - // Accessors. - virtual bool isNonRectangle () const; - virtual DbU::Unit getX () const; - virtual DbU::Unit getY () const; - virtual Box getBoundingBox () const; - virtual Box getBoundingBox ( const BasicLayer* ) const; - virtual size_t getPointsSize () const; - virtual Point getPoint ( size_t i ) const; - virtual const Layer* getLayer () const; - inline Points getContour () const; + static Rectilinear* create ( Net*, const Layer*, const vector& ); + // Accessors. + virtual bool isNonRectangle () const; + virtual DbU::Unit getX () const; + virtual DbU::Unit getY () const; + virtual Box getBoundingBox () const; + virtual Box getBoundingBox ( const BasicLayer* ) const; + virtual size_t getPointsSize () const; + virtual Point getPoint ( size_t i ) const; + virtual const Layer* getLayer () const; + inline Points getContour () const; + inline const vector& getPoints () const; // Mutators. - void setLayer ( const Layer* ); - virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy ); - void setPoints ( const vector& ); - // Hurricane management. - virtual void _toJson ( JsonWriter* ) const; - static JsonObject* getJsonObject ( unsigned long flags ); - virtual string _getTypeName () const; - virtual string _getString () const; - virtual Record* _getRecord () const; + void setLayer ( const Layer* ); + virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy ); + void setPoints ( const vector& ); + // Hurricane management. + virtual void _toJson ( JsonWriter* ) const; + static JsonObject* getJsonObject ( unsigned long flags ); + virtual string _getTypeName () const; + virtual string _getString () const; + virtual Record* _getRecord () const; protected: - Rectilinear ( Net*, const Layer*, const vector& ); + Rectilinear ( Net*, const Layer*, const vector& ); private: const Layer* _layer; vector _points; }; + + inline Points Rectilinear::getContour () const { return new VectorCollection(_points); } + inline const vector& Rectilinear::getPoints () const { return _points; } + // ------------------------------------------------------------------- // Class : "JsonRoutingRectilinear". diff --git a/hurricane/src/hurricane/hurricane/Technology.h b/hurricane/src/hurricane/hurricane/Technology.h index 9da35d69..7d1c1273 100644 --- a/hurricane/src/hurricane/hurricane/Technology.h +++ b/hurricane/src/hurricane/hurricane/Technology.h @@ -44,6 +44,9 @@ #include "hurricane/DeviceDescriptor.h" #include "hurricane/ModelDescriptor.h" #include "hurricane/Rule.h" +#include "hurricane/UnitRule.h" +#include "hurricane/PhysicalRule.h" +#include "hurricane/TwoLayersPhysicalRule.h" namespace Hurricane { @@ -55,9 +58,6 @@ namespace Hurricane { class BasicLayer; class RegularLayer; class ViaLayer; - class UnitRule; - class PhysicalRule; - class TwoLayersPhysicalRule; // ------------------------------------------------------------------- @@ -71,9 +71,12 @@ namespace Hurricane { typedef set DeviceDescriptors; typedef set ModelDescriptors; public: - struct RuleNameCompare: - public std::binary_function { - bool operator() ( const Rule* rule1, const Rule* rule2 ) const + struct RuleNameCompare { + inline bool operator() ( const PhysicalRule* rule1 , const PhysicalRule* rule2 ) const + { return rule1->getName() < rule2->getName(); } + inline bool operator() ( const UnitRule* rule1 , const UnitRule* rule2 ) const + { return rule1->getName() < rule2->getName(); } + inline bool operator() ( const Rule* rule1 , const Rule* rule2 ) const { return rule1->getName() < rule2->getName(); } }; public: diff --git a/hurricane/src/isobar/PyInstance.cpp b/hurricane/src/isobar/PyInstance.cpp index c552a6d5..84016b1e 100644 --- a/hurricane/src/isobar/PyInstance.cpp +++ b/hurricane/src/isobar/PyInstance.cpp @@ -51,7 +51,7 @@ extern "C" { #if defined(__PYTHON_MODULE__) - static Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object ) + extern Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object ) { switch ( PyAny_AsLong(object) ) { case Instance::PlacementStatus::UNPLACED : return ( Instance::PlacementStatus(Instance::PlacementStatus::UNPLACED) ); @@ -80,35 +80,37 @@ extern "C" { PyObject* arg1 = NULL; PyObject* arg2 = NULL; PyObject* arg3 = NULL; + PyObject* arg4 = NULL; HTRY - __cs.init( "Instance.create" ); - if (not PyArg_ParseTuple(args,"O&O&O&|O&:Instance.create" - ,Converter,&arg0 - ,Converter,&arg1 - ,Converter,&arg2 - ,Converter,&arg3 - )) { - PyErr_SetString( ConstructorError, "Instance.create(): Invalid number of parameters." ); + __cs.init( "Instance.create" ); + if (not PyArg_ParseTuple(args,"O&O&O&|O&O&:Instance.create" + ,Converter,&arg0 + ,Converter,&arg1 + ,Converter,&arg2 + ,Converter,&arg3 + ,Converter,&arg4 + )) { + PyErr_SetString( ConstructorError, "Instance.create(): Invalid number of parameters." ); + return NULL; + } + + if (__cs.getObjectIds() == ":ent:string:ent") { + instance = Instance::create( PYCELL_O(arg0) + , Name(PyString_AsString(arg1)) + , PYCELL_O(arg2) + ); + } else if (__cs.getObjectIds() == ":ent:string:ent:transfo:int") { + instance = Instance::create( PYCELL_O(arg0) + , Name(PyString_AsString(arg1)) + , PYCELL_O(arg2) + , *PYTRANSFORMATION_O(arg3) + , PyInt_AsPlacementStatus(arg4) + ); + } else { + PyErr_SetString( ConstructorError, "Instance.create(): Bad type of parameter(s)." ); return NULL; - } - - if (__cs.getObjectIds() == ":ent:string:ent") { - instance = Instance::create( PYCELL_O(arg0) - , Name(PyString_AsString(arg1)) - , PYCELL_O(arg2) - ); - } else if (__cs.getObjectIds() == ":ent:string:ent:transfo") { - instance = Instance::create( PYCELL_O(arg0) - , Name(PyString_AsString(arg1)) - , PYCELL_O(arg2) - , *PYTRANSFORMATION_O(arg3) - , Instance::PlacementStatus::PLACED - ); - } else { - PyErr_SetString( ConstructorError, "Instance.create(): Bad type of parameter(s)." ); - return NULL; - } + } HCATCH return PyInstance_Link( instance ); diff --git a/hurricane/src/isobar/PyLayer.cpp b/hurricane/src/isobar/PyLayer.cpp index c264b837..7d34d57d 100644 --- a/hurricane/src/isobar/PyLayer.cpp +++ b/hurricane/src/isobar/PyLayer.cpp @@ -313,6 +313,7 @@ extern "C" { predicateFromLayer ( contains ,PyLayer,Layer) predicateFromLayer ( intersect ,PyLayer,Layer) predicateFromVoid ( isSymbolic ,PyLayer,Layer) + predicateFromVoid ( isBlockage ,PyLayer,Layer) accessorDbuFromOptBasicLayer( getExtentionCap ,PyLayer,Layer) accessorDbuFromOptBasicLayer( getExtentionWidth,PyLayer,Layer) accessorCollectionFromVoid ( getBasicLayers ,PyLayer,Layer,BasicLayer) @@ -335,6 +336,7 @@ extern "C" { updatorFromBasicLayerDbu(setExtentionCap ,PyLayer,Layer) updatorFromBasicLayerDbu(setExtentionWidth,PyLayer,Layer) DirectSetBoolAttribute (PyLayer_setSymbolic,setSymbolic,PyLayer,Layer) + DirectSetBoolAttribute (PyLayer_setBlockage,setBlockage,PyLayer,Layer) // Standart destroy (Attribute). DBoDestroyAttribute(PyLayer_destroy, PyLayer) @@ -387,10 +389,14 @@ extern "C" { , "Tells if the layer share some BasicLayer with the one passed as argument." } , { "isSymbolic" , (PyCFunction)PyLayer_isSymbolic , METH_NOARGS , "Tells if the layer is the symbolic one for this BasicLayer." } + , { "isBlockage" , (PyCFunction)PyLayer_isBlockage , METH_NOARGS + , "Tells if the layer represent blockage." } , { "setName" , (PyCFunction)PyLayer_setName , METH_VARARGS , "Allows to change the layer name." } , { "setSymbolic" , (PyCFunction)PyLayer_setSymbolic , METH_VARARGS , "Sets the layer as the symbolic one." } + , { "setBlockage" , (PyCFunction)PyLayer_setBlockage , METH_VARARGS + , "Sets the layer as blockage." } , { "setMinimalSize" , (PyCFunction)PyLayer_setMinimalSize , METH_VARARGS , "Sets the layer minimal size (width)." } , { "setMinimalSpacing" , (PyCFunction)PyLayer_setMinimalSpacing , METH_VARARGS diff --git a/hurricane/src/isobar/PyPlacementStatus.cpp b/hurricane/src/isobar/PyPlacementStatus.cpp index 4239936f..b7c57e1d 100644 --- a/hurricane/src/isobar/PyPlacementStatus.cpp +++ b/hurricane/src/isobar/PyPlacementStatus.cpp @@ -101,6 +101,17 @@ extern "C" { LoadObjectConstant(PyTypePlacementStatus.tp_dict,Instance::PlacementStatus::PLACED ,"PLACED"); LoadObjectConstant(PyTypePlacementStatus.tp_dict,Instance::PlacementStatus::FIXED ,"FIXED"); } + + + extern Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* object ) { + switch ( PyAny_AsLong(object) ) { + case Instance::PlacementStatus::UNPLACED : return Instance::PlacementStatus::UNPLACED; + case Instance::PlacementStatus::PLACED : return Instance::PlacementStatus::PLACED; + case Instance::PlacementStatus::FIXED : return Instance::PlacementStatus::FIXED; + } + + return Instance::PlacementStatus::UNPLACED; + } #endif // Shared Library Code Part. diff --git a/hurricane/src/isobar/PySegment.cpp b/hurricane/src/isobar/PySegment.cpp index 66506fa3..f62c6dc4 100644 --- a/hurricane/src/isobar/PySegment.cpp +++ b/hurricane/src/isobar/PySegment.cpp @@ -73,7 +73,7 @@ extern "C" { if (pyReturnHook == NULL) return NULL; PyObject* pyHook = NULL; - if (not PyArg_ParseTuple(args,"O:Hook.merge", &pyHook)) return NULL; + if (not PyArg_ParseTuple(args,"O:Segment.getOppositetHook", &pyHook)) return NULL; Hook* hook = PYHOOK_O(pyHook); @@ -85,6 +85,29 @@ extern "C" { } + static PyObject* PySegment_getOppositeAnchor ( PySegment *self, PyObject* args ) + { + cdebug_log(20,0) << "PySegment_getOppositeAnchor()" << endl; + METHOD_HEAD ( "Segment.getOppositeAnchor()" ) + + Component* opposite = NULL; + PyObject* pyOpposite = NULL; + PyComponent* pyComponent = NULL; + if (not PyArg_ParseTuple(args,"O:Segment.getOppositeAnchor", &pyComponent)) return NULL; + + Component* anchor = PYCOMPONENT_O(pyComponent); + + HTRY + opposite = segment->getOppositeAnchor( anchor ); + if (opposite) pyOpposite = PyEntity_NEW( opposite ); + else + Py_RETURN_NONE; + HCATCH + + return pyOpposite; + } + + static PyObject* PySegment_getSource ( PySegment *self ) { cdebug_log(20,0) << "PySegment_getSource()" << endl; @@ -164,6 +187,7 @@ extern "C" { { { "getSourceHook" , (PyCFunction)PySegment_getSourceHook , METH_NOARGS , "Return the nested source Hook." } , { "getTargetHook" , (PyCFunction)PySegment_getTargetHook , METH_NOARGS , "Return the nested target Hook." } , { "getOppositeHook" , (PyCFunction)PySegment_getOppositeHook , METH_VARARGS, "Return the nested Hook opposite of the argument hook." } + , { "getOppositeAnchor" , (PyCFunction)PySegment_getOppositeAnchor, METH_VARARGS, "Return the opposite component anchor." } , { "getSource" , (PyCFunction)PySegment_getSource , METH_NOARGS , "Return the Segment source component (or None)." } , { "getTarget" , (PyCFunction)PySegment_getTarget , METH_NOARGS , "Return the Segment target component (or None)." } , { "getSourceX" , (PyCFunction)PySegment_getSourceX , METH_NOARGS , "Return the Segment source X value." } @@ -212,7 +236,5 @@ extern "C" { } // End of extern "C". - - } // End of Isobar namespace. diff --git a/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h b/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h index 9d16fbc0..a0d89996 100644 --- a/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h +++ b/hurricane/src/isobar/hurricane/isobar/PyPlacementStatus.h @@ -37,12 +37,13 @@ namespace Isobar { // ------------------------------------------------------------------- // Functions & Types exported to "PyHurricane.ccp". - extern PyTypeObject PyTypePlacementStatus; - extern PyMethodDef PyPlacementStatus_Methods[]; + extern PyTypeObject PyTypePlacementStatus; + extern PyMethodDef PyPlacementStatus_Methods[]; - extern PyObject* PyPlacementStatus_Link ( Hurricane::Instance::PlacementStatus* ); - extern void PyPlacementStatus_LinkPyType (); - extern void PyPlacementStatus_postModuleInit (); + extern PyObject* PyPlacementStatus_Link ( Hurricane::Instance::PlacementStatus* ); + extern void PyPlacementStatus_LinkPyType (); + extern void PyPlacementStatus_postModuleInit (); + extern Hurricane::Instance::PlacementStatus PyInt_AsPlacementStatus ( PyObject* ); #define IsPyPlacementStatus(v) ( (v)->ob_type == &PyTypePlacementStatus ) diff --git a/hurricane/src/viewer/CellPrinter.cpp b/hurricane/src/viewer/CellPrinter.cpp index 8a18a9c0..ff05e88c 100644 --- a/hurricane/src/viewer/CellPrinter.cpp +++ b/hurricane/src/viewer/CellPrinter.cpp @@ -14,18 +14,21 @@ // +-----------------------------------------------------------------+ -#include -#include -#include -#include -#include -#include -#include "vlsisapd/configuration/Configuration.h" -#include "hurricane/DataBase.h" -#include "hurricane/Cell.h" -#include "hurricane/viewer/Graphics.h" -#include "hurricane/viewer/CellPrinter.h" -#include "hurricane/viewer/PaletteWidget.h" +#include +#include +#include +#include +#include +#include +#include "vlsisapd/configuration/Configuration.h" +#include "hurricane/DataBase.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/ExtensionSlice.h" +#include "hurricane/Cell.h" +#include "hurricane/viewer/Graphics.h" +#include "hurricane/viewer/CellPrinter.h" +#include "hurricane/viewer/PaletteWidget.h" namespace Hurricane { @@ -79,6 +82,7 @@ namespace Hurricane { setCentralWidget( _cellWidget ); _palette->readGraphics (); + _cellWidget->setPrinter( true ); _cellWidget->bindToPalette( _palette ); _cellWidget->refresh(); } @@ -88,12 +92,38 @@ namespace Hurricane { { _screenCellWidget = cellWidget; + array labels = { "fallback" + , "rubber" + , "phantom" + , "boundaries" + , "marker" + , "grid" + , "spot" + , "ghost" + , "text.ruler" + , "text.cell" + , "text.instance" + , "text.components" + , "text.references" + , "undef" + }; + + for ( string label : labels ) + _cellWidget->setLayerVisible( label + , _screenCellWidget->isLayerVisible(label) ); + + for ( const BasicLayer* layer : DataBase::getDB()->getTechnology()->getBasicLayers() ) + _cellWidget->setLayerVisible( layer->getName() + , _screenCellWidget->isLayerVisible( layer->getName() )); + shared_ptr clone ( _screenCellWidget->getStateClone() ); - _cellWidget->setState ( clone ); - _cellWidget->setLayerVisible("grid" , _screenCellWidget->isLayerVisible("grid" )); - _cellWidget->setLayerVisible("text.instance" , _screenCellWidget->isLayerVisible("text.instance" )); - _cellWidget->setLayerVisible("text.component", _screenCellWidget->isLayerVisible("text.component")); - _cellWidget->setLayerVisible("rubber" , _screenCellWidget->isLayerVisible("rubber" )); + _cellWidget->setState( clone ); + + _cellWidget->copyDrawExtensionGos( _screenCellWidget ); + + for ( ExtensionSlice* extension : cellWidget->getCell()->getExtensionSlices() ) + _cellWidget->setLayerVisible( extension->getName() + , _screenCellWidget->isLayerVisible( extension->getName() )); } diff --git a/hurricane/src/viewer/CellViewer.cpp b/hurricane/src/viewer/CellViewer.cpp index 42958018..a124011d 100644 --- a/hurricane/src/viewer/CellViewer.cpp +++ b/hurricane/src/viewer/CellViewer.cpp @@ -205,12 +205,17 @@ namespace Hurricane { { return findChild(_getAbsWidgetPath(relativePath)) != NULL; } - QMenu* CellViewer::_getParentMenu( const QString& absolutePath ) const + QAction* CellViewer::getMenuAction( const QString& relativePath ) const + { return findChild(_getAbsWidgetPath(relativePath)); } + + + QAction* CellViewer::_getParentMenu( const QString& absolutePath ) const { - QString parentPath = absolutePath.section('.',0,-2); - QMenu* parentMenu = findChild(parentPath); + QString parentPath = absolutePath.section('.',0,-2); + QAction* parentMenu = findChild(parentPath); if (parentMenu == NULL) { if (parentPath != "viewer") { + cerr << "parentPath:\"" << parentPath.toStdString() << "\"" << endl; cerr << Warning( "CellViewer::_getParentMenu() - Missing parent menu for %s." , absolutePath.toStdString().c_str() ) << endl; } @@ -220,35 +225,45 @@ namespace Hurricane { } - QMenu* CellViewer::addMenu ( const QString& path, string text, unsigned int flags ) + QAction* CellViewer::addMenu ( const QString& path, string text, unsigned int flags ) { QString absolutePath = _getAbsWidgetPath( path ); - QMenu* menu = findChild(absolutePath); + QAction* actionMenu = findChild(absolutePath); - if (menu != NULL) return menu; + if (actionMenu != NULL) return actionMenu; + QMenu* menu = new QMenu ( tr(text.c_str()), this ); + if (flags & TopMenu) { - menu = menuBar()->addMenu( tr(text.c_str()) ); - menu->setObjectName( absolutePath ); + actionMenu = menuBar()->addMenu( menu ); + actionMenu->setObjectName( absolutePath ); } else { - QMenu* parentMenu = _getParentMenu( absolutePath ); + menu->setStyleSheet( "font-family: Bitstream Vera Sans Mono" ); + + QAction* parentMenu = _getParentMenu( absolutePath ); if (parentMenu == NULL) return NULL; - menu = parentMenu->addMenu( tr(text.c_str()) ); - menu->setObjectName( absolutePath ); + actionMenu = parentMenu->menu()->addMenu( menu ); + actionMenu->setObjectName( absolutePath ); } - return menu; + return actionMenu; } - bool CellViewer::addToMenu ( const QString& path ) + bool CellViewer::addToMenu ( const QString& path, QString beforePath ) { if (not path.endsWith("====")) return false; - QMenu* menu = _getParentMenu( _getAbsWidgetPath(path) ); - if (menu == NULL) return false; + QString absolutePath = _getAbsWidgetPath( path ); + QAction* menuAction = _getParentMenu( absolutePath ); + if (menuAction == NULL) return false; + + QAction* before = getMenuAction( beforePath ); + QAction* action = new QAction( this ); + action->setSeparator ( true ); + action->setObjectName( absolutePath ); + menuAction->menu()->insertAction( before, action ); - menu->addSeparator(); return true; } @@ -257,12 +272,13 @@ namespace Hurricane { , string text , string textTip , std::function< void() > callback - , QIcon icon ) + , QIcon icon + , QString beforePath ) { QString absolutePath = _getAbsWidgetPath( path ); QAction* action = findChild(absolutePath); if (action == NULL) { - QMenu* parentMenu = _getParentMenu( absolutePath ); + QAction* parentMenu = _getParentMenu( absolutePath ); if (parentMenu == NULL) return NULL; action = new QAction( tr(text.c_str()), this ); @@ -270,7 +286,9 @@ namespace Hurricane { action->setStatusTip ( tr(textTip.c_str()) ); action->setVisible ( true ); if (not icon.isNull()) action->setIcon( icon ); - parentMenu->addAction( action ); + + QAction* before = getMenuAction( beforePath ); + parentMenu->menu()->insertAction( before, action ); _actionCallbacks.insert( make_pair(absolutePath,boost::any(callback)) ); connect( action, SIGNAL(triggered()), this, SLOT(doAction()) ); @@ -282,7 +300,8 @@ namespace Hurricane { QAction* CellViewer::addToMenu ( const QString& path , string text , string textTip - , string scriptPath ) + , string scriptPath + , QString beforePath ) { QString absolutePath = _getAbsWidgetPath( path ); QAction* action = findChild(absolutePath); @@ -292,9 +311,10 @@ namespace Hurricane { action->setStatusTip ( tr(textTip.c_str()) ); action->setVisible ( true ); - QMenu* parentMenu = _getParentMenu( absolutePath ); + QAction* parentMenu = _getParentMenu( absolutePath ); if (parentMenu != NULL) { - parentMenu->addAction( action ); + QAction* before = getMenuAction( beforePath ); + parentMenu->menu()->insertAction( before, action ); } else if (absolutePath == "viewer") { addAction( action ); } @@ -313,6 +333,7 @@ namespace Hurricane { , QIcon icon //, QWidget* receiver //, SlotMethod slotMethod + , QString beforePath ) { QString absolutePath = _getAbsWidgetPath( path ); @@ -325,9 +346,10 @@ namespace Hurricane { action->setVisible ( true ); if (not icon.isNull()) action->setIcon( icon ); - QMenu* parentMenu = _getParentMenu( absolutePath ); + QAction* parentMenu = _getParentMenu( absolutePath ); if (parentMenu != NULL) { - parentMenu->addAction( action ); + QAction* before = getMenuAction( beforePath ); + parentMenu->menu()->insertAction( before, action ); } else if (absolutePath == "viewer") { addAction( action ); } @@ -538,13 +560,13 @@ namespace Hurricane { ); connect( action, SIGNAL(triggered()), this, SLOT(runScriptWidget()) ); - action = addToMenu( "tools.stressScript" - , tr("Python Stress Script") - , tr("Run Python Stress Script (50 times...).") - , QKeySequence() - , QIcon(":/images/python-logo-v3.png") - ); - connect( action, SIGNAL(triggered()), this, SLOT(runStressScript()) ); + // action = addToMenu( "tools.stressScript" + // , tr("Python Stress Script") + // , tr("Run Python Stress Script (50 times...).") + // , QKeySequence() + // , QIcon(":/images/python-logo-v3.png") + // ); + // connect( action, SIGNAL(triggered()), this, SLOT(runStressScript()) ); } diff --git a/hurricane/src/viewer/CellWidget.cpp b/hurricane/src/viewer/CellWidget.cpp index e0983de3..6b334fc4 100644 --- a/hurricane/src/viewer/CellWidget.cpp +++ b/hurricane/src/viewer/CellWidget.cpp @@ -677,13 +677,13 @@ namespace Hurricane { if ( (rectangle.width() > 4) and (rectangle.height() > 4) ) { QPolygon contour; for ( Point point : component->getContour() ) - contour << _cellWidget->dbuToScreenPoint( point ); + contour << _cellWidget->dbuToScreenPoint( transformation.getPoint(point) ); _cellWidget->drawScreenPolygon( contour ); if ( component->isManhattanized() and (_cellWidget->dbuToScreenLength(DbU::getPolygonStep()) > 4) ) { for ( Point point : component->getMContour() ) - contour << _cellWidget->dbuToScreenPoint( point ); + contour << _cellWidget->dbuToScreenPoint( transformation.getPoint(point) ); _cellWidget->drawScreenPolygon( contour ); // const Polygon* polygon = dynamic_cast( component ); @@ -1094,6 +1094,7 @@ namespace Hurricane { , _mousePosition (0,0) , _spot (this) , _state (new State(NULL)) + , _isPrinter (false) , _cellChanged (true) , _selectionHasChanged (false) , _delaySelectionChanged(0) @@ -1312,10 +1313,10 @@ namespace Hurricane { //static bool timedout; //static Timer timer; - if ( not isVisible() ) return; + if (not isVisible()) return; DataBase* database = DataBase::getDB(); - if ( database ) _technology = database->getTechnology (); + if (database) _technology = database->getTechnology(); //timer.start (); //timedout = false; @@ -1323,22 +1324,22 @@ namespace Hurricane { _cellChanged = false; _redrawRectCount = 0; - pushCursor ( Qt::BusyCursor ); + pushCursor( Qt::BusyCursor ); - if ( not ( _selectionHasChanged and _state->showSelection() ) or _cellModificated ) { - _spot.setRestore ( false ); + if ( not (_selectionHasChanged and _state->showSelection()) or _cellModificated ) { + _spot.setRestore( false ); //_drawingPlanes.copyToSelect ( redrawArea ); _drawingPlanes.select ( PlaneId::Normal ); _drawingPlanes.begin (); - _drawingPlanes.painter().setPen ( Qt::NoPen ); - _drawingPlanes.painter().setBackground ( Graphics::getBrush("background") ); - _drawingPlanes.painter().setClipRect ( redrawArea ); - _drawingPlanes.painter().eraseRect ( redrawArea ); + _drawingPlanes.painter().setPen ( Qt::NoPen ); + _drawingPlanes.painter().setBackground( Graphics::getBrush("background") ); + _drawingPlanes.painter().setClipRect ( redrawArea ); + _drawingPlanes.painter().eraseRect ( redrawArea ); - setDarkening ( (_state->showSelection()) ? Graphics::getDarkening() : DisplayStyle::HSVr() ); + setDarkening( (_state->showSelection()) ? Graphics::getDarkening() : DisplayStyle::HSVr() ); - if ( getCell() ) { - Box redrawBox = screenToDbuBox ( redrawArea ); + if (getCell()) { + Box redrawBox = screenToDbuBox( redrawArea ); _drawingQuery.resetGoCount (); _drawingQuery.resetExtensionGoCount(); @@ -1347,106 +1348,112 @@ namespace Hurricane { _drawingQuery.setArea ( redrawBox ); _drawingQuery.setTransformation ( Transformation() ); - forEach ( BasicLayer*, iLayer, _technology->getBasicLayers() ) { - _drawingPlanes.setPen ( Graphics::getPen ((*iLayer)->getName(),getDarkening()) ); - _drawingPlanes.setBrush ( Graphics::getBrush((*iLayer)->getName(),getDarkening()) ); + for ( BasicLayer* layer : _technology->getBasicLayers() ) { + _drawingPlanes.setPen ( Graphics::getPen (layer->getName(),getDarkening()) ); + _drawingPlanes.setBrush( Graphics::getBrush(layer->getName(),getDarkening()) ); - if ( isDrawable((*iLayer)->getName()) ) { - _drawingQuery.setBasicLayer ( *iLayer ); - _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoMasterCells - |Query::DoRubbers - |Query::DoMarkers - |Query::DoExtensionGos) ); - _drawingQuery.doQuery (); + if ( isDrawable(layer->getName()) ) { + _drawingQuery.setBasicLayer( layer ); + _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoMasterCells + |Query::DoRubbers + |Query::DoMarkers + |Query::DoExtensionGos) ); + _drawingQuery.doQuery (); } - if ( _enableRedrawInterrupt ) QApplication::processEvents(); - if ( _redrawManager.interrupted() ) { - //cerr << "CellWidget::redraw() - interrupt after " << (*iLayer)->getName() << endl; + if (_enableRedrawInterrupt) QApplication::processEvents(); + if (_redrawManager.interrupted()) { + //cerr << "CellWidget::redraw() - interrupt after " << layer->getName() << endl; break; } //if ( timeout("redraw [layer]",timer,10.0,timedout) ) break; } if ( /*not timeout("redraw [boundaries]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) { - if ( isDrawable("boundaries") ) { - _drawingPlanes.setPen ( Graphics::getPen ("boundaries",getDarkening()) ); - _drawingPlanes.setBrush ( Graphics::getBrush("boundaries",getDarkening()) ); + if (isDrawable("boundaries")) { + _drawingPlanes.setPen ( Graphics::getPen ("boundaries",getDarkening()) ); + _drawingPlanes.setBrush( Graphics::getBrush("boundaries",getDarkening()) ); - _drawingQuery.setBasicLayer ( NULL ); - _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents - |Query::DoRubbers - |Query::DoMarkers - |Query::DoExtensionGos) ); - _drawingQuery.doQuery (); + _drawingQuery.setBasicLayer( NULL ); + _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents + |Query::DoRubbers + |Query::DoMarkers + |Query::DoExtensionGos) ); + _drawingQuery.doQuery (); } } if ( /*not timeout("redraw [markers]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) { if ( isDrawable("text.reference") ) { - _drawingPlanes.setPen ( Graphics::getPen ("text.reference",getDarkening()) ); - _drawingPlanes.setBrush ( Graphics::getBrush("text.reference",getDarkening()) ); + _drawingPlanes.setPen ( Graphics::getPen ("text.reference",getDarkening()) ); + _drawingPlanes.setBrush( Graphics::getBrush("text.reference",getDarkening()) ); - _drawingQuery.setBasicLayer ( NULL ); - _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents - |Query::DoExtensionGos - |Query::DoMasterCells) ); - _drawingQuery.doQuery (); + _drawingQuery.setBasicLayer( NULL ); + _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents + |Query::DoRubbers + |Query::DoMarkers + |Query::DoExtensionGos + |Query::DoMasterCells) ); + _drawingQuery.doQuery (); } } if ( /*not timeout("redraw [rubbers]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) { - if ( isDrawable("rubber") ) { - _drawingPlanes.setPen ( Graphics::getPen ("rubber",getDarkening()) ); - _drawingPlanes.setBrush ( Graphics::getBrush("rubber",getDarkening()) ); + if (isDrawable("rubber")) { + _drawingPlanes.setPen ( Graphics::getPen ("rubber",getDarkening()) ); + _drawingPlanes.setBrush( Graphics::getBrush("rubber",getDarkening()) ); - _drawingQuery.setBasicLayer ( NULL ); - _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents - |Query::DoExtensionGos - |Query::DoMasterCells - |Query::DoMarkers) ); - _drawingQuery.doQuery (); + _drawingQuery.setBasicLayer( NULL ); + _drawingQuery.setFilter ( getQueryFilter().unset(Query::DoComponents + |Query::DoMarkers + |Query::DoExtensionGos + |Query::DoMasterCells) ); + _drawingQuery.doQuery (); } } - if ( _enableRedrawInterrupt ) QApplication::processEvents(); + if (_enableRedrawInterrupt) QApplication::processEvents(); if ( /*not timeout("redraw [text.instances]",timer,10.0,timedout) and*/ (not _redrawManager.interrupted()) ) { - if ( isDrawable("text.instance") ) { - _drawingPlanes.setPen ( Graphics::getPen ("text.instance",getDarkening()) ); - _drawingPlanes.setBrush ( Graphics::getBrush("text.instance",getDarkening()) ); - _drawingPlanes.setBackground ( Graphics::getBrush("boundaries" ,getDarkening()) ); - _textDrawingQuery.setArea ( redrawBox ); - _textDrawingQuery.setTransformation ( Transformation() ); - _textDrawingQuery.doQuery (); + if (isDrawable("text.instance")) { + _drawingPlanes.setPen ( Graphics::getPen ("text.instance",getDarkening()) ); + _drawingPlanes.setBrush ( Graphics::getBrush("text.instance",getDarkening()) ); + _drawingPlanes.setBackground ( Graphics::getBrush("boundaries" ,getDarkening()) ); + _textDrawingQuery.setArea ( redrawBox ); + _textDrawingQuery.setTransformation( Transformation() ); + _textDrawingQuery.doQuery (); } } //_drawingQuery.setFilter ( getQueryFilter() & ~Query::DoMasterCells ); - forEach ( ExtensionSlice*, islice, getCell()->getExtensionSlices() ) { - if ( _enableRedrawInterrupt ) QApplication::processEvents(); + for ( ExtensionSlice* slice : getCell()->getExtensionSlices() ) { + if (_enableRedrawInterrupt) QApplication::processEvents(); if ( /*timeout("redraw [extension]",timer,10.0,timedout) or*/ (_redrawManager.interrupted()) ) break; - if ( isDrawableExtension((*islice)->getName()) ) { - _drawingQuery.setExtensionMask ( (*islice)->getMask() ); - _drawingQuery.setDrawExtensionGo ( (*islice)->getName() ); - _drawingQuery.setFilter ( getQueryFilter().set(Query::DoExtensionGos).unset(Query::DoMasterCells) ); - _drawingQuery.doQuery (); + if (isDrawableExtension(slice->getName())) { + _drawingQuery.setExtensionMask ( slice->getMask() ); + _drawingQuery.setDrawExtensionGo( slice->getName() ); + _drawingQuery.setFilter ( getQueryFilter().set (Query::DoExtensionGos) + .unset(Query::DoComponents + |Query::DoRubbers + |Query::DoMarkers + |Query::DoMasterCells) ); + _drawingQuery.doQuery (); } } } - _drawingPlanes.end (); + _drawingPlanes.end(); _cellModificated = false; } - if ( isDrawable("grid") ) drawGrid ( redrawArea ); - if ( isDrawable("text.ruler") ) drawRulers ( redrawArea ); + if (isDrawable("grid")) drawGrid ( redrawArea ); + if (isDrawable("text.ruler")) drawRulers( redrawArea ); - setDarkening ( 100 ); - if ( _state->showSelection() ) - redrawSelection ( redrawArea ); + setDarkening( 100 ); + if (_state->showSelection()) + redrawSelection( redrawArea ); - popCursor (); - repaint (); + popCursor(); + repaint(); //timer.stop (); //cerr << "CellWidget::redraw() - " << _redrawRectCount @@ -1568,8 +1575,8 @@ namespace Hurricane { void CellWidget::setLayerVisible ( const Name& layer, bool visible ) { - if ( !_palette ) return; - _palette->setItemVisible ( layer, visible ); + if (not _palette) return; + _palette->setItemVisible( layer, visible ); } @@ -1586,8 +1593,8 @@ namespace Hurricane { //DbU::Unit unity = symbolicMode() ? DbU::lambda(1.0) : DbU::grid(10.0); DbU::Unit unity = DbU::lambda(1.0); - return (!item || item->isItemVisible()) - && ( Graphics::getThreshold(name) < getScale()*unity ); + if (not item) return false; + return item->isItemVisible() and (Graphics::getThreshold(name) < getScale()*unity); } @@ -1595,7 +1602,8 @@ namespace Hurricane { { PaletteItem* item = (_palette) ? _palette->find(layerName) : NULL; - return !item || item->isItemVisible(); + if (not item) return false; + return item->isItemVisible(); } @@ -1604,8 +1612,8 @@ namespace Hurricane { PaletteItem* item = (_palette) ? _palette->find(extensionName) : NULL; DbU::Unit unity = DbU::lambda(1.0); - return (not item or item->isItemVisible()) - and ( Graphics::getThreshold(extensionName) < getScale()*unity ); + if (not item) return false; + return item->isItemVisible() and (Graphics::getThreshold(extensionName) < getScale()*unity); } diff --git a/hurricane/src/viewer/PyCellViewer.cpp b/hurricane/src/viewer/PyCellViewer.cpp index 4752a7ae..f7bd4300 100644 --- a/hurricane/src/viewer/PyCellViewer.cpp +++ b/hurricane/src/viewer/PyCellViewer.cpp @@ -107,22 +107,27 @@ extern "C" { cdebug_log(20,0) << "PyCellViewer_addToMenu()" << endl; HTRY - METHOD_HEAD("CellViewer.addToMenu()") - - char* path = NULL; - char* text = NULL; - char* textTip = NULL; - char* scriptPath = NULL; - if (not PyArg_ParseTuple(args,"s|sss:CellViewer.addToMenu()", &path, &text, &textTip, &scriptPath)) { - PyErr_SetString ( ConstructorError, "CellViewer.addToMenu(): Takes one or four arguments exactly." ); - return NULL; - } - - if (text != NULL) { - if (cw->addToMenu( path, text, textTip, scriptPath )) Py_RETURN_TRUE; - } else { - if (cw->addToMenu( path )) Py_RETURN_TRUE; - } + METHOD_HEAD("CellViewer.addToMenu()") + + char* nullBefore = ""; + char* path = NULL; + char* text = NULL; + char* textTip = NULL; + char* scriptPath = NULL; + char* before = NULL; + if (not PyArg_ParseTuple( args, "s|ssss:CellViewer.addToMenu()" + , &path, &text, &textTip, &scriptPath, &before)) { + PyErr_SetString ( ConstructorError, "CellViewer.addToMenu(): Takes either one or five arguments." ); + return NULL; + } + + if (before == NULL) before = nullBefore; + + if (text != NULL) { + if (cw->addToMenu( path, text, textTip, scriptPath, before )) Py_RETURN_TRUE; + } else { + if (cw->addToMenu( path, before )) Py_RETURN_TRUE; + } HCATCH Py_RETURN_FALSE; diff --git a/hurricane/src/viewer/hurricane/viewer/CellViewer.h b/hurricane/src/viewer/hurricane/viewer/CellViewer.h index 9d7524e3..6ad78ffe 100644 --- a/hurricane/src/viewer/hurricane/viewer/CellViewer.h +++ b/hurricane/src/viewer/hurricane/viewer/CellViewer.h @@ -94,25 +94,30 @@ namespace Hurricane { QMenu* createDebugMenu (); bool hasMenu ( const QString& path ) const; bool hasMenuAction ( const QString& path ) const; - QMenu* addMenu ( const QString& path + QAction* getMenuAction ( const QString& path ) const; + QAction* addMenu ( const QString& path , std::string text , unsigned int flags=NoFlags ); - bool addToMenu ( const QString& path ); + bool addToMenu ( const QString& path + , QString beforePath="" ); QAction* addToMenu ( const QString& path - , std::string text - , std::string textTip + , std::string text + , std::string textTip , std::function< void() > - , QIcon icon=QIcon() ); + , QIcon icon=QIcon() + , QString beforePath="" ); QAction* addToMenu ( const QString& path - , std::string text - , std::string textTip - , std::string scriptPath ); + , std::string text + , std::string textTip + , std::string scriptPath + , QString beforePath="" ); QAction* addToMenu ( QString path , QString text , QString textTip , const QKeySequence& shortCut - , QIcon icon =QIcon()); + , QIcon icon =QIcon() + , QString beforePath="" ); inline void setEnableRedrawInterrupt ( bool ); inline void setApplicationName ( const QString& ); inline Observer* getCellObserver (); @@ -166,7 +171,7 @@ namespace Hurricane { void rebuildHistory (); private: QString _getAbsWidgetPath ( const QString& relPath ) const; - QMenu* _getParentMenu ( const QString& ) const; + QAction* _getParentMenu ( const QString& ) const; void _runScript ( QString scriptPath ); protected: diff --git a/hurricane/src/viewer/hurricane/viewer/CellWidget.h b/hurricane/src/viewer/hurricane/viewer/CellWidget.h index 5fc41f07..a176e958 100644 --- a/hurricane/src/viewer/hurricane/viewer/CellWidget.h +++ b/hurricane/src/viewer/hurricane/viewer/CellWidget.h @@ -162,6 +162,7 @@ namespace Hurricane { // Painter control & Hurricane objects drawing primitives. inline void setEnableRedrawInterrupt ( bool ); inline void addDrawExtensionGo ( const Name&, InitExtensionGo_t*, DrawExtensionGo_t* ); + inline void copyDrawExtensionGos ( const CellWidget* ); inline QPainter& getPainter ( size_t plane=PlaneId::Working ); inline const DisplayStyle::HSVr& getDarkening () const; inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, PainterCb_t& ); @@ -176,6 +177,8 @@ namespace Hurricane { bool isDrawableExtension ( const Name& ); bool isSelectable ( const Name& ) const; bool isSelectable ( const Layer* ) const; + bool isPrinter () const; + void setPrinter ( bool ); inline void setDarkening ( const DisplayStyle::HSVr& ); inline void setPen ( const QPen& , size_t plane=PlaneId::Working ); void drawBox ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit ); @@ -452,6 +455,7 @@ namespace Hurricane { , InitExtensionGo_t* , DrawExtensionGo_t* ); + inline void copyDrawExtensionGos ( const DrawingQuery& ); void setDrawExtensionGo ( const Name& ); virtual bool hasMasterCellCallback () const; virtual bool hasGoCallback () const; @@ -647,6 +651,7 @@ namespace Hurricane { QPoint _mousePosition; Spot _spot; shared_ptr _state; + bool _isPrinter; bool _cellChanged; bool _selectionHasChanged; int _delaySelectionChanged; @@ -706,6 +711,10 @@ namespace Hurricane { { _drawExtensionGos[name] = make_pair(initExtensionGo,drawExtensionGo); } + inline void CellWidget::DrawingQuery::copyDrawExtensionGos ( const CellWidget::DrawingQuery& other ) + { _drawExtensionGos = other._drawExtensionGos; } + + inline void CellWidget::DrawingQuery::resetGoCount () { _goCount = 0; } @@ -1145,7 +1154,11 @@ namespace Hurricane { , InitExtensionGo_t* initExtensionGo , DrawExtensionGo_t* drawExtensionGo ) - { _drawingQuery.addDrawExtensionGo ( name, initExtensionGo, drawExtensionGo ); } + { _drawingQuery.addDrawExtensionGo( name, initExtensionGo, drawExtensionGo ); } + + + inline void CellWidget::copyDrawExtensionGos ( const CellWidget* other ) + { _drawingQuery.copyDrawExtensionGos( other->_drawingQuery ); } inline void CellWidget::setStartLevel ( int level ) @@ -1404,6 +1417,14 @@ namespace Hurricane { { _darkening = darkening; } + inline bool CellWidget::isPrinter () const + { return _isPrinter; } + + + inline void CellWidget::setPrinter ( bool state ) + { _isPrinter = state; } + + inline bool CellWidget::timeout ( const char* fname, const Timer& timer, double timeout, bool& timedout ) const { if ( timedout ) return true; diff --git a/katabatic/CMakeLists.txt b/katabatic/CMakeLists.txt index fdb45f0f..f37e40eb 100644 --- a/katabatic/CMakeLists.txt +++ b/katabatic/CMakeLists.txt @@ -18,6 +18,7 @@ find_package(PythonLibs 2 REQUIRED) find_package(PythonSitePackages REQUIRED) + find_package(FLUTE REQUIRED) find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) diff --git a/katana/CMakeLists.txt b/katana/CMakeLists.txt index 52129e56..d5a437c1 100644 --- a/katana/CMakeLists.txt +++ b/katana/CMakeLists.txt @@ -23,6 +23,7 @@ find_package(PythonLibs 2 REQUIRED) find_package(PythonSitePackages REQUIRED) find_package(LEFDEF REQUIRED) + find_package(FLUTE REQUIRED) find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) diff --git a/katana/src/CMakeLists.txt b/katana/src/CMakeLists.txt index e0e50adc..e416bdeb 100644 --- a/katana/src/CMakeLists.txt +++ b/katana/src/CMakeLists.txt @@ -5,6 +5,7 @@ ${CORIOLIS_INCLUDE_DIR} ${HURRICANE_INCLUDE_DIR} ${CONFIGURATION_INCLUDE_DIR} + ${FLUTE_INCLUDE_DIR} ${WtX_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} @@ -95,6 +96,7 @@ ${CIF_LIBRARY} ${AGDS_LIBRARY} ${UTILITIES_LIBRARY} + ${FLUTE_LIBRARIES} ${LEFDEF_LIBRARIES} ${OA_LIBRARIES} ${QtX_LIBRARIES} diff --git a/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp index fb80e7bc..36155378 100644 --- a/katana/src/GlobalRoute.cpp +++ b/katana/src/GlobalRoute.cpp @@ -14,8 +14,10 @@ // +-----------------------------------------------------------------+ +#include "flute.h" #include "hurricane/Warning.h" #include "hurricane/Breakpoint.h" +#include "hurricane/RoutingPad.h" #include "hurricane/Cell.h" #include "anabatic/Dijkstra.h" #include "katana/Block.h" @@ -33,10 +35,13 @@ namespace { using std::left; using std::right; using Hurricane::DbU; - using Hurricane::DbU; + using Hurricane::Interval; using Hurricane::Net; + using Anabatic::Flags; using Anabatic::Edge; + using Anabatic::GCell; using Anabatic::Vertex; + using Anabatic::AnabaticEngine; class DigitalDistance { @@ -76,7 +81,8 @@ namespace { } float congestionCost = 1.0; - float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); + float congestion = ((float)edge->getRealOccupancy() + edge->getEstimateOccupancy()) + / (float)edge->getCapacity(); if (not source->getGCell()->isChannelRow() or not target->getGCell()->isChannelRow()) congestionCost += _h / (1.0 + std::exp(_k * (congestion - 1.0))); @@ -84,10 +90,19 @@ namespace { float viaCost = 0.0; if ( source->getFrom() and (source->getFrom()->isHorizontal() xor edge->isHorizontal()) - and not source->hasGContact(_net) ) { + /*and not source->hasGContact(_net)*/ ) { viaCost += 2.5; } + + float realCongestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); + float historicCost = edge->getHistoricCost(); + if (realCongestion <= 1.0) + historicCost += edge->getEstimateOccupancy() * realCongestion; + else + historicCost += edge->getEstimateOccupancy() * exp( log(8) * (realCongestion - 1.0) ); + //const_cast(edge)->setHistoricCost( historicCost ); + float edgeDistance = (float)edge->getDistance(); if ( (source->getGCell()->isChannelRow() and target->getGCell()->isStdCellRow()) or (source->getGCell()->isStdCellRow() and target->getGCell()->isChannelRow()) ) @@ -96,8 +111,16 @@ namespace { float hvScaling = (edge->isHorizontal()) ? _hScaling : 1.0 ; float distance = (float)source->getDistance() - + (congestionCost + viaCost + edge->getHistoricCost()) * edgeDistance * hvScaling; + + (congestionCost + viaCost + historicCost) * edgeDistance * hvScaling; + cdebug_log(112,0) << "distance:" + << DbU::getValueString(source->getDistance()) << " + (" + << congestionCost << " + " + << viaCost << " + " + << edge->getHistoricCost() << ") * " + << DbU::getValueString(edgeDistance) << " * " + << hvScaling + << endl; // Edge* sourceFrom = source->getFrom(); // if (sourceFrom) { // distance += ((sourceFrom->isHorizontal() xor edge->isHorizontal()) ? 3.0 : 0.0) * (float)Edge::unity; @@ -122,6 +145,25 @@ namespace { } + void updateEstimateDensityOfPath ( AnabaticEngine* anabatic, GCell* source, GCell* target, double weight ) + { + Interval hoverlap = source->getHSide().getIntersection( target->getHSide() ); + Interval voverlap = source->getVSide().getIntersection( target->getVSide() ); + bool straightLine = not (hoverlap.isEmpty() and voverlap.isEmpty()); + double cost = ((straightLine) ? 1.0 : 0.5) * weight; + + for ( Edge* edge : anabatic->getEdgesUnderPath(source,target,Flags::NorthPath) ) { + edge->incEstimateOccupancy( cost ); + } + + if (not straightLine) { + for ( Edge* edge : anabatic->getEdgesUnderPath(source,target,Flags::NoFlags) ) { + edge->incEstimateOccupancy( cost ); + } + } + } + + } // Anonymous namespace. @@ -133,6 +175,11 @@ namespace Katana { using Hurricane::Timer; using Hurricane::Occurrence; using Hurricane::Transformation; + using Hurricane::Horizontal; + using Hurricane::Vertical; + using Hurricane::Contact; + using Hurricane::RoutingPad; + using Hurricane::RoutingPad; using Hurricane::Instance; using Anabatic::EngineState; using Anabatic::Dijkstra; @@ -187,6 +234,76 @@ namespace Katana { } + void KatanaEngine::updateEstimateDensity ( NetData* netData, double weight ) + { + // if ( (netData->getNet()->getName() != "ialu.inv_x2_sig") + // and (netData->getNet()->getName() != "ra(0)") + // and (netData->getNet()->getName() != "iram.oa2a22_x2_11_sig")) return; + + vector targets; + for ( Component* component : netData->getNet()->getComponents() ) { + RoutingPad* rp = dynamic_cast( component ); + if (rp) { + if (not getConfiguration()->selectRpComponent(rp)) + cerr << Warning( "KatanaEngine::updateEstimateDensity(): %s has no components on grid.", getString(rp).c_str() ) << endl; + + Point center = rp->getBoundingBox().getCenter(); + GCell* gcell = getGCellUnder( center ); + + targets.push_back( gcell ); + } + } + + switch ( targets.size() ) { + case 0: + case 1: + return; + case 2: + updateEstimateDensityOfPath( this, targets[0], targets[1], weight ); + return; + default: + { int accuracy = 3; + int* xs = new int [targets.size()]; + int* ys = new int [targets.size()]; + + for ( size_t itarget=0 ; itargetgetCenter(); + xs[ itarget ] = center.getX(); + ys[ itarget ] = center.getY(); + } + + Flute::Tree tree = Flute::flute( targets.size(), xs, ys, accuracy ); + + for ( size_t i=0 ; (int)i < 2*tree.deg - 2 ; ++i ) { + size_t j = tree.branch[i].n; + GCell* source = getGCellUnder( tree.branch[i].x, tree.branch[i].y ); + GCell* target = getGCellUnder( tree.branch[j].x, tree.branch[j].y ); + + if (not source) { + cerr << Error( "KatanaEngine::updateEstimateDensity(): No GCell under (%s,%s) for %s." + , DbU::getValueString((DbU::Unit)tree.branch[i].x).c_str() + , DbU::getValueString((DbU::Unit)tree.branch[i].y).c_str() + , getString(netData->getNet()).c_str() + ) << endl; + continue; + } + if (not target) { + cerr << Error( "KatanaEngine::updateEstimateDensity(): No GCell under (%s,%s) for %s." + , DbU::getValueString((DbU::Unit)tree.branch[j].x).c_str() + , DbU::getValueString((DbU::Unit)tree.branch[j].y).c_str() + , getString(netData->getNet()).c_str() + ) << endl; + continue; + } + + updateEstimateDensityOfPath( this, source, target, weight ); + } + } + return; + } + } + + void KatanaEngine::runGlobalRouter () { if (getState() >= EngineState::EngineGlobalLoaded) @@ -195,6 +312,16 @@ namespace Katana { openSession(); annotateGlobalGraph(); + for ( NetData* netData : getNetOrdering() ) { + if (netData->isGlobalRouted() or netData->isExcluded()) continue; + + updateEstimateDensity( netData, 1.0 ); + netData->setGlobalEstimated( true ); + } + + // Session::close(); + // Breakpoint::stop( 1, "After global routing estimation." ); + // openSession(); startMeasures(); cmess1 << " o Running global routing." << endl; @@ -218,9 +345,16 @@ namespace Katana { do { cmess2 << " [" << setfill(' ') << setw(3) << iteration << "] nets:"; + long wireLength = 0; + long viaCount = 0; + netCount = 0; for ( NetData* netData : getNetOrdering() ) { - if (netData->isGlobalRouted()) continue; + if (netData->isGlobalRouted() or netData->isExcluded()) continue; + if (netData->isGlobalEstimated()) { + updateEstimateDensity( netData, -1.0 ); + netData->setGlobalEstimated( false ); + } distance->setNet( netData->getNet() ); dijkstra->load( netData->getNet() ); @@ -228,13 +362,20 @@ namespace Katana { ++netCount; } cmess2 << left << setw(6) << netCount; - cmess2 << " ovEdges:" << setw(4) << ovEdges.size(); - for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc ); + computeGlobalWireLength( wireLength, viaCount ); + cmess2 << " nWL:" << setw(7) << (wireLength /*+ viaCount*3*/); + cmess2 << " VIAs:" << setw(7) << viaCount; - // Session::close(); - // Breakpoint::stop( 1, "Before riping up overflowed edges." ); - // openSession(); + size_t overflow = ovEdges.size(); + for ( Edge* edge : ovEdges ) { + edge->setHistoricCost( edge->getHistoricCost() + edgeHInc ); + //computeNextHCost( edge, edgeHInc ); + } + + //Session::close(); + //Breakpoint::stop( 1, "Before riping up overflowed edges." ); + //openSession(); netCount = 0; if (iteration < globalIterations - 1) { @@ -256,10 +397,12 @@ namespace Katana { dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 ); } + cmess2 << " ovE:" << setw(4) << overflow; + cmess2 << " ripup:" << setw(4) << netCount << right; suspendMeasures(); - cmess2 << " " << setw(10) << Timer::getStringTime (getTimer().getCombTime()) - << " " << setw( 6) << Timer::getStringMemory(getTimer().getIncrease()) << endl; + cmess2 << " " << setw(5) << Timer::getStringTime (getTimer().getCombTime()) + << " " << setw(6) << Timer::getStringMemory(getTimer().getIncrease()) << endl; resumeMeasures(); ++iteration; @@ -302,5 +445,45 @@ namespace Katana { } + void KatanaEngine::computeGlobalWireLength ( long& wireLength, long& viaCount ) + { + const Layer* hLayer = getConfiguration()->getGHorizontalLayer(); + const Layer* vLayer = getConfiguration()->getGVerticalLayer(); + const Layer* cLayer = getConfiguration()->getGContactLayer(); + + DbU::Unit hWireLength = 0; + DbU::Unit vWireLength = 0; + + for ( NetData* netData : getNetOrdering() ) { + if (not netData->isGlobalRouted()) continue; + + for ( Component* component : netData->getNet()->getComponents() ) { + if (component->getLayer() == hLayer) { + hWireLength += static_cast( component )->getLength(); + } else { + if (component->getLayer() == vLayer) { + vWireLength += static_cast( component )->getLength(); + } else { + if (component->getLayer() == cLayer) { + Contact* contact = static_cast( component ); + size_t gslaves = 0; + + for ( Component* slave : contact->getSlaveComponents().getSubSet() ) { + if (slave->getLayer() == vLayer) { ++viaCount; break; } + // if (slave->getLayer() == hLayer) { + // ++gslaves; + // if (gslaves >= 2) { ++viaCount; break; } + // } + } + } + } + } + } + } + + wireLength = hWireLength / GCell::getMatrixHSide(); + wireLength += vWireLength / GCell::getMatrixVSide(); + } + } // Katana namespace. diff --git a/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp index 5a826b9d..abedcac0 100644 --- a/katana/src/GraphicKatanaEngine.cpp +++ b/katana/src/GraphicKatanaEngine.cpp @@ -92,28 +92,36 @@ namespace Katana { painter.setBrush( Graphics::getColorScale( ColorScale::Fire ).getBrush( density, widget->getDarkening() ) ); painter.drawRect( pixelBb ); } else { - if ( (pixelBb.width() > 150) or (pixelBb.height() > 150) ) { - painter.setPen ( pen ); - painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) ); - painter.drawRect( pixelBb ); + int fontScale = 0; + int halfHeight = 20; + int halfWidth = 80; + if (widget->isPrinter()) { + fontScale = -5; + halfHeight = 9; + halfWidth = 39; + + } + + painter.setPen ( pen ); + painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) ); + painter.drawRect( pixelBb ); - if ( (pixelBb.width() > 300) and (pixelBb.height() > 100) ) { - QString text = QString("id:%1").arg(gcell->getId()); - QFont font = Graphics::getFixedFont( QFont::Bold ); - painter.setFont(font); + if ( (pixelBb.width() > 2*halfWidth) and (pixelBb.height() > 2*halfHeight) ) { + QString text = QString("%1").arg(gcell->getId()); + QFont font = Graphics::getFixedFont( QFont::Normal, false, false, fontScale ); + painter.setFont(font); - pen.setWidth( 1 ); - painter.setPen( pen ); + pen.setWidth( 1 ); + painter.setPen( pen ); - painter.save (); - painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) ); - painter.drawRect ( QRect( -80, -25, 160, 50 ) ); - painter.drawText ( QRect( -80, -25, 160, 50 ) - , text - , QTextOption(Qt::AlignCenter) - ); - painter.restore (); - } + painter.save (); + painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) ); + painter.drawRect ( QRect( -halfWidth, -halfHeight, 2*halfWidth, 2*halfHeight ) ); + painter.drawText ( QRect( -halfWidth, -halfHeight, 2*halfWidth, 2*halfHeight ) + , text + , QTextOption(Qt::AlignCenter) + ); + painter.restore (); } } } @@ -140,11 +148,16 @@ namespace Katana { if (edge) { Box bb = edge->getBoundingBox(); uint32_t occupancy = 255; - if (edge->getRealOccupancy() < edge->getCapacity()) - occupancy = (uint32_t)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) ); + //if (edge->getRealOccupancy() < edge->getCapacity()) + // occupancy = (uint32_t)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) ); + + float edgeOccupancy = edge->getEstimateOccupancy() + (float)edge->getRealOccupancy(); + + if ((unsigned int)edgeOccupancy < edge->getCapacity()) + occupancy = (uint32_t)( 255.0 * (edgeOccupancy / (float)edge->getCapacity()) ); QPainter& painter = widget->getPainter(); - if (edge->getRealOccupancy() > edge->getCapacity()) { + if ((unsigned int)edgeOccupancy > edge->getCapacity()) { QColor color ( Qt::cyan ); painter.setPen( DisplayStyle::darken(color,widget->getDarkening()) ); } @@ -160,7 +173,11 @@ namespace Katana { if (fontHeight > ((edge->isHorizontal()) ? pixelBb.height() : pixelBb.width()) + 4) return; - QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity()); + //QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity()); + QString text = QString("%1/%2 %3") + .arg( edgeOccupancy ) + .arg( edge->getCapacity() ) + .arg( edge->getHistoricCost() ); QColor color ( (occupancy > 170) ? Qt::black : Qt::white ); painter.setPen (DisplayStyle::darken(color,widget->getDarkening())); painter.setFont(font); @@ -342,54 +359,60 @@ namespace Katana { _viewer = viewer; - if (_viewer->hasMenuAction("placeAndRoute.katana.route")) { + if (not _viewer->hasMenuAction("beta")) + _viewer->addMenu( "beta", "Beta", CellViewer::TopMenu ); + if (not _viewer->hasMenuAction("beta.placeAndRoute")) + _viewer->addMenu( "beta.placeAndRoute", "P&&R" ); + + if (_viewer->hasMenuAction("beta.placeAndRoute.route")) { cerr << Warning( "GraphicKatanaEngine::addToMenu() - Katana detailed router already hooked in." ) << endl; return; } - _viewer->addMenu ( "placeAndRoute.katana" , "Katana" ); - _viewer->addMenu ( "placeAndRoute.katana.stepByStep", "&Step by step" ); + _viewer->addMenu ( "beta.placeAndRoute.stepByStep", "&Step by step" ); - _viewer->addToMenu( "placeAndRoute.katana.route" - , "Katana - &Route" + _viewer->addToMenu( "beta.placeAndRoute.route" + , "&Route . . . . . [Katana]" , "Route the design (global & detailed)" , std::bind(&GraphicKatanaEngine::_route,this) + , QIcon() + , "beta.placeAndRoute.stepByStep" ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.========" ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.detailedPreRoute" - , "Katana - Detailed Pre-Route" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.========" ); + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.detailedPreRoute" + , "Detailed Pre-Route . [Katana]" , "Run the Katana detailed router on pre-routed nets" , std::bind(&GraphicKatanaEngine::_runNegociatePreRouted,this) ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.globalRoute" - , "Katana - &Global Route" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.globalRoute" + , "&Global Route . . . [Katana]" , "Run the Katana global router" , std::bind(&GraphicKatanaEngine::_globalRoute,this) ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.detailedRoute" - , "Katana - &Detailed Route" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.detailedRoute" + , "&Detailed Route . . [Katana]" , "Run the Katana detailed router" , std::bind(&GraphicKatanaEngine::_detailRoute,this) ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.finalize" - , "Katana - &Finalize Routing" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.finalize" + , "&Finalize Routing . [Katana]" , "Closing Routing" , std::bind(&GraphicKatanaEngine::_finalize,this) ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.dumpMeasures" - , "Katana - Dump &Measures" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.dumpMeasures" + , "Dump &Measures . . [Katana]" , "Dumping Measurements on the disk" , std::bind(&GraphicKatanaEngine::_dumpMeasures,this) ); - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.save" - , "Katana - &Save Design" +#if NO_NEED_OF_IT_NOW + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.save" + , "&Save Design" , "Save routed design (temporary hack)" , std::bind(&GraphicKatanaEngine::_save,this) ); -#if NO_NEED_OF_IT_NOW - _viewer->addToMenu( "placeAndRoute.katana.stepByStep.runTest" - , "Katana - Run &Test" + _viewer->addToMenu( "beta.placeAndRoute.stepByStep.runTest" + , "Run &Test" , "Run Test Program (symmetric routing of gmChamla)" , std::bind(&GraphicKatanaEngine::_runTest,this) ); diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp index e01dceca..aa353894 100644 --- a/katana/src/KatanaEngine.cpp +++ b/katana/src/KatanaEngine.cpp @@ -18,6 +18,7 @@ #include #include #include +#include "flute.h" #include "vlsisapd/utilities/Path.h" #include "hurricane/DebugSession.h" #include "hurricane/UpdateSession.h" @@ -198,6 +199,9 @@ namespace Katana { void KatanaEngine::_postCreate () { Super::_postCreate (); + + // Flute: load POWV9.dat & POST9.dat + Flute::readLUT( System::getPath("coriolis_top").toString() ); } diff --git a/katana/src/PowerRails.cpp b/katana/src/PowerRails.cpp index 0c6fdb63..a3957548 100644 --- a/katana/src/PowerRails.cpp +++ b/katana/src/PowerRails.cpp @@ -638,7 +638,9 @@ namespace { // - plane->getLayerGauge()->getHalfWireWidth() // - DbU::fromLambda(0.1); DbU::Unit delta = plane->getLayerGauge()->getObstacleDw() - DbU::fromLambda(0.1); - DbU::Unit extension = layer->getExtentionCap(); + DbU::Unit extension = layer->getExtentionCap() - plane->getLayerGauge()->getLayer()->getMinimalSpacing()/2; + //DbU::Unit extension = layer->getExtentionCap() - plane->getLayerGauge()->getHalfPitch() + getHalfWireWidth(); + //DbU::Unit extension = layer->getExtentionCap(); //DbU::Unit extension = Session::getExtentionCap(); //unsigned int type = plane->getLayerGauge()->getType(); const Box& coronaBb = plane->getKatanaEngine()->getChipTools().getCoronaBb(); diff --git a/katana/src/ProtectRoutingPads.cpp b/katana/src/ProtectRoutingPads.cpp index a3ec57f3..ffa29f2d 100644 --- a/katana/src/ProtectRoutingPads.cpp +++ b/katana/src/ProtectRoutingPads.cpp @@ -178,7 +178,7 @@ namespace Katana { for ( Net* net : getCell()->getNets() ) { if (net->isSupply()) continue; - DebugSession::open( net, 140, 150 ); + DebugSession::open( net, 145, 150 ); NetData* data = getNetData( net ); if (data and data->isFixed()) continue; diff --git a/katana/src/PyKatanaEngine.cpp b/katana/src/PyKatanaEngine.cpp index 671c0227..b6cf4092 100644 --- a/katana/src/PyKatanaEngine.cpp +++ b/katana/src/PyKatanaEngine.cpp @@ -14,6 +14,7 @@ // +-----------------------------------------------------------------+ +#include "hurricane/isobar/PyNet.h" #include "hurricane/isobar/PyCell.h" #include "hurricane/viewer/PyCellViewer.h" #include "hurricane/viewer/ExceptionWidget.h" @@ -41,6 +42,8 @@ namespace Katana { using Hurricane::Error; using Hurricane::Warning; using Hurricane::ExceptionWidget; + using Isobar::__cs; + using Isobar::Converter; using Isobar::ProxyProperty; using Isobar::ProxyError; using Isobar::ConstructorError; @@ -48,6 +51,7 @@ namespace Katana { using Isobar::HurricaneWarning; using Isobar::ParseOneArg; using Isobar::ParseTwoArg; + using Isobar::PyNet; using Isobar::PyCell; using Isobar::PyCell_Link; using Isobar::PyCellViewer; @@ -135,8 +139,8 @@ extern "C" { METHOD_HEAD( "KatanaEngine.setViewer()" ) PyObject* pyViewer = NULL; - if (not PyArg_ParseTuple(args,"O:EtesianEngine.setViewer()",&pyViewer)) { - PyErr_SetString( ConstructorError, "Bad parameters given to EtesianEngine.setViewer()." ); + if (not PyArg_ParseTuple(args,"O:KatanaEngine.setViewer()",&pyViewer)) { + PyErr_SetString( ConstructorError, "Bad parameters given to KatanaEngine.setViewer()." ); return NULL; } if (IsPyCellViewer(pyViewer)) { @@ -168,6 +172,29 @@ extern "C" { } + static PyObject* PyKatanaEngine_exclude ( PyKatanaEngine* self, PyObject* args ) + { + cdebug_log(40,0) << "PyKatanaEngine_exclude ()" << endl; + + HTRY + METHOD_HEAD( "KatanaEngine.exclude()" ) + + PyObject* arg0; + __cs.init ("KatanaEngine.exclude"); + + if (not PyArg_ParseTuple(args, "O&:KatanaEngine.exclude", Converter, &arg0)) { + PyErr_SetString( ConstructorError, "Bad parameters given to KatanaEngine.exclude()." ); + return NULL; + } + + if (__cs.getObjectIds() == STRING_ARG) { katana->exclude( PyString_AsString(arg0) ); } + else if (__cs.getObjectIds() == NET_ARG ) { katana->exclude( PYNET_O(arg0) ); } + HCATCH + + Py_RETURN_NONE; + } + + PyObject* PyKatanaEngine_runGlobalRouter ( PyKatanaEngine* self ) { cdebug_log(40,0) << "PyKatanaEngine_runGlobalRouter()" << endl; @@ -230,7 +257,7 @@ extern "C" { failure = ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::layerAssign,katana,flags) ); if (failure) { - PyErr_SetString( HurricaneError, "EtesianEngine::place() has thrown an exception (C++)." ); + PyErr_SetString( HurricaneError, "KatanaEngine::layerAssign() has thrown an exception (C++)." ); return NULL; } } else { @@ -275,7 +302,7 @@ extern "C" { if (PyArg_ParseTuple(args,"I:KatanaEngine.runNegociate", &flags)) { if (katana->getViewer()) { if (ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::runNegociate,katana,flags) )) { - PyErr_SetString( HurricaneError, "EtesianEngine::runNegociate() has thrown an exception (C++)." ); + PyErr_SetString( HurricaneError, "KatanaEngine::runNegociate() has thrown an exception (C++)." ); return NULL; } } else { @@ -309,6 +336,8 @@ extern "C" { , "Associate a Viewer to this KatanaEngine." } , { "digitalInit" , (PyCFunction)PyKatanaEngine_digitalInit , METH_NOARGS , "Setup Katana for digital routing." } + , { "exclude" , (PyCFunction)PyKatanaEngine_exclude , METH_VARARGS + , "Exclude a net from routing." } , { "printConfiguration" , (PyCFunction)PyKatanaEngine_printConfiguration , METH_NOARGS , "Display on the console the configuration of Katana." } , { "getToolSuccess" , (PyCFunction)PyKatanaEngine_getToolSuccess , METH_NOARGS diff --git a/katana/src/RoutingEvent.cpp b/katana/src/RoutingEvent.cpp index a586963b..05f4980f 100644 --- a/katana/src/RoutingEvent.cpp +++ b/katana/src/RoutingEvent.cpp @@ -602,7 +602,8 @@ namespace Katana { cdebug_log(159,0) << "| " << perpandicular << endl; fsm.addAction( perpandicular, SegmentAction::SelfInsert ); DataNegociate* data = perpandicular->getDataNegociate(); - if (data) data->setState( DataNegociate::Repair ); + if (data and (data->getState() < DataNegociate::Repair)) + data->setState( DataNegociate::Repair ); } } fsm.doActions(); diff --git a/katana/src/SymmetricRoute.cpp b/katana/src/SymmetricRoute.cpp index e7168907..fc0ff782 100644 --- a/katana/src/SymmetricRoute.cpp +++ b/katana/src/SymmetricRoute.cpp @@ -137,7 +137,7 @@ namespace { if (not _data) return false; if (not _data->isValid()) return _data->isValid(); - DebugSession::open( _data->getNet(), 144, 146 ); + DebugSession::open( _data->getNet(), 145, 146 ); // Temporary. //_data->setSymAxis( _katana->getCell()->getAbutmentBox().getCenter().getX() ); diff --git a/katana/src/Track.cpp b/katana/src/Track.cpp index 6c1b8c52..56ba691b 100644 --- a/katana/src/Track.cpp +++ b/katana/src/Track.cpp @@ -392,9 +392,9 @@ namespace Katana { Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const { - uint32_t state; - size_t begin; - size_t end; + uint32_t state = 0; + size_t begin = 0; + size_t end = 0; if (_segments.empty()) return Interval(_min,_max); @@ -429,6 +429,8 @@ namespace Katana { } if (not (state & EndIsTrackMax) ) { + if (state & EndIsNextSegmentMin) ++end; + if (_segments[end]->getNet() == net) { getNext( end, net ); @@ -439,6 +441,7 @@ namespace Katana { setMaximalFlags( state, EndIsSegmentMin ); } } + cdebug_log(155,0) << "end:" << end << " state:" << state << endl; } cdebug_tabw(155,-1); diff --git a/katana/src/katana/KatanaEngine.h b/katana/src/katana/KatanaEngine.h index 85c44487..0540c489 100644 --- a/katana/src/katana/KatanaEngine.h +++ b/katana/src/katana/KatanaEngine.h @@ -44,6 +44,7 @@ namespace Katana { using Hurricane::CellViewer; using CRL::RoutingGauge; using Anabatic::AnabaticEngine; + using Anabatic::NetData; class Block; class Track; @@ -123,8 +124,10 @@ namespace Katana { void digitalInit (); void analogInit (); void pairSymmetrics (); + void updateEstimateDensity ( NetData*, double weight ); void runNegociate ( Flags flags=Flags::NoFlags ); void runGlobalRouter (); + void computeGlobalWireLength ( long& wireLength, long& viaCount ); void runTest (); virtual void finalizeLayout (); void _runKatanaInit (); diff --git a/kite/CMakeLists.txt b/kite/CMakeLists.txt index dea5d107..ba298a44 100644 --- a/kite/CMakeLists.txt +++ b/kite/CMakeLists.txt @@ -19,6 +19,7 @@ find_package(LibXml2 REQUIRED) find_package(PythonLibs 2 REQUIRED) find_package(PythonSitePackages REQUIRED) + find_package(FLUTE REQUIRED) find_package(VLSISAPD REQUIRED) find_package(LEFDEF REQUIRED) find_package(HURRICANE REQUIRED) diff --git a/kite/src/CMakeLists.txt b/kite/src/CMakeLists.txt index 7b7d1ca1..2c05d319 100644 --- a/kite/src/CMakeLists.txt +++ b/kite/src/CMakeLists.txt @@ -5,6 +5,7 @@ ${CORIOLIS_INCLUDE_DIR} ${HURRICANE_INCLUDE_DIR} ${CONFIGURATION_INCLUDE_DIR} + ${FLUTE_INCLUDE_DIR} ${WtX_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} @@ -85,6 +86,7 @@ ${CIF_LIBRARY} ${AGDS_LIBRARY} ${UTILITIES_LIBRARY} + ${FLUTE_LIBRARIES} ${LEFDEF_LIBRARIES} ${OA_LIBRARIES} ${QtX_LIBRARIES} diff --git a/kite/src/GraphicKiteEngine.cpp b/kite/src/GraphicKiteEngine.cpp index 8cfa41ae..d166ebdb 100644 --- a/kite/src/GraphicKiteEngine.cpp +++ b/kite/src/GraphicKiteEngine.cpp @@ -285,57 +285,59 @@ namespace Kite { } _viewer->addToMenu( "placeAndRoute.route" - , "Kite - &Route" - , "Route the design (global & detailed)" + , "&Route" + , "Complete routing of the design (global, detailed and finalize) [Kite]" , std::bind(&GraphicKiteEngine::_route,this) + , QIcon() + , "placeAndRoute.stepByStep" ); _viewer->addToMenu( "placeAndRoute.stepByStep.========" ); _viewer->addToMenu( "placeAndRoute.stepByStep.wipeoutRouting" - , "Kite - Erase Previous Routing" + , "Erase Previous Routing" , "Erase any previously routed wires" , std::bind(&GraphicKiteEngine::_wipeoutRouting,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.detailedPreRoute" - , "Kite - Detailed Pre-Route" - , "Run the Kite detailed router on pre-routed nets" + , "Detailed Pre-Route" + , "Run the detailed router on global pre-routed nets [Kite]" , std::bind(&GraphicKiteEngine::_runNegociatePreRouted,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.globalRoute" - , "Kite - &Global Route" - , "Run the Knik global router" + , "&Global Route" + , "Run the global router [nik]" , std::bind(&GraphicKiteEngine::_globalRoute,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.loadGlobalRouting" - , "Kite - &Load Global Routing" - , "Load a solution for the global routing (.kgr)" + , "&Load Global Routing" + , "Load a solution for the global routing (.kgr) [Knik]" , std::bind(&GraphicKiteEngine::_loadGlobalSolution,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.saveGlobalRouting" - , "Kite - &Save Global Routing" - , "Save a global router solution (.kgr)" + , "&Save Global Routing" + , "Save a global router solution (.kgr) [Knik]" , std::bind(&GraphicKiteEngine::_saveGlobalSolution,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.detailedRoute" - , "Kite - &Detailed Route" - , "Run the Kite detailed router" + , "&Detailed Route" + , "Run the detailed router [Kite]" , std::bind(&GraphicKiteEngine::_detailRoute,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.finalize" - , "Kite - &Finalize Routing" - , "Closing Routing" + , "&Finalize Routing" + , "Cleanup all routing related data structures [Kite]" , std::bind(&GraphicKiteEngine::_finalize,this) ); _viewer->addToMenu( "placeAndRoute.stepByStep.dumpMeasures" - , "Kite - Dump &Measures" - , "Dumping Measurements on the disk" + , "Dump &Measures" + , "Dumping Measurements on the disk [Kite]" , std::bind(&GraphicKiteEngine::_dumpMeasures,this) ); - _viewer->addToMenu( "placeAndRoute.stepByStep.save" - , "Kite - &Save Design" - , "Save routed design (temporary hack)" - , std::bind(&GraphicKiteEngine::_save,this) - ); + // _viewer->addToMenu( "placeAndRoute.stepByStep.save" + // , "&Save Design" + // , "Save routed design (temporary hack)" + // , std::bind(&GraphicKiteEngine::_save,this) + // ); } diff --git a/kite/src/KiteEngine.cpp b/kite/src/KiteEngine.cpp index 91c57f50..9ed668f1 100644 --- a/kite/src/KiteEngine.cpp +++ b/kite/src/KiteEngine.cpp @@ -593,6 +593,16 @@ namespace Kite { if (istate.second->isMixedPreRoute()) preRouteds.insert( make_pair(istate.first, istate.second->getNet()) ); } + //for ( Net* net : getCell()->getNets() ) { + // if (net->getName() == "ialu.aux28") continue; + // if (net->getName() == "iram.not_aux109") continue; + // if (net->getName() == "s(0)") continue; + // if (net->getName() == "s(3)") continue; + // if (net->getName() == "r(1)") continue; + // if (net->getName() == "r(2)") continue; + + // preRouteds.insert( make_pair(net->getName(), net) ); + //} _knik->run( preRouteds ); } diff --git a/knik/CMakeLists.txt b/knik/CMakeLists.txt index 66064dc3..97d68038 100644 --- a/knik/CMakeLists.txt +++ b/knik/CMakeLists.txt @@ -16,9 +16,10 @@ setup_boost(program_options filesystem python regex) setup_qt() - find_package(VLSISAPD REQUIRED) + find_package(FLUTE REQUIRED) + find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) - find_package(CORIOLIS REQUIRED) + find_package(CORIOLIS REQUIRED) add_subdirectory(src) add_subdirectory(cmake_modules) diff --git a/knik/src/CMakeLists.txt b/knik/src/CMakeLists.txt index e4019571..a952177c 100644 --- a/knik/src/CMakeLists.txt +++ b/knik/src/CMakeLists.txt @@ -3,6 +3,7 @@ # include ( ${QT_USE_FILE} ) include_directories ( ${KNIK_SOURCE_DIR}/src ${KNIK_SOURCE_DIR}/src/flute-3.1/src + ${FLUTE_INCLUDE_DIR} ${HURRICANE_INCLUDE_DIR} ${CORIOLIS_INCLUDE_DIR} ${UTILITIES_INCLUDE_DIR} @@ -39,35 +40,12 @@ KnikEngine.cpp GraphicKnikEngine.cpp ) - set ( fluteIncludes flute-3.1/src/knik/flute.h - flute-3.1/src/knik/dl.h - flute-3.1/src/knik/mst2.h - flute-3.1/src/knik/err.h - flute-3.1/src/knik/heap.h - flute-3.1/src/knik/dist.h - flute-3.1/src/knik/global.h - flute-3.1/src/knik/neighbors.h - ) - set ( fluteCpps flute-3.1/src/flute.cpp - flute-3.1/src/flute_mst.cpp - flute-3.1/src/dist.cpp - flute-3.1/src/dl.cpp - flute-3.1/src/err.cpp - flute-3.1/src/mst2.cpp - flute-3.1/src/heap.cpp - flute-3.1/src/neighbors.cpp - ) qtX_wrap_cpp ( mocCpps ${mocIncludes} ) - add_library ( flute ${fluteCpps} ) - set_target_properties ( flute PROPERTIES VERSION 3.1 SOVERSION 3 ) - target_link_libraries ( flute ${HURRICANE_LIBRARIES} - ${CORIOLIS_LIBRARIES} - ) add_library ( knik ${cpps} ${mocCpps} ) set_target_properties ( knik PROPERTIES VERSION 1.0 SOVERSION 1 ) - target_link_libraries ( knik flute + target_link_libraries ( knik ${FLUTE_LIBRARY} ${HURRICANE_PYTHON_LIBRARIES} ${HURRICANE_GRAPHICAL_LIBRARIES} ${HURRICANE_LIBRARIES} @@ -83,9 +61,6 @@ ${PYTHON_LIBRARIES} -lutil ) - install ( TARGETS knik flute DESTINATION lib${LIB_SUFFIX} ) + install ( TARGETS knik DESTINATION lib${LIB_SUFFIX} ) install ( FILES ${includes} - ${mocIncludes} - ${fluteIncludes} DESTINATION include/coriolis2/knik ) - install ( FILES flute-3.1/etc/POST9.dat - flute-3.1/etc/POWV9.dat DESTINATION share/coriolis2/flute-3.1 ) + ${mocIncludes} DESTINATION include/coriolis2/knik ) diff --git a/knik/src/Graph.cpp b/knik/src/Graph.cpp index a4e12972..91335776 100644 --- a/knik/src/Graph.cpp +++ b/knik/src/Graph.cpp @@ -4,6 +4,8 @@ #include #include +#include "flute.h" + #include "hurricane/DebugSession.h" #include "hurricane/Warning.h" #include "hurricane/Error.h" @@ -33,7 +35,6 @@ #include "knik/VEdge.h" #include "knik/KnikEngine.h" -#include "knik/flute.h" //#define __USE_SLICINGTREE__ #define __USE_MATRIXVERTEX__ @@ -1524,14 +1525,14 @@ void Graph::Monotonic() //#endif } -FTree* Graph::createFluteTree() +Tree* Graph::createFluteTree() // **************************** { int accuracy = 3; // accuracy for flute (by default 3) int d = _vertexes_to_route.size(); // degre du net, ie nombre de routingPads int *x = new int [d]; // x coordinates of the vertexes int *y = new int [d]; // y coordinates of the vertexes - FTree* flutetree = new FTree; // the flute Steiner Tree + Tree* flutetree = new Tree; // the flute Steiner Tree //cout << "Net : " << _working_net << endl; // scans _working_net to find x,y coordinates and fill x, y and d @@ -1548,7 +1549,7 @@ FTree* Graph::createFluteTree() assert ( d == cpt ); - *flutetree = flute ( d, x, y, accuracy ); + *flutetree = Flute::flute ( d, x, y, accuracy ); //printtree ( flutetree ); //plottree ( flutetree ); //cout << endl; @@ -1561,9 +1562,9 @@ void Graph::UpdateEstimateCongestion ( bool create ) if ( _vertexes_to_route.size() < 2 ) return; //cerr << "Running FLUTE for net : " << _working_net << endl; - unique_ptr flutetree ( createFluteTree() ); + unique_ptr flutetree ( createFluteTree() ); - //parcours des branches du FTree pour créer la congestion estimée + //parcours des branches du Tree pour créer la congestion estimée for ( int i = 0 ; i < 2*flutetree->deg-2 ; i++ ) { // int sourceX = flutetree->branch[i].x; // int sourceY = flutetree->branch[i].y; diff --git a/knik/src/KnikEngine.cpp b/knik/src/KnikEngine.cpp index 8e026b1c..325fd3b1 100644 --- a/knik/src/KnikEngine.cpp +++ b/knik/src/KnikEngine.cpp @@ -15,6 +15,7 @@ #include +#include "flute.h" #include "hurricane/Warning.h" #include "hurricane/Property.h" #include "hurricane/NetRoutingProperty.h" @@ -40,7 +41,6 @@ #include "knik/RoutingGrid.h" #include "knik/NetExtension.h" #include "knik/KnikEngine.h" -#include "knik/flute.h" #define MAX_RUNTIME 86400 @@ -134,7 +134,7 @@ void KnikEngine::_postCreate() Inherit::_postCreate(); // For Flute : readLUT to be able to use POWV9.dat & POST9.dat - readLUT(); + Flute::readLUT( AllianceFramework::get()->getEnvironment()->getCORIOLIS_TOP() ); return; } diff --git a/knik/src/flute-3.1/src/knik/err.h b/knik/src/flute-3.1/src/knik/err.h deleted file mode 100644 index a35724e6..00000000 --- a/knik/src/flute-3.1/src/knik/err.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef _ERR_H_ -#define _ERR_H_ - -void err_msg( -char* msg -); - -void err_exit( -char* msg -); - -#endif diff --git a/knik/src/knik/Graph.h b/knik/src/knik/Graph.h index 6d8eaf82..b8bc6c5c 100644 --- a/knik/src/knik/Graph.h +++ b/knik/src/knik/Graph.h @@ -28,7 +28,11 @@ #include "knik/SlicingTree.h" #include "knik/RoutingGrid.h" -struct FTree; +namespace Flute { + struct Tree; +} +using Flute::Tree; + namespace Knik { @@ -153,7 +157,7 @@ namespace Knik { int initRouting ( Net* net ); void Dijkstra (); void Monotonic (); - FTree* createFluteTree (); + Tree* createFluteTree (); void CleanRoutingState (); void UpdateEstimateCongestion ( bool create = false ); void UpdateMaxEstimateCongestion (); diff --git a/tutorial/python/runDemo.py b/tutorial/python/runDemo.py index 3c8e9e01..40d8f7df 100644 --- a/tutorial/python/runDemo.py +++ b/tutorial/python/runDemo.py @@ -141,9 +141,9 @@ def runDemo ( cell, editor ): def unicornHook ( **kw ): editor = kw['editor'] editor.addMenu( 'tutorials' , 'Tutorials', Viewer.CellViewer.TopMenu ) - editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags ) - plugins.kwUnicornHook( 'tutorials.plugins.runDemo' - , 'Tutorial - Run Demo (Python flavor)' + #editor.addMenu( 'tutorials.plugins', 'Plugins' , Viewer.CellViewer.NoFlags ) + plugins.kwUnicornHook( 'tutorials.runDemo' + , 'Run Demo (Python flavor)' , 'Launch runDemo() in the Tutorial Python plugin.' , sys.modules[__name__].__file__ , **kw diff --git a/unicorn/CMakeLists.txt b/unicorn/CMakeLists.txt index 1e20a760..6a93dd34 100644 --- a/unicorn/CMakeLists.txt +++ b/unicorn/CMakeLists.txt @@ -20,6 +20,7 @@ find_package(PythonSitePackages REQUIRED) find_package(LEFDEF REQUIRED) find_package(COLOQUINTE) + find_package(FLUTE REQUIRED) find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED) diff --git a/unicorn/python/unicornInit.py b/unicorn/python/unicornInit.py index 4cb2e7a1..012c507a 100644 --- a/unicorn/python/unicornInit.py +++ b/unicorn/python/unicornInit.py @@ -67,7 +67,7 @@ def unicornConfigure ( **kw ): print WarningMessage( 'The menu has already been created.' ) return - editor.addMenu( 'plugins', 'Plu&gins', Viewer.CellViewer.TopMenu ) + #editor.addMenu( 'plugins', 'Plu&gins', Viewer.CellViewer.TopMenu ) for pluginFile in os.listdir( pluginsDir ): if pluginFile == "__init__.py": continue diff --git a/unicorn/src/CMakeLists.txt b/unicorn/src/CMakeLists.txt index fe8fab2d..fcb98b4b 100644 --- a/unicorn/src/CMakeLists.txt +++ b/unicorn/src/CMakeLists.txt @@ -64,6 +64,7 @@ ${UTILITIES_LIBRARY} ${CONFIGURATION_LIBRARY} ${COLOQUINTE_LIBRARIES} + ${FLUTE_LIBRARIES} ${LEFDEF_LIBRARIES} ${OA_LIBRARIES} ${QtX_LIBRARIES} diff --git a/unicorn/src/UnicornGui.cpp b/unicorn/src/UnicornGui.cpp index 1cf14f46..a7f19462 100644 --- a/unicorn/src/UnicornGui.cpp +++ b/unicorn/src/UnicornGui.cpp @@ -98,7 +98,7 @@ namespace Unicorn { _importCell.setDialog( _importDialog ); _importCell.addImporter ( "JSON (experimental)" , std::bind( &Cell::fromJson , placeholders::_1 ) ); - _importCell.addImporter ( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1 ) ); + _importCell.addImporter ( "BLIF (Yosys/ABC)" , std::bind( &Blif::load , placeholders::_1, true ) ); _importCell.addImporter ( "ACM/SIGDA (aka MCNC, .bench)", std::bind( &AcmSigda::load , placeholders::_1 ) ); _importCell.addImporter ( "ISPD'04 (Bookshelf)" , std::bind( &Ispd04::load , placeholders::_1 ) ); _importCell.addImporter ( "ISPD'05 (Bookshelf)" , std::bind( &Ispd05::load , placeholders::_1 ) ); @@ -186,6 +186,8 @@ namespace Unicorn { , tr("Library Manager") , tr("Browse through Views, Cells & Libraries") , QKeySequence(tr("CTRL+M")) + , QIcon() + , "tools.script" ); connect( action, SIGNAL(triggered()), _libraryManager, SLOT(toggleShow()) ); connect( this , SIGNAL(cellLoadedFromDisk(Cell*)), _libraryManager, SLOT(updateLibrary(Cell*)) ); diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py index d62dcc17..9383a3a5 100755 --- a/unicorn/src/cgt.py +++ b/unicorn/src/cgt.py @@ -16,6 +16,7 @@ try: import Katabatic import Kite import Bora + import Tutorial import Unicorn except ImportError, e: serror = str(e) @@ -114,6 +115,7 @@ if __name__ == '__main__': parser.add_option( '-D', '--core-dump' , action='store_true', dest='coreDump' , help='Enable core-dump when a crash occurs.') parser.add_option( '-L', '--log-mode' , action='store_true', dest='logMode' , help='Disable ANSI escape sequences in console output.') parser.add_option( '-t', '--text' , action='store_true', dest='textMode' , help='Run in command line mode.') + parser.add_option( '-K', '--use-katana' , action='store_true', dest='useKatana' , help='Use Katana instead of Knik/Kite router.') parser.add_option( '-m', '--margin' , type='float' , dest='margin' , help='Percentage of free area to add to the minimal placement area.') parser.add_option( '-P', '--place' , action='store_true', dest='place' , help='Run the analytical placer (Etesian).') parser.add_option( '-G', '--global-route' , action='store_true', dest='globalRoute' , help='Run the global router (Knik).') @@ -129,7 +131,8 @@ if __name__ == '__main__': (options, args) = parser.parse_args() args.insert(0, 'cgt') - flags = 0 + useKatana = False + flags = 0 if options.noInit: flags |= CRL.AllianceFramework.NoPythonInit @@ -151,6 +154,7 @@ if __name__ == '__main__': if options.vTracksLocal: Cfg.getParamInt ('kite.vTracksReservedLocal').setInt(options.vTracksLocal) if options.eventsLimit: Cfg.getParamInt ('kite.eventsLimit' ).setInt(options.eventsLimit) if options.topRoutingLayer: Cfg.getParamString ('katabatic.topRoutingLayer').setString(options.topRoutingLayer) + if options.useKatana: useKatana = True loadGlobal = options.loadGlobal saveGlobal = options.saveGlobal @@ -183,10 +187,11 @@ if __name__ == '__main__': unicorn = Unicorn.UnicornGui.create() unicorn.setApplicationName ('cgt') - unicorn.registerTool (Katana.GraphicKatanaEngine.grab()) unicorn.registerTool (Etesian.GraphicEtesianEngine.grab()) unicorn.registerTool (Kite.GraphicKiteEngine.grab()) + unicorn.registerTool (Katana.GraphicKatanaEngine.grab()) unicorn.registerTool (Bora.GraphicBoraEngine.grab()) + unicorn.registerTool (Tutorial.GraphicTutorialEngine.grab()) #unicorn.setAnonNetSelectable(False) unicorn.setLayerVisible ("grid" , False); unicorn.setLayerVisible ("text.instance" , False); @@ -196,8 +201,8 @@ if __name__ == '__main__': runScript(options.script,unicorn) setCgtBanner(unicorn.getBanner()) - print unicorn.getBanner() - print credits() + #print unicorn.getBanner() + #print credits() if cell: unicorn.setCell(cell) unicorn.show() @@ -214,6 +219,21 @@ if __name__ == '__main__': if detailRoute and not (loadGlobal or globalRoute): globalRoute = True runKiteTool = loadGlobal or globalRoute or detailRoute + if useKatana and runKiteTool: + runKiteTool = False + + katana = Katana.KatanaEngine.create( cell ) + #katana.printConfiguration () + katana.digitalInit () + #katana.runNegociatePreRouted() + katana.runGlobalRouter () + katana.loadGlobalRouting ( Anabatic.EngineLoadGrByNet ) + katana.layerAssign ( Anabatic.EngineNoNetLayerAssign ) + katana.runNegociate ( Katana.Flags.NoFlags ) + kiteSuccess = katana.getToolSuccess() + #katana.finalizeLayout() + katana.destroy() + if runKiteTool: if loadGlobal: globalFlags = Kite.KtLoadGlobalRouting else: globalFlags = Kite.KtBuildGlobalRouting diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index 789013cd..405db044 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -23,6 +23,7 @@ find_package(Libexecinfo REQUIRED) find_package(PythonLibs 2 REQUIRED) find_package(PythonSitePackages REQUIRED) + find_package(LEFDEF) find_package(VLSISAPD REQUIRED) find_package(HURRICANE REQUIRED) find_package(CORIOLIS REQUIRED)