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