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