Пример #1
0
        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();
            }
        }
Пример #2
0
        // 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();
        }
Пример #3
0
        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);
        }
Пример #4
0
 private static void Load(string[] args)
 {
     mainChip = FileHelper.Deserialize(args[1]);
     Console.WriteLine($"{args[1]} file loaded");
 }