public void Goto(JtagFsmState tstate) { int[] todo = _fsmModel.GetPathActions(tstate); if (todo != null) { Shift(todo); } }
protected void _reportFailedPathfinding( JtagFsmState tstate, JtagFsmState cstate ) { throw new Exception(string.Format( "pathfinding failed: {0} -> {1}", cstate, tstate )); }
public int Shift(int tms, int tdi = 0) { _state = _fsmModel.Shift(tms); return(_iface.Shift(tms, tdi)); }
public int[] GetPathActions( JtagFsmState tstate, JtagFsmState cstate ) { int[] ret = null; if (tstate == cstate) // exception 0: we are already there { ret = null; } else if (tstate == JtagFsmState.reset) // exception 1: reset { ret = new int[] { 1, 1, 1, 1, 1 }; } else { switch (cstate) // pathfinding logic { case JtagFsmState.unknown0: _reportFailedPathfinding(tstate, cstate); break; case JtagFsmState.unknown1: _reportFailedPathfinding(tstate, cstate); break; case JtagFsmState.unknown2: _reportFailedPathfinding(tstate, cstate); break; case JtagFsmState.unknown3: _reportFailedPathfinding(tstate, cstate); break; case JtagFsmState.unknown4: _reportFailedPathfinding(tstate, cstate); break; case JtagFsmState.reset: switch (tstate) { case JtagFsmState.shiftIr: ret = new int[] { 0, 1, 1, 0, 0 }; break; case JtagFsmState.shiftDr: ret = new int[] { 0, 1, 0, 0 }; break; default: _reportFailedPathfinding(tstate, cstate); break; } break; case JtagFsmState.shiftIr: if (tstate == JtagFsmState.shiftDr) { ret = new int[] { 1, 1, 1, 0, 0 }; } else { _reportFailedPathfinding(tstate, cstate); } break; case JtagFsmState.shiftDr: _reportFailedPathfinding(tstate, cstate); break; default: _reportFailedPathfinding(tstate, cstate); break; } } if (DEBUG) { if (ret != null) { var tester = new JtagFsmModel(State); for (int i = 0; i < ret.Length; i++) { tester.Shift(ret[i]); } if (tester.State != tstate) { Console.WriteLine("pathfinding sanity check failed:\n" + string.Format("requested state: {0}\n", tstate) + string.Format("current state: {0}\n", cstate) + string.Format("actions: {0}\n", ret) + string.Format("tester state: {0}\n", tester.State) ); throw new Exception("pathfinding sanity check failed"); } } } return(ret); }
// pathfinding section public int[] GetPathActions(JtagFsmState tstate) { return(GetPathActions(tstate, State)); }
public JtagFsmState Shift(int tms) { JtagFsmState[] options = _transitionTable[State]; State = (tms != 0) ? options[0] : options[1]; return(State); }
public JtagFsmModel(JtagFsmState initState = JtagFsmState.unknown0) { State = initState; }