예제 #1
0
        private MyPGM GetSubroutineConn(int States, ref int[] SubConn)
        {
            MyPGM   ConnMatrix = new MyPGM(States * 2, States * ReadWriteHead.YRailsCnt + 1);
            TMState tmpState   = m_TMStates;

            SubConn = new int[ConnMatrix.XSize];
            int[] ConnY = new int[ConnMatrix.YSize];
            m_Connected = new byte[ConnMatrix.XSize];
            int ActStateNr = 0;

            for (int i = 0; i < SubConn.Length; i++)
            {
                SubConn[i] = 0;
            }
            for (int i = 0; i < ConnY.Length; i++)
            {
                ConnY[i] = 0;
            }
            while (tmpState != null)
            {
                int StateNr = TMLoader.FindStateNr(m_TMStates, tmpState.GetStateN());
                int YPos    = (ActStateNr / 2) * ReadWriteHead.YRailsCnt;
                if (StateNr >= 0)
                {
                    if ((ActStateNr % 2) == 0)
                    {
                        YPos += ReadWriteHead.XReadOutputTrue;
                    }
                    else
                    {
                        YPos += ReadWriteHead.XReadOutputFalse;
                    }
                    bool Dir = false;
                    if (tmpState.GetMove().Equals("R"))
                    {
                        Dir = true;
                    }
                    int SubPos = GetSubOutPos(States, StateNr, Dir);
                    if (tmpState.GetRead().Equals(tmpState.GetWrite()))
                    {
                        if (SubConn[SubPos] == 0)
                        {
                            SubConn[SubPos] = 1;
                        }
                        ConnMatrix.SetValue(SubPos, YPos, 1);
                    }
                    else
                    {
                        SubConn[SubPos] = 2;
                        ConnMatrix.SetValue(SubPos, YPos, 2);
                    }
                    ConnY[YPos] = SubPos + 1;
                }
                ActStateNr++;
                tmpState = tmpState.GetNext();
            }
            FillConnMatrix(ConnMatrix, SubConn, ConnY);
            return(ConnMatrix);
        }
예제 #2
0
        private void LoadTM_Click(object sender, System.EventArgs e)
        {
            OpenFileDialog opfd = new OpenFileDialog();

            opfd.Filter           = "XML File (*.tm)|*.tm";
            opfd.FilterIndex      = 1;
            opfd.RestoreDirectory = true;
            opfd.Title            = "Load Turing Machine";
            DialogResult res    = opfd.ShowDialog(this);
            string       TMName = opfd.FileName;

            if (res == DialogResult.OK)
            {
                string   PgmName = Path.ChangeExtension(TMName, "pgm");
                TMLoader TM      = new TMLoader();
                if (TM.Load(TMName))
                {
                    TMState ts   = TM.GetStates;
                    Tape    tp   = TM.GetTape;
                    Circuit circ = new Circuit(ts, tp, TMLoader.FindStateNr(ts, TM.StartState), TM.StartTapePos);
                    circ.CircuitPgm.Write(PgmName);
                }
            }
        }