Esempio n. 1
0
        public CpuZ80()
        {
            Clock = new DigitalSignalConsumer("CLK");

            Reset                = new DigitalSignalConsumer("RST");
            Interrupt            = new DigitalSignalConsumer("INT");
            NonMaskableInterrupt = new DigitalSignalConsumer("NMI");
            Wait = new DigitalSignalConsumer("WAIT");

            BusRequest     = new DigitalSignalConsumer("BREQ");
            BusAcknowledge = new DigitalSignalProvider("BACK");

            MemoryRequest = new DigitalSignalProvider("MREQ");
            IoRequest     = new DigitalSignalProvider("IORQ");
            Read          = new DigitalSignalProvider("RD");
            Write         = new DigitalSignalProvider("WR");

            MachineCycle1 = new DigitalSignalProvider("M1");
            Refresh       = new DigitalSignalProvider("RFSH");
            Halt          = new DigitalSignalProvider("HALT");

            Address = new BusMaster <BusData16>("Address");
            Data    = new BusMasterSlave <BusData8>("Data");

            // bond wires
            _die = new Die(
                Clock, Reset, Interrupt, NonMaskableInterrupt,
                Wait, BusRequest, BusAcknowledge,
                MemoryRequest, IoRequest, Read, Write,
                MachineCycle1, Refresh, Halt, Address, Data);
        }
        private static DigitalSignal Connect(DigitalSignalProvider provider, DigitalSignalConsumer consumer)
        {
            if (consumer.IsConnected && provider.IsConnected)
            {
                if (consumer.DigitalSignal != provider.DigitalSignal)
                {
                    throw new InvalidOperationException("Both Consumer and Provider are already connected to different signals.");
                }

                return(consumer.DigitalSignal);
            }

            DigitalSignal signal = null;

            if (consumer.IsConnected)
            {
                signal = consumer.DigitalSignal;
                provider.ConnectTo(signal);
            }
            else if (provider.IsConnected)
            {
                signal = provider.DigitalSignal;
                consumer.ConnectTo(signal);
            }

            return(signal);
        }
Esempio n. 3
0
        public DirectedGraphNode Add(DigitalSignalProvider provider, string ownerName = null)
        {
            if (!Visit(provider) ||
                (!provider.IsConnected && !DisplayUnconnected))
            {
                return(FindNode(provider));
            }

            var node = AddNode <DigitalSignalProvider>(provider.Name, ownerName, SafeNetName(provider));

            SetNodeMap(provider, node);

            if (DisplayValues)
            {
                node.Description = provider.Level.ToString();
            }

            if (provider.IsConnected)
            {
                Add(provider.DigitalSignal);

                var dsid = _idBuilder.NewId <DigitalSignal>(provider.DigitalSignal.Name);
                _dgmlBuilder.AddLink(node.Id, dsid);
            }

            return(node);
        }
Esempio n. 4
0
        public InvertorGate()
        {
            _input  = new DigitalSignalConsumer("Invertor Input");
            _output = new DigitalSignalProvider("Invertor Output");

            _input.OnChanged += Input_OnChanged;
        }
Esempio n. 5
0
        public CpuZ80()
        {
            Clock = new DigitalSignalConsumer("CLK");

            Reset                = new DigitalSignalConsumer("RST");
            Interrupt            = new DigitalSignalConsumer("INT");
            NonMaskableInterrupt = new DigitalSignalConsumer("NMI");
            Wait = new DigitalSignalConsumer("WAIT");

            BusRequest     = new DigitalSignalConsumer("BREQ");
            BusAcknowledge = new DigitalSignalProvider("BACK");

            MemoryRequest = new DigitalSignalProvider("MREQ");
            IoRequest     = new DigitalSignalProvider("IORQ");
            Read          = new DigitalSignalProvider("RD");
            Write         = new DigitalSignalProvider("WR");

            MachineCycle1 = new DigitalSignalProvider("M1");
            Refresh       = new DigitalSignalProvider("RFSH");
            Halt          = new DigitalSignalProvider("HALT");

            Address = new BusMaster <BusData16>("Address");
            Data    = new BusMasterSlave <BusData8>("Data");

            _execEngine = new ExecutionEngine(this);
            _registers  = new Registers();
            _alu        = new Alu(_registers);

            Initialize();
        }
Esempio n. 6
0
        public void Connected_Level_IsFloating()
        {
            var uut = new DigitalSignalProvider();

            uut.ConnectTo(new DigitalSignal());

            uut.Level.Should().Be(DigitalLevel.Floating);
        }
Esempio n. 7
0
 private string SafeNetName(DigitalSignalProvider provider)
 {
     if (provider == null || !provider.IsConnected)
     {
         return(null);
     }
     return(provider.DigitalSignal.Name);
 }
Esempio n. 8
0
        public void Connected_WithName_BuildName()
        {
            var name = "Test";
            var uut  = new DigitalSignalProvider();

            uut.ConnectTo(new DigitalSignal(name));

            uut.Name.Should().StartWith(name);
        }
Esempio n. 9
0
        public void MultipleProviders_OneWrites_NoConflicts()
        {
            var provider1 = new DigitalSignalProvider();
            var provider2 = new DigitalSignalProvider();
            var signal    = new DigitalSignal();

            provider1.ConnectTo(signal);
            provider2.ConnectTo(signal);

            provider1.Write(DigitalLevel.High);
        }
Esempio n. 10
0
        public void TestInitialize()
        {
            _uut        = new OutputPort();
            _portEnable = _uut.PortEnable.CreateConnection();

            var inputBus = new Bus(8);

            _uut.Input.ConnectTo(inputBus);
            _input           = new BusMaster(inputBus);
            _input.IsEnabled = true;
        }
Esempio n. 11
0
        public void TestInitialize()
        {
            _uut = new InputPort();
            _uut.DataBuffer.Write(new byte[] { Value, Value2 });
            _portEnable = _uut.PortEnable.CreateConnection();

            var outputBus = new Bus(8);

            _uut.Output.ConnectTo(outputBus);
            _output = new BusSlave(outputBus);
        }
Esempio n. 12
0
        public void Connected_WriteHigh_LevelIsHigh()
        {
            var uut    = new DigitalSignalProvider();
            var signal = new DigitalSignal();

            uut.ConnectTo(signal);

            uut.Write(DigitalLevel.High);

            uut.Level.Should().Be(DigitalLevel.High);
            signal.Level.Should().Be(DigitalLevel.High);
        }
        public void Connect_WriteProvider_ConsumerSeesChanges()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer.Level.Should().Be(DigitalLevel.High);
        }
Esempio n. 14
0
        // returns index (always added to the end)
        public int Add(out DigitalSignalConsumer input, out DigitalSignalProvider output, string name = null)
        {
            var index = _inputs.Count;

            input            = new DigitalSignalConsumer(name);
            input.OnChanged += Input_OnChanged;
            _inputs.Add(input);

            output = new DigitalSignalProvider(name);
            _outputs.Add(output);

            return(index);
        }
Esempio n. 15
0
        public void Connected_WriteHigh_TriggersEvent()
        {
            var uut    = new DigitalSignalProvider();
            var signal = new DigitalSignal();

            uut.ConnectTo(signal);

            signal.MonitorEvents();
            uut.Write(DigitalLevel.High);

            signal.ShouldRaise("OnChanged");
            uut.Level.Should().Be(DigitalLevel.High);
            signal.Level.Should().Be(DigitalLevel.High);
        }
        public void Connect_WriteProvider_EventTriggered()
        {
            var provider = new DigitalSignalProvider();
            var consumer = new DigitalSignalConsumer();
            var signal   = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer.ConnectTo(signal);
            consumer.MonitorEvents();

            provider.Write(DigitalLevel.High);

            consumer.ShouldRaise("OnChanged");
        }
Esempio n. 17
0
        public void MultipleProviders_OneWritesAtaTime_NoConflicts()
        {
            var provider1 = new DigitalSignalProvider();
            var provider2 = new DigitalSignalProvider();
            var signal    = new DigitalSignal();

            provider1.ConnectTo(signal);
            provider2.ConnectTo(signal);

            provider1.Write(DigitalLevel.High);
            provider1.Write(DigitalLevel.Floating);
            provider2.Write(DigitalLevel.Low);
            provider2.Write(DigitalLevel.Floating);
            provider1.Write(DigitalLevel.PosEdge);
        }
        public void Write_MultipleConsumers_AllSeeChangedLevel()
        {
            var provider  = new DigitalSignalProvider();
            var consumer1 = new DigitalSignalConsumer();
            var consumer2 = new DigitalSignalConsumer();
            var signal    = new DigitalSignal();

            provider.ConnectTo(signal);
            consumer1.ConnectTo(signal);
            consumer2.ConnectTo(signal);

            provider.Write(DigitalLevel.High);

            consumer1.Level.Should().Be(DigitalLevel.High);
            consumer2.Level.Should().Be(DigitalLevel.High);
        }
        public static DigitalSignal GetOrAddSignal(this DigitalSignalProvider provider, string signalName = null)
        {
            DigitalSignal signal = null;

            if (!provider.IsConnected)
            {
                signal = new DigitalSignal(signalName);
                provider.ConnectTo(signal);
            }
            else
            {
                signal = provider.DigitalSignal;
            }

            return(signal);
        }
        public static DigitalSignal ConnectTo(this DigitalSignalConsumer consumer, DigitalSignalProvider provider, string signalName = null)
        {
            DigitalSignal signal = Connect(provider, consumer);

            if (signal == null)
            {
                if (signalName == null)
                {
                    signalName = consumer.Name;
                }
                signal = consumer.GetOrAddSignal(signalName);
                provider.ConnectTo(signal);
            }

            return(signal);
        }
Esempio n. 21
0
        public void Connected_WriteHighTwice_NoChange()
        {
            var uut    = new DigitalSignalProvider();
            var signal = new DigitalSignal();

            uut.ConnectTo(signal);
            uut.Write(DigitalLevel.High);

            var levels = new List <DigitalLevel>();

            signal.OnChanged += (s, e) => levels.Add(e.Level);

            var count = uut.Write(DigitalLevel.High);

            count.Should().Be(0);
            levels.Should().HaveCount(count);
        }
        public static DigitalSignalProvider CreateConnection(this DigitalSignalConsumer consumer, DigitalSignalProvider provider = null, string signalName = null)
        {
            if (signalName == null && consumer.Name != null)
            {
                signalName = consumer.Name;
            }

            var signal = new DigitalSignal(signalName);

            if (provider == null)
            {
                provider = new DigitalSignalProvider();
            }

            consumer.ConnectTo(signal);
            provider.ConnectTo(signal);
            return(provider);
        }
Esempio n. 23
0
        public void Connected_WriteHigh_MovesToHigh()
        {
            var uut    = new DigitalSignalProvider();
            var signal = new DigitalSignal();

            uut.ConnectTo(signal);

            var levels = new List <DigitalLevel>();

            signal.OnChanged += (s, e) => levels.Add(e.Level);

            var count = uut.Write(DigitalLevel.High);

            count.Should().Be(3);
            levels.Should().HaveCount(count);
            levels[0].Should().Be(DigitalLevel.Low);
            levels[1].Should().Be(DigitalLevel.PosEdge);
            levels[2].Should().Be(DigitalLevel.High);
        }
Esempio n. 24
0
        public Die(
            DigitalSignalConsumer clock,
            DigitalSignalConsumer reset,
            DigitalSignalConsumer interrupt,
            DigitalSignalConsumer nonMaskableInterrupt,
            DigitalSignalConsumer wait,
            DigitalSignalConsumer busRequest,
            DigitalSignalProvider busAcknowledge,
            DigitalSignalProvider memoryRequest,
            DigitalSignalProvider ioRequest,
            DigitalSignalProvider read,
            DigitalSignalProvider write,
            DigitalSignalProvider machineCycle1,
            DigitalSignalProvider refresh,
            DigitalSignalProvider halt,
            BusMaster <BusData16> addressBus,
            BusMasterSlave <BusData8> dataBus)
        {
            _clock                = clock;
            _reset                = reset;
            _interrupt            = interrupt;
            _nonMaskableInterrupt = nonMaskableInterrupt;
            _wait           = wait;
            _busRequest     = busRequest;
            _busAcknowledge = busAcknowledge;
            _memoryRequest  = memoryRequest;
            _ioRequest      = ioRequest;
            _read           = read;
            _write          = write;
            _machineCycle1  = machineCycle1;
            _refresh        = refresh;
            _halt           = halt;
            _addressBus     = addressBus;
            _dataBus        = dataBus;

            _execEngine = new ExecutionEngine(this);
            _registers  = new Registers();
            _alu        = new Alu(_registers);

            Initialize();
        }
        public static DigitalSignalConsumer CreateConnection(this DigitalSignalProvider provider, string signalName = null)
        {
            var signal = provider.GetOrAddSignal(signalName);

            return(new DigitalSignalConsumer(signal, signalName));
        }
Esempio n. 26
0
 protected override void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
     Output.Write(InvertorGate.Invert(OrFunction()));
 }
Esempio n. 27
0
 public BusDecoder()
 {
     Output               = new DigitalSignalProvider("BusDecoder Output");
     _busSlave            = new BusSlave("BusDecoder Input");
     _busSlave.OnChanged += Bus_OnChanged;
 }
Esempio n. 28
0
 protected override void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
     Output.Write(AndFunction());
 }
Esempio n. 29
0
 protected virtual void OnInputChanged(DigitalSignalConsumer input, DigitalSignalProvider source)
 {
 }
Esempio n. 30
0
 public SignalGenerator()
 {
     Output = new DigitalSignalProvider();
 }