use of com.dat3m.dartagnan.wmm.utils.RelationRepository in project Dat3M by hernanponcedeleon.
the class CoreReasoner method toCoreReason.
public Conjunction<CoreLiteral> toCoreReason(Conjunction<CAATLiteral> baseReason) {
RelationRepository repo = memoryModel.getRelationRepository();
EventDomain domain = executionGraph.getDomain();
List<CoreLiteral> coreReason = new ArrayList<>(baseReason.getSize());
for (CAATLiteral lit : baseReason.getLiterals()) {
if (lit instanceof ElementLiteral) {
Event e = domain.getObjectById(((ElementLiteral) lit).getElement().getId()).getEvent();
// We only have static tags, so all of them reduce to execution literals
coreReason.add(new ExecLiteral(e, lit.isNegative()));
} else {
EdgeLiteral edgeLit = (EdgeLiteral) lit;
Edge edge = edgeLit.getEdge();
Event e1 = domain.getObjectById(edge.getFirst()).getEvent();
Event e2 = domain.getObjectById(edge.getSecond()).getEvent();
Tuple tuple = new Tuple(e1, e2);
Relation rel = repo.getRelation(lit.getName());
if (lit.isPositive() && rel.getMinTupleSet().contains(tuple)) {
// Statically present edges
addExecReason(tuple, coreReason);
} else if (lit.isNegative() && !rel.getMaxTupleSet().contains(tuple)) {
// Statically absent edges
} else {
if (rel instanceof RelFencerel) {
// We should do this transformation directly on the Wmm to avoid this special reasoning
if (lit.isNegative()) {
throw new UnsupportedOperationException(String.format("FenceRel %s is not allowed on the rhs of differences.", rel));
}
addFenceReason(rel, edge, coreReason);
} else if (rel.getName().equals(LOC)) {
coreReason.add(new AddressLiteral(tuple, lit.isNegative()));
} else if (rel.getName().equals(RF) || rel.getName().equals(CO)) {
coreReason.add(new RelLiteral(rel.getName(), tuple, lit.isNegative()));
} else {
// TODO: Right now, we assume many relations like Data, Ctrl and Addr to be
// static.
addExecReason(tuple, coreReason);
}
}
}
}
minimize(coreReason);
return new Conjunction<>(coreReason);
}
use of com.dat3m.dartagnan.wmm.utils.RelationRepository in project Dat3M by hernanponcedeleon.
the class RefinementTask method createDefaultWmm.
private Wmm createDefaultWmm() {
Wmm baseline = new Wmm();
RelationRepository repo = baseline.getRelationRepository();
Relation rf = repo.getRelation(RF);
if (baselines.contains(UNIPROC)) {
// ---- acyclic(po-loc | rf) ----
Relation poloc = repo.getRelation(POLOC);
Relation co = repo.getRelation(CO);
Relation fr = repo.getRelation(FR);
Relation porf = new RelUnion(poloc, rf);
repo.addRelation(porf);
Relation porfco = new RelUnion(porf, co);
repo.addRelation(porfco);
Relation porfcofr = new RelUnion(porfco, fr);
repo.addRelation(porfcofr);
baseline.addAxiom(new Acyclic(porfcofr));
}
if (baselines.contains(NO_OOTA)) {
// ---- acyclic (dep | rf) ----
Relation data = repo.getRelation(DATA);
Relation ctrl = repo.getRelation(CTRL);
Relation addr = repo.getRelation(ADDR);
Relation dep = new RelUnion(data, addr);
repo.addRelation(dep);
dep = new RelUnion(ctrl, dep);
repo.addRelation(dep);
Relation hb = new RelUnion(dep, rf);
repo.addRelation(hb);
baseline.addAxiom(new Acyclic(hb));
}
if (baselines.contains(ATOMIC_RMW)) {
// ---- empty (rmw & fre;coe) ----
Relation rmw = repo.getRelation(RMW);
Relation coe = repo.getRelation(COE);
Relation fre = repo.getRelation(FRE);
Relation frecoe = new RelComposition(fre, coe);
repo.addRelation(frecoe);
Relation rmwANDfrecoe = new RelIntersection(rmw, frecoe);
repo.addRelation(rmwANDfrecoe);
baseline.addAxiom(new Empty(rmwANDfrecoe));
}
return baseline;
}
Aggregations