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); }