From dbdef9901f755e2ace7104bee1132b32938470c9 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sat, 22 May 2021 15:04:13 +0200 Subject: [PATCH] Separate the antenna max. WL into two distinct settings. Split "antennaMaxWL" into : * "etesian.antennaGateMaxWL" : max length *without* any diode. * "etesian.antennaDiodeMaxWL" : max length that *one* diode can support. --- etesian/src/Configuration.cpp | 78 +++++++++++++++++------------ etesian/src/EtesianEngine.cpp | 2 +- etesian/src/etesian/Configuration.h | 9 ++-- etesian/src/etesian/EtesianEngine.h | 6 ++- 4 files changed, 56 insertions(+), 39 deletions(-) diff --git a/etesian/src/Configuration.cpp b/etesian/src/Configuration.cpp index 6973b146..87f32774 100644 --- a/etesian/src/Configuration.cpp +++ b/etesian/src/Configuration.cpp @@ -51,24 +51,25 @@ namespace Etesian { // Class : "Etesian::Configuration". Configuration::Configuration ( const RoutingGauge* rg, const CellGauge* cg ) - : _rg ( NULL ) - , _cg ( NULL ) - , _placeEffort ( static_cast - (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) ) - , _updateConf ( static_cast - (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) ) - , _spreadingConf ( Cfg::getParamBool ("etesian.uniformDensity" , false )->asBool()? ForceUniform : MaxDensity ) - , _routingDriven ( Cfg::getParamBool ("etesian.routingDriven" , false )->asBool()) - , _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() ) - , _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() ) + : _rg ( NULL ) + , _cg ( NULL ) + , _placeEffort ( static_cast + (Cfg::getParamEnumerate ("etesian.effort" , Standard )->asInt()) ) + , _updateConf ( static_cast + (Cfg::getParamEnumerate ("etesian.graphics" , LowerBound )->asInt()) ) + , _spreadingConf ( Cfg::getParamBool ("etesian.uniformDensity" , false )->asBool()? ForceUniform : MaxDensity ) + , _routingDriven ( Cfg::getParamBool ("etesian.routingDriven" , false )->asBool()) + , _spaceMargin ( Cfg::getParamPercentage("etesian.spaceMargin" , 5.0)->asDouble() ) + , _aspectRatio ( Cfg::getParamPercentage("etesian.aspectRatio" ,100.0)->asDouble() ) , _antennaInsertThreshold - ( Cfg::getParamDouble ("etesian.antennaInsertThreshold", 50.0)->asDouble() ) - , _feedNames ( Cfg::getParamString ("etesian.feedNames" ,"tie_x0,rowend_x0")->asString() ) - , _diodeName ( Cfg::getParamString ("etesian.diodeName" ,"dio_x0" )->asString() ) - , _spareBufferName( Cfg::getParamString ("spares.buffer" ,"buf_x8" )->asString() ) - , _bloat ( Cfg::getParamString ("etesian.bloat" ,"disabled" )->asString() ) - , _latchUpDistance( Cfg::getParamInt ("etesian.latchUpDistance",0 )->asInt() ) - , _antennaMaxWL ( Cfg::getParamInt ("etesian.antennaMaxWL" ,0 )->asInt() ) + ( Cfg::getParamDouble ("etesian.antennaInsertThreshold", 50.0)->asDouble() ) + , _feedNames ( Cfg::getParamString ("etesian.feedNames" ,"tie_x0,rowend_x0")->asString() ) + , _diodeName ( Cfg::getParamString ("etesian.diodeName" ,"dio_x0" )->asString() ) + , _spareBufferName ( Cfg::getParamString ("spares.buffer" ,"buf_x8" )->asString() ) + , _bloat ( Cfg::getParamString ("etesian.bloat" ,"disabled" )->asString() ) + , _latchUpDistance ( Cfg::getParamInt ("etesian.latchUpDistance",0 )->asInt() ) + , _antennaGateMaxWL ( Cfg::getParamInt ("etesian.antennaGateMaxWL" ,0 )->asInt() ) + , _antennaDiodeMaxWL( Cfg::getParamInt ("etesian.antennaDiodeMaxWL" ,0 )->asInt() ) { string gaugeName = Cfg::getParamString("anabatic.routingGauge","sxlib")->asString(); if (cg == NULL) { @@ -86,24 +87,33 @@ namespace Etesian { _rg = rg->getClone(); _cg = cg->getClone(); + + if (_antennaGateMaxWL and not _antennaDiodeMaxWL) { + _antennaDiodeMaxWL = _antennaGateMaxWL; + cerr << Warning( "Etesian::Configuration(): \"etesian.antennaGateMaxWL\" is defined but not \"etesian.antennaDiodeMaxWL\".\n" + " Setting both to %s" + , DbU::getValueString(_antennaGateMaxWL).c_str() + ) << endl; + } } Configuration::Configuration ( const Configuration& other ) - : _rg (NULL) - , _cg (NULL) - , _placeEffort ( other._placeEffort ) - , _updateConf ( other._updateConf ) - , _spreadingConf ( other._spreadingConf ) - , _spaceMargin ( other._spaceMargin ) - , _aspectRatio ( other._aspectRatio ) + : _rg (NULL) + , _cg (NULL) + , _placeEffort ( other._placeEffort ) + , _updateConf ( other._updateConf ) + , _spreadingConf ( other._spreadingConf ) + , _spaceMargin ( other._spaceMargin ) + , _aspectRatio ( other._aspectRatio ) , _antennaInsertThreshold( other._antennaInsertThreshold ) - , _feedNames ( other._feedNames ) - , _diodeName ( other._diodeName ) - , _spareBufferName( other._spareBufferName ) - , _bloat ( other._bloat ) - , _latchUpDistance( other._latchUpDistance ) - , _antennaMaxWL ( other._antennaMaxWL ) + , _feedNames ( other._feedNames ) + , _diodeName ( other._diodeName ) + , _spareBufferName ( other._spareBufferName ) + , _bloat ( other._bloat ) + , _latchUpDistance ( other._latchUpDistance ) + , _antennaGateMaxWL ( other._antennaGateMaxWL ) + , _antennaDiodeMaxWL( other._antennaDiodeMaxWL ) { if (other._rg) _rg = other._rg->getClone(); if (other._cg) _cg = other._cg->getClone(); @@ -132,7 +142,8 @@ namespace Etesian { cmess1 << Dots::asPercentage(" - Aspect Ratio" ,_aspectRatio ) << endl; cmess1 << Dots::asString (" - Bloat model" ,_bloat ) << endl; cmess1 << Dots::asPercentage(" - Antenna Insert" ,_antennaInsertThreshold ) << endl; - cmess1 << Dots::asString (" - Antenna Max. WL" ,DbU::getValueString(_antennaMaxWL )) << endl; + cmess1 << Dots::asString (" - Antenna gate Max. WL" ,DbU::getValueString(_antennaGateMaxWL )) << endl; + cmess1 << Dots::asString (" - Antenna diode Max. WL",DbU::getValueString(_antennaDiodeMaxWL)) << endl; cmess1 << Dots::asString (" - Latch up Distance",DbU::getValueString(_latchUpDistance)) << endl; } @@ -166,8 +177,9 @@ namespace Etesian { record->add ( getSlot( "_diodeName" , _diodeName ) ); record->add ( getSlot( "_spareBufferName" , _spareBufferName ) ); record->add ( getSlot( "_bloat" , _bloat ) ); - record->add ( DbU::getValueSlot( "_latchUpDistance", &_latchUpDistance ) ); - record->add ( DbU::getValueSlot( "_antennaMaxWL" , &_antennaMaxWL ) ); + record->add ( DbU::getValueSlot( "_latchUpDistance" , &_latchUpDistance ) ); + record->add ( DbU::getValueSlot( "_antennaGateMaxWL" , &_antennaGateMaxWL ) ); + record->add ( DbU::getValueSlot( "_antennaDiodeMaxWL", &_antennaDiodeMaxWL ) ); return record; } diff --git a/etesian/src/EtesianEngine.cpp b/etesian/src/EtesianEngine.cpp index b600916b..93522d8c 100644 --- a/etesian/src/EtesianEngine.cpp +++ b/etesian/src/EtesianEngine.cpp @@ -1285,7 +1285,7 @@ namespace Etesian { void EtesianEngine::antennaProtect () { - DbU::Unit maxWL = getAntennaMaxWL(); + DbU::Unit maxWL = getAntennaGateMaxWL(); if (not maxWL) return; cmess1 << " o Inserting antenna effect protection." << endl; diff --git a/etesian/src/etesian/Configuration.h b/etesian/src/etesian/Configuration.h index a145e302..e22d08ef 100644 --- a/etesian/src/etesian/Configuration.h +++ b/etesian/src/etesian/Configuration.h @@ -73,7 +73,8 @@ namespace Etesian { inline string getSpareBufferName () const; inline string getBloat () const; inline DbU::Unit getLatchUpDistance () const; - inline DbU::Unit getAntennaMaxWL () const; + inline DbU::Unit getAntennaGateMaxWL () const; + inline DbU::Unit getAntennaDiodeMaxWL () const; inline void setSpaceMargin ( double ); inline void setAspectRatio ( double ); void print ( Cell* ) const; @@ -96,7 +97,8 @@ namespace Etesian { string _spareBufferName; string _bloat; DbU::Unit _latchUpDistance; - DbU::Unit _antennaMaxWL; + DbU::Unit _antennaGateMaxWL; + DbU::Unit _antennaDiodeMaxWL; private: Configuration ( const Configuration& ); Configuration& operator= ( const Configuration& ); @@ -117,7 +119,8 @@ namespace Etesian { inline string Configuration::getSpareBufferName () const { return _spareBufferName; } inline string Configuration::getBloat () const { return _bloat; } inline DbU::Unit Configuration::getLatchUpDistance () const { return _latchUpDistance; } - inline DbU::Unit Configuration::getAntennaMaxWL () const { return _antennaMaxWL; } + inline DbU::Unit Configuration::getAntennaGateMaxWL () const { return _antennaGateMaxWL; } + inline DbU::Unit Configuration::getAntennaDiodeMaxWL () const { return _antennaDiodeMaxWL; } inline void Configuration::setSpaceMargin ( double margin ) { _spaceMargin = margin; } inline void Configuration::setAspectRatio ( double ratio ) { _aspectRatio = ratio; } diff --git a/etesian/src/etesian/EtesianEngine.h b/etesian/src/etesian/EtesianEngine.h index 8122c564..7dd8b414 100644 --- a/etesian/src/etesian/EtesianEngine.h +++ b/etesian/src/etesian/EtesianEngine.h @@ -93,7 +93,8 @@ namespace Etesian { inline double getSpaceMargin () const; inline double getAspectRatio () const; inline double getAntennaInsertThreshold () const; - inline DbU::Unit getAntennaMaxWL () const; + inline DbU::Unit getAntennaGateMaxWL () const; + inline DbU::Unit getAntennaDiodeMaxWL () const; inline DbU::Unit getLatchUpDistance () const; inline const FeedCells& getFeedCells () const; inline const BufferCells& getBufferCells () const; @@ -209,7 +210,8 @@ namespace Etesian { inline double EtesianEngine::getSpaceMargin () const { return getConfiguration()->getSpaceMargin(); } inline double EtesianEngine::getAspectRatio () const { return getConfiguration()->getAspectRatio(); } inline double EtesianEngine::getAntennaInsertThreshold () const { return getConfiguration()->getAntennaInsertThreshold(); } - inline DbU::Unit EtesianEngine::getAntennaMaxWL () const { return getConfiguration()->getAntennaMaxWL(); } + inline DbU::Unit EtesianEngine::getAntennaGateMaxWL () const { return getConfiguration()->getAntennaGateMaxWL(); } + inline DbU::Unit EtesianEngine::getAntennaDiodeMaxWL () const { return getConfiguration()->getAntennaDiodeMaxWL(); } inline DbU::Unit EtesianEngine::getLatchUpDistance () const { return getConfiguration()->getLatchUpDistance(); } inline void EtesianEngine::useFeed ( Cell* cell ) { _feedCells.useFeed(cell); } inline const FeedCells& EtesianEngine::getFeedCells () const { return _feedCells; }