Ejemplo n.º 1
0
def main(argv):
    parser = argparse.ArgumentParser(description='Sequential Benchmarking SMT Solver.')

    #should precede arguments with var nargs
    parser.add_argument('klee_query_file',
                        type=str,
                        help='file with a query in klee format')

    parser.add_argument('-smtconverter',
                        type=str,
                        required=True,
                        help='converter command: smt2->smt1 format')

    parser.add_argument('-kleeconverter',
                        type=str,
                        required=True,
                        help='converter command: klee->smt2 format')

    parser.add_argument('-timeout',
                        metavar='timeout',
                        type=float,
                        default=120,
                        nargs= "?",
                        help='time limit(sec) for each solver (default: %(default)i)')

    add_solvers_args_to_parser(parser)

    args = parser.parse_args(argv)

    timeout = args.timeout

    with open(args.klee_query_file) as f:
        klee_query = f.read()

    #create converter
    klee_to_smt2 = CmdLineConverter(args.kleeconverter.split(' ')[0], args.kleeconverter.split(' ')[1:])
    smt2_to_smt1 = CmdLineConverter(args.smtconverter.split(' ')[0], args.smtconverter.split(' ')[1:])
    klee_to_smt1 = KleeToSmt1Converter(klee_to_smt2, smt2_to_smt1)

    #create solvers
    z3_solvers = create_solvers(lambda: Z3StatsAwareParser(Z3Parser()), 'Z3', args.z3_solvers)
    stp_solvers = create_solvers(lambda: STPStatsAwareParser(STPParser()), 'STP', args.stp_solvers)
    boolector_solvers = create_solvers(lambda: BoolectorStatsAwareParser(BoolectorParser()), 'Boolector',
                                       args.boolector_solvers)
    timed_solvers = [TimedSolverWrapper(s, timeout) for s in z3_solvers+stp_solvers+boolector_solvers]
    assert len(timed_solvers) > 0, 'no solvers supplied'

    solver = SequentialBenchmarkingSolver(timed_solvers)

    #convert, solve
    try:
        smt1_query = klee_to_smt1.convert(klee_query)
        results = solver.solve(UniqueQuery(123, smt1_query))
        for s in results.stats:
            print str(s), ": ", str(results.stats[s])

    except ConversionException, e:
        print("couldn't parse a query: ", e)
Ejemplo n.º 2
0
def main(argv):
    global ev_stop
    ev_stop = gevent.event.Event()
    gevent.signal(signal.SIGINT, sigint_handler)
    signal.signal(signal.SIGINT, sigint_handler)
    gevent.spawn(work_around_infinite_wait)

    #TODO: add sanity validations of input: port number, etc.
    parser = argparse.ArgumentParser(description='SMT Solver Server.')
    parser.add_argument('-p', dest = 'port', type=int, default=12345,
                        help='listening port (default: %(default)i)')

    parser.add_argument('-timeout', dest = 'timeout', type=int, default=360,
                        help='solving timeout(sec.) for a query (benchmarking mode only) (default: %(default)i)')

    parser.add_argument('-smtconverter',
                        type=str,
                        required=True,
                        help='converter command: smt2->smt1 format')

    parser.add_argument('-kleeconverter',
                        type=str,
                        required=True,
                        help='converter command: klee->smt2 format')

    add_solvers_args_to_parser(parser)

    args = parser.parse_args(argv)

    port = args.port

    sync_solvers = create_solvers_from_args(args)
    print "Created {0} solvers to feed PortfolioSolver".format(len(sync_solvers))
    if not sync_solvers:
        print 'Provide input solvers.'
        return

    sync_solver = PortfolioSolver([AsyncSolverWrapper(s) for s in sync_solvers])

    klee_to_smt2 = CmdLineConverter(args.kleeconverter.split(' ')[0], args.kleeconverter.split(' ')[1:])
    smt2_to_smt1 = CmdLineConverter(args.smtconverter.split(' ')[0], args.smtconverter.split(' ')[1:])
    klee_to_smt1 = KleeToSmt1Converter(klee_to_smt2, smt2_to_smt1)

    solver = AsyncSolverWrapper(QueryConvertingWrapper(klee_to_smt1, SyncSolverWrapper(sync_solver)))

    cmd_channel = TcpCmdChannel("localhost", port)
    man = Manager(solver, cmd_channel)

    man.start(ev_stop) #blocking