1 //
2 // Copyright (c) 2010-2022 Antmicro
3 //
4 // This file is licensed under the MIT License.
5 // Full license text is available in 'licenses/MIT.txt'.
6 //
7 
8 using System;
9 using System.Linq;
10 using Antmicro.Renode.Core;
11 using Antmicro.Renode.Core.Structure.Registers;
12 using Antmicro.Renode.Utilities;
13 
14 namespace Antmicro.Renode.Peripherals
15 {
16     public class ReferencingPeripheral : BasicDoubleWordPeripheral, IKnownSize
17     {
ReferencingPeripheral(Machine machine)18         public ReferencingPeripheral(Machine machine) : base(machine)
19         {
20             IValueRegisterField value;
21 
22             Registers.Base.Define(this)
23                 .WithValueField(0, 32, out value, FieldMode.Write);
24 
25             Registers.Multiplier.Define(this)
26                 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => value.Value * 2);
27 
28             Registers.BitCounter.Define(this)
29                 .WithValueField(0, 32, FieldMode.Read, valueProviderCallback: _ => (uint)BitHelper.GetBits(value.Value).Where(x => x).Select(x => 1).Sum(x => x));
30         }
31 
32         public long Size => ReferencedType.Size;
33 
34         private enum Registers : long
35         {
36             Base = 0x0,
37             Multiplier = 0x04,
38             BitCounter = 0x08,
39         }
40     }
41 }
42