use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class VerificationTask method performStaticProgramAnalyses.
public void performStaticProgramAnalyses() throws InvalidConfigurationException {
analysisContext.register(BranchEquivalence.class, BranchEquivalence.fromConfig(program, config));
analysisContext.register(ExecutionAnalysis.class, ExecutionAnalysis.fromConfig(program, analysisContext, config));
analysisContext.register(Dependency.class, Dependency.fromConfig(program, analysisContext, config));
analysisContext.register(AliasAnalysis.class, AliasAnalysis.fromConfig(program, config));
analysisContext.register(ThreadSymmetry.class, ThreadSymmetry.fromConfig(program, config));
for (Thread thread : program.getThreads()) {
for (Event e : thread.getEvents()) {
// Some events perform static analyses by themselves (e.g. Svcomp's EndAtomic)
// which may rely on previous "global" analyses
e.runLocalAnalysis(program, analysisContext);
}
}
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class Printer method appendThread.
private void appendThread(Thread thread) {
try {
Integer.parseInt(thread.getName());
result.append("\nthread_").append(thread.getName()).append("\n");
} catch (Exception e) {
result.append("\n").append(thread.getName()).append("\n");
}
for (Event e : thread.getCache().getEvents(FilterBasic.get(Tag.ANY))) {
appendEvent(e);
}
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class CoSymmetryBreaking method encode.
public BooleanFormula encode(EquivalenceClass<Thread> symmClass, SolverContext ctx) {
BooleanFormulaManager bmgr = ctx.getFormulaManager().getBooleanFormulaManager();
BooleanFormula enc = bmgr.makeTrue();
if (symmClass.getEquivalence() != symm) {
return enc;
}
Info info = infoMap.get(symmClass);
if (info == null) {
logger.warn("Cannot encode co-symmetry because no information has been computed. " + "Make sure that <initialize> gets called before encoding.");
return enc;
}
List<Thread> symmThreads = info.threads;
// ============= Construct rows =============
Thread t1 = symmThreads.get(0);
List<Thread> otherThreads = symmThreads.subList(1, symmThreads.size());
List<Tuple> r1Tuples = new ArrayList<>();
for (Store w : info.writes) {
for (Thread t2 : otherThreads) {
r1Tuples.add(new Tuple(w, symm.map(w, t2)));
}
}
// Starting row
List<BooleanFormula> r1 = new ArrayList<>(r1Tuples.size() + 1);
if (info.hasMustEdges) {
r1.add(info.writes.get(0).exec());
}
r1.addAll(Lists.transform(r1Tuples, t -> co.getSMTVar(t, ctx)));
// Construct symmetric rows
Thread rep = symmClass.getRepresentative();
for (int i = 1; i < symmThreads.size(); i++) {
Thread t2 = symmThreads.get(i);
Function<Event, Event> p = symm.createTransposition(t1, t2);
List<Tuple> r2Tuples = r1Tuples.stream().map(t -> t.permute(p)).collect(Collectors.toList());
List<BooleanFormula> r2 = new ArrayList<>(r2Tuples.size() + 1);
if (info.hasMustEdges) {
r2.add(symm.map(info.writes.get(0), t2).exec());
}
r2.addAll(Lists.transform(r2Tuples, t -> co.getSMTVar(t, ctx)));
final String id = "_" + rep.getId() + "_" + i;
// NOTE: We want to have r1 >= r2 but lexLeader encodes r1 <= r2, so we swap r1 and r2.
enc = bmgr.and(enc, SymmetryEncoder.encodeLexLeader(id, r2, r1, ctx));
t1 = t2;
r1Tuples = r2Tuples;
r1 = r2;
}
return enc;
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class CoreReasoner method addExecReason.
private void addExecReason(Tuple edge, List<CoreLiteral> coreReasons) {
Event e1 = edge.getFirst();
Event e2 = edge.getSecond();
if (e1.getCId() > e2.getCId()) {
// Normalize edge direction
Event temp = e1;
e1 = e2;
e2 = temp;
}
if (exec.isImplied(e1, e2)) {
coreReasons.add(new ExecLiteral(e1));
} else if (exec.isImplied(e2, e1)) {
coreReasons.add(new ExecLiteral(e2));
} else {
coreReasons.add(new ExecLiteral(e1));
coreReasons.add(new ExecLiteral(e2));
}
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class Acyclic method getEncodeTupleSet.
@Override
public TupleSet getEncodeTupleSet() {
logger.info("Computing encodeTupleSet for " + this);
// ====== Construct [Event -> Successor] mapping ======
Map<Event, Collection<Event>> succMap = new HashMap<>();
TupleSet relMaxTuple = rel.getMaxTupleSet();
for (Tuple t : relMaxTuple) {
succMap.computeIfAbsent(t.getFirst(), key -> new ArrayList<>()).add(t.getSecond());
}
// ====== Compute SCCs ======
DependencyGraph<Event> depGraph = DependencyGraph.from(succMap.keySet(), succMap);
TupleSet result = new TupleSet();
for (Set<DependencyGraph<Event>.Node> scc : depGraph.getSCCs()) {
for (DependencyGraph<Event>.Node node1 : scc) {
for (DependencyGraph<Event>.Node node2 : scc) {
Tuple t = new Tuple(node1.getContent(), node2.getContent());
if (relMaxTuple.contains(t)) {
result.add(t);
}
}
}
}
logger.info("encodeTupleSet size " + result.size());
if (GlobalSettings.REDUCE_ACYCLICITY_ENCODE_SETS) {
reduceWithMinSets(result);
logger.info("reduced encodeTupleSet size " + result.size());
}
return result;
}
Aggregations