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.Peripherals.CPU;
12 
13 namespace Antmicro.Renode.Peripherals.Bus
14 {
15     public class BusPointRegistration : BusRegistration
16     {
BusPointRegistration(ulong address, ulong offset = 0, IPeripheral cpu = null, ICluster<ICPU> cluster = null)17         public BusPointRegistration(ulong address, ulong offset = 0, IPeripheral cpu = null, ICluster<ICPU> cluster = null) : this(address, stateMask: null, offset, cpu, cluster)
18         {
19         }
20 
BusPointRegistration(ulong address, string condition, ulong offset = 0)21         public BusPointRegistration(ulong address, string condition, ulong offset = 0) : this(address, stateMask: null, offset, condition: condition)
22         {
23         }
24 
ToString()25         public override string ToString()
26         {
27             var result = $"0x{StartingPoint:X}";
28             if(Offset != 0)
29             {
30                 result += $" with offset 0x{Offset:X}";
31             }
32             if(Initiator != null)
33             {
34                 result += $" for core {Initiator}";
35             }
36             return result;
37         }
38 
39         public override string PrettyString
40         {
41             get
42             {
43                 return ToString();
44             }
45         }
46 
operator BusPointRegistration(ulong address)47         public static implicit operator BusPointRegistration(ulong address)
48         {
49             return new BusPointRegistration(address);
50         }
51 
WithInitiatorAndStateMask(IPeripheral initiator, StateMask mask)52         public override IConditionalRegistration WithInitiatorAndStateMask(IPeripheral initiator, StateMask mask)
53         {
54             return new BusPointRegistration(StartingPoint, mask, Offset, initiator);
55         }
56 
RegisterForEachContext(Action<BusPointRegistration> register)57         public void RegisterForEachContext(Action<BusPointRegistration> register)
58         {
59             RegisterForEachContextInner(register, cpu => new BusPointRegistration(StartingPoint, StateMask, Offset, cpu));
60         }
61 
ToRangeRegistration(ulong size)62         public BusRangeRegistration ToRangeRegistration(ulong size)
63         {
64             BusRangeRegistration result;
65             if(Condition != null)
66             {
67                 result = new BusRangeRegistration(StartingPoint, size, Condition, Offset);
68             }
69             else
70             {
71                 result = new BusRangeRegistration(StartingPoint, size, Offset, Initiator, Cluster);
72             }
73             if(StateMask.HasValue)
74             {
75                 return (BusRangeRegistration)result.WithInitiatorAndStateMask(Initiator, StateMask.Value);
76             }
77             return result;
78         }
79 
BusPointRegistration(ulong address, StateMask? stateMask, ulong offset = 0, IPeripheral cpu = null, ICluster<ICPU> cluster = null, string condition = null)80         private BusPointRegistration(ulong address, StateMask? stateMask, ulong offset = 0, IPeripheral cpu = null, ICluster<ICPU> cluster = null, string condition = null) : base(address, offset, cpu, cluster, stateMask, condition)
81         {
82         }
83     }
84 }
85 
86