package synthesijer.hdl.sequencer;
import java.util.ArrayList;
import synthesijer.hdl.HDLExpr;
import synthesijer.hdl.HDLSequencer;
import synthesijer.hdl.HDLSignal;
import synthesijer.hdl.expr.HDLValue;
public class SequencerState{
private ArrayList<StateTransitCondition> transitions = new ArrayList<>();
private StateTransitCondition defaultTransition = null;
private final HDLSignal key;
private final HDLValue id;
private final HDLSequencer seq;
private int constantDelay = 0;
private HDLSignal exitFlag = null;
public SequencerState(HDLSequencer seq, HDLSignal key, HDLValue id){
this.key = key;
this.id = id;
this.seq = seq;
}
public HDLSequencer getSequencer(){
return seq;
}
public HDLValue getStateId(){
return id;
}
public HDLSignal getKey(){
return key;
}
public void addStateTransit(HDLExpr expr, SequencerState d){
transitions.add(new StateTransitCondition(key, id, expr, d));
//if(expr == null) return;
//if(expr.getType().isBit()) return;
//SynthesijerUtils.error(String.format("%s is not allowed, only bit type is allowd", expr));
}
public void addStateTransit(SequencerState dest){
//transitions.add(new StateTransitCondition(key, id, null, dest));
defaultTransition = new StateTransitCondition(key, id, null, dest);
}
public ArrayList<StateTransitCondition> getTransitions(){
//return transitions;
ArrayList<StateTransitCondition> lst = new ArrayList<>();
lst.addAll(transitions);
if(defaultTransition != null){
lst.add(defaultTransition);
}
return lst;
}
public void setMaxConstantDelay(int v){
if(constantDelay < v){
constantDelay = v;
}
}
public int getConstantDelay(){
return constantDelay;
}
public void setStateExitFlag(HDLSignal expr){
this.exitFlag = expr;
}
public String getExitConditionAsVHDL(){
String s = "";
String sep = "";
if(constantDelay > 0){
s += String.format("%s >= %d", seq.getDelayCounter().getName(), getConstantDelay());
sep = " and ";
}
if(exitFlag != null){
//System.out.println(exitFlag);
if(exitFlag.getType().isBit()){
s += sep + String.format("%s = '1'", exitFlag.getVHDL());
}else{
if(exitFlag.getType().isVector()){
s += sep + String.format("signed(%s) /= 0", exitFlag.getVHDL());
}else{
s += sep + String.format("%s /= 0", exitFlag.getVHDL());
}
}
}
return s;
}
public String getExitConditionAsVerilogHDL(){
String s = "";
String sep = "";
if(constantDelay > 0){
s += String.format("%s >= %d", seq.getDelayCounter().getName(), getConstantDelay());
sep = " && ";
}
if(exitFlag != null){
if(exitFlag.getType().isBit()){
s += sep + String.format("%s == 1'b1", exitFlag.getVerilogHDL());
}else{
s += sep + String.format("%s != 0", exitFlag.getVerilogHDL());
}
}
return s;
}
public boolean hasExitCondition(){
return (exitFlag != null) || (constantDelay > 0);
}
}