示例#1
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);
    }