/****************************************************************************** * 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.translation.sequential; import com.ibm.wala.memsat.Options; import com.ibm.wala.memsat.frontEnd.WalaInformation; import com.ibm.wala.memsat.representation.ExpressionFactory; import com.ibm.wala.memsat.translation.Environment; import com.ibm.wala.memsat.translation.MethodTranslation; import com.ibm.wala.memsat.translation.Translator; import com.ibm.wala.memsat.util.Nodes; import kodkod.ast.Formula; import kodkod.instance.Bounds; import kodkod.instance.Universe; /** * A translator for sequential Wala programs. * * @author Emina Torlak */ public final class SequentialTranslator { private SequentialTranslator() {} /** * Returns the translation of the method described by the * given wala information instance, with respect to the * specified translation options. * @requires info.threads() = 1 * @return { t : Translation | t.info = info and t.options = options} */ public static SequentialTranslation translate(final WalaInformation info, final Options options) { assert info.threads().getNumberOfNodes() == 1; final ExpressionFactory factory = new ExpressionFactory(info, options); final MethodTranslation transl = Translator.translate( (new Environment(factory)).push(info.threads().iterator().next()), new SequentialMemoryHandler()); final Bounds bounds = new Bounds(new Universe(factory.atoms())); factory.boundAll(bounds); final Formula invariants = factory.invariants(); final Formula assumptions = Formula.and(transl.assumptions()); final Formula assertions; if (options.assertsAreAssumptions()) { assertions = Formula.and(transl.assertions()); } else { assertions = Formula.or(transl.assertions()); } final Formula formula = Nodes.simplify(Formula.and(invariants, assumptions, assertions), bounds); return new SequentialTranslation(formula, bounds, factory, transl); } }