def main(tlsf_file_name, output_file_name, dot_file_name, smt_files_prefix, keep_temp_files) -> int: """ :return: REALIZABLE, UNREALIZABLE, UNKNOWN (see elli) """ timer = Timer() logic = UFLRA() ltl3ba, solver_factory = create_spec_converter_z3(logic, True, False, smt_files_prefix, not keep_temp_files) ltl_text, part_text = convert_tlsf_to_acacia(tlsf_file_name) is_moore = get_spec_type(tlsf_file_name) try: timer.sec_restart() env_model = elli.check_unreal( ltl_text, part_text, is_moore, ltl3ba, solver_factory, 1, 1, ltl3ba_timeout_sec=200 ) logging.info("unreal check took (sec): %i" % timer.sec_restart()) logging.info("env model is {NOT} FOUND".format(NOT="" if env_model else "NOT")) if env_model: print("UNREALIZABLE") logging.debug(lts_to_dot(env_model, ARG_MODEL_STATE, is_moore)) return UNREALIZABLE except subprocess.TimeoutExpired: logging.info("I aborted unreal check (>200sec). Proceed to real check.") model = elli.check_real(ltl_text, part_text, is_moore, ltl3ba, solver_factory, 1, 40) logging.info("real check took (sec): %i" % timer.sec_restart()) logging.info("sys model is {NOT} FOUND".format(NOT="" if model else "NOT")) if not model: logging.info("trying check_real without formula strengthening") model = elli.check_real(ltl_text, part_text, is_moore, ltl3ba, solver_factory, 1, 40, opt_level=0) logging.info("(without formula strengthening): real check took (sec): %i" % timer.sec_restart()) logging.info("(without formula strengthening): sys model is {NOT} FOUND".format(NOT="" if model else "NOT")) if not model: return UNKNOWN dot_model_str = lts_to_dot(model, ARG_MODEL_STATE, not is_moore) if dot_file_name: with open(dot_file_name, "w") as out: out.write(dot_model_str) logging.info( "{model_type} model is written to {file}".format(model_type=["Mealy", "Moore"][is_moore], file=out.name) ) else: logging.info(dot_model_str) aiger_model_str = lts_to_aiger(model) logging.info("circuit size: %i" % len(model.states)) if output_file_name: with open(output_file_name, "w") as out: out.write(aiger_model_str) else: print("REALIZABLE") print(aiger_model_str) solver_factory.down_solvers() return REALIZABLE
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()
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)
help='assume a Mealy model') parser.add_argument('--minsize', metavar='minsize', type=int, default=1, required=False, 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 ltl3ba, solver_factory = create_spec_converter_z3(UFLRA(), False, True, smt_files_prefix, True) elli.check_real(readfile(args.spec), readfile(args.spec.replace('.ltl', '.part')), args.moore, ltl3ba, solver_factory, args.minsize, args.maxsize) solver_factory.down_solvers() exit(0)