From 835e7264fe98a6478810b296b6eec8bc0d79590a Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Sun, 2 Aug 2020 18:19:05 +0200 Subject: [PATCH] New: Cumulus Stats plugin, for trans-hierarchical statistics. --- cumulus/src/plugins/stats.py | 160 +++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 cumulus/src/plugins/stats.py diff --git a/cumulus/src/plugins/stats.py b/cumulus/src/plugins/stats.py new file mode 100644 index 00000000..4aac5023 --- /dev/null +++ b/cumulus/src/plugins/stats.py @@ -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