From 9e57e4e89d3c6b6d7e0f0f182bfd01c5585c16c5 Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Mon, 5 Dec 2016 16:48:31 -0500 Subject: config: Add an option to generate a random topology in memcheck This change adds the option to use the memcheck with random memory hierarchies at the moment limited to a maximum depth of 3 allowing testing with uncommon topologies. Change-Id: Id2c2fe82a8175d9a67eb4cd7f3d2e2720a809b60 Reviewed-by: Andreas Hansson --- configs/example/memcheck.py | 57 +++++++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/configs/example/memcheck.py b/configs/example/memcheck.py index 25ac06254..7ef413389 100644 --- a/configs/example/memcheck.py +++ b/configs/example/memcheck.py @@ -40,6 +40,7 @@ # Andreas Hansson import optparse +import random import sys import m5 @@ -97,6 +98,8 @@ parser.add_option("-t", "--testers", type="string", default="1:0:2", help="Colon-separated tester hierarchy specification, " "see script comments for details " "[default: %default]") +parser.add_option("-r", "--random", action="store_true", + help="Generate a random tree topology") parser.add_option("--sys-clock", action="store", type="string", default='1GHz', help = """Top-level clock for blocks running at system @@ -110,35 +113,43 @@ if args: # Start by parsing the command line options and do some basic sanity # checking -try: - cachespec = [int(x) for x in options.caches.split(':')] - testerspec = [int(x) for x in options.testers.split(':')] -except: - print "Error: Unable to parse caches or testers option" - sys.exit(1) - -if len(cachespec) < 1: - print "Error: Must have at least one level of caches" - sys.exit(1) - -if len(cachespec) != len(testerspec) - 1: - print "Error: Testers must have one element more than caches" - sys.exit(1) +if options.random: + # Generate a tree with a valid number of testers + tree_depth = random.randint(1, 4) + cachespec = [random.randint(1, 3) for i in range(tree_depth)] + testerspec = [random.randint(1, 3) for i in range(tree_depth + 1)] + print "Generated random tree -c", ':'.join(map(str, cachespec)), \ + "-t", ':'.join(map(str, testerspec)) +else: + try: + cachespec = [int(x) for x in options.caches.split(':')] + testerspec = [int(x) for x in options.testers.split(':')] + except: + print "Error: Unable to parse caches or testers option" + sys.exit(1) -if testerspec[-1] == 0: - print "Error: Must have testers at the uppermost level" - sys.exit(1) + if len(cachespec) < 1: + print "Error: Must have at least one level of caches" + sys.exit(1) -for t in testerspec: - if t < 0: - print "Error: Cannot have a negative number of testers" + if len(cachespec) != len(testerspec) - 1: + print "Error: Testers must have one element more than caches" sys.exit(1) -for c in cachespec: - if c < 1: - print "Error: Must have 1 or more caches at each level" + if testerspec[-1] == 0: + print "Error: Must have testers at the uppermost level" sys.exit(1) + for t in testerspec: + if t < 0: + print "Error: Cannot have a negative number of testers" + sys.exit(1) + + for c in cachespec: + if c < 1: + print "Error: Must have 1 or more caches at each level" + sys.exit(1) + # Determine the tester multiplier for each level as the string # elements are per subsystem and it fans out multiplier = [1] -- cgit v1.2.3