Improved Hurricane/Python database reset.

* Change: In CRL/helpers/__init__.py, to ensure a complete restart of
    the database the __init__.py must be called again, but it's not the
    case with reload() (see Python doc). So helpers.resetCoriolis()
    must explicitly removes the Coriolis related Python modules from
    sys.modules (calling "del sys.modules[moduleName]").
      That list of Coriolis Python modules is built by calling
    helpers.tagConfModules(), it will tag all modules added to
    sys.modules since startup. It will remove (much) more than
    Coriolis modules, but that should be ok.
* Change: In CRL/etc/{node*,symbolic}/TECH/__init__.py, add a call to
    helpers.tagConfModules() for the techno modules to be erased on
    reset.
This commit is contained in:
Jean-Paul Chaput 2020-07-14 19:49:54 +02:00
parent 010fc79f4f
commit e4041d5e26
7 changed files with 40 additions and 17 deletions

View File

@ -39,3 +39,5 @@ import node180.scn6m_deep_09.devices
import node180.scn6m_deep_09.dtr_scn6m_deep_09 import node180.scn6m_deep_09.dtr_scn6m_deep_09
Cfg.Configuration.popDefaultPriority() Cfg.Configuration.popDefaultPriority()
helpers.tagConfModules()

View File

@ -38,3 +38,5 @@ import node45.freepdk45.stratus1
import node45.freepdk45.devices import node45.freepdk45.devices
Cfg.Configuration.popDefaultPriority() Cfg.Configuration.popDefaultPriority()
helpers.tagConfModules()

View File

@ -38,3 +38,5 @@ import node600.phenitec.stratus1
import node600.phenitec.devices import node600.phenitec.devices
Cfg.Configuration.popDefaultPriority() Cfg.Configuration.popDefaultPriority()
helpers.tagConfModules()

View File

@ -14,6 +14,7 @@
import Cfg import Cfg
import helpers
import helpers.io import helpers.io
helpers.io.vprint( 1, ' o Loading "symbolic.cmos" technology.' ) helpers.io.vprint( 1, ' o Loading "symbolic.cmos" technology.' )
helpers.io.vprint( 2, ' - "%s".' % helpers.truncPath(__file__) ) helpers.io.vprint( 2, ' - "%s".' % helpers.truncPath(__file__) )
@ -37,3 +38,5 @@ import symbolic.cmos.plugins
import symbolic.cmos.stratus1 import symbolic.cmos.stratus1
Cfg.Configuration.popDefaultPriority() Cfg.Configuration.popDefaultPriority()
helpers.tagConfModules()

View File

@ -27,3 +27,4 @@ Cfg.getParamInt ( "chip.block.rails.vSpacing" ).setInt ( l( 6) )
Cfg.getParamInt ( 'clockTree.minimumSide' ).setInt ( l(600) ) Cfg.getParamInt ( 'clockTree.minimumSide' ).setInt ( l(600) )
Cfg.getParamString( 'clockTree.buffer' ).setString( 'buf_x2') Cfg.getParamString( 'clockTree.buffer' ).setString( 'buf_x2')
Cfg.getParamString( 'clockTree.placerEngine' ).setString( 'Etesian') Cfg.getParamString( 'clockTree.placerEngine' ).setString( 'Etesian')
Cfg.getParamInt ( 'block.spareSide' ).setInt ( 10 )

View File

@ -37,3 +37,5 @@ import symbolic.cmos45.plugins
import symbolic.cmos45.stratus1 import symbolic.cmos45.stratus1
Cfg.Configuration.popDefaultPriority() Cfg.Configuration.popDefaultPriority()
helpers.tagConfModules()

View File

@ -10,23 +10,20 @@
# | Author : Jean-Paul Chaput | # | Author : Jean-Paul Chaput |
# | E-mail : Jean-Paul.Chaput@lip6.fr | # | E-mail : Jean-Paul.Chaput@lip6.fr |
# | =============================================================== | # | =============================================================== |
# | Python : "./crlcore/__init__.py" | # | Python : "./crlcore/helpers/__init__.py" |
# +-----------------------------------------------------------------+ # +-----------------------------------------------------------------+
# #
# This is file is mandatory to tell python that 'helpers' is a module # This is file is mandatory to tell python that 'helpers' is a module
# rather than an ordinary directory, thus enabling the uses of the # rather than an ordinary directory, thus enabling the uses of the
# 'dot' notation in import. # 'dot' notation in import.
#print 'helpers.__init__()'
import sys import sys
import os import os
import os.path import os.path
import re import re
import traceback import traceback
import Hurricane
import Viewer
import CRL
import helpers.io
quiet = False quiet = False
sysConfDir = None sysConfDir = None
@ -35,7 +32,17 @@ ndaDir = None
techno = 'symbolic/cmos' techno = 'symbolic/cmos'
technoDir = None technoDir = None
moduleGlobals = globals() moduleGlobals = globals()
confModules = [ ] sysModules = set()
confModules = set()
if not sysModules:
for moduleName in sys.modules.keys():
sysModules.add( moduleName )
import Hurricane
import Viewer
import CRL
import helpers.io
def stype ( o ): return str(type(o)).split("'")[1] def stype ( o ): return str(type(o)).split("'")[1]
@ -397,9 +404,10 @@ setSysConfDir( False )
def unloadUserSettings (): def unloadUserSettings ():
global confModules
print ' o Unloading Python user\'s modules.' print ' o Unloading Python user\'s modules.'
global confModules
for moduleName in confModules: for moduleName in confModules:
refcount = sys.getrefcount( sys.modules[moduleName] ) refcount = sys.getrefcount( sys.modules[moduleName] )
warning = '' warning = ''
@ -411,16 +419,12 @@ def unloadUserSettings ():
# ] ) # ] )
print ' - %-34s %-35s' % ('"%s".'%moduleName, warning) print ' - %-34s %-35s' % ('"%s".'%moduleName, warning)
del sys.modules[ moduleName ] del sys.modules[ moduleName ]
confModules = [] confModules = set()
return return
def loadUserSettings (): def loadUserSettings ():
global confModules
rvalue = False rvalue = False
beforeModules = set()
for moduleName in sys.modules.keys(): beforeModules.add( moduleName )
if os.path.isfile('./coriolis2/settings.py'): if os.path.isfile('./coriolis2/settings.py'):
if os.path.isfile('./coriolis2/__init__.py'): if os.path.isfile('./coriolis2/__init__.py'):
@ -434,17 +438,24 @@ def loadUserSettings ():
else: else:
import symbolic.cmos import symbolic.cmos
tagConfModules()
return rvalue
def tagConfModules ():
global sysModules
global confModules
confModules = set() confModules = set()
for moduleName in sys.modules.keys(): for moduleName in sys.modules.keys():
if not (moduleName in beforeModules): if not (moduleName in sysModules):
confModules.add( moduleName ) confModules.add( moduleName )
#print 'Configuration modules:' #print 'Configuration modules:'
#for moduleName in confModules: #for moduleName in confModules:
# print '-', moduleName # print '-', moduleName
return rvalue
def resetCoriolis (): def resetCoriolis ():
print ' o Full reset of Coriolis/Hurricane databases.' print ' o Full reset of Coriolis/Hurricane databases.'