package synthesijer.scheduler.opt; import synthesijer.scheduler.Op; import synthesijer.scheduler.SchedulerBoard; import synthesijer.scheduler.SchedulerInfo; import synthesijer.scheduler.SchedulerItem; import synthesijer.scheduler.SchedulerSlot; public class ReduceRedundantJump implements SchedulerInfoOptimizer{ public SchedulerInfo opt(SchedulerInfo info){ SchedulerInfo result = info.getSameInfo(); for(SchedulerBoard b: info.getBoardsList()){ result.addBoard(conv(b)); } return result; } public String getKey(){ return "reduce_redundant_jump"; } public SchedulerBoard conv(SchedulerBoard src){ SchedulerBoard ret = src.genSameEnvBoard(); for(SchedulerSlot slot: src.getSlots()){ if(hasRedandantState(src, slot) == false){ ret.addSlot(slot); // as is }else{ int[] id = new int[slot.getNextStep().length]; for(int i = 0; i < id.length; i++){ id[i] = getTargetState(src, slot.getNextStep()[i]); } SchedulerSlot newSlot = new SchedulerSlot(slot.getStepId()); for(SchedulerItem item: slot.getItems()){ newSlot.addItem(item); item.setBranchIds(id); } ret.addSlot(newSlot); } } return ret; } public int getTargetState(SchedulerBoard b, int id){ SchedulerSlot slot = b.getSlot(id); if(slot.getItems().length == 1 && slot.getItems()[0].getOp() == Op.JP){ return getTargetState(b, slot.getNextStep()[0]); } return id; } public boolean hasRedandantState(SchedulerBoard b, SchedulerSlot slot){ for(int i: slot.getNextStep()){ SchedulerSlot s = b.getSlot(i); if(s.getItems().length == 1 && s.getItems()[0].getOp() == Op.JP){ return true; } } return false; } }