package synthesijer.scheduler; import java.util.Enumeration; import java.util.Hashtable; import synthesijer.ast.Type; public class VariableOperand implements Operand{ private final String name; private final Type type; private Operand initSrc; private final boolean publicFlag; private final boolean globalConstantFlag; private final boolean methodParamFlag; private final String origName; private final String methodName; private final boolean privateMethodFlag; private final boolean volatileFlag; private boolean chaining = false; private final boolean memberFlag; private boolean debugFlag = false; private Hashtable<SchedulerItem, SchedulerItem> predItemMap = new Hashtable<>(); // context -> predecessor public VariableOperand(String name, Type type, boolean memberFlag){ this(name, type, null, false, false, false, name, null, false, false, memberFlag); } public VariableOperand( String name, Type type, Operand initSrc, boolean publicFlag, boolean globalConstantFlag, boolean methodParamFlag, String origName, String methodName, boolean privateMethodFlag, boolean volatileFlag, boolean memberFlag ){ this.name = name; this.type = type; this.initSrc = initSrc; this.publicFlag = publicFlag; this.globalConstantFlag = globalConstantFlag; this.methodParamFlag = methodParamFlag; this.origName = origName; this.methodName = methodName; this.privateMethodFlag = privateMethodFlag; this.volatileFlag = volatileFlag; this.memberFlag = memberFlag; } public String getName(){ return name; } @Override public Type getType(){ return type; } public Operand getInitSrc(){ return initSrc; } public void setInitSrc(Operand src){ initSrc = src; } public boolean isPublic(){ return publicFlag; } public boolean isGlobalConstant(){ return globalConstantFlag; } public boolean isMethodParam(){ return methodParamFlag; } public String getOrigName(){ return origName; } public String getMethodName(){ return methodName; } public boolean isPrivateMethod(){ return privateMethodFlag; } public boolean isVolatileFlag(){ return volatileFlag; } public void setChaining(SchedulerItem ctx, SchedulerItem pred){ chaining = true; predItemMap.put(ctx, pred); } @Override public boolean isChaining(SchedulerItem ctx){ return predItemMap.containsKey(ctx); } public boolean isMember(){ return memberFlag; } public void setDebug(boolean flag){ debugFlag = flag; } public boolean isDebug(){ return debugFlag; } public SchedulerItem getPredItem(SchedulerItem ctx){ return predItemMap.get(ctx); } @Override public String info(){ return name + ":" + type; } public String dump(){ String s = name + ":" + type + ", public=" + publicFlag + ", globalConstant=" + globalConstantFlag + ", methodParam=" + methodParamFlag + ", origName=" + origName + ", methodName=" + methodName + ", privateMethod=" + privateMethodFlag + ", volatile=" + volatileFlag + ", chaining=" + chaining; if(initSrc != null){ s += ", init=" + initSrc.info(); } return s; } public String toSexp(){ String s = ""; s += "("; s += "VAR"; s += " " + type; s += " " + name; s += " :public " + isPublic(); s += " :global_constant " + isGlobalConstant(); s += " :method_param " + methodParamFlag; s += " :original " + getOrigName(); s += " :method " + getMethodName(); s += " :private_method " + isPrivateMethod(); s += " :volatile " + isVolatileFlag(); if(chaining){ String sep = ""; s += " :chaining ("; Enumeration<SchedulerItem> e = predItemMap.keys(); while(e.hasMoreElements()){ SchedulerItem ctx = e.nextElement(); SchedulerItem pred = predItemMap.get(ctx); s += sep + "(" + ctx.getBoardName() + " " + ctx.getStepId() + " " + pred.getBoardName()+" "+pred.getStepId() + ")"; sep = " "; } s += ")"; } s += " :member " + isMember(); if(initSrc != null){ //s += " :init " + initSrc.toSexp(); s += " :init (REF"; if(initSrc instanceof VariableOperand){ s += " VAR "; } else if(initSrc instanceof ArrayRefOperand){ s += " ARRAY "; } else if(initSrc instanceof InstanceRefOperand){ s += " INSTANCE "; } else if(initSrc instanceof ConstantOperand){ s += " CONSTANT "; } else{s += " UNKNOWN "; } s += initSrc.getName(); s += ")"; } s += ")"; return s; } }