def sim_no_unroll(self, hts, cover, k, all_vars=True, inc=False): init = hts.single_init() invar = hts.single_invar() trans = hts.single_trans() init_0 = self.at_time(init, 0) invar_0 = self.at_time(invar, 0) trans_01 = self.unroll(trans, invar, 1) cover_1 = self.at_time(cover, 1) full_model = {} if all_vars: relevant_vars = hts.vars else: relevant_vars = hts.state_vars | hts.output_vars relevant_vars_0 = [TS.get_timed(v, 0) for v in relevant_vars] relevant_vars_1 = [TS.get_timed(v, 1) for v in relevant_vars] relevant_vars_01 = [(TS.get_timed(v, 0), TS.get_timed(v, 1), v) for v in relevant_vars] self._reset_assertions(self.solver) # Picking Initial State Logger.log("\nSolving for k=0", 1) self._add_assertion(self.solver, And(init_0, invar_0)) if self._solve(self.solver): init_model = self._get_model(self.solver, relevant_vars_0) init_0 = And([EqualsOrIff(v, init_model[v]) for v in relevant_vars_0]) for v in relevant_vars_0: full_model[v] = init_model[v] Logger.msg(".", 0, not(Logger.level(1))) else: return (0, None) self._reset_assertions(self.solver) if inc: self._add_assertion(self.solver, trans_01) self._add_assertion(self.solver, invar_0) init_model = None for t in range(1, k + 1): Logger.log("\nSolving for k=%s"%(t), 1) if not inc: self._reset_assertions(self.solver, True) formula = And(init_0, invar_0) self._add_assertion(self.solver, trans_01) else: formula = init_0 self._push(self.solver) self._add_assertion(self.solver, formula) res_step = self._solve(self.solver) if res_step: Logger.msg(".", 0, not(Logger.level(1))) Logger.log("Able to step forward at k=%s"%(t), 2) if all_vars: init_model = self._get_model(self.solver) else: init_model = self._get_model(self.solver, relevant_vars_1) model = init_model else: Logger.log("System deadlocked at k=%s"%(t), 2) return (-1, full_model) # Use previous model as initial state for next sat call init_0 = [] init_1 = [] for v in relevant_vars_01: if v[1] not in init_model: continue val = init_model[v[1]] full_model[TS.get_timed(v[2], t)] = val init_0.append(EqualsOrIff(v[0], val)) init_1.append(EqualsOrIff(v[1], val)) init_0 = And(init_0) if cover != TRUE(): init_1 = And(init_1) self._add_assertion(self.solver, init_1) self._add_assertion(self.solver, cover_1) res_cont = self._solve(self.solver) if res_cont: Logger.log('Reached cover in no unroll simulation at k=%s'%(t), 2) model = init_model return (t, full_model) else: Logger.log('Cover not reached at k=%s'%t, 2) if inc: self._pop(self.solver) return (t, full_model)