def parse_acacia_and_build_expr(ltl_text:str, part_text:str, ltl_to_atm:LTLToAutomaton, strengthen_lvl) -> Spec: """ Note: parses and strengthens the formula. """ input_signals, output_signals, data_by_unit = acacia_parser.parse(ltl_text, part_text) assert data_by_unit is not None ltl_properties = [] for (unit_name, unit_data) in data_by_unit.items(): assumptions = unit_data[0] guarantees = unit_data[1] a_safeties, a_livenesses = split_safety_liveness(assumptions, ltl_to_atm) g_safeties, g_livenesses = split_safety_liveness(guarantees, ltl_to_atm) if strengthen_lvl == 2: ltl_property = strengthen2([], [], a_safeties, g_safeties, a_livenesses, g_livenesses) elif strengthen_lvl == 1: ltl_property = strengthen1([], [], a_safeties, g_safeties, a_livenesses, g_livenesses) else: ltl_property = and_expr(list(a_safeties) + list(a_livenesses))\ >> and_expr(list(g_safeties) + list(g_livenesses)) ltl_properties.append(ltl_property) return Spec(input_signals, output_signals, and_expr(ltl_properties))
def _get_acacia_spec(ltl_text:str, part_text:str, logger:logging.Logger) -> (list, list, SpecProperty): input_signals, output_signals, data_by_name = acacia_parser.parse(ltl_text, part_text, logger) if data_by_name is None: return None, None, None spec_properties = [] for (unit_name, unit_data) in data_by_name.items(): assumptions = unit_data[0] guarantees = unit_data[1] spec_properties.append(SpecProperty(assumptions, guarantees)) spec_property = and_properties(spec_properties) return input_signals, output_signals, spec_property
def _get_acacia_spec(ltl_text: str, part_text: str, logger: logging.Logger) -> (list, list, SpecProperty): input_signals, output_signals, data_by_name = acacia_parser.parse( ltl_text, part_text, logger) if data_by_name is None: return None, None, None spec_properties = [] for (unit_name, unit_data) in data_by_name.items(): assumptions = unit_data[0] guarantees = unit_data[1] spec_properties.append(SpecProperty(assumptions, guarantees)) spec_property = and_properties(spec_properties) return input_signals, output_signals, spec_property
root.append(ltl_node) def _get_doctype(): return '<!DOCTYPE SynthesisProblem SYSTEM "./SynSpec.dtd">\n' if __name__ == '__main__': if len(sys.argv) != 2: print('Missing arguments. \n{me} <acacia_ltl>'.format(me=__file__)) exit(0) ltl_text = open(sys.argv[1]).read() part_text = open(sys.argv[1].replace('.ltl', '.part')).read() input_signals, output_signals, data_by_name = acacia_parser.parse(ltl_text, part_text, logging.getLogger()) root = ET.Element('SynthesisProblem') ET.SubElement(root, 'Title') ET.SubElement(root, 'Description') path_to_ltl = ET.SubElement(root, 'PathToLTLCompiler') path_to_ltl.text = 'hoho!' # unbeast cannot handle an empty path #: :type: Element inputs_element = ET.SubElement(root, 'GlobalInputs') _define_signals(input_signals, inputs_element) outputs_element = ET.SubElement(root, 'GlobalOutputs') _define_signals(output_signals, outputs_element) all_assumptions = set()