diff --git a/crlcore/etc/180/scn6m_deep_09/technology.conf b/crlcore/etc/180/scn6m_deep_09/technology.conf index 83b4459d..748e59ea 100644 --- a/crlcore/etc/180/scn6m_deep_09/technology.conf +++ b/crlcore/etc/180/scn6m_deep_09/technology.conf @@ -217,9 +217,6 @@ layersExtensionsTable = \ ) -for entry in layersExtensionsTable: - print entry - # Format of an entry in the table: # (Symbolic_Name, CIF_Name, GDSII_Number) gdsLayersTable = \ diff --git a/crlcore/python/coriolisInit.py b/crlcore/python/coriolisInit.py index aa935bd8..e7b117a6 100644 --- a/crlcore/python/coriolisInit.py +++ b/crlcore/python/coriolisInit.py @@ -95,8 +95,8 @@ def coriolisConfigure(): # ('technoConfig' , Technology.loadTechnoConfig , SystemMandatory|TechnologyHelper) - print ' o Running configuration hook: coriolisConfigure().' - #print ' - sysConfDir: <%s>' % helpers.sysConfDir + print ' o Running configuration hook: coriolisConfigure().' + #print ' - sysConfDir: <%s>' % helpers.sysConfDir Cfg.Configuration.pushDefaultPriority ( Cfg.Parameter.Priority.ConfigurationFile ) @@ -131,7 +131,7 @@ def coriolisConfigure(): print ' Your installation may be broken. Trying to continue anyway...' continue - print ' - Loading "%s".' % helpers.truncPath(confFile) + print ' - Loading "%s".' % helpers.truncPath(confFile) execfile(confFile,moduleGlobals) except Exception, e: helpers.showPythonTrace( confFile, e ) @@ -182,7 +182,7 @@ def coriolisConfigure(): return try: - if not helpers.quiet: print ' - Loading \"%s\".' % helpers.truncPath(confFile) + if not helpers.quiet: print ' - Loading \"%s\".' % helpers.truncPath(confFile) execfile(confFile,moduleGlobals) except Exception, e: showPythonTrace( confFile, e ) @@ -203,7 +203,7 @@ def coriolisConfigure(): sys.exit( 1 ) try: - if not helpers.quiet: print ' - Loading \"%s\".' % helpers.truncPath(confFile) + if not helpers.quiet: print ' - Loading \"%s\".' % helpers.truncPath(confFile) execfile(confFile,moduleGlobals) except Exception, e: showPythonTrace( confFile, e ) diff --git a/crlcore/python/helpers/__init__.py b/crlcore/python/helpers/__init__.py index 16243a53..b4ae19b9 100644 --- a/crlcore/python/helpers/__init__.py +++ b/crlcore/python/helpers/__init__.py @@ -29,6 +29,7 @@ import helpers.io quiet = False sysConfDir = None ndaConfDir = None +ndaDir = None techno = 'symbolic/cmos' technoDir = None unitsLambda = True @@ -65,8 +66,8 @@ def textStackTrace ( trace, showIndent=True, scriptPath=None ): s = '' if scriptPath: - if len(scriptPath) > 70: - filename = scriptPath[-70:] + if len(scriptPath) > 100: + filename = scriptPath[-100:] filename = '.../' + filename[ filename.find('/')+1 : ] if showIndent: s += '[ERROR] ' @@ -78,8 +79,8 @@ def textStackTrace ( trace, showIndent=True, scriptPath=None ): maxdepth = len( trace ) for depth in range( maxdepth ): filename, line, function, code = trace[ maxdepth-depth-1 ] - if len(filename) > 38: - filename = filename[-38:] + if len(filename) > 58: + filename = filename[-58:] filename = '.../' + filename[ filename.find('/')+1 : ] #s += indent + '[%02d] %45s:%-5d in \"%s()\"' % ( maxdepth-depth-1, filename, line, function ) s += indent + '#%d in %25s() at %s:%d\n' % ( depth, function, filename, line ) @@ -94,8 +95,8 @@ def showStackTrace ( trace ): def textPythonTrace ( scriptPath=None, e=None, tryContinue=True ): s = '' if scriptPath: - if len(scriptPath) > 70: - filename = scriptPath[-70:] + if len(scriptPath) > 100: + filename = scriptPath[-100:] filename = '.../' + filename[ filename.find('/')+1 : ] else: filename = scriptPath @@ -250,6 +251,7 @@ def n ( value ): return Hurricane.DbU.fromPhysical( value, Hurricane.DbU.UnitPow def initTechno ( argQuiet ): global quiet + global ndaDir global ndaConfDir global technoDir global techno @@ -264,7 +266,7 @@ def initTechno ( argQuiet ): technoFiles.reverse() for technoFile in technoFiles: if os.path.isfile(technoFile): - if not quiet: print ' - Loading \"%s\".' % truncPath(technoFile) + if not quiet: print ' - Loading \"%s\".' % truncPath(technoFile) execfile(technoFile,moduleGlobals) break if moduleGlobals.has_key('technology'): @@ -273,12 +275,13 @@ def initTechno ( argQuiet ): print '[WARNING] The technology is not set. Using <%s>.' % techno if moduleGlobals.has_key('NdaDirectory'): + ndaDir = NdaDirectory ndaConfDir = os.path.join( NdaDirectory, 'etc/coriolis2' ) else: ndaConfDir = sysConfDir technoDir = os.path.join( ndaConfDir, techno ) - if not quiet: print ' - Technology: %s.' % techno + if not quiet: print ' - Technology: %s.' % techno def staticInitialization ( quiet=False ): @@ -288,7 +291,9 @@ def staticInitialization ( quiet=False ): global _trace global unitsLambda - if sysConfDir != None: return + if sysConfDir != None: + #if not quiet: print ' o helpers.staticInitialization() Already run, exit.' + return unitsLamba = True tab = Tab() @@ -300,7 +305,7 @@ def staticInitialization ( quiet=False ): for path in sys.path: if reSysConfDir.match(path): sysConfDir = path - #if not quiet: print ' - <%s>' % sysConfDir + if not quiet: print ' - "%s"' % sysConfDir break if not sysConfDir: @@ -313,7 +318,7 @@ def staticInitialization ( quiet=False ): raise ErrorMessage( 1, [ 'Cannot locate the directoty holding the configuration files.' , 'The path is something ending by <.../etc/coriolis2>.'] ) - if not quiet: print ' - <%s>' % sysConfDir + if not quiet: print ' - "%s"' % sysConfDir initTechno( quiet ) return diff --git a/cumulus/src/CMakeLists.txt b/cumulus/src/CMakeLists.txt index 0012e879..b5604e75 100644 --- a/cumulus/src/CMakeLists.txt +++ b/cumulus/src/CMakeLists.txt @@ -7,7 +7,6 @@ set ( pyPlugins ${CMAKE_CURRENT_SOURCE_DIR}/plugins/__init__.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/ClockTreePlugin.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/CoreToChip_cmos.py - #${CMAKE_CURRENT_SOURCE_DIR}/plugins/CoreToChip_c35b4.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/CoreToChip_phlib80.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/ChipPlace.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/ChipRoute.py @@ -23,7 +22,6 @@ set ( pyPluginC2C ${CMAKE_CURRENT_SOURCE_DIR}/plugins/core2chip/__init__.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/core2chip/CoreToChip.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/core2chip/cmos.py - #${CMAKE_CURRENT_SOURCE_DIR}/plugins/core2chip/c35b4.py ${CMAKE_CURRENT_SOURCE_DIR}/plugins/core2chip/phlib80.py ) set ( pyPluginChip ${CMAKE_CURRENT_SOURCE_DIR}/plugins/chip/__init__.py diff --git a/cumulus/src/plugins/ChipPlace.py b/cumulus/src/plugins/ChipPlace.py index 8b3814e7..ff99411f 100644 --- a/cumulus/src/plugins/ChipPlace.py +++ b/cumulus/src/plugins/ChipPlace.py @@ -21,7 +21,7 @@ try: from helpers.io import ErrorMessage from helpers.io import WarningMessage import plugins - import chip.Chip + import chip except ImportError, e: serror = str(e) if serror.startswith('No module named'): diff --git a/cumulus/src/plugins/__init__.py b/cumulus/src/plugins/__init__.py index 2dad44c4..fc1e5aaa 100644 --- a/cumulus/src/plugins/__init__.py +++ b/cumulus/src/plugins/__init__.py @@ -14,7 +14,10 @@ # +-----------------------------------------------------------------+ +import os +import sys import Cfg +import helpers from helpers.io import ErrorMessage from helpers.io import WarningMessage from Hurricane import Contact @@ -29,6 +32,7 @@ from CRL import RoutingLayerGauge NoFlags = 0000 ShowWarnings = 0001 WarningsAreErrors = 0002 +loaded = False @@ -185,3 +189,78 @@ class StackedVia ( object ): ) ) #print ' Sub-via: ', self._vias[-1] return + + +def loadPlugins ( pluginsDir ): + sys.path.append( pluginsDir ) + sys.modules['plugins'].__path__.append( pluginsDir ) + + if not os.path.isdir(pluginsDir): + print ErrorMessage( 3, 'cumulus.__init__.py: Cannot find directory:' \ + , '<%s>' % pluginsDir ) + return + + moduleNames = [] + for entry in os.listdir( pluginsDir ): + if entry == "__init__.py": continue + if not entry.endswith('.py'): + path = os.path.join(pluginsDir,entry) + if os.path.isdir(path): + packageName = "plugins." + entry + if not sys.modules.has_key(packageName): + module = __import__( packageName, globals(), locals() ) + else: + module = sys.modules[packageName] + #print ' - P "%s" %s %s' % (packageName,module.__name__,path) + + module.__path__.append( path ) + #for element in module.__path__: + # print element + continue + moduleNames.append( entry[:-3] ) + + #names = [] + #for moduleName in sys.modules: names.append( moduleName ) + #names.sort() + #for name in names: print '| "%s"' % name + + moduleNames.sort() + + for moduleName in moduleNames: + try: + print ' - "%s"' % moduleName + module = __import__( moduleName, globals(), locals() ) + except ErrorMessage, e: + print e + helpers.showStackTrace( e.trace ) + except Exception, e: + helpers.showPythonTrace( __file__, e ) + + return + + +def staticInitialization (): + global loaded + if loaded: return + + helpers.staticInitialization( quiet=False ) + + try: + print ' o Preload standard plugins.' + pluginsDir = os.path.dirname(__file__) + loadPlugins( pluginsDir ) + + if helpers.ndaDir: + print ' o Preload NDA protected plugins.' + pluginsDir = os.path.join( helpers.ndaDir, 'python2.7/site-packages/cumulus/plugins' ) + loadPlugins( pluginsDir ) + else: + print ' o No NDA protected plugins.' + except Exception, e: + helpers.showPythonTrace( __file__, e ) + + loaded = True + return + + +staticInitialization() diff --git a/cumulus/src/plugins/chip/BlockCorona.py b/cumulus/src/plugins/chip/BlockCorona.py index 7e4f279d..70df4ebd 100644 --- a/cumulus/src/plugins/chip/BlockCorona.py +++ b/cumulus/src/plugins/chip/BlockCorona.py @@ -37,7 +37,10 @@ from helpers.io import ErrorMessage from helpers.io import WarningMessage import plugins from plugins import StackedVia -import chip.BlockPower +import chip + + +chip.importConstants( globals() ) class IntervalSet ( object ): @@ -372,8 +375,8 @@ class SouthSide ( HorizontalSide ): return self.innerBb.getYMin() - self.hRailWidth/2 - self.hRailSpace \ - i*(self.hRailWidth + self.hRailSpace) - def corner0 ( self, i ): return self.corners[chip.SouthWest][i] - def corner1 ( self, i ): return self.corners[chip.SouthEast][i] + def corner0 ( self, i ): return self.corners[SouthWest][i] + def corner1 ( self, i ): return self.corners[SouthEast][i] class NorthSide ( HorizontalSide ): @@ -386,8 +389,8 @@ class NorthSide ( HorizontalSide ): return self.innerBb.getYMax() + self.hRailWidth/2 + self.hRailSpace \ + i*(self.hRailWidth + self.hRailSpace) - def corner0 ( self, i ): return self.corners[chip.NorthWest][i] - def corner1 ( self, i ): return self.corners[chip.NorthEast][i] + def corner0 ( self, i ): return self.corners[NorthWest][i] + def corner1 ( self, i ): return self.corners[NorthEast][i] class VerticalSide ( Side ): @@ -449,8 +452,8 @@ class WestSide ( VerticalSide ): return self.innerBb.getXMin() - self.vRailWidth/2 - self.vRailSpace \ - i*(self.vRailWidth + self.vRailSpace) - def corner0 ( self, i ): return self.corners[chip.SouthWest][i] - def corner1 ( self, i ): return self.corners[chip.NorthWest ][i] + def corner0 ( self, i ): return self.corners[SouthWest][i] + def corner1 ( self, i ): return self.corners[NorthWest ][i] def addBlockages ( self ): sideXMin = self.getOuterRail(0).axis - self.vRailWidth @@ -469,8 +472,8 @@ class EastSide ( VerticalSide ): return self.innerBb.getXMax() + self.vRailWidth/2 + self.vRailSpace \ + i*(self.vRailWidth + self.vRailSpace) - def corner0 ( self, i ): return self.corners[chip.SouthEast][i] - def corner1 ( self, i ): return self.corners[chip.NorthEast ][i] + def corner0 ( self, i ): return self.corners[SouthEast][i] + def corner1 ( self, i ): return self.corners[NorthEast ][i] def addBlockages ( self ): sideXMin = self.getInnerRail(0).axis - self.vRailWidth @@ -532,10 +535,10 @@ class Corona ( object ): def connectBlock ( self ): for plane in self.block.planes.values(): for side in plane.sides.values(): - self.southSide.connect( side[chip.South] ) - self.northSide.connect( side[chip.North] ) - self.westSide .connect( side[chip.West ] ) - self.eastSide .connect( side[chip.East ] ) + self.southSide.connect( side[South] ) + self.northSide.connect( side[North] ) + self.westSide .connect( side[West ] ) + self.eastSide .connect( side[East ] ) return def connectPads ( self, padsCorona ): @@ -546,10 +549,10 @@ class Corona ( object ): return def doLayout ( self ): - self.corners = { chip.SouthWest : [] - , chip.SouthEast : [] - , chip.NorthWest : [] - , chip.NorthEast : [] + self.corners = { SouthWest : [] + , SouthEast : [] + , NorthWest : [] + , NorthEast : [] } contactDepth = self.horizontalDepth @@ -575,28 +578,28 @@ class Corona ( object ): trBox.merge( xTR, yTR ) self.routingGauge.getContactLayer(contactDepth) - self.corners[chip.SouthWest].append( + self.corners[SouthWest].append( Contact.create( net , self.routingGauge.getContactLayer(contactDepth) , xBL, yBL , self.hRailWidth , self.vRailWidth ) ) - self.corners[chip.NorthWest].append( + self.corners[NorthWest].append( Contact.create( net , self.routingGauge.getContactLayer(contactDepth) , xBL, yTR , self.hRailWidth , self.vRailWidth ) ) - self.corners[chip.SouthEast].append( + self.corners[SouthEast].append( Contact.create( net , self.routingGauge.getContactLayer(contactDepth) , xTR, yBL , self.hRailWidth , self.vRailWidth ) ) - self.corners[chip.NorthEast].append( + self.corners[NorthEast].append( Contact.create( net , self.routingGauge.getContactLayer(contactDepth) , xTR, yTR diff --git a/cumulus/src/plugins/chip/BlockPower.py b/cumulus/src/plugins/chip/BlockPower.py index 9901137c..01cbc4a5 100644 --- a/cumulus/src/plugins/chip/BlockPower.py +++ b/cumulus/src/plugins/chip/BlockPower.py @@ -33,7 +33,10 @@ import helpers from helpers import trace from helpers.io import ErrorMessage from helpers.io import WarningMessage -import chip.Configuration +import plugins +import chip + +chip.importConstants( globals() ) class Side ( object ): @@ -81,26 +84,26 @@ class Side ( object ): return def doLayout ( self ): - if self.side == chip.West: + if self.side == West: width = 0 x = self.block.bb.getXMin() - elif self.side == chip.East: + elif self.side == East: width = 0 x = self.block.bb.getXMax() - elif self.side == chip.South: + elif self.side == South: height = 0 y = self.block.bb.getYMin() - elif self.side == chip.North: + elif self.side == North: height = 0 y = self.block.bb.getYMax() minWidth = DbU.fromLambda( 6.0 ) for terminal in self.terminals: - if self.side == chip.West or self.side == chip.East: + if self.side == West or self.side == East: center = Point( x, terminal[0].getCenter() ) height = terminal[0].getSize() - self.deltaWidth if height < minWidth: height = minWidth - elif self.side == chip.North or self.side == chip.South: + elif self.side == North or self.side == South: center = Point( terminal[0].getCenter(), y ) width = terminal[0].getSize() - self.deltaWidth if width < minWidth: width = minWidth @@ -125,24 +128,24 @@ class Plane ( object ): def addTerminal ( self, net, direction, bb ): if not self.sides.has_key(net): - self.sides[ net ] = { chip.North : Side(self.block,chip.North,net,self.metal) - , chip.South : Side(self.block,chip.South,net,self.metal) - , chip.East : Side(self.block,chip.East ,net,self.metal) - , chip.West : Side(self.block,chip.West ,net,self.metal) + self.sides[ net ] = { North : Side(self.block,North,net,self.metal) + , South : Side(self.block,South,net,self.metal) + , East : Side(self.block,East ,net,self.metal) + , West : Side(self.block,West ,net,self.metal) } sides = self.sides[ net ] if direction == Plane.Horizontal: if bb.getXMin() <= self.block.bb.getXMin(): - sides[chip.West].addTerminal( bb.getCenter().getY(), bb.getHeight() ) + sides[West].addTerminal( bb.getCenter().getY(), bb.getHeight() ) if bb.getXMax() >= self.block.bb.getXMax(): - sides[chip.East].addTerminal( bb.getCenter().getY(), bb.getHeight() ) + sides[East].addTerminal( bb.getCenter().getY(), bb.getHeight() ) if direction == Plane.Vertical: if bb.getYMin() <= self.block.bb.getYMin(): - sides[chip.South].addTerminal( bb.getCenter().getX(), bb.getWidth() ) + sides[South].addTerminal( bb.getCenter().getX(), bb.getWidth() ) if bb.getYMax() >= self.block.bb.getYMax(): - sides[chip.North].addTerminal( bb.getCenter().getX(), bb.getWidth() ) + sides[North].addTerminal( bb.getCenter().getX(), bb.getWidth() ) return def doLayout ( self ): @@ -166,8 +169,8 @@ class GoCb ( object ): if not direction: return rootNet = None - if go.getNet().getType() == Net.Type.POWER: rootNet = self.block.conf.coronaVdd - if go.getNet().getType() == Net.Type.GROUND: rootNet = self.block.conf.coronaVss + if go.getNet().getType() == long(Net.Type.POWER): rootNet = self.block.conf.coronaVdd + if go.getNet().getType() == long(Net.Type.GROUND): rootNet = self.block.conf.coronaVss if not rootNet: return if self.block.activePlane: diff --git a/cumulus/src/plugins/chip/Chip.py b/cumulus/src/plugins/chip/Chip.py index e5ac9f73..baabc33c 100644 --- a/cumulus/src/plugins/chip/Chip.py +++ b/cumulus/src/plugins/chip/Chip.py @@ -53,10 +53,10 @@ try: import Unicorn import plugins import clocktree.ClockTree - import chip.Configuration + import chip + import chip.PadsCorona import chip.BlockPower import chip.BlockCorona - import chip.PadsCorona except ImportError, e: serror = str(e) if serror.startswith('No module named'): diff --git a/cumulus/src/plugins/chip/Configuration.py b/cumulus/src/plugins/chip/Configuration.py index 9cfb341c..73b6de4c 100644 --- a/cumulus/src/plugins/chip/Configuration.py +++ b/cumulus/src/plugins/chip/Configuration.py @@ -469,7 +469,7 @@ class ChipConf ( object ): remainder = u % oneLambda if remainder: if rounding == chip.Superior: u = u + (oneLambda - remainder) - else: u = u - remainder + else: u = u - remainder return u @@ -478,9 +478,15 @@ class ChipConf ( object ): if isinstance(v,long): return ChipConf._toSymbolic( v, rounding ) if isinstance(v,Box): if rounding & chip.Inwards: - roundings = [ chip.Superior, chip.Superior, chip.Inferior, chip.Inferior ] + roundings = [ chip.Superior + , chip.Superior + , chip.Inferior + , chip.Inferior ] else: - roundings = [ chip.Inferior, chip.Inferior, chip.Superior, chip.Superior ] + roundings = [ chip.Inferior + , chip.Inferior + , chip.Superior + , chip.Superior ] xMin = ChipConf._toSymbolic( v.getXMin(), roundings[0] ) yMin = ChipConf._toSymbolic( v.getYMin(), roundings[1] ) xMax = ChipConf._toSymbolic( v.getXMax(), roundings[2] ) diff --git a/cumulus/src/plugins/chip/PadsCorona.py b/cumulus/src/plugins/chip/PadsCorona.py index 2b1abde8..eb35f2db 100644 --- a/cumulus/src/plugins/chip/PadsCorona.py +++ b/cumulus/src/plugins/chip/PadsCorona.py @@ -42,7 +42,9 @@ import helpers from helpers import trace from helpers.io import ErrorMessage from helpers.io import WarningMessage -import chip.Configuration +import chip + +chip.importConstants( globals() ) class Corner ( object ): @@ -59,22 +61,22 @@ class Corner ( object ): def _getPoints ( self, axis ): - if self.type == chip.SouthWest: + if self.type == SouthWest: xCorner = self.conf.chipSize.getXMin() + axis yCorner = self.conf.chipSize.getYMin() + axis xBb = self.conf.chipSize.getXMin() + self.conf.getIoPadHeight() yBb = self.conf.chipSize.getYMin() + self.conf.getIoPadHeight() - elif self.type == chip.SouthEast: + elif self.type == SouthEast: xCorner = self.conf.chipSize.getXMax() - axis yCorner = self.conf.chipSize.getYMin() + axis xBb = self.conf.chipSize.getXMax() - self.conf.getIoPadHeight() yBb = self.conf.chipSize.getYMin() + self.conf.getIoPadHeight() - elif self.type == chip.NorthEast: + elif self.type == NorthEast: xCorner = self.conf.chipSize.getXMax() - axis yCorner = self.conf.chipSize.getYMax() - axis xBb = self.conf.chipSize.getXMax() - self.conf.getIoPadHeight() yBb = self.conf.chipSize.getYMax() - self.conf.getIoPadHeight() - elif self.type == chip.NorthWest: + elif self.type == NorthWest: xCorner = self.conf.chipSize.getXMin() + axis yCorner = self.conf.chipSize.getYMax() - axis xBb = self.conf.chipSize.getXMin() + self.conf.getIoPadHeight() @@ -99,7 +101,7 @@ class Corner ( object ): def _getTransformation ( self ): - if self.type == chip.SouthWest: + if self.type == SouthWest: name = 'padcorner_sw' x = self.conf.chipSize.getXMin() y = self.conf.chipSize.getYMin() @@ -109,7 +111,7 @@ class Corner ( object ): orientation = Transformation.Orientation.R1 x += self.padCorner.getAbutmentBox().getWidth() - elif self.type == chip.SouthEast: + elif self.type == SouthEast: name = 'padcorner_se' x = self.conf.chipSize.getXMax() y = self.conf.chipSize.getYMin() @@ -120,7 +122,7 @@ class Corner ( object ): x += self.padCorner.getAbutmentBox().getWidth() y += self.padCorner.getAbutmentBox().getHeight() - elif self.type == chip.NorthEast: + elif self.type == NorthEast: name = 'padcorner_ne' x = self.conf.chipSize.getXMax() y = self.conf.chipSize.getYMax() @@ -131,7 +133,7 @@ class Corner ( object ): x -= self.padCorner.getAbutmentBox().getwidth() y -= self.padCorner.getAbutmentBox().getHeight() - elif self.type == chip.NorthWest: + elif self.type == NorthWest: name = 'padcorner_nw' x = self.conf.chipSize.getXMin() y = self.conf.chipSize.getYMax() @@ -172,22 +174,22 @@ class Side ( object ): self.gap = 0 self.coreWires = [] - if self.type == chip.North: + if self.type == North: self.pads = self.conf.northPads self.sideName = 'north' self.sideLength = self.conf.chipSize.getWidth() - elif self.type == chip.South: + elif self.type == South: self.pads = self.conf.southPads self.sideName = 'south' self.sideLength = self.conf.chipSize.getWidth() - elif self.type == chip.East: + elif self.type == East: self.pads = self.conf.eastPads self.sideName = 'east' self.sideLength = self.conf.chipSize.getHeight() - elif self.type == chip.West: + elif self.type == West: self.pads = self.conf.westPads self.sideName = 'west' self.sideLength = self.conf.chipSize.getHeight() @@ -207,10 +209,10 @@ class Side ( object ): def getAxis ( self, i ): - if self.type == chip.North: return self.conf.chipSize.getYMax() - self.conf.getIoPadHeight() + self.corona.powerRails[i][2] - elif self.type == chip.South: return self.conf.chipSize.getYMin() + self.conf.getIoPadHeight() - self.corona.powerRails[i][2] - elif self.type == chip.East: return self.conf.chipSize.getXMax() - self.conf.getIoPadHeight() + self.corona.powerRails[i][2] - elif self.type == chip.West: return self.conf.chipSize.getXMin() + self.conf.getIoPadHeight() - self.corona.powerRails[i][2] + if self.type == North: return self.conf.chipSize.getYMax() - self.conf.getIoPadHeight() + self.corona.powerRails[i][2] + elif self.type == South: return self.conf.chipSize.getYMin() + self.conf.getIoPadHeight() - self.corona.powerRails[i][2] + elif self.type == East: return self.conf.chipSize.getXMax() - self.conf.getIoPadHeight() + self.corona.powerRails[i][2] + elif self.type == West: return self.conf.chipSize.getXMin() + self.conf.getIoPadHeight() - self.corona.powerRails[i][2] else: raise ErrorMessage( 1, 'PadsCorona.Side.__init__(): Invalid value for sideType (%d)' % sideType ) return 0 @@ -236,10 +238,10 @@ class Side ( object ): def _check ( self, checkSize, checkName ): sideName = 'unknown' chipSize = 0 - if self.type == chip.North or self.type == chip.South: + if self.type == North or self.type == South: chipSize = self.conf.chipSize.getWidth() sideName = 'wide' - elif self.type == chip.East or self.type == chip.West: + elif self.type == East or self.type == West: chipSize = self.conf.chipSize.getHeight() sideName = 'tall' @@ -258,20 +260,20 @@ class Side ( object ): def check ( self ): self.validated = True - if self.type == chip.North: + if self.type == North: self.validated = self._check( self.conf.coreSize.getWidth() + 2*self.conf.minCorona + 2*self.conf.getIoPadHeight() , 'core' ) checkName = 'north pads' - elif self.type == chip.East: + elif self.type == East: self.validated = self._check( self.conf.coreSize.getHeight() + 2*self.conf.minCorona + 2*self.conf.getIoPadHeight() , 'core' ) checkName = 'east pads' - elif self.type == chip.South: checkName = 'south pads' - elif self.type == chip.West: checkName = 'west pads' + elif self.type == South: checkName = 'south pads' + elif self.type == West: checkName = 'west pads' self.validated = self._check( len(self.pads) * self.conf.gaugeConf.getIoPadStep () + 2*self.conf.gaugeConf.getIoPadHeight() @@ -391,7 +393,7 @@ class Side ( object ): def _placePad ( self, padInstance ): - if self.type == chip.North: + if self.type == North: x = self.conf.chipSize.getXMin() + self.u y = self.conf.chipSize.getYMax() @@ -401,7 +403,7 @@ class Side ( object ): orientation = Transformation.Orientation.ID y -= self.conf.getIoPadHeight() - elif self.type == chip.South: + elif self.type == South: x = self.conf.chipSize.getXMin() + self.u y = self.conf.chipSize.getYMin() @@ -411,7 +413,7 @@ class Side ( object ): orientation = Transformation.Orientation.MY y += self.conf.getIoPadHeight() - elif self.type == chip.West: + elif self.type == West: x = self.conf.chipSize.getXMin() y = self.conf.chipSize.getYMin() + self.u @@ -422,7 +424,7 @@ class Side ( object ): orientation = Transformation.Orientation.R1 x += padInstance.getMasterCell().getAbutmentBox().getHeight() - elif self.type == chip.East: + elif self.type == East: x = self.conf.chipSize.getXMax() y = self.conf.chipSize.getYMin() + self.u @@ -490,13 +492,13 @@ class Side ( object ): def _getUMin ( self, box ): - if self.type == chip.North or self.type == chip.South: + if self.type == North or self.type == South: return box.getXMin() return box.getYMin() def _getUMax ( self, box ): - if self.type == chip.North or self.type == chip.South: + if self.type == North or self.type == South: return box.getXMax() return box.getYMax() @@ -511,22 +513,22 @@ class Side ( object ): uMin -= width/2 uMax += width/2 - if self.type == chip.North or self.type == chip.South: - if self.type == chip.North: + if self.type == North or self.type == South: + if self.type == North: axis = self.conf.chipSize.getYMax() - axis Horizontal.create( net, layer, axis, width, uMin, uMax ) else: - if self.type == chip.East: + if self.type == East: axis = self.conf.chipSize.getXMax() - axis Vertical.create( net, layer, axis, width, uMin, uMax ) return def _routePads ( self ): - if self.type == chip.South or self.type == chip.North: + if self.type == South or self.type == North: startCorner = self.conf.chipSize.getXMin() stopCorner = self.conf.chipSize.getXMax() - elif self.type == chip.West or self.type == chip.East: + elif self.type == West or self.type == East: startCorner = self.conf.chipSize.getYMin() stopCorner = self.conf.chipSize.getYMax() else: @@ -571,10 +573,10 @@ class Side ( object ): def drawCoreWires ( self ): trace( 550, ',+', '\tSide.drawCoreWire()\n' ) - if self.type == chip.West or self.type == chip.East: + if self.type == West or self.type == East: trace( 550, 'Sort East/West' ) self.coreWires.sort( key=lambda wire: wire.bbSegment.getCenter().getY() ) - if self.type == chip.North or self.type == chip.South: + if self.type == North or self.type == South: trace( 550, 'Sort North/South' ) self.coreWires.sort( key=lambda wire: wire.bbSegment.getCenter().getX() ) @@ -597,14 +599,14 @@ class Side ( object ): self.coreWires[ -(offset+1) ].setOffset( i+1, CoreWire.AtEnd ) for wire in self.coreWires: - if self.type == chip.West or self.type == chip.East: + if self.type == West or self.type == East: trace( 550, '\t| %s %s %d %s inRange:%s\n' % ( wire.chipNet.getName() , DbU.getValueString(wire.bbSegment.getCenter().getY()) , wire.count , wire.padSegment.getLayer() , wire.inCoronaRange ) ) - if self.type == chip.North or self.type == chip.South: + if self.type == North or self.type == South: trace( 550, '\t| %s %s %d %s inRange:%s\n' % ( wire.chipNet.getName() , DbU.getValueString(wire.bbSegment.getCenter().getX()) , wire.count @@ -647,12 +649,12 @@ class CoreWire ( object ): def updateInCorona ( self ): coronaAb = self.conf.getInstanceAb( self.conf.icorona ) - if self.side == chip.South or self.side == chip.North: + if self.side == South or self.side == North: xCoronaPin = self.bbSegment.getCenter().getX() if xCoronaPin <= coronaAb.getXMin(): self.inCoronaRange = False elif xCoronaPin >= coronaAb.getXMax(): self.inCoronaRange = False - if self.side == chip.East or self.side == chip.West: + if self.side == East or self.side == West: yCoronaPin = self.bbSegment.getCenter().getY() if yCoronaPin <= coronaAb.getYMin(): self.inCoronaRange = False elif yCoronaPin >= coronaAb.getYMax(): self.inCoronaRange = False @@ -681,7 +683,7 @@ class CoreWire ( object ): if self.preferredDir: self.symContactLayer = self.symSegmentLayer - if self.side & (chip.West|chip.East): + if self.side & (West|East): self.symContactSize = ( layerGauge.getWireWidth(), self.bbSegment.getHeight() ) else: self.symContactSize = ( self.bbSegment.getWidth(), layerGauge.getWireWidth() ) @@ -694,7 +696,7 @@ class CoreWire ( object ): self.symSegmentLayer = rg.getLayerGauge( depth+1 ).getLayer() self.symContactLayer = rg.getContactLayer( depth ) - if self.side & (chip.West|chip.East): + if self.side & (West|East): self.symContactSize = ( self.bbSegment.getHeight(), self.bbSegment.getHeight() ) else: self.symContactSize = ( self.bbSegment.getWidth(), self.bbSegment.getWidth() ) @@ -710,7 +712,7 @@ class CoreWire ( object ): % (DbU.toLambda(contactMinSize),DbU.toLambda(arrayWidth),arrayCount) ) if arrayCount < 0: arrayCount = 0 if arrayCount < 3: - if self.side & (chip.North|chip.South): + if self.side & (North|South): self.arraySize = ( arrayCount+1, 2 ) else: self.arraySize = ( 2, arrayCount+1 ) @@ -737,8 +739,8 @@ class CoreWire ( object ): if not isinstance(padLayer,BasicLayer): padLayer = padLayer.getBasicLayer() - if self.side == chip.West or self.side == chip.East: - flags = chip.OnHorizontalPitch + if self.side == West or self.side == East: + flags = OnHorizontalPitch hPitch = self.conf.gaugeConf.getPitch( self.symSegmentLayer ) vPitch = self.conf.gaugeConf.getPitch( self.padSegment.getLayer() ) @@ -749,7 +751,7 @@ class CoreWire ( object ): else: yCore -= 2*hPitch*self.offset - if self.side == chip.West: + if self.side == West: accessDirection = Pin.Direction.WEST xPadMin = self.bbSegment.getXMin() xContact = self.corona.coreSymBb.getXMin() - self.offset * 2*vPitch @@ -813,8 +815,8 @@ class CoreWire ( object ): ) if self.arraySize: - if self.side == chip.West: xContact = min( xContact, vStrapBb.getXMin() ) - else: xContact = max( xContact, vStrapBb.getXMax() ) + if self.side == West: xContact = min( xContact, vStrapBb.getXMin() ) + else: xContact = max( xContact, vStrapBb.getXMax() ) self.conf.coronaHorizontal( self.chipNet , self.symSegmentLayer @@ -834,7 +836,7 @@ class CoreWire ( object ): , self.bbSegment.getHeight() ) else: - flags = chip.OnVerticalPitch + flags = OnVerticalPitch hPitch = self.conf.gaugeConf.getPitch( self.padSegment.getLayer() ) vPitch = self.conf.gaugeConf.getPitch( self.symSegmentLayer ) @@ -847,7 +849,7 @@ class CoreWire ( object ): else: xCore -= 2*vPitch*self.offset - if self.side == chip.South: + if self.side == South: accessDirection = Pin.Direction.SOUTH yPadMin = self.bbSegment.getYMin() yPadMax = self.corona.coreSymBb.getYMin() - self.offset * 2*hPitch @@ -911,8 +913,8 @@ class CoreWire ( object ): ) if self.arraySize: - if self.side == chip.South: yContact = min( yContact, hStrapBb.getYMin() ) - else: yContact = max( yContact, hStrapBb.getYMax() ) + if self.side == South: yContact = min( yContact, hStrapBb.getYMin() ) + else: yContact = max( yContact, hStrapBb.getYMax() ) trace( 550, '\txCore: %sl %s\n' % (DbU.toLambda(xCore), DbU.getValueString(xCore)) ) self.conf.coronaVertical( self.chipNet @@ -932,10 +934,10 @@ class CoreWire ( object ): , DbU.fromLambda( 1.0 ) ) - if self.side & chip.North: self.corona.northSide.pins.append( pin ) - if self.side & chip.South: self.corona.southSide.pins.append( pin ) - if self.side & chip.East : self.corona.eastSide .pins.append( pin ) - if self.side & chip.West : self.corona.westSide .pins.append( pin ) + if self.side & North: self.corona.northSide.pins.append( pin ) + if self.side & South: self.corona.southSide.pins.append( pin ) + if self.side & East : self.corona.eastSide .pins.append( pin ) + if self.side & West : self.corona.westSide .pins.append( pin ) trace( 550, '-' ) return @@ -953,14 +955,14 @@ class Corona ( object ): self.conf = conf self.validated = False - self.northSide = Side( self, chip.North ) - self.southSide = Side( self, chip.South ) - self.eastSide = Side( self, chip.East ) - self.westSide = Side( self, chip.West ) - self.corners = { chip.SouthWest : Corner( self, chip.SouthWest ) - , chip.SouthEast : Corner( self, chip.SouthEast ) - , chip.NorthWest : Corner( self, chip.NorthWest ) - , chip.NorthEast : Corner( self, chip.NorthEast ) + self.northSide = Side( self, North ) + self.southSide = Side( self, South ) + self.eastSide = Side( self, East ) + self.westSide = Side( self, West ) + self.corners = { SouthWest : Corner( self, SouthWest ) + , SouthEast : Corner( self, SouthEast ) + , NorthWest : Corner( self, NorthWest ) + , NorthEast : Corner( self, NorthEast ) } self.padLib = None self.padOrient = Transformation.Orientation.ID @@ -1131,7 +1133,7 @@ class Corona ( object ): gapWidth = 0 segments = None inPreferredDir = False - if side.type == chip.North or side.type == chip.South: + if side.type == North or side.type == South: if len(vsegments): inPreferredDir = True segments = vsegments[ min(vsegments.keys()) ] @@ -1148,7 +1150,7 @@ class Corona ( object ): if segments: for segment, bb in segments: if not inPreferredDir: - if side.type == chip.North or side.type == chip.South: + if side.type == North or side.type == South: trace( 550, '\tNorth/South "%s" but RDir H, gapWidth: %s\n' % (chipIntNet.getName(),DbU.getValueString(bb.getWidth()) ) ) side.updateGap( bb.getWidth() ) @@ -1213,10 +1215,10 @@ class Corona ( object ): self.conf.setupCorona( self.westSide.gap, self.southSide.gap, self.eastSide.gap, self.northSide.gap ) self.coreSymBb = self.conf.getInstanceAb( self.conf.icorona ) - self.coreSymBb.inflate( self.conf.toSymbolic( self.westSide.gap /2, chip.Superior ) - , self.conf.toSymbolic( self.southSide.gap/2, chip.Superior ) - , self.conf.toSymbolic( self.eastSide.gap /2, chip.Inferior ) - , self.conf.toSymbolic( self.northSide.gap/2, chip.Inferior ) ) + self.coreSymBb.inflate( self.conf.toSymbolic( self.westSide.gap /2, Superior ) + , self.conf.toSymbolic( self.southSide.gap/2, Superior ) + , self.conf.toSymbolic( self.eastSide.gap /2, Inferior ) + , self.conf.toSymbolic( self.northSide.gap/2, Inferior ) ) self.southSide.drawCoreWires() self.northSide.drawCoreWires() diff --git a/cumulus/src/plugins/chip/__init__.py b/cumulus/src/plugins/chip/__init__.py index ff95dea8..964e8bca 100644 --- a/cumulus/src/plugins/chip/__init__.py +++ b/cumulus/src/plugins/chip/__init__.py @@ -14,6 +14,9 @@ # +-----------------------------------------------------------------+ +from helpers.io import WarningMessage + + # Common constants used through all modules. # For Corona's sides. @@ -34,3 +37,16 @@ Inferior = 0x0020 Inwards = 0x0040 OnHorizontalPitch = 0x0080 OnVerticalPitch = 0x0100 + + +def importConstants ( symbols ): + if not isinstance(symbols,dict): + print WarningMessage( 'plugins.chip.__init__.importConstants(), argument is not a symbol table.' ) + return + + for symbol in globals().items(): + if isinstance(symbol[1],int) or isinstance(symbol[1],long): + if not symbols.has_key(symbol[0]): + symbols[ symbol[0] ] = symbol[1] + + return diff --git a/cumulus/src/plugins/core2chip/CoreToChip.py b/cumulus/src/plugins/core2chip/CoreToChip.py index 8c871468..b7b49372 100644 --- a/cumulus/src/plugins/core2chip/CoreToChip.py +++ b/cumulus/src/plugins/core2chip/CoreToChip.py @@ -22,7 +22,7 @@ from CRL import Catalog from CRL import AllianceFramework from helpers import netDirectionToStr from helpers.io import ErrorMessage -import chip.Chip +import chip # ------------------------------------------------------------------- diff --git a/cumulus/src/plugins/core2chip/cmos.py b/cumulus/src/plugins/core2chip/cmos.py index 5b03c394..5a8d4724 100644 --- a/cumulus/src/plugins/core2chip/cmos.py +++ b/cumulus/src/plugins/core2chip/cmos.py @@ -14,20 +14,21 @@ # | Python : "./plugins/core2chip/cmos.py" | # +-----------------------------------------------------------------+ +import sys import re -from Hurricane import DbU -from Hurricane import DataBase -from Hurricane import UpdateSession -from Hurricane import Breakpoint -from Hurricane import Transformation -from Hurricane import Instance -from Hurricane import Net -import Viewer -from CRL import Catalog -from CRL import AllianceFramework -from helpers.io import ErrorMessage -from core2chip.CoreToChip import IoPad -from core2chip.CoreToChip import CoreToChip +from Hurricane import DbU +from Hurricane import DataBase +from Hurricane import UpdateSession +from Hurricane import Breakpoint +from Hurricane import Transformation +from Hurricane import Instance +from Hurricane import Net +import Viewer +from CRL import Catalog +from CRL import AllianceFramework +from helpers.io import ErrorMessage +from plugins.core2chip.CoreToChip import IoPad +from plugins.core2chip.CoreToChip import CoreToChip class cmos ( CoreToChip ): diff --git a/cumulus/src/plugins/core2chip/phlib80.py b/cumulus/src/plugins/core2chip/phlib80.py index 0282afa0..5e36f54a 100644 --- a/cumulus/src/plugins/core2chip/phlib80.py +++ b/cumulus/src/plugins/core2chip/phlib80.py @@ -16,19 +16,19 @@ import re -from Hurricane import DbU -from Hurricane import DataBase -from Hurricane import UpdateSession -from Hurricane import Breakpoint -from Hurricane import Transformation -from Hurricane import Instance -from Hurricane import Net -import Viewer -from CRL import Catalog -from CRL import AllianceFramework -from helpers.io import ErrorMessage -from core2chip.CoreToChip import IoPad -from core2chip.CoreToChip import CoreToChip +from Hurricane import DbU +from Hurricane import DataBase +from Hurricane import UpdateSession +from Hurricane import Breakpoint +from Hurricane import Transformation +from Hurricane import Instance +from Hurricane import Net +import Viewer +from CRL import Catalog +from CRL import AllianceFramework +from helpers.io import ErrorMessage +from plugins.core2chip.CoreToChip import IoPad +from plugins.core2chip.CoreToChip import CoreToChip class phlib80 ( CoreToChip ): diff --git a/hurricane/src/analog/LayoutGenerator.cpp b/hurricane/src/analog/LayoutGenerator.cpp index 8858b1bf..04773c8e 100644 --- a/hurricane/src/analog/LayoutGenerator.cpp +++ b/hurricane/src/analog/LayoutGenerator.cpp @@ -171,10 +171,10 @@ namespace Analog { // Eric passed by here //cerr << "Python driven Layout successfully drawn." << endl; - finalize( ShowTimeTag|StatusOk ); - _device->setAbutmentBox( getDeviceBox() ); + finalize( ShowTimeTag|StatusOk ); + //string message = _device->checkLayoutOnPhysicalGrid(); //if (not message.empty()) // popError( message.c_str() ); diff --git a/hurricane/src/isobar/PyInstance.cpp b/hurricane/src/isobar/PyInstance.cpp index 84016b1e..7ab7f9ed 100644 --- a/hurricane/src/isobar/PyInstance.cpp +++ b/hurricane/src/isobar/PyInstance.cpp @@ -108,7 +108,8 @@ extern "C" { , PyInt_AsPlacementStatus(arg4) ); } else { - PyErr_SetString( ConstructorError, "Instance.create(): Bad type of parameter(s)." ); + string message = "Instance.create(): Bad type of parameter(s), \"" + __cs.getObjectIds() + "\"."; + PyErr_SetString( ConstructorError, message.c_str() ); return NULL; } HCATCH diff --git a/hurricane/src/viewer/Script.cpp b/hurricane/src/viewer/Script.cpp index eb75cc98..2bd2bb74 100644 --- a/hurricane/src/viewer/Script.cpp +++ b/hurricane/src/viewer/Script.cpp @@ -227,7 +227,8 @@ namespace Isobar { if (Py_IsInitialized()) { // Python is already running. Launch a sub-interpreter. _globalState = PyThreadState_Get(); - _subInterpreter = Py_NewInterpreter(); + //_subInterpreter = Py_NewInterpreter(); + _subInterpreter = _globalState; } else Py_Initialize(); @@ -257,14 +258,18 @@ namespace Isobar { if (not (_flags & Initialized)) return; _flags &= ~Initialized; - if (_subInterpreter != NULL) { + //if (_subInterpreter == _globalState) return; + + if ( (_subInterpreter != NULL) and (_subInterpreter != _globalState) ) { Py_EndInterpreter(_subInterpreter); PyThreadState_Swap(_globalState); _subInterpreter = NULL; } else { - if ( _userModule != NULL ) { Py_DECREF ( _userModule ); } - if ( _hurricaneModule != NULL ) { Py_DECREF ( _hurricaneModule ); } - if ( _sysModule != NULL ) { Py_DECREF ( _sysModule ); } + if (_subInterpreter != _globalState) { + if ( _userModule != NULL ) { Py_DECREF ( _userModule ); } + if ( _hurricaneModule != NULL ) { Py_DECREF ( _hurricaneModule ); } + if ( _sysModule != NULL ) { Py_DECREF ( _sysModule ); } + } if ( _pyResult != NULL ) { Py_DECREF ( _pyResult ); } if ( _pyArgs != NULL ) { Py_DECREF ( _pyArgs ); } if ( _pyFunction != NULL ) { Py_DECREF ( _pyFunction ); } diff --git a/karakaze/python/AnalogDesign.py b/karakaze/python/AnalogDesign.py index 673b42af..7758bba9 100644 --- a/karakaze/python/AnalogDesign.py +++ b/karakaze/python/AnalogDesign.py @@ -326,8 +326,11 @@ class AnalogDesign ( object ): self.generator.setDevice ( device ) self.generator.drawLayout() - instance = Instance.create( self.cell, dspec[1], device, Transformation() ) - instance.setPlacementStatus( Instance.PlacementStatus.UNPLACED ) + instance = Instance.create( self.cell + , dspec[1] + , device + , Transformation() + , Instance.PlacementStatus.UNPLACED ) self.__dict__[ dspec[1] ] = instance return diff --git a/unicorn/python/unicornInit.py b/unicorn/python/unicornInit.py index 141dfc9f..cbbc79c9 100644 --- a/unicorn/python/unicornInit.py +++ b/unicorn/python/unicornInit.py @@ -21,6 +21,7 @@ try: import helpers from helpers.io import ErrorMessage from helpers.io import WarningMessage + import plugins import Viewer except ImportError, e: serror = str(e) @@ -41,58 +42,44 @@ except Exception, e: sys.exit(2) +#helpers.staticInitialization( quiet=True ) + + def unicornConfigure ( **kw ): editor = None if kw.has_key('editor'): - editor = kw['editor'] + editor = kw['editor'] else: - print ErrorMessage( 3, 'unicornConfigure.py: Must be run from a CellView derived class.' ) - return + print ErrorMessage( 3, 'unicornConfigure.py: Must be run from a CellView derived class.' ) + return - cumulusDir = None - for path in sys.path: - if path.endswith('/cumulus'): - cumulusDir = path - if not cumulusDir: - print ErrorMessage( 3, 'unicornConfigure.py: Cannot find in PYTHONPATH.' ) - return - - pluginsDir = os.path.join( cumulusDir, 'plugins' ) - if not os.path.isdir(pluginsDir): - print ErrorMessage( 3, 'unicornConfigure.py: Cannot find directory:' \ - , '<%s>' % pluginsDir ) - return - sys.path.append( pluginsDir ) - if editor.hasMenu( 'plugins' ): - print WarningMessage( 'The menu has already been created.' ) - return + print WarningMessage( 'The menu has already been created.' ) + return #editor.addMenu( 'plugins', 'Plu&gins', Viewer.CellViewer.TopMenu ) - moduleNames = [] - for pluginFile in os.listdir( pluginsDir ): - if pluginFile == "__init__.py": continue - if not pluginFile.endswith('.py'): continue - moduleNames.append( os.path.basename(pluginFile)[:-3] ) - - moduleNames.sort() - - for moduleName in moduleNames: - try: - module = __import__( moduleName, globals(), locals(), moduleName ) - - if not module.__dict__.has_key('unicornHook'): - print WarningMessage( 'Plugin <%s> do not provides the unicornHook() method, skipped.' \ - % moduleName ) - continue - - module.__dict__['unicornHook']( **kw ) - - except ErrorMessage, e: - print e - helpers.showStackTrace( e.trace ) - except Exception, e: - helpers.showPythonTrace( __file__, e ) + for moduleName in sys.modules: + if moduleName.startswith('plugins.'): + try: + module = sys.modules[ moduleName ] + if not module: + #print WarningMessage( 'Plugin "%s" not found in Python sys/modules[].' \ + # % moduleName ) + continue + + if not module.__dict__.has_key('unicornHook'): + elements = module.__file__.split( os.sep ) + if elements[-2] == 'plugins': + print WarningMessage( 'Plugin "%s" do not provides the unicornHook() method, skipped.' \ + % moduleName ) + continue + + module.__dict__['unicornHook']( **kw ) + except ErrorMessage, e: + print e + helpers.showStackTrace( e.trace ) + except Exception, e: + helpers.showPythonTrace( __file__, e ) return