1 //
2 // Copyright (c) 2010-2024 Antmicro
3 // Copyright (c) 2011-2015 Realtime Embedded
4 //
5 // This file is licensed under the MIT License.
6 // Full license text is available in 'licenses/MIT.txt'.
7 //
8 using System;
9 using Antmicro.Renode.Core;
10 using Antmicro.Renode.Core.Structure;
11 using Antmicro.Renode.Exceptions;
12 using Antmicro.Renode.Peripherals.CPU;
13 
14 using Range = Antmicro.Renode.Core.Range;
15 
16 namespace Antmicro.Renode.Peripherals.Bus
17 {
18     public class BusMultiRegistration : BusRangeRegistration
19     {
BusMultiRegistration(ulong address, ulong size, string region, IPeripheral cpu = null, ICluster<ICPU> cluster = null)20         public BusMultiRegistration(ulong address, ulong size, string region, IPeripheral cpu = null, ICluster<ICPU> cluster = null) : this(address, size, region, stateMask: null, cpu, cluster)
21         {
22         }
23 
BusMultiRegistration(ulong address, ulong size, string region, string condition)24         public BusMultiRegistration(ulong address, ulong size, string region, string condition) : this(address, size, region, stateMask: null, condition: condition)
25         {
26         }
27 
28         public string ConnectionRegionName { get; private set; }
29         public override string PrettyString { get { return ToString(); } }
30 
Equals(object obj)31         public override bool Equals(object obj)
32         {
33             var other = obj as BusMultiRegistration;
34             if(other == null)
35             {
36                 return false;
37             }
38             if(!base.Equals(obj))
39             {
40                 return false;
41             }
42             return ConnectionRegionName == other.ConnectionRegionName;
43         }
44 
ToString()45         public override string ToString()
46         {
47             return base.ToString() + $" [region: {ConnectionRegionName}]";
48         }
49 
GetHashCode()50         public override int GetHashCode()
51         {
52             unchecked
53             {
54                 return 17 * base.GetHashCode() + 101 * ConnectionRegionName.GetHashCode();
55             }
56         }
57 
WithInitiatorAndStateMask(IPeripheral initiator, StateMask mask)58         public override IConditionalRegistration WithInitiatorAndStateMask(IPeripheral initiator, StateMask mask)
59         {
60             return new BusMultiRegistration(StartingPoint, Range.Size, ConnectionRegionName, mask, cpu: initiator);
61         }
62 
RegisterForEachContext(Action<BusMultiRegistration> register)63         public void RegisterForEachContext(Action<BusMultiRegistration> register)
64         {
65             RegisterForEachContextInner(register, cpu => new BusMultiRegistration(Range.StartAddress, Range.Size, ConnectionRegionName, stateMask: StateMask, cpu));
66         }
67 
BusMultiRegistration(ulong address, ulong size, string region, StateMask? stateMask, IPeripheral cpu = null, ICluster<ICPU> cluster = null, string condition = null)68         private BusMultiRegistration(ulong address, ulong size, string region, StateMask? stateMask, IPeripheral cpu = null, ICluster<ICPU> cluster = null, string condition = null) : base(new Range(address, size), stateMask, 0, cpu, cluster, condition)
69         {
70             if(string.IsNullOrWhiteSpace(region))
71             {
72                 throw new ConstructionException("'Region' parameter cannot be null or empty.");
73             }
74             ConnectionRegionName = region;
75         }
76     }
77 }
78 
79