python: Make iterator handling Python 3 compatible
authorAndreas Sandberg <andreas.sandberg@arm.com>
Sat, 26 Jan 2019 09:19:22 +0000 (09:19 +0000)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 22 Feb 2019 10:47:36 +0000 (10:47 +0000)
Many functions that used to return lists (e.g., dict.items()) now
return iterators and their iterator counterparts (e.g.,
dict.iteritems()) have been removed. Switch calls to the Python 2.7
iterator methods to use the Python 3 equivalent and add explicit list
conversions where necessary.

Change-Id: I0c18114955af8f4932d81fb689a0adb939dafaba
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15992
Reviewed-by: Juha Jäykkä <juha.jaykka@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
18 files changed:
src/SConscript
src/cpu/BaseCPU.py
src/cpu/minor/MinorCPU.py
src/mem/ruby/network/simple/SimpleNetwork.py
src/mem/slicc/symbols/Type.py
src/python/m5/SimObject.py
src/python/m5/main.py
src/python/m5/objects/__init__.py
src/python/m5/options.py
src/python/m5/params.py
src/python/m5/util/code_formatter.py
src/python/m5/util/dot_writer.py
src/python/m5/util/jobfile.py
src/python/m5/util/multidict.py
src/python/m5/util/smartdict.py
src/python/m5/util/sorteddict.py
src/python/m5/util/terminal.py
src/systemc/tests/tlm/endian_conv/testall.py

index ef7e670ab8beb8e64c6f95fc854619bc1363cf09..ab0e1fcdeb991f70babe9bb504c30ea2d4305a5a 100644 (file)
@@ -826,7 +826,7 @@ buildEnv = m5.util.SmartDict($build_env)
 
 compileDate = _m5.core.compileDate
 _globals = globals()
-for key,val in _m5.core.__dict__.iteritems():
+for key,val in _m5.core.__dict__.items():
     if key.startswith('flag_'):
         flag = key[5:]
         _globals[flag] = val
index 007c869afe0522ab14019d53295d5ed5fbeaef99..60c86a44f524f945ea081f4f626df76e47dfcf6c 100644 (file)
@@ -241,26 +241,26 @@ class BaseCPU(MemObject):
 
     def createInterruptController(self):
         if buildEnv['TARGET_ISA'] == 'sparc':
-            self.interrupts = [SparcInterrupts() for i in xrange(self.numThreads)]
+            self.interrupts = [SparcInterrupts() for i in range(self.numThreads)]
         elif buildEnv['TARGET_ISA'] == 'alpha':
-            self.interrupts = [AlphaInterrupts() for i in xrange(self.numThreads)]
+            self.interrupts = [AlphaInterrupts() for i in range(self.numThreads)]
         elif buildEnv['TARGET_ISA'] == 'x86':
             self.apic_clk_domain = DerivedClockDomain(clk_domain =
                                                       Parent.clk_domain,
                                                       clk_divider = 16)
             self.interrupts = [X86LocalApic(clk_domain = self.apic_clk_domain,
                                            pio_addr=0x2000000000000000)
-                               for i in xrange(self.numThreads)]
+                               for i in range(self.numThreads)]
             _localApic = self.interrupts
         elif buildEnv['TARGET_ISA'] == 'mips':
-            self.interrupts = [MipsInterrupts() for i in xrange(self.numThreads)]
+            self.interrupts = [MipsInterrupts() for i in range(self.numThreads)]
         elif buildEnv['TARGET_ISA'] == 'arm':
-            self.interrupts = [ArmInterrupts() for i in xrange(self.numThreads)]
+            self.interrupts = [ArmInterrupts() for i in range(self.numThreads)]
         elif buildEnv['TARGET_ISA'] == 'power':
-            self.interrupts = [PowerInterrupts() for i in xrange(self.numThreads)]
+            self.interrupts = [PowerInterrupts() for i in range(self.numThreads)]
         elif buildEnv['TARGET_ISA'] == 'riscv':
             self.interrupts = \
-                [RiscvInterrupts() for i in xrange(self.numThreads)]
+                [RiscvInterrupts() for i in range(self.numThreads)]
         else:
             print("Don't know what Interrupt Controller to use for ISA %s" %
                   buildEnv['TARGET_ISA'])
@@ -318,7 +318,7 @@ class BaseCPU(MemObject):
         # If no ISAs have been created, assume that the user wants the
         # default ISA.
         if len(self.isa) == 0:
-            self.isa = [ default_isa_class() for i in xrange(self.numThreads) ]
+            self.isa = [ default_isa_class() for i in range(self.numThreads) ]
         else:
             if len(self.isa) != int(self.numThreads):
                 raise RuntimeError("Number of ISA instances doesn't "
index bb4df82f0d8d012b4906e72b4910dd115e646cb0..ae97f6c4fe00013fd1546cc9d48ec8c570907032 100644 (file)
@@ -102,7 +102,7 @@ def minorMakeOpClassSet(op_classes):
     def boxOpClass(op_class):
         return MinorOpClass(opClass=op_class)
 
-    return MinorOpClassSet(opClasses=map(boxOpClass, op_classes))
+    return MinorOpClassSet(opClasses=[ boxOpClass(o) for o in op_classes ])
 
 class MinorFU(SimObject):
     type = 'MinorFU'
index e7a79492b40989f24144acad95789277d99a69fe..1f86f9939c8601ce5c1b1c67b644a8528ed6a377 100644 (file)
@@ -49,7 +49,7 @@ class SimpleNetwork(RubyNetwork):
         for link in self.int_links:
             # The network needs number_of_virtual_networks buffers per
             # int_link port
-            for i in xrange(self.number_of_virtual_networks):
+            for i in range(int(self.number_of_virtual_networks)):
                 network_buffers.append(MessageBuffer(ordered = True))
                 network_buffers.append(MessageBuffer(ordered = True))
         self.int_link_buffers = network_buffers
@@ -61,14 +61,14 @@ class SimpleNetwork(RubyNetwork):
             # unidirectional internal link
             for link in self.int_links:
                 if link.dst_node == router:
-                    for i in xrange(self.number_of_virtual_networks):
+                    for i in range(int(self.number_of_virtual_networks)):
                         router_buffers.append(MessageBuffer(ordered = True))
 
             # Add message buffers to routers for each external link connection
             for link in self.ext_links:
                 # Routers can only be int_nodes on ext_links
                 if link.int_node in self.routers:
-                    for i in xrange(self.number_of_virtual_networks):
+                    for i in range(int(self.number_of_virtual_networks)):
                         router_buffers.append(MessageBuffer(ordered = True))
             router.port_buffers = router_buffers
 
index 162c1ab04b1c546224d33fdfd3c79824752bba67..e9ea618150e7bafe61d105c3a1aef01092cc89d0 100644 (file)
@@ -724,7 +724,7 @@ ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj)
             # For each field
             code.indent()
             code('  case ${{self.c_ident}}_NUM:')
-            for enum in reversed(self.enums.values()):
+            for enum in reversed(list(self.enums.values())):
                 # Check if there is a defined machine with this type
                 if enum.primary:
                     code('    base += ${{enum.ident}}_Controller::getNumControllers();')
index 990480720db65aeffc8a7aaaaa85c778b6da8f92..11330b4c3f45c1f5e2120d4751e46dd749965244 100644 (file)
@@ -168,7 +168,7 @@ def createCxxConfigDirectoryEntryFile(code, name, simobj, is_header):
         code('#include "base/str.hh"')
         code('#include "cxx_config/${name}.hh"')
 
-        if simobj._ports.values() != []:
+        if simobj._ports:
             code('#include "mem/mem_object.hh"')
             code('#include "mem/port.hh"')
 
@@ -726,7 +726,7 @@ module_init(py::module &m_internal)
             for k, v in sorted(cls._params.local.items())
         ] + [
             PyBindProperty("port_%s_connection_count" % port.name)
-            for port in ports.itervalues()
+            for port in ports.values()
         ]
         for exp in param_exports:
             exp.export(code, "%sParams" % cls)
@@ -813,7 +813,7 @@ module_init(py::module &m_internal)
 
         for param in params:
             param.cxx_predecls(code)
-        for port in ports.itervalues():
+        for port in ports.values():
             port.cxx_predecls(code)
         code()
 
@@ -846,7 +846,7 @@ module_init(py::module &m_internal)
 
         for param in params:
             param.cxx_decl(code)
-        for port in ports.itervalues():
+        for port in ports.values():
             port.cxx_decl(code)
 
         code.dedent()
@@ -886,7 +886,8 @@ def cxxMethod(*args, **kwargs):
 
         # Create tuples of (argument, default)
         if defaults:
-            args = args[:-len(defaults)] + zip(args[-len(defaults):], defaults)
+            args = args[:-len(defaults)] + \
+                   list(zip(args[-len(defaults):], defaults))
         # Don't include self in the argument list to PyBind
         args = args[1:]
 
@@ -1118,7 +1119,7 @@ class SimObject(object):
         # Do children before parameter values so that children that
         # are also param values get cloned properly.
         self._children = {}
-        for key,val in ancestor._children.iteritems():
+        for key,val in ancestor._children.items():
             self.add_child(key, val(_memo=memo_dict))
 
         # Inherit parameter values from class using multidict so
@@ -1127,7 +1128,7 @@ class SimObject(object):
         self._values = multidict(ancestor._values)
         self._hr_values = multidict(ancestor._hr_values)
         # clone SimObject-valued parameters
-        for key,val in ancestor._values.iteritems():
+        for key,val in ancestor._values.items():
             val = tryAsSimObjectOrVector(val)
             if val is not None:
                 self._values[key] = val(_memo=memo_dict)
@@ -1135,10 +1136,10 @@ class SimObject(object):
         # clone port references.  no need to use a multidict here
         # since we will be creating new references for all ports.
         self._port_refs = {}
-        for key,val in ancestor._port_refs.iteritems():
+        for key,val in ancestor._port_refs.items():
             self._port_refs[key] = val.clone(self, memo_dict)
         # apply attribute assignments from keyword args, if any
-        for key,val in kwargs.iteritems():
+        for key,val in kwargs.items():
             setattr(self, key, val)
 
     # "Clone" the current instance by creating another instance of
@@ -1310,7 +1311,7 @@ class SimObject(object):
     # that when we instantiate all the parameter objects we're still
     # inside the configuration hierarchy.
     def adoptOrphanParams(self):
-        for key,val in self._values.iteritems():
+        for key,val in self._values.items():
             if not isSimObjectVector(val) and isSimObjectSequence(val):
                 # need to convert raw SimObject sequences to
                 # SimObjectVector class so we can call has_parent()
@@ -1345,7 +1346,7 @@ class SimObject(object):
             return self, True
 
         found_obj = None
-        for child in self._children.itervalues():
+        for child in self._children.values():
             visited = False
             if hasattr(child, '_visited'):
               visited = getattr(child, '_visited')
@@ -1357,7 +1358,7 @@ class SimObject(object):
                           (found_obj.path, child.path))
                 found_obj = child
         # search param space
-        for pname,pdesc in self._params.iteritems():
+        for pname,pdesc in self._params.items():
             if issubclass(pdesc.ptype, ptype):
                 match_obj = self._values[pname]
                 if found_obj != None and found_obj != match_obj:
@@ -1370,7 +1371,7 @@ class SimObject(object):
     def find_all(self, ptype):
         all = {}
         # search children
-        for child in self._children.itervalues():
+        for child in self._children.values():
             # a child could be a list, so ensure we visit each item
             if isinstance(child, list):
                 children = child
@@ -1386,7 +1387,7 @@ class SimObject(object):
                     child_all, done = child.find_all(ptype)
                     all.update(dict(zip(child_all, [done] * len(child_all))))
         # search param space
-        for pname,pdesc in self._params.iteritems():
+        for pname,pdesc in self._params.items():
             if issubclass(pdesc.ptype, ptype):
                 match_obj = self._values[pname]
                 if not isproxy(match_obj) and not isNullPointer(match_obj):
@@ -1399,7 +1400,7 @@ class SimObject(object):
         return self
 
     def unproxyParams(self):
-        for param in self._params.iterkeys():
+        for param in self._params.keys():
             value = self._values.get(param)
             if value != None and isproxy(value):
                 try:
@@ -1412,7 +1413,7 @@ class SimObject(object):
 
         # Unproxy ports in sorted order so that 'append' operations on
         # vector ports are done in a deterministic fashion.
-        port_names = self._ports.keys()
+        port_names = list(self._ports.keys())
         port_names.sort()
         for port_name in port_names:
             port = self._port_refs.get(port_name)
@@ -1489,7 +1490,7 @@ class SimObject(object):
         cc_params = cc_params_struct()
         cc_params.name = str(self)
 
-        param_names = self._params.keys()
+        param_names = list(self._params.keys())
         param_names.sort()
         for param in param_names:
             value = self._values.get(param)
@@ -1513,7 +1514,7 @@ class SimObject(object):
             else:
                 setattr(cc_params, param, value)
 
-        port_names = self._ports.keys()
+        port_names = list(self._ports.keys())
         port_names.sort()
         for port_name in port_names:
             port = self._port_refs.get(port_name, None)
@@ -1550,7 +1551,7 @@ class SimObject(object):
         # The order of the dict is implementation dependent, so sort
         # it based on the key (name) to ensure the order is the same
         # on all hosts
-        for (name, child) in sorted(self._children.iteritems()):
+        for (name, child) in sorted(self._children.items()):
             for obj in child.descendants():
                 yield obj
 
@@ -1567,7 +1568,7 @@ class SimObject(object):
     def connectPorts(self):
         # Sort the ports based on their attribute name to ensure the
         # order is the same on all hosts
-        for (attr, portRef) in sorted(self._port_refs.iteritems()):
+        for (attr, portRef) in sorted(self._port_refs.items()):
             portRef.ccConnect()
 
     # Default function for generating the device structure.
@@ -1577,7 +1578,7 @@ class SimObject(object):
         yield  # make this function a (null) generator
 
     def recurseDeviceTree(self, state):
-        for child in self._children.itervalues():
+        for child in self._children.values():
             for item in child: # For looping over SimObjectVectors
                 for dt in item.generateDeviceTree(state):
                     yield dt
index 08b14641f7cf4e080ecf39f6fec1c18b9b006556..eeaa9470b3200513ccbb1342acfc973a99a448dc 100644 (file)
@@ -261,7 +261,7 @@ def main(*args):
         print()
         print('compiled %s' % defines.compileDate)
         print('build options:')
-        keys = defines.buildEnv.keys()
+        keys = list(defines.buildEnv.keys())
         keys.sort()
         for key in keys:
             val = defines.buildEnv[key]
@@ -289,12 +289,12 @@ def main(*args):
         import SimObject
         done = True
         print("SimObjects:")
-        objects = SimObject.allClasses.keys()
+        objects = list(SimObject.allClasses.keys())
         objects.sort()
         for name in objects:
             obj = SimObject.allClasses[name]
             print("    %s" % obj)
-            params = obj._params.keys()
+            params = list(obj._params.keys())
             params.sort()
             for pname in params:
                 param = obj._params[pname]
index 8186c52028651f8d7b73496a0d686aaea71b14b3..302bb6f23d0b24ffd5a928f64c7fd670195dec99 100644 (file)
@@ -34,6 +34,6 @@ try:
 except NameError:
     modules = { }
 
-for module in modules.iterkeys():
+for module in modules.keys():
     if module.startswith('m5.objects.'):
         exec("from %s import *" % module)
index 1f534a3142324a1713d9a53759aae26cdf39b6d7..5b291b1439d45e7f639bdd23aeaa502a9aba04d5 100644 (file)
@@ -129,7 +129,7 @@ class OptionParser(dict):
     def parse_args(self):
         opts,args = self._optparse.parse_args()
 
-        for key,val in opts.__dict__.iteritems():
+        for key,val in opts.__dict__.items():
             if val is not None or key not in self:
                 self[key] = val
 
index 0c189c983d899dac0b935a1fca84d5ebe6a43a13..729fc1242af5a3a78d6c6c9091a8f75e75f504e1 100644 (file)
@@ -904,7 +904,7 @@ class Bool(ParamValue):
         code('%s to_bool(%s, %s);' % (ret, src, dest))
 
 def IncEthernetAddr(addr, val = 1):
-    bytes = map(lambda x: int(x, 16), addr.split(':'))
+    bytes = [ int(x, 16) for x in addr.split(':') ]
     bytes[5] += val
     for i in (5, 4, 3, 2, 1):
         val,rem = divmod(bytes[i], 256)
@@ -1282,7 +1282,7 @@ class MetaEnum(MetaParamValue):
                 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 = list(cls.map.keys())
             cls.vals.sort()
         elif 'vals' in init_dict:
             if not isinstance(cls.vals, list):
@@ -1453,7 +1453,7 @@ class Enum(ParamValue):
     @classmethod
     def cxx_ini_parse(cls, code, src, dest, ret):
         code('if (false) {')
-        for elem_name in cls.map.iterkeys():
+        for elem_name in cls.map.keys():
             code('} else if (%s == "%s") {' % (src, elem_name))
             code.indent()
             code('%s = Enums::%s;' % (dest, elem_name))
index 129fbd0e3c5b6b5eb1019c09304383826d0b7b25..c845c90212de806c231d5669204ca7b4d02c5d5b 100644 (file)
@@ -296,11 +296,11 @@ if __name__ == '__main__':
     f('    $y')
     f('''$__file__:$__line__
 {''')
-    f("${{', '.join(str(x) for x in xrange(4))}}")
+    f("${{', '.join(str(x) for x in range(4))}}")
     f('${x}')
     f('$x')
     f.indent()
-    for i in xrange(5):
+    for i in range(5):
         f('$x')
         f('$i')
         f('$0', "zero")
index 7155f116388b33e26df65b7ccf470fcf75c45f6e..f368faacbbdcd4e4afef910a5b85fad3ef08e498 100644 (file)
@@ -67,7 +67,7 @@ except:
     pydot = False
 
 def simnode_children(simNode):
-    for child in simNode._children.itervalues():
+    for child in simNode._children.values():
         if isNullPointer(child):
             continue
         if isSimObjectVector(child):
index 613289a812bda58e3adabfedcb842c7d2f89dbd6..45214a0b5afd374fce93c22bf12f8f8bd1b2b2d9 100644 (file)
@@ -40,7 +40,7 @@ class Data(object):
         if not isinstance(obj, Data):
             raise AttributeError("can only update from Data object")
 
-        for key,val in obj.__dict__.iteritems():
+        for key,val in obj.__dict__.items():
             if key.startswith('_') or key in ('name', 'desc'):
                 continue
 
@@ -57,7 +57,7 @@ class Data(object):
                     (key, self.__dict__[key], val))
 
             d = self.__dict__[key]
-            for k,v in val.iteritems():
+            for k,v in val.items():
                 if k in d:
                     raise AttributeError(
                         "%s specified more than once in %s" % (k, key))
@@ -100,7 +100,7 @@ class Data(object):
         return self.__dict__[key]
 
     def __iter__(self):
-        keys = self.__dict__.keys()
+        keys = list(self.__dict__.keys())
         keys.sort()
         for key in keys:
             if not key.startswith('_'):
@@ -115,7 +115,7 @@ class Data(object):
 
     def __repr__(self):
         d = {}
-        for key,value in self.__dict__.iteritems():
+        for key,value in self.__dict__.items():
             if not key.startswith('_'):
                 d[key] = value
 
index 5cc13eefa2db0d1a12f2de016c94945110d147ec..23301565e80902dae00779a33fa7f12f09574103 100644 (file)
@@ -82,27 +82,18 @@ class multidict(object):
     def has_key(self, key):
         return key in self
 
-    def iteritems(self):
+    def items(self):
         for item in self.next():
             yield item
 
-    def items(self):
-        return [ item for item in self.next() ]
-
-    def iterkeys(self):
+    def keys(self):
         for key,value in self.next():
             yield key
 
-    def keys(self):
-        return [ key for key,value in self.next() ]
-
-    def itervalues(self):
+    def values(self):
         for key,value in self.next():
             yield value
 
-    def values(self):
-        return [ value for key,value in self.next() ]
-
     def get(self, key, default=None):
         try:
             return self[key]
@@ -152,8 +143,8 @@ if __name__ == '__main__':
 
     test2.setdefault('f', multidict)
 
-    print('test1>', test1.items())
-    print('test2>', test2.items())
+    print('test1>', list(test1.items()))
+    print('test2>', list(test2.items()))
     #print(test1['a'])
     print(test1['b'])
     print(test1['c'])
@@ -166,7 +157,7 @@ if __name__ == '__main__':
     print(test2['d'])
     print(test2['e'])
 
-    for key in test2.iterkeys():
+    for key in test2.keys():
         print(key)
 
     test2.get('g', 'foo')
index 76b7eb4f885489b34c7a95379e287943da304b80..b8127b149e6c9d8df79306d96492b32940fd20ed 100644 (file)
@@ -138,17 +138,11 @@ class SmartDict(attrdict):
         dict.__setitem__(self, key, str(item))
 
     def values(self):
-        return [ Variable(v) for v in dict.values(self) ]
-
-    def itervalues(self):
-        for value in dict.itervalues(self):
+        for value in dict.values(self):
             yield Variable(value)
 
     def items(self):
-        return [ (k, Variable(v)) for k,v in dict.items(self) ]
-
-    def iteritems(self):
-        for key,value in dict.iteritems(self):
+        for key,value in dict.items(self):
             yield key, Variable(value)
 
     def get(self, key, default='False'):
index dd534b3cba4393fcfbbb00df0c30afcbe4252aad..28c9c601dcb9cbf94205f56b6e8b0dc66837e100 100644 (file)
@@ -41,7 +41,7 @@ class SortedDict(dict):
         try:
             return self._sorted_keys
         except AttributeError:
-            _sorted_keys = self.sorted(dict.iterkeys(self))
+            _sorted_keys = self.sorted(dict.keys(self))
             self._sorted_keys = _sorted_keys
             return _sorted_keys
 
@@ -89,7 +89,7 @@ class SortedDict(dict):
 
     def __repr__(self):
         return 'SortedDict({%s})' % ', '.join('%r: %r' % item
-                                              for item in self.iteritems())
+                                              for item in self.items())
     def __setitem__(self, key, item):
         dict.__setitem__(self, key, item)
         self._del_keys()
@@ -107,22 +107,13 @@ class SortedDict(dict):
         return t(self)
 
     def keys(self):
-        return self._keys[:]
+        return self._keys
 
     def values(self):
-        return list(self.itervalues())
-
-    def items(self):
-        return list(self.iteritems())
-
-    def iterkeys(self):
-        return iter(self._keys)
-
-    def itervalues(self):
         for k in self._keys:
             yield self[k]
 
-    def iteritems(self):
+    def items(self):
         for k in self._keys:
             yield k, self[k]
 
@@ -184,12 +175,12 @@ class SortedDict(dict):
 if __name__ == '__main__':
     def display(d):
         print(d)
-        print(d.keys())
-        print(list(d.iterkeys()))
-        print(d.values())
-        print(list(d.itervalues()))
-        print(d.items())
-        print(list(d.iteritems()))
+        print(list(d.keys()))
+        print(list(d.keys()))
+        print(list(d.values()))
+        print(list(d.values()))
+        print(list(d.items()))
+        print(list(d.items()))
 
     d = SortedDict(x=24,e=5,j=4,b=2,z=26,d=4)
     display(d)
index 9dc5d9850a12a45e8a6c6f131c98e7217acbb07a..00f8b706152aa1501df1593e1b6b743e417820e5 100644 (file)
@@ -63,7 +63,7 @@ capability_map = {
        'Normal': 'sgr0'
 }
 
-capability_names = capability_map.keys()
+capability_names = list(capability_map.keys())
 
 def null_cap_string(s, *args):
     return ''
@@ -84,7 +84,7 @@ class ColorStrings(object):
     def __init__(self, cap_string):
         for i, c in enumerate(color_names):
             setattr(self, c, cap_string('setaf', i))
-        for name, cap in capability_map.iteritems():
+        for name, cap in capability_map.items():
             setattr(self, name, cap_string(cap))
 
 termcap = ColorStrings(cap_string)
index 63bf6abe8ab9004cad6d963b04d4683beb15282e..a534fa7f43bd9458917f20f05a36dce6052e8919 100644 (file)
@@ -93,7 +93,7 @@ def txn_generator(nr):
   pr_enabled = 0.5
   bus_widths = [1, 2, 4, 8, 16]
   data_widths = [1, 2, 4, 8, 16] + [1, 2, 4, 8] + [1, 2, 4] + [1, 2]
-  lengths = range(1,33) + range(1,17) + range(1,9) + range(1,5) + range(1,3)
+  lengths = list(range(1,33)) + list(range(1,17)) + list(range(1,9)) + list(range(1,5)) + list(range(1,3))
   pr_short_be = 0.2
   pr_stream = 0.1
   nr_generated = 0
@@ -105,8 +105,8 @@ def txn_generator(nr):
       if data_width <= bus_width:  break
       if random.random() < 0.25:  break
     length = random.choice(lengths)
-    addr_base = random.choice(range(0,1024,bus_width))
-    addr_offset = random.choice(range(bus_width)+[0]*(bus_width/2))
+    addr_base = random.choice(list(range(0,1024,bus_width)))
+    addr_offset = random.choice(list(range(bus_width))+[0]*(bus_width/2))
     txn = transaction(
       bus_width = bus_width,
       data_width = data_width,