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:
parent
e3d9ab5c23
commit
aa7b6fd620
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue