/******************************************************************************
* Copyright (c) 2009 - 2015 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
/**
*
*/
package com.ibm.wala.memsat.concurrent.memory.simple;
import static com.ibm.wala.memsat.frontEnd.InlinedInstruction.Action.NORMAL_WRITE;
import static com.ibm.wala.memsat.frontEnd.InlinedInstruction.Action.VOLATILE_WRITE;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.memsat.concurrent.Program;
import com.ibm.wala.memsat.frontEnd.WalaInformation;
import com.ibm.wala.memsat.util.Graphs;
import kodkod.ast.Expression;
import kodkod.ast.Formula;
import kodkod.ast.Relation;
import kodkod.ast.Variable;
/**
* Implements the processor consistency specification from [1]
* @see [1] Y.�Yang, G.�Gopalakrishnan, G.�Lindstrom, and K.�Slind.
* Nemos: a framework for axiomatic and executable specifications of memory consistency models.
* In IPDPS �04, pages 26�30, 2004.
* @author etorlak
*/
public final class ProcessorConsistency extends SimpleMemoryModel<Object> {
/**
* Creates a new instance of the processor consistency memory model.
*/
public ProcessorConsistency() { }
/**
* {@inheritDoc}
* @see com.ibm.wala.memsat.concurrent.memory.simple.SimpleMemoryModel#consistencyConstraints(com.ibm.wala.memsat.concurrent.Program, com.ibm.wala.memsat.concurrent.memory.simple.SimpleExecution)
*/
@Override
protected Formula consistencyConstraints(Program prog, SimpleExecution<Object> exec) {
final Collection<Formula> cc = new ArrayList<Formula>();
final WalaInformation info = prog.info();
final Expression acts = exec.actions();
final Expression ord = exec.ordering(info.threads());
final Expression initThread = prog.threads(Collections.singleton(Graphs.root(info.threads())));
final Expression initWrites = Expression.intersection(prog.actionsOf(initThread), prog.allOf(NORMAL_WRITE, VOLATILE_WRITE), acts);
final Variable w = Variable.unary("w");
cc.add( exec.weakTotalOrder(exec.restrictVarWr(acts, exec.locationOf(w)), ord).forAll(w.oneOf(initWrites)) );
for(CGNode proc : info.threads()) {
final Expression procActs = exec.restrictProc(acts, prog.threads(Collections.singleton(proc)));
final Expression procOrd = exec.ordering(proc);
cc.add( exec.programOrder(procActs, procOrd) );
cc.add( exec.serialization(procActs, procOrd) );
cc.add( exec.mapConstraints(acts, ord, procActs, procOrd) );
}
return Formula.and(cc);
}
/**
* {@inheritDoc}
* @see com.ibm.wala.memsat.concurrent.memory.simple.SimpleMemoryModel#execution(com.ibm.wala.memsat.concurrent.Program)
*/
@Override
protected SimpleExecution<Object> execution(Program prog) {
final Map<Object, Relation> ords = new LinkedHashMap<Object, Relation>();
ords.put(prog.info().threads(), Relation.binary("ord"));
for(CGNode root : prog.info().threads()) {
ords.put(root, Relation.binary("ord"+root.getMethod().getName()));
}
return new SimpleExecution<Object>(prog, ords);
}
}