From 086e40ec7d077ff58bd207e3a5bab05b435f3fce Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 24 Feb 2017 14:37:11 +0100 Subject: [PATCH] Katana::runTest to setup net symmetry for gmChamla nets. --- .../src/hurricane/NetRoutingProperty.cpp | 6 +- .../hurricane/hurricane/NetRoutingProperty.h | 8 +- katana/src/GraphicKatanaEngine.cpp | 12 +++ katana/src/KatanaEngine.cpp | 79 +++++++++++++++++++ katana/src/katana/GraphicKatanaEngine.h | 1 + katana/src/katana/KatanaEngine.h | 1 + 6 files changed, 101 insertions(+), 6 deletions(-) diff --git a/hurricane/src/hurricane/NetRoutingProperty.cpp b/hurricane/src/hurricane/NetRoutingProperty.cpp index 51e15b9c..7fcc1422 100644 --- a/hurricane/src/hurricane/NetRoutingProperty.cpp +++ b/hurricane/src/hurricane/NetRoutingProperty.cpp @@ -50,8 +50,10 @@ namespace Hurricane { { Record* record = new Record ( "" ); if (record != NULL) { - record->add( getSlot("_net" , _net ) ); - record->add( getSlot("_flags", _flags ) ); + record->add( getSlot("_net" , _net ) ); + record->add( getSlot("_symNet", _symNet) ); + record->add( getSlot("_flags" , _flags ) ); + record->add( DbU::getValueSlot("_axis" ,&_axis ) ); } return record; } diff --git a/hurricane/src/hurricane/hurricane/NetRoutingProperty.h b/hurricane/src/hurricane/hurricane/NetRoutingProperty.h index 7f770c47..18bc6827 100644 --- a/hurricane/src/hurricane/hurricane/NetRoutingProperty.h +++ b/hurricane/src/hurricane/hurricane/NetRoutingProperty.h @@ -44,10 +44,10 @@ namespace Hurricane { , ManualGlobalRoute = (1<< 3) , AutomaticGlobalRoute = (1<< 4) , MixedPreRoute = Fixed|ManualGlobalRoute - , Horizontal = (1<< 4) - , Vertical = (1<< 5) - , Symmetric = (1<< 6) - , SymmetricMaster = (1<< 7) + , Horizontal = (1<< 5) + , Vertical = (1<< 6) + , Symmetric = (1<< 7) + , SymmetricMaster = (1<< 8) }; public: inline bool isExcluded () const; diff --git a/katana/src/GraphicKatanaEngine.cpp b/katana/src/GraphicKatanaEngine.cpp index 829b46a8..c94f4415 100644 --- a/katana/src/GraphicKatanaEngine.cpp +++ b/katana/src/GraphicKatanaEngine.cpp @@ -269,7 +269,14 @@ namespace Katana { } } + + void GraphicKatanaEngine::_runTest () + { + KatanaEngine* katana = getForFramework( NoFlags ); + if (katana) katana->runTest(); + } + void GraphicKatanaEngine::_dumpMeasures () { KatanaEngine* katana = getForFramework( NoFlags ); @@ -374,6 +381,11 @@ namespace Katana { , "Save routed design (temporary hack)" , std::bind(&GraphicKatanaEngine::_save,this) ); + _viewer->addToMenu( "placeAndRoute.katana.stepByStep.runTest" + , "Katana - Run &Test" + , "Run Test Program (symmetric routing of gmChamla)" + , std::bind(&GraphicKatanaEngine::_runTest,this) + ); } diff --git a/katana/src/KatanaEngine.cpp b/katana/src/KatanaEngine.cpp index 90513cd3..db76e0af 100644 --- a/katana/src/KatanaEngine.cpp +++ b/katana/src/KatanaEngine.cpp @@ -45,6 +45,66 @@ #include "katana/PyKatanaEngine.h" +namespace { + + using namespace std; + using Hurricane::Error; + using Hurricane::NetRoutingState; + using Hurricane::NetRoutingExtension; + using Hurricane::Net; + using Hurricane::Cell; + + + void setSymmetricSelf ( Cell* cell, string name ) + { + Net* net = cell->getNet( name ); + if (not net) + throw Error( "::setSymmetricSelf() Net \"%s\" not found." , name.c_str() ); + + NetRoutingState* state = NetRoutingExtension::get( net ); + if (not state) state = NetRoutingExtension::create( net ); + + state->setFlags ( NetRoutingState::AutomaticGlobalRoute + | NetRoutingState::Symmetric + | NetRoutingState::Vertical ); + state->setSymAxis( cell->getAbutmentBox().getCenter().getX() ); + } + + + void setSymmetricPair ( Cell* cell, string masterName, string slaveName ) + { + Net* masterNet = cell->getNet( masterName ); + if (not masterNet) + throw Error( "::setSymmetricPair() Net \"%s\" not found." , masterName.c_str() ); + + NetRoutingState* masterState = NetRoutingExtension::get( masterNet ); + if (not masterState) masterState = NetRoutingExtension::create( masterNet ); + + masterState->setFlags ( NetRoutingState::AutomaticGlobalRoute + | NetRoutingState::Symmetric + | NetRoutingState::SymmetricMaster + | NetRoutingState::Vertical ); + masterState->setSymAxis( cell->getAbutmentBox().getCenter().getX() ); + + Net* slaveNet = cell->getNet( slaveName ); + if (not slaveNet) + throw Error( "KatanaEngine::runTest() Net \"%s\" not found." , slaveName.c_str() ); + + NetRoutingState* slaveState = NetRoutingExtension::get( slaveNet ); + if (not slaveState) slaveState = NetRoutingExtension::create( slaveNet ); + + slaveState ->setFlags ( NetRoutingState::AutomaticGlobalRoute + | NetRoutingState::Symmetric + | NetRoutingState::Vertical ); + slaveState ->setSymAxis(cell->getAbutmentBox().getCenter().getX() ); + slaveState ->setSymNet ( masterNet ); + masterState->setSymNet ( slaveNet ); + } + + +} // Anonymous namespace. + + namespace Katana { using std::cout; @@ -73,6 +133,7 @@ namespace Katana { using Hurricane::Layer; using Hurricane::Horizontal; using Hurricane::Vertical; + using Hurricane::NetRoutingState; using Hurricane::NetRoutingExtension; using Hurricane::Cell; using CRL::System; @@ -376,6 +437,24 @@ namespace Katana { } + void KatanaEngine::runTest () + { + if (getCell()->getName() != "gmchamla") + throw Error( "KatanaEngine::runTest() Work only on \"gmchamla\" (loaded:\"%s\")." + , getString(getCell()->getName()).c_str() + ); + + setSymmetricSelf( getCell(), "Vc" ); + setSymmetricSelf( getCell(), "vb5" ); + setSymmetricSelf( getCell(), "vb7" ); + setSymmetricPair( getCell(), "ampp_73", "ampn_72" ); + setSymmetricPair( getCell(), "ampp_71", "ampn_71" ); + setSymmetricPair( getCell(), "m2n_in" , "m2p_in" ); + setSymmetricPair( getCell(), "ampp_4" , "ampn_4" ); + setSymmetricPair( getCell(), "ampp_2" , "ampn_2" ); + setSymmetricPair( getCell(), "ampp_1" , "ampn_1" ); + } + void KatanaEngine::printCompletion () const { size_t routeds = 0; diff --git a/katana/src/katana/GraphicKatanaEngine.h b/katana/src/katana/GraphicKatanaEngine.h index d98fb82c..b831ce6e 100644 --- a/katana/src/katana/GraphicKatanaEngine.h +++ b/katana/src/katana/GraphicKatanaEngine.h @@ -94,6 +94,7 @@ namespace Katana { void _detailRoute (); void _finalize (); void _save (); + void _runTest (); void _dumpMeasures (); }; diff --git a/katana/src/katana/KatanaEngine.h b/katana/src/katana/KatanaEngine.h index 0c2d046a..ca0cba61 100644 --- a/katana/src/katana/KatanaEngine.h +++ b/katana/src/katana/KatanaEngine.h @@ -110,6 +110,7 @@ namespace Katana { void analogInit (); void runNegociate ( unsigned int flags=Flags::NoFlags ); void runGlobalRouter (); + void runTest (); virtual void finalizeLayout (); void _runKatanaInit (); void _gutKatana ();