coriolis/deprecated/cumulus/src/plugins/clocktree.py

91 lines
3.3 KiB
Python

# This file is part of the Coriolis Software.
# Copyright (c) Sorbonne Université 2014-2021, 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/clocktreeplugin.py" |
# +-----------------------------------------------------------------+
import sys
import traceback
import os.path
import math
import Cfg
import Hurricane
from Hurricane import Breakpoint
from Hurricane import UpdateSession
import Viewer
import CRL
from CRL import RoutingLayerGauge
import helpers
from helpers import trace
from helpers.io import ErrorMessage
import Etesian
import Unicorn
import plugins
from plugins.cts.clocktree import HTree
from plugins.cts.clocktree import computeAbutmentBox
from plugins.chip.configuration import ChipConf
# --------------------------------------------------------------------
# Plugin hook functions, unicornHook:menus, ScritMain:call
def unicornHook ( **kw ):
kw['beforeAction'] = 'placeAndRoute.placeChip'
plugins.kwAddMenu ( 'placeAndRoute', 'P&&R', **kw )
plugins.kwUnicornHook( 'placeAndRoute.clockTree'
, 'Place Block && Clock Tree'
, 'Place a block with a buffered H-Tree for the clock'
, sys.modules[__name__].__file__
, **kw
)
return
def scriptMain ( **kw ):
try:
#helpers.setTraceLevel( 550 )
errorCode = 0
print( ' o Cleaning up any previous run.' )
for fileName in os.listdir('.'):
if fileName.endswith('.ap'):
print( ' - "{}"'.format(fileName) )
os.unlink(fileName)
cell = None
if ('cell' in kw) and kw['cell']:
cell = kw['cell']
editor = None
if ('editor' in kw) and kw['editor']:
editor = kw['editor']
print( ' o Editor detected, running in graphic mode.' )
if cell == None: cell = editor.getCell()
if cell == None:
raise ErrorMessage( 3, 'ClockTree: No cell loaded yet.' )
conf = ChipConf( {}, cell, editor )
if cell.getAbutmentBox().isEmpty():
spaceMargin = Cfg.getParamPercentage('etesian.spaceMargin').asPercentage() / 100.0 + 0.01
aspectRatio = Cfg.getParamPercentage('etesian.aspectRatio').asPercentage() / 100.0
computeAbutmentBox( cell, spaceMargin, aspectRatio, conf.cellGauge )
if editor: editor.fit()
ht = HTree.create( conf, cell, None, cell.getAbutmentBox() )
if editor: editor.refresh()
etesian = Etesian.EtesianEngine.create( cell )
etesian.place()
ht.connectLeaf()
#ht.prune()
ht.route()
etesian.toHurricane()
etesian.flattenPower()
etesian.destroy()
ht.save( cell )
except Exception as e:
helpers.io.catch( e )
return 0