Exemplo n.º 1
0
        public void Write_SetAddressAndDataFirst_ReadBackCorrectValue()
        {
            var mem        = MemoryTestExtensions.NewRam(new byte[] { 0x00 });
            var addressBus = mem.Address.CreateConnection();
            var dataBus    = mem.Data.CreateConnection();
            var wrDataBus  = new BusMaster <BusData8>(dataBus.Bus, null);
            var ceProv     = mem.ChipEnable.CreateConnection();
            var oeProv     = mem.OutputEnable.CreateConnection();
            var weProv     = mem.WriteEnable.CreateConnection();

            // set address
            addressBus.IsEnabled = true;
            addressBus.Write(new BusData16(0));
            // write data
            wrDataBus.IsEnabled = true;
            wrDataBus.Write(new BusData8(Value));

            // enable chip and input
            ceProv.Write(DigitalLevel.Low);
            weProv.Write(DigitalLevel.Low);
            // value is stored here
            weProv.Write(DigitalLevel.High);
            wrDataBus.IsEnabled = false;

            oeProv.Write(DigitalLevel.Low);

            dataBus.Value.Equals(new BusData8(Value)).Should().BeTrue();
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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();
        }
Exemplo n.º 4
0
        public void Connect_OneMaster_NoErrors()
        {
            var uut = new BusMaster <BusData8>();
            var bus = new Bus <BusData8>();

            uut.ConnectTo(bus);
        }
Exemplo n.º 5
0
        private static Bus <T> Connect <T>(BusMaster <T> master, BusSlave <T> slave, string busName = null)
            where T : BusData, new()
        {
            if (master.IsConnected && slave.IsConnected)
            {
                if (master.Bus != slave.Bus)
                {
                    throw new InvalidOperationException("Both Master and Slave are already connected to different buses.");
                }

                return(master.Bus);
            }

            Bus <T> bus = null;

            if (master.IsConnected)
            {
                bus = master.Bus;
                slave.ConnectTo(bus);
            }
            else if (slave.IsConnected)
            {
                bus = slave.Bus;
                master.ConnectTo(bus);
            }

            return(bus);
        }
Exemplo n.º 6
0
        public static BusSlave <T> CreateConnection <T>(this BusMaster <T> master, string busName = null)
            where T : BusData, new()
        {
            var bus = master.GetOrAddBus(busName);

            return(new BusSlave <T>(bus, busName));
        }
Exemplo n.º 7
0
 public InputPort()
 {
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster("InputPort Output");
     _buffer = new BusDataBuffer();
 }
Exemplo n.º 8
0
 public InputPort(string name)
 {
     Name                   = name;
     _portEnable            = new DigitalSignalConsumer("PE");
     _portEnable.OnChanged += PortEnable_OnChanged;
     _busMaster             = new BusMaster(name + "-Output");
     _buffer                = new BusDataBuffer();
 }
Exemplo n.º 9
0
 private string SafeNetName(BusMaster master)
 {
     if (master == null || !master.IsConnected)
     {
         return(null);
     }
     return(master.Bus.Name);
 }
Exemplo n.º 10
0
        public void Connect_MultipleMasters_NoErrors()
        {
            var master1 = new BusMaster <BusData8>();
            var master2 = new BusMaster <BusData8>();
            var bus     = new Bus <BusData8>();

            master1.ConnectTo(bus);
            master2.ConnectTo(bus);
        }
Exemplo n.º 11
0
        public void Write_DisabledMaster_Throws()
        {
            var uut      = new BusMaster <BusData8>();
            var newValue = new BusData8(0);

            Action act = () => uut.Write(newValue);

            act.ShouldThrow <InvalidOperationException>();
        }
Exemplo n.º 12
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;
        }
Exemplo n.º 13
0
        public void TestInitialize()
        {
            _uut    = new BusDecoder();
            _output = _uut.Output.CreateConnection();

            var inputBus = new Bus(16);

            _uut.Input.ConnectTo(inputBus);
            _input           = new BusMaster(inputBus);
            _input.IsEnabled = true;
        }
Exemplo n.º 14
0
        public static BusMaster <T> CreateConnection <T>(this BusSlave <T> slave, string busName = null)
            where T : BusData, new()
        {
            var master = new BusMaster <T>();
            var bus    = new Bus <T>(busName);

            slave.ConnectTo(bus);
            master.ConnectTo(bus);

            return(master);
        }
Exemplo n.º 15
0
        public void Write_Unconnected_DoesNotThrow()
        {
            var uut      = new BusMaster <BusData8>();
            var newValue = new BusData8(0);

            uut.IsEnabled = true;

            Action test = () => uut.Write(newValue);

            test.ShouldNotThrow();
        }
Exemplo n.º 16
0
        public DirectedGraphNode Add(BusMaster master, string ownerName = null)
        {
            if (!Visit(master) ||
                (!master.IsConnected && !DisplayUnconnected))
            {
                return(FindNode(master));
            }

            var node = AddInternal(master, ownerName, SafeNetName(master));

            return(node);
        }
Exemplo n.º 17
0
        public void Write_BusValueChanged()
        {
            var uut = new BusMaster <BusData8>();
            var bus = new Bus <BusData8>();

            uut.ConnectTo(bus);
            uut.IsEnabled = true;

            var newValue = new BusData8(0);

            uut.Write(newValue);

            bus.AssertAllLevelsAre(DigitalLevel.Low);
        }
Exemplo n.º 18
0
        public void ConnectTo_ChangeSource_BusValueCorrect()
        {
            var busWidth = 8;
            var source   = new Bus <BusData16>();
            var uut      = new BusTap(busWidth);

            uut.ConnectTo(source);

            var driver = new BusMaster(source);

            driver.IsEnabled = true;
            driver.Write(new BusData16(0xAA55));

            uut.Value.ToUInt32().Should().Be(0x55);
        }
Exemplo n.º 19
0
        public void IsEnabled_ToFalse_ChangesLevelsToFloating()
        {
            var uut = new BusMaster <BusData8>();
            var bus = new Bus <BusData8>();

            uut.ConnectTo(bus);
            uut.IsEnabled = true;

            var newValue = new BusData8(0);

            uut.Write(newValue);
            uut.IsEnabled = false;

            uut.Value.AssertAllLevelsAre(DigitalLevel.Floating);
        }
Exemplo n.º 20
0
 private IEnumerable <Component> CreateBusMasters()
 {
     for (int i = 0; i < NumMasters; i++)
     {
         BusMaster master = new BusMaster(i, i + 1, 8 * (NumMasters - i + 1));
         object    oi     = (object)i;
         Bind(() =>
         {
             master.Clk     = _clk;
             master.Request = _request[(int)oi];
             master.Grant   = _grant[(int)oi];
         });
         yield return(master);
     }
 }
Exemplo n.º 21
0
        public void Write_EventTriggers()
        {
            var master = new BusMaster <BusData8>();
            var bus    = new Bus <BusData8>();

            master.ConnectTo(bus);
            master.IsEnabled = true;
            bus.MonitorEvents();

            var newValue = new BusData8(0);

            master.Write(newValue);

            bus.ShouldRaise("OnChanged");
        }
Exemplo n.º 22
0
        public void ConnectTo_ChangeSource_EventFires()
        {
            var busWidth = 8;
            var source   = new Bus <BusData16>();
            var uut      = new BusTap(busWidth);

            uut.ConnectTo(source);
            uut.MonitorEvents();

            var driver = new BusMaster(source);

            driver.IsEnabled = true;
            driver.Write(new BusData16(0xAA55));

            uut.ShouldRaise("OnChanged");
        }
Exemplo n.º 23
0
        public static Bus GetOrAddBus(this BusMaster master, string busName = null)
        {
            Bus bus;

            if (!master.IsConnected)
            {
                bus = new Bus(master.Value.Width, busName);
                master.ConnectTo(bus);
            }
            else
            {
                bus = master.Bus;
            }

            return(bus);
        }
Exemplo n.º 24
0
        public void Write_SingleMaster_SlaveSeesChanges()
        {
            var master = new BusMaster <BusData8>();
            var slave  = new BusSlave <BusData8>();
            var bus    = new Bus <BusData8>();

            master.ConnectTo(bus);
            slave.ConnectTo(bus);
            master.IsEnabled = true;

            var newValue = new BusData8(0);

            master.Write(newValue);

            slave.Value.AssertAllLevelsAre(DigitalLevel.Low);
        }
Exemplo n.º 25
0
        public static Bus <T> GetOrAddBus <T>(this BusMaster <T> master, string busName = null)
            where T : BusData, new()
        {
            Bus <T> bus;

            if (!master.IsConnected)
            {
                bus = new Bus <T>(busName);
                master.ConnectTo(bus);
            }
            else
            {
                bus = master.Bus;
            }

            return(bus);
        }
Exemplo n.º 26
0
        public static Bus <T> ConnectTo <T>(this BusMaster <T> master, BusSlave <T> slave, string busName = null)
            where T : BusData, new()
        {
            Bus <T> bus = Connect(master, slave, busName);

            if (bus == null)
            {
                if (busName == null)
                {
                    busName = master.Name;
                }
                bus = master.GetOrAddBus(busName);
                slave.ConnectTo(bus);
            }

            return(bus);
        }
Exemplo n.º 27
0
        public bool RemoveShip(string token)
        {
            ArbiterTreeNode node;

            if (!_nodeByShipToken.Remove(token, out node))
            {
                return(false);
            }

            _shipPublicIds.Remove(PublicIdFromToken(token));
            node.ShipCount--;

            BusMaster.BroadcastMessage(new Messages.ShipDisconnected()
            {
                Token = token
            });
            return(true);
        }
Exemplo n.º 28
0
        public void Write_MultipleMastersActivce_Error()
        {
            var master1 = new BusMaster <BusData8>();
            var master2 = new BusMaster <BusData8>();
            var bus     = new Bus <BusData8>();

            master1.ConnectTo(bus);
            master2.ConnectTo(bus);
            master1.IsEnabled = true;
            master2.IsEnabled = true;

            var loValue = new BusData8(0);
            var noValue = new BusData8();

            master1.Write(loValue);
            Action act = () => master2.Write(loValue);

            act.ShouldThrow <BusConflictException>();
        }
Exemplo n.º 29
0
        public void Write_MultipleMasters_OneAtaTime()
        {
            var master1 = new BusMaster <BusData8>();
            var master2 = new BusMaster <BusData8>();
            var bus     = new Bus <BusData8>();

            master1.ConnectTo(bus);
            master2.ConnectTo(bus);
            master1.IsEnabled = true;
            master2.IsEnabled = true;

            var loValue = new BusData8(0);
            var noValue = new BusData8();

            master1.Write(loValue);
            master1.Write(noValue);
            master2.Write(loValue);
            master2.Write(noValue);
            master1.Write(loValue);
        }
Exemplo n.º 30
0
        public string AddNewShip(out ArbiterTreeNode parentNode, string token)
        {
            if (token == null)
            {
                token = AddShipToken();
            }
            else
            {
                _shipPublicIds.Add(PublicIdFromToken(token));
            }
            parentNode = (ArbiterTreeNode)RootNode.RandomLeafNode();
            _nodeByShipToken[token] = parentNode;

            BusMaster.SendMessage(new Messages.ShipConnected()
            {
                Token = token
            }, parentNode.Peer);

            return(token);
        }
Exemplo n.º 31
0
 private IEnumerable<Component> CreateBusMasters()
 {
     for (int i = 0; i < NumMasters; i++)
     {
         BusMaster master = new BusMaster(i, i + 1, 8 * (NumMasters - i + 1));
         object oi = (object)i;
         Bind(() =>
         {
             master.Clk = _clk;
             master.Request = _request[(int)oi];
             master.Grant = _grant[(int)oi];
         });
         yield return master;
     }
 }