1 //
2 // Copyright (c) 2010-2023 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 using System.Linq;
9 using Antmicro.Renode.Core;
10 using Antmicro.Renode.Core.Structure.Registers;
11 using Antmicro.Renode.Peripherals.Bus;
12 using Antmicro.Renode.Utilities;
13 
14 namespace Antmicro.Renode.Peripherals.GPIOPort
15 {
16     public class Murax_GPIO : BaseGPIOPort, IProvidesRegisterCollection<DoubleWordRegisterCollection>, IDoubleWordPeripheral, IKnownSize
17     {
Murax_GPIO(IMachine machine)18         public Murax_GPIO(IMachine machine) : base(machine, 32)
19         {
20             RegistersCollection = new DoubleWordRegisterCollection(this);
21             DefineRegisters();
22         }
23 
ReadDoubleWord(long offset)24         public uint ReadDoubleWord(long offset)
25         {
26             return RegistersCollection.Read(offset);
27         }
28 
WriteDoubleWord(long offset, uint value)29         public void WriteDoubleWord(long offset, uint value)
30         {
31             RegistersCollection.Write(offset, value);
32         }
33 
Reset()34         public override void Reset()
35         {
36             base.Reset();
37             RegistersCollection.Reset();
38         }
39 
40         public long Size => 0xC;
41 
42         public DoubleWordRegisterCollection RegistersCollection { get; private set; }
43 
DefineRegisters()44         private void DefineRegisters()
45         {
46             Registers.Output.Define(this)
47                 .WithValueField(0, 32, out output,
48                     writeCallback: (_, val) => RefreshConnectionsState(),
49                     valueProviderCallback: _ => BitHelper.GetValueFromBitsArray(Connections.Where(x => x.Key >= 0).OrderBy(x => x.Key).Select(x => x.Value.IsSet)))
50             ;
51 
52             Registers.OutputEnable.Define(this)
53                 .WithValueField(0, 32, out outputEnable,
54                     writeCallback: (_, val) => RefreshConnectionsState())
55             ;
56         }
57 
RefreshConnectionsState()58         private void RefreshConnectionsState()
59         {
60             var outputBits = BitHelper.GetBits((uint)outputEnable.Value);
61             var bits = BitHelper.GetBits((uint)output.Value);
62             for(var i = 0; i < 32; i++)
63             {
64                 Connections[i].Set(bits[i] && outputBits[i]);
65             }
66         }
67 
68         private IValueRegisterField outputEnable;
69         private IValueRegisterField output;
70 
71         private enum Registers
72         {
73             Input = 0x0,
74             Output = 0x4,
75             OutputEnable = 0x8
76         }
77     }
78 }
79