kripkomat/modelbuilder.py

63 lines
1.7 KiB
Python

MODEL = """
------------------------------------------------------------------------
-- Generated using Kripkomat
------------------------------------------------------------------------
MODULE {name}
VAR
state : {{ {states} }};
ASSIGN
init(state) := {initial};
next(state) :=
case
{transitions}
esac;
DEFINE
{properties}
"""
TRAN = " state = {n} : {{{ms}}};"
PROP = """ -- Property "{prop}"
{alias} := {logic};
"""
PROP_LOGIC = "state = {state}"
LTL_FORM = """LTLSPEC
{ltl};
"""
class ModelBuilder:
def __init__(self, states, initial, transitions, properties, ltls=[], name="main"):
self._name = name
self._states = states
self._initial = initial
self._tran = transitions
self._props = properties
self._ltls = ltls
def generate(self):
# build model
states_decl = ",".join(self._states)
transitions = []
for n,ms in self._tran.items():
transition = TRAN.format(n=n, ms=",".join(ms))
transitions.append(transition)
properties = []
for alias,(states,prop) in self._props.items():
logic = " | ".join([PROP_LOGIC.format(state=x) for x in states])
prop_str = PROP.format(prop=prop, alias=alias, logic=logic)
properties.append(prop_str)
out = MODEL.format(name=self._name,
states=states_decl,
initial=self._initial,
transitions="\n".join(transitions),
properties="\n".join(properties))
# add LTL formulas
for ltl in self._ltls:
out += LTL_FORM.format(ltl=ltl)
return out