From 339ed4f9ffa0d90d84a41c4680def1357374bc02 Mon Sep 17 00:00:00 2001 From: Gabriel Gouvine Date: Thu, 2 Nov 2023 20:02:43 +0100 Subject: [PATCH] Introduce flags for placement callbacks in Etesian --- katana/src/Constants.cpp | 1 + katana/src/GlobalRoute.cpp | 23 +++++++++++++++++++---- katana/src/KatanaEngine.cpp | 19 ++++++++++--------- katana/src/PyKatanaEngine.cpp | 22 ++++++++++++++-------- katana/src/katana/Constants.h | 1 + katana/src/katana/KatanaEngine.h | 4 ++-- 6 files changed, 47 insertions(+), 23 deletions(-) diff --git a/katana/src/Constants.cpp b/katana/src/Constants.cpp index 694f5a6d..47d1ae50 100644 --- a/katana/src/Constants.cpp +++ b/katana/src/Constants.cpp @@ -40,6 +40,7 @@ namespace Katana { const Hurricane::BaseFlags Flags::ShowOverloadedGCells = (1L << 36); const Hurricane::BaseFlags Flags::ShowBloatedInstances = (1L << 37); const Hurricane::BaseFlags Flags::ProtectSelf = (1L << 38); + const Hurricane::BaseFlags Flags::PlacementCallback = (1L << 39); } // Anabatic namespace. diff --git a/katana/src/GlobalRoute.cpp b/katana/src/GlobalRoute.cpp index 66703b45..262e1914 100644 --- a/katana/src/GlobalRoute.cpp +++ b/katana/src/GlobalRoute.cpp @@ -380,12 +380,15 @@ namespace Katana { } - void KatanaEngine::setupGlobalGraph ( uint32_t mode ) + void KatanaEngine::setupGlobalGraph ( Flags flags ) { Cell* cell = getCell(); cell->flattenNets( Cell::Flags::BuildRings|Cell::Flags::WarnOnUnplacedInstances ); - cell->createRoutingPadRings( Cell::Flags::BuildRings ); + + if (!(flags & Flags::PlacementCallback)) { + cell->createRoutingPadRings( Cell::Flags::BuildRings ); + } startMeasures(); @@ -500,6 +503,15 @@ namespace Katana { if (flags & Flags::ShowBloatedInstances) selectBloatedInstances( this ); Breakpoint::stop( 100, "Bloated cells from previous placement iteration." ); + if (not isChannelStyle()) { + if (!(flags & Flags::PlacementCallback)) { + setupPowerRails(); + Flags protectFlags = (getConfiguration()->getNetBuilderStyle() == "VH,2RL") + ? Flags::ProtectSelf : Flags::NoFlags; + protectRoutingPads( protectFlags ); + } + } + startMeasures(); cmess1 << " o Running global routing." << endl; @@ -708,8 +720,11 @@ namespace Katana { Session::close(); if (isChannelStyle()) { setupRoutingPlanes(); - setupPowerRails(); - protectRoutingPads(); + + if (!(flags & Flags::PlacementCallback)) { + setupPowerRails(); + protectRoutingPads(); + } } setState( EngineState::EngineGlobalLoaded ); diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp index 31ee4ca0..9b000743 100644 --- a/katana/src/KatanaEngine.cpp +++ b/katana/src/KatanaEngine.cpp @@ -240,7 +240,7 @@ namespace Katana { } - void KatanaEngine::digitalInit () + void KatanaEngine::digitalInit ( Flags flags ) { cdebug_log(155,1) << "KatanaEngine::_initDataBase()" << endl; _runKatanaInit(); @@ -250,7 +250,7 @@ namespace Katana { Super::chipPrep(); setupChannelMode(); - setupGlobalGraph( 0 ); + setupGlobalGraph( flags ); if (not isChannelStyle()) { setupRoutingPlanes(); } @@ -258,15 +258,16 @@ namespace Katana { if (not setupPreRouteds()) { setState( Anabatic::EngineDriving ); throw Error( "KatanaEngine::digitalInit(): All nets are already routed, doing nothing." ); - } else { - if (not isChannelStyle()) { - setupPowerRails(); - Flags flags = (getConfiguration()->getNetBuilderStyle() == "VH,2RL") - ? Flags::ProtectSelf : Flags::NoFlags; - protectRoutingPads( flags ); - } } + if (not isChannelStyle()) { + if (!(flags & Flags::PlacementCallback)) { + setupPowerRails(); + Flags protectFlags = (getConfiguration()->getNetBuilderStyle() == "VH,2RL") + ? Flags::ProtectSelf : Flags::NoFlags; + protectRoutingPads( protectFlags ); + } + } cdebug_tabw(155,-1); } diff --git a/katana/src/PyKatanaEngine.cpp b/katana/src/PyKatanaEngine.cpp index aa0120ba..870a580b 100644 --- a/katana/src/PyKatanaEngine.cpp +++ b/katana/src/PyKatanaEngine.cpp @@ -153,19 +153,25 @@ extern "C" { } - PyObject* PyKatanaEngine_digitalInit ( PyKatanaEngine* self ) + PyObject* PyKatanaEngine_digitalInit ( PyKatanaEngine* self, PyObject* args ) { cdebug_log(40,0) << "PyKatanaEngine_digitalInit()" << endl; HTRY METHOD_HEAD("KatanaEngine.digitalInit()") - if (katana->getViewer()) { - if (ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::digitalInit,katana) )) { - PyErr_SetString( HurricaneError, "KatanaEngine::digitalInit() has thrown an exception (C++)." ); - return NULL; + uint64_t flags = 0; + if (PyArg_ParseTuple(args,"|L:KatanaEngine.digitalInit", &flags)) { + if (katana->getViewer()) { + if (ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::digitalInit,katana, flags) )) { + PyErr_SetString( HurricaneError, "KatanaEngine::digitalInit() has thrown an exception (C++)." ); + return NULL; + } + } else { + katana->digitalInit( flags ); } } else { - katana->digitalInit(); + PyErr_SetString(ConstructorError, "KatanaEngine.digitalInit(): Invalid number/bad type of parameter."); + return NULL; } HCATCH @@ -203,7 +209,7 @@ extern "C" { HTRY METHOD_HEAD("KatanaEngine.runGlobalRouter()") uint64_t flags = 0; - if (PyArg_ParseTuple(args,"L:KatanaEngine.runGlobalRouter", &flags)) { + if (PyArg_ParseTuple(args,"|L:KatanaEngine.runGlobalRouter", &flags)) { if (katana->getViewer()) { if (ExceptionWidget::catchAllWrapper( std::bind(&KatanaEngine::runGlobalRouter,katana,flags) )) { PyErr_SetString( HurricaneError, "KatanaEngine::runGlobalrouter() has thrown an exception (C++)." ); @@ -344,7 +350,7 @@ extern "C" { , "Create a Katana engine on this cell." } , { "setViewer" , (PyCFunction)PyKatanaEngine_setViewer , METH_VARARGS , "Associate a Viewer to this KatanaEngine." } - , { "digitalInit" , (PyCFunction)PyKatanaEngine_digitalInit , METH_NOARGS + , { "digitalInit" , (PyCFunction)PyKatanaEngine_digitalInit , METH_VARARGS , "Setup Katana for digital routing." } , { "exclude" , (PyCFunction)PyKatanaEngine_exclude , METH_VARARGS , "Exclude a net from routing." } diff --git a/katana/src/katana/Constants.h b/katana/src/katana/Constants.h index a16e5bbd..fe591f7d 100644 --- a/katana/src/katana/Constants.h +++ b/katana/src/katana/Constants.h @@ -49,6 +49,7 @@ namespace Katana { static const Hurricane::BaseFlags ShowOverloadedGCells; static const Hurricane::BaseFlags ShowBloatedInstances; static const Hurricane::BaseFlags ProtectSelf; + static const Hurricane::BaseFlags PlacementCallback; public: inline Flags ( uint64_t ); inline Flags ( const Super& ); diff --git a/katana/src/katana/KatanaEngine.h b/katana/src/katana/KatanaEngine.h index ba99c207..b89d7e54 100644 --- a/katana/src/katana/KatanaEngine.h +++ b/katana/src/katana/KatanaEngine.h @@ -126,10 +126,10 @@ namespace Katana { void setInterrupt ( bool ); void createChannels (); void setupRoutingPlanes (); - void setupGlobalGraph ( uint32_t mode ); + void setupGlobalGraph ( Flags flags=Flags::NoFlags ); void annotateGlobalGraph (); void setFixedPreRouted (); - void digitalInit (); + void digitalInit ( Flags flags=Flags::NoFlags ); void analogInit (); void pairSymmetrics (); void updateEstimateDensity ( NetData*, double weight );