1 /********************************************************
2 *
3 * Warning!
4 * This file was generated automatically.
5 * Please do not edit. Changes should be made in the
6 * appropriate *.tt file.
7 *
8 */
9 
10 using System;
11 using Antmicro.Renode.Core;
12 using Antmicro.Renode.Peripherals.Bus;
13 using Antmicro.Renode.Logging;
14 
15 namespace Antmicro.Renode.Peripherals.Miscellaneous
16 {
17     public sealed class BitBanding : IBytePeripheral, IWordPeripheral, IDoubleWordPeripheral
18     {
BitBanding(IMachine machine, ulong peripheralBase)19         public BitBanding(IMachine machine, ulong peripheralBase)
20         {
21             sysbus = machine.GetSystemBus(this);
22             this.peripheralBase = peripheralBase;
23         }
24 
Reset()25         public void Reset()
26         {
27             // nothing happens
28         }
29 
ReadByte(long offset)30         public byte ReadByte(long offset)
31         {
32             var realAddress = GetBitBandAddress(offset) & ~0UL;
33             var readValue = sysbus.ReadByte(realAddress);
34             var bitNumber = (int)(offset >> 2) & 7;
35             return (byte)((readValue >> bitNumber) & 1);
36         }
37 
WriteByte(long offset, byte value)38         public void WriteByte(long offset, byte value)
39         {
40             var realAddress = GetBitBandAddress(offset) & ~0UL;
41             var readValue = sysbus.ReadByte(realAddress);
42             var bitNumber = (int)(offset >> 2) & 7;
43             var mask = (1 << bitNumber);
44             if((value & 1) == 1)
45             {
46                 readValue |= (byte)mask;
47             }
48             else
49             {
50                 readValue &= (byte)~mask;
51             }
52             sysbus.WriteByte(realAddress, readValue);
53         }
54 
ReadWord(long offset)55         public ushort ReadWord(long offset)
56         {
57             var realAddress = GetBitBandAddress(offset) & ~1UL;
58             var readValue = sysbus.ReadWord(realAddress);
59             var bitNumber = (int)(offset >> 2) & 15;
60             return (ushort)((readValue >> bitNumber) & 1);
61         }
62 
WriteWord(long offset, ushort value)63         public void WriteWord(long offset, ushort value)
64         {
65             var realAddress = GetBitBandAddress(offset) & ~1UL;
66             var readValue = sysbus.ReadWord(realAddress);
67             var bitNumber = (int)(offset >> 2) & 15;
68             var mask = (1 << bitNumber);
69             if((value & 1) == 1)
70             {
71                 readValue |= (ushort)mask;
72             }
73             else
74             {
75                 readValue &= (ushort)~mask;
76             }
77             sysbus.WriteWord(realAddress, readValue);
78         }
79 
ReadDoubleWord(long offset)80         public uint ReadDoubleWord(long offset)
81         {
82             var realAddress = GetBitBandAddress(offset) & ~3UL;
83             var readValue = sysbus.ReadDoubleWord(realAddress);
84             var bitNumber = (int)(offset >> 2) & 31;
85             return (uint)((readValue >> bitNumber) & 1);
86         }
87 
WriteDoubleWord(long offset, uint value)88         public void WriteDoubleWord(long offset, uint value)
89         {
90             var realAddress = GetBitBandAddress(offset) & ~3UL;
91             var readValue = sysbus.ReadDoubleWord(realAddress);
92             var bitNumber = (int)(offset >> 2) & 31;
93             var mask = (1 << bitNumber);
94             if((value & 1) == 1)
95             {
96                 readValue |= (uint)mask;
97             }
98             else
99             {
100                 readValue &= (uint)~mask;
101             }
102             sysbus.WriteDoubleWord(realAddress, readValue);
103         }
104 
GetBitBandAddress(long from)105         private ulong GetBitBandAddress(long from)
106         {
107             var retval = peripheralBase + checked((ulong)(from >> 5));
108             this.NoisyLog("Bit-band operation: 0x{0:X} -> 0x{1:X}.", from, retval);
109             return retval;
110         }
111 
112         private readonly IBusController sysbus;
113         private readonly ulong peripheralBase;
114     }
115 }
116