use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Encodings method diffInitialHigh.
public static BoolExpr diffInitialHigh(Program p, Context ctx) {
Set<Event> highInits = p.getEvents().stream().filter(e -> e instanceof Init).filter(e -> e.getLoc() instanceof HighLocation).collect(Collectors.toSet());
BoolExpr initState = ctx.mkTrue();
for (Event e : highInits) {
if (e.getLoc().getIValue() == null) {
initState = ctx.mkAnd(initState, ctx.mkNot(ctx.mkEq(initValue(e, ctx), initValue2(e, ctx))));
}
}
return initState;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Encodings method getExecutedInstanciatedEvents.
public static BoolExpr getExecutedInstanciatedEvents(Program p, Model model, Context ctx) {
BoolExpr enc = ctx.mkTrue();
for (Event e : p.getEvents()) {
if (!(e instanceof MemEvent)) {
continue;
}
if (model.getConstInterp(e.executes(ctx)).isTrue()) {
enc = ctx.mkAnd(enc, e.executes(ctx));
Expr dfEvent = model.getConstInterp(((MemEvent) e).ssaLoc);
enc = ctx.mkAnd(enc, ctx.mkEq(((MemEvent) e).ssaLoc, dfEvent));
}
}
return enc;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class Utils method drawGraph.
public static void drawGraph(Program p, Context ctx, Model model, String filename, String[] relations) throws IOException {
File newTextFile = new File(filename);
FileWriter fw = new FileWriter(newTextFile);
GraphViz gv = new GraphViz();
gv.addln(gv.start_graph());
gv.addln(" subgraph cluster_Source { rank=sink; fontsize=20; label = \"Program Compiled to Source Architecture\"; color=red; shape=box;");
int tid = 0;
for (dartagnan.program.Thread t : p.getThreads()) {
tid++;
if (!(t instanceof Init)) {
gv.addln(" subgraph cluster_Thread_Source" + t.getTId() + " { rank=sink; fontsize=15; label = \"Thread " + tid + "\"; color=magenta; shape=box;");
}
for (Event e : p.getEvents()) {
String label = "";
if (!(e instanceof MemEvent)) {
continue;
}
if ((e instanceof Store || e instanceof Init) && model.getConstInterp(e.executes(ctx)).isTrue()) {
label = "W_" + e.getLoc() + "_" + model.getConstInterp(((MemEvent) e).ssaLoc).toString() + "\\n";
}
if (e instanceof Load && model.getConstInterp(e.executes(ctx)).isTrue()) {
label = "R_" + e.getLoc() + "_" + model.getConstInterp(((MemEvent) e).ssaLoc).toString() + "\\n";
}
for (Event eHL : p.getEvents().stream().filter(x -> x instanceof MemEvent).collect(Collectors.toSet())) {
if (!(e instanceof Init) && e.getHLId() != null && e.getHLId() == eHL.hashCode()) {
label = label + eHL.toString().replaceAll("\\s", "");
}
}
if ((e instanceof Store || e instanceof Load) && e.getMainThread() == t.getTId() && model.getConstInterp(e.executes(ctx)).isTrue()) {
gv.addln(" " + e.repr() + " [label=\"" + label + "\", shape=\"box\", color=\"blue\", group=s" + e.getMainThread() + "];");
}
if (e instanceof Init && e.getMainThread() == t.getTId() && model.getConstInterp(e.executes(ctx)).isTrue()) {
gv.addln(" " + e.repr() + " [label=\"" + label + "\", shape=\"box\", color=\"blue\", root=true];");
}
}
if (!(t instanceof Init)) {
gv.addln(" }");
}
}
for (Event e1 : p.getEvents()) {
for (Event e2 : p.getEvents()) {
if (!(e1 instanceof MemEvent && e2 instanceof MemEvent)) {
continue;
}
if (!(model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue())) {
continue;
}
if (model.getConstInterp(edge("rf", e1, e2, ctx)).isTrue() && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"rf\", color=\"red\", fontcolor=\"red\", weight=1];");
}
if (model.getConstInterp(edge("fr", e1, e2, ctx)).isTrue() && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"fr\", color=\"#ffa040\", fontcolor=\"#ffa040\", weight=1];");
}
if (e1.getLoc() == e2.getLoc() && (e1 instanceof Store || e1 instanceof Init) && (e2 instanceof Store || e2 instanceof Init) && Integer.parseInt(model.getConstInterp(intVar("co", e1, ctx)).toString()) == Integer.parseInt(model.getConstInterp(intVar("co", e2, ctx)).toString()) - 1 && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"co\", color=\"brown\", fontcolor=\"brown\", weight=1];");
}
if (model.getConstInterp(edge("sync", e1, e2, ctx)).isTrue() && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"sync\", color=\"black\", fontcolor=\"black\", weight=1];");
}
if (model.getConstInterp(edge("lwsync", e1, e2, ctx)).isTrue() && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"lwsync\", color=\"black\", fontcolor=\"black\", weight=1];");
}
if (model.getConstInterp(edge("mfence", e1, e2, ctx)).isTrue() && model.getConstInterp(e1.executes(ctx)).isTrue() && model.getConstInterp(e2.executes(ctx)).isTrue()) {
gv.addln(" " + e1.repr() + " -> " + e2.repr() + " [label=\"mfence\", color=\"black\", fontcolor=\"black\", weight=1];");
}
}
}
gv.addln(" }");
gv.addln(gv.end_graph());
fw.write(gv.getDotSource());
fw.close();
return;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class ARM 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", "ctrlisb", "detour", events, ctx));
enc = ctx.mkAnd(enc, satUnion("dp", "ctrl", events, ctx));
enc = ctx.mkAnd(enc, satComp("addr", "po", events, ctx));
enc = ctx.mkAnd(enc, satARMPPO(events, ctx));
enc = ctx.mkAnd(enc, satUnion("cc0", "(dp+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-arm", "(RR&ii)", "(RW&ic)", events, ctx));
// Happens before
enc = ctx.mkAnd(enc, satUnion("po-arm", "rfe", events, ctx));
enc = ctx.mkAnd(enc, satUnion("hb-arm", "(po-arm+rfe)", "ish", events, ctx));
// Prop-base
enc = ctx.mkAnd(enc, satComp("rfe", "ish", events, ctx));
enc = ctx.mkAnd(enc, satUnion("ish", "(rfe;ish)", events, ctx));
enc = ctx.mkAnd(enc, satTransRef("hb-arm", events, ctx));
enc = ctx.mkAnd(enc, satComp("prop-base", "(ish+(rfe;ish))", "(hb-arm)*", events, ctx));
// Propagation for ARM
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)*)", "ish", events, ctx));
enc = ctx.mkAnd(enc, satComp("(((com)*;(prop-base)*);ish)", "(hb-arm)*", events, ctx));
enc = ctx.mkAnd(enc, satIntersection("WW", "prop-base", events, ctx));
enc = ctx.mkAnd(enc, satUnion("prop", "(WW&prop-base)", "((((com)*;(prop-base)*);ish);(hb-arm)*)", events, ctx));
enc = ctx.mkAnd(enc, satComp("fre", "prop", events, ctx));
enc = ctx.mkAnd(enc, satComp("(fre;prop)", "(hb-arm)*", events, ctx));
enc = ctx.mkAnd(enc, satUnion("co", "prop", events, ctx));
return enc;
}
use of dartagnan.program.Event in project Dat3M by hernanponcedeleon.
the class ARM method satARMPPO.
private static BoolExpr satARMPPO(Set<Event> events, Context ctx) throws Z3Exception {
BoolExpr enc = ctx.mkTrue();
for (Event e1 : events) {
for (Event e2 : events) {
BoolExpr orClause1 = ctx.mkFalse();
BoolExpr orClause2 = ctx.mkFalse();
BoolExpr orClause3 = ctx.mkFalse();
BoolExpr orClause4 = ctx.mkFalse();
BoolExpr orClause5 = ctx.mkFalse();
BoolExpr orClause6 = ctx.mkFalse();
BoolExpr orClause7 = ctx.mkFalse();
BoolExpr orClause8 = ctx.mkFalse();
for (Event e3 : events) {
orClause1 = ctx.mkOr(orClause1, ctx.mkAnd(Utils.edge("ic", e1, e3, ctx), edge("ci", e3, e2, ctx)));
orClause2 = ctx.mkOr(orClause2, ctx.mkAnd(Utils.edge("ii", e1, e3, ctx), edge("ii", e3, e2, ctx)));
orClause3 = ctx.mkOr(orClause3, ctx.mkAnd(Utils.edge("ic", e1, e3, ctx), edge("cc", e3, e2, ctx)));
orClause4 = ctx.mkOr(orClause4, ctx.mkAnd(Utils.edge("ii", e1, e3, ctx), edge("ic", e3, e2, ctx)));
orClause5 = ctx.mkOr(orClause5, ctx.mkAnd(Utils.edge("ci", e1, e3, ctx), edge("ii", e3, e2, ctx)));
orClause6 = ctx.mkOr(orClause6, ctx.mkAnd(Utils.edge("cc", e1, e3, ctx), edge("ci", e3, e2, ctx)));
orClause7 = ctx.mkOr(orClause7, ctx.mkAnd(Utils.edge("ci", e1, e3, ctx), edge("ic", e3, e2, ctx)));
orClause8 = ctx.mkOr(orClause8, ctx.mkAnd(Utils.edge("cc", e1, e3, ctx), edge("cc", e3, e2, ctx)));
}
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ic;ci", e1, e2, ctx), orClause1));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ii;ii", e1, e2, ctx), orClause2));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ic;cc", e1, e2, ctx), orClause3));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ii;ic", e1, e2, ctx), orClause4));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ci;ii", e1, e2, ctx), orClause5));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("cc;ci", e1, e2, ctx), orClause6));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ci;ic", e1, e2, ctx), orClause7));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("cc;cc", e1, e2, ctx), orClause8));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ii", e1, e2, ctx), ctx.mkOr(edge("ii0", e1, e2, ctx), edge("ci", e1, e2, ctx), edge("ic;ci", e1, e2, ctx), edge("ii;ii", e1, e2, ctx))));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ic", e1, e2, ctx), ctx.mkOr(edge("ic0", e1, e2, ctx), edge("ii", e1, e2, ctx), edge("cc", e1, e2, ctx), edge("ic;cc", e1, e2, ctx), edge("ii;ic", e1, e2, ctx))));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("ci", e1, e2, ctx), ctx.mkOr(edge("ci0", e1, e2, ctx), edge("ci;ii", e1, e2, ctx), edge("cc;ci", e1, e2, ctx))));
enc = ctx.mkAnd(enc, ctx.mkEq(edge("cc", e1, e2, ctx), ctx.mkOr(edge("cc0", e1, e2, ctx), edge("ci", e1, e2, ctx), edge("ci;ic", e1, e2, ctx), edge("cc;cc", e1, e2, ctx))));
enc = ctx.mkAnd(enc, ctx.mkImplies(edge("ii", e1, e2, ctx), ctx.mkOr(ctx.mkAnd(edge("ii0", e1, e2, ctx), ctx.mkGt(intCount("ii", e1, e2, ctx), intCount("ii0", e1, e2, ctx))), ctx.mkAnd(edge("ci", e1, e2, ctx), ctx.mkGt(intCount("ii", e1, e2, ctx), intCount("ci", e1, e2, ctx))), ctx.mkAnd(edge("ic;ci", e1, e2, ctx), ctx.mkGt(intCount("ii", e1, e2, ctx), intCount("ic;ci", e1, e2, ctx))), ctx.mkAnd(edge("ii;ii", e1, e2, ctx), ctx.mkGt(intCount("ii", e1, e2, ctx), intCount("ii;ii", e1, e2, ctx))))));
enc = ctx.mkAnd(enc, ctx.mkImplies(edge("ic", e1, e2, ctx), ctx.mkOr(ctx.mkAnd(edge("ic0", e1, e2, ctx), ctx.mkGt(intCount("ic", e1, e2, ctx), intCount("ic0", e1, e2, ctx))), ctx.mkAnd(edge("ii", e1, e2, ctx), ctx.mkGt(intCount("ic", e1, e2, ctx), intCount("ii", e1, e2, ctx))), ctx.mkAnd(edge("cc", e1, e2, ctx), ctx.mkGt(intCount("ic", e1, e2, ctx), intCount("cc", e1, e2, ctx))), ctx.mkAnd(edge("ic;cc", e1, e2, ctx), ctx.mkGt(intCount("ic", e1, e2, ctx), intCount("ic;cc", e1, e2, ctx))), ctx.mkAnd(edge("ii;ic", e1, e2, ctx), ctx.mkGt(intCount("ic", e1, e2, ctx), intCount("ii;ic", e1, e2, ctx))))));
enc = ctx.mkAnd(enc, ctx.mkImplies(edge("ci", e1, e2, ctx), ctx.mkOr(ctx.mkAnd(edge("ci0", e1, e2, ctx), ctx.mkGt(intCount("ci", e1, e2, ctx), intCount("ci0", e1, e2, ctx))), ctx.mkAnd(edge("ci;ii", e1, e2, ctx), ctx.mkGt(intCount("ci", e1, e2, ctx), intCount("ci;ii", e1, e2, ctx))), ctx.mkAnd(edge("cc;ci", e1, e2, ctx), ctx.mkGt(intCount("ci", e1, e2, ctx), intCount("cc;ci", e1, e2, ctx))))));
enc = ctx.mkAnd(enc, ctx.mkImplies(edge("cc", e1, e2, ctx), ctx.mkOr(ctx.mkAnd(edge("cc0", e1, e2, ctx), ctx.mkGt(intCount("cc", e1, e2, ctx), intCount("cc0", e1, e2, ctx))), ctx.mkAnd(edge("ci", e1, e2, ctx), ctx.mkGt(intCount("cc", e1, e2, ctx), intCount("ci", e1, e2, ctx))), ctx.mkAnd(edge("ci;ic", e1, e2, ctx), ctx.mkGt(intCount("cc", e1, e2, ctx), intCount("ci;ic", e1, e2, ctx))), ctx.mkAnd(edge("cc;cc", e1, e2, ctx), ctx.mkGt(intCount("cc", e1, e2, ctx), intCount("cc;cc", e1, e2, ctx))))));
}
}
return enc;
}
Aggregations