diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index c1c0f50f..0c5c3f6f 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -79,8 +79,8 @@ namespace Anabatic { Point sourcePosition = segment->getSourcePosition(); Point targetPosition = segment->getTargetPosition(); - if ( (sourcePosition.getX() >= gcellsArea.getXMax()) - or (sourcePosition.getY() >= gcellsArea.getYMax()) + if ( (sourcePosition.getX() > gcellsArea.getXMax()) + or (sourcePosition.getY() > gcellsArea.getYMax()) or (targetPosition.getX() <= gcellsArea.getXMin()) or (targetPosition.getY() <= gcellsArea.getYMin()) ) { cerr << Error( "RawGCellsUnder::RawGCellsUnder(): %s is completly outside the GCells area (ignored)." @@ -958,6 +958,14 @@ namespace Anabatic { { _timer.stop(); } + void AnabaticEngine::suspendMeasures () + { _timer.suspend(); } + + + void AnabaticEngine::resumeMeasures () + { _timer.resume(); } + + void AnabaticEngine::printMeasures ( const string& tag ) const { ostringstream result; diff --git a/anabatic/src/CMakeLists.txt b/anabatic/src/CMakeLists.txt index 6cdec98c..e59cfd29 100644 --- a/anabatic/src/CMakeLists.txt +++ b/anabatic/src/CMakeLists.txt @@ -18,7 +18,6 @@ endif ( CHECK_DETERMINISM ) anabatic/Edge.h anabatic/Edges.h anabatic/GCell.h #anabatic/GCells.h anabatic/AnabaticEngine.h - anabatic/GraphicAnabaticEngine.h anabatic/Dijkstra.h anabatic/AutoContact.h @@ -32,10 +31,7 @@ endif ( CHECK_DETERMINISM ) anabatic/Session.h anabatic/ChipTools.h ) - set( mocIncludes anabatic/GraphicAnabaticEngine.h ) - set( pyIncludes anabatic/PyAnabaticEngine.h - anabatic/PyGraphicAnabaticEngine.h - ) + set( pyIncludes ) set( cpps Constants.cpp Configuration.cpp Matrix.cpp @@ -43,8 +39,6 @@ endif ( CHECK_DETERMINISM ) Edges.cpp GCell.cpp AnabaticEngine.cpp - GlobalRoute.cpp - GraphicAnabaticEngine.cpp Dijkstra.cpp AutoContact.cpp @@ -63,11 +57,8 @@ endif ( CHECK_DETERMINISM ) LayerAssign.cpp PreRouteds.cpp ) - set( pyCpps PyAnabaticEngine.cpp - PyGraphicAnabaticEngine.cpp - PyAnabatic.cpp + set( pyCpps PyAnabatic.cpp ) - qtX_wrap_cpp( mocCpps ${mocIncludes} ) set( depLibs ${CORIOLIS_PYTHON_LIBRARIES} ${CORIOLIS_LIBRARIES} @@ -85,7 +76,7 @@ endif ( CHECK_DETERMINISM ) ${PYTHON_LIBRARIES} -lutil ) - add_library( anabatic ${cpps} ${mocCpps} ) + add_library( anabatic ${cpps} ) set_target_properties( anabatic PROPERTIES VERSION 1.0 SOVERSION 1 ) target_link_libraries( anabatic ${depLibs} ) @@ -97,7 +88,6 @@ endif ( CHECK_DETERMINISM ) include/coriolis2/anabatic ) - install( TARGETS anabatic DESTINATION lib${LIB_SUFFIX} ) - install( FILES ${includes} - ${mocIncludes} DESTINATION include/coriolis2/anabatic ) + install( TARGETS anabatic DESTINATION lib${LIB_SUFFIX} ) + install( FILES ${includes} DESTINATION include/coriolis2/anabatic ) diff --git a/anabatic/src/Configuration.cpp b/anabatic/src/Configuration.cpp index 89dbded6..843e6922 100644 --- a/anabatic/src/Configuration.cpp +++ b/anabatic/src/Configuration.cpp @@ -30,6 +30,7 @@ #include "crlcore/RoutingLayerGauge.h" #include "crlcore/AllianceFramework.h" #include "anabatic/Configuration.h" +#include "anabatic/GCell.h" @@ -71,6 +72,8 @@ namespace Anabatic { , _edgeCostK (Cfg::getParamDouble("anabatic.edgeCostK",-10.0)->asDouble()) , _edgeHInc (Cfg::getParamDouble("anabatic.edgeHInc" , 1.5)->asDouble()) { + GCell::setDisplayMode( Cfg::getParamEnumerate("anabatic.gcell.displayMode", GCell::Boundary)->asInt() ); + if (cg == NULL) cg = AllianceFramework::get()->getCellGauge(); if (rg == NULL) rg = AllianceFramework::get()->getRoutingGauge(); _cg = cg->getClone(); @@ -122,6 +125,8 @@ namespace Anabatic { , _edgeCostK (other._edgeCostK) , _edgeHInc (other._edgeHInc) { + GCell::setDisplayMode( Cfg::getParamEnumerate("anabatic.gcell.displayMode", GCell::Boundary)->asInt() ); + if (other._cg) _cg = other._cg->getClone(); if (other._rg) _rg = other._rg->getClone(); } diff --git a/anabatic/src/Edge.cpp b/anabatic/src/Edge.cpp index 68b50c7a..5323bf4a 100644 --- a/anabatic/src/Edge.cpp +++ b/anabatic/src/Edge.cpp @@ -315,12 +315,16 @@ namespace Anabatic { string Edge::_getString () const { + Point center ( getSource()->getCenter() ); + string s = Super::_getString(); - s.insert( s.size()-1, " "+DbU::getValueString(_axis) ); - s.insert( s.size()-1, " "+getString(_realOccupancy) ); - s.insert( s.size()-1, "/"+getString(_capacity) ); - s.insert( s.size()-1, " h:"+getString(_historicCost) ); - s.insert( s.size()-1, " "+getString(_flags) ); + s.insert( s.size()-1, " S:["+DbU::getValueString(center.getX()) ); + s.insert( s.size()-1, " " +DbU::getValueString(center.getY()) ); + s.insert( s.size()-1, "] " +DbU::getValueString(_axis) ); + s.insert( s.size()-1, " " +getString(_realOccupancy) ); + s.insert( s.size()-1, "/" +getString(_capacity) ); + s.insert( s.size()-1, " h:" +getString(_historicCost) ); + s.insert( s.size()-1, " " +getString(_flags) ); return s; } diff --git a/anabatic/src/GCell.cpp b/anabatic/src/GCell.cpp index 8204a2b3..1189e8ce 100644 --- a/anabatic/src/GCell.cpp +++ b/anabatic/src/GCell.cpp @@ -17,6 +17,7 @@ #include #include "hurricane/Bug.h" #include "hurricane/Warning.h" +#include "hurricane/Breakpoint.h" #include "hurricane/Contact.h" #include "hurricane/RoutingPad.h" #include "hurricane/UpdateSession.h" @@ -270,7 +271,12 @@ namespace Anabatic { // ------------------------------------------------------------------- // Class : "Anabatic::GCell". - Name GCell::_extensionName = "Anabatic::GCell"; + Name GCell::_extensionName = "Anabatic::GCell"; + unsigned int GCell::_displayMode = GCell::Boundary; + + + unsigned int GCell::getDisplayMode () { return _displayMode; } + void GCell::setDisplayMode ( unsigned int mode ) { _displayMode = mode; } GCell::GCell ( AnabaticEngine* anabatic, DbU::Unit xmin, DbU::Unit ymin ) @@ -720,12 +726,9 @@ namespace Anabatic { { getAnabatic()->openSession(); - //const vector& gcells = getAnabatic()->getGCells(); - //size_t ibegin = gcells.size(); - DbU::Unit side = Session::getSliceHeight(); - - Interval hspan = getSide( Flags::Horizontal ); - Interval vspan = getSide( Flags::Vertical ); + DbU::Unit side = Session::getSliceHeight(); + Interval hspan = getSide( Flags::Horizontal ); + Interval vspan = getSide( Flags::Vertical ); if (hspan.getSize() < 3*side) { cerr << Error( "GCell::doGrid(): GCell is too narrow (dx:%s) to build a grid.\n" diff --git a/anabatic/src/GlobalRoute.cpp b/anabatic/src/GlobalRoute.cpp deleted file mode 100644 index 587380f1..00000000 --- a/anabatic/src/GlobalRoute.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// -*- mode: C++; explicit-buffer-name: "GlobalRoute.cpp" -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Module : "./GlobalRoute.cpp" | -// +-----------------------------------------------------------------+ - - -#include -#include -#include "hurricane/Error.h" -#include "hurricane/RegularLayer.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Vertical.h" -#include "hurricane/Cell.h" -#include "hurricane/UpdateSession.h" -#include "hurricane/DebugSession.h" -#include "crlcore/RoutingGauge.h" -#include "anabatic/GCell.h" -#include "anabatic/Dijkstra.h" -#include "anabatic/AnabaticEngine.h" - - -namespace { - - using std::cerr; - using std::endl; - using std::setw; - using std::left; - using std::right; - using Hurricane::DbU; - using Anabatic::Edge; - using Anabatic::Vertex; - - - class DigitalDistance { - public: - inline DigitalDistance ( float h, float k ); - DbU::Unit operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const; - private: - // For an explanation of h & k parameters, see: - // "KNIK, routeur global pour la plateforme Coriolis", p. 52. - float _h; - float _k; - }; - - - inline DigitalDistance::DigitalDistance ( float h, float k ) : _h(h), _k(k) { } - - - DbU::Unit DigitalDistance::operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const - { - if (edge->getCapacity() <= 0) return Vertex::unreached; - - float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); - float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0))); - - float distance = (float)source->getDistance() - + congestionCost * (float)edge->getDistance(); - + edge->getHistoricCost(); - - // Edge* sourceFrom = source->getFrom(); - // if (sourceFrom) { - // distance += ((sourceFrom->isHorizontal() xor edge->isHorizontal()) ? 3.0 : 0.0) * (float)Edge::unity; - // } - cdebug_log(112,0) << "cong:" << congestion - << " ccost:" << congestionCost - << " digitalDistance:" << DbU::getValueString((DbU::Unit)distance) << endl; - - return (DbU::Unit)distance; - } - - - void computeNextHCost ( Edge* edge, float edgeHInc ) - { - float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); - float hCost = edge->getHistoricCost(); - - float alpha = (congestion < 1.0) ? congestion : std::exp( std::log(8)*( congestion - 1 ) ); - - edge->setHistoricCost( alpha * (hCost + ((congestion < 1.0) ? 0.0 : edgeHInc) )); - - cdebug_log(113,0) << edge << endl; - } - - -} // Anonymous namespace. - - -namespace Anabatic { - - using std::cerr; - using std::cout; - using std::endl; - using std::setw; - using std::ostringstream; - using Hurricane::Error; - using Hurricane::RegularLayer; - using Hurricane::Component; - using Hurricane::Horizontal; - using Hurricane::Vertical; - using Hurricane::Cell; - using Hurricane::UpdateSession; - using Hurricane::DebugSession; - using CRL::RoutingGauge; - using CRL::RoutingLayerGauge; - - -// ------------------------------------------------------------------- -// Class : "Anabatic::AnabaticEngine". -// -// Methods dedicateds to complete global routing. - - - void AnabaticEngine::globalRoute () - { - Cell* cell = getCell(); - - cell->flattenNets( Cell::Flags::BuildRings ); - cell->createRoutingPadRings( Cell::Flags::BuildRings ); - - //DebugSession::addToTrace( cell->getNet("ra(2)") ); - //DebugSession::addToTrace( cell->getNet("alu_out(3)") ); - //DebugSession::addToTrace( cell->getNet("imuxe.not_i(1)") ); - //DebugSession::addToTrace( cell->getNet("r(0)") ); - //DebugSession::addToTrace( cell->getNet("a_from_pads(0)") ); - //DebugSession::addToTrace( cell->getNet("ialu.not_aux104") ); - //DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") ); - //DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_c1(3)") ); - - startMeasures(); - - if (getGCells().size() == 1) { - cmess1 << " o Building regular grid..." << endl; - getSouthWestGCell()->doGrid(); - } else { - cmess1 << " o Reusing existing grid." << endl; - } - cmess1 << Dots::asInt(" - GCells" ,getGCells().size()) << endl; - - stopMeasures(); - printMeasures( "Anabatic Grid" ); - - setupSpecialNets(); - setupPreRouteds (); - setupNetDatas(); - - openSession(); - startMeasures(); - - cmess1 << " o Running global routing..." << endl; - - float edgeHInc = getConfiguration()->getEdgeHInc(); - - Dijkstra* dijkstra = new Dijkstra ( this ); - dijkstra->setDistance( DigitalDistance( getConfiguration()->getEdgeCostH() - , getConfiguration()->getEdgeCostK() ) ); - - size_t iteration = 0; - size_t netCount = 0; - do { - cmess2 << " [" << setw(3) << iteration << "] nets:"; - - netCount = 0; - for ( NetData* netData : _netOrdering ) { - if (netData->isGlobalRouted()) continue; - - dijkstra->load( netData->getNet() ); - dijkstra->run(); - ++netCount; - } - cmess2 << left << setw(6) << netCount << right; - - //Session::revalidate(); - - const vector& ovEdges = getOvEdges(); - cmess2 << " ovEdges:" << ovEdges.size(); - - for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc ); - - netCount = 0; - size_t iEdge = 0; - while ( iEdge < ovEdges.size() ) { - Edge* edge = ovEdges[iEdge]; - netCount += edge->ripup(); - - if (ovEdges[iEdge] == edge) { - cerr << Error( "AnabaticEngine::globalRoute(): Unable to ripup enough segments of edge:\n" - " %s" - , getString(edge).c_str() - ) << endl; - ++iEdge; - } - } - - dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 ); - - cmess2 << " ripup:" << netCount; - stopMeasures(); - cmess2 << " " << setw(10) << Timer::getStringTime (_timer.getCombTime()) - << " " << setw( 6) << Timer::getStringMemory(_timer.getIncrease()) << endl; - startMeasures(); - -#if THIS_IS_A_TEST - if (iteration == 0) { - Net* testNet = getCell()->getNet( "ra(2)" ); - DebugSession::open( testNet, 112, 120 ); - if (testNet) { - for ( Component* component : testNet->getComponents() ) { - if (component->getId() == 23947) { - Segment* segment = static_cast( component ); - GCellsUnder gcells = getGCellsUnder( segment ); - Contact* contact = breakAt( segment, gcells->gcellAt(2) ); - cerr << "break:" << contact << endl; - unify( contact ); - //ripup( static_cast(component), Flags::Propagate ); - //iteration = 5; - //netsToRoute.insert( testNet ); - break; - } - } - } - DebugSession::close(); - } -#endif - - ++iteration; - } while ( (netCount > 0) and (iteration < 5) ); - - stopMeasures(); - printMeasures( "Dijkstra" ); - - delete dijkstra; - Session::close(); - - _state = EngineGlobalLoaded; - } - - -} // Anabatic namespace. diff --git a/anabatic/src/GraphicAnabaticEngine.cpp b/anabatic/src/GraphicAnabaticEngine.cpp deleted file mode 100644 index 35b956d4..00000000 --- a/anabatic/src/GraphicAnabaticEngine.cpp +++ /dev/null @@ -1,529 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul Chaput | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Module : "GraphicAnabaticEngine.cpp" | -// +-----------------------------------------------------------------+ - - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "anabatic/GCell.h" -#include "anabatic/GraphicAnabaticEngine.h" -#include "anabatic/Dijkstra.h" - - -namespace Anabatic { - - using namespace std; - using Hurricane::Error; - using Hurricane::Warning; - using Hurricane::Exception; - using Hurricane::Breakpoint; - using Hurricane::DebugSession; - using Hurricane::UpdateSession; - using Hurricane::Point; - using Hurricane::Entity; - using Hurricane::Net; - using Hurricane::Graphics; - using Hurricane::ColorScale; - using Hurricane::DisplayStyle; - using Hurricane::DrawingStyle; - using Hurricane::ControllerWidget; - using Hurricane::ExceptionWidget; - using CRL::Catalog; - using CRL::AllianceFramework; - - -// ------------------------------------------------------------------- -// Test functions. - - - class DigitalDistance { - public: - inline DigitalDistance ( float h, float k ); - DbU::Unit operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const; - private: - // For an explanation of h & k parameters, see: - // "KNIK, routeur global pour la plateforme Coriolis", p. 52. - float _h; - float _k; - }; - - - inline DigitalDistance::DigitalDistance ( float h, float k ) : _h(h), _k(k) { } - - - DbU::Unit DigitalDistance::operator() ( const Vertex* source ,const Vertex* target,const Edge* edge ) const - { - if (edge->getCapacity() <= 0) return Vertex::unreached; - - float congestion = (float)edge->getRealOccupancy() / (float)edge->getCapacity(); - float congestionCost = 1.0 + _h / (1.0 + std::exp(_k * (congestion - 1.0))); - - float distance = (float)source->getDistance() + congestionCost * (float)edge->getDistance(); - - // Edge* sourceFrom = source->getFrom(); - // if (sourceFrom) { - // distance += ((sourceFrom->isHorizontal() xor edge->isHorizontal()) ? 3.0 : 0.0) * (float)Edge::unity; - // } - cdebug_log(112,0) << "cong:" << congestion - << " ccost:" << congestionCost - << " digitalDistance:" << DbU::getValueString((DbU::Unit)distance) << endl; - - return (DbU::Unit)distance; - } - - - void anabaticTest_1 ( AnabaticEngine* engine ) - { - engine->getSouthWestGCell()->doGrid(); - - Point position ( DbU::fromLambda(100.0), DbU::fromLambda(100.0) ); - GCell* gcell = engine->getGCellUnder( position ); - - cerr << "Gcell under:" << position << " is " << gcell << endl; - } - - - void anabaticTest_2 ( AnabaticEngine* engine ) - { - UpdateSession::open(); - - GCell* row0 = engine->getSouthWestGCell(); - DbU::Unit xcorner = engine->getCell()->getAbutmentBox().getXMin(); - DbU::Unit ycorner = engine->getCell()->getAbutmentBox().getYMin(); - - cdebug_log(119,1) << "row0: " << row0 << endl; - - GCell* row1 = row0->hcut( ycorner+DbU::fromLambda(50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row1: " << row1 << endl; - - GCell* row2 = row1->hcut( ycorner+DbU::fromLambda(2*50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row2: " << row2 << endl; - - row0 = row0->vcut( xcorner+DbU::fromLambda(50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row0+1: " << row0 << endl; - - row0 = row0->vcut( xcorner+DbU::fromLambda(3*50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row0+2: " << row0 << endl; - - row0 = row0->vcut( xcorner+DbU::fromLambda(5*50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row0+3: " << row0 << endl; - - row1 = row1->vcut( xcorner+DbU::fromLambda(2*50.0) ); - cdebug_tabw(119,-1); - cdebug_log(119,1) << "row1+1: " << row1 << endl; - - cdebug_tabw(119,-1); - - UpdateSession::close(); - } - - - void anabaticTest_3 ( AnabaticEngine* engine ) - { - for ( int i=0 ; i<4 ; ++i ) { - cdebug_log(110,1) << "Running test 3, loop:" << i << " ..." << endl; - - if ( i%2) anabaticTest_1( engine ); - else anabaticTest_2( engine ); - - engine->reset(); - cdebug_log(110,1) << "Test 3, loop:" << i << " completed." << endl; - cdebug_tabw(110,-1); - } - } - - - void anabaticTest_4 ( AnabaticEngine* engine ) - { - Cell* cell = engine->getCell(); - cell->flattenNets( Cell::Flags::BuildRings ); - cell->createRoutingPadRings( Cell::Flags::BuildRings ); - - engine->getSouthWestGCell()->doGrid(); - - vector nets; - nets.push_back( cell->getNet( "ialu.inv_x2_3_sig" ) ); - nets.push_back( cell->getNet( "iram.na3_x1_13_sig" ) ); - nets.push_back( cell->getNet( "iram.ram_idx_7(1)" ) ); - - Dijkstra* dijkstra = new Dijkstra ( engine ); - for ( Net* net : nets ) { - dijkstra->load( net ); - dijkstra->run(); - } - delete dijkstra; - } - - - void anabaticTest_5 ( AnabaticEngine* engine ) - { - Cell* cell = engine->getCell(); - - - cell->flattenNets( Cell::Flags::BuildRings ); - cell->createRoutingPadRings( Cell::Flags::BuildRings ); - - //DebugSession::addToTrace( cell->getNet("alu_out(3)") ); - //DebugSession::addToTrace( cell->getNet("imuxe.not_i(1)") ); - //DebugSession::addToTrace( cell->getNet("r(0)") ); - //DebugSession::addToTrace( cell->getNet("ialu.not_aux104") ); - DebugSession::addToTrace( cell->getNet("mips_r3000_1m_dp_shift32_rshift_se_muxoutput(159)") ); - - engine->startMeasures(); - - cmess1 << " o Building regular grid..." << endl; - - UpdateSession::open(); - engine->getSouthWestGCell()->doGrid(); - UpdateSession::close(); - - engine->stopMeasures(); - engine->printMeasures( "Anbatic Grid" ); - engine->startMeasures(); - - cmess1 << " o Running global routing..." << endl; - - UpdateSession::open(); - Dijkstra* dijkstra = new Dijkstra ( engine ); - dijkstra->setDistance( DigitalDistance( engine->getConfiguration()->getEdgeCostH() - , engine->getConfiguration()->getEdgeCostK() ) ); - for ( Net* net : cell->getNets() ) { - if (net->isPower() or net->isClock()) continue; - dijkstra->load( net ); - dijkstra->run(); - } - UpdateSession::close(); - - engine->stopMeasures(); - engine->printMeasures( "Dijkstra" ); - -#if 0 - const vector& ovEdges = engine->getOvEdges(); - if (not ovEdges.empty()) { - size_t count = 0; - - cmess1 << " - " << ovEdges.size() << " overloaded edges." << endl; - cmess1 << " " << ovEdges[0] << endl; - NetSet nets; - engine->getNetsFromEdge( ovEdges[0], nets ); - for ( Net* net : nets ) { - cmess1 << " [" << setw(2) << count++ << "] " << net << endl; - } - - UpdateSession::open(); - Net* net = *nets.begin(); - //dijkstra->load( net ); - //dijkstra->ripup( ovEdges[0] ); - UpdateSession::close(); - } -#endif - - UpdateSession::open(); - delete dijkstra; - UpdateSession::close(); - } - - -// ------------------------------------------------------------------- -// Class : "Anabatic::GraphicAnabaticEngine". - - size_t GraphicAnabaticEngine::_references = 0; - GraphicAnabaticEngine* GraphicAnabaticEngine::_singleton = NULL; - - - void GraphicAnabaticEngine::initGCell ( CellWidget* widget ) - { - widget->getDrawingPlanes().setPen( Qt::NoPen ); - } - - - void GraphicAnabaticEngine::drawGCell ( CellWidget* widget - , const Go* go - , const BasicLayer* basicLayer - , const Box& box - , const Transformation& transformation - ) - { - const GCell* gcell = static_cast(go); - - QPainter& painter = widget->getPainter(); - QPen pen = Graphics::getPen ("Anabatic::GCell",widget->getDarkening()); - Box bb = gcell->getBoundingBox(); - QRect pixelBb = widget->dbuToScreenRect(bb); - - painter.setPen ( pen ); - painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) ); - painter.drawRect( pixelBb ); - - if (gcell->isFlat()) return; - - if (pixelBb.width() > 150) { - QString text = QString("id:%1").arg(gcell->getId()); - QFont font = Graphics::getFixedFont( QFont::Bold ); - painter.setFont(font); - - pen.setWidth( 1 ); - painter.setPen( pen ); - - painter.save (); - painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) ); - painter.drawRect (QRect( -75, -25, 150, 50 )); - painter.drawText (QRect( -75, -25, 150, 50 ) - , text - , QTextOption(Qt::AlignCenter) - ); - painter.restore (); - } - } - - - void GraphicAnabaticEngine::initEdge ( CellWidget* widget ) - { - widget->getDrawingPlanes().setPen( Qt::NoPen ); - } - - - void GraphicAnabaticEngine::drawEdge ( CellWidget* widget - , const Go* go - , const BasicLayer* basicLayer - , const Box& box - , const Transformation& transformation - ) - { - static QFont font = Graphics::getFixedFont( QFont::Bold ); - static int fontHeight = QFontMetrics(font).height(); - - const Edge* edge = static_cast(go); - - if (edge) { - Box bb = edge->getBoundingBox(); - unsigned int occupancy = 255; - if (edge->getRealOccupancy() < edge->getCapacity()) - occupancy = (unsigned int)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) ); - - QPainter& painter = widget->getPainter(); - if (edge->getRealOccupancy() > edge->getCapacity()) { - QColor color ( Qt::cyan ); - painter.setPen( DisplayStyle::darken(color,widget->getDarkening()) ); - } - - QBrush brush = QBrush( Qt::white, Qt::DiagCrossPattern ); - if (edge->getCapacity() > 0.0) - brush = Graphics::getColorScale( ColorScale::Fire ).getBrush( occupancy, widget->getDarkening() ); - - QRect pixelBb = widget->dbuToScreenRect( bb, false); - painter.setPen( Qt::NoPen ); - painter.setBrush( brush ); - painter.drawRect( pixelBb ); - - if (fontHeight > ((edge->isHorizontal()) ? pixelBb.height() : pixelBb.width()) + 4) return; - - QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity()); - QColor color ( (occupancy > 170) ? Qt::black : Qt::white ); - painter.setPen (DisplayStyle::darken(color,widget->getDarkening())); - painter.setFont(font); - - if (edge->isVertical()) { - painter.save (); - painter.translate( widget->dbuToScreenPoint(bb.getXMin(), bb.getYMin()) ); - painter.rotate ( -90 ); - painter.drawText (QRect( 0 - , 0 - , widget->dbuToScreenLength(bb.getHeight()) - , widget->dbuToScreenLength(bb.getWidth ())) - , text - , QTextOption(Qt::AlignCenter) - ); - painter.restore (); - } else - painter.drawText( widget->dbuToScreenRect(bb,false ), text, QTextOption(Qt::AlignCenter) ); - - painter.setPen( Qt::NoPen ); - } - } - - - AnabaticEngine* GraphicAnabaticEngine::createEngine () - { - Cell* cell = getCell(); - - AnabaticEngine* engine = AnabaticEngine::get( cell ); - if (not engine) { - engine = AnabaticEngine::create( cell ); - } else - cerr << Warning( "%s already has a Anabatic engine.", getString(cell).c_str() ) << endl; - - return engine; - } - - - AnabaticEngine* GraphicAnabaticEngine::getForFramework ( unsigned int flags ) - { - // Currently, only one framework is avalaible: Alliance. - - AnabaticEngine* engine = AnabaticEngine::get( getCell() ); - if (engine) return engine; - - if (flags & CreateEngine) { - engine = createEngine(); - if (not engine) - throw Error( "Failed to create Anabatic engine on %s.", getString(getCell()).c_str() ); - } else { - throw Error( "AnabaticEngine not created yet, run the global router first." ); - } - - return engine; - } - - - void GraphicAnabaticEngine::_runTest () - { - if (_viewer) _viewer->emitCellAboutToChange(); - AnabaticEngine* engine = getForFramework( CreateEngine ); - - //anabaticTest_1( engine ); - //anabaticTest_2( engine ); - //anabaticTest_3( engine ); - //anabaticTest_4( engine ); - anabaticTest_5( engine ); - - if (_viewer) _viewer->emitCellChanged(); - } - - - void GraphicAnabaticEngine::_globalRoute () - { - AnabaticEngine* engine = getForFramework( CreateEngine ); - engine->globalRoute(); - } - - - void GraphicAnabaticEngine::_detailRoute () - { - AnabaticEngine* engine = getForFramework( CreateEngine ); - engine->loadGlobalRouting( EngineLoadGrByNet ); - engine->layerAssign( EngineNoNetLayerAssign ); - } - - - void GraphicAnabaticEngine::addToMenu ( CellViewer* viewer ) - { - assert( _viewer == NULL ); - - _viewer = viewer; - - if (_viewer->hasMenuAction("placeAndRoute.anabatic.globalRoute")) { - cerr << Warning( "GraphicAnabaticEngine::addToMenu() - Anabatic engine already hooked in." ) << endl; - return; - } - - _viewer->addMenu ( "placeAndRoute.anabatic", "Anabatic" ); - _viewer->addToMenu( "placeAndRoute.anabatic.runTest" - , "Anabatic - &Test Run" - , "Perform a test run of Anabatic on the design" - , std::bind(&GraphicAnabaticEngine::_runTest,this) - ); - _viewer->addToMenu( "placeAndRoute.anabatic.globalRoute" - , "Anabatic - &Global Route" - , "Global Route" - , std::bind(&GraphicAnabaticEngine::_globalRoute,this) - ); - _viewer->addToMenu( "placeAndRoute.anabatic.detailedRoute" - , "Anabatic - &Detailed Route" - , "Run the Anabatic detailed router" - , std::bind(&GraphicAnabaticEngine::_detailRoute,this) - ); - } - - - const Name& GraphicAnabaticEngine::getName () const - { return AnabaticEngine::staticGetName(); } - - - Cell* GraphicAnabaticEngine::getCell () - { - if (_viewer == NULL) { - throw Error( "Anabatic: GraphicAnabaticEngine not bound to any Viewer." ); - return NULL; - } - - if (_viewer->getCell() == NULL) { - throw Error( "Anabatic: No Cell is loaded into the Viewer." ); - return NULL; - } - - return _viewer->getCell(); - } - - - GraphicAnabaticEngine* GraphicAnabaticEngine::grab () - { - if (not _references) - _singleton = new GraphicAnabaticEngine (); - _references++; - - return _singleton; - } - - - size_t GraphicAnabaticEngine::release () - { - --_references; - if (not _references) { - delete _singleton; - _singleton = NULL; - } - return _references; - } - - - GraphicAnabaticEngine::GraphicAnabaticEngine () - : GraphicTool() - , _viewer (NULL) - { - addDrawGo( "Anabatic::GCell", initGCell, drawGCell ); - addDrawGo( "Anabatic::Edge" , initEdge , drawEdge ); - } - - - GraphicAnabaticEngine::~GraphicAnabaticEngine () - { } - - - -} // Anabatic namespace. diff --git a/anabatic/src/LoadGlobalRouting.cpp b/anabatic/src/LoadGlobalRouting.cpp index 9d0f0bce..e5d5477e 100644 --- a/anabatic/src/LoadGlobalRouting.cpp +++ b/anabatic/src/LoadGlobalRouting.cpp @@ -2232,7 +2232,7 @@ namespace Anabatic { void AnabaticEngine::_loadGrByNet () { - cmess1 << " o Loading Nets global routing from Knik." << endl; + cmess1 << " o Building detailed routing from global." << endl; //cmess1 << Dots::asDouble(" - Saturation",getMeasure(getCell(),"Sat.")->getData()) << endl; startMeasures(); diff --git a/anabatic/src/PyAnabatic.cpp b/anabatic/src/PyAnabatic.cpp index e05ec4d2..130cdcc1 100644 --- a/anabatic/src/PyAnabatic.cpp +++ b/anabatic/src/PyAnabatic.cpp @@ -16,8 +16,7 @@ #include "hurricane/isobar/PyHurricane.h" #include "hurricane/isobar/PyCell.h" -#include "anabatic/PyAnabaticEngine.h" -#include "anabatic/PyGraphicAnabaticEngine.h" +#include "anabatic/Constants.h" namespace Anabatic { @@ -26,8 +25,6 @@ namespace Anabatic { using std::endl; using Hurricane::tab; using Isobar::__cs; - using CRL::PyTypeToolEngine; - using CRL::PyTypeGraphicTool; #if !defined(__PYTHON_MODULE__) @@ -64,13 +61,6 @@ extern "C" { DL_EXPORT(void) initAnabatic () { cdebug_log(32,0) << "initAnabatic()" << endl; - PyAnabaticEngine_LinkPyType(); - PyGraphicAnabaticEngine_LinkPyType(); - - PYTYPE_READY_SUB( AnabaticEngine , ToolEngine ); - PYTYPE_READY_SUB( GraphicAnabaticEngine, GraphicTool ); - - PyObject* module = Py_InitModule( "Anabatic", PyAnabatic_Methods ); if (module == NULL) { cerr << "[ERROR]\n" @@ -78,11 +68,6 @@ extern "C" { return; } - Py_INCREF( &PyTypeAnabaticEngine ); - PyModule_AddObject( module, "AnabaticEngine", (PyObject*)&PyTypeAnabaticEngine ); - Py_INCREF( &PyTypeGraphicAnabaticEngine ); - PyModule_AddObject( module, "GraphicAnabaticEngine", (PyObject*)&PyTypeGraphicAnabaticEngine ); - PyObject* dictionnary = PyModule_GetDict(module); PyObject* constant; diff --git a/anabatic/src/PyAnabaticEngine.cpp b/anabatic/src/PyAnabaticEngine.cpp deleted file mode 100644 index 1bcf8659..00000000 --- a/anabatic/src/PyAnabaticEngine.cpp +++ /dev/null @@ -1,221 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Module : "./PyAnabaticEngine.cpp" | -// +-----------------------------------------------------------------+ - - -#include "hurricane/isobar/PyCell.h" -#include "hurricane/viewer/PyCellViewer.h" -#include "hurricane/viewer/ExceptionWidget.h" -#include "hurricane/Cell.h" -#include "anabatic/PyAnabaticEngine.h" -#include - -# undef ACCESS_OBJECT -# undef ACCESS_CLASS -# define ACCESS_OBJECT _baseObject._object -# define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject) -#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(AnabaticEngine,engine,function) - - -namespace Anabatic { - - using std::cerr; - using std::endl; - using std::hex; - using std::ostringstream; - using Hurricane::tab; - using Hurricane::Exception; - using Hurricane::Bug; - using Hurricane::Error; - using Hurricane::Warning; - using Hurricane::ExceptionWidget; - using Isobar::ProxyProperty; - using Isobar::ProxyError; - using Isobar::ConstructorError; - using Isobar::HurricaneError; - using Isobar::HurricaneWarning; - using Isobar::ParseOneArg; - using Isobar::ParseTwoArg; - using Isobar::PyCell; - using Isobar::PyCell_Link; - using Isobar::PyCellViewer; - using Isobar::PyTypeCellViewer; - using CRL::PyToolEngine; - - -extern "C" { - -#if defined(__PYTHON_MODULE__) - - -#define DirectVoidToolMethod(SELF_TYPE, SELF_OBJECT, FUNC_NAME) \ - static PyObject* Py##SELF_TYPE##_##FUNC_NAME(Py##SELF_TYPE* self) \ - { \ - trace << "Py" #SELF_TYPE "_" #FUNC_NAME "()" << endl; \ - HTRY \ - METHOD_HEAD(#SELF_TYPE "." #FUNC_NAME "()") \ - if (SELF_OBJECT->getViewer()) { \ - if (ExceptionWidget::catchAllWrapper( std::bind(&AnabaticEngine::FUNC_NAME,SELF_OBJECT) )) { \ - PyErr_SetString( HurricaneError, #FUNC_NAME "() has thrown an exception (C++)." ); \ - return NULL; \ - } \ - } else { \ - SELF_OBJECT->FUNC_NAME(); \ - } \ - HCATCH \ - Py_RETURN_NONE; \ - } - - -// +=================================================================+ -// | "PyAnabaticEngine" Python Module Code Part | -// +=================================================================+ - - - static PyObject* PyAnabaticEngine_get ( PyObject*, PyObject* args ) - { - cdebug_log(32,0) << "PyAnabaticEngine_get()" << endl; - - AnabaticEngine* engine = NULL; - - HTRY - PyObject* arg0; - - if (not ParseOneArg("Anabatic.get", args, CELL_ARG, &arg0)) return NULL; - engine = AnabaticEngine::get(PYCELL_O(arg0)); - HCATCH - - return PyAnabaticEngine_Link(engine); - } - - - static PyObject* PyAnabaticEngine_create ( PyObject*, PyObject* args ) - { - cdebug_log(32,0) << "PyAnabaticEngine_create()" << endl; - - AnabaticEngine* engine = NULL; - - HTRY - PyObject* arg0; - - if (not ParseOneArg("Anabatic.get", args, CELL_ARG, &arg0)) return NULL; - - Cell* cell = PYCELL_O(arg0); - engine = AnabaticEngine::get(cell); - - if (engine == NULL) { - engine = AnabaticEngine::create(cell); - } else - cerr << Warning("%s already has a Anabatic engine.",getString(cell).c_str()) << endl; - HCATCH - - return PyAnabaticEngine_Link(engine); - } - - - static PyObject* PyAnabaticEngine_setViewer ( PyAnabaticEngine* self, PyObject* args ) - { - cdebug_log(32,0) << "PyAnabaticEngine_setViewer ()" << endl; - - HTRY - METHOD_HEAD( "AnabaticEngine.setViewer()" ) - - PyObject* pyViewer = NULL; - if (not PyArg_ParseTuple(args,"O:EtesianEngine.setViewer()",&pyViewer)) { - PyErr_SetString( ConstructorError, "Bad parameters given to EtesianEngine.setViewer()." ); - return NULL; - } - if (IsPyCellViewer(pyViewer)) { - engine->setViewer( PYCELLVIEWER_O(pyViewer) ); - } - HCATCH - - Py_RETURN_NONE; - } - - -#if 0 - PyObject* PyAnabaticEngine_runTest ( PyAnabaticEngine* self, PyObject* args ) - { - cdebug_log(32,0) << "PyAnabaticEngine_runTest()" << endl; - - HTRY - METHOD_HEAD("AnabaticEngine.runTest()") - unsigned int flags = 0; - if (PyArg_ParseTuple(args,"I:AnabaticEngine.runTest", &flags)) { - if (engine->getViewer()) { - if (ExceptionWidget::catchAllWrapper( std::bind(&AnabaticEngine::_runTest,engine) )) { - PyErr_SetString( HurricaneError, "AnabaticEngine::runTest() has thrown an exception (C++)." ); - return NULL; - } - } else { - engine->_runTest(); - } - } else { - PyErr_SetString(ConstructorError, "AnabaticEngine.runGlobalRouter(): Invalid number/bad type of parameter."); - return NULL; - } - HCATCH - - Py_RETURN_NONE; - } -#endif - - - // Standart Accessors (Attributes). - - // Standart Destroy (Attribute). - DBoDestroyAttribute(PyAnabaticEngine_destroy,PyAnabaticEngine) - - - PyMethodDef PyAnabaticEngine_Methods[] = - { { "get" , (PyCFunction)PyAnabaticEngine_get , METH_VARARGS|METH_STATIC - , "Returns the Anabatic engine attached to the Cell, None if there isnt't." } - , { "create" , (PyCFunction)PyAnabaticEngine_create , METH_VARARGS|METH_STATIC - , "Create a Anabatic engine on this cell." } - , { "setViewer" , (PyCFunction)PyAnabaticEngine_setViewer , METH_VARARGS - , "Associate a Viewer to this AnabaticEngine." } -#if 0 - , { "runTest" , (PyCFunction)PyAnabaticEngine_runTest , METH_VARARGS - , "Run the test procedure." } -#endif - , { "destroy" , (PyCFunction)PyAnabaticEngine_destroy , METH_NOARGS - , "Destroy the associated hurricane object. The python object remains." } - , {NULL, NULL, 0, NULL} /* sentinel */ - }; - - - DBoDeleteMethod(AnabaticEngine) - PyTypeObjectLinkPyType(AnabaticEngine) - - -#else // End of Python Module Code Part. - - -// +=================================================================+ -// | "PyAnabaticEngine" Shared Library Code Part | -// +=================================================================+ - - - // Link/Creation Method. - PyTypeInheritedObjectDefinitions(AnabaticEngine,PyToolEngine) - DBoLinkCreateMethod(AnabaticEngine) - - -#endif // Shared Library Code Part. - -} // extern "C". - -} // Anabatic namespace. - diff --git a/anabatic/src/PyGraphicAnabaticEngine.cpp b/anabatic/src/PyGraphicAnabaticEngine.cpp deleted file mode 100644 index 2eb54eb7..00000000 --- a/anabatic/src/PyGraphicAnabaticEngine.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul Chaput | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Module : "./PyGraphicAnabaticEngine.cpp" | -// +-----------------------------------------------------------------+ - - -#include "anabatic/PyGraphicAnabaticEngine.h" -#include "hurricane/isobar/PyCell.h" -#include "hurricane/Cell.h" - - -#undef ACCESS_OBJECT -#undef ACCESS_CLASS -#define ACCESS_OBJECT _baseObject._object -#define ACCESS_CLASS(_pyObject) &(_pyObject->_baseObject) -#define METHOD_HEAD(function) GENERIC_METHOD_HEAD(GraphicAnabaticEngine,gengine,function) - - -namespace Anabatic { - -using namespace Hurricane; -using namespace Isobar; - -extern "C" { - - -// +=================================================================+ -// | "PyGraphicAnabaticEngine" Python Module Code Part | -// +=================================================================+ - -#if defined(__PYTHON_MODULE__) - - - // +-------------------------------------------------------------+ - // | "PyGraphicAnabaticEngine" Attribute Methods | - // +-------------------------------------------------------------+ - - - static PyObject* PyGraphicAnabaticEngine_grab ( PyObject* ) - { - cdebug_log(32,0) << "PyGraphicAnabaticEngine_grab()" << endl; - PyGraphicAnabaticEngine* pyGraphicAnabaticEngine = NULL; - - HTRY - pyGraphicAnabaticEngine = PyObject_NEW ( PyGraphicAnabaticEngine, &PyTypeGraphicAnabaticEngine ); - if ( pyGraphicAnabaticEngine == NULL ) return NULL; - - pyGraphicAnabaticEngine->ACCESS_OBJECT = GraphicAnabaticEngine::grab(); - HCATCH - - return (PyObject*)pyGraphicAnabaticEngine; - } - - - static PyObject* PyGraphicAnabaticEngine_getCell ( PyGraphicAnabaticEngine* self ) - { - cdebug_log(32,0) << "PyGraphicAnabaticEngine_getCell ()" << endl; - - Cell* cell = NULL; - - HTRY - METHOD_HEAD("GraphicAnabaticEngine.getCell()") - cell = gengine->getCell (); - HCATCH - - if (cell == NULL) Py_RETURN_NONE; - return PyCell_Link(cell); - } - - - GetNameMethod(GraphicAnabaticEngine, gengine) - - // Standart destroy (Attribute). - - - PyMethodDef PyGraphicAnabaticEngine_Methods[] = - { { "grab" , (PyCFunction)PyGraphicAnabaticEngine_grab , METH_NOARGS|METH_STATIC - , "Returns the GraphicAnabaticEngine singleton." } - , { "getName" , (PyCFunction)PyGraphicAnabaticEngine_getName , METH_NOARGS - , "Returns the name of the GraphicAnabaticEngine (class attribute)." } - , { "getCell" , (PyCFunction)PyGraphicAnabaticEngine_getCell , METH_NOARGS - , "Returns the Cell on which this GraphicAnabaticEngine is attached." } - , {NULL, NULL, 0, NULL} /* sentinel */ - }; - - - // --------------------------------------------------------------- - // PyGraphicAnabaticEngine Type Methods. - - - PythonOnlyDeleteMethod(GraphicAnabaticEngine) - PyTypeObjectLinkPyType(GraphicAnabaticEngine) - - -#else // End of Python Module Code Part. - - -// +=================================================================+ -// | "PyGraphicAnabaticEngine" Shared Library Code Part | -// +=================================================================+ - - // Link/Creation Method. - LinkCreateMethod(GraphicAnabaticEngine) - - PyTypeInheritedObjectDefinitions(GraphicAnabaticEngine,GraphicTool) - - -#endif // End of Shared Library Code Part. - -} // extern "C". - -} // CRL namespace. diff --git a/anabatic/src/anabatic/AnabaticEngine.h b/anabatic/src/anabatic/AnabaticEngine.h index 2f271784..4389d0e6 100644 --- a/anabatic/src/anabatic/AnabaticEngine.h +++ b/anabatic/src/anabatic/AnabaticEngine.h @@ -278,6 +278,8 @@ namespace Anabatic { inline const Timer& getTimer () const; void startMeasures (); void stopMeasures (); + void suspendMeasures (); + void resumeMeasures (); void printMeasures ( const string& ) const; inline void _add ( GCell* ); inline void _remove ( GCell* ); diff --git a/anabatic/src/anabatic/GCell.h b/anabatic/src/anabatic/GCell.h index c44d785b..d436292e 100644 --- a/anabatic/src/anabatic/GCell.h +++ b/anabatic/src/anabatic/GCell.h @@ -75,6 +75,9 @@ namespace Anabatic { typedef std::set< GCell*, Entity::CompareById > Set; typedef std::vector Vector; public: + enum DisplayMode { Boundary = 1 + , Density = 2 + }; enum DensityMode { AverageHVDensity = 1 // Average between all densities. , AverageHDensity = 2 // Average between all H densities. , AverageVDensity = 3 // Average between all V densities. @@ -120,6 +123,8 @@ namespace Anabatic { float _density; }; public: + static unsigned int getDisplayMode (); + static void setDisplayMode ( unsigned int ); static Box getBorder ( const GCell*, const GCell* ); public: static GCell* create ( AnabaticEngine* ); @@ -266,6 +271,7 @@ namespace Anabatic { GCell& operator= ( const GCell& ); private: static Name _extensionName; + static unsigned int _displayMode; Observable _observable; AnabaticEngine* _anabatic; Flags _flags; diff --git a/anabatic/src/anabatic/GraphicAnabaticEngine.h b/anabatic/src/anabatic/GraphicAnabaticEngine.h deleted file mode 100644 index e2a81e72..00000000 --- a/anabatic/src/anabatic/GraphicAnabaticEngine.h +++ /dev/null @@ -1,92 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul Chaput | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Header : "./anabatic/GraphicAnabaticEngine.h" | -// +-----------------------------------------------------------------+ - - -#ifndef ANABATIC_GRAPHIC_ANABATIC_ENGINE_H -#define ANABATIC_GRAPHIC_ANABATIC_ENGINE_H - -#include -#include - -namespace Hurricane { - class Go; - class BasicLayer; - class Transformation; - class CellWidget; - class CellViewer; -} - -#include "crlcore/GraphicToolEngine.h" -#include "anabatic/AnabaticEngine.h" - - -namespace Anabatic { - - using Hurricane::Go; - using Hurricane::Box; - using Hurricane::BasicLayer; - using Hurricane::Transformation; - using Hurricane::CellWidget; - using Hurricane::CellViewer; - using CRL::GraphicTool; - - -// ------------------------------------------------------------------- -// Class : "Anabatic::GraphicAnabaticEngine". - - class GraphicAnabaticEngine : public GraphicTool { - Q_OBJECT; - - public: - enum Flags { NoFlags=0x0000, CreateEngine=0x0001 }; - public: - AnabaticEngine* createEngine (); - AnabaticEngine* getForFramework ( unsigned int flags ); - static void initGCell ( CellWidget* ); - static void drawGCell ( CellWidget* - , const Go* - , const BasicLayer* - , const Box& - , const Transformation& - ); - static void initEdge ( CellWidget* ); - static void drawEdge ( CellWidget* - , const Go* - , const BasicLayer* - , const Box& - , const Transformation& - ); - static GraphicAnabaticEngine* grab (); - virtual const Name& getName () const; - Cell* getCell (); - virtual size_t release (); - virtual void addToMenu ( CellViewer* ); - - protected: - static size_t _references; - static GraphicAnabaticEngine* _singleton; - CellViewer* _viewer; - protected: - GraphicAnabaticEngine (); - virtual ~GraphicAnabaticEngine (); - void _runTest (); - void _globalRoute (); - void _detailRoute (); - }; - - -} // Anabatic namespace. - -#endif // ANABATIC_GRAPHIC_ANABATIC_ENGINE_H diff --git a/anabatic/src/anabatic/PyAnabaticEngine.h b/anabatic/src/anabatic/PyAnabaticEngine.h deleted file mode 100644 index 4948c01b..00000000 --- a/anabatic/src/anabatic/PyAnabaticEngine.h +++ /dev/null @@ -1,55 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Header : "./anabatic/PyAnabaticEngine.h" | -// +-----------------------------------------------------------------+ - - -#ifndef PY_ANABATIC_ENGINE_H -#define PY_ANABATIC_ENGINE_H - -#include "hurricane/isobar/PyHurricane.h" -#include "crlcore/PyToolEngine.h" -#include "anabatic/AnabaticEngine.h" - - -namespace Anabatic { - - extern "C" { - -// ------------------------------------------------------------------- -// Python Object : "PyAnabaticEngine". - - typedef struct { - CRL::PyToolEngine _baseObject; - } PyAnabaticEngine; - - -// ------------------------------------------------------------------- -// Functions & Types exported to "PyAnabatic.ccp". - - extern PyTypeObject PyTypeAnabaticEngine; - extern PyMethodDef PyAnabaticEngine_Methods[]; - extern PyObject* PyAnabaticEngine_Link ( Anabatic::AnabaticEngine* ); - extern void PyAnabaticEngine_LinkPyType (); - - -#define IsPyAnabaticEngine(v) ( (v)->ob_type == &PyTypeAnabaticEngine ) -#define PYANABATICENGINE(v) ( (PyAnabaticEngine*)(v) ) -#define PYANABATICENGINE_O(v) ( PYANABATICENGINE(v)->_baseObject._object ) - - - } // extern "C". - -} // Anabatic namespace. - -#endif // PY_ANABATIC_ENGINE_H diff --git a/anabatic/src/anabatic/PyGraphicAnabaticEngine.h b/anabatic/src/anabatic/PyGraphicAnabaticEngine.h deleted file mode 100644 index dd91b697..00000000 --- a/anabatic/src/anabatic/PyGraphicAnabaticEngine.h +++ /dev/null @@ -1,53 +0,0 @@ -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC 2016-2016, All Rights Reserved -// -// +-----------------------------------------------------------------+ -// | C O R I O L I S | -// | A n a b a t i c - Global Routing Toolbox | -// | | -// | Author : Jean-Paul Chaput | -// | E-mail : Jean-Paul.Chaput@lip6.fr | -// | =============================================================== | -// | C++ Header : "./anabatic/PyGraphicAnabaticEngine.h" | -// +-----------------------------------------------------------------+ - - -#ifndef ANABATIC_PY_GRAPHIC_ANABATIC_ENGINE_H -#define ANABATIC_PY_GRAPHIC_ANABATIC_ENGINE_H - -#include "crlcore/PyGraphicToolEngine.h" -#include "anabatic/GraphicAnabaticEngine.h" - - -namespace Anabatic { - - extern "C" { - -// ------------------------------------------------------------------- -// Python Object : "PyGraphicAnabaticEngine". - - typedef struct { - CRL::PyGraphicTool _baseObject; - } PyGraphicAnabaticEngine; - - -// ------------------------------------------------------------------- -// Functions & Types exported to "PyAnabatic.ccp". - - extern PyTypeObject PyTypeGraphicAnabaticEngine; - extern PyMethodDef PyGraphicAnabaticEngine_Methods[]; - extern void PyGraphicAnabaticEngine_LinkPyType (); - - -#define IsPyGraphicAnabaticEngine(v) ( (v)->ob_type == &PyTypeGraphicAnabaticEngine ) -#define PY_GRAPHIC_ANABATIC_ENGINE(v) ( (PyGraphicAnabaticEngine*)(v) ) -#define PY_GRAPHIC_ANABATIC_ENGINE_O(v) ( PY_GRAPHIC_ANABATIC_ENGINE(v)->_baseObject._object ) - - - } // extern "C". - -} // Anabatic namespace. - -#endif // ANABATIC_PY_GRAPHIC_ANABATIC_ENGINE_H diff --git a/crlcore/etc/cmos/kite.conf b/crlcore/etc/cmos/kite.conf index 46324526..f746b1e1 100644 --- a/crlcore/etc/cmos/kite.conf +++ b/crlcore/etc/cmos/kite.conf @@ -25,6 +25,10 @@ parametersTable = \ , ("anabatic.edgeWidth" ,TypeInt ,4 ) , ("anabatic.edgeCostH" ,TypeDouble ,9.0 ) , ("anabatic.edgeCostK" ,TypeDouble ,-10.0 ) + , ("anabatic.gcell.displayMode" ,TypeEnumerate ,1 + , { 'values':( ("Boundary" , 1) + , ("Density" , 2) ) } + ) ) diff --git a/crlcore/etc/common/display.conf b/crlcore/etc/common/display.conf index dfb06bc8..215131c8 100644 --- a/crlcore/etc/common/display.conf +++ b/crlcore/etc/common/display.conf @@ -85,7 +85,7 @@ stylesTable = \ , (Drawing, 'gmetalv' , { 'color':'200,200,255', 'pattern':'light_antihash1.8', 'border':1 }) , (Drawing, 'gcut' , { 'color':'255,255,190', 'border':1 }) , (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'threshold':0.02*scale, 'border':4 }) - , (Drawing, 'Anabatic::GCell', { 'color':'255,0,0' , 'pattern':'0000000000000000', 'threshold':0.80*scale, 'border':4 }) + , (Drawing, 'Anabatic::GCell', { 'color':'255,0,0' , 'pattern':'0000000000000000', 'threshold':0.10*scale, 'border':4 }) ) # ---------------------------------------------------------------------- @@ -192,7 +192,7 @@ stylesTable = \ , (Drawing, 'gmetalv' , { 'color':'200,200,255', 'pattern':'light_antihash1.8', 'border':1 }) , (Drawing, 'gcut' , { 'color':'255,255,190', 'border':1 }) , (Drawing, 'Anabatic::Edge' , { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4, 'threshold':0.02*scale }) - , (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4, 'threshold':0.80*scale }) + , (Drawing, 'Anabatic::GCell', { 'color':'255,255,190', 'pattern':'0000000000000000', 'border':4, 'threshold':0.10*scale }) ) # ---------------------------------------------------------------------- diff --git a/crlcore/etc/common/kite.conf b/crlcore/etc/common/kite.conf index b453e659..55435e07 100644 --- a/crlcore/etc/common/kite.conf +++ b/crlcore/etc/common/kite.conf @@ -8,6 +8,7 @@ layoutTable = \ , (TypeOption , "katabatic.saturateRp" , "Saturate RoutingPad" , 0, 1 ) , (TypeOption , "katabatic.globalLengthThreshold", "Global Length Threshold", 0, 1 ) , (TypeOption , "katabatic.topRoutingLayer" , "Top Routing Layer" , 0, 1 ) + , (TypeOption , "anabatic.gcell.displayMode" , "GCell Display Mode" , 1, 1 ) , (TypeRule ,) , (TypeTitle , "Kite - Detailed Router" ) , (TypeOption , "kite.hTracksReservedLocal", "Vert. Locally Reserved Tracks", 0 ) diff --git a/cumulus/src/plugins/chip/BlockCorona.py b/cumulus/src/plugins/chip/BlockCorona.py index 221247db..dac9f219 100644 --- a/cumulus/src/plugins/chip/BlockCorona.py +++ b/cumulus/src/plugins/chip/BlockCorona.py @@ -538,6 +538,7 @@ class Corona ( object ): if self.horizontalDepth > self.verticalDepth: contactDepth = self.verticalDepth + UpdateSession.open() for i in range(self._railsNb): xBL = self._westSide .getRail(i).axis yBL = self._southSide.getRail(i).axis @@ -582,4 +583,5 @@ class Corona ( object ): self._westSide.addBlockages() self._eastSide.addBlockages() + UpdateSession.close() return diff --git a/cumulus/src/plugins/clocktree/ClockTree.py b/cumulus/src/plugins/clocktree/ClockTree.py index d4beb9c6..cb681c60 100755 --- a/cumulus/src/plugins/clocktree/ClockTree.py +++ b/cumulus/src/plugins/clocktree/ClockTree.py @@ -105,6 +105,7 @@ class HTree ( GaugeConfWrapper ): raise ErrorMessage( 3, 'ClockTree: clockTree.minimumSide (%g) is less than 100 lambda.' \ % DbU.toLambda(self.minSide) ) + UpdateSession.open() self.framework = CRL.AllianceFramework.get() self.cell = cell self.area = area @@ -126,6 +127,7 @@ class HTree ( GaugeConfWrapper ): if not self.masterClock: raise ErrorMessage( 3, 'ClockTree: Cell %s has no clock net.' % cell.getName() ) self._createChildNet( self.topBuffer, 'ck_htree' ) + UpdateSession.close() return @@ -371,6 +373,7 @@ class HTreeNode ( object ): DownBranch = 0x0010 def __init__ ( self, topTree, sourceBuffer, area, prefix, flags ): + UpdateSession.open() self.topTree = topTree self.childs = [] self.blLeafs = [] @@ -406,6 +409,7 @@ class HTreeNode ( object ): self.childs.append( HTreeNode( self.topTree, self.tlBuffer, self.tlArea(), self.prefix+'_tl', 0 ) ) self.childs.append( HTreeNode( self.topTree, self.trBuffer, self.trArea(), self.prefix+'_tr', 0 ) ) + UpdateSession.close() return def xmin ( self ): return self.area.getXMin() diff --git a/hurricane/src/hurricane/Cell.cpp b/hurricane/src/hurricane/Cell.cpp index a73b2b7c..d907a236 100644 --- a/hurricane/src/hurricane/Cell.cpp +++ b/hurricane/src/hurricane/Cell.cpp @@ -1051,6 +1051,8 @@ void Cell::materialize() { if (_flags.isset(Flags::Materialized)) return; + cdebug_log(18,1) << "Cell::materialize() " << this << endl; + _flags |= Flags::Materialized; for ( Instance* instance : getInstances() ) { @@ -1060,6 +1062,8 @@ void Cell::materialize() for ( Net* net : getNets () ) net ->materialize(); for ( Marker* marker : getMarkers() ) marker->materialize(); + + cdebug_tabw(18,-1); } void Cell::unmaterialize() @@ -1212,20 +1216,21 @@ Record* Cell::_getRecord() const { Record* record = Inherit::_getRecord(); if (record) { - record->add( getSlot("_library" , _library ) ); - record->add( getSlot("_name" , &_name ) ); - record->add( getSlot("_instances" , &_instanceMap ) ); - record->add( getSlot("_quadTree" , _quadTree ) ); - record->add( getSlot("_slaveInstances", &_slaveInstanceSet) ); - record->add( getSlot("_netMap" , &_netMap ) ); - record->add( getSlot("_netAliasSet" , &_netAliasSet ) ); - record->add( getSlot("_pinMap" , &_pinMap ) ); - record->add( getSlot("_sliceMap" , _sliceMap ) ); - record->add( getSlot("_markerSet" , &_markerSet ) ); - record->add( getSlot("_slaveEntityMap", &_slaveEntityMap ) ); - record->add( getSlot("_abutmentBox" , &_abutmentBox ) ); - record->add( getSlot("_boundingBox" , &_boundingBox ) ); - record->add( getSlot("_flags" , &_flags ) ); + record->add( getSlot("_library" , _library ) ); + record->add( getSlot("_name" , &_name ) ); + record->add( getSlot("_instances" , &_instanceMap ) ); + record->add( getSlot("_quadTree" , _quadTree ) ); + record->add( getSlot("_extensionSlices", &_extensionSlices ) ); + record->add( getSlot("_slaveInstances" , &_slaveInstanceSet) ); + record->add( getSlot("_netMap" , &_netMap ) ); + record->add( getSlot("_netAliasSet" , &_netAliasSet ) ); + record->add( getSlot("_pinMap" , &_pinMap ) ); + record->add( getSlot("_sliceMap" , _sliceMap ) ); + record->add( getSlot("_markerSet" , &_markerSet ) ); + record->add( getSlot("_slaveEntityMap" , &_slaveEntityMap ) ); + record->add( getSlot("_abutmentBox" , &_abutmentBox ) ); + record->add( getSlot("_boundingBox" , &_boundingBox ) ); + record->add( getSlot("_flags" , &_flags ) ); } return record; } @@ -1699,6 +1704,8 @@ Initializer jsonCellInitialize ( 10 ); JsonCell::JsonCell(unsigned long flags) // ************************************ : JsonEntity(flags) + , _cell (NULL) + , _materializationState(Go::autoMaterializationIsDisabled()) { remove( ".Cell" ); add( "_library" , typeid(string) ); @@ -1706,6 +1713,19 @@ JsonCell::JsonCell(unsigned long flags) add( "_abutmentBox" , typeid(Box) ); add( "+instanceMap" , typeid(JsonArray) ); add( "+netMap" , typeid(JsonArray) ); + + Go::enableAutoMaterialization(); +} + +JsonCell::~JsonCell() +// ****************** +{ + cdebug_log(19,0) << "JsonCell::~JsonCell() " << _cell << endl; + + Go::enableAutoMaterialization(); + if (_cell) _cell->materialize(); + + if (_materializationState) Go::disableAutoMaterialization(); } string JsonCell::getTypeName() const @@ -1728,10 +1748,10 @@ void JsonCell::toData(JsonStack& stack) Library* library = DataBase::getDB()->getLibrary( get(stack,"_library") , DataBase::CreateLib|DataBase::WarnCreateLib ); - Cell* cell = Cell::create( library, get(stack,"_name") ); - cell->setAbutmentBox( stack.as("_abutmentBox") ); + _cell = Cell::create( library, get(stack,"_name") ); + _cell->setAbutmentBox( stack.as("_abutmentBox") ); - update( stack, cell ); + update( stack, _cell ); } } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/ExtensionGo.cpp b/hurricane/src/hurricane/ExtensionGo.cpp index f8aefce1..b6ce2b50 100644 --- a/hurricane/src/hurricane/ExtensionGo.cpp +++ b/hurricane/src/hurricane/ExtensionGo.cpp @@ -73,7 +73,7 @@ namespace Hurricane { void ExtensionGo::unmaterialize () { - cdebug_log(18,1) << "ExtensionGo::unmaterialize() - start" << (void*)this << endl; + cdebug_log(18,1) << "ExtensionGo::unmaterialize() - start" << endl; if ( isMaterialized() ) { ExtensionSlice* slice = _cell->getExtensionSlice( getName() ); diff --git a/hurricane/src/hurricane/Go.cpp b/hurricane/src/hurricane/Go.cpp index be6ffb04..59758bc0 100644 --- a/hurricane/src/hurricane/Go.cpp +++ b/hurricane/src/hurricane/Go.cpp @@ -62,7 +62,7 @@ void Go::_postCreate() Inherit::_postCreate(); if (not autoMaterializationIsDisabled()) { - materialize(); + invalidate( true ); } // materialized after entire post creation } diff --git a/hurricane/src/hurricane/QuadTree.cpp b/hurricane/src/hurricane/QuadTree.cpp index 168adf25..eb33baa5 100644 --- a/hurricane/src/hurricane/QuadTree.cpp +++ b/hurricane/src/hurricane/QuadTree.cpp @@ -20,6 +20,7 @@ #include "hurricane/QuadTree.h" #include "hurricane/Go.h" #include "hurricane/Error.h" +#include "hurricane/Warning.h" namespace Hurricane { @@ -232,18 +233,16 @@ QuadTree::~QuadTree() const Box& QuadTree::getBoundingBox() const // **************************************** { - if (_boundingBox.isEmpty()) { - Box& boundingBox = ((QuadTree*)this)->_boundingBox; - if (_ulChild) boundingBox.merge(_ulChild->getBoundingBox()); - if (_urChild) boundingBox.merge(_urChild->getBoundingBox()); - if (_llChild) boundingBox.merge(_llChild->getBoundingBox()); - if (_lrChild) boundingBox.merge(_lrChild->getBoundingBox()); - for_each_go(go, _goSet.getElements()) { - boundingBox.merge(go->getBoundingBox()); - end_for; - } - } - return _boundingBox; + if (_boundingBox.isEmpty()) { + Box& boundingBox = const_cast( _boundingBox ); + if (_ulChild) boundingBox.merge(_ulChild->getBoundingBox()); + if (_urChild) boundingBox.merge(_urChild->getBoundingBox()); + if (_llChild) boundingBox.merge(_llChild->getBoundingBox()); + if (_lrChild) boundingBox.merge(_lrChild->getBoundingBox()); + for ( Go* go : _goSet.getElements() ) + boundingBox.merge(go->getBoundingBox()); + } + return _boundingBox; } Gos QuadTree::getGos() const @@ -322,23 +321,23 @@ string QuadTree::_getString() const } Record* QuadTree::_getRecord() const -// *************************** +// ********************************* { - Record* record = NULL; - if (_size) { - record = new Record(getString(this)); - record->add(getSlot("Parent", _parent)); - record->add(getSlot("X", &_x)); - record->add(getSlot("Y", &_y)); - record->add(getSlot("BoundingBox", &_boundingBox)); - record->add(getSlot("Size", &_size)); - record->add(getSlot("Gos", &_goSet)); - record->add(getSlot("ULChild", _ulChild)); - record->add(getSlot("URChild", _urChild)); - record->add(getSlot("LLChild", _llChild)); - record->add(getSlot("LRChild", _lrChild)); - } - return record; + Record* record = NULL; + if (_size) { + record = new Record( getString(this) ); + record->add( getSlot("_parent" , _parent ) ); + record->add( DbU::getValueSlot("_x", &_x ) ); + record->add( DbU::getValueSlot("_y", &_y ) ); + record->add( getSlot("_boundingBox", &_boundingBox) ); + record->add( getSlot("_size" , &_size ) ); + record->add( getSlot("_goSet" , &_goSet ) ); + record->add( getSlot("_ulChild" , _ulChild ) ); + record->add( getSlot("_urChild" , _urChild ) ); + record->add( getSlot("_llChild" , _llChild ) ); + record->add( getSlot("_lrChild" , _lrChild ) ); + } + return record; } QuadTree* QuadTree::_getDeepestChild(const Box& box) diff --git a/hurricane/src/hurricane/UpdateSession.cpp b/hurricane/src/hurricane/UpdateSession.cpp index 55316a0c..27192993 100644 --- a/hurricane/src/hurricane/UpdateSession.cpp +++ b/hurricane/src/hurricane/UpdateSession.cpp @@ -155,37 +155,36 @@ void Go::invalidate(bool propagateFlag) Property* property = getProperty( UpdateSession::getPropertyName() ); if (property) { - - if (not dynamic_cast(property)) - throw Error( "Can't invalidate go : bad update session type" ); - } else { - SlaveEntityMap::iterator it; - SlaveEntityMap::iterator end; - getCell()->_getSlaveEntities( this, it, end ); - for( ; it!=end ; it++ ) { - Go* go = dynamic_cast( it->second ); - if (go) go->invalidate( propagateFlag ); - } - - if (isMaterialized()) { - unmaterialize(); - put( UPDATOR_STACK->top() ); - } - - Property* cellUpdateSession = getCell()->getProperty( UpdateSession::getPropertyName() ); - if (not cellUpdateSession) { - // Put the cell in the UpdateSession relation, but *do not* unmaterialize it. - //cerr << "Notify Cell::CellAboutToChange to: " << getCell() << endl; - getCell()->put ( UPDATOR_STACK->top() ); - getCell()->notify( Cell::Flags::CellAboutToChange ); - for ( Instance* instance : getCell()->getSlaveInstances() ) { - instance->invalidate( false ); - } - } + if (not dynamic_cast(property)) + throw Error( "Can't invalidate go : bad update session type" ); + } else { + SlaveEntityMap::iterator it; + SlaveEntityMap::iterator end; + getCell()->_getSlaveEntities( this, it, end ); + for( ; it!=end ; it++ ) { + Go* go = dynamic_cast( it->second ); + if (go) go->invalidate( propagateFlag ); } - cdebug_log(18,0) << "Go::invalidate(" << this << ") - Completed." << endl; + if (isMaterialized() or not Go::autoMaterializationIsDisabled()) { + unmaterialize(); + put( UPDATOR_STACK->top() ); + } + + Property* cellUpdateSession = getCell()->getProperty( UpdateSession::getPropertyName() ); + if (not cellUpdateSession) { + // Put the cell in the UpdateSession relation, but *do not* unmaterialize it. + //cerr << "Notify Cell::CellAboutToChange to: " << getCell() << endl; + getCell()->put ( UPDATOR_STACK->top() ); + getCell()->notify( Cell::Flags::CellAboutToChange ); + for ( Instance* instance : getCell()->getSlaveInstances() ) { + instance->invalidate( false ); + } + } + } + cdebug_tabw(18,-1); + cdebug_log(18,0) << "Go::invalidate(" << this << ") - Completed." << endl; } void UpdateSession::open() @@ -210,6 +209,16 @@ void UpdateSession::close() cdebug_log(18,0) << "UpdateSession::close() - Materialization completed." << endl; } +void UpdateSession::reset() +// ************************ +{ + cdebug_log(18,1) << "UpdateSession::reset()" << endl; + + while ( UPDATOR_STACK and not UPDATOR_STACK->empty() ) close(); + + cdebug_tabw(18,-1); +} + } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/Cell.h b/hurricane/src/hurricane/hurricane/Cell.h index 82d32077..f6a4c580 100644 --- a/hurricane/src/hurricane/hurricane/Cell.h +++ b/hurricane/src/hurricane/hurricane/Cell.h @@ -566,9 +566,12 @@ class JsonCell : public JsonEntity { public: static void initialize(); public: JsonCell(unsigned long flags); + public: virtual ~JsonCell(); public: virtual string getTypeName() const; public: virtual JsonCell* clone(unsigned long) const; public: virtual void toData(JsonStack&); + private: Cell* _cell; + private: bool _materializationState; }; } // End of Hurricane namespace. diff --git a/hurricane/src/hurricane/hurricane/ExtensionSlice.h b/hurricane/src/hurricane/hurricane/ExtensionSlice.h index d8eea63b..88848ad3 100644 --- a/hurricane/src/hurricane/hurricane/ExtensionSlice.h +++ b/hurricane/src/hurricane/hurricane/ExtensionSlice.h @@ -19,12 +19,7 @@ // License along with Hurricane. If not, see // . // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | H U R R I C A N E | // | V L S I B a c k e n d D a t a - B a s e | // | | @@ -32,19 +27,16 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./hurricane/ExtensionSlice.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#ifndef __HURRICANE_EXTENSION_SLICE__ -#define __HURRICANE_EXTENSION_SLICE__ +#ifndef HURRICANE_EXTENSION_SLICE_H +#define HURRICANE_EXTENSION_SLICE_H -#include "hurricane/Mask.h" -#include "hurricane/Name.h" -#include "hurricane/ExtensionSlices.h" -#include "hurricane/QuadTree.h" +#include "hurricane/Mask.h" +#include "hurricane/Name.h" +#include "hurricane/ExtensionSlices.h" +#include "hurricane/QuadTree.h" namespace Hurricane { @@ -107,5 +99,6 @@ namespace Hurricane { } // End of Hurricane namespace. +INSPECTOR_P_SUPPORT(Hurricane::ExtensionSlice); -# endif // __HURRICANE_EXTENSION_SLICE__ +# endif // HURRICANE_EXTENSION_SLICE_H diff --git a/hurricane/src/hurricane/hurricane/UpdateSession.h b/hurricane/src/hurricane/hurricane/UpdateSession.h index d5f159c6..22beb5e4 100644 --- a/hurricane/src/hurricane/hurricane/UpdateSession.h +++ b/hurricane/src/hurricane/hurricane/UpdateSession.h @@ -74,6 +74,7 @@ class UpdateSession : public SharedProperty { public: static void open(); public: static void close(); + public: static void reset(); }; diff --git a/hurricane/src/viewer/ExceptionWidget.cpp b/hurricane/src/viewer/ExceptionWidget.cpp index 3e2599b8..f2693aa4 100644 --- a/hurricane/src/viewer/ExceptionWidget.cpp +++ b/hurricane/src/viewer/ExceptionWidget.cpp @@ -32,6 +32,7 @@ #include "hurricane/Error.h" #include "hurricane/Exception.h" #include "hurricane/TextTranslator.h" +#include "hurricane/UpdateSession.h" #include "hurricane/viewer/Graphics.h" #include "hurricane/viewer/ExceptionWidget.h" @@ -97,6 +98,8 @@ namespace Hurricane { ExceptionWidget::run( message ); } + if (failure) UpdateSession::reset(); + return failure; } diff --git a/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp index 97bd4ba2..6cbff892 100644 --- a/katana/src/GlobalRoute.cpp +++ b/katana/src/GlobalRoute.cpp @@ -150,7 +150,7 @@ namespace Katana { annotateGlobalGraph(); startMeasures(); - cmess1 << " o Running global routing..." << endl; + cmess1 << " o Running global routing." << endl; float edgeHInc = getConfiguration()->getEdgeHInc(); @@ -172,10 +172,10 @@ namespace Katana { dijkstra->run(); ++netCount; } - cmess2 << left << setw(6) << netCount << right; + cmess2 << left << setw(6) << netCount; const vector& ovEdges = getOvEdges(); - cmess2 << " ovEdges:" << ovEdges.size(); + cmess2 << " ovEdges:" << setw(4) << ovEdges.size(); for ( Edge* edge : ovEdges ) computeNextHCost( edge, edgeHInc ); @@ -185,6 +185,7 @@ namespace Katana { Edge* edge = ovEdges[iEdge]; netCount += edge->ripup(); + if (ovEdges.empty()) break; if (ovEdges[iEdge] == edge) { cerr << Error( "AnabaticEngine::globalRoute(): Unable to ripup enough segments of edge:\n" " %s" @@ -196,11 +197,11 @@ namespace Katana { dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 ); - cmess2 << " ripup:" << netCount; - stopMeasures(); + cmess2 << " ripup:" << setw(4) << netCount << right; + suspendMeasures(); cmess2 << " " << setw(10) << Timer::getStringTime (getTimer().getCombTime()) << " " << setw( 6) << Timer::getStringMemory(getTimer().getIncrease()) << endl; - startMeasures(); + resumeMeasures(); ++iteration; } while ( (netCount > 0) and (iteration < 5) ); diff --git a/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp index 97dbec9c..5f4a70bb 100644 --- a/katana/src/GraphicKatanaEngine.cpp +++ b/katana/src/GraphicKatanaEngine.cpp @@ -50,16 +50,143 @@ namespace Katana { using Hurricane::Net; using Hurricane::Graphics; using Hurricane::ColorScale; + using Hurricane::DisplayStyle; using Hurricane::ControllerWidget; using Hurricane::ExceptionWidget; using CRL::Catalog; using CRL::AllianceFramework; + using Anabatic::Edge; + using Anabatic::GCell; size_t GraphicKatanaEngine::_references = 0; GraphicKatanaEngine* GraphicKatanaEngine::_singleton = NULL; + void GraphicKatanaEngine::initGCell ( CellWidget* widget ) + { + widget->getDrawingPlanes().setPen( Qt::NoPen ); + KatanaEngine* katana = KatanaEngine::get( widget->getCell() ); + if (katana) katana->setDensityMode( GCell::MaxDensity ); + } + + + void GraphicKatanaEngine::drawGCell ( CellWidget* widget + , const Go* go + , const BasicLayer* basicLayer + , const Box& box + , const Transformation& transformation + ) + { + const GCell* gcell = static_cast(go); + + QPainter& painter = widget->getPainter(); + QPen pen = Graphics::getPen ("Anabatic::GCell",widget->getDarkening()); + Box bb = gcell->getBoundingBox(); + QRect pixelBb = widget->dbuToScreenRect(bb); + + if (gcell->isFlat()) return; + + if (GCell::getDisplayMode() == GCell::Density) { + unsigned int density = (unsigned int)( 255.0 * gcell->getDensity() ); + if (density > 255) density = 255; + + painter.setBrush( Graphics::getColorScale( ColorScale::Fire ).getBrush( density, widget->getDarkening() ) ); + painter.drawRect( pixelBb ); + } else { + if (pixelBb.width() > 150) { + painter.setPen ( pen ); + painter.setBrush( Graphics::getBrush("Anabatic::GCell",widget->getDarkening()) ); + painter.drawRect( pixelBb ); + + if (pixelBb.width() > 300) { + QString text = QString("id:%1").arg(gcell->getId()); + QFont font = Graphics::getFixedFont( QFont::Bold ); + painter.setFont(font); + + pen.setWidth( 1 ); + painter.setPen( pen ); + + painter.save (); + painter.translate( widget->dbuToScreenPoint(bb.getCenter().getX(), bb.getCenter().getY()) ); + painter.drawRect (QRect( -75, -25, 150, 50 )); + painter.drawText (QRect( -75, -25, 150, 50 ) + , text + , QTextOption(Qt::AlignCenter) + ); + painter.restore (); + } + } + } + } + + + void GraphicKatanaEngine::initEdge ( CellWidget* widget ) + { + widget->getDrawingPlanes().setPen( Qt::NoPen ); + } + + + void GraphicKatanaEngine::drawEdge ( CellWidget* widget + , const Go* go + , const BasicLayer* basicLayer + , const Box& box + , const Transformation& transformation + ) + { + static QFont font = Graphics::getFixedFont( QFont::Bold ); + static int fontHeight = QFontMetrics(font).height(); + + const Edge* edge = static_cast(go); + + if (edge) { + Box bb = edge->getBoundingBox(); + unsigned int occupancy = 255; + if (edge->getRealOccupancy() < edge->getCapacity()) + occupancy = (unsigned int)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) ); + + QPainter& painter = widget->getPainter(); + if (edge->getRealOccupancy() > edge->getCapacity()) { + QColor color ( Qt::cyan ); + painter.setPen( DisplayStyle::darken(color,widget->getDarkening()) ); + } + + QBrush brush = QBrush( Qt::white, Qt::DiagCrossPattern ); + if (edge->getCapacity() > 0.0) + brush = Graphics::getColorScale( ColorScale::Fire ).getBrush( occupancy, widget->getDarkening() ); + + QRect pixelBb = widget->dbuToScreenRect( bb, false); + painter.setPen( Qt::NoPen ); + painter.setBrush( brush ); + painter.drawRect( pixelBb ); + + if (fontHeight > ((edge->isHorizontal()) ? pixelBb.height() : pixelBb.width()) + 4) return; + + QString text = QString("%1/%2").arg(edge->getRealOccupancy()).arg(edge->getCapacity()); + QColor color ( (occupancy > 170) ? Qt::black : Qt::white ); + painter.setPen (DisplayStyle::darken(color,widget->getDarkening())); + painter.setFont(font); + + if (edge->isVertical()) { + painter.save (); + painter.translate( widget->dbuToScreenPoint(bb.getXMin(), bb.getYMin()) ); + painter.rotate ( -90 ); + painter.drawText (QRect( 0 + , 0 + , widget->dbuToScreenLength(bb.getHeight()) + , widget->dbuToScreenLength(bb.getWidth ())) + , text + , QTextOption(Qt::AlignCenter) + ); + painter.restore (); + } else + painter.drawText( widget->dbuToScreenRect(bb,false ), text, QTextOption(Qt::AlignCenter) ); + + painter.setPen( Qt::NoPen ); + } + } + + KatanaEngine* GraphicKatanaEngine::createEngine () { Cell* cell = getCell (); @@ -226,7 +353,7 @@ namespace Katana { ); _viewer->addToMenu( "placeAndRoute.katana.stepByStep.globalRoute" , "Katana - &Global Route" - , "Run the Knik global router" + , "Run the Katana global router" , std::bind(&GraphicKatanaEngine::_globalRoute,this) ); _viewer->addToMenu( "placeAndRoute.katana.stepByStep.detailedRoute" @@ -297,7 +424,10 @@ namespace Katana { GraphicKatanaEngine::GraphicKatanaEngine () : GraphicTool() , _viewer (NULL) - { } + { + addDrawGo( "Anabatic::GCell", initGCell, drawGCell ); + addDrawGo( "Anabatic::Edge" , initEdge , drawEdge ); + } GraphicKatanaEngine::~GraphicKatanaEngine () diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp index ab170196..21afd960 100644 --- a/katana/src/KatanaEngine.cpp +++ b/katana/src/KatanaEngine.cpp @@ -331,7 +331,7 @@ namespace Katana { // size_t vTracksReservedLocal = getVTracksReservedLocal(); // if (cparanoid.enabled()) { - // cparanoid << " o Post-checking Knik capacity overload h:" << hTracksReservedLocal + // cparanoid << " o Post-checking Katana capacity overload h:" << hTracksReservedLocal // << " v:." << vTracksReservedLocal << endl; // getGCellGrid()->checkEdgeOverflow( hTracksReservedLocal, vTracksReservedLocal ); // } diff --git a/katana/src/PyKatanaEngine.cpp b/katana/src/PyKatanaEngine.cpp index 93701877..8222a1da 100644 --- a/katana/src/PyKatanaEngine.cpp +++ b/katana/src/PyKatanaEngine.cpp @@ -312,7 +312,7 @@ extern "C" { , { "getToolSuccess" , (PyCFunction)PyKatanaEngine_getToolSuccess , METH_NOARGS , "Returns True if the detailed routing has been successful." } , { "runGlobalRouter" , (PyCFunction)PyKatanaEngine_runGlobalRouter , METH_VARARGS - , "Run the global router (Knik)." } + , "Run the global router (Katana)." } , { "loadGlobalRouting" , (PyCFunction)PyKatanaEngine_loadGlobalRouting , METH_VARARGS , "Load global routing into the detailed router." } , { "layerAssign" , (PyCFunction)PyKatanaEngine_layerAssign , METH_VARARGS diff --git a/katana/src/katana/GraphicKatanaEngine.h b/katana/src/katana/GraphicKatanaEngine.h index 29432356..d98fb82c 100644 --- a/katana/src/katana/GraphicKatanaEngine.h +++ b/katana/src/katana/GraphicKatanaEngine.h @@ -53,6 +53,20 @@ namespace Katana { public: enum FunctionFlags { NoFlags=0x0000, CreateEngine=0x0001 }; public: + static void initGCell ( CellWidget* ); + static void drawGCell ( CellWidget* + , const Go* + , const BasicLayer* + , const Box& + , const Transformation& + ); + static void initEdge ( CellWidget* ); + static void drawEdge ( CellWidget* + , const Go* + , const BasicLayer* + , const Box& + , const Transformation& + ); KatanaEngine* createEngine (); KatanaEngine* getForFramework ( unsigned int flags ); static GraphicKatanaEngine* grab (); diff --git a/stratus1/src/stratus/stratus.py b/stratus1/src/stratus/stratus.py index aa1afb13..abf0f85c 100644 --- a/stratus1/src/stratus/stratus.py +++ b/stratus1/src/stratus/stratus.py @@ -32,6 +32,7 @@ try: print ' - Netlist format: <%s>.' % Cfg.getParamString('stratus1.format').asString() print ' - Simulator: <%s>.' % Cfg.getParamString('stratus1.simulator').asString() + from Hurricane import UpdateSession from st_model import * from st_net import * from st_instance import * @@ -82,6 +83,7 @@ def buildModel ( moduleName, flags, className=None, modelName=None, parameters={ print '[ERROR] Stratus module <%s> do not contains a design named <%s>.' % (moduleName,className) sys.exit(1) + UpdateSession.open() print ' - Generating Stratus Model <%s> (generator:<%s>).' % (modelName, className) model = module.__dict__[className](modelName,parameters) model.Interface() @@ -93,6 +95,7 @@ def buildModel ( moduleName, flags, className=None, modelName=None, parameters={ if flags & DoStop: stopLevel = 1 model.View(stopLevel, 'Model %s' % modelName) model.Save(LOGICAL|PHYSICAL) + UpdateSession.close() except ImportError, e: module = str(e).split()[-1] diff --git a/unicorn/src/CgtMain.cpp b/unicorn/src/CgtMain.cpp index 8160460f..a046c80b 100644 --- a/unicorn/src/CgtMain.cpp +++ b/unicorn/src/CgtMain.cpp @@ -55,32 +55,12 @@ using namespace Hurricane; #include "crlcore/DefExport.h" using namespace CRL; -// #include "nimbus/NimbusEngine.h" -// using namespace Nimbus; - -// #include "metis/MetisEngine.h" -// using namespace Metis; - -// #include "mauka/GraphicMaukaEngine.h" -// using namespace Mauka; - -#include "anabatic/GraphicAnabaticEngine.h" - +#include "katana/GraphicKatanaEngine.h" #include "etesian/GraphicEtesianEngine.h" -using namespace Etesian; - #include "knik/GraphicKnikEngine.h" -using namespace Knik; - #include "kite/GraphicKiteEngine.h" -using namespace Kite; - #include "equinox/GraphicEquinoxEngine.h" -using namespace Equinox; - -#include "solstice/GraphicSolsticeEngine.h" -using namespace Solstice; - +#include "solstice/GraphicSolsticeEngine.h" #include "unicorn/UnicornGui.h" using namespace Unicorn; @@ -331,7 +311,7 @@ int main ( int argc, char *argv[] ) unicorn->setApplicationName ( QObject::tr("cgt") ); //unicorn->registerTool ( Mauka::GraphicMaukaEngine::grab() ); - unicorn->registerTool ( Anabatic::GraphicAnabaticEngine::grab() ); + unicorn->registerTool ( Katana::GraphicKatanaEngine::grab() ); unicorn->registerTool ( Etesian::GraphicEtesianEngine::grab() ); //unicorn->registerTool ( Knik::GraphicKnikEngine::grab() ); unicorn->registerTool ( Kite::GraphicKiteEngine::grab() ); @@ -403,7 +383,7 @@ int main ( int argc, char *argv[] ) unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting : Kite::KtBuildGlobalRouting; - KiteEngine* kite = KiteEngine::create ( cell ); + Kite::KiteEngine* kite = Kite::KiteEngine::create ( cell ); if ( showConf ) kite->printConfiguration (); kite->runGlobalRouter ( globalFlags ); diff --git a/unicorn/src/cgt.py b/unicorn/src/cgt.py index 4c4f5c29..8edf4498 100755 --- a/unicorn/src/cgt.py +++ b/unicorn/src/cgt.py @@ -183,7 +183,6 @@ if __name__ == '__main__': unicorn = Unicorn.UnicornGui.create() unicorn.setApplicationName ('cgt') - unicorn.registerTool (Anabatic.GraphicAnabaticEngine.grab()) unicorn.registerTool (Katana.GraphicKatanaEngine.grab()) unicorn.registerTool (Etesian.GraphicEtesianEngine.grab()) unicorn.registerTool (Kite.GraphicKiteEngine.grab())