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