- Minor codebase clean-up - Slight reorganisation of examples + tests so that we don't break stuff by accident - CI tests
72 lines
2.4 KiB
Python
72 lines
2.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Generator for the Mutual Exclusion (Mutex) benchmark.
|
|
|
|
Produces a reaction system modelling N processes competing for
|
|
exclusive access to a critical section, using activation signals,
|
|
request tokens, and a lock. Generates one of three RSCTL properties.
|
|
|
|
NOTE: generates old-syntax input (context-entities, initial-contexts,
|
|
rsctl-property) which is not compatible with the current parser.
|
|
"""
|
|
|
|
import argparse
|
|
|
|
|
|
def generate(n, formula):
|
|
out = "reactions {\n"
|
|
for i in range(n):
|
|
out += "\t{{{{out{i},act{i}}},{{}} -> {{request{i}}}}};\n".format(i=i)
|
|
out += "\t{{{{out{i}}},{{act{i}}} -> {{out{i}}}}};\n".format(i=i)
|
|
|
|
for j in range(n):
|
|
if i != j:
|
|
out += "\t{{{{request{i},act{i},act{j}}},{{}} -> {{request{i}}}}};\n".format(
|
|
i=i, j=j)
|
|
|
|
out += "\t{{{{request{i}}},{{act{i}}} -> {{request{i}}}}};\n".format(i=i)
|
|
|
|
other_acts = ",".join("act" + str(j) for j in range(n) if i != j)
|
|
out += "\t{{{{request{i},act{i}}},{{{others},lock}} -> {{in{i},lock}}}};\n".format(
|
|
i=i, others=other_acts)
|
|
|
|
out += "\t{{{{in{i},act{i}}},{{}} -> {{out{i},done}}}};\n".format(i=i)
|
|
out += "\t{{{{in{i}}},{{act{i}}} -> {{in{i}}}}};\n".format(i=i)
|
|
|
|
out += "\t{{lock},{done} -> {lock}};\n"
|
|
out += "}\n"
|
|
|
|
ctx_ents = ",".join("act" + str(i) for i in range(n))
|
|
out += "context-entities {{ {} }}\n".format(ctx_ents)
|
|
|
|
init_ents = ",".join("out" + str(i) for i in range(n))
|
|
out += "initial-contexts {{ {{{}}} }}\n".format(init_ents)
|
|
|
|
if formula == 1:
|
|
out += "rsctl-property { A[{act1}]F(in1) }\n"
|
|
elif formula == 2:
|
|
out += "rsctl-property { E[{act1}]F(in1) }\n"
|
|
elif formula == 3:
|
|
pairs = []
|
|
for i in range(n):
|
|
for j in range(i + 1, n):
|
|
pairs.append("~(in{} AND in{})".format(i, j))
|
|
out += "rsctl-property {{ AG({}) }}\n".format(" AND ".join(pairs))
|
|
|
|
return out
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description=__doc__,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
parser.add_argument("n", type=int, help="number of processes")
|
|
parser.add_argument("formula", type=int, choices=[1, 2, 3],
|
|
help="formula to generate (1: A[]F, 2: E[]F, 3: AG mutex)")
|
|
args = parser.parse_args()
|
|
|
|
print(generate(args.n, args.formula))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|