Esempio n. 1
0
        private Gate CreateComponent(string[] compArr, SystemModel theModel, Dictionary<Wire.WireType, Dictionary<int, Wire>> wiresDictionary)
        {
            if(compArr==null||compArr.Length<4)
                return null; //throw

            int id;

            if(compArr[1].Length<5 || !compArr[1].StartsWith("gate"))
                return null; //throw

            if(!Int32.TryParse(compArr[1].Substring(4),out id))
                return null; //throw
            Wire output = null;
            string oname = compArr[2];
            int oid;
            if(Int32.TryParse(oname.Substring(1),out oid))
            {
                if (oname.StartsWith("o"))
                {
                   if(!wiresDictionary[Wire.WireType.o].TryGetValue(oid,out output))
                   {
                       output = new Wire(oid,Wire.WireType.o);
                       wiresDictionary[Wire.WireType.o].Add(oid, output);
                       theModel.Output.Add(output);
                   }

                }
                else if(oname.StartsWith("z"))
                {
                    if (!wiresDictionary[Wire.WireType.z].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.z);
                        wiresDictionary[Wire.WireType.z].Add(oid, output);
                        theModel.Internal.Add(output);
                    }
                }
                //cant be i 
            }
            if (compArr.Length == 4)
            {
                OneInputComponent ans = null;
                if (compArr[0].Equals("inverter"))
                    ans = new OneInputComponent(id, Gate.Type.not);
                if (compArr[0].Equals("buffer"))
                    ans = new OneInputComponent(id, Gate.Type.buffer);
                if (ans != null)
                {
                    if(output!=null)
                        ans.Output = output;
                    string iname = compArr[3];
                    int inid;
                    Wire input = null;
                    if (Int32.TryParse(iname.Substring(1), out inid))
                    {
                        if (iname.StartsWith("o"))
                        {
                            if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.o);
                                wiresDictionary[Wire.WireType.o].Add(inid, input);
                                theModel.Output.Add(input);
                            }

                        }
                        else if (iname.StartsWith("z"))
                        {
                            if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.z);
                                wiresDictionary[Wire.WireType.z].Add(inid, input);
                                theModel.Internal.Add(input);
                            }
                        }
                        else if (iname.StartsWith("i"))
                        {
                            if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.i);
                                wiresDictionary[Wire.WireType.i].Add(inid, input);
                                theModel.Input.Add(input);
                            }
                        }
                    }
                    if (input != null)
                        ans.Input1 = input;
                }
                return ans;
            }
            if (compArr.Length >= 5)
            {
                MultipleInputComponent ans = null;
                if (compArr[0].StartsWith("and"))
                    ans = new MultipleInputComponent(id, Gate.Type.and);
                if (compArr[0].StartsWith("nor"))
                    ans = new MultipleInputComponent(id, Gate.Type.nor);
                if (compArr[0].StartsWith("xor"))
                    ans = new MultipleInputComponent(id, Gate.Type.xor);
                if (compArr[0].StartsWith("nand"))
                    ans = new MultipleInputComponent(id, Gate.Type.nand);
                if (compArr[0].StartsWith("or"))
                    ans = new MultipleInputComponent(id, Gate.Type.or);
                if (ans != null)
                {
                    if (output != null)
                        ans.Output = output;
                    for (int i = 3; i < compArr.Length; i++)
                    {
                        string iname = compArr[i];
                        int inid;
                        Wire input = null;
                        if (Int32.TryParse(iname.Substring(1), out inid))
                        {
                            if (iname.StartsWith("o"))
                            {
                                if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.o);
                                    wiresDictionary[Wire.WireType.o].Add(inid, input);
                                    theModel.Output.Add(input);
                                }

                            }
                            else if (iname.StartsWith("z"))
                            {
                                if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.z);
                                    wiresDictionary[Wire.WireType.z].Add(inid, input);
                                    theModel.Internal.Add(input);
                                }
                            }
                            else if (iname.StartsWith("i"))
                            {
                                if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.i);
                                    wiresDictionary[Wire.WireType.i].Add(inid, input);
                                    theModel.Input.Add(input);
                                }
                            }
                        }
                        if (input != null)
                            ans.AddInput(input); 
                    }
                }
                return ans;
            }
            return null;
        }
Esempio n. 2
0
        private Gate CreateComponent(string[] compArr, SystemModel theModel, Dictionary <Wire.WireType, Dictionary <int, Wire> > wiresDictionary)
        {
            if (compArr == null || compArr.Length < 4)
            {
                Console.WriteLine("Parsing error");
                return(null);
            }

            int id;

            if (compArr[1].Length < 5 || !compArr[1].StartsWith("gate"))
            {
                Console.WriteLine("Parsing error");
                return(null);
            }

            string sid = compArr[1].Substring(4);

            if (!Int32.TryParse(sid, out id))
            {
                //in case of not numeric id:
                string toascii = "";
                foreach (char c in sid)
                {
                    int i = c;
                    toascii += i;
                }
                if (!Int32.TryParse(toascii, out id))
                {
                    Console.WriteLine("Parsing error");
                    return(null);
                }
            }
            Wire   output = null;
            string oname  = compArr[2];
            int    oid;

            if (Int32.TryParse(oname.Substring(1), out oid))
            {
                if (oname.StartsWith("o"))
                {
                    if (!wiresDictionary[Wire.WireType.o].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.o);
                        wiresDictionary[Wire.WireType.o].Add(oid, output);
                        theModel.Output.Add(output);
                    }
                }
                else if (oname.StartsWith("z"))
                {
                    if (!wiresDictionary[Wire.WireType.z].TryGetValue(oid, out output))
                    {
                        output = new Wire(oid, Wire.WireType.z);
                        wiresDictionary[Wire.WireType.z].Add(oid, output);
                        theModel.Internal.Add(output);
                    }
                }
                //cant be i
            }
            if (compArr.Length == 4)
            {
                OneInputComponent ans = null;
                if (compArr[0].Equals("inverter"))
                {
                    ans = new OneInputComponent(id, Gate.Type.not);
                }
                if (compArr[0].Equals("buffer"))
                {
                    ans = new OneInputComponent(id, Gate.Type.buffer);
                }
                if (ans != null)
                {
                    if (output != null)
                    {
                        ans.Output = output;
                    }
                    string iname = compArr[3];
                    int    inid;
                    Wire   input = null;
                    if (Int32.TryParse(iname.Substring(1), out inid))
                    {
                        if (iname.StartsWith("o"))
                        {
                            if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.o);
                                wiresDictionary[Wire.WireType.o].Add(inid, input);
                                theModel.Output.Add(input);
                            }
                        }
                        else if (iname.StartsWith("z"))
                        {
                            if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.z);
                                wiresDictionary[Wire.WireType.z].Add(inid, input);
                                theModel.Internal.Add(input);
                            }
                        }
                        else if (iname.StartsWith("i"))
                        {
                            if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                            {
                                input = new Wire(inid, Wire.WireType.i);
                                wiresDictionary[Wire.WireType.i].Add(inid, input);
                                theModel.Input.Add(input);
                            }
                        }
                    }
                    if (input != null)
                    {
                        ans.Input1 = input;
                    }
                }
                return(ans);
            }
            if (compArr.Length >= 5)
            {
                MultipleInputComponent ans = null;
                if (compArr[0].StartsWith("and"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.and);
                }
                if (compArr[0].StartsWith("nor"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.nor);
                }
                if (compArr[0].StartsWith("xor"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.xor);
                }
                if (compArr[0].StartsWith("nand"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.nand);
                }
                if (compArr[0].StartsWith("or"))
                {
                    ans = new MultipleInputComponent(id, Gate.Type.or);
                }
                if (ans != null)
                {
                    if (output != null)
                    {
                        ans.Output = output;
                    }
                    for (int i = 3; i < compArr.Length; i++)
                    {
                        string iname = compArr[i];
                        int    inid;
                        Wire   input = null;
                        if (Int32.TryParse(iname.Substring(1), out inid))
                        {
                            if (iname.StartsWith("o"))
                            {
                                if (!wiresDictionary[Wire.WireType.o].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.o);
                                    wiresDictionary[Wire.WireType.o].Add(inid, input);
                                    theModel.Output.Add(input);
                                }
                            }
                            else if (iname.StartsWith("z"))
                            {
                                if (!wiresDictionary[Wire.WireType.z].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.z);
                                    wiresDictionary[Wire.WireType.z].Add(inid, input);
                                    theModel.Internal.Add(input);
                                }
                            }
                            else if (iname.StartsWith("i"))
                            {
                                if (!wiresDictionary[Wire.WireType.i].TryGetValue(inid, out input))
                                {
                                    input = new Wire(inid, Wire.WireType.i);
                                    wiresDictionary[Wire.WireType.i].Add(inid, input);
                                    theModel.Input.Add(input);
                                }
                            }
                        }
                        if (input != null)
                        {
                            ans.AddInput(input);
                        }
                    }
                }
                return(ans);
            }
            return(null);
        }