113 lines
4.2 KiB
Python
113 lines
4.2 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/rsave.py" |
|
|
# +-----------------------------------------------------------------+
|
|
|
|
|
|
import sys
|
|
import traceback
|
|
import os.path
|
|
|
|
try:
|
|
import Cfg
|
|
import CRL
|
|
import helpers
|
|
from helpers.io import ErrorMessage
|
|
from helpers.io import WarningMessage
|
|
import plugins
|
|
except Exception as e:
|
|
helpers.io.catch( e )
|
|
sys.exit(2)
|
|
|
|
|
|
def rsave ( cell, views=CRL.Catalog.State.Physical, depth=0, enableSpice=False ):
|
|
"""
|
|
Write back layout to disk if everything has gone fine.
|
|
Must write all the sub-blocks of the core but *not* the
|
|
standard cell (mainly the feed-through).
|
|
|
|
If the model has been uniquified, in the case of a merging
|
|
of abutment box for placement, the netlist view must also
|
|
be saved.
|
|
"""
|
|
framework = CRL.AllianceFramework.get()
|
|
if depth == 0: print( ' o Recursive Save-Cell.' )
|
|
if cell.isUniquified(): views |= CRL.Catalog.State.Logical
|
|
if cell.getName().endswith('_cts'): views |= CRL.Catalog.State.Logical
|
|
if cell.getName().endswith('_r' ): views |= CRL.Catalog.State.Logical
|
|
sviews = ''
|
|
if views & CRL.Catalog.State.Logical:
|
|
sviews += 'netlist'
|
|
if views & CRL.Catalog.State.VstUseConcat:
|
|
if sviews: sviews += ', '
|
|
sviews += 'uses &'
|
|
if views & CRL.Catalog.State.VstNoLowerCase:
|
|
if sviews: sviews += ', '
|
|
sviews += 'no lowercase'
|
|
if views & CRL.Catalog.State.VstUniquifyUpperCase:
|
|
if sviews: sviews += ', '
|
|
sviews += 'uniquify uppercase'
|
|
if views & CRL.Catalog.State.VstNoLinkage:
|
|
if sviews: sviews += ', '
|
|
sviews += 'no linkage'
|
|
if enableSpice:
|
|
if sviews: sviews += ', '
|
|
sviews += 'SPICE'
|
|
if views & CRL.Catalog.State.Physical:
|
|
if sviews: sviews += ','
|
|
sviews += 'layout'
|
|
print( ' {}+ {} ({}).'.format(' '*(depth*2), cell.getName(), sviews) )
|
|
framework.saveCell( cell, views )
|
|
spiceFlags = CRL.Spice.TopCell if depth == 0 else 0
|
|
CRL.Spice.save( cell, spiceFlags )
|
|
for instance in cell.getInstances():
|
|
#print( ' {}| {}.'.format(' '*(depth*2), instance) )
|
|
masterCell = instance.getMasterCell()
|
|
if not masterCell.isTerminalNetlist():
|
|
rsave( masterCell, views, depth+1, enableSpice )
|
|
#else:
|
|
# print( ' {}| Master cell is terminal netlist {}.'.format(' '*(depth*2), instance.getMasterCell()) )
|
|
return
|
|
|
|
|
|
# --------------------------------------------------------------------
|
|
# Plugin hook functions, unicornHook:menus, ScritMain:call
|
|
|
|
def unicornHook ( **kw ):
|
|
"""Hook up rsave plugin into Unicorn/CGT menu tree."""
|
|
plugins.kwUnicornHook( 'tools.rsave'
|
|
, 'Recursive Save (layout)'
|
|
, 'Recursively save layout of the top cell and it\'s instances'
|
|
, sys.modules[__name__].__file__
|
|
, **kw
|
|
)
|
|
return
|
|
|
|
|
|
def scriptMain ( **kw ):
|
|
"""Called when run as a stand alone script through Unicorn/CGT."""
|
|
try:
|
|
#helpers.setTraceLevel( 550 )
|
|
cell, editor = plugins.kwParseMain( **kw )
|
|
views = CRL.Catalog.State.Physical
|
|
if 'views' in kw: views = kw['views']
|
|
if not cell:
|
|
print( WarningMessage( 'No Cell loaded in the editor (yet), nothing done.' ) )
|
|
return 0
|
|
rsave( cell, views )
|
|
CRL.destroyAllVHDL()
|
|
except Exception as e:
|
|
helpers.io.catch( e )
|
|
sys.stdout.flush()
|
|
sys.stderr.flush()
|
|
return 0
|