From 8376d0c2095ac50e1eaa3a2d5577df5a5276bc82 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Wed, 7 Sep 2016 11:21:36 +0200 Subject: [PATCH 1/5] Remove GraphicAnabaticengine, temporarily made for debugging. * Change: In Anabatic, remove GraphicAnabaticEngine, PyGraphicAnabaticEngine, PyAnabaticEngine (but keep PyAnabatic for constants exportation) and GlobalRoute (moved to Katana). Drawing methods for Edge & GCell are moved into GraphicKatanaEngine. --- anabatic/src/CMakeLists.txt | 20 +- anabatic/src/GlobalRoute.cpp | 248 -------- anabatic/src/GraphicAnabaticEngine.cpp | 529 ------------------ anabatic/src/PyAnabatic.cpp | 17 +- anabatic/src/PyAnabaticEngine.cpp | 221 -------- anabatic/src/PyGraphicAnabaticEngine.cpp | 122 ---- anabatic/src/anabatic/GraphicAnabaticEngine.h | 92 --- anabatic/src/anabatic/PyAnabaticEngine.h | 55 -- .../src/anabatic/PyGraphicAnabaticEngine.h | 53 -- katana/src/GraphicKatanaEngine.cpp | 120 +++- katana/src/katana/GraphicKatanaEngine.h | 14 + unicorn/src/CgtMain.cpp | 28 +- unicorn/src/cgt.py | 1 - 13 files changed, 143 insertions(+), 1377 deletions(-) delete mode 100644 anabatic/src/GlobalRoute.cpp delete mode 100644 anabatic/src/GraphicAnabaticEngine.cpp delete mode 100644 anabatic/src/PyAnabaticEngine.cpp delete mode 100644 anabatic/src/PyGraphicAnabaticEngine.cpp delete mode 100644 anabatic/src/anabatic/GraphicAnabaticEngine.h delete mode 100644 anabatic/src/anabatic/PyAnabaticEngine.h delete mode 100644 anabatic/src/anabatic/PyGraphicAnabaticEngine.h 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/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/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/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/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp index 97dbec9c..228b7bc4 100644 --- a/katana/src/GraphicKatanaEngine.cpp +++ b/katana/src/GraphicKatanaEngine.cpp @@ -50,16 +50,131 @@ 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 ); + } + + + 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); + + 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 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 (); @@ -297,7 +412,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/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/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()) From 6562792e53eb486abe90920b7e94d2397a451a94 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Thu, 8 Sep 2016 21:50:17 +0200 Subject: [PATCH 2/5] Delay materialization of new objects until the UpdateSession::close(). * Change: In Hurricane::Go, instead of immediatly materializing a newly created Go (inserting it in a QuadTree) delay it until the closing of the UpdateSession. We call "invalidate()" in "_postCreate()" instead of "materialize()". This way, the abutment box of Gos is taken into account only when the session is closed. There was a problem when the abutment box was changing after the object creation misleading the algorithm of the QuadTree. This was occuring only when an object was created, not modificated, because in the later case the Session mechanism was used. Now, the Session mechanism is used in all cases. As a side effect, it will speed up the parser by making all QuadTree insertions in one step. * Change: In Hurricane::JsonCell, forgot to call Cell::materialize() when the Cell is completed (as was done in ordinary parsers). The call is made in the destructor of the JsonCell. * Change: In Hurricane::Cell, add QuadTree in the inspector support. --- hurricane/src/hurricane/Cell.cpp | 54 ++++++++++++------ hurricane/src/hurricane/ExtensionGo.cpp | 2 +- hurricane/src/hurricane/Go.cpp | 2 +- hurricane/src/hurricane/QuadTree.cpp | 55 +++++++++---------- hurricane/src/hurricane/UpdateSession.cpp | 55 +++++++++---------- hurricane/src/hurricane/hurricane/Cell.h | 3 + .../src/hurricane/hurricane/ExtensionSlice.h | 27 ++++----- 7 files changed, 106 insertions(+), 92 deletions(-) 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..ee0a6bdd 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() 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 From d8fc626678aa17c68945c34552c345c44df00362 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 10 Sep 2016 11:13:52 +0200 Subject: [PATCH 3/5] Attempt to close all UpdateSession after catching an exception. * New: In Hurricane::UpdateSession, added "reset()" static function to close all the currently opened sessions. * New: In Hurricane::ExceptionWidget::catchAllwrapper(), close all pending UpdateSession if the user choose to resume. --- hurricane/src/hurricane/UpdateSession.cpp | 10 ++++++++++ hurricane/src/hurricane/hurricane/UpdateSession.h | 1 + hurricane/src/viewer/ExceptionWidget.cpp | 3 +++ 3 files changed, 14 insertions(+) diff --git a/hurricane/src/hurricane/UpdateSession.cpp b/hurricane/src/hurricane/UpdateSession.cpp index ee0a6bdd..27192993 100644 --- a/hurricane/src/hurricane/UpdateSession.cpp +++ b/hurricane/src/hurricane/UpdateSession.cpp @@ -209,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/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; } From ce00b37cbf2c2ba4ee22f08fe6895e3d0e34eb47 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 10 Sep 2016 18:49:48 +0200 Subject: [PATCH 4/5] Enable the display of GCells as a density map (and not boundaries). * Bug: In Anabatic::RawGCellsUnder, *again*, the north and east borders of the whole area *are* includeds (shut up disgraceful warning). * New: In Anabatic::GCell, add a display mode to select between boundary display (for analogic) and density display (for numeric). * Bug: In KatanaEngine::runGlobalRouter(), do not check if an Edge cannot be desatured when the vector or overloaded Edges is empty. (one less disgraceful warning) * New: In GraphicKatanaEngine::drawGCell(), support for drawing the GCells in density mode. Use the fire scale and the MaxDensity mode. Setup the GCell drawing mode in GraphicKatanaEngine::initGCell(). * Change: In GraphicKatanaEngine::drawEdge(), adjust the various thresholds for showing the Edge and its label. * New: In CRL Core, adds "anabatic.gcell.displayMode" to the set of Anabatic parameters. Adjust the showing threshold for GCells in "display.conf" so when the zoom level is low, we still can see the density map. --- anabatic/src/AnabaticEngine.cpp | 4 +-- anabatic/src/Configuration.cpp | 5 +++ anabatic/src/Edge.cpp | 14 ++++++--- anabatic/src/GCell.cpp | 17 +++++----- anabatic/src/LoadGlobalRouting.cpp | 2 +- anabatic/src/anabatic/GCell.h | 6 ++++ crlcore/etc/cmos/kite.conf | 4 +++ crlcore/etc/common/display.conf | 4 +-- crlcore/etc/common/kite.conf | 1 + katana/src/GlobalRoute.cpp | 7 +++-- katana/src/GraphicKatanaEngine.cpp | 50 ++++++++++++++++++------------ katana/src/KatanaEngine.cpp | 2 +- katana/src/PyKatanaEngine.cpp | 2 +- 13 files changed, 77 insertions(+), 41 deletions(-) diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index c1c0f50f..80fe8d3f 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)." 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/LoadGlobalRouting.cpp b/anabatic/src/LoadGlobalRouting.cpp index 8f745bfe..6f457673 100644 --- a/anabatic/src/LoadGlobalRouting.cpp +++ b/anabatic/src/LoadGlobalRouting.cpp @@ -2222,7 +2222,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/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/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/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp index 97bd4ba2..cee3fee5 100644 --- a/katana/src/GlobalRoute.cpp +++ b/katana/src/GlobalRoute.cpp @@ -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,7 +197,7 @@ namespace Katana { dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 ); - cmess2 << " ripup:" << netCount; + cmess2 << " ripup:" << setw(4) << netCount << right; stopMeasures(); cmess2 << " " << setw(10) << Timer::getStringTime (getTimer().getCombTime()) << " " << setw( 6) << Timer::getStringMemory(getTimer().getIncrease()) << endl; diff --git a/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp index 228b7bc4..5f4a70bb 100644 --- a/katana/src/GraphicKatanaEngine.cpp +++ b/katana/src/GraphicKatanaEngine.cpp @@ -66,6 +66,8 @@ namespace Katana { void GraphicKatanaEngine::initGCell ( CellWidget* widget ) { widget->getDrawingPlanes().setPen( Qt::NoPen ); + KatanaEngine* katana = KatanaEngine::get( widget->getCell() ); + if (katana) katana->setDensityMode( GCell::MaxDensity ); } @@ -83,28 +85,38 @@ namespace Katana { 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); + if (GCell::getDisplayMode() == GCell::Density) { + unsigned int density = (unsigned int)( 255.0 * gcell->getDensity() ); + if (density > 255) density = 255; - pen.setWidth( 1 ); - painter.setPen( pen ); + 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 ); - 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 (); + 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 (); + } + } } } @@ -341,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" 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 From 5435ca19336eb74abaae00dffb12794a3024e10e Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sun, 11 Sep 2016 13:20:05 +0200 Subject: [PATCH 5/5] Added missing UpdateSession in Stratus & Plugins. * Bug: In Cumulus & Stratus, now that creation of Hurricane objects must be enclosed in UpdateSession, has to adds them into Python code. * Bug: In Anabatic & Katana, in the global routing stage suspend the timed bewteen ripup steps instead of resetting it. --- anabatic/src/AnabaticEngine.cpp | 8 ++++++++ anabatic/src/anabatic/AnabaticEngine.h | 2 ++ cumulus/src/plugins/chip/BlockCorona.py | 2 ++ cumulus/src/plugins/clocktree/ClockTree.py | 4 ++++ katana/src/GlobalRoute.cpp | 6 +++--- stratus1/src/stratus/stratus.py | 3 +++ 6 files changed, 22 insertions(+), 3 deletions(-) diff --git a/anabatic/src/AnabaticEngine.cpp b/anabatic/src/AnabaticEngine.cpp index 80fe8d3f..0c5c3f6f 100644 --- a/anabatic/src/AnabaticEngine.cpp +++ b/anabatic/src/AnabaticEngine.cpp @@ -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/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/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/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp index cee3fee5..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(); @@ -198,10 +198,10 @@ namespace Katana { dijkstra->setSearchAreaHalo( Session::getSliceHeight()*3 ); cmess2 << " ripup:" << setw(4) << netCount << right; - stopMeasures(); + 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/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]