コード例 #1
0
ファイル: generator.py プロジェクト: jirikuncar/eelap
def main():
    """
    EELAP generator command line interface.

    .. program-output:: eelap_generator -h

    """
    # python -m 'eelap.generator' -h | fold -w 60
    parser = argparse.ArgumentParser(description='System generator for EELAP.',
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('-v', '--verbose',
                        action='store_true', default=False,
                        help="verbose output")

    subparsers = parser.add_subparsers(help='Actions', dest='action')
    import_parser = subparsers.add_parser('import',
                                          help='Import existing system file')
    import_parser.add_argument('input', nargs='?', type=argparse.FileType('r'),
                               default=sys.stdin)

    generator_group = subparsers.add_parser('generate',
                                            help='Random system generator options')
    generator_group.add_argument('-P', '--payback',
                                 action='store_true', default=False,
                                 help="overrun calculation with or without payback")
    generator_group.add_argument('-u', type=float, dest='utilization', default=0.4,
                                 help='system utilization (0.0,1.0)')
    generator_group.add_argument('-s', type=int, dest='systems', default=1,
                                 help='an integer for number of systems')
    generator_group.add_argument('-r', '--resolution', type=int, dest='resolution',
                                 default=1000, help='simulation resolution')
    generator_group.add_argument('-mc', type=int, dest='minComps', default=1,
                                 help='minimal number of components per system')
    generator_group.add_argument('-Mc', type=int, dest='maxComps', default=2,
                                 help='maximal number of components per system')
    generator_group.add_argument('-mt', type=int, dest='minTasks', default=1,
                                 help='minimal number of tasks per component')
    generator_group.add_argument('-Mt', type=int, dest='maxTasks', default=2,
                                 help='maximal number of tasks per component')
    generator_group.add_argument('-ls', '--localsched', dest='localsched', default='EDF',
                                 help='component scheduler (local scheduler)')
    generator_group.add_argument('-gs', '--globalsched', dest='globalsched', default='FPS',
                                 help='system scheduler (global scheduler)')
    generator_group.add_argument('-R', type=float, dest='resources', default=0.4,
                                 help='probability that task has shared resource (0.0,1.0)')

    generator_group.add_argument('-mcp', type=float, dest='minCompPeriod', default=0.010,
                                 help='minimal component period')
    generator_group.add_argument('-Mcp', type=float, dest='maxCompPeriod', default=0.080,
                                 help='maximal component period')
    generator_group.add_argument('-mtp', type=float, dest='minTaskPeriod', default=0.020,
                                 help='minimal task period')
    generator_group.add_argument('-Mtp', type=float, dest='maxTaskPeriod', default=0.120,
                                 help='maximal task period')

    parser.add_argument('--reachability',
                        action='store_true', default=False,
                        help="print reachability results")

    cs_group = parser.add_argument_group('Communication Server')

    cs_group.add_argument('--with-communication-server',
                          dest='communication_server',
                          action='store_true', default=False,
                          help="add communication server to copy of each system")

    cs_group.add_argument('-csP', '--communication-server-period',
                          dest='communication_server_period',
                          type=float, default=0.010, metavar='t',
                          help="communication server period")

    cs_group.add_argument('-csQ', '--communication-server-budget',
                          dest='communication_server_budget',
                          type=float, default=0.002, metavar='t',
                          help="communication server budget")

    cs_group.add_argument('-csp', '--communication-server-priority',
                          dest='communication_server_priority',
                          type=int, default=None, metavar='p',
                          help="communication server priority - not specified (None) = highest")

    cs_group.add_argument('-t', '--communication-server-tasks',
                          dest='communication_server_tasks',
                          nargs=4, action='append', metavar=('name', 'P', 'p', 'X'),
                          help="component task definition")

    parser.add_argument('--path', metavar='Ti', type=int, nargs='*',
                        help='define indexes of tasks as a data flow path')

    args = parser.parse_args()

    check_system = lambda system: system.schedulability and \
        all(map(lambda c: c.schedulability, system.components))

    make_task_from_list = lambda (name, P, p, X): dict(name=name,
                                                       period=float(P),
                                                       priority=int(p),
                                                       exetime=float(X))

    tasks = None
    if args.communication_server_tasks:
        tasks = map(make_task_from_list, args.communication_server_tasks)

    def generate_systems():
        for s in range(args.systems):
            for i in range(1000):
                system = rand_system(**vars(args))
                ## assign system data path
                if args.path:
                    system.path = args.path
                ## add communication server to copy of the system
                if args.communication_server:
                    copy_system = add_server(
                        system,
                        component_period=args.communication_server_period,
                        component_priority=args.communication_server_priority,
                        component_budget=args.communication_server_budget,
                        tasks=tasks)

                ## check system and its copy if communication server is added
                if check_system(system) and (not args.communication_server or
                                             check_system(copy_system)):
                    yield system
                    if args.communication_server:
                        yield copy_system
                    break

                if args.verbose:
                    print i, ' ...'

    def create_system_from_xml(input_file):
        """
        Reads system configuration from param:`xml_system`
        and returns cls:`System` instances.
        """
        from lxml import objectify
        root = objectify.fromstring(input_file.read())
        for s in root.iterfind('system'):
            system = System(**dict(s.items()))
            for c in s.iterfind('component'):
                component = Component(**dict(c.items()))
                for t in c.iterfind('task'):
                    task = Task(**dict(t.items()))
                    component.addTask(task)
                system.addComponent(component)
                if args.path:
                    system.path = args.path
            yield system
            if args.communication_server:
                yield add_server(
                    system,
                    component_period=args.communication_server_period,
                    component_priority=args.communication_server_priority,
                    component_budget=args.communication_server_budget,
                    tasks=tasks)

    if args.action == 'generate':
        systems = list(generate_systems())
    else:
        systems = list(create_system_from_xml(args.input))

    print '<root>\n' + '\n'.join(map(str, systems)) + '\n</root>'

    if args.reachability:
        from eelap.analysis import reachability
        map(lambda s: reachability(s, time=360), systems)
コード例 #2
0
ファイル: generator.py プロジェクト: pombredanne/eelap
def main():

    parser = argparse.ArgumentParser(description='System generator for EELAP.',
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-v', '--verbose',
                        action='store_true', default=False,
                        help="verbose output")
    parser.add_argument('-P', '--payback',
                        action='store_true', default=False,
                        help="overrun calculation with or without payback")
    parser.add_argument('-u', type=float, dest='utilization', default=0.4,
                        help='system utilization (0.0,1.0)')
    parser.add_argument('-s', type=int, dest='systems', default=1,
                        help='an integer for number of systems')
    parser.add_argument('-r', '--resolution', type=int, dest='resolution',
                        default=1000, help='simulation resolution')
    parser.add_argument('-mc', type=int, dest='minComps', default=1,
                        help='minimal number of components per system')
    parser.add_argument('-Mc', type=int, dest='maxComps', default=2,
                        help='maximal number of components per system')
    parser.add_argument('-mt', type=int, dest='minTasks', default=1,
                        help='minimal number of tasks per component')
    parser.add_argument('-Mt', type=int, dest='maxTasks', default=2,
                        help='maximal number of tasks per component')
    parser.add_argument('-ls', '--localsched', dest='localsched', default='EDF',
                        help='component scheduler (local scheduler)')
    parser.add_argument('-gs', '--globalsched', dest='globalsched', default='FPS',
                        help='system scheduler (global scheduler)')
    parser.add_argument('-R', type=float, dest='resources', default=0.4,
                        help='probability that task has shared resource (0.0,1.0)')

    parser.add_argument('-mcp', type=float, dest='minCompPeriod', default=0.010,
                        help='minimal component period')
    parser.add_argument('-Mcp', type=float, dest='maxCompPeriod', default=0.080,
                        help='maximal component period')
    parser.add_argument('-mtp', type=float, dest='minTaskPeriod', default=0.020,
                        help='minimal task period')
    parser.add_argument('-Mtp', type=float, dest='maxTaskPeriod', default=0.120,
                        help='maximal task period')

    parser.add_argument('--reachability',
                        action='store_true', default=False,
                        help="print reachability results")

    cs_group = parser.add_argument_group('Communication Server')

    cs_group.add_argument('--with-communication-server',
                          dest='communication_server',
                          action='store_true', default=False,
                          help="add communication server to copy of each system")

    cs_group.add_argument('-csP', '--communication-server-period',
                          dest='communication_server_period',
                          type=float, default=0.010, metavar='t',
                          help="communication server period")

    cs_group.add_argument('-csQ', '--communication-server-budget',
                          dest='communication_server_budget',
                          type=float, default=0.002, metavar='t',
                          help="communication server budget")

    cs_group.add_argument('-csp', '--communication-server-priority',
                          dest='communication_server_priority',
                          type=int, default=None, metavar='p',
                          help="communication server priority - not specified (None) = highest")

    cs_group.add_argument('-t', '--communication-server-tasks',
                          dest='communication_server_tasks',
                          nargs=4, action='append', metavar=('name', 'P', 'p', 'X'),
                          help="component task definition")

    parser.add_argument('--path', metavar='Ti', type=int, nargs='*',
                        help='define indexes of tasks as a data flow path')

    args = parser.parse_args()

    check_system = lambda system: system.schedulability and \
        all(map(lambda c: c.schedulability, system.components))

    make_task_from_list = lambda (name, P, p, X): dict(name=name,
                                                       period=float(P),
                                                       priority=int(p),
                                                       exetime=float(X))

    tasks = None
    if args.communication_server_tasks:
        tasks = map(make_task_from_list, args.communication_server_tasks)

    def generate_systems():
        for s in range(args.systems):
            for i in range(1000):
                system = rand_system(**vars(args))
                ## assign system data path
                if args.path:
                    system.path = args.path
                ## add communication server to copy of the system
                if args.communication_server:
                    copy_system = add_server(
                        system,
                        component_period=args.communication_server_period,
                        component_priority=args.communication_server_priority,
                        component_budget=args.communication_server_budget,
                        tasks=tasks)

                ## check system and its copy if communication server is added
                if check_system(system) and (not args.communication_server or
                                             check_system(copy_system)):
                    yield system
                    if args.communication_server:
                        yield copy_system
                    break

                if args.verbose:
                    print i, ' ...'

    systems = list(generate_systems())

    print '<root>\n' + '\n'.join(map(str, systems)) + '\n</root>'

    if args.reachability:
        from eelap.analysis import reachability
        map(lambda s: reachability(s, time=1000), systems)