New: Cumulus Stats plugin, for trans-hierarchical statistics.
This commit is contained in:
parent
4d1acc35ab
commit
835e7264fe
|
@ -0,0 +1,160 @@
|
||||||
|
#
|
||||||
|
# This file is part of the Coriolis Software.
|
||||||
|
# Copyright (c) SU 2020-2020, All Rights Reserved
|
||||||
|
#
|
||||||
|
# +-----------------------------------------------------------------+
|
||||||
|
# | C O R I O L I S |
|
||||||
|
# | C u m u l u s - P y t h o n T o o l s |
|
||||||
|
# | |
|
||||||
|
# | Author : Jean-Paul CHAPUT |
|
||||||
|
# | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
# | =============================================================== |
|
||||||
|
# | Python : "./plugins/stats.py" |
|
||||||
|
# +-----------------------------------------------------------------+
|
||||||
|
|
||||||
|
"""
|
||||||
|
This script hook the Stats plugin inside GCT/Unicorn.
|
||||||
|
|
||||||
|
Compute some statistics on a hierarchical block.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
import sys
|
||||||
|
import traceback
|
||||||
|
import helpers
|
||||||
|
from helpers.io import ErrorMessage
|
||||||
|
from helpers.io import WarningMessage
|
||||||
|
from helpers.overlay import UpdateSession
|
||||||
|
from helpers import trace
|
||||||
|
import plugins
|
||||||
|
from Hurricane import Breakpoint
|
||||||
|
from Hurricane import DbU
|
||||||
|
from Hurricane import Box
|
||||||
|
from Hurricane import Net
|
||||||
|
from Hurricane import Cell
|
||||||
|
from Hurricane import Instance
|
||||||
|
from Hurricane import Transformation
|
||||||
|
|
||||||
|
|
||||||
|
class Stats ( object ):
|
||||||
|
|
||||||
|
LUT = {}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def lookup ( p ):
|
||||||
|
if isinstance(p,Cell): cell = p
|
||||||
|
else: cell = p.getMasterCell()
|
||||||
|
if Stats.LUT.has_key(cell): return Stats.LUT[ cell ]
|
||||||
|
return None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def isInstanceTerminal ( p ):
|
||||||
|
if isinstance(p,Cell): cell = p
|
||||||
|
else: cell = p.getMasterCell()
|
||||||
|
for instance in cell.getInstances():
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def consolidate ():
|
||||||
|
ordereds = {}
|
||||||
|
for item in Stats.LUT.values():
|
||||||
|
if not ordereds.has_key(item.depth):
|
||||||
|
ordereds[item.depth] = []
|
||||||
|
ordereds[item.depth].append( item )
|
||||||
|
rkeys = ordereds.keys()
|
||||||
|
rkeys.reverse()
|
||||||
|
for key in rkeys:
|
||||||
|
for cellStat in ordereds[key]:
|
||||||
|
cellStat._consolidate()
|
||||||
|
return
|
||||||
|
|
||||||
|
def __init__ ( self, cell, depth ):
|
||||||
|
self.cell = cell
|
||||||
|
self.consolidated = False
|
||||||
|
self.depth = depth
|
||||||
|
self.directCells = 0
|
||||||
|
self.indirectCells = 0
|
||||||
|
self.blocks = 0
|
||||||
|
Stats.LUT[ cell ] = self
|
||||||
|
|
||||||
|
for instance in self.cell.getInstances():
|
||||||
|
if Stats.isInstanceTerminal(instance):
|
||||||
|
self.directCells += 1
|
||||||
|
else:
|
||||||
|
self.blocks += 1
|
||||||
|
blockStat = Stats.lookup( instance )
|
||||||
|
if blockStat is None:
|
||||||
|
blockStat = Stats( instance.getMasterCell(), depth+1 )
|
||||||
|
else:
|
||||||
|
blockStat.updateDepth( depth+1 )
|
||||||
|
if self.depth == 0:
|
||||||
|
Stats.consolidate()
|
||||||
|
return
|
||||||
|
|
||||||
|
@property
|
||||||
|
def allCells ( self ): return self.directCells+self.indirectCells
|
||||||
|
|
||||||
|
def updateDepth ( self, depth ):
|
||||||
|
if self.depth < depth: self.depth = depth
|
||||||
|
|
||||||
|
def display ( self ):
|
||||||
|
if self.depth == 0:
|
||||||
|
print( '{:>8} |{:>8} |{:>8} | {}'.format( 'Cumul.', 'Own', 'Blocks', 'MasterCell' ) )
|
||||||
|
print( '{:8} |{:8} |{:8} | {}+ {}'.format( self.allCells
|
||||||
|
, self.directCells
|
||||||
|
, self.blocks
|
||||||
|
, ' '*(self.depth*2)
|
||||||
|
, self.cell.getName() ))
|
||||||
|
for instance in self.cell.getInstances():
|
||||||
|
if Stats.isInstanceTerminal(instance): continue
|
||||||
|
blockStat = Stats.lookup( instance )
|
||||||
|
if blockStat is None: continue
|
||||||
|
blockStat.display()
|
||||||
|
return
|
||||||
|
|
||||||
|
def _consolidate ( self ):
|
||||||
|
if self.consolidated: return
|
||||||
|
for instance in self.cell.getInstances():
|
||||||
|
if Stats.isInstanceTerminal(instance): continue
|
||||||
|
blockStat = Stats.lookup( instance )
|
||||||
|
if blockStat is None:
|
||||||
|
continue
|
||||||
|
self.indirectCells += blockStat.allCells
|
||||||
|
self.consolidated = True
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# --------------------------------------------------------------------
|
||||||
|
# Plugin hook functions, unicornHook:menus, ScritMain:call
|
||||||
|
|
||||||
|
def unicornHook ( **kw ):
|
||||||
|
kw['beforeAction'] = 'misc.alpha'
|
||||||
|
|
||||||
|
plugins.kwUnicornHook( 'misc.alpha.stats'
|
||||||
|
, 'Statistics'
|
||||||
|
, 'Compute some statistics on a hierarchy of Cells '
|
||||||
|
, sys.modules[__name__].__file__
|
||||||
|
, **kw
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def scriptMain ( **kw ):
|
||||||
|
"""The mandatory function that Coriolis CGT/Unicorn will look for."""
|
||||||
|
rvalue = True
|
||||||
|
try:
|
||||||
|
helpers.setTraceLevel( 550 )
|
||||||
|
cell, editor = plugins.kwParseMain( **kw )
|
||||||
|
|
||||||
|
stats = Stats( cell, 0 )
|
||||||
|
stats.display()
|
||||||
|
except Exception, e:
|
||||||
|
helpers.io.catch( e )
|
||||||
|
rvalue = False
|
||||||
|
|
||||||
|
sys.stdout.flush()
|
||||||
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
return rvalue
|
Loading…
Reference in New Issue