More Python hacking to deal with config.py split
authorSteve Reinhardt <stever@eecs.umich.edu>
Tue, 5 Sep 2006 00:14:07 +0000 (17:14 -0700)
committerSteve Reinhardt <stever@eecs.umich.edu>
Tue, 5 Sep 2006 00:14:07 +0000 (17:14 -0700)
and resulting recursive import trickiness.

--HG--
extra : convert_revision : 1ea93861eb8d260c9f3920dda0b8106db3e03705

35 files changed:
src/python/m5/SimObject.py
src/python/m5/__init__.py
src/python/m5/objects/AlphaConsole.py
src/python/m5/objects/AlphaTLB.py
src/python/m5/objects/BadDevice.py
src/python/m5/objects/BaseCPU.py
src/python/m5/objects/BaseCache.py
src/python/m5/objects/Bridge.py
src/python/m5/objects/Bus.py
src/python/m5/objects/CoherenceProtocol.py
src/python/m5/objects/Device.py
src/python/m5/objects/DiskImage.py
src/python/m5/objects/Ethernet.py
src/python/m5/objects/FUPool.py
src/python/m5/objects/FuncUnit.py
src/python/m5/objects/Ide.py
src/python/m5/objects/IntrControl.py
src/python/m5/objects/MemObject.py
src/python/m5/objects/MemTest.py
src/python/m5/objects/O3CPU.py
src/python/m5/objects/OzoneCPU.py
src/python/m5/objects/Pci.py
src/python/m5/objects/PhysicalMemory.py
src/python/m5/objects/Platform.py
src/python/m5/objects/Process.py
src/python/m5/objects/Repl.py
src/python/m5/objects/Root.py
src/python/m5/objects/SimConsole.py
src/python/m5/objects/SimpleDisk.py
src/python/m5/objects/SimpleOzoneCPU.py
src/python/m5/objects/System.py
src/python/m5/objects/Tsunami.py
src/python/m5/objects/Uart.py
src/python/m5/params.py
src/sim/main.cc

index 33fa51665cf3f3686bc7a887b329bfb73fb3a0f5..b8b931d81ef66e74ff8970e32e29b54c9b9e9829 100644 (file)
 
 import sys, types
 
-import m5
-from m5 import panic, cc_main
-from convert import *
+from util import *
 from multidict import multidict
 
+# These utility functions have to come first because they're
+# referenced in params.py... otherwise they won't be defined when we
+# import params below, and the recursive import of this file from
+# params.py will not find these names.
+def isSimObject(value):
+    return isinstance(value, SimObject)
+
+def isSimObjectClass(value):
+    return issubclass(value, SimObject)
+
+def isSimObjectSequence(value):
+    if not isinstance(value, (list, tuple)) or len(value) == 0:
+        return False
+
+    for val in value:
+        if not isNullPointer(val) and not isSimObject(val):
+            return False
+
+    return True
+
+def isSimObjectOrSequence(value):
+    return isSimObject(value) or isSimObjectSequence(value)
+
+# Have to import params up top since Param is referenced on initial
+# load (when SimObject class references Param to create a class
+# variable, the 'name' param)...
+from params import *
+# There are a few things we need that aren't in params.__all__ since
+# normal users don't need them
+from params import ParamDesc, isNullPointer, SimObjVector
+
 noDot = False
 try:
     import pydot
@@ -564,7 +593,7 @@ class SimObject(object):
         for param in param_names:
             value = self._values.get(param, None)
             if value != None:
-                if isproxy(value):
+                if proxy.isproxy(value):
                     try:
                         value = value.unproxy(self)
                     except:
@@ -679,52 +708,6 @@ class SimObject(object):
 class ParamContext(SimObject):
     pass
 
-# Special class for NULL pointers.  Note the special check in
-# make_param_value() above that lets these be assigned where a
-# SimObject is required.
-# only one copy of a particular node
-class NullSimObject(object):
-    __metaclass__ = Singleton
-
-    def __call__(cls):
-        return cls
-
-    def _instantiate(self, parent = None, path = ''):
-        pass
-
-    def ini_str(self):
-        return 'Null'
-
-    def unproxy(self, base):
-        return self
-
-    def set_path(self, parent, name):
-        pass
-    def __str__(self):
-        return 'Null'
-
-# The only instance you'll ever need...
-Null = NULL = NullSimObject()
-
-def isSimObject(value):
-    return isinstance(value, SimObject)
-
-def isNullPointer(value):
-    return isinstance(value, NullSimObject)
-
-def isSimObjectSequence(value):
-    if not isinstance(value, (list, tuple)) or len(value) == 0:
-        return False
-
-    for val in value:
-        if not isNullPointer(val) and not isSimObject(val):
-            return False
-
-    return True
-
-def isSimObjectOrSequence(value):
-    return isSimObject(value) or isSimObjectSequence(value)
-
 # Function to provide to C++ so it can look up instances based on paths
 def resolveSimObject(name):
     obj = instanceDict[name]
@@ -735,3 +718,7 @@ def resolveSimObject(name):
 # short to avoid polluting other namespaces.
 __all__ = ['SimObject', 'ParamContext']
 
+
+# see comment on imports at end of __init__.py.
+import proxy
+import cc_main
index bd2efac09f45669520e0b4138afe1230da9ce769..c37abbac9276fa8f432151627769651ad2734031 100644 (file)
@@ -71,8 +71,6 @@ build_env.update(defines.m5_build_env)
 env = smartdict.SmartDict()
 env.update(os.environ)
 
-from main import options, arguments, main
-
 # The final hook to generate .ini files.  Called from the user script
 # once the config is built.
 def instantiate(root):
@@ -206,5 +204,7 @@ def switchCpus(cpuList):
 #    you can get the wrong result if foo is only partially imported
 #    at the point you do that (i.e., because foo is in the middle of
 #    importing *you*).
+from main import options
 import objects
 import params
+from SimObject import resolveSimObject
index 329b8c5bd4f36696fb149855762f04a130d1e4c9..1c71493b1854b18ce68d1ba4525d2d6de46057b4 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.params import *
+from m5.proxy import *
 from Device import BasicPioDevice
 
 class AlphaConsole(BasicPioDevice):
index 11c1792eedae01b8b3466dad1e5c2cc120c090fa..af7c04a84eeda3951c015a97e1634ea68bc06ea3 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 class AlphaTLB(SimObject):
     type = 'AlphaTLB'
     abstract = True
index 186b733fa1b6581e6e9ae43e03ba7161859f4ec3..9196238870df9cad473b99d8baa2d223a53e1b2a 100644 (file)
@@ -1,4 +1,4 @@
-from m5.config import *
+from m5.params import *
 from Device import BasicPioDevice
 
 class BadDevice(BasicPioDevice):
index 41e90b12b9762f19fb4f2a8877c34e35f8bc9ae3..3dd0bda01ceae8465b795922ba4d5acb5a79cf5d 100644 (file)
@@ -1,5 +1,7 @@
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 from m5 import build_env
-from m5.config import *
 from AlphaTLB import AlphaDTB, AlphaITB
 from Bus import Bus
 
index 497b2b038a479f86ae29ecbf8bd5fc10b68e546f..db58a177f0e3ebf67c9b9677e4435544561f1ee7 100644 (file)
@@ -1,4 +1,4 @@
-from m5.config import *
+from m5.params import *
 from MemObject import MemObject
 
 class Prefetch(Enum): vals = ['none', 'tagged', 'stride', 'ghb']
index c9e673afb6148a7d395961277afd421ee0326396..ee8e76bff77efca8fd77a3301eaadbf096f81fbe 100644 (file)
@@ -1,4 +1,4 @@
-from m5.config import *
+from m5.params import *
 from MemObject import MemObject
 
 class Bridge(MemObject):
index e0278e6c3315a2abd79d6a28f7638a04494eb0b5..f6828a0d5505dd34d95026abcbfe0c62eee91029 100644 (file)
@@ -1,4 +1,4 @@
-from m5.config import *
+from m5.params import *
 from MemObject import MemObject
 
 class Bus(MemObject):
index 64b6cbacf5fd6c1c25800b1ad417fde36f8bbe2f..82adb686260a3a2d3c328751f7da86c35c093e2f 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 class Coherence(Enum): vals = ['uni', 'msi', 'mesi', 'mosi', 'moesi']
 
 class CoherenceProtocol(SimObject):
index f72c8e73f2f290622f749ce81e2c824401ec021c..3e9094e255cf5930cd03018bed7d6f79e7203225 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.params import *
+from m5.proxy import *
 from MemObject import MemObject
 
 class PioDevice(MemObject):
index a98b35a4f3dc59271d1296d33b17ed2f0760cd59..d0ada7ee19bb7b3e4cb124a676bff1058349ef3a 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 class DiskImage(SimObject):
     type = 'DiskImage'
     abstract = True
index fb641bf809ce497c52fc1415b39e10da7d7cd9a2..609a3dd6f846e37c24dbe2cb09b3569bb54fecc9 100644 (file)
@@ -1,5 +1,7 @@
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 from m5 import build_env
-from m5.config import *
 from Device import DmaDevice
 from Pci import PciDevice, PciConfigData
 
index cbf1089cfb62be1ad77b3563b2d453a93a7199b9..4b4be79a6cd3962a14dbcd14318be98113ea0af1 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 
 class FUPool(SimObject):
     type = 'FUPool'
index f61590ae9c3d6ed7219b1946fee18e62ec040f83..f0ad55f7aaef5bcfab4e65de59d2be24520ab7c1 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 
 class OpType(Enum):
     vals = ['(null)', 'IntAlu', 'IntMult', 'IntDiv', 'FloatAdd',
index a8bd4ac5ac6ef22917ce32a6af6d95422c5ecfee..69681bdbda1c7b201e6cecf191ded194b38af077 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 from Pci import PciDevice, PciConfigData
 
 class IdeID(Enum): vals = ['master', 'slave']
index 514c3fc624f2ca89e42e9c62945b64dbbe9d5a82..95be0f4dfc40e4e85f4770238d1958ac8d75a3c9 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 class IntrControl(SimObject):
     type = 'IntrControl'
     cpu = Param.BaseCPU(Parent.any, "the cpu")
index d957dae17160c4384548e0eff8a2d962776cfe41..8982d553d9829ab59c00a04ffdd166a3da5cee85 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.SimObject import SimObject
 
 class MemObject(SimObject):
     type = 'MemObject'
index 9916d7cb44daf2cd47c1dfb943258f613cece0e4..97600768fb5ccbc0745c08edf428c858e0842113 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 class MemTest(SimObject):
     type = 'MemTest'
     cache = Param.BaseCache("L1 cache")
index 900bbf28cf421f20757cb66f78f7c3ed69e6c650..5100c7ccb50695aff20dca7d90031424b24f167e 100644 (file)
@@ -1,5 +1,6 @@
+from m5.params import *
+from m5.proxy import *
 from m5 import build_env
-from m5.config import *
 from BaseCPU import BaseCPU
 from Checker import O3Checker
 
index 88fb63c74805c41cdacd2f4a3ddb1f3c7de12d54..8f25d77ed697f560953f380366027d979a3fbf8b 100644 (file)
@@ -1,5 +1,5 @@
+from m5.params import *
 from m5 import build_env
-from m5.config import *
 from BaseCPU import BaseCPU
 
 class DerivOzoneCPU(BaseCPU):
index cc0d1cf4a8351f0a0c6a98c167d36d71483f6054..7c239d0693e949ad815c5dfed6d787c422298d6b 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 from Device import BasicPioDevice, DmaDevice, PioDevice
 
 class PciConfigData(SimObject):
index bc427aa88ee22a867fb76efc171c07512e9ceada..dd3ffd65112e0e2e1803cf993699e47288032938 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.params import *
+from m5.proxy import *
 from MemObject import *
 
 class PhysicalMemory(MemObject):
index 89fee9991edffb266a22f52e93ec6e0d6d3ee2ce..ab2083eea50688d6909c71c1b58a078c0dc413ff 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 class Platform(SimObject):
     type = 'Platform'
     abstract = True
index 0091d8654e7b824b2663d0634e17cfcc5bb4fee7..08f8b6bce80aa5721ea663f84569f44592ddaaef 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 class Process(SimObject):
     type = 'Process'
     abstract = True
index 8e9f1094fb74900e44d546cd1a73d8d8e753e16e..10892cf6f81343262c85af0e6231b271098b163f 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 class Repl(SimObject):
     type = 'Repl'
     abstract = True
index 33dd2262029926628375469683bbe435efefc6b0..f01fc06c421265367f9f2d749ae3f1dbfb0395a5 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
 from Serialize import Serialize
 from Statistics import Statistics
 from Trace import Trace
index 9e1452c6d31369fd225948122ad46474fe2b81a8..bdd7f246dfdfc51b4d589eed09bd383a32541655 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 class ConsoleListener(SimObject):
     type = 'ConsoleListener'
     port = Param.TcpPort(3456, "listen port")
index 44ef709af4522420ddffd4e7a4d2b7f3e37b4468..099a77dbb6c5a7d7752a4f8b200075e28b9d3bae 100644 (file)
@@ -1,4 +1,6 @@
-from m5.config import *
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 class SimpleDisk(SimObject):
     type = 'SimpleDisk'
     disk = Param.DiskImage("Disk Image")
index 5d968cab0f2370a192ab3b6ab76740428a52cc9a..193f31b0f8ed9d5a5c79675f0f26880af4fb3c6e 100644 (file)
@@ -1,5 +1,5 @@
+from m5.params import *
 from m5 import build_env
-from m5.config import *
 from BaseCPU import BaseCPU
 
 class SimpleOzoneCPU(BaseCPU):
index 386f39277a26585556a040d6bb9f182da91666ef..bc2a002cb3b11e25052473dbbe555e468e31e8b5 100644 (file)
@@ -1,5 +1,7 @@
+from m5.SimObject import SimObject
+from m5.params import *
+from m5.proxy import *
 from m5 import build_env
-from m5.config import *
 
 class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
 
index 0b5ff9e7d95e9cad04038973406639bd017ddfac..0b53153a07fabf61319a73449d1b503ae6fc96ee 100644 (file)
@@ -1,4 +1,5 @@
-from m5.config import *
+from m5.params import *
+from m5.proxy import *
 from Device import BasicPioDevice
 from Platform import Platform
 from AlphaConsole import AlphaConsole
index 8e1fd1a372e121a507a4cf2d9953a181054dbec3..62062c6b1777f26f07e24a7c5c941693352170c3 100644 (file)
@@ -1,5 +1,6 @@
+from m5.params import *
+from m5.proxy import *
 from m5 import build_env
-from m5.config import *
 from Device import BasicPioDevice
 
 class Uart(BasicPioDevice):
index eb30e5c4d92a784167d43fda44276f488a2796e4..db11b9cff29162c2d2be4f03e36e076b7d260224 100644 (file)
@@ -46,6 +46,7 @@
 
 import sys, inspect, copy
 import convert
+from util import *
 
 # Dummy base class to identify types that are legitimate for SimObject
 # parameters.
@@ -100,13 +101,14 @@ class ParamDesc(object):
     def __getattr__(self, attr):
         if attr == 'ptype':
             try:
-                ptype = eval(self.ptype_str, m5.objects.__dict__)
+                ptype = eval(self.ptype_str, objects.__dict__)
                 if not isinstance(ptype, type):
-                    panic("Param qualifier is not a type: %s" % self.ptype)
+                    raise NameError
                 self.ptype = ptype
                 return ptype
             except NameError:
-                pass
+                raise TypeError, \
+                      "Param qualifier '%s' is not a type" % self.ptype_str
         raise AttributeError, "'%s' object has no attribute '%s'" % \
               (type(self).__name__, attr)
 
@@ -120,7 +122,7 @@ class ParamDesc(object):
             return value
         if isinstance(value, self.ptype):
             return value
-        if isNullPointer(value) and issubclass(self.ptype, SimObject):
+        if isNullPointer(value) and isSimObjectClass(self.ptype):
             return value
         return self.ptype(value)
 
@@ -305,7 +307,7 @@ class CheckedInt(NumericParamValue):
 
     def __init__(self, value):
         if isinstance(value, str):
-            self.value = toInteger(value)
+            self.value = convert.toInteger(value)
         elif isinstance(value, (int, long, float)):
             self.value = long(value)
         self._check()
@@ -340,7 +342,7 @@ class MemorySize(CheckedInt):
         if isinstance(value, MemorySize):
             self.value = value.value
         else:
-            self.value = toMemorySize(value)
+            self.value = convert.toMemorySize(value)
         self._check()
 
 class MemorySize32(CheckedInt):
@@ -350,7 +352,7 @@ class MemorySize32(CheckedInt):
         if isinstance(value, MemorySize):
             self.value = value.value
         else:
-            self.value = toMemorySize(value)
+            self.value = convert.toMemorySize(value)
         self._check()
 
 class Addr(CheckedInt):
@@ -363,7 +365,7 @@ class Addr(CheckedInt):
             self.value = value.value
         else:
             try:
-                self.value = toMemorySize(value)
+                self.value = convert.toMemorySize(value)
             except TypeError:
                 self.value = long(value)
         self._check()
@@ -430,7 +432,7 @@ class Bool(ParamValue):
     cxx_type = 'bool'
     def __init__(self, value):
         try:
-            self.value = toBool(value)
+            self.value = convert.toBool(value)
         except TypeError:
             self.value = bool(value)
 
@@ -586,10 +588,10 @@ def getLatency(value):
         return 1 / value.value
     elif isinstance(value, str):
         try:
-            return toLatency(value)
+            return convert.toLatency(value)
         except ValueError:
             try:
-                return 1 / toFrequency(value)
+                return 1 / convert.toFrequency(value)
             except ValueError:
                 pass # fall through
     raise ValueError, "Invalid Frequency/Latency value '%s'" % value
@@ -678,7 +680,7 @@ class Clock(ParamValue):
 class NetworkBandwidth(float,ParamValue):
     cxx_type = 'float'
     def __new__(cls, value):
-        val = toNetworkBandwidth(value) / 8.0
+        val = convert.toNetworkBandwidth(value) / 8.0
         return super(cls, NetworkBandwidth).__new__(cls, val)
 
     def __str__(self):
@@ -690,7 +692,7 @@ class NetworkBandwidth(float,ParamValue):
 class MemoryBandwidth(float,ParamValue):
     cxx_type = 'float'
     def __new__(self, value):
-        val = toMemoryBandwidth(value)
+        val = convert.toMemoryBandwidth(value)
         return super(cls, MemoryBandwidth).__new__(cls, val)
 
     def __str__(self):
@@ -703,6 +705,36 @@ class MemoryBandwidth(float,ParamValue):
 # "Constants"... handy aliases for various values.
 #
 
+# Special class for NULL pointers.  Note the special check in
+# make_param_value() above that lets these be assigned where a
+# SimObject is required.
+# only one copy of a particular node
+class NullSimObject(object):
+    __metaclass__ = Singleton
+
+    def __call__(cls):
+        return cls
+
+    def _instantiate(self, parent = None, path = ''):
+        pass
+
+    def ini_str(self):
+        return 'Null'
+
+    def unproxy(self, base):
+        return self
+
+    def set_path(self, parent, name):
+        pass
+    def __str__(self):
+        return 'Null'
+
+# The only instance you'll ever need...
+NULL = NullSimObject()
+
+def isNullPointer(value):
+    return isinstance(value, NullSimObject)
+
 # Some memory range specifications use this as a default upper bound.
 MaxAddr = Addr.max
 MaxTick = Tick.max
@@ -821,11 +853,11 @@ __all__ = ['Param', 'VectorParam',
            'NetworkBandwidth', 'MemoryBandwidth',
            'Range', 'AddrRange', 'TickRange',
            'MaxAddr', 'MaxTick', 'AllMemory',
-           'Null', 'NULL',
-           'NextEthernetAddr',
+           'NextEthernetAddr', 'NULL',
            'Port', 'VectorPort']
 
 # see comment on imports at end of __init__.py.
-from SimObject import SimObject, isSimObject, isSimObjectSequence, \
-     isNullPointer
+from SimObject import isSimObject, isSimObjectSequence, isSimObjectClass
 import proxy
+import objects
+import cc_main
index 4ea8c413859659491730eafd8fd415d6b8bf7ce1..5725897f896a15f79aa4cc56133d1e892304d9f3 100644 (file)
@@ -151,8 +151,8 @@ main(int argc, char **argv)
     // initialize SWIG 'cc_main' module
     init_cc_main();
 
-    PyRun_SimpleString("import m5");
-    PyRun_SimpleString("m5.main()");
+    PyRun_SimpleString("import m5.main");
+    PyRun_SimpleString("m5.main.main()");
 
     // clean up Python intepreter.
     Py_Finalize();