use of com.dat3m.dartagnan.program.event.core.MemEvent in project Dat3M by hernanponcedeleon.
the class Refiner method permuteAndConvert.
// Changes a reasoning <literal> based on a given permutation <perm> and translates the result
// into a BooleanFormula for Refinement.
private BooleanFormula permuteAndConvert(CoreLiteral literal, Function<Event, Event> perm, SolverContext context) {
BooleanFormulaManager bmgr = context.getFormulaManager().getBooleanFormulaManager();
BooleanFormula enc;
if (literal instanceof ExecLiteral) {
ExecLiteral lit = (ExecLiteral) literal;
enc = perm.apply(lit.getData()).exec();
} else if (literal instanceof AddressLiteral) {
AddressLiteral loc = (AddressLiteral) literal;
MemEvent e1 = (MemEvent) perm.apply(loc.getFirst());
MemEvent e2 = (MemEvent) perm.apply(loc.getSecond());
enc = generalEqual(e1.getMemAddressExpr(), e2.getMemAddressExpr(), context);
} else if (literal instanceof RelLiteral) {
RelLiteral lit = (RelLiteral) literal;
Relation rel = task.getMemoryModel().getRelationRepository().getRelation(lit.getName());
enc = rel.getSMTVar(perm.apply(lit.getData().getFirst()), perm.apply(lit.getData().getSecond()), context);
} else {
throw new IllegalArgumentException("CoreLiteral " + literal.toString() + " is not supported");
}
return literal.isNegative() ? bmgr.not(enc) : enc;
}
use of com.dat3m.dartagnan.program.event.core.MemEvent in project Dat3M by hernanponcedeleon.
the class ExecutionGraphVisualizer method eventToNode.
private String eventToNode(EventData e, ExecutionModel model) {
if (e.isInit()) {
return String.format("\"I(%s, %d)\"", addresses.get(e.getAccessedAddress()), e.getValue());
} else if (e.getEvent().getCLine() == -1) {
// Special write of each thread
int threadSize = model.getThreadEventsMap().get(e.getThread()).size();
if (e.getLocalId() <= threadSize / 2) {
return String.format("\"T%d:start\"", e.getThread().getId());
} else {
return String.format("\"T%d:end\"", e.getThread().getId());
}
}
// We have MemEvent + Fence
String tag = e.getEvent().toString();
if (e.isMemoryEvent()) {
Object address = addresses.get(e.getAccessedAddress());
BigInteger value = e.getValue();
String mo = ofNullable(((MemEvent) e.getEvent()).getMo()).orElse("NA");
tag = e.isWrite() ? String.format("W(%s, %d, %s)", address, value, mo) : String.format("%d = R(%s, %s)", value, address, mo);
}
return String.format("\"T%d:E%s (%s:L%d)\\n%s\"", e.getThread().getId(), e.getEvent().getCId(), e.getEvent().getSourceCodeFile(), e.getEvent().getCLine(), tag);
}
use of com.dat3m.dartagnan.program.event.core.MemEvent in project Dat3M by hernanponcedeleon.
the class WitnessBuilder method getSCExecutionOrder.
private List<Event> getSCExecutionOrder(Model model) {
List<Event> execEvents = new ArrayList<>();
// TODO: we recently added many cline to many events and this might affect the witness generation.
Predicate<Event> executedCEvents = e -> e.wasExecuted(model) && e.getCLine() > -1;
execEvents.addAll(task.getProgram().getCache().getEvents(FilterBasic.get(Tag.INIT)).stream().filter(executedCEvents).collect(Collectors.toList()));
execEvents.addAll(task.getProgram().getEvents().stream().filter(executedCEvents).collect(Collectors.toList()));
Map<Integer, List<Event>> map = new HashMap<>();
for (Event e : execEvents) {
// TODO improve this: these events correspond to return statements
if (e instanceof MemEvent && ((MemEvent) e).getMemValue() instanceof BConst && !((BConst) ((MemEvent) e).getMemValue()).getValue()) {
continue;
}
BigInteger var = model.evaluate(intVar("hb", e, ctx));
if (var != null) {
map.computeIfAbsent(var.intValue(), x -> new ArrayList<>()).add(e);
}
}
List<Event> exec = map.keySet().stream().sorted().flatMap(key -> map.get(key).stream()).collect(Collectors.toList());
return exec.isEmpty() ? execEvents : exec;
}
use of com.dat3m.dartagnan.program.event.core.MemEvent in project Dat3M by hernanponcedeleon.
the class RelCo method encodeApprox.
@Override
protected BooleanFormula encodeApprox(SolverContext ctx) {
AliasAnalysis alias = analysisContext.get(AliasAnalysis.class);
WmmAnalysis wmmAnalysis = analysisContext.get(WmmAnalysis.class);
FormulaManager fmgr = ctx.getFormulaManager();
BooleanFormulaManager bmgr = fmgr.getBooleanFormulaManager();
IntegerFormulaManager imgr = fmgr.getIntegerFormulaManager();
BooleanFormula enc = bmgr.makeTrue();
List<Event> eventsInit = task.getProgram().getCache().getEvents(FilterBasic.get(INIT));
List<Event> eventsStore = task.getProgram().getCache().getEvents(FilterMinus.get(FilterBasic.get(WRITE), FilterBasic.get(INIT)));
for (Event e : eventsInit) {
enc = bmgr.and(enc, imgr.equal(getIntVar(e, ctx), imgr.makeNumber(BigInteger.ZERO)));
}
List<IntegerFormula> intVars = new ArrayList<>();
for (Event w : eventsStore) {
IntegerFormula coVar = getIntVar(w, ctx);
enc = bmgr.and(enc, imgr.greaterThan(coVar, imgr.makeNumber(BigInteger.ZERO)));
intVars.add(coVar);
}
BooleanFormula distinct = intVars.size() > 1 ? imgr.distinct(intVars) : bmgr.makeTrue();
enc = bmgr.and(enc, distinct);
for (Event w : task.getProgram().getCache().getEvents(FilterBasic.get(WRITE))) {
MemEvent w1 = (MemEvent) w;
BooleanFormula lastCo = w1.exec();
for (Tuple t : maxTupleSet.getByFirst(w1)) {
MemEvent w2 = (MemEvent) t.getSecond();
BooleanFormula relation = getSMTVar(t, ctx);
BooleanFormula execPair = getExecPair(t, ctx);
lastCo = bmgr.and(lastCo, bmgr.not(relation));
Formula a1 = w1.getMemAddressExpr();
Formula a2 = w2.getMemAddressExpr();
BooleanFormula sameAddress = generalEqual(a1, a2, ctx);
enc = bmgr.and(enc, bmgr.equivalence(relation, bmgr.and(execPair, sameAddress, imgr.lessThan(getIntVar(w1, ctx), getIntVar(w2, ctx)))));
// ============ Local consistency optimizations ============
if (getMinTupleSet().contains(t)) {
enc = bmgr.and(enc, bmgr.equivalence(relation, execPair));
} else if (wmmAnalysis.isLocallyConsistent()) {
if (w2.is(INIT) || t.isBackward()) {
enc = bmgr.and(enc, bmgr.equivalence(relation, bmgr.makeFalse()));
}
if (w1.is(INIT) || t.isForward()) {
enc = bmgr.and(enc, bmgr.implication(bmgr.and(execPair, sameAddress), relation));
}
}
}
if (task.getProgram().getFormat().equals(LITMUS) || task.getProperty().contains(LIVENESS)) {
BooleanFormula lastCoExpr = getLastCoVar(w1, ctx);
enc = bmgr.and(enc, bmgr.equivalence(lastCoExpr, lastCo));
for (Event i : eventsInit) {
Init init = (Init) i;
if (!alias.mayAlias(w1, init)) {
continue;
}
IExpr address = init.getAddress();
Formula a1 = w1.getMemAddressExpr();
Formula a2 = address.toIntFormula(init, ctx);
BooleanFormula sameAddress = generalEqual(a1, a2, ctx);
Formula v1 = w1.getMemValueExpr();
Formula v2 = init.getBase().getLastMemValueExpr(ctx, init.getOffset());
BooleanFormula sameValue = generalEqual(v1, v2, ctx);
enc = bmgr.and(enc, bmgr.implication(bmgr.and(lastCoExpr, sameAddress), sameValue));
}
}
}
return enc;
}
use of com.dat3m.dartagnan.program.event.core.MemEvent in project Dat3M by hernanponcedeleon.
the class RelLoc method getMaxTupleSet.
@Override
public TupleSet getMaxTupleSet() {
if (maxTupleSet == null) {
AliasAnalysis alias = analysisContext.get(AliasAnalysis.class);
maxTupleSet = new TupleSet();
Collection<Event> events = task.getProgram().getCache().getEvents(FilterBasic.get(MEMORY));
for (Event e1 : events) {
for (Event e2 : events) {
if (alias.mayAlias((MemEvent) e1, (MemEvent) e2)) {
maxTupleSet.add(new Tuple(e1, e2));
}
}
}
removeMutuallyExclusiveTuples(maxTupleSet);
}
return maxTupleSet;
}
Aggregations