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