AddrRange: Simplify AddrRange params Python hierarchy
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 19 Sep 2012 10:15:41 +0000 (06:15 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 19 Sep 2012 10:15:41 +0000 (06:15 -0400)
This patch simplifies the Range object hierarchy in preparation for an
address range class that also allows striping (e.g. selecting a few
bits as matching in addition to the range).

To extend the AddrRange class to an AddrRegion, the first step is to
simplify the hierarchy such that we can make it as lean as possible
before adding the new functionality. The only class using Range and
MetaRange is AddrRange, and the three classes are now collapsed into
one.

configs/common/FSConfig.py
configs/ruby/MESI_CMP_directory.py
configs/ruby/MI_example.py
configs/ruby/MOESI_CMP_directory.py
configs/ruby/MOESI_CMP_token.py
configs/ruby/MOESI_hammer.py
configs/ruby/Network_test.py
configs/ruby/Ruby.py
src/python/m5/params.py

index 0515fc53acd1722db849b3df0985cd42f7adfd3b..657b9bcaaa0a2ee319a6ace801a1b55006328de1 100644 (file)
@@ -519,7 +519,9 @@ def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None, Ruby = False):
 
     # We assume below that there's at least 1MB of memory. We'll require 2
     # just to avoid corner cases.
-    assert(self.physmem.range.second.getValue() >= 0x200000)
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            self.memories.unproxy(self)))
+    assert(phys_mem_size >= 0x200000)
 
     self.e820_table.entries = \
        [
@@ -527,7 +529,7 @@ def makeLinuxX86System(mem_mode, numCPUs = 1, mdesc = None, Ruby = False):
         X86E820Entry(addr = 0, size = '1MB', range_type = 2),
         # Mark the rest as available
         X86E820Entry(addr = 0x100000,
-                size = '%dB' % (self.physmem.range.second - 0x100000 + 1),
+                size = '%dB' % (phys_mem_size - 0x100000),
                 range_type = 1)
         ]
 
index 017fe3a4a93d70aac9523d0a7619478f6c1806ff..35f8575342c6f732f574aed746663477bad1f432 100644 (file)
@@ -133,10 +133,9 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
         l2_cntrl_nodes.append(l2_cntrl)
         
         cntrl_count += 1
-        
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     for i in xrange(options.num_dirs):
index 85544837d108684737431b2ea2d641bc91d05178..316251ff0bcf33fe74381cec91b0c8b2e7209eaf 100644 (file)
@@ -105,9 +105,8 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
 
         cntrl_count += 1
 
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     for i in xrange(options.num_dirs):
index b238b767509bdefcba80ef6deef2df2bb5dd9fca..dbe81497782f5b9fffd9df7b693e7320343b47e7 100644 (file)
@@ -132,10 +132,9 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
         l2_cntrl_nodes.append(l2_cntrl)
 
         cntrl_count += 1
-        
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     for i in xrange(options.num_dirs):
index 466f9bb8c8c91e39c5ffcb55b531f5a917deb120..5036a5bb2a4195763ff3817590ae0829845429b4 100644 (file)
@@ -155,10 +155,9 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
         l2_cntrl_nodes.append(l2_cntrl)
 
         cntrl_count += 1
-        
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     for i in xrange(options.num_dirs):
index 56fe05298f66222be4eba3d4ba93bebb9e9f497c..434f5c8db8c71776c00e61c126b38e59af4524e7 100644 (file)
@@ -131,9 +131,8 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
 
         cntrl_count += 1
 
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     #
index c4dd97e8da63baf631cdeb2b609670d5acee13f2..df2631cd4d67f3fbbb3d780850678e39a15e4612 100644 (file)
@@ -106,9 +106,8 @@ def create_system(options, system, piobus, dma_ports, ruby_system):
 
         cntrl_count += 1
 
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     mem_module_size = phys_mem_size / options.num_dirs
 
     for i in xrange(options.num_dirs):
index ba6f3e7fa0048e66054904c71b1eb64281d0143f..a8fc94d3db9ff73c54176af9c0e7dfc17db0b106 100644 (file)
@@ -188,9 +188,8 @@ def create_system(options, system, piobus = None, dma_ports = []):
         total_mem_size.value += dir_cntrl.directory.size.value
         dir_cntrl.directory.numa_high_bit = numa_bit
 
-    phys_mem_size = 0
-    for mem in system.memories.unproxy(system):
-        phys_mem_size += long(mem.range.second) - long(mem.range.first) + 1
+    phys_mem_size = sum(map(lambda mem: mem.range.size(),
+                            system.memories.unproxy(system)))
     assert(total_mem_size.value == phys_mem_size)
 
     ruby_profiler = RubyProfiler(ruby_system = ruby,
index c2da6171e5c7ce6c396dcd7bca685c0f0be6cf43..46c3d028c5447fdaeb53f5ff0f335834a3eeccd8 100644 (file)
@@ -549,86 +549,64 @@ class Addr(CheckedInt):
         else:
             return self.value + other
 
+class AddrRange(ParamValue):
+    cxx_type = 'Range<Addr>'
 
-class MetaRange(MetaParamValue):
-    def __init__(cls, name, bases, dict):
-        super(MetaRange, cls).__init__(name, bases, dict)
-        if name == 'Range':
-            return
-        cls.cxx_type = 'Range< %s >' % cls.type.cxx_type
-
-class Range(ParamValue):
-    __metaclass__ = MetaRange
-    type = Int # default; can be overridden in subclasses
     def __init__(self, *args, **kwargs):
         def handle_kwargs(self, kwargs):
             if 'end' in kwargs:
-                self.second = self.type(kwargs.pop('end'))
+                self.end = Addr(kwargs.pop('end'))
             elif 'size' in kwargs:
-                self.second = self.first + self.type(kwargs.pop('size')) - 1
+                self.end = self.start + Addr(kwargs.pop('size')) - 1
             else:
                 raise TypeError, "Either end or size must be specified"
 
         if len(args) == 0:
-            self.first = self.type(kwargs.pop('start'))
+            self.start = Addr(kwargs.pop('start'))
             handle_kwargs(self, kwargs)
 
         elif len(args) == 1:
             if kwargs:
-                self.first = self.type(args[0])
+                self.start = Addr(args[0])
                 handle_kwargs(self, kwargs)
-            elif isinstance(args[0], Range):
-                self.first = self.type(args[0].first)
-                self.second = self.type(args[0].second)
             elif isinstance(args[0], (list, tuple)):
-                self.first = self.type(args[0][0])
-                self.second = self.type(args[0][1])
+                self.start = Addr(args[0][0])
+                self.end = Addr(args[0][1])
             else:
-                self.first = self.type(0)
-                self.second = self.type(args[0]) - 1
+                self.start = Addr(0)
+                self.end = Addr(args[0]) - 1
 
         elif len(args) == 2:
-            self.first = self.type(args[0])
-            self.second = self.type(args[1])
+            self.start = Addr(args[0])
+            self.end = Addr(args[1])
         else:
             raise TypeError, "Too many arguments specified"
 
         if kwargs:
-            raise TypeError, "too many keywords: %s" % kwargs.keys()
+            raise TypeError, "Too many keywords: %s" % kwargs.keys()
 
     def __str__(self):
-        return '%s:%s' % (self.first, self.second)
+        return '%s:%s' % (self.start, self.end)
+
+    def size(self):
+        return long(self.end) - long(self.start) + 1
 
     @classmethod
     def cxx_predecls(cls, code):
-        cls.type.cxx_predecls(code)
+        Addr.cxx_predecls(code)
         code('#include "base/range.hh"')
 
     @classmethod
     def swig_predecls(cls, code):
-        cls.type.swig_predecls(code)
+        Addr.swig_predecls(code)
         code('%import "python/swig/range.i"')
 
-class AddrRange(Range):
-    type = Addr
-
     def getValue(self):
         from m5.internal.range import AddrRange
 
         value = AddrRange()
-        value.start = long(self.first)
-        value.end = long(self.second)
-        return value
-
-class TickRange(Range):
-    type = Tick
-
-    def getValue(self):
-        from m5.internal.range import TickRange
-
-        value = TickRange()
-        value.start = long(self.first)
-        value.end = long(self.second)
+        value.start = long(self.start)
+        value.end = long(self.end)
         return value
 
 # Boolean parameter type.  Python doesn't let you subclass bool, since
@@ -1643,7 +1621,7 @@ __all__ = ['Param', 'VectorParam',
            'MemorySize', 'MemorySize32',
            'Latency', 'Frequency', 'Clock',
            'NetworkBandwidth', 'MemoryBandwidth',
-           'Range', 'AddrRange', 'TickRange',
+           'AddrRange',
            'MaxAddr', 'MaxTick', 'AllMemory',
            'Time',
            'NextEthernetAddr', 'NULL',