Correct way too slow clock-tree. Backport Katana fixes to Kite.
* Bug: In Hurricane::Net::setExternal(), do not perform an UpdateSession inside this function, it leads to unbearibly slow operation in the clock-tree plugin. * Bug: In Kite, backport corrections done in Katana and also relevant for Kite. * New: In Cumulus.ChipPlugin.py add support for Python profiling with cProfile. Disabled under normal operation, but will certainly come in handy sometimes.
This commit is contained in:
parent
10098e1371
commit
d175e1b27a
|
@ -20,6 +20,8 @@ try:
|
||||||
import os.path
|
import os.path
|
||||||
import optparse
|
import optparse
|
||||||
import math
|
import math
|
||||||
|
import cProfile
|
||||||
|
import pstats
|
||||||
import Cfg
|
import Cfg
|
||||||
import Hurricane
|
import Hurricane
|
||||||
from Hurricane import DataBase
|
from Hurricane import DataBase
|
||||||
|
@ -151,10 +153,18 @@ class PlaceCore ( chip.Configuration.ChipConfWrapper ):
|
||||||
etesian.place()
|
etesian.place()
|
||||||
etesian.destroy()
|
etesian.destroy()
|
||||||
|
|
||||||
|
#profile = cProfile.Profile()
|
||||||
|
#profile.enable()
|
||||||
ht.connectLeaf()
|
ht.connectLeaf()
|
||||||
#ht.prune()
|
#ht.prune()
|
||||||
ht.route()
|
ht.route()
|
||||||
ht.save( self.cell )
|
ht.save( self.cell )
|
||||||
|
#profile.disable()
|
||||||
|
|
||||||
|
#stats = pstats.Stats( profile, stream=sys.stderr )
|
||||||
|
#stats.strip_dirs()
|
||||||
|
#stats.sort_stats( 'cumtime' )
|
||||||
|
#stats.print_stats()
|
||||||
else:
|
else:
|
||||||
if Cfg.getParamString('clockTree.placerEngine').asString() != 'Etesian':
|
if Cfg.getParamString('clockTree.placerEngine').asString() != 'Etesian':
|
||||||
mauka = Mauka.MaukaEngine.create( coreCell )
|
mauka = Mauka.MaukaEngine.create( coreCell )
|
||||||
|
|
|
@ -465,23 +465,23 @@ void Net::setGlobal(bool isGlobal)
|
||||||
void Net::setExternal(bool isExternal)
|
void Net::setExternal(bool isExternal)
|
||||||
// ***********************************
|
// ***********************************
|
||||||
{
|
{
|
||||||
if (isExternal != _isExternal) {
|
if (isExternal != _isExternal) {
|
||||||
if (!isExternal) {
|
if (not isExternal) {
|
||||||
if (!getConnectedSlavePlugs().isEmpty())
|
if (not getConnectedSlavePlugs().isEmpty())
|
||||||
throw Error("Can't set internal : has connected slave plugs");
|
throw Error( "Net::setExternal(): Cannot set \"%s\" of \"%s\" internal, has connected slave plugs"
|
||||||
_direction = Direction::UNDEFINED;
|
, getString(getName()).c_str()
|
||||||
}
|
, getString(getCell()->getName()).c_str()
|
||||||
_isExternal = isExternal;
|
);
|
||||||
if (_isExternal) {
|
_direction = Direction::UNDEFINED;
|
||||||
UpdateSession::open();
|
|
||||||
setPosition(Point(0,0));
|
|
||||||
for_each_instance(instance, _cell->getSlaveInstances()) {
|
|
||||||
Plug::_create(instance, this);
|
|
||||||
end_for;
|
|
||||||
}
|
|
||||||
UpdateSession::close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
_isExternal = isExternal;
|
||||||
|
if (_isExternal) {
|
||||||
|
setPosition( Point(0,0) );
|
||||||
|
for ( Instance* instance : _cell->getSlaveInstances() ) {
|
||||||
|
Plug::_create( instance, this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Net::setAutomatic(bool isAutomatic)
|
void Net::setAutomatic(bool isAutomatic)
|
||||||
|
|
|
@ -426,6 +426,16 @@ namespace Katabatic {
|
||||||
if (spinFlags & SegSourceBottom) setFlags( SegTargetBottom );
|
if (spinFlags & SegSourceBottom) setFlags( SegTargetBottom );
|
||||||
if (spinFlags & SegTargetTop ) setFlags( SegSourceTop );
|
if (spinFlags & SegTargetTop ) setFlags( SegSourceTop );
|
||||||
if (spinFlags & SegTargetBottom) setFlags( SegSourceBottom );
|
if (spinFlags & SegTargetBottom) setFlags( SegSourceBottom );
|
||||||
|
|
||||||
|
unsigned int invalidatedFlags = _flags & (SegInvalidatedSource|SegInvalidatedTarget);
|
||||||
|
unsetFlags( SegInvalidatedSource|SegInvalidatedTarget );
|
||||||
|
if (invalidatedFlags & SegInvalidatedSource) setFlags( SegInvalidatedTarget );
|
||||||
|
if (invalidatedFlags & SegInvalidatedTarget) setFlags( SegInvalidatedSource );
|
||||||
|
|
||||||
|
unsigned int terminalFlags = _flags & SegStrongTerminal;
|
||||||
|
unsetFlags( SegStrongTerminal );
|
||||||
|
if (terminalFlags & SegSourceTerminal) setFlags( SegTargetTerminal );
|
||||||
|
if (terminalFlags & SegTargetTerminal) setFlags( SegSourceTerminal );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -245,6 +245,8 @@ namespace Kite {
|
||||||
}
|
}
|
||||||
|
|
||||||
_doRemovalEvents();
|
_doRemovalEvents();
|
||||||
|
for ( Track* track : _sortEvents ) track->doReorder();
|
||||||
|
_sortEvents.clear();
|
||||||
|
|
||||||
cdebug_tabw(159,-1);
|
cdebug_tabw(159,-1);
|
||||||
return count;
|
return count;
|
||||||
|
|
Loading…
Reference in New Issue