python: Make exception handling Python 3 safe

Change-Id: I9c2cdfad20deb1ddfa224320cf93f2105d126652
Reviewed-on: https://gem5-review.googlesource.com/c/15980
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
diff --git a/src/python/importer.py b/src/python/importer.py
index fa26080..60b9b35 100644
--- a/src/python/importer.py
+++ b/src/python/importer.py
@@ -35,7 +35,7 @@
 
     def add_module(self, filename, abspath, modpath, code):
         if modpath in self.modules:
-            raise AttributeError, "%s already found in importer" % modpath
+            raise AttributeError("%s already found in importer" % modpath)
 
         self.modules[modpath] = (filename, abspath, code)
 
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index 44f26ea..97cf6d0 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -483,8 +483,8 @@
             if isinstance(c, MetaSimObject):
                 bTotal += 1
             if bTotal > 1:
-                raise TypeError, \
-                      "SimObjects do not support multiple inheritance"
+                raise TypeError(
+                      "SimObjects do not support multiple inheritance")
 
         base = bases[0]
 
@@ -543,8 +543,8 @@
 
     def _set_keyword(cls, keyword, val, kwtype):
         if not isinstance(val, kwtype):
-            raise TypeError, 'keyword %s has bad type %s (expecting %s)' % \
-                  (keyword, type(val), kwtype)
+            raise TypeError('keyword %s has bad type %s (expecting %s)' % \
+                  (keyword, type(val), kwtype))
         if isinstance(val, FunctionType):
             val = classmethod(val)
         type.__setattr__(cls, keyword, val)
@@ -562,7 +562,7 @@
         try:
             hr_value = value
             value = param.convert(value)
-        except Exception, e:
+        except Exception as e:
             msg = "%s\nError setting param %s.%s to %s\n" % \
                   (e, cls.__name__, name, value)
             e.args = (msg, )
@@ -622,10 +622,10 @@
             return
 
         if isSimObjectOrSequence(value) and cls._instantiated:
-            raise RuntimeError, \
+            raise RuntimeError(
                   "cannot set SimObject parameter '%s' after\n" \
                   "    class %s has been instantiated or subclassed" \
-                  % (attr, cls.__name__)
+                  % (attr, cls.__name__))
 
         # check for param
         param = cls._params.get(attr)
@@ -639,8 +639,8 @@
             return
 
         # no valid assignment... raise exception
-        raise AttributeError, \
-              "Class %s has no parameter \'%s\'" % (cls.__name__, attr)
+        raise AttributeError(
+              "Class %s has no parameter \'%s\'" % (cls.__name__, attr))
 
     def __getattr__(cls, attr):
         if attr == 'cxx_class_path':
@@ -658,8 +658,8 @@
         if cls._children.has_key(attr):
             return cls._children[attr]
 
-        raise AttributeError, \
-              "object '%s' has no attribute '%s'" % (cls.__name__, attr)
+        raise AttributeError(
+              "object '%s' has no attribute '%s'" % (cls.__name__, attr))
 
     def __str__(cls):
         return cls.__name__
@@ -1152,9 +1152,9 @@
             # no memo_dict: must be top-level clone operation.
             # this is only allowed at the root of a hierarchy
             if self._parent:
-                raise RuntimeError, "attempt to clone object %s " \
+                raise RuntimeError("attempt to clone object %s " \
                       "not at the root of a tree (parent = %s)" \
-                      % (self, self._parent)
+                      % (self, self._parent))
             # create a new dict and use that.
             memo_dict = {}
             kwargs['_memo'] = memo_dict
@@ -1196,7 +1196,7 @@
             err_string += "\n  (C++ object is not yet constructed," \
                           " so wrapped C++ methods are unavailable.)"
 
-        raise AttributeError, err_string
+        raise AttributeError(err_string)
 
     # Set attribute (called on foo.attr = value when foo is an
     # instance of class cls).
@@ -1216,7 +1216,7 @@
             try:
                 hr_value = value
                 value = param.convert(value)
-            except Exception, e:
+            except Exception as e:
                 msg = "%s\nError setting param %s.%s to %s\n" % \
                       (e, self.__class__.__name__, attr, value)
                 e.args = (msg, )
@@ -1240,8 +1240,8 @@
             return
 
         # no valid assignment... raise exception
-        raise AttributeError, "Class %s has no parameter %s" \
-              % (self.__class__.__name__, attr)
+        raise AttributeError("Class %s has no parameter %s" \
+              % (self.__class__.__name__, attr))
 
 
     # this hack allows tacking a '[0]' onto parameters that may or may
@@ -1249,7 +1249,7 @@
     def __getitem__(self, key):
         if key == 0:
             return self
-        raise IndexError, "Non-zero index '%s' to SimObject" % key
+        raise IndexError("Non-zero index '%s' to SimObject" % key)
 
     # this hack allows us to iterate over a SimObject that may
     # not be a vector, so we can call a loop over it and get just one
@@ -1352,18 +1352,18 @@
 
             if isinstance(child, ptype) and not visited:
                 if found_obj != None and child != found_obj:
-                    raise AttributeError, \
+                    raise AttributeError(
                           'parent.any matched more than one: %s %s' % \
-                          (found_obj.path, child.path)
+                          (found_obj.path, child.path))
                 found_obj = child
         # search param space
         for pname,pdesc in self._params.iteritems():
             if issubclass(pdesc.ptype, ptype):
                 match_obj = self._values[pname]
                 if found_obj != None and found_obj != match_obj:
-                    raise AttributeError, \
+                    raise AttributeError(
                           'parent.any matched more than one: %s and %s' % \
-                          (found_obj.path, match_obj.path)
+                          (found_obj.path, match_obj.path))
                 found_obj = match_obj
         return found_obj, found_obj != None
 
@@ -1533,7 +1533,7 @@
         if not self._ccObject:
             # Make sure this object is in the configuration hierarchy
             if not self._parent and not isRoot(self):
-                raise RuntimeError, "Attempt to instantiate orphan node"
+                raise RuntimeError("Attempt to instantiate orphan node")
             # Cycles in the configuration hierarchy are not supported. This
             # will catch the resulting recursion and stop.
             self._ccObject = -1
@@ -1541,8 +1541,8 @@
                 params = self.getCCParams()
                 self._ccObject = params.create()
         elif self._ccObject == -1:
-            raise RuntimeError, "%s: Cycle found in configuration hierarchy." \
-                  % self.path()
+            raise RuntimeError("%s: Cycle found in configuration hierarchy." \
+                  % self.path())
         return self._ccObject
 
     def descendants(self):
@@ -1650,7 +1650,7 @@
 def coerceSimObjectOrVector(value):
     value = tryAsSimObjectOrVector(value)
     if value is None:
-        raise TypeError, "SimObject or SimObjectVector expected"
+        raise TypeError("SimObject or SimObjectVector expected")
     return value
 
 baseClasses = allClasses.copy()
diff --git a/src/python/m5/main.py b/src/python/m5/main.py
index 9d46d43..d8c0d92 100644
--- a/src/python/m5/main.py
+++ b/src/python/m5/main.py
@@ -209,7 +209,7 @@
     elif len(args) == 2:
         options, arguments = args
     else:
-        raise TypeError, "main() takes 0 or 2 arguments (%d given)" % len(args)
+        raise TypeError("main() takes 0 or 2 arguments (%d given)" % len(args))
 
     m5.options = options
 
diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index 854c8e3..0a563b8 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -155,7 +155,7 @@
                 self.default = args[0]
                 self.desc = args[1]
             else:
-                raise TypeError, 'too many arguments'
+                raise TypeError('too many arguments')
 
         if kwargs.has_key('desc'):
             assert(not hasattr(self, 'desc'))
@@ -168,10 +168,10 @@
             del kwargs['default']
 
         if kwargs:
-            raise TypeError, 'extra unknown kwargs %s' % kwargs
+            raise TypeError('extra unknown kwargs %s' % kwargs)
 
         if not hasattr(self, 'desc'):
-            raise TypeError, 'desc attribute missing'
+            raise TypeError('desc attribute missing')
 
     def __getattr__(self, attr):
         if attr == 'ptype':
@@ -180,8 +180,8 @@
             self.ptype = ptype
             return ptype
 
-        raise AttributeError, "'%s' object has no attribute '%s'" % \
-              (type(self).__name__, attr)
+        raise AttributeError("'%s' object has no attribute '%s'" % \
+              (type(self).__name__, attr))
 
     def example_str(self):
         if hasattr(self.ptype, "ex_str"):
@@ -234,8 +234,8 @@
 class VectorParamValue(list):
     __metaclass__ = MetaParamValue
     def __setattr__(self, attr, value):
-        raise AttributeError, \
-              "Not allowed to set %s on '%s'" % (attr, type(self).__name__)
+        raise AttributeError("Not allowed to set %s on '%s'" % \
+                             (attr, type(self).__name__))
 
     def config_value(self):
         return [v.config_value() for v in self]
@@ -539,8 +539,8 @@
 
     def _check(self):
         if not self.min <= self.value <= self.max:
-            raise TypeError, 'Integer param out of bounds %d < %d < %d' % \
-                  (self.min, self.value, self.max)
+            raise TypeError('Integer param out of bounds %d < %d < %d' % \
+                  (self.min, self.value, self.max))
 
     def __init__(self, value):
         if isinstance(value, str):
@@ -548,8 +548,8 @@
         elif isinstance(value, (int, long, float, NumericParamValue)):
             self.value = long(value)
         else:
-            raise TypeError, "Can't convert object of type %s to CheckedInt" \
-                  % type(value).__name__
+            raise TypeError("Can't convert object of type %s to CheckedInt" \
+                  % type(value).__name__)
         self._check()
 
     def __call__(self, value):
@@ -614,8 +614,8 @@
         if isinstance(value, (int, long, float, NumericParamValue, Float, str)):
             self.value = float(value)
         else:
-            raise TypeError, "Can't convert object of type %s to Float" \
-                  % type(value).__name__
+            raise TypeError("Can't convert object of type %s to Float" \
+                  % type(value).__name__)
 
     def __call__(self, value):
         self.__init__(value)
@@ -711,7 +711,7 @@
             elif 'size' in kwargs:
                 self.end = self.start + Addr(kwargs.pop('size')) - 1
             else:
-                raise TypeError, "Either end or size must be specified"
+                raise TypeError("Either end or size must be specified")
 
             # Now on to the optional bit
             if 'intlvHighBit' in kwargs:
@@ -742,10 +742,10 @@
             self.start = Addr(args[0])
             self.end = Addr(args[1])
         else:
-            raise TypeError, "Too many arguments specified"
+            raise TypeError("Too many arguments specified")
 
         if kwargs:
-            raise TypeError, "Too many keywords: %s" % kwargs.keys()
+            raise TypeError("Too many keywords: %s" % list(kwargs.keys()))
 
     def __str__(self):
         return '%s:%s:%s:%s:%s:%s' \
@@ -885,15 +885,15 @@
             return
 
         if not isinstance(value, str):
-            raise TypeError, "expected an ethernet address and didn't get one"
+            raise TypeError("expected an ethernet address and didn't get one")
 
         bytes = value.split(':')
         if len(bytes) != 6:
-            raise TypeError, 'invalid ethernet address %s' % value
+            raise TypeError('invalid ethernet address %s' % value)
 
         for byte in bytes:
             if not 0 <= int(byte, base=16) <= 0xff:
-                raise TypeError, 'invalid ethernet address %s' % value
+                raise TypeError('invalid ethernet address %s' % value)
 
         self.value = value
 
@@ -966,7 +966,7 @@
 
     def verifyIp(self):
         if self.ip < 0 or self.ip >= (1 << 32):
-            raise TypeError, "invalid ip address %#08x" % self.ip
+            raise TypeError("invalid ip address %#08x" % self.ip)
 
     def getValue(self):
         from _m5.net import IpAddress
@@ -991,7 +991,7 @@
             elif elseVal:
                 setattr(self, key, elseVal)
             else:
-                raise TypeError, "No value set for %s" % key
+                raise TypeError("No value set for %s" % key)
 
         if len(args) == 0:
             handle_kwarg(self, kwargs, 'ip')
@@ -1000,7 +1000,7 @@
         elif len(args) == 1:
             if kwargs:
                 if not 'ip' in kwargs and not 'netmask' in kwargs:
-                    raise TypeError, "Invalid arguments"
+                    raise TypeError("Invalid arguments")
                 handle_kwarg(self, kwargs, 'ip', args[0])
                 handle_kwarg(self, kwargs, 'netmask', args[0])
             elif isinstance(args[0], IpNetmask):
@@ -1013,10 +1013,10 @@
             self.ip = args[0]
             self.netmask = args[1]
         else:
-            raise TypeError, "Too many arguments specified"
+            raise TypeError("Too many arguments specified")
 
         if kwargs:
-            raise TypeError, "Too many keywords: %s" % kwargs.keys()
+            raise TypeError("Too many keywords: %s" % list(kwargs.keys()))
 
         self.verify()
 
@@ -1041,7 +1041,7 @@
     def verify(self):
         self.verifyIp()
         if self.netmask < 0 or self.netmask > 32:
-            raise TypeError, "invalid netmask %d" % netmask
+            raise TypeError("invalid netmask %d" % netmask)
 
     def getValue(self):
         from _m5.net import IpNetmask
@@ -1065,7 +1065,7 @@
             elif elseVal:
                 setattr(self, key, elseVal)
             else:
-                raise TypeError, "No value set for %s" % key
+                raise TypeError("No value set for %s" % key)
 
         if len(args) == 0:
             handle_kwarg(self, kwargs, 'ip')
@@ -1074,7 +1074,7 @@
         elif len(args) == 1:
             if kwargs:
                 if not 'ip' in kwargs and not 'port' in kwargs:
-                    raise TypeError, "Invalid arguments"
+                    raise TypeError("Invalid arguments")
                 handle_kwarg(self, kwargs, 'ip', args[0])
                 handle_kwarg(self, kwargs, 'port', args[0])
             elif isinstance(args[0], IpWithPort):
@@ -1087,10 +1087,10 @@
             self.ip = args[0]
             self.port = args[1]
         else:
-            raise TypeError, "Too many arguments specified"
+            raise TypeError("Too many arguments specified")
 
         if kwargs:
-            raise TypeError, "Too many keywords: %s" % kwargs.keys()
+            raise TypeError("Too many keywords: %s" % list(kwargs.keys()))
 
         self.verify()
 
@@ -1115,7 +1115,7 @@
     def verify(self):
         self.verifyIp()
         if self.port < 0 or self.port > 0xffff:
-            raise TypeError, "invalid port %d" % self.port
+            raise TypeError("invalid port %d" % self.port)
 
     def getValue(self):
         from _m5.net import IpWithPort
@@ -1157,7 +1157,7 @@
             except ValueError:
                 pass
 
-    raise ValueError, "Could not parse '%s' as a time" % value
+    raise ValueError("Could not parse '%s' as a time" % value)
 
 class Time(ParamValue):
     cxx_type = 'tm'
@@ -1226,22 +1226,22 @@
     def __init__(cls, name, bases, init_dict):
         if init_dict.has_key('map'):
             if not isinstance(cls.map, dict):
-                raise TypeError, "Enum-derived class attribute 'map' " \
-                      "must be of type dict"
+                raise TypeError("Enum-derived class attribute 'map' " \
+                      "must be of type dict")
             # build list of value strings from map
             cls.vals = cls.map.keys()
             cls.vals.sort()
         elif init_dict.has_key('vals'):
             if not isinstance(cls.vals, list):
-                raise TypeError, "Enum-derived class attribute 'vals' " \
-                      "must be of type list"
+                raise TypeError("Enum-derived class attribute 'vals' " \
+                      "must be of type list")
             # build string->value map from vals sequence
             cls.map = {}
             for idx,val in enumerate(cls.vals):
                 cls.map[val] = idx
         else:
-            raise TypeError, "Enum-derived class must define "\
-                  "attribute 'map' or 'vals'"
+            raise TypeError("Enum-derived class must define "\
+                  "attribute 'map' or 'vals'")
 
         if cls.is_class:
             cls.cxx_type = '%s' % name
@@ -1385,8 +1385,8 @@
 
     def __init__(self, value):
         if value not in self.map:
-            raise TypeError, "Enum param got bad value '%s' (not in %s)" \
-                  % (value, self.vals)
+            raise TypeError("Enum param got bad value '%s' (not in %s)" \
+                  % (value, self.vals))
         self.value = value
 
     def __call__(self, value):
@@ -1491,7 +1491,7 @@
             return self
         if attr == 'frequency':
             return Frequency(self)
-        raise AttributeError, "Latency object has no attribute '%s'" % attr
+        raise AttributeError("Latency object has no attribute '%s'" % attr)
 
     def getValue(self):
         if self.ticks or self.value == 0:
@@ -1533,7 +1533,7 @@
             return self
         if attr in ('latency', 'period'):
             return Latency(self)
-        raise AttributeError, "Frequency object has no attribute '%s'" % attr
+        raise AttributeError("Frequency object has no attribute '%s'" % attr)
 
     # convert latency to ticks
     def getValue(self):
@@ -1578,7 +1578,7 @@
             return Frequency(self)
         if attr in ('latency', 'period'):
             return Latency(self)
-        raise AttributeError, "Frequency object has no attribute '%s'" % attr
+        raise AttributeError("Frequency object has no attribute '%s'" % attr)
 
     def getValue(self):
         return self.period.getValue()
@@ -1800,8 +1800,8 @@
         if attr == 'peerObj':
             # shorthand for proxies
             return self.peer.simobj
-        raise AttributeError, "'%s' object has no attribute '%s'" % \
-              (self.__class__.__name__, attr)
+        raise AttributeError("'%s' object has no attribute '%s'" % \
+              (self.__class__.__name__, attr))
 
     # Full connection is symmetric (both ways).  Called via
     # SimObject.__setattr__ as a result of a port assignment, e.g.,
@@ -1821,9 +1821,8 @@
             if other.peer is not self:
                 other.connect(self)
         else:
-            raise TypeError, \
-                  "assigning non-port reference '%s' to port '%s'" \
-                  % (other, self)
+            raise TypeError("assigning non-port reference '%s' to port '%s'" \
+                  % (other, self))
 
     # Allow a master/slave port pair to be spliced between
     # a port and its connected peer. Useful operation for connecting
@@ -1836,9 +1835,9 @@
 
         if not isinstance(new_master_peer, PortRef) or \
            not isinstance(new_slave_peer, PortRef):
-            raise TypeError, \
+            raise TypeError(
                   "Splicing non-port references '%s','%s' to port '%s'" % \
-                  (new_master_peer, new_slave_peer, self)
+                  (new_master_peer, new_slave_peer, self))
 
         old_peer = self.peer
         if self.role == 'SLAVE':
@@ -1892,9 +1891,9 @@
 
         # check that we connect a master to a slave
         if self.role == peer.role:
-            raise TypeError, \
-                "cannot connect '%s' and '%s' due to identical role '%s'" \
-                % (peer, self, self.role)
+            raise TypeError(
+                "cannot connect '%s' and '%s' due to identical role '%s'" % \
+                (peer, self, self.role))
 
         if self.role == 'SLAVE':
             # do nothing and let the master take care of it
@@ -1951,7 +1950,7 @@
 
     def __getitem__(self, key):
         if not isinstance(key, int):
-            raise TypeError, "VectorPort index must be integer"
+            raise TypeError("VectorPort index must be integer")
         if key >= len(self.elements):
             # need to extend list
             ext = [VectorPortElementRef(self.simobj, self.name, self.role, i)
@@ -1964,7 +1963,7 @@
 
     def __setitem__(self, key, value):
         if not isinstance(key, int):
-            raise TypeError, "VectorPort index must be integer"
+            raise TypeError("VectorPort index must be integer")
         self[key].connect(value)
 
     def connect(self, other):
@@ -2029,7 +2028,7 @@
             self.desc = args[0]
             self.role = 'MASTER'
         else:
-            raise TypeError, 'wrong number of arguments'
+            raise TypeError('wrong number of arguments')
 
 class SlavePort(Port):
     # SlavePort("description")
@@ -2038,7 +2037,7 @@
             self.desc = args[0]
             self.role = 'SLAVE'
         else:
-            raise TypeError, 'wrong number of arguments'
+            raise TypeError('wrong number of arguments')
 
 # VectorPort description object.  Like Port, but represents a vector
 # of connections (e.g., as on a XBar).
@@ -2057,7 +2056,7 @@
             self.role = 'MASTER'
             VectorPort.__init__(self, *args)
         else:
-            raise TypeError, 'wrong number of arguments'
+            raise TypeError('wrong number of arguments')
 
 class VectorSlavePort(VectorPort):
     # VectorSlavePort("description")
@@ -2067,7 +2066,7 @@
             self.role = 'SLAVE'
             VectorPort.__init__(self, *args)
         else:
-            raise TypeError, 'wrong number of arguments'
+            raise TypeError('wrong number of arguments')
 
 # 'Fake' ParamDesc for Port references to assign to the _pdesc slot of
 # proxy objects (via set_param_desc()) so that proxy error messages
diff --git a/src/python/m5/proxy.py b/src/python/m5/proxy.py
index c0bf84a..2a32500 100644
--- a/src/python/m5/proxy.py
+++ b/src/python/m5/proxy.py
@@ -66,16 +66,16 @@
 
     def __setattr__(self, attr, value):
         if not attr.startswith('_'):
-            raise AttributeError, \
-                  "cannot set attribute '%s' on proxy object" % attr
+            raise AttributeError(
+                "cannot set attribute '%s' on proxy object" % attr)
         super(BaseProxy, self).__setattr__(attr, value)
 
     # support for multiplying proxies by constants or other proxies to
     # other params
     def __mul__(self, other):
         if not (isinstance(other, (int, long, float)) or isproxy(other)):
-            raise TypeError, \
-                "Proxy multiplier must be a constant or a proxy to a param"
+            raise TypeError(
+                "Proxy multiplier must be a constant or a proxy to a param")
         self._multipliers.append(other)
         return self
 
@@ -88,8 +88,8 @@
                 # assert that we are multiplying with a compatible
                 # param
                 if not isinstance(multiplier, params.NumericParamValue):
-                    raise TypeError, \
-                        "Proxy multiplier must be a numerical param"
+                    raise TypeError(
+                        "Proxy multiplier must be a numerical param")
                 multiplier = multiplier.getValue()
             result *= multiplier
         return result
@@ -116,13 +116,13 @@
             base._visited = False
 
         if not done:
-            raise AttributeError, \
-                  "Can't resolve proxy '%s' of type '%s' from '%s'" % \
-                  (self.path(), self._pdesc.ptype_str, base.path())
+            raise AttributeError(
+                "Can't resolve proxy '%s' of type '%s' from '%s'" % \
+                  (self.path(), self._pdesc.ptype_str, base.path()))
 
         if isinstance(result, BaseProxy):
             if result == self:
-                raise RuntimeError, "Cycle in unproxy"
+                raise RuntimeError("Cycle in unproxy")
             result = result.unproxy(obj)
 
         return self._mulcheck(result, base)
@@ -157,7 +157,7 @@
         if attr.startswith('_'):
             return super(AttrProxy, self).__getattr__(self, attr)
         if hasattr(self, '_pdesc'):
-            raise AttributeError, "Attribute reference on bound proxy"
+            raise AttributeError("Attribute reference on bound proxy")
         # Return a copy of self rather than modifying self in place
         # since self could be an indirect reference via a variable or
         # parameter
@@ -168,9 +168,9 @@
     # support indexing on proxies (e.g., Self.cpu[0])
     def __getitem__(self, key):
         if not isinstance(key, int):
-            raise TypeError, "Proxy object requires integer index"
+            raise TypeError("Proxy object requires integer index")
         if hasattr(self, '_pdesc'):
-            raise AttributeError, "Index operation on bound proxy"
+            raise AttributeError("Index operation on bound proxy")
         new_self = copy.deepcopy(self)
         new_self._modifiers.append(key)
         return new_self
diff --git a/src/python/m5/simulate.py b/src/python/m5/simulate.py
index 0e1a67e..03cc253 100644
--- a/src/python/m5/simulate.py
+++ b/src/python/m5/simulate.py
@@ -221,7 +221,7 @@
 def checkpoint(dir):
     root = objects.Root.getInstance()
     if not isinstance(root, objects.Root):
-        raise TypeError, "Checkpoint must be called on a root object."
+        raise TypeError("Checkpoint must be called on a root object.")
 
     drain()
     memWriteback(root)
@@ -230,8 +230,8 @@
 
 def _changeMemoryMode(system, mode):
     if not isinstance(system, (objects.Root, objects.System)):
-        raise TypeError, "Parameter of type '%s'.  Must be type %s or %s." % \
-              (type(system), objects.Root, objects.System)
+        raise TypeError("Parameter of type '%s'.  Must be type %s or %s." % \
+              (type(system), objects.Root, objects.System))
     if system.getMemoryMode() != mode:
         system.setMemoryMode(mode)
     else:
@@ -253,10 +253,10 @@
         print("switching cpus")
 
     if not isinstance(cpuList, list):
-        raise RuntimeError, "Must pass a list to this function"
+        raise RuntimeError("Must pass a list to this function")
     for item in cpuList:
         if not isinstance(item, tuple) or len(item) != 2:
-            raise RuntimeError, "List must have tuples of (oldCPU,newCPU)"
+            raise RuntimeError("List must have tuples of (oldCPU,newCPU)")
 
     old_cpus = [old_cpu for old_cpu, new_cpu in cpuList]
     new_cpus = [new_cpu for old_cpu, new_cpu in cpuList]
@@ -264,33 +264,31 @@
     memory_mode_name = new_cpus[0].memory_mode()
     for old_cpu, new_cpu in cpuList:
         if not isinstance(old_cpu, objects.BaseCPU):
-            raise TypeError, "%s is not of type BaseCPU" % old_cpu
+            raise TypeError("%s is not of type BaseCPU" % old_cpu)
         if not isinstance(new_cpu, objects.BaseCPU):
-            raise TypeError, "%s is not of type BaseCPU" % new_cpu
+            raise TypeError("%s is not of type BaseCPU" % new_cpu)
         if new_cpu in old_cpu_set:
-            raise RuntimeError, \
-                "New CPU (%s) is in the list of old CPUs." % (old_cpu,)
+            raise RuntimeError(
+                "New CPU (%s) is in the list of old CPUs." % (old_cpu,))
         if not new_cpu.switchedOut():
-            raise RuntimeError, \
-                "New CPU (%s) is already active." % (new_cpu,)
+            raise RuntimeError("New CPU (%s) is already active." % (new_cpu,))
         if not new_cpu.support_take_over():
-            raise RuntimeError, \
-                "New CPU (%s) does not support CPU handover." % (old_cpu,)
+            raise RuntimeError(
+                "New CPU (%s) does not support CPU handover." % (old_cpu,))
         if new_cpu.memory_mode() != memory_mode_name:
-            raise RuntimeError, \
+            raise RuntimeError(
                 "%s and %s require different memory modes." % (new_cpu,
-                                                               new_cpus[0])
+                                                               new_cpus[0]))
         if old_cpu.switchedOut():
-            raise RuntimeError, \
-                "Old CPU (%s) is inactive." % (new_cpu,)
+            raise RuntimeError("Old CPU (%s) is inactive." % (new_cpu,))
         if not old_cpu.support_take_over():
-            raise RuntimeError, \
-                "Old CPU (%s) does not support CPU handover." % (old_cpu,)
+            raise RuntimeError(
+                "Old CPU (%s) does not support CPU handover." % (old_cpu,))
 
     try:
         memory_mode = _memory_modes[memory_mode_name]
     except KeyError:
-        raise RuntimeError, "Invalid memory mode (%s)" % memory_mode_name
+        raise RuntimeError("Invalid memory mode (%s)" % memory_mode_name)
 
     drain()
 
@@ -343,13 +341,13 @@
     global fork_count
 
     if not _m5.core.listenersDisabled():
-        raise RuntimeError, "Can not fork a simulator with listeners enabled"
+        raise RuntimeError("Can not fork a simulator with listeners enabled")
 
     drain()
 
     try:
         pid = os.fork()
-    except OSError, e:
+    except OSError as e:
         raise e
 
     if pid == 0:
diff --git a/src/python/m5/ticks.py b/src/python/m5/ticks.py
index e4b5eac..22a5738 100644
--- a/src/python/m5/ticks.py
+++ b/src/python/m5/ticks.py
@@ -47,8 +47,8 @@
     elif isinstance(ticksPerSecond, str):
         tps = round(convert.anyToFrequency(ticksPerSecond))
     else:
-        raise TypeError, \
-              "wrong type '%s' for ticksPerSecond" % type(ticksPerSecond)
+        raise TypeError(
+            "wrong type '%s' for ticksPerSecond" % type(ticksPerSecond))
     _m5.core.setClockFrequency(int(tps))
 
 # how big does a rounding error need to be before we warn about it?
@@ -58,13 +58,13 @@
     import _m5.core
 
     if not isinstance(value, float):
-        raise TypeError, "can't convert '%s' to type tick" % type(value)
+        raise TypeError("can't convert '%s' to type tick" % type(value))
 
     # once someone needs to convert to seconds, the global frequency
     # had better be fixed
     if not _m5.core.clockFrequencyFixed():
-        raise AttributeError, \
-              "In order to do conversions, the global frequency must be fixed"
+        raise AttributeError(
+              "In order to do conversions, the global frequency must be fixed")
 
     if value == 0:
         return 0
diff --git a/src/python/m5/util/__init__.py b/src/python/m5/util/__init__.py
index 2ad9c56..02dece6 100644
--- a/src/python/m5/util/__init__.py
+++ b/src/python/m5/util/__init__.py
@@ -128,7 +128,7 @@
         elif isinstance(v, str):
             return map(lambda x: int(re.match('\d+', x).group()), v.split('.'))
         else:
-            raise TypeError
+            raise TypeError()
 
     v1 = make_version_list(v1)
     v2 = make_version_list(v2)
@@ -194,7 +194,7 @@
     kwargs.setdefault('close_fds', True)
     try:
         subp = Popen(cmd, **kwargs)
-    except Exception, e:
+    except Exception as e:
         if no_exception:
             return exception
         raise
@@ -206,7 +206,7 @@
     ensure that it is a directory"""
     if os.path.exists(path):
         if not os.path.isdir(path):
-            raise AttributeError, "%s exists but is not directory" % path
+            raise AttributeError("%s exists but is not directory" % path)
     else:
         os.mkdir(path)
 
diff --git a/src/python/m5/util/code_formatter.py b/src/python/m5/util/code_formatter.py
index a11c9d3..d48c59b 100644
--- a/src/python/m5/util/code_formatter.py
+++ b/src/python/m5/util/code_formatter.py
@@ -74,7 +74,7 @@
             return self.args[item]
         except ValueError:
             pass
-        raise IndexError, "Could not find '%s'" % item
+        raise IndexError("Could not find '%s'" % item)
 
 class code_formatter_meta(type):
     pattern = r"""
diff --git a/src/python/m5/util/convert.py b/src/python/m5/util/convert.py
index 5ae3121..7b9cb38 100644
--- a/src/python/m5/util/convert.py
+++ b/src/python/m5/util/convert.py
@@ -89,7 +89,7 @@
 
 def assertStr(value):
     if not isinstance(value, str):
-        raise TypeError, "wrong type '%s' should be str" % type(value)
+        raise TypeError("wrong type '%s' should be str" % type(value))
 
 
 # memory size configuration stuff
@@ -102,8 +102,8 @@
         try:
             return float(value)
         except ValueError:
-            raise ValueError, "cannot convert '%s' to %s" % \
-                    (value, target_type)
+            raise ValueError("cannot convert '%s' to %s" % \
+                             (value, target_type))
 
     value = value[:-len(units)]
 
@@ -124,8 +124,8 @@
     value = toFloat(value, target_type, units, prefixes)
     result = long(value)
     if value != result:
-        raise ValueError, "cannot convert '%s' to integer %s" % \
-                (value, target_type)
+        raise ValueError("cannot convert '%s' to integer %s" % \
+                (value, target_type))
 
     return result
 
@@ -155,7 +155,7 @@
     """result is a clock period"""
     try:
         return 1 / toFrequency(value)
-    except ValueError, ZeroDivisionError:
+    except (ValueError, ZeroDivisionError):
         pass
 
     try:
@@ -163,7 +163,7 @@
     except ValueError:
         pass
 
-    raise ValueError, "cannot convert '%s' to clock period" % value
+    raise ValueError("cannot convert '%s' to clock period" % value)
 
 def anyToFrequency(value):
     """result is a clock period"""
@@ -174,10 +174,10 @@
 
     try:
         return 1 / toLatency(value)
-    except ValueError, ZeroDivisionError:
+    except ValueError as ZeroDivisionError:
         pass
 
-    raise ValueError, "cannot convert '%s' to clock period" % value
+    raise ValueError("cannot convert '%s' to clock period" % value)
 
 def toNetworkBandwidth(value):
     return toMetricFloat(value, 'network bandwidth', 'bps')
@@ -190,29 +190,29 @@
 
 def toIpAddress(value):
     if not isinstance(value, str):
-        raise TypeError, "wrong type '%s' should be str" % type(value)
+        raise TypeError("wrong type '%s' should be str" % type(value))
 
     bytes = value.split('.')
     if len(bytes) != 4:
-        raise ValueError, 'invalid ip address %s' % value
+        raise ValueError('invalid ip address %s' % value)
 
     for byte in bytes:
         if not 0 <= int(byte) <= 0xff:
-            raise ValueError, 'invalid ip address %s' % value
+            raise ValueError('invalid ip address %s' % value)
 
     return (int(bytes[0]) << 24) | (int(bytes[1]) << 16) | \
            (int(bytes[2]) << 8)  | (int(bytes[3]) << 0)
 
 def toIpNetmask(value):
     if not isinstance(value, str):
-        raise TypeError, "wrong type '%s' should be str" % type(value)
+        raise TypeError("wrong type '%s' should be str" % type(value))
 
     (ip, netmask) = value.split('/')
     ip = toIpAddress(ip)
     netmaskParts = netmask.split('.')
     if len(netmaskParts) == 1:
         if not 0 <= int(netmask) <= 32:
-            raise ValueError, 'invalid netmask %s' % netmask
+            raise ValueError('invalid netmask %s' % netmask)
         return (ip, int(netmask))
     elif len(netmaskParts) == 4:
         netmaskNum = toIpAddress(netmask)
@@ -223,18 +223,18 @@
             testVal |= (1 << (31 - i))
             if testVal == netmaskNum:
                 return (ip, i + 1)
-        raise ValueError, 'invalid netmask %s' % netmask
+        raise ValueError('invalid netmask %s' % netmask)
     else:
-        raise ValueError, 'invalid netmask %s' % netmask
+        raise ValueError('invalid netmask %s' % netmask)
 
 def toIpWithPort(value):
     if not isinstance(value, str):
-        raise TypeError, "wrong type '%s' should be str" % type(value)
+        raise TypeError("wrong type '%s' should be str" % type(value))
 
     (ip, port) = value.split(':')
     ip = toIpAddress(ip)
     if not 0 <= int(port) <= 0xffff:
-        raise ValueError, 'invalid port %s' % port
+        raise ValueError('invalid port %s' % port)
     return (ip, int(port))
 
 def toVoltage(value):
diff --git a/src/python/m5/util/grammar.py b/src/python/m5/util/grammar.py
index 07702cf..bb34298 100644
--- a/src/python/m5/util/grammar.py
+++ b/src/python/m5/util/grammar.py
@@ -37,18 +37,17 @@
 class Grammar(object):
     def setupLexerFactory(self, **kwargs):
         if 'module' in kwargs:
-            raise AttributeError, "module is an illegal attribute"
+            raise AttributeError("module is an illegal attribute")
         self.lex_kwargs = kwargs
 
     def setupParserFactory(self, **kwargs):
         if 'module' in kwargs:
-            raise AttributeError, "module is an illegal attribute"
+            raise AttributeError("module is an illegal attribute")
 
         if 'output' in kwargs:
             dir,tab = os.path.split(output)
             if not tab.endswith('.py'):
-                raise AttributeError, \
-                    'The output file must end with .py'
+                raise AttributeError('The output file must end with .py')
             kwargs['outputdir'] = dir
             kwargs['tabmodule'] = tab[:-3]
 
@@ -90,13 +89,13 @@
                 return -1
             return self.current_lexer.lineno
 
-        raise AttributeError, \
-            "'%s' object has no attribute '%s'" % (type(self), attr)
+        raise AttributeError(
+            "'%s' object has no attribute '%s'" % (type(self), attr))
 
     def parse_string(self, data, source='<string>', debug=None, tracking=0):
         if not isinstance(data, basestring):
-            raise AttributeError, \
-                "argument must be a string, was '%s'" % type(f)
+            raise AttributeError(
+                "argument must be a string, was '%s'" % type(f))
 
         import new
         lexer = self.lex.clone()
@@ -120,8 +119,8 @@
         elif isinstance(f, file):
             source = f.name
         else:
-            raise AttributeError, \
-                "argument must be either a string or file, was '%s'" % type(f)
+            raise AttributeError(
+                "argument must be either a string or file, was '%s'" % type(f))
 
         return self.parse_string(f.read(), source, **kwargs)
 
diff --git a/src/python/m5/util/jobfile.py b/src/python/m5/util/jobfile.py
index d8c09af..ad5b5ff 100644
--- a/src/python/m5/util/jobfile.py
+++ b/src/python/m5/util/jobfile.py
@@ -38,7 +38,7 @@
 
     def update(self, obj):
         if not isinstance(obj, Data):
-            raise AttributeError, "can only update from Data object"
+            raise AttributeError("can only update from Data object")
 
         for key,val in obj.__dict__.iteritems():
             if key.startswith('_') or key in ('name', 'desc'):
@@ -52,22 +52,22 @@
                 if self.__dict__[key] == val:
                     continue
 
-                raise AttributeError, \
-                      "%s specified more than once old: %s new: %s" % \
-                      (key, self.__dict__[key], val)
+                raise AttributeError(
+                    "%s specified more than once old: %s new: %s" % \
+                    (key, self.__dict__[key], val))
 
             d = self.__dict__[key]
             for k,v in val.iteritems():
                 if k in d:
-                    raise AttributeError, \
-                          "%s specified more than once in %s" % (k, key)
+                    raise AttributeError(
+                        "%s specified more than once in %s" % (k, key))
                 d[k] = v
 
         if hasattr(self, 'system') and hasattr(obj, 'system'):
             if self.system != obj.system:
-                raise AttributeError, \
-                      "conflicting values for system: '%s'/'%s'" % \
-                      (self.system, obj.system)
+                raise AttributeError(
+                    "conflicting values for system: '%s'/'%s'" % \
+                    (self.system, obj.system))
 
     def printinfo(self):
         if self.name:
@@ -96,7 +96,7 @@
 
     def __getitem__(self, key):
         if key.startswith('_'):
-            raise KeyError, "Key '%s' not found" % attr
+            raise KeyError("Key '%s' not found" % attr)
         return self.__dict__[key]
 
     def __iter__(self):
@@ -131,8 +131,8 @@
         config = options[0]._config
         for opt in options:
             if opt._config != config:
-                raise AttributeError, \
-                      "All options are not from the same Configuration"
+                raise AttributeError(
+                    "All options are not from the same Configuration")
 
         self._config = config
         self._groups = [ opt._group for opt in options ]
@@ -309,7 +309,7 @@
     def checkchildren(self, kids):
         for kid in kids:
             if kid._config != self:
-                raise AttributeError, "child from the wrong configuration"
+                raise AttributeError("child from the wrong configuration")
 
     def sortgroups(self, groups):
         groups = [ (grp._number, grp) for grp in groups ]
@@ -387,7 +387,7 @@
             if job.name == jobname:
                 return job
         else:
-            raise AttributeError, "job '%s' not found" % jobname
+            raise AttributeError("job '%s' not found" % jobname)
 
     def job(self, options):
         self.checkchildren(options)
@@ -414,13 +414,12 @@
                 filename = testname
                 break
         else:
-            raise AttributeError, \
-                  "Could not find file '%s'" % jobfile
+            raise AttributeError("Could not find file '%s'" % jobfile)
 
     data = {}
     execfile(filename, data)
     if 'conf' not in data:
-        raise ImportError, 'cannot import name conf from %s' % jobfile
+        raise ImportError('cannot import name conf from %s' % jobfile)
     return data['conf']
 
 def main(conf=None):
@@ -448,11 +447,11 @@
 
     if conf is None:
         if len(args) != 1:
-            raise AttributeError, usage
+            raise AttributeError(usage)
         conf = JobFile(args[0])
     else:
         if len(args) != 0:
-            raise AttributeError, usage
+            raise AttributeError(usage)
 
     if both:
         jobs = conf.alljobs()
diff --git a/src/python/m5/util/multidict.py b/src/python/m5/util/multidict.py
index d22b1cb..28090a2 100644
--- a/src/python/m5/util/multidict.py
+++ b/src/python/m5/util/multidict.py
@@ -48,11 +48,11 @@
     def __delitem__(self, key):
         try:
             del self.local[key]
-        except KeyError, e:
+        except KeyError as e:
             if key in self.parent:
                 self.deleted[key] = True
             else:
-                raise KeyError, e
+                raise KeyError(e)
 
     def __setitem__(self, key, value):
         self.deleted.pop(key, False)
@@ -61,11 +61,11 @@
     def __getitem__(self, key):
         try:
             return self.local[key]
-        except KeyError, e:
+        except KeyError as e:
             if not self.deleted.get(key, False) and key in self.parent:
                 return self.parent[key]
             else:
-                raise KeyError, e
+                raise KeyError(e)
 
     def __len__(self):
         return len(self.local) + len(self.parent)
@@ -106,7 +106,7 @@
     def get(self, key, default=None):
         try:
             return self[key]
-        except KeyError, e:
+        except KeyError as e:
             return default
 
     def setdefault(self, key, default):