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