private static void Main(string[] _) { mainChip = new CircuitChip(); allPins = new List <Pin>(); allChips = new List <Chip>(); FileHelper.Initialize(); RegeneratePinIds(); RegenerateChipIds(); while (true) { try { DoCommand(); } catch (Exception e) { Console.WriteLine(e); Console.WriteLine(); } RegeneratePinIds(); RegenerateChipIds(); } }
// serializes a single chip (shallowly) public static void Serialize(CircuitChip chip) { var writer = new StreamWriter(NameToPath(chip.Name)); writer.WriteLine("v:1"); writer.WriteLine(chip.Name); writer.WriteLine($"Pins:{chip.Pins.Count}"); SerializePins(chip.Pins, writer); writer.WriteLine($"Chips:{chip.Chips.Count}"); foreach (var c in chip.Chips) { writer.WriteLine(c.Name); SerializePins(c.Pins, writer); } writer.Close(); }
public static CircuitChip Deserialize(string name) { var path = NameToPath(name); if (!File.Exists(path)) { throw new FileNotFoundException(); } var reader = new StreamReader(path); var version = reader.ReadLine(); ParseField(version, "v", out _, out int versionNumber); if (versionNumber != 1) { throw new InvalidDataException("Invalid version number"); } var circuitName = reader.ReadLine(); var circuitChip = new CircuitChip(circuitName); var pinStateDict = new Dictionary <int, PinState>(); var pinsIdentifier = reader.ReadLine(); ParseField(pinsIdentifier, "Pins", out _, out int pinCount); for (var i = 0; i < pinCount; i++) { var hasPinName = ParseField(reader.ReadLine(), out string pinName, out int pinStateId); Pin pinToAdd; if (pinStateDict.TryGetValue(pinStateId, out PinState pinState)) { pinToAdd = new Pin(pinState); // id exists, connect pin to existing pin state } else { pinToAdd = new Pin(); // id does not exist, create new pin state and add to dict pinStateDict.Add(pinStateId, pinToAdd.PinState); } if (hasPinName) { pinToAdd.Name = pinName; } circuitChip.AddPin(pinToAdd); } var chipsIdentifier = reader.ReadLine(); ParseField(chipsIdentifier, "Chips", out _, out int chipCount); for (var i = 0; i < chipCount; i++) { var chipName = reader.ReadLine(); Chip chip; if (Chip.IsPrimative(chipName, out PrimativeChipType primativeChipType)) { chip = new PrimativeChip(primativeChipType); } else { chip = Deserialize(chipName); } for (var pinIndex = 0; pinIndex < chip.Pins.Count; pinIndex++) { var currentPin = chip.Pins[pinIndex]; var hasPinName = ParseField(reader.ReadLine(), out string pinName, out int pinStateId); if (hasPinName) { currentPin.Name = pinName; } if (pinStateDict.TryGetValue(pinStateId, out PinState pinState)) { PinState.Connect(pinState, currentPin.PinState); // connect on the pinstate level } else { pinStateDict.Add(pinStateId, currentPin.PinState); } } circuitChip.AddChip(chip); } return(circuitChip); }
private static void Load(string[] args) { mainChip = FileHelper.Deserialize(args[1]); Console.WriteLine($"{args[1]} file loaded"); }