Update config file language to take simobj and no longer use siminst
authorNathan Binkert <binkertn@umich.edu>
Thu, 3 Feb 2005 02:13:01 +0000 (21:13 -0500)
committerNathan Binkert <binkertn@umich.edu>
Thu, 3 Feb 2005 02:13:01 +0000 (21:13 -0500)
objects/AlphaConsole.mpy:
objects/AlphaTLB.mpy:
objects/BadDevice.mpy:
objects/BaseCPU.mpy:
objects/BaseCache.mpy:
objects/BaseSystem.mpy:
objects/Bus.mpy:
objects/CoherenceProtocol.mpy:
objects/Device.mpy:
objects/DiskImage.mpy:
objects/Ethernet.mpy:
objects/Ide.mpy:
objects/IntrControl.mpy:
objects/MemTest.mpy:
objects/Pci.mpy:
objects/PhysicalMemory.mpy:
objects/Platform.mpy:
objects/Process.mpy:
objects/Repl.mpy:
objects/Root.mpy:
objects/SimConsole.mpy:
objects/SimpleDisk.mpy:
objects/Tsunami.mpy:
objects/Uart.mpy:
    simobj now requires a type= line if it is actually intended
    to be a type
sim/pyconfig/SConscript:
    keep track of the filename of embedded files for better
    error messages.
sim/pyconfig/m5config.py:
    Add support for the trickery done with the compiler to get the
    simobj language feature added to the importer.

    fix the bug that gave objects the wrong name in error messages.
test/genini.py:
    Globals have been fixed and use execfile

--HG--
extra : convert_revision : b74495fd6f3479a87ecea7f1234ebb6731279b2b

27 files changed:
objects/AlphaConsole.mpy
objects/AlphaTLB.mpy
objects/BadDevice.mpy
objects/BaseCPU.mpy
objects/BaseCache.mpy
objects/BaseSystem.mpy
objects/Bus.mpy
objects/CoherenceProtocol.mpy
objects/Device.mpy
objects/DiskImage.mpy
objects/Ethernet.mpy
objects/Ide.mpy
objects/IntrControl.mpy
objects/MemTest.mpy
objects/Pci.mpy
objects/PhysicalMemory.mpy
objects/Platform.mpy
objects/Process.mpy
objects/Repl.mpy
objects/Root.mpy
objects/SimConsole.mpy
objects/SimpleDisk.mpy
objects/Tsunami.mpy
objects/Uart.mpy
sim/pyconfig/SConscript
sim/pyconfig/m5config.py
test/genini.py

index bcb47bf8bb7a02cc2dbebd1dd850a6d5e4c6940d..79918a01e273c36cbcbf2e46d2937cc55c3d459a 100644 (file)
@@ -1,8 +1,9 @@
 from Device import PioDevice
 
 simobj AlphaConsole(PioDevice):
+    type = 'AlphaConsole'
     cpu = Param.BaseCPU(Super, "Processor")
     disk = Param.SimpleDisk("Simple Disk")
-    num_cpus = Param.Int(1, "Number of CPU's")
+    num_cpus = Param.Int(1, "Number of CPUs")
     sim_console = Param.SimConsole(Super, "The Simulator Console")
     system = Param.BaseSystem(Super, "system object")
index 571b9837415bdfc78733446f2b95dc16f43e52b1..8e7cd62cc59ee8c032746f8b748fdafaaf1f8f98 100644 (file)
@@ -1,9 +1,12 @@
 simobj AlphaTLB(SimObject):
+    type = 'AlphaTLB'
     abstract = True
     size = Param.Int("TLB size")
 
 simobj AlphaDTB(AlphaTLB):
+    type = 'AlphaDTB'
     size = 64
 
 simobj AlphaITB(AlphaTLB):
+    type = 'AlphaITB'
     size = 48
index 5c56b80365f08e43628b3ea81bcc2a28c2f9bc0b..35a12e0bffcd977b61da6aebb3265ccdf96eacc2 100644 (file)
@@ -1,4 +1,5 @@
 from Device import PioDevice
 
 simobj BadDevice(PioDevice):
+    type = 'BadDevice'
     devicename = Param.String("Name of device to error on")
index 2aca9120d92e44ddc570d64d0eeaa5e69c94eb03..516509c1ee3f54cb331cb80b33548988b2515f63 100644 (file)
@@ -1,4 +1,5 @@
 simobj BaseCPU(SimObject):
+    type = 'BaseCPU'
     abstract = True
     icache = Param.BaseMem(NULL, "L1 instruction cache object")
     dcache = Param.BaseMem(NULL, "L1 data cache object")
index 5f22a344a416d01ab31679629133dbaad030ab1f..95a7f0b35a409190c34bbb5fd7e7d6de794601aa 100644 (file)
@@ -1,6 +1,7 @@
 from BaseMem import BaseMem
 
 simobj BaseCache(BaseMem):
+    type = 'BaseCache'
     adaptive_compression = Param.Bool(false,
         "Use an adaptive compression scheme")
     assoc = Param.Int("associativity")
index 2a8b983387e64f4950abe572bd49c9bde338bdd4..460bce736c184b910928e12fdacd1ef64532ec08 100644 (file)
@@ -1,4 +1,5 @@
 simobj BaseSystem(SimObject):
+    type = 'BaseSystem'
     abstract = True
     memctrl = Param.MemoryController(Super, "memory controller")
     physmem = Param.PhysicalMemory(Super, "phsyical memory")
index 9e112bfe60d516e491f646acb66fd9ece63940e2..025d69785cfc7eafca9193c1752ed71d2f77dc9f 100644 (file)
@@ -1,5 +1,6 @@
 from BaseHier import BaseHier
 
 simobj Bus(BaseHier):
+    type = 'Bus'
     clock_ratio = Param.Int("ratio of CPU to bus frequency")
     width = Param.Int("bus width in bytes")
index a2518bf39f576ab50b891e634f22f2c3a1d21775..c77348f0a848934efd919fe8651ffad39cc15728 100644 (file)
@@ -1,5 +1,6 @@
 Coherence = Enum('uni', 'msi', 'mesi', 'mosi', 'moesi')
 
 simobj CoherenceProtocol(SimObject):
+    type = 'CoherenceProtocol'
     do_upgrades = Param.Bool(true, "use upgrade transactions?")
     protocol = Param.Coherence("name of coherence protocol")
index babc8aa9dbe0184795796d11260639ef7b80b419..47f8db1cbe790115acbdc4d8b07418b27cbb60fd 100644 (file)
@@ -11,21 +11,23 @@ from FunctionalMemory import FunctionalMemory
 # initialization phase at which point all SimObject pointers will be
 # valid.
 simobj FooPioDevice(FunctionalMemory):
-    abstract = True
     type = 'PioDevice'
+    abstract = True
     addr = Param.Addr("Device Address")
     mmu = Param.MemoryController(Super, "Memory Controller")
     io_bus = Param.Bus(NULL, "The IO Bus to attach to")
     pio_latency = Param.Tick(1, "Programmed IO latency in bus cycles")
 
 simobj FooDmaDevice(FooPioDevice):
-    abstract = True
     type = 'DmaDevice'
+    abstract = True
 
 simobj PioDevice(FooPioDevice):
+    type = 'PioDevice'
     abstract = True
     platform = Param.Platform(Super, "Platform")
 
 simobj DmaDevice(PioDevice):
+    type = 'DmaDevice'
     abstract = True
 
index bea2e56a88649f2b6f3315c2cdecd76a640f2bb1..908805ba0b89eeca8b2a4a28a4c057903974b825 100644 (file)
@@ -1,12 +1,14 @@
 simobj DiskImage(SimObject):
+    type = 'DiskImage'
     abstract = True
     image_file = Param.String("disk image file")
     read_only = Param.Bool(false, "read only image")
 
 simobj RawDiskImage(DiskImage):
-    pass
+    type = 'RawDiskImage'
 
 simobj CowDiskImage(DiskImage):
+    type = 'CowDiskImage'
     child = Param.DiskImage("child image")
     table_size = Param.Int(65536, "initial table size")
     image_file = ''
index 64eab00a384782c8e55a95d1ca947ffc53e28647..f9479a5c24dc1309ae24447adbc444685c5c492b 100644 (file)
@@ -2,10 +2,12 @@ from Device import DmaDevice
 from Pci import PciDevice
 
 simobj EtherInt(SimObject):
+    type = 'EtherInt'
     abstract = True
     peer = Param.EtherInt(NULL, "peer interface")
 
 simobj EtherLink(SimObject):
+    type = 'EtherLink'
     int1 = Param.EtherInt("interface 1")
     int2 = Param.EtherInt("interface 2")
     delay = Param.Tick(0, "transmit delay of packets in us")
@@ -13,20 +15,24 @@ simobj EtherLink(SimObject):
     dump = Param.EtherDump(NULL, "dump object")
 
 simobj EtherBus(SimObject):
+    type = 'EtherBus'
     loopback = Param.Bool(true,
         "send packet back to the interface from which it came")
     dump = Param.EtherDump(NULL, "dump object")
     speed = Param.UInt64(100000000, "bus speed in bits per second")
 
 simobj EtherTap(EtherInt):
+    type = 'EtherTap'
     bufsz = Param.Int(10000, "tap buffer size")
     dump = Param.EtherDump(NULL, "dump object")
     port = Param.UInt16(3500, "tap port")
 
 simobj EtherDump(SimObject):
+    type = 'EtherDump'
     file = Param.String("dump file")
 
 simobj EtherDev(DmaDevice):
+    type = 'EtherDev'
     hardware_address = Param.EthernetAddr(NextEthernetAddr,
         "Ethernet Hardware Address")
 
@@ -47,6 +53,7 @@ simobj EtherDev(DmaDevice):
     tlaser = Param.Turbolaser(Super, "Turbolaser")
 
 simobj NSGigE(PciDevice):
+    type = 'NSGigE'
     hardware_address = Param.EthernetAddr(NextEthernetAddr,
         "Ethernet Hardware Address")
 
@@ -69,9 +76,11 @@ simobj NSGigE(PciDevice):
     physmem = Param.PhysicalMemory(Super, "Physical Memory")
 
 simobj EtherDevInt(EtherInt):
+    type = 'EtherDevInt'
     device = Param.EtherDev("Ethernet device of this interface")
 
 simobj NSGigEInt(EtherInt):
+    type = 'NSGigEInt'
     device = Param.NSGigE("Ethernet device of this interface")
 
 
index 816b33c8c76b4775857cf6f0e13a46ce1d9f24ac..c4aa2aca0522fde06367b3be3b9472f8c22af32c 100644 (file)
@@ -3,10 +3,12 @@ from Pci import PciDevice
 IdeID = Enum('master', 'slave')
 
 simobj IdeDisk(SimObject):
+    type = 'IdeDisk'
     delay = Param.Tick(1, "Fixed disk delay in microseconds")
     driveID = Param.IdeID('master', "Drive ID")
     image = Param.DiskImage("Disk image")
     physmem = Param.PhysicalMemory(Super, "Physical memory")
 
 simobj IdeController(PciDevice):
+    type = 'IdeController'
     disks = VectorParam.IdeDisk("IDE disks attached to this controller")
index 7c97746ff7ef3e0c0990db18280c771176510a25..1ef5a17ee3d999f14771ba4029fb92a7f42fa65d 100644 (file)
@@ -1,2 +1,3 @@
 simobj IntrControl(SimObject):
+    type = 'IntrControl'
     cpu = Param.BaseCPU(Super, "the cpu")
index 49319e1638c5990b1313d7315836059edb2b3045..1ec33a30c542fcd2f9b65e70ab06eccf77f65fe3 100644 (file)
@@ -1,4 +1,5 @@
 simobj MemTest(SimObject):
+    type = 'MemTest'
     cache = Param.BaseCache("L1 cache")
     check_mem = Param.FunctionalMemory("check memory")
     main_mem = Param.FunctionalMemory("hierarchical memory")
index a7763139f359d2ad0446ed9de69428a11f3086b8..caa3c52ff9cc96f1d93760299791a0c67087f24f 100644 (file)
@@ -1,6 +1,7 @@
 from Device import FooPioDevice, DmaDevice
 
 simobj PciConfigData(FooPioDevice):
+    type = 'PciConfigData'
     addr = 0xffffffffffffffffL
     VendorID = Param.UInt16("Vendor ID")
     DeviceID = Param.UInt16("Device ID")
@@ -38,9 +39,10 @@ simobj PciConfigData(FooPioDevice):
     MinimumGrant = Param.UInt8(0x00, "Minimum Grant")
 
 simobj PciConfigAll(FooPioDevice):
-    pass
+    type = 'PciConfigAll'
 
 simobj PciDevice(DmaDevice):
+    type = 'PciDevice'
     abstract = True
     pci_bus = Param.Int("PCI bus")
     pci_dev = Param.Int("PCI device number")
index 9644c503afcc9e9b8f6a2af788344c1356dcb796..d1e4ad4b401942cccac1f7d93d2fc88c44ec2a12 100644 (file)
@@ -1,6 +1,7 @@
 from FunctionalMemory import FunctionalMemory
 
 simobj PhysicalMemory(FunctionalMemory):
+    type = 'PhysicalMemory'
     range = Param.AddrRange("Device Address")
     file = Param.String('', "memory mapped file")
     mmu = Param.MemoryController(Super, "Memory Controller")
index 87002625904666479ff24e1282debff3b1398079..d0510eaf873c0ce68d770e298271a30516ae6754 100644 (file)
@@ -1,4 +1,5 @@
 simobj Platform(SimObject):
+    type = 'Platform'
     abstract = True
     interrupt_frequency = Param.Tick(1200, "frequency of interrupts")
     intrctrl = Param.IntrControl(Super, "interrupt controller")
index 4f5c4a67467cc9430f20e97139a0ab642d799f2a..6a91c09c2db0faabd1ea54090d9d4438be699209 100644 (file)
@@ -1,12 +1,15 @@
 simobj Process(SimObject):
+    type = 'Process'
     abstract = True
     output = Param.String('cout', 'filename for stdout/stderr')
 
 simobj LiveProcess(Process):
+    type = 'LiveProcess'
     cmd = VectorParam.String("command line (executable plus arguments)")
     env = VectorParam.String('', "environment settings")
     input = Param.String('cin', "filename for stdin")
 
 simobj EioProcess(Process):
+    type = 'EioProcess'
     chkpt = Param.String('', "EIO checkpoint file name (optional)")
     file = Param.String("EIO trace file name")
index 87e7bfb7d70710a2bb9369c2a656b927715c7b5f..fff5a2a0233ce893630db1c3ea9703e801f4ed5a 100644 (file)
@@ -1,7 +1,9 @@
 simobj Repl(SimObject):
+    type = 'Repl'
     abstract = True
 
 simobj GenRepl(Repl):
+    type = 'GenRepl'
     fresh_res = Param.Int("associativity")
     num_pools = Param.Int("capacity in bytes")
     pool_res = Param.Int("block size in bytes")
index b1277168921504d63a67525cd9a4acabf98a23c6..5806ec8260726a615c2aae09081488427016d00c 100644 (file)
@@ -1,5 +1,6 @@
 from HierParams import HierParams
 simobj Root(SimObject):
+    type = 'Root'
     frequency = Param.Tick(200000000, "tick frequency")
     output_dir = Param.String('.', "directory to output data to")
     output_file = Param.String('cout', "file to dump simulator output to")
index 0676738f9a779687b38b09ff587ead1a3c29691b..1231e81dc3596f1bb6758435ab89edb96405ca10 100644 (file)
@@ -1,9 +1,11 @@
 simobj ConsoleListener(SimObject):
+    type = 'ConsoleListener'
     port = Param.UInt16(3456, "listen port")
 
 simobj SimConsole(SimObject):
+    type = 'SimConsole'
     append_name = Param.Bool(true, "append name() to filename")
     intr_control = Param.IntrControl(Super, "interrupt controller")
     listener = Param.ConsoleListener("console listener")
     number = Param.Int(0, "console number")
-    output = Param.String("", "file to dump output to")
+    output = Param.String('', "file to dump output to")
index 46bbdb8fd70f3116f167cae69b1ce61a9294398f..c4dd5435bf3e5ee92f1b983667d04547078315f0 100644 (file)
@@ -1,3 +1,4 @@
 simobj SimpleDisk(SimObject):
+    type = 'SimpleDisk'
     disk = Param.DiskImage("Disk Image")
     physmem = Param.PhysicalMemory(Super, "Physical Memory")
index 6f9555d499631a129653838665e5ea1da58d49a1..cfe23977e040c593ddade959ad9e3c55d970543e 100644 (file)
@@ -2,20 +2,24 @@ from Device import FooPioDevice
 from Platform import Platform
 
 simobj Tsunami(Platform):
+    type = 'Tsunami'
     pciconfig = Param.PciConfigAll("PCI configuration")
     system = Param.BaseSystem(Super, "system")
     interrupt_frequency = Param.Int(1024, "frequency of interrupts")
 
 simobj TsunamiCChip(FooPioDevice):
+    type = 'TsunamiCChip'
     tsunami = Param.Tsunami(Super, "Tsunami")
 
 simobj TsunamiFake(FooPioDevice):
-    pass
+    type = 'TsunamiFake'
 
 simobj TsunamiIO(FooPioDevice):
+    type = 'TsunamiIO'
     time = Param.UInt64(1136073600,
         "System time to use (0 for actual time, default is 1/1/06)")
     tsunami = Param.Tsunami(Super, "Tsunami")
 
 simobj TsunamiPChip(FooPioDevice):
+    type = 'TsunamiPChip'
     tsunami = Param.Tsunami(Super, "Tsunami")
index a54e19dcd97a85e3f7dd47c7de7e206c782c9d51..76ee8805f8569ae30f8f4fbdbb7cc74044de5713 100644 (file)
@@ -1,5 +1,6 @@
 from Device import PioDevice
 
 simobj Uart(PioDevice):
+    type = 'Uart'
     console = Param.SimConsole(Super, "The console")
     size = Param.Addr(0x8, "Device size")
index 127b0efae3c7990f713ad00b001be3492c185cc3..5708ac9a86a0010ccda0b7d3cdc92cb7af090bfa 100644 (file)
 
 import os, os.path, re
 
-def WriteEmbeddedPyFile(target, source, path, name, ext):
+def WriteEmbeddedPyFile(target, source, path, name, ext, filename):
     if isinstance(source, str):
         source = file(source, 'r')
 
     if isinstance(target, str):
         target = file(target, 'w')
 
-    print >>target, "AddModule(%s, %s, %s, '''\\" % (`path`, `name`, `ext`)
+    print >>target, "AddModule(%s, %s, %s, %s, '''\\" % \
+          (`path`, `name`, `ext`, `filename`)
 
     for line in source:
         line = line
@@ -105,7 +106,7 @@ def MakeEmbeddedPyFile(target, source, env):
         name,ext = pyfile.split('.')
         if name == '__init__':
             node['.hasinit'] = True
-        node[pyfile] = (src,name,ext)
+        node[pyfile] = (src,name,ext,src)
 
     done = False
     while not done:
@@ -136,12 +137,12 @@ def MakeEmbeddedPyFile(target, source, env):
                     raise NameError, 'package directory missing __init__.py'
                 populate(entry, path + [ name ])
             else:
-                pyfile,name,ext = entry
-                files.append((pyfile, path, name, ext))
+                pyfile,name,ext,filename = entry
+                files.append((pyfile, path, name, ext, filename))
     populate(tree)
 
-    for pyfile, path, name, ext in files:
-        WriteEmbeddedPyFile(target, pyfile, path, name, ext)
+    for pyfile, path, name, ext, filename in files:
+        WriteEmbeddedPyFile(target, pyfile, path, name, ext, filename)
 
 CFileCounter = 0
 def MakePythonCFile(target, source, env):
index 4c5fc3bf9f8b9c7d37ef56d86f97a29a50dbc245..5ba7542a0455a27cdeda430954591f9cb48d5407 100644 (file)
@@ -221,6 +221,10 @@ def isParamContext(value):
         return False
 
 
+class_decorator = '_M5M5_SIMOBJECT_'
+expr_decorator = '_M5M5_EXPRESSION_'
+dot_decorator = '_M5M5_DOT_'
+
 # The metaclass for ConfigNode (and thus for everything that derives
 # from ConfigNode, including SimObject).  This class controls how new
 # classes that derive from ConfigNode are instantiated, and provides
@@ -230,7 +234,6 @@ def isParamContext(value):
 class MetaConfigNode(type):
     keywords = { 'abstract' : types.BooleanType,
                  'check' : types.FunctionType,
-                 '_init' : types.FunctionType,
                  'type' : (types.NoneType, types.StringType) }
 
     # __new__ is called before __init__, and is where the statements
@@ -246,6 +249,11 @@ class MetaConfigNode(type):
                  '_disable' : {} }
 
         for key,val in dict.items():
+            del dict[key]
+
+            if key.startswith(expr_decorator):
+                key = key[len(expr_decorator):]
+
             if mcls.keywords.has_key(key):
                 if not isinstance(val, mcls.keywords[key]):
                     raise TypeError, \
@@ -255,11 +263,9 @@ class MetaConfigNode(type):
                 if isinstance(val, types.FunctionType):
                     val = classmethod(val)
                 priv[key] = val
-                del dict[key]
 
             elif key.startswith('_'):
                 priv[key] = val
-                del dict[key]
 
             elif not isNullPointer(val) and isConfigNode(val):
                 dict[key] = val()
@@ -267,19 +273,22 @@ class MetaConfigNode(type):
             elif isSimObjSequence(val):
                 dict[key] = [ v() for v in val ]
 
+            else:
+                dict[key] = val
+
         # If your parent has a value in it that's a config node, clone it.
         for base in bases:
             if not isConfigNode(base):
                 continue
 
-            for name,value in base._values.iteritems():
-                if dict.has_key(name):
+            for key,value in base._values.iteritems():
+                if dict.has_key(key):
                     continue
 
                 if isConfigNode(value):
-                    priv['_values'][name] = value()
+                    priv['_values'][key] = value()
                 elif isSimObjSequence(value):
-                    priv['_values'][name] = [ val() for val in value ]
+                    priv['_values'][key] = [ val() for val in value ]
 
         # entries left in dict will get passed to __init__, where we'll
         # deal with them as params.
@@ -293,12 +302,12 @@ class MetaConfigNode(type):
         cls._bases = [c for c in cls.__mro__ if isConfigNode(c)]
 
         # initialize attributes with values from class definition
-        for pname,value in dict.iteritems():
-            setattr(cls, pname, value)
-
-        if hasattr(cls, '_init'):
-            cls._init()
-            del cls._init
+        for key,value in dict.iteritems():
+            key = key.split(dot_decorator)
+            c = cls
+            for item in key[:-1]:
+                c = getattr(c, item)
+            setattr(c, key[-1], value)
 
     def _isvalue(cls, name):
         for c in cls._bases:
@@ -390,7 +399,6 @@ class MetaConfigNode(type):
         raise AttributeError, \
               "object '%s' has no attribute '%s'" % (cls.__name__, cls)
 
-
     # Set attribute (called on foo.attr = value when foo is an
     # instance of class cls).
     def __setattr__(cls, attr, value):
index e96d7069c8ee3418489e1176d4c4d46300a0d56f..db1a7a5b095c48bc246d862387453b4eccd1acd8 100644 (file)
@@ -31,7 +31,7 @@ sys.path.append('..')
 sys.path.append('../configs/kernel')
 sys.path.append('../sim/pyconfig')
 
-from importer import mpy_exec, AddToPath
+from importer import mpy_exec, mpy_execfile, AddToPath
 from m5config import *
 
 try:
@@ -51,7 +51,7 @@ except getopt.GetoptError:
 
 for arg in args:
     AddToPath(os.path.dirname(arg))
-    mpy_exec(file(arg, 'r'), globals())
+    mpy_execfile(arg)
 
 if globals().has_key('root') and isinstance(root, type) \
        and issubclass(root, Root):