package jayhorn.hornify.encoder; import java.util.AbstractMap.SimpleEntry; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import jayhorn.solver.ProverExpr; import jayhorn.solver.ProverHornClause; import soottocfg.cfg.method.Method; import soottocfg.cfg.statement.AssertStatement; import soottocfg.cfg.statement.Statement; import soottocfg.cfg.variable.Variable; public class S2H { private final HashMap<Statement, List<ProverHornClause>> statToClause = new HashMap<Statement, List<ProverHornClause>>(); private final Map<ProverExpr, Integer> errorLineNumber = new LinkedHashMap<ProverExpr, Integer>(); private final Map<Method, Entry<Variable, Variable>> methodHeapBounds = new HashMap<Method, Entry<Variable, Variable>>(); private static S2H sh; public static void resetInstance() { sh = null; } public static S2H sh() { if (null == sh) { sh = new S2H(); } return sh; } private S2H() {} public void addClause(Statement s, List<ProverHornClause> h){ statToClause.put(s,h); } /** * Get Transition Relation Clauses * @return */ public List<ProverHornClause> getTransitionRelationClause(){ List<ProverHornClause> clause = new LinkedList<ProverHornClause>(); for (Statement s : this.statToClause.keySet()) if (!(s instanceof AssertStatement)) { clause.addAll(statToClause.get(s)); } return clause; } /** * */ public List<ProverHornClause> getPropertyClause(){ List<ProverHornClause> clause = new LinkedList<ProverHornClause>(); for (Statement s : this.statToClause.keySet()) if (s instanceof AssertStatement) { clause.addAll(statToClause.get(s)); } return clause; } public void setErrorState(ProverExpr errorState, int i){ this.errorLineNumber.put(errorState, i); } public Map<ProverExpr, Integer> getErrorState(){ return this.errorLineNumber; } public void setHeapCounter(Method m, Variable inCounter, Variable outCounter){ Entry<Variable, Variable> in_out = new SimpleEntry<>(inCounter, outCounter); methodHeapBounds.put(m, in_out); } public Entry<Variable, Variable> getMethodHeapVar(Method m){ return methodHeapBounds.get(m); } public Entry<Variable, Variable> getMainHeapCount(){ for (Entry<Method, Entry<Variable, Variable>> vars : methodHeapBounds.entrySet()) { if(vars.getKey().isProgramEntryPoint()){ return vars.getValue(); } } throw new RuntimeException("No Main Heap Count Found "); } }