Files
reactics/examples/bdd/generators/old_syntax/gen_mutex.py
Artur Meski f0019619b3 Refactor + tests (#6)
- Minor codebase clean-up
- Slight reorganisation of examples + tests so that we don't break stuff by accident
- CI tests
2026-04-10 18:16:49 +01:00

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