From eea67a9111f88dd4d3604f4b71974aeffc3d502c Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Thu, 23 Jan 2020 14:03:59 +0100 Subject: [PATCH] Added static bloat profile in Katana. * Change: In bootstrap/FindBoostrap.cmake, remove the -fsanitize=address as it requires the "san" librarie which may be difficult to install. * Change: In CRL/symbolic/cmos45/kite.py, decrease the METAL3 pitch from 10l to 8l. This is for testing with 4 routing metal only technology like AMS c35b4 symbolic. * Change: In Katana/BloatProfile, add static bloat option, that is, only cell bloated in the first pass will be bloated again in subsequent ones. Add a "katana.bloatOverloadAdd" parameter to more easily control the amount added to the computed overload. * Change: In Oroshi, start integration of multi capacitors as generator. Translate generator parameter into CapacitorStack ones. Add code for routing unit capacitor. --- bootstrap/cmake_modules/FindBootstrap.cmake | 6 +++-- crlcore/etc/symbolic/cmos45/kite.py | 2 +- etesian/src/EtesianEngine.cpp | 1 - katana/src/BloatProfile.cpp | 25 +++++++++++++++------ katana/src/Configuration.cpp | 8 ++++++- katana/src/katana/Configuration.h | 14 +++++++++--- katana/src/katana/KatanaEngine.h | 6 +++++ 7 files changed, 47 insertions(+), 15 deletions(-) diff --git a/bootstrap/cmake_modules/FindBootstrap.cmake b/bootstrap/cmake_modules/FindBootstrap.cmake index d32add12..5e51c3cd 100644 --- a/bootstrap/cmake_modules/FindBootstrap.cmake +++ b/bootstrap/cmake_modules/FindBootstrap.cmake @@ -94,9 +94,11 @@ set(ADDTIONAL_FLAGS "") set(CXX_STANDARD "c++11") endif() - set(CMAKE_C_FLAGS_DEBUG " -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) +#set(CMAKE_C_FLAGS_DEBUG " -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) + set(CMAKE_C_FLAGS_DEBUG " -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C Compiler Debug options." FORCE) set(CMAKE_C_FLAGS_RELEASE " -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C Compiler Release options." FORCE) - set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) +#set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall -fsanitize=address ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) + set(CMAKE_CXX_FLAGS_DEBUG "-std=${CXX_STANDARD} -Wall ${ADDTIONAL_FLAGS} ${DEBUG_FLAGS}" CACHE STRING "C++ Compiler Debug options." FORCE) set(CMAKE_CXX_FLAGS_RELEASE "-std=${CXX_STANDARD} -Wall -O2 ${ADDTIONAL_FLAGS} -DNDEBUG" CACHE STRING "C++ Compiler Release options." FORCE) diff --git a/crlcore/etc/symbolic/cmos45/kite.py b/crlcore/etc/symbolic/cmos45/kite.py index 81beda99..e9526b57 100644 --- a/crlcore/etc/symbolic/cmos45/kite.py +++ b/crlcore/etc/symbolic/cmos45/kite.py @@ -186,7 +186,7 @@ rg.addLayerGauge( RoutingLayerGauge.create( tech.getLayer('METAL3') # meta , 2 # depth. , 0.0 # density (deprecated). , l(0) # track offset from AB. - , l(10) # track pitch. + , l(8) # track pitch. , l(3) # wire width. , l(2) # VIA side (that is VIA12). , l(8) # obstacle dW. diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp index 093e008b..2aec7353 100644 --- a/etesian/src/EtesianEngine.cpp +++ b/etesian/src/EtesianEngine.cpp @@ -1053,7 +1053,6 @@ namespace Etesian { { UpdateSession::open(); - Box topAb = getBlockCell()->getAbutmentBox(); Transformation topTransformation; if (getBlockInstance()) topTransformation = getBlockInstance()->getTransformation(); topTransformation.invert(); diff --git a/katana/src/BloatProfile.cpp b/katana/src/BloatProfile.cpp index 56ceab1a..a9faa697 100644 --- a/katana/src/BloatProfile.cpp +++ b/katana/src/BloatProfile.cpp @@ -118,11 +118,13 @@ namespace { class Slice { public: - inline Slice ( Slices*, GCell* ); - inline DbU::Unit getY () const; - inline void add ( Occurrence ); - inline void sort (); - void tagOverloadeds ( size_t& count, size_t& newCount ); + inline Slice ( Slices*, GCell* ); + inline bool useStaticBloatProfile () const; + inline uint32_t getBloatOverloadAdd () const; + inline DbU::Unit getY () const; + inline void add ( Occurrence ); + inline void sort (); + void tagOverloadeds ( size_t& count, size_t& newCount ); private: Slices* _owner; GCell* _left; @@ -240,6 +242,14 @@ namespace { } + inline bool Slice::useStaticBloatProfile () const + { return _owner->getKatana()->useStaticBloatProfile(); } + + + inline uint32_t Slice::getBloatOverloadAdd () const + { return _owner->getKatana()->getBloatOverloadAdd(); } + + void Slice::tagOverloadeds ( size_t& count, size_t& newCount ) { GCell* gcell = _left; @@ -269,12 +279,13 @@ namespace { if (iLeft >= _instances.size()) break; if (overload) { - overload += 4; + overload += getBloatOverloadAdd(); for ( size_t i=iLeft ; igetKatana()->getPassNumber() > 0) continue; + if ( (_owner->getKatana()->getPassNumber() > 0) and useStaticBloatProfile() ) + continue; state = BloatExtension::create( _instances[i].getOccurrence(), overload ); ++newCount; diff --git a/katana/src/Configuration.cpp b/katana/src/Configuration.cpp index b9e94447..87f17cc3 100644 --- a/katana/src/Configuration.cpp +++ b/katana/src/Configuration.cpp @@ -48,6 +48,7 @@ namespace Katana { , _ripupLimits () , _ripupCost (Cfg::getParamInt ("katana.ripupCost" , 3)->asInt()) , _eventsLimit (Cfg::getParamInt ("katana.eventsLimit" ,4000000)->asInt()) + , _bloatOverloadAdd (Cfg::getParamInt ("katana.bloatOverloadAdd" , 4)->asInt()) , _flags (0) , _profileEventCosts (Cfg::getParamBool("katana.profileEventCosts" ,false )->asBool()) { @@ -57,7 +58,8 @@ namespace Katana { _ripupLimits[LongGlobalRipupLimit] = Cfg::getParamInt("katana.longGlobalRipupLimit" , 5)->asInt(); _ripupLimits[ShortNetRipupLimit] = Cfg::getParamInt("katana.shortNetRipupLimit" ,16)->asInt(); - if (Cfg::getParamBool("katana.useGlobalEstimate",false)->asBool()) _flags |= UseGlobalEstimate; + if (Cfg::getParamBool("katana.useGlobalEstimate" ,false)->asBool()) _flags |= UseGlobalEstimate; + if (Cfg::getParamBool("katana.useStaticBloatProfile",true )->asBool()) _flags |= UseStaticBloatProfile; // for ( size_t i=0 ; i for Cell <" << cell->getName() << ">" << endl; cout << Dots::asUInt (" - Dijkstra GR search halo" ,getSearchHalo()) << endl; cout << Dots::asBool (" - Use GR density estimate" ,useGlobalEstimate()) << endl; + cout << Dots::asBool (" - Use static bloat profile" ,useStaticBloatProfile()) << endl; cout << Dots::asDouble(" - GCell saturate ratio (LA)" ,getSaturateRatio()) << endl; cout << Dots::asUInt (" - Edge max H reserved local" ,_hTracksReservedLocal) << endl; cout << Dots::asUInt (" - Edge max V reserved local" ,_vTracksReservedLocal) << endl; @@ -168,6 +173,7 @@ namespace Katana { cout << Dots::asUInt (" - Ripup limit, locals" ,_ripupLimits[LocalRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, globals" ,_ripupLimits[GlobalRipupLimit]) << endl; cout << Dots::asUInt (" - Ripup limit, long globals" ,_ripupLimits[LongGlobalRipupLimit]) << endl; + cout << Dots::asUInt (" - Bloat overload additional penalty" ,_bloatOverloadAdd) << endl; Super::print( cell ); } diff --git a/katana/src/katana/Configuration.h b/katana/src/katana/Configuration.h index 04e542e1..4952dfcf 100644 --- a/katana/src/katana/Configuration.h +++ b/katana/src/katana/Configuration.h @@ -52,9 +52,10 @@ namespace Katana { , ShortNetRipupLimit = 4 , RipupLimitsTableSize = 5 }; - enum Constants { MaxMetalDepth = 20 }; - enum Flag { UseClockTree = (1 << 0) - , UseGlobalEstimate = (1 << 1) + enum Constants { MaxMetalDepth = 20 }; + enum Flag { UseClockTree = (1 << 0) + , UseGlobalEstimate = (1 << 1) + , UseStaticBloatProfile = (1 << 2) }; public: // Constructor & Destructor. @@ -64,6 +65,7 @@ namespace Katana { // Decorateds. inline bool useClockTree () const; inline bool useGlobalEstimate () const; + inline bool useStaticBloatProfile () const; inline bool profileEventCosts () const; // Methods. inline Anabatic::Configuration* base (); @@ -73,6 +75,7 @@ namespace Katana { inline uint32_t getRipupCost () const; uint32_t getRipupLimit ( uint32_t type ) const; inline uint32_t getSearchHalo () const; + inline uint32_t getBloatOverloadAdd () const; inline uint32_t getHTracksReservedLocal () const; inline uint32_t getVTracksReservedLocal () const; inline uint32_t getTermSatReservedLocal () const; @@ -81,6 +84,7 @@ namespace Katana { inline void setRipupCost ( uint32_t ); void setRipupLimit ( uint32_t limit, uint32_t type ); inline void setPostEventCb ( PostEventCb_t ); + inline void setBloatOverloadAdd ( uint32_t ); void setHTracksReservedLocal ( uint32_t ); void setVTracksReservedLocal ( uint32_t ); inline void setFlags ( unsigned int ); @@ -101,6 +105,7 @@ namespace Katana { uint32_t _ripupLimits [RipupLimitsTableSize]; uint32_t _ripupCost; uint64_t _eventsLimit; + uint32_t _bloatOverloadAdd; unsigned int _flags; bool _profileEventCosts; private: @@ -116,15 +121,18 @@ namespace Katana { inline uint64_t Configuration::getEventsLimit () const { return _eventsLimit; } inline uint32_t Configuration::getSearchHalo () const { return _searchHalo; } inline uint32_t Configuration::getRipupCost () const { return _ripupCost; } + inline uint32_t Configuration::getBloatOverloadAdd () const { return _bloatOverloadAdd; } inline uint32_t Configuration::getHTracksReservedLocal () const { return _hTracksReservedLocal; } inline uint32_t Configuration::getVTracksReservedLocal () const { return _vTracksReservedLocal; } inline uint32_t Configuration::getTermSatReservedLocal () const { return _termSatReservedLocal; } inline uint32_t Configuration::getTermSatThreshold () const { return _termSatThreshold; } + inline void Configuration::setBloatOverloadAdd ( uint32_t add ) { _bloatOverloadAdd = add; } inline void Configuration::setRipupCost ( uint32_t cost ) { _ripupCost = cost; } inline void Configuration::setPostEventCb ( PostEventCb_t cb ) { _postEventCb = cb; } inline void Configuration::setEventsLimit ( uint64_t limit ) { _eventsLimit = limit; } inline bool Configuration::useClockTree () const { return _flags & UseClockTree; } inline bool Configuration::useGlobalEstimate () const { return _flags & UseGlobalEstimate; } + inline bool Configuration::useStaticBloatProfile () const { return _flags & UseStaticBloatProfile; } inline bool Configuration::profileEventCosts () const { return _profileEventCosts; } inline void Configuration::setFlags ( unsigned int flags ) { _flags |= flags; } inline void Configuration::unsetFlags ( unsigned int flags ) { _flags &= ~flags; } diff --git a/katana/src/katana/KatanaEngine.h b/katana/src/katana/KatanaEngine.h index 077a0aaf..ff2888e4 100644 --- a/katana/src/katana/KatanaEngine.h +++ b/katana/src/katana/KatanaEngine.h @@ -78,6 +78,7 @@ namespace Katana { inline bool isDetailedRoutingSuccess () const; inline bool useClockTree () const; inline bool useGlobalEstimate () const; + inline bool useStaticBloatProfile () const; inline CellViewer* getViewer () const; inline AnabaticEngine* base (); inline Configuration* getKatanaConfiguration (); @@ -88,6 +89,7 @@ namespace Katana { uint32_t getRipupLimit ( const TrackElement* ) const; inline uint32_t getRipupCost () const; inline uint32_t getSearchHalo () const; + inline uint32_t getBloatOverloadAdd () const; inline uint32_t getHTracksReservedLocal () const; inline uint32_t getVTracksReservedLocal () const; inline uint32_t getTermSatReservedLocal () const; @@ -117,6 +119,7 @@ namespace Katana { inline void setMinimumWL ( double ); inline void setRipupLimit ( uint32_t type, uint32_t ); inline void setRipupCost ( uint32_t ); + inline void setBloatOverloadAdd ( uint32_t ); inline void setHTracksReservedLocal ( uint32_t ); inline void setVTracksReservedLocal ( uint32_t ); inline void addBlock ( Block* ); @@ -189,6 +192,7 @@ namespace Katana { inline bool KatanaEngine::isDetailedRoutingSuccess() const { return (_successState & DetailedRoutingSuccess); } inline bool KatanaEngine::useClockTree () const { return _configuration->useClockTree(); } inline bool KatanaEngine::useGlobalEstimate () const { return _configuration->useGlobalEstimate(); } + inline bool KatanaEngine::useStaticBloatProfile () const { return _configuration->useStaticBloatProfile(); } inline CellViewer* KatanaEngine::getViewer () const { return _viewer; } inline AnabaticEngine* KatanaEngine::base () { return static_cast(this); } inline Configuration* KatanaEngine::getKatanaConfiguration () { return _configuration; } @@ -197,6 +201,7 @@ namespace Katana { inline uint64_t KatanaEngine::getEventsLimit () const { return _configuration->getEventsLimit(); } inline uint32_t KatanaEngine::getRipupCost () const { return _configuration->getRipupCost(); } inline uint32_t KatanaEngine::getSearchHalo () const { return _configuration->getSearchHalo(); } + inline uint32_t KatanaEngine::getBloatOverloadAdd () const { return _configuration->getBloatOverloadAdd(); } inline uint32_t KatanaEngine::getHTracksReservedLocal () const { return _configuration->getHTracksReservedLocal(); } inline uint32_t KatanaEngine::getVTracksReservedLocal () const { return _configuration->getVTracksReservedLocal(); } inline uint32_t KatanaEngine::getTermSatReservedLocal () const { return _configuration->getTermSatReservedLocal(); } @@ -211,6 +216,7 @@ namespace Katana { inline void KatanaEngine::setEventLimit ( uint64_t limit ) { _configuration->setEventsLimit(limit); } inline void KatanaEngine::setRipupLimit ( uint32_t type, uint32_t limit ) { _configuration->setRipupLimit(limit,type); } inline void KatanaEngine::setRipupCost ( uint32_t cost ) { _configuration->setRipupCost(cost); } + inline void KatanaEngine::setBloatOverloadAdd ( uint32_t add ) { _configuration->setBloatOverloadAdd(add); } inline void KatanaEngine::setHTracksReservedLocal ( uint32_t reserved ) { _configuration->setHTracksReservedLocal(reserved); } inline void KatanaEngine::setVTracksReservedLocal ( uint32_t reserved ) { _configuration->setVTracksReservedLocal(reserved); } inline void KatanaEngine::addBlock ( Block* block ) { _blocks.push_back(block); }