Exemplo n.º 1
0
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
Exemplo n.º 2
0
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) + ')'
Exemplo n.º 3
0
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) + ')'
Exemplo n.º 4
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()))]

        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]
Exemplo n.º 5
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)
Exemplo n.º 6
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)
Exemplo n.º 7
0
    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