use of dartagnan.program.Program 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.Program 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.Program 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.Program 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.Program 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