Search in sources :

Example 6 with Atom

use of com.dat3m.dartagnan.expression.Atom in project Dat3M by hernanponcedeleon.

the class AtomicAsLock method run.

private void run(MemoryObject address, Thread thread) {
    Label end;
    if (thread.getExit() instanceof Label) {
        end = (Label) thread.getExit();
    } else {
        end = newLabel("__VERIFIER_atomic_thread_end");
        thread.getExit().setSuccessor(end);
        thread.updateExit(end);
    }
    Register register = thread.newRegister(ARCH_PRECISION);
    for (Event predecessor = thread.getEntry(); predecessor != null; ) {
        Event event = predecessor.getSuccessor();
        boolean begin = event instanceof BeginAtomic;
        if (begin || event instanceof EndAtomic) {
            Event load = EventFactory.newLoad(register, address, null);
            Event check = EventFactory.newJump(new Atom(register, NEQ, begin ? IValue.ZERO : IValue.ONE), end);
            Event store = EventFactory.newStore(address, begin ? IValue.ONE : IValue.ZERO, null);
            load.setOId(event.getOId());
            check.setOId(event.getOId());
            store.setOId(event.getOId());
            load.addFilters(Tag.C11.LOCK, Tag.RMW);
            check.addFilters(Tag.C11.LOCK, Tag.RMW);
            store.addFilters(Tag.C11.LOCK, Tag.RMW);
            predecessor.setSuccessor(load);
            load.setSuccessor(check);
            check.setSuccessor(store);
            store.setSuccessor(event.getSuccessor());
            predecessor = store;
        } else {
            predecessor = event;
        }
    }
}
Also used : EndAtomic(com.dat3m.dartagnan.program.event.lang.svcomp.EndAtomic) Register(com.dat3m.dartagnan.program.Register) BeginAtomic(com.dat3m.dartagnan.program.event.lang.svcomp.BeginAtomic) Label(com.dat3m.dartagnan.program.event.core.Label) EventFactory.newLabel(com.dat3m.dartagnan.program.event.EventFactory.newLabel) Event(com.dat3m.dartagnan.program.event.core.Event) Atom(com.dat3m.dartagnan.expression.Atom)

Example 7 with Atom

use of com.dat3m.dartagnan.expression.Atom in project Dat3M by hernanponcedeleon.

the class VisitorBase method visitUnlock.

@Override
public List<Event> visitUnlock(Unlock e) {
    Register resultRegister = e.getResultRegister();
    IExpr address = e.getAddress();
    String mo = e.getMo();
    List<Event> events = eventSequence(newLoad(resultRegister, address, mo), newJump(new Atom(resultRegister, NEQ, IValue.ONE), (Label) e.getThread().getExit()), newStore(address, IValue.ZERO, mo));
    for (Event child : events) {
        child.addFilters(C11.LOCK, RMW);
    }
    return events;
}
Also used : Register(com.dat3m.dartagnan.program.Register) Label(com.dat3m.dartagnan.program.event.core.Label) Event(com.dat3m.dartagnan.program.event.core.Event) IExpr(com.dat3m.dartagnan.expression.IExpr) Atom(com.dat3m.dartagnan.expression.Atom)

Aggregations

Atom (com.dat3m.dartagnan.expression.Atom)7 Label (com.dat3m.dartagnan.program.event.core.Label)6 Event (com.dat3m.dartagnan.program.event.core.Event)5 Register (com.dat3m.dartagnan.program.Register)4 ParsingException (com.dat3m.dartagnan.exception.ParsingException)2 Cmp (com.dat3m.dartagnan.program.event.core.Cmp)2 BExprUn (com.dat3m.dartagnan.expression.BExprUn)1 IExpr (com.dat3m.dartagnan.expression.IExpr)1 EventFactory.newLabel (com.dat3m.dartagnan.program.event.EventFactory.newLabel)1 CondJump (com.dat3m.dartagnan.program.event.core.CondJump)1 BeginAtomic (com.dat3m.dartagnan.program.event.lang.svcomp.BeginAtomic)1 EndAtomic (com.dat3m.dartagnan.program.event.lang.svcomp.EndAtomic)1