From 5c3e29185af5998a9fbab4d7072f021308a1e3b3 Mon Sep 17 00:00:00 2001 From: Tobias Langer Date: Wed, 5 Oct 2016 09:02:04 +0200 Subject: [PATCH] Initial commit. --- generate.py | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ taskset_template.json | 10 ++++++++++ 2 files changed, 135 insertions(+) create mode 100644 generate.py create mode 100644 taskset_template.json diff --git a/generate.py b/generate.py new file mode 100644 index 0000000..1de847a --- /dev/null +++ b/generate.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3.4 + +""" +This utility script helps in the creation of experiment setups. It therefore +reads experiment descriptions from json files and creates everything necessary +as a result. + +It therefore performs the following actions: +* [x] Read the json file of every experiment +* [x] Create folders for every experiment +* [ ] Create the header file for every experiment +* [x] Add the make file for every experiment +* [x] Add c++ file for every experiment +""" + +import sys +import os +import argparse +import shutil +import json + +header = './template/header' +makefile = './template/Makefile' +cpp = './template/cpp' + +def query_yes_no(question, default=None): + """ + Queries the user for a decision. + """ + + if default is None: + prompt = ' [y/n]' + elif default.lower() is 'yes': + prompt = ' [Y/n]' + elif default.lower() is 'no': + prompt = ' [y/N]' + else: + raise ValueError('Invalid default answer {}'.format(default)) + + while True: + print(question, prompt) + choice = input().lower() + if 'yes'.find(choice) == 0: + return True + elif 'no'.find(choice) == 0: + return False + +def create_dir(filename): + """ + Create the directory denoted by filename, if it doesn't exists. Ask for its + removal if it exists. + """ + cwd = os.getcwd() + path = os.path.join(cwd, filename) + + try: + os.makedirs(path) + except FileExistsError: + if not query_yes_no('Folder exists, remove?', default='yes'): + return False + shutil.rmtree(path) + os.makedirs(path) + return True + +def copy_files(makefile, codefile, destination): + """ + Populate the experiments directory with Makefile and Codefile. + """ + cwd = os.getcwd() + target = os.path.join(cwd, destination) + + makefile_path = os.path.join(cwd, makefile) + shutil.copyfile(makefile_path, os.path.join(target, 'Makefile')) + codefile_path = os.path.join(cwd, destination) + shutil.copyfile(codefile_path, os.path.join(target, 'experiment.cpp')) + +def create_header(headerfile, tasks, destination): + """ + Create a header file for the experiment. + """ + pass + +def main(): + """ + Starting point of the script, parses arguments and creates the experiments. + """ + + parser = argparse.ArgumentParser(description='Generate experiment data.') + parser.add_argument('description', type=str, nargs='+', help='file containing the taskset description.') + parser.add_argument('header', type=str, nargs='?', default='./template/config.h', help='path to optional custom header file.') + parser.add_argument('makefile', type=str, nargs='?', default='./template/Makefile', help='path to optional custom makefile.') + parser.add_argument('cpp', type=str, nargs='?', default='./template/experiment.cpp', help='path to optional custom c++ implementation.') + + args = parser.parse_args() + for num, experiment_file in enumerate(args.description): + with open(experiment_file, 'r') as experiment_description: + descr_json = experiment_description.read() + experiment = json.loads(descr_json) + + print('[{}/{}] Creating experiment {}:'.format(num, + len(args.description), + experiment['name']), + file=sys.stderr) + + # Create folder + print('create folder') + if not create_dir(experiment['name']): + print('Skipping experiment ', experiment['name'], file=sys.stderr) + continue + + # Read tasks + tasks = [] + + # Add header + print('create header file') + create_header(parser.header, tasks, experiment['name']) + + # Add makefile & c++ file + print('add Makefile') + print('add C++ file') + + copy_files(args.makefile, args.cpp, experiment['name']) + +if __name__ == '__main__': + main() diff --git a/taskset_template.json b/taskset_template.json new file mode 100644 index 0000000..dad9221 --- /dev/null +++ b/taskset_template.json @@ -0,0 +1,10 @@ +{ + "tasks" : [ + { + "wcet" : 5, + "period" : 10, + "deadline" : 15, + "periodical" : true + } + ] +} -- libgit2 0.26.0