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)
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