use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Encodings method AssertFromModel.
public static Assert AssertFromModel(Program p, Model model, Context ctx) {
Assert ass = new Assert();
Set<Location> locs = p.getEvents().stream().filter(e -> e instanceof MemEvent).map(e -> e.getLoc()).collect(Collectors.toSet());
for (Location loc : locs) {
ass.addPair(loc, Integer.valueOf(model.getConstInterp(ctx.mkIntConst(loc.getName() + "_final")).toString()));
}
Set<Event> executedEvents = p.getEvents().stream().filter(e -> model.getConstInterp(e.executes(ctx)).isTrue()).collect(Collectors.toSet());
Set<Register> regs = executedEvents.stream().filter(e -> e instanceof Local | e instanceof Load).map(e -> e.getReg()).collect(Collectors.toSet());
for (Register reg : regs) {
Set<Integer> ssaRegIndexes = new HashSet<Integer>();
for (Event e : executedEvents) {
if (!(e instanceof Load | e instanceof Local)) {
continue;
}
if (e.getReg() != reg) {
continue;
}
ssaRegIndexes.add(e.getSsaRegIndex());
}
Integer lastRegIndex = Collections.max(ssaRegIndexes);
String regVarName = String.format("T%s_%s_%s", reg.getMainThread(), reg.getName(), lastRegIndex);
ass.addPair(reg, Integer.valueOf(model.getConstInterp(ctx.mkIntConst(regVarName)).toString()));
}
return ass;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Encodings method satTO.
public static BoolExpr satTO(String name, Set<Event> events, Context ctx) throws Z3Exception {
BoolExpr enc = ctx.mkTrue();
for (Event e1 : events) {
enc = ctx.mkAnd(enc, ctx.mkImplies(e1.executes(ctx), ctx.mkGt(Utils.intVar(name, e1, ctx), ctx.mkInt(0))));
enc = ctx.mkAnd(enc, ctx.mkImplies(e1.executes(ctx), ctx.mkLe(Utils.intVar(name, e1, ctx), ctx.mkInt(events.size()))));
for (Event e2 : events) {
enc = ctx.mkAnd(enc, ctx.mkImplies(Utils.edge(name, e1, e2, ctx), ctx.mkLt(Utils.intVar(name, e1, ctx), Utils.intVar(name, e2, ctx))));
enc = ctx.mkAnd(enc, ctx.mkImplies(ctx.mkAnd(e1.executes(ctx), e2.executes(ctx)), ctx.mkImplies(ctx.mkLt(Utils.intVar(name, e1, ctx), Utils.intVar(name, e2, ctx)), Utils.edge(name, e1, e2, ctx))));
if (e1 != e2) {
enc = ctx.mkAnd(enc, ctx.mkImplies(ctx.mkAnd(e1.executes(ctx), e2.executes(ctx)), ctx.mkNot(ctx.mkEq(Utils.intVar(name, e1, ctx), Utils.intVar(name, e2, ctx)))));
enc = ctx.mkAnd(enc, ctx.mkImplies(ctx.mkAnd(e1.executes(ctx), e2.executes(ctx)), ctx.mkOr(Utils.edge(name, e1, e2, ctx), Utils.edge(name, e2, e1, ctx))));
}
}
}
return enc;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Encodings method satCycleDef.
public static BoolExpr satCycleDef(String name, Set<Event> events, Context ctx) throws Z3Exception {
BoolExpr enc = ctx.mkTrue();
for (Event e1 : events) {
Set<BoolExpr> source = new HashSet<BoolExpr>();
Set<BoolExpr> target = new HashSet<BoolExpr>();
for (Event e2 : events) {
source.add(Utils.cycleEdge(name, e1, e2, ctx));
target.add(Utils.cycleEdge(name, e2, e1, ctx));
enc = ctx.mkAnd(enc, ctx.mkImplies(Utils.cycleEdge(name, e1, e2, ctx), ctx.mkAnd(e1.executes(ctx), e2.executes(ctx), Utils.edge(name, e1, e2, ctx), Utils.cycleVar(name, e1, ctx), Utils.cycleVar(name, e2, ctx))));
}
enc = ctx.mkAnd(enc, ctx.mkImplies(Utils.cycleVar(name, e1, ctx), ctx.mkAnd(encodeEO(source, ctx), encodeEO(target, ctx))));
}
return enc;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Power method Inconsistent.
public static BoolExpr Inconsistent(Program program, Context ctx) throws Z3Exception {
Set<Event> events = program.getEvents().stream().filter(e -> e instanceof MemEvent).collect(Collectors.toSet());
BoolExpr enc = ctx.mkAnd(satCycleDef("hb-power", events, ctx), satCycleDef("(co+prop)", events, ctx), satCycleDef("(poloc+com)", events, ctx));
enc = ctx.mkAnd(enc, ctx.mkOr(satCycle("hb-power", events, ctx), ctx.mkNot(satIrref("((fre;prop);(hb-power)*)", events, ctx)), satCycle("(co+prop)", events, ctx), satCycle("(poloc+com)", events, ctx)));
return enc;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Power method encode.
public static BoolExpr encode(Program program, Context ctx) throws Z3Exception {
Set<Event> events = program.getEvents().stream().filter(e -> e instanceof MemEvent).collect(Collectors.toSet());
Set<Event> eventsL = program.getEvents().stream().filter(e -> e instanceof MemEvent || e instanceof Local).collect(Collectors.toSet());
BoolExpr enc = satUnion("co", "fr", events, ctx);
enc = ctx.mkAnd(enc, satUnion("com", "(co+fr)", "rf", events, ctx));
enc = ctx.mkAnd(enc, satUnion("poloc", "com", events, ctx));
enc = ctx.mkAnd(enc, satTransFixPoint("idd", eventsL, ctx));
enc = ctx.mkAnd(enc, satIntersection("data", "idd^+", "RW", events, ctx));
enc = ctx.mkAnd(enc, satEmpty("addr", events, ctx));
enc = ctx.mkAnd(enc, satUnion("dp", "addr", "data", events, ctx));
enc = ctx.mkAnd(enc, satComp("fre", "rfe", events, ctx));
enc = ctx.mkAnd(enc, satComp("coe", "rfe", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("rdw", "poloc", "(fre;rfe)", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("detour", "poloc", "(coe;rfe)", events, ctx));
// Base case for program order
enc = ctx.mkAnd(enc, satUnion("dp", "rdw", events, ctx));
enc = ctx.mkAnd(enc, satUnion("ii0", "(dp+rdw)", "rfi", events, ctx));
enc = ctx.mkAnd(enc, satEmpty("ic0", events, ctx));
enc = ctx.mkAnd(enc, satUnion("ci0", "ctrlisync", "detour", events, ctx));
enc = ctx.mkAnd(enc, satUnion("dp", "poloc", events, ctx));
enc = ctx.mkAnd(enc, satUnion("(dp+poloc)", "ctrl", events, ctx));
enc = ctx.mkAnd(enc, satComp("addr", "po", events, ctx));
enc = ctx.mkAnd(enc, satPowerPPO(events, ctx));
enc = ctx.mkAnd(enc, satUnion("cc0", "((dp+poloc)+ctrl)", "(addr;po)", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("RR", "ii", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("RW", "ic", events, ctx));
enc = ctx.mkAnd(enc, satUnion("po-power", "(RR&ii)", "(RW&ic)", events, ctx));
// Fences in Power
enc = ctx.mkAnd(enc, satMinus("lwsync", "WR", events, ctx));
enc = ctx.mkAnd(enc, satUnion("fence-power", "sync", "(lwsync\\WR)", events, ctx));
// Happens before
enc = ctx.mkAnd(enc, satUnion("po-power", "rfe", events, ctx));
enc = ctx.mkAnd(enc, satUnion("hb-power", "(po-power+rfe)", "fence-power", events, ctx));
// Prop-base
enc = ctx.mkAnd(enc, satComp("rfe", "fence-power", events, ctx));
enc = ctx.mkAnd(enc, satUnion("fence-power", "(rfe;fence-power)", events, ctx));
enc = ctx.mkAnd(enc, satTransRef("hb-power", events, ctx));
enc = ctx.mkAnd(enc, satComp("prop-base", "(fence-power+(rfe;fence-power))", "(hb-power)*", events, ctx));
// Propagation for Power
enc = ctx.mkAnd(enc, satTransRef("com", events, ctx));
enc = ctx.mkAnd(enc, satTransRef("prop-base", events, ctx));
enc = ctx.mkAnd(enc, satComp("(com)*", "(prop-base)*", events, ctx));
enc = ctx.mkAnd(enc, satComp("((com)*;(prop-base)*)", "sync", events, ctx));
enc = ctx.mkAnd(enc, satComp("(((com)*;(prop-base)*);sync)", "(hb-power)*", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("WW", "prop-base", events, ctx));
enc = ctx.mkAnd(enc, satUnion("prop", "(WW&prop-base)", "((((com)*;(prop-base)*);sync);(hb-power)*)", events, ctx));
enc = ctx.mkAnd(enc, satComp("fre", "prop", events, ctx));
enc = ctx.mkAnd(enc, satComp("(fre;prop)", "(hb-power)*", events, ctx));
enc = ctx.mkAnd(enc, satUnion("co", "prop", events, ctx));
return enc;
}
Aggregations