1<#
2//
3// Copyright (c) 2010-2023 Antmicro
4// Copyright (c) 2011-2015 Realtime Embedded
5//
6// This file is licensed under the MIT License.
7// Full license text is available in 'licenses/MIT.txt'.
8//
9#>
10<#@ template language="C#v3.5" debug="True"#>
11<#@ import namespace="System.Collections.Generic" #>
12<#
13    Dictionary<string, Tuple<string, int, int>> types = new Dictionary<string, Tuple<string, int, int>>();
14    types.Add("byte", Tuple.Create("Byte", 0, 7));
15    types.Add("ushort", Tuple.Create("Word", 1, 15));
16    types.Add("uint", Tuple.Create("DoubleWord", 3, 31));
17#>
18/********************************************************
19*
20* Warning!
21* This file was generated automatically.
22* Please do not edit. Changes should be made in the
23* appropriate *.tt file.
24*
25*/
26
27using System;
28using Antmicro.Renode.Core;
29using Antmicro.Renode.Peripherals.Bus;
30using Antmicro.Renode.Logging;
31
32namespace Antmicro.Renode.Peripherals.Miscellaneous
33{
34    public sealed class BitBanding : IBytePeripheral, IWordPeripheral, IDoubleWordPeripheral
35    {
36        public BitBanding(IMachine machine, ulong peripheralBase)
37        {
38            sysbus = machine.GetSystemBus(this);
39            this.peripheralBase = peripheralBase;
40        }
41
42        public void Reset()
43        {
44            // nothing happens
45        }
46
47<#
48
49    foreach(var entry in types)
50    {
51        var type = entry.Key;
52        var name = entry.Value.Item1;
53        var realAddressMask = entry.Value.Item2;
54        var bitNumberMask = entry.Value.Item3;
55#>
56        public <#= type #> Read<#= name #>(long offset)
57        {
58            var realAddress = GetBitBandAddress(offset) & ~<#= realAddressMask #>UL;
59            var readValue = sysbus.Read<#= name #>(realAddress);
60            var bitNumber = (int)(offset >> 2) & <#= bitNumberMask #>;
61            return (<#= type #>)((readValue >> bitNumber) & 1);
62        }
63
64        public void Write<#= name #>(long offset, <#= type #> value)
65        {
66            var realAddress = GetBitBandAddress(offset) & ~<#= realAddressMask #>UL;
67            var readValue = sysbus.Read<#= name #>(realAddress);
68            var bitNumber = (int)(offset >> 2) & <#= bitNumberMask #>;
69            var mask = (1 << bitNumber);
70            if((value & 1) == 1)
71            {
72                readValue |= (<#= type #>)mask;
73            }
74            else
75            {
76                readValue &= (<#= type #>)~mask;
77            }
78            sysbus.Write<#= name #>(realAddress, readValue);
79        }
80
81<#
82    }
83#>
84        private ulong GetBitBandAddress(long from)
85        {
86            var retval = peripheralBase + checked((ulong)(from >> 5));
87            this.NoisyLog("Bit-band operation: 0x{0:X} -> 0x{1:X}.", from, retval);
88            return retval;
89        }
90
91        private readonly SystemBus sysbus;
92        private readonly ulong peripheralBase;
93    }
94}
95