Ejemplo n.º 1
0
    def _parse_value(self, str_v):
        if not hasattr(self, 'node_by_smt_value'):  # aka static method of the field
            self.node_by_smt_value = dict()
            self.node_by_smt_value.update((smt_name_spec(s, TYPE_A_STATE), s)
                                         for s in self.automaton.nodes)

        if str_v in self.node_by_smt_value:
            return self.node_by_smt_value[str_v]
        if str_v in ['false', 'true']:
            return str_v == 'true'
        return smt_unname_m(str_v)
Ejemplo n.º 2
0
    def _build_func_model_from_smt(self, func_smt_lines, func_desc:FuncDesc) -> dict:
        """
        Return graph for the transition (or output) function: {label:output}.
        For label's keys are used:
        - for inputs/outputs: original signals
        - for LTS states: ARG_MODEL_STATE
        """
        func_model = {}
        signals = set(list(self.inputs) + list(self.descr_by_output.keys()))

        for l in func_smt_lines:
            #            (get-value ((tau t0 true true)))
            l = l.replace('get-value', '').replace('(', '').replace(')', '')
            tokens = l.split()

            func_name = tokens[0]
            arg_values_raw = lmap(self._parse_value, tokens[1:-1])
            return_value_raw = tokens[-1]

            if func_name != func_desc.name:
                continue

            smt_args = func_desc.get_args_dict(arg_values_raw)

            args_label = Label(dict((smt_unname_if_signal(var, signals), val)
                                    for var, val in smt_args.items()))

            if func_desc.output_ty == TYPE_MODEL_STATE:
                return_value = smt_unname_m(return_value_raw)
            else:
                assert func_desc.output_ty == self.solver.TYPE_BOOL(), func_desc.output_ty
                assert return_value_raw.strip() == return_value_raw  # TODO: remove after debugging phase
                return_value = (return_value_raw == self.solver.get_true())

            func_model[args_label] = return_value

        return func_model