示例#1
0
    def do(self):
        class TimeoutException(Exception):
            pass

        if self.timeout:
            logging.info('CheckUnrealTask: setting timeout to %i' %
                         self.timeout)

            def signal_handler(sig, _):
                if sig == signal.SIGALRM:
                    raise TimeoutException("CheckUnrealTask: timeout reached")

            signal.signal(signal.SIGALRM, signal_handler)
            signal.alarm(self.timeout)

        solver = Z3InteractiveViaPipes(Z3_PATH)
        try:
            return elli.check_unreal(self.ltl_text, self.part_text,
                                     self.is_moore,
                                     translator_via_spot.LTLToAtmViaSpot(),
                                     solver, self.max_k, self.min_size,
                                     self.max_size, 0)
        except TimeoutException:
            return None
        finally:
            solver.die()
示例#2
0
 def do(self):
     solver = Z3InteractiveViaPipes(Z3_PATH)
     try:
         return elli.check_real(self.ltl_text, self.part_text,
                                self.is_moore,
                                translator_via_spot.LTLToAtmViaSpot(),
                                solver, self.max_k, self.min_size,
                                self.max_size, 0)
     finally:
         solver.die()
示例#3
0
                        help='start from size')
    parser.add_argument('--maxsize', metavar='maxsize', type=int, default=4, required=False,
                        help='stop at this size')

    parser.add_argument('-v', '--verbose', action='count', default=0)

    args = parser.parse_args()
    assert args.minsize <= args.maxsize

    logger = setup_logging(args.verbose)
    logger.info(args)

    with tempfile.NamedTemporaryFile(dir='./') as smt_file:
        smt_files_prefix = smt_file.name

    ltl_to_automaton = translator_via_spot.LTLToAtmViaSpot()

    solver_factory = Z3SolverFactory(smt_files_prefix,
                                     Z3_PATH,  # we don't really need this
                                     False,
                                     True,
                                     True)

    elli.check_real(readfile(args.spec),
                    readfile(args.spec.replace('.ltl', '.part')),
                    args.moore,
                    ltl_to_automaton, solver_factory.create(),
                    0,
                    args.minsize, args.maxsize)
    solver_factory.down_solvers()
    exit(0)
示例#4
0
def main():
    """ :return: 1 if model is found, 0 otherwise """
    parser = argparse.ArgumentParser(
        description='Bounded Synthesizer for CTL*',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)

    parser.add_argument('spec',
                        metavar='spec',
                        type=str,
                        help='the specification file (in python format)')

    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        '--bound',
        metavar='bound',
        type=int,
        default=128,
        required=False,
        help=
        'upper bound on the size of the model (for unreal this specifies size of env model)'
    )
    group.add_argument(
        '--size',
        metavar='size',
        type=int,
        default=0,
        required=False,
        help=
        'search the model of this size (for unreal this specifies size of env model)'
    )

    group = parser.add_mutually_exclusive_group()
    group.add_argument('--direct',
                       action='store_true',
                       default=True,
                       dest='direct',
                       help='use direct encoding')
    group.add_argument('--aht',
                       action='store_false',
                       default=False,
                       dest='direct',
                       help='encode via AHT')

    parser.add_argument('--incr',
                        action='store_true',
                        required=False,
                        default=False,
                        help='use incremental solving')
    parser.add_argument('--tmp',
                        action='store_true',
                        required=False,
                        default=False,
                        help='keep temporary smt2 files')
    parser.add_argument('--dot',
                        metavar='dot',
                        type=str,
                        required=False,
                        help='write the output into a dot graph file')
    parser.add_argument('--aiger',
                        metavar='aiger',
                        type=str,
                        required=False,
                        help='write the output into an AIGER format')
    parser.add_argument('--log',
                        metavar='log',
                        type=str,
                        required=False,
                        default=None,
                        help='name of the log file')
    parser.add_argument('-v', '--verbose', action='count', default=0)

    args = parser.parse_args()

    setup_logging(args.verbose, args.log)
    logging.info(args)

    if args.incr and args.tmp:
        logging.warning(
            "--tmp --incr: incremental queries do not produce smt2 files, "
            "so I won't save any temporal files.")

    with tempfile.NamedTemporaryFile(dir='./') as smt_file:
        smt_files_prefix = smt_file.name

    ltl_to_atm = translator_via_spot.LTLToAtmViaSpot()
    solver_factory = Z3SolverFactory(smt_files_prefix, Z3_PATH, args.incr,
                                     False, not args.tmp)

    if args.size == 0:
        min_size, max_size = 1, args.bound
    else:
        min_size, max_size = args.size, args.size

    spec = parse_python_spec(args.spec)
    model = check_real(spec, min_size, max_size, ltl_to_atm, solver_factory,
                       args.direct)

    logging.info('{status} model for {who}'.format(
        status=('FOUND', 'NOT FOUND')[model is None], who='sys'))
    if model:
        dot_model_str = lts_to_dot(model, ARG_MODEL_STATE, False)

        if args.dot:
            with open(args.dot, 'w') as out:
                out.write(dot_model_str)
                logging.info(
                    'Moore model is written to {file}'.format(file=out.name))
        else:
            logging.info(dot_model_str)

        if args.aiger:
            with open(args.aiger, 'w') as aiger_out:
                aiger_out.write(lts_to_aiger(model))

    solver_factory.down_solvers()

    return UNKNOWN if model is None else REALIZABLE