test/gen_config: review/cleanup.

This commit is contained in:
Florent Kermarrec 2020-03-26 11:04:19 +01:00
parent 2bb8f8fd22
commit 265e79f2aa
1 changed files with 72 additions and 71 deletions

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
import sys import sys
import json import json
@ -9,96 +9,97 @@ import itertools
defaults = { defaults = {
'--sdram-module': [ "--sdram-module": [
'IS42S16160', "IS42S16160",
'IS42S16320', "IS42S16320",
'MT48LC4M16', "MT48LC4M16",
'MT48LC16M16', "MT48LC16M16",
'AS4C16M16', "AS4C16M16",
'AS4C32M16', "AS4C32M16",
'AS4C32M8', "AS4C32M8",
'M12L64322A', "M12L64322A",
'M12L16161A', "M12L16161A",
'MT46V32M16', "MT46V32M16",
'MT46H32M16', "MT46H32M16",
'MT46H32M32', "MT46H32M32",
'MT47H128M8', "MT47H128M8",
'MT47H32M16', "MT47H32M16",
'MT47H64M16', "MT47H64M16",
'P3R1GE4JGF', "P3R1GE4JGF",
'MT41K64M16', "MT41K64M16",
'MT41J128M16', "MT41J128M16",
'MT41K128M16', "MT41K128M16",
'MT41J256M16', "MT41J256M16",
'MT41K256M16', "MT41K256M16",
'K4B1G0446F', "K4B1G0446F",
'K4B2G1646F', "K4B2G1646F",
'H5TC4G63CFR', "H5TC4G63CFR",
'IS43TR16128B', "IS43TR16128B",
'MT8JTF12864', "MT8JTF12864",
'MT8KTF51264', "MT8KTF51264",
# 'MT18KSF1G72HZ', #"MT18KSF1G72HZ",
# 'AS4C256M16D3A', #"AS4C256M16D3A",
# 'MT16KTF1G64HZ', #"MT16KTF1G64HZ",
# 'EDY4016A', #"EDY4016A",
# 'MT40A1G8', #"MT40A1G8",
# 'MT40A512M16', #"MT40A512M16",
], ],
'--sdram-data-width': [32], "--sdram-data-width": [32],
'--bist-alternating': [True, False], "--bist-alternating": [True, False],
'--bist-length': [1, 4096], "--bist-length": [1, 4096],
'--bist-random': [True, False], "--bist-random": [True, False],
'--num-generators': [1], "--num-generators": [1],
'--num-checkers': [1], "--num-checkers": [1],
'--access-pattern': ['access_pattern.csv'] "--access-pattern": ["access_pattern.csv"]
} }
def convert_string_arg(args, arg, type): def convert_string_arg(args, arg, type):
map_func = { map_func = {
bool: lambda s: {'false': False, 'true': True}[s.lower()], bool: lambda s: {"false": False, "true": True}[s.lower()],
int: lambda s: int(s, 0), int: lambda s: int(s, 0),
} }
setattr(args, arg, [map_func[type](val) if not isinstance(val, type) else val for val in getattr(args, arg)]) setattr(args, arg, [map_func[type](val) if not isinstance(val, type) else val for val in getattr(args, arg)])
def generate_header(args): def generate_header(args):
header = 'Auto-generated on {} by {}'.format( header = "Auto-generated on {} by {}".format(
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
sys.argv[0], sys.argv[0],
) )
args_str = pprint.pformat(vars(args), sort_dicts=False) #args_str = pprint.pformat(vars(args), sort_dicts=False) # FIXME: python3.7 specific?
arg_lines = args_str.split('\n') args_str = pprint.pformat(vars(args))
lines = [60*'=', header, 60*'-', *arg_lines, 60*'='] arg_lines = args_str.split("\n")
return '\n'.join('# ' + line for line in lines) lines = [60*"=", header, 60*"-", *arg_lines, 60*"="]
return "\n".join("# " + line for line in lines)
def main(): def main():
parser = argparse.ArgumentParser(description='Generate configuration for all possible argument combinations.', parser = argparse.ArgumentParser(description="Generate configuration for all possible argument combinations.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter) formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--name-format', default='test_%d', help='Name format for i-th test') parser.add_argument("--name-format", default="test_%d", help="Name format for i-th test")
for name, default in defaults.items(): for name, default in defaults.items():
parser.add_argument(name, nargs='+', default=default, help='%s options' % name) parser.add_argument(name, nargs="+", default=default, help="%s options" % name)
args = parser.parse_args() args = parser.parse_args()
# make sure not to write those as strings # Make sure not to write those as strings
convert_string_arg(args, 'sdram_data_width', int) convert_string_arg(args, "sdram_data_width", int)
convert_string_arg(args, 'bist_alternating', bool) convert_string_arg(args, "bist_alternating", bool)
convert_string_arg(args, 'bist_length', int) convert_string_arg(args, "bist_length", int)
convert_string_arg(args, 'bist_random', bool) convert_string_arg(args, "bist_random", bool)
convert_string_arg(args, 'num_generators', int) convert_string_arg(args, "num_generators", int)
convert_string_arg(args, 'num_checkers', int) convert_string_arg(args, "num_checkers", int)
common_args = ('sdram_module', 'sdram_data_width', 'bist_alternating', 'num_generators', 'num_checkers') common_args = ("sdram_module", "sdram_data_width", "bist_alternating", "num_generators", "num_checkers")
generated_pattern_args = ('bist_length', 'bist_random') generated_pattern_args = ("bist_length", "bist_random")
custom_pattern_args = ('access_pattern', ) custom_pattern_args = ("access_pattern", )
def generated_pattern_configuration(values): def generated_pattern_configuration(values):
config = dict(zip(common_args + generated_pattern_args, values)) config = dict(zip(common_args + generated_pattern_args, values))
# move access pattern parameters deeper # Move access pattern parameters deeper
config['access_pattern'] = { config["access_pattern"] = {
'bist_length': config.pop('bist_length'), "bist_length": config.pop("bist_length"),
'bist_random': config.pop('bist_random'), "bist_random": config.pop("bist_random"),
} }
return config return config
@ -106,24 +107,24 @@ def main():
config = dict(zip(common_args + custom_pattern_args, values)) config = dict(zip(common_args + custom_pattern_args, values))
# "rename" --access-pattern to access_pattern.pattern_file due to name difference between # "rename" --access-pattern to access_pattern.pattern_file due to name difference between
# command line args and run_benchmarks.py configuration format # command line args and run_benchmarks.py configuration format
config['access_pattern'] = { config["access_pattern"] = {
'pattern_file': config.pop('access_pattern'), "pattern_file": config.pop("access_pattern"),
} }
return config return config
# iterator over the product of given command line arguments # Iterator over the product of given command line arguments
def args_product(names): def args_product(names):
return itertools.product(*(getattr(args, name) for name in names)) return itertools.product(*(getattr(args, name) for name in names))
generated_pattern_iter = zip(itertools.repeat(generated_pattern_configuration), args_product(common_args + generated_pattern_args)) generated_pattern_iter = zip(itertools.repeat(generated_pattern_configuration), args_product(common_args + generated_pattern_args))
custom_pattern_iter = zip(itertools.repeat(custom_pattern_configuration), args_product(common_args + custom_pattern_args)) custom_pattern_iter = zip(itertools.repeat(custom_pattern_configuration), args_product(common_args + custom_pattern_args))
i = 0 i = 0
configurations = {} configurations = {}
for config_generator, values in itertools.chain(generated_pattern_iter, custom_pattern_iter): for config_generator, values in itertools.chain(generated_pattern_iter, custom_pattern_iter):
config = config_generator(values) config = config_generator(values)
# ignore unsupported case: bist_random=True and bist_alternating=False # Ignore unsupported case: bist_random=True and bist_alternating=False
if config['access_pattern'].get('bist_random', False) and not config['bist_alternating']: if config["access_pattern"].get("bist_random", False) and not config["bist_alternating"]:
continue continue
configurations[args.name_format % i] = config configurations[args.name_format % i] = config
i += 1 i += 1