use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class VisitorLitmusPPC method visitBranchCond.
@Override
public Object visitBranchCond(LitmusPPCParser.BranchCondContext ctx) {
Label label = programBuilder.getOrCreateLabel(ctx.Label().getText());
Event lastEvent = programBuilder.getLastEvent(mainThread);
if (!(lastEvent instanceof Cmp)) {
throw new ParsingException("Invalid syntax near " + ctx.getText());
}
Cmp cmp = (Cmp) lastEvent;
Atom expr = new Atom(cmp.getLeft(), ctx.cond().op, cmp.getRight());
return programBuilder.addChild(mainThread, EventFactory.newJump(expr, label));
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class VisitorLitmusAArch64 method visitBranch.
@Override
public Object visitBranch(LitmusAArch64Parser.BranchContext ctx) {
Label label = programBuilder.getOrCreateLabel(ctx.label().getText());
if (ctx.branchCondition() == null) {
return programBuilder.addChild(mainThread, EventFactory.newGoto(label));
}
Event lastEvent = programBuilder.getLastEvent(mainThread);
if (!(lastEvent instanceof Cmp)) {
throw new ParsingException("Invalid syntax near " + ctx.getText());
}
Cmp cmp = (Cmp) lastEvent;
Atom expr = new Atom(cmp.getLeft(), ctx.branchCondition().op, cmp.getRight());
return programBuilder.addChild(mainThread, EventFactory.newJump(expr, label));
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class ExceptionsTest method JumpWithNullExpr.
@Test(expected = NullPointerException.class)
public void JumpWithNullExpr() throws Exception {
ProgramBuilder pb = new ProgramBuilder();
pb.initThread(0);
Label end = pb.getOrCreateLabel("END");
// The expr cannot be null
pb.addChild(0, new CondJump(null, end));
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class PropertyEncoder method encodeLiveness.
public BooleanFormula encodeLiveness(SolverContext ctx) {
// Further, we assume that the spinloops are indeed correct, i.e., side-effect free
class SpinLoop {
public List<Load> loads = new ArrayList<>();
public Event bound;
}
logger.info("Encoding liveness");
Map<Thread, List<SpinLoop>> spinloopsMap = new HashMap<>();
// Find spinloops of all threads
for (Thread t : program.getThreads()) {
List<Event> spinStarts = t.getEvents().stream().filter(e -> e instanceof Label && e.is(Tag.SPINLOOP)).collect(Collectors.toList());
List<SpinLoop> spinLoops = new ArrayList<>();
spinloopsMap.put(t, spinLoops);
for (Event start : spinStarts) {
SpinLoop loop = new SpinLoop();
Event cur = start.getSuccessor();
while (!cur.is(Tag.SPINLOOP)) {
if (cur.is(Tag.READ)) {
loop.loads.add((Load) cur);
}
cur = cur.getSuccessor();
}
loop.bound = cur;
spinLoops.add(loop);
}
}
BooleanFormulaManager bmgr = ctx.getFormulaManager().getBooleanFormulaManager();
RelRf rf = (RelRf) memoryModel.getRelationRepository().getRelation(RelationNameRepository.RF);
RelCo co = (RelCo) memoryModel.getRelationRepository().getRelation(RelationNameRepository.CO);
// Compute "stuckness": A thread is stuck if it reaches a spinloop bound event
// while reading from a co-maximal write.
Map<Thread, BooleanFormula> isStuckMap = new HashMap<>();
for (Thread t : program.getThreads()) {
List<SpinLoop> loops = spinloopsMap.get(t);
if (loops.isEmpty()) {
continue;
}
BooleanFormula isStuck = bmgr.makeFalse();
for (SpinLoop pair : loops) {
BooleanFormula allCoMaximalLoad = bmgr.makeTrue();
for (Load load : pair.loads) {
BooleanFormula coMaximalLoad = bmgr.makeFalse();
for (Tuple rfEdge : rf.getMaxTupleSet().getBySecond(load)) {
coMaximalLoad = bmgr.or(coMaximalLoad, bmgr.and(rf.getSMTVar(rfEdge, ctx), co.getLastCoVar(rfEdge.getFirst(), ctx)));
}
allCoMaximalLoad = bmgr.and(allCoMaximalLoad, coMaximalLoad);
}
isStuck = bmgr.or(isStuck, bmgr.and(pair.bound.exec(), allCoMaximalLoad));
}
isStuckMap.put(t, isStuck);
}
// LivenessViolation <=> allStuckOrDone /\ atLeastOneStuck
BooleanFormula allStuckOrDone = bmgr.makeTrue();
BooleanFormula atLeastOneStuck = bmgr.makeFalse();
for (Thread t : program.getThreads()) {
BooleanFormula isStuck = isStuckMap.getOrDefault(t, bmgr.makeFalse());
BooleanFormula isDone = t.getCache().getEvents(FilterBasic.get(Tag.BOUND)).stream().map(e -> bmgr.not(e.exec())).reduce(bmgr.makeTrue(), bmgr::and);
atLeastOneStuck = bmgr.or(atLeastOneStuck, isStuck);
allStuckOrDone = bmgr.and(allStuckOrDone, bmgr.or(isStuck, isDone));
}
// We use the SMT variable to extract from the model if the property was violated
BooleanFormula enc = bmgr.equivalence(LIVENESS.getSMTVariable(ctx), bmgr.and(allStuckOrDone, atLeastOneStuck));
return bmgr.and(LIVENESS.getSMTVariable(ctx), enc);
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class VisitorLitmusC method visitIfExpression.
@Override
public Object visitIfExpression(LitmusCParser.IfExpressionContext ctx) {
ExprInterface expr = (ExprInterface) ctx.re().accept(this);
ifId++;
Label elseL = programBuilder.getOrCreateLabel("else_" + ifId);
Label endL = programBuilder.getOrCreateLabel("end_" + ifId);
IfAsJump ifEvent = EventFactory.newIfJumpUnless(expr, elseL, endL);
programBuilder.addChild(currentThread, ifEvent);
for (LitmusCParser.ExpressionContext expressionContext : ctx.expression()) expressionContext.accept(this);
CondJump jumpToEnd = EventFactory.newGoto(endL);
jumpToEnd.addFilters(Tag.IFI);
programBuilder.addChild(currentThread, jumpToEnd);
programBuilder.addChild(currentThread, elseL);
if (ctx.elseExpression() != null) {
ctx.elseExpression().accept(this);
}
programBuilder.addChild(currentThread, endL);
return null;
}
Aggregations