Correction for the two-metal routing mode.

* Bug: In AnabaticEngine::loadGlobalRouting(), call relaxOverconstraineds()
    only if we are *not* in two-metal mode.
* Bug: In NetBuilder::construct(), allow any number of globals (up to 6)
    when in two-metal mode. Should be sufficent for now.
* New: In AnabaticEngine, new method _updateGContacts() to re-compute
    the positions of the global routing contacts *after* a GCell
    resize.
* Bug: In Katana::Block::resizeChannels(), must call _updateGContacts()
    after the resize to properly shift their positions.
This commit is contained in:
Jean-Paul Chaput 2018-03-02 16:55:01 +01:00
parent e3d9ab5c23
commit aa7b6fd620
5 changed files with 20 additions and 14 deletions

View File

@ -810,7 +810,8 @@ namespace Anabatic {
throw Error( badMethod, "Anabatic::loadGlobalRouting()", method, getString(_cell).c_str() ); throw Error( badMethod, "Anabatic::loadGlobalRouting()", method, getString(_cell).c_str() );
} }
cleanupGlobal(); cleanupGlobal();
relaxOverConstraineds();
if (not getConfiguration()->isTwoMetals()) relaxOverConstraineds();
_state = EngineActive; _state = EngineActive;
} }

View File

@ -619,18 +619,19 @@ namespace Anabatic {
case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break; case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break;
case Conn_2G_1PinM2: _do_xG_xM2 (); break; case Conn_2G_1PinM2: _do_xG_xM2 (); break;
default: default:
throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n" if (not isTwoMetals())
" The global routing seems to be defective." throw Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n"
, _connexity.connexity " The global routing seems to be defective."
, _connexity.fields.globals , _connexity.connexity
, _connexity.fields.M1 , _connexity.fields.globals
, _connexity.fields.M2 , _connexity.fields.M1
, _connexity.fields.M3 , _connexity.fields.M2
, _connexity.fields.Pin , _connexity.fields.M3
, _connexity.fields.Pad , _connexity.fields.Pin
, _net->_getString().c_str() , _connexity.fields.Pad
, getString(_gcell).c_str() , _net->_getString().c_str()
); , getString(_gcell).c_str()
);
_do_xG(); _do_xG();
} }

View File

@ -280,6 +280,7 @@ namespace Anabatic {
inline void _add ( GCell* ); inline void _add ( GCell* );
inline void _remove ( GCell* ); inline void _remove ( GCell* );
inline void _updateLookup ( GCell* ); inline void _updateLookup ( GCell* );
inline void _updateGContacts ();
inline void _resizeMatrix (); inline void _resizeMatrix ();
inline bool _inDestroy () const; inline bool _inDestroy () const;
// Inspector support. // Inspector support.
@ -352,6 +353,7 @@ namespace Anabatic {
inline const NetDatas& AnabaticEngine::getNetDatas () const { return _netDatas; } inline const NetDatas& AnabaticEngine::getNetDatas () const { return _netDatas; }
inline void AnabaticEngine::_updateLookup ( GCell* gcell ) { _matrix.updateLookup(gcell); } inline void AnabaticEngine::_updateLookup ( GCell* gcell ) { _matrix.updateLookup(gcell); }
inline void AnabaticEngine::_resizeMatrix () { _matrix.resize( getCell(), getGCells() ); } inline void AnabaticEngine::_resizeMatrix () { _matrix.resize( getCell(), getGCells() ); }
inline void AnabaticEngine::_updateGContacts () { for ( GCell* gcell : getGCells() ) gcell->updateGContacts(); }
inline bool AnabaticEngine::_inDestroy () const { return _flags & Flags::DestroyMask; } inline bool AnabaticEngine::_inDestroy () const { return _flags & Flags::DestroyMask; }
inline void AnabaticEngine::_add ( GCell* gcell ) inline void AnabaticEngine::_add ( GCell* gcell )

View File

@ -238,6 +238,8 @@ namespace Anabatic {
, Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 ) , Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 )
, Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 ) , Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 )
, Conn_4G = CONNEXITY_VALUE( 4, 0, 0, 0, 0 , 0 ) , Conn_4G = CONNEXITY_VALUE( 4, 0, 0, 0, 0 , 0 )
, Conn_5G = CONNEXITY_VALUE( 5, 0, 0, 0, 0 , 0 )
, Conn_6G = CONNEXITY_VALUE( 6, 0, 0, 0, 0 , 0 )
, Conn_0G_2M1 = CONNEXITY_VALUE( 0, 2, 0, 0, 0 , 0 ) , Conn_0G_2M1 = CONNEXITY_VALUE( 0, 2, 0, 0, 0 , 0 )
, Conn_1G_1M1 = CONNEXITY_VALUE( 1, 1, 0, 0, 0 , 0 ) , Conn_1G_1M1 = CONNEXITY_VALUE( 1, 1, 0, 0, 0 , 0 )
, Conn_1G_2M1 = CONNEXITY_VALUE( 1, 2, 0, 0, 0 , 0 ) , Conn_1G_2M1 = CONNEXITY_VALUE( 1, 2, 0, 0, 0 , 0 )

View File

@ -342,7 +342,7 @@ namespace Katana {
cmess2 << Dots::asString( rowName.str(), rowTracks.str() ) << endl; cmess2 << Dots::asString( rowName.str(), rowTracks.str() ) << endl;
} }
_katana->_updateGContacts();
_katana->invalidateRoutingPads(); _katana->invalidateRoutingPads();
if (not sessionReUse) Session::close(); if (not sessionReUse) Session::close();