use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class Refiner method refine.
// This method computes a refinement clause from a set of violations.
// Furthermore, it computes symmetric violations if symmetry learning is enabled.
public BooleanFormula refine(DNF<CoreLiteral> coreReasons, SolverContext context) {
// TODO: A specialized algorithm that computes the orbit under permutation may be better,
// since most violations involve only few threads and hence the orbit is far smaller than the full
// set of permutations.
BooleanFormulaManager bmgr = context.getFormulaManager().getBooleanFormulaManager();
BooleanFormula refinement = bmgr.makeTrue();
// For each symmetry permutation, we will create refinement clauses
for (Function<Event, Event> perm : symmPermutations) {
for (Conjunction<CoreLiteral> reason : coreReasons.getCubes()) {
BooleanFormula permutedClause = reason.getLiterals().stream().map(lit -> bmgr.not(permuteAndConvert(lit, perm, context))).reduce(bmgr.makeFalse(), bmgr::or);
refinement = bmgr.and(refinement, permutedClause);
}
}
return refinement;
}
use of com.dat3m.dartagnan.program.event.core.Event 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.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class VerificationTask method updateAssertions.
private void updateAssertions(Program program) {
List<Event> assertions = program.getCache().getEvents(FilterBasic.get(ASSERTION));
AbstractAssert ass = new AssertTrue();
if (!assertions.isEmpty()) {
ass = new AssertInline((Local) assertions.get(0));
for (int i = 1; i < assertions.size(); i++) {
ass = new AssertCompositeOr(ass, new AssertInline((Local) assertions.get(i)));
}
}
program.setAss(ass);
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class RelCo method getMaxTupleSet.
@Override
public TupleSet getMaxTupleSet() {
if (maxTupleSet == null) {
logger.info("Computing maxTupleSet for " + getName());
AliasAnalysis alias = analysisContext.get(AliasAnalysis.class);
WmmAnalysis wmmAnalysis = analysisContext.get(WmmAnalysis.class);
maxTupleSet = new TupleSet();
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 e1 : eventsInit) {
for (Event e2 : eventsStore) {
if (alias.mayAlias((MemEvent) e1, (MemEvent) e2)) {
maxTupleSet.add(new Tuple(e1, e2));
}
}
}
for (Event e1 : eventsStore) {
for (Event e2 : eventsStore) {
if (e1.getCId() != e2.getCId() && alias.mayAlias((MemEvent) e1, (MemEvent) e2)) {
maxTupleSet.add(new Tuple(e1, e2));
}
}
}
removeMutuallyExclusiveTuples(maxTupleSet);
if (wmmAnalysis.isLocallyConsistent()) {
applyLocalConsistencyMaxSet();
}
logger.info("maxTupleSet size for " + getName() + ": " + maxTupleSet.size());
}
return maxTupleSet;
}
use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.
the class RelRf method getMaxTupleSet.
@Override
public TupleSet getMaxTupleSet() {
if (maxTupleSet == null) {
AliasAnalysis alias = analysisContext.get(AliasAnalysis.class);
WmmAnalysis wmmAnalysis = analysisContext.get(WmmAnalysis.class);
logger.info("Computing maxTupleSet for " + getName());
maxTupleSet = new TupleSet();
List<Event> loadEvents = task.getProgram().getCache().getEvents(FilterBasic.get(READ));
List<Event> storeEvents = task.getProgram().getCache().getEvents(FilterBasic.get(WRITE));
for (Event e1 : storeEvents) {
for (Event e2 : loadEvents) {
if (alias.mayAlias((MemEvent) e1, (MemEvent) e2)) {
maxTupleSet.add(new Tuple(e1, e2));
}
}
}
removeMutuallyExclusiveTuples(maxTupleSet);
if (wmmAnalysis.isLocallyConsistent()) {
applyLocalConsistency();
}
if (wmmAnalysis.doesRespectAtomicBlocks()) {
atomicBlockOptimization();
}
logger.info("maxTupleSet size for " + getName() + ": " + maxTupleSet.size());
}
return maxTupleSet;
}
Aggregations