def _to_expr(l:Label, sig_by_name:dict): expr = sympy.true for sig, val in l.items(): sig_by_name[sig.name] = sig s = sympy.Symbol(str(sig)) expr = (expr & s) if val else (expr & ~s) return expr
def _clause_to_formula(clause: Label, bits_by_state: dict) -> str: literals = [] for (var, value) in clause.items(): if isinstance(var, QuantifiedSignal): lit = ['!', ''][value] + var.name else: lit = _state_to_formula(value, bits_by_state) literals.append(lit) return '(' + ' & '.join(literals) + ')'
def _clause_to_formula(clause:Label, bits_by_state:dict) -> str: literals = [] for (var, value) in clause.items(): if isinstance(var, QuantifiedSignal): lit = ['!', ''][value] + var.name else: lit = _state_to_formula(value, bits_by_state) literals.append(lit) return '(' + ' & '.join(literals) + ')'
def __getitem__(self, key:Label): if not isinstance(key, Label): raise TypeError(key) indices = [v for (l, v) in self._value_by_label if set(l.items()).issubset(set(key.items()))] if len(indices) == 0: raise KeyError(key) assert len(indices) == 1, 'return value is not unique: %s: %s' % (str(key), str(indices)) return indices[0]
def __getitem__(self, key:Label): if not isinstance(key, Label): raise TypeError(key) indices = [v for (l, v) in self._value_by_label if set(l.items()).issubset(set(key.items()))] assert len(indices) == 0 or len(indices) == 1, str(indices) + ', for ' + str(key) if len(indices) == 1: return indices[0] elif len(indices) == 0: raise KeyError(key) else: assert 0, str(key) + ' leads to ambiguity: ' + str(indices)
def __getitem__(self, key: Label): if not isinstance(key, Label): raise TypeError(key) indices = [ v for (l, v) in self._value_by_label if set(l.items()).issubset(set(key.items())) ] assert len(indices) == 0 or len( indices) == 1, str(indices) + ', for ' + str(key) if len(indices) == 1: return indices[0] elif len(indices) == 0: raise KeyError(key) else: assert 0, str(key) + ' leads to ambiguity: ' + str(indices)
def _smt_out(self, label:Label, smt_m:str, q:Node) -> str: conjuncts = [] args_dict = self._build_args_dict(smt_m, label, q) for sig, val in label.items(): if sig not in self.descr_by_output: continue out_desc = self.descr_by_output[sig] condition_on_out = self.solver.call_func(out_desc, args_dict) if val is False: condition_on_out = self.solver.op_not(condition_on_out) conjuncts.append(condition_on_out) condition = self.solver.op_and(conjuncts) return condition