Beispiel #1
0
 public void Goto(JtagFsmState tstate)
 {
     int[] todo = _fsmModel.GetPathActions(tstate);
     if (todo != null)
     {
         Shift(todo);
     }
 }
Beispiel #2
0
 protected void _reportFailedPathfinding(
     JtagFsmState tstate, JtagFsmState cstate
     )
 {
     throw new Exception(string.Format(
                             "pathfinding failed: {0} -> {1}", cstate, tstate
                             ));
 }
Beispiel #3
0
 public int Shift(int tms, int tdi = 0)
 {
     _state = _fsmModel.Shift(tms);
     return(_iface.Shift(tms, tdi));
 }
Beispiel #4
0
    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);
    }
Beispiel #5
0
 // pathfinding section
 public int[] GetPathActions(JtagFsmState tstate)
 {
     return(GetPathActions(tstate, State));
 }
Beispiel #6
0
 public JtagFsmState Shift(int tms)
 {
     JtagFsmState[] options = _transitionTable[State];
     State = (tms != 0) ? options[0] : options[1];
     return(State);
 }
Beispiel #7
0
 public JtagFsmModel(JtagFsmState initState = JtagFsmState.unknown0)
 {
     State = initState;
 }