while(!queue.isEmpty()) {
if (sc.shouldStop()) {
System.out.println("---------------interrupted!");
return null;
}
CFGVertice vertice = queue.poll();
//compute inputs
log.debug("Processing vertice:" + vertice);
DI oldValue = values.get(vertice);
log.debug("Cumulative input before: " + oldValue);
DI newValue = calcualteCumulativeInput(inputs.get(vertice), edgeValues);
log.debug("Cumulative input after: " + newValue);
//perform widening if required
if (oldValue != null && wideningCounts.containsKey(vertice)) {
int iteration = wideningCounts.get(vertice).inc();
WideningOperator<DI> wid = widenings.get(vertice);
newValue = wid.widen(oldValue, newValue);
logWidening(graph, semantics, iteration);
}
// //verify if semantics is "correct"
// if (newValue == null || (oldValue != null && !oldValue.leq(newValue)))
// throw new InterpreterException("Invalid semantics!!, old value: '%s', new value: '%s'", oldValue, newValue);
//no changes, no propagation required
if (oldValue !=null && oldValue.equals(newValue))
continue;
values.put(vertice, newValue);
//we have to propagate!!
for(CFGMultiTargetEdge multiEdge: vertice.getOutgoingMultiEdges())
for(Pair<CFGSingleEdge, DI> res: multiEdge.acceptVerified(semantics, newValue)){
log.debug(" Edge: "+res.left);
CFGSingleEdge edge = res.left;
DI newEdgeValue = res.right;
// DI oldEdgeValue = edgeValues.get(res.left);