coriolis/documentation/examples/AM2901/doChip.py

164 lines
6.0 KiB
Python
Executable File

#!/usr/bin/env python
try:
import sys
import traceback
import os.path
import optparse
import Cfg
import Hurricane
from Hurricane import DbU
from Hurricane import UpdateSession
from Hurricane import Breakpoint
from Hurricane import Transformation
from Hurricane import Instance
import Viewer
import CRL
from helpers import ErrorMessage
#import Nimbus
#import Metis
#import Mauka
import Etesian
import Katabatic
import Kite
import Unicorn
import clocktree.ClockTree
import plugins.ClockTreePlugin
import plugins.ChipPlugin
import plugins.RSavePlugin
except ImportError, e:
serror = str(e)
if serror.startswith('No module named'):
module = serror.split()[-1]
print '[ERROR] The <%s> python module or symbol cannot be loaded.' % module
print ' Please check the integrity of the <coriolis> package.'
sys.exit(1)
if str(e).find('cannot open shared object file'):
library = serror.split(':')[0]
print '[ERROR] The <%s> shared library cannot be loaded.' % library
print ' Under RHEL 6, you must be under devtoolset-2.'
print ' (scl enable devtoolset-2 bash)'
sys.exit(1)
except Exception, e:
print '[ERROR] A strange exception occurred while loading the basic Coriolis/Python'
print ' modules. Something may be wrong at Python/C API level.\n'
print ' %s' % e
sys.exit(2)
DoChip = 0x0001
DoClockTree = 0x0002
DoPlacement = 0x0004
DoRouting = 0x0008
ChipStages = DoChip|DoPlacement|DoRouting
framework = CRL.AllianceFramework.get()
def ScriptMain ( **kw ):
success = False
doStages = kw['doStages']
try:
cell, editor = plugins.kwParseMain( **kw )
if doStages & DoPlacement:
if doStages & DoChip:
success = plugins.ChipPlugin.ScriptMain( **kw )
if not success: return False
else:
if cell.getAbutmentBox().isEmpty():
cellGauge = framework.getCellGauge()
spaceMargin = (Cfg.getParamPercentage('etesian.spaceMargin').asPercentage()+5) / 100.0
aspectRatio = Cfg.getParamPercentage('etesian.aspectRatio').asPercentage() / 100.0
clocktree.ClockTree.computeAbutmentBox( cell, spaceMargin, aspectRatio, cellGauge )
if editor: editor.fit()
if doStages & DoClockTree:
success = plugins.ClockTreePlugin.ScriptMain( **kw )
#if not success: return False
else:
if Cfg.getParamString('clockTree.placerEngine').asString() != 'Etesian':
mauka = Mauka.MaukaEngine.create( cell )
mauka.run()
mauka.destroy()
else:
etesian = Etesian.EtesianEngine.create( cell )
etesian.place()
etesian.destroy()
if editor: editor.refresh()
if doStages & DoRouting:
routingNets = []
kite = Kite.KiteEngine.create( cell )
kite.runGlobalRouter ( Kite.KtBuildGlobalRouting )
kite.loadGlobalRouting( Katabatic.EngineLoadGrByNet, routingNets )
kite.layerAssign ( Katabatic.EngineNoNetLayerAssign )
kite.runNegociate ()
success = kite.getToolSuccess()
kite.finalizeLayout()
kite.destroy()
cell.setName( cell.getName()+'_kite' )
framework.saveCell( cell, CRL.Catalog.State.Logical )
plugins.RSavePlugin.ScriptMain( **kw )
except Exception, e:
print e
return success
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option( '-c', '--cell' , type='string', dest='cell' , help='The name of the chip to build, whithout extension.')
parser.add_option( '-s', '--script', type='string', dest='script' , help='The name of a Python script, without extension.')
parser.add_option( '-v', '--verbose' , action='store_true', dest='verbose' , help='First level of verbosity.')
parser.add_option( '-V', '--very-verbose' , action='store_true', dest='veryVerbose', help='Second level of verbosity.')
parser.add_option( '-p', '--place' , action='store_true', dest='doPlacement', help='Perform chip placement step only.')
parser.add_option( '-r', '--route' , action='store_true', dest='doRouting' , help='Perform routing step only.')
parser.add_option( '-C', '--chip' , action='store_true', dest='doChip' , help='Run place & route on a complete chip.')
parser.add_option( '-T', '--clock-tree' , action='store_true', dest='doClockTree', help='In block mode, create a clock-tree.')
(options, args) = parser.parse_args()
doStages = 0
if options.verbose: Cfg.getParamBool('misc.verboseLevel1').setBool(True)
if options.veryVerbose: Cfg.getParamBool('misc.verboseLevel2').setBool(True)
if options.doPlacement: doStages |= DoPlacement
if options.doRouting: doStages |= DoRouting
if options.doChip: doStages |= DoChip
if options.doClockTree: doStages |= DoClockTree
if not doStages: doStages = ChipStages
kw = { 'doStages':doStages }
if options.script:
try:
module = __import__( options.script, globals(), locals() )
if not module.__dict__.has_key('ScriptMain'):
print '[ERROR] Script module <%s> do not contains a ScripMain() function.' % options.script
sys.exit(1)
cell = module.__dict__['ScriptMain']( **kw )
kw['cell'] = cell
except ImportError, e:
module = str(e).split()[-1]
print '[ERROR] The <%s> script cannot be loaded.' % module
print ' Please check your design hierarchy.'
sys.exit(1)
except Exception, e:
print '[ERROR] A strange exception occurred while loading the Python'
print ' script <%s>. Please check that module for error:\n' % options.script
traceback.print_tb(sys.exc_info()[2])
print ' %s' % e
sys.exit(2)
elif options.cell:
kw['cell'] = framework.getCell( options.cell, CRL.Catalog.State.Views )
success = ScriptMain( **kw )
shellSuccess = 0
if not success: shellSuccess = 1
sys.exit( shellSuccess )