1 //
2 // Copyright (c) 2010-2024 Antmicro
3 //
4 //  This file is licensed under the MIT License.
5 //  Full license text is available in 'licenses/MIT.txt'.
6 //
7 using System;
8 namespace Antmicro.Renode.Core
9 {
10     public struct SymbolAddress : IComparable<SymbolAddress>
11     {
MaxAntmicro.Renode.Core.SymbolAddress12         public static SymbolAddress Max(SymbolAddress a, SymbolAddress b)
13         {
14             return (a.RawValue >= b.RawValue) ? a : b;
15         }
16 
MinAntmicro.Renode.Core.SymbolAddress17         public static SymbolAddress Min(SymbolAddress a, SymbolAddress b)
18         {
19             return (a.RawValue <= b.RawValue) ? a : b;
20         }
21 
operator >Antmicro.Renode.Core.SymbolAddress22         public static bool operator >(SymbolAddress a, SymbolAddress b)
23         {
24             return a.RawValue > b.RawValue;
25         }
26 
operator %Antmicro.Renode.Core.SymbolAddress27         public static SymbolAddress operator %(SymbolAddress a, uint b)
28         {
29             return new SymbolAddress(a.RawValue % b);
30         }
31 
operator &Antmicro.Renode.Core.SymbolAddress32         public static SymbolAddress operator &(SymbolAddress a, int b)
33         {
34             return new SymbolAddress(a.RawValue & checked((uint)b));
35         }
36 
operator &Antmicro.Renode.Core.SymbolAddress37         public static SymbolAddress operator &(SymbolAddress a, uint b)
38         {
39             return new SymbolAddress(a.RawValue & b);
40         }
41 
operator <Antmicro.Renode.Core.SymbolAddress42         public static bool operator <(SymbolAddress a, SymbolAddress b)
43         {
44             return a.RawValue < b.RawValue;
45         }
46 
operator <=Antmicro.Renode.Core.SymbolAddress47         public static bool operator <=(SymbolAddress a, SymbolAddress b)
48         {
49             return a.RawValue <= b.RawValue;
50         }
51 
operator >=Antmicro.Renode.Core.SymbolAddress52         public static bool operator >=(SymbolAddress a, SymbolAddress b)
53         {
54             return a.RawValue >= b.RawValue;
55         }
56 
operator ==Antmicro.Renode.Core.SymbolAddress57         public static bool operator ==(SymbolAddress a, SymbolAddress b)
58         {
59             return a.RawValue == b.RawValue;
60         }
61 
operator !=Antmicro.Renode.Core.SymbolAddress62         public static bool operator !=(SymbolAddress a, SymbolAddress b)
63         {
64             return a.RawValue != b.RawValue;
65         }
66 
operator +Antmicro.Renode.Core.SymbolAddress67         public static SymbolAddress operator +(SymbolAddress a, SymbolAddress b)
68         {
69             return new SymbolAddress(a.RawValue + b.RawValue);
70         }
71 
operator -Antmicro.Renode.Core.SymbolAddress72         public static SymbolAddress operator -(SymbolAddress a, SymbolAddress b)
73         {
74             return new SymbolAddress(a.RawValue - b.RawValue);
75         }
76 
operator SymbolAddressAntmicro.Renode.Core.SymbolAddress77         public static implicit operator SymbolAddress(uint v)
78         {
79             return new SymbolAddress(v);
80         }
81 
operator SymbolAddressAntmicro.Renode.Core.SymbolAddress82         public static implicit operator SymbolAddress(ulong v)
83         {
84             return new SymbolAddress(v);
85         }
86 
operator uintAntmicro.Renode.Core.SymbolAddress87         public static explicit operator uint(SymbolAddress s)
88         {
89             return checked((uint)s.RawValue);
90         }
91 
operator ulongAntmicro.Renode.Core.SymbolAddress92         public static explicit operator ulong(SymbolAddress s)
93         {
94             return s.RawValue;
95         }
96 
SymbolAddressAntmicro.Renode.Core.SymbolAddress97         public SymbolAddress(ulong value)
98         {
99             RawValue = value;
100         }
101 
CompareToAntmicro.Renode.Core.SymbolAddress102         public int CompareTo(SymbolAddress other)
103         {
104             return RawValue.CompareTo(other.RawValue);
105         }
106 
EqualsAntmicro.Renode.Core.SymbolAddress107         public override bool Equals(object obj)
108         {
109             if(obj is SymbolAddress s)
110             {
111                 return RawValue == s.RawValue;
112             }
113             return false;
114         }
115 
GetHashCodeAntmicro.Renode.Core.SymbolAddress116         public override int GetHashCode()
117         {
118             return RawValue.GetHashCode();
119         }
120 
ToStringAntmicro.Renode.Core.SymbolAddress121         public override string ToString()
122         {
123             return $"0x{RawValue:x}";
124         }
125 
126         public ulong RawValue { get; private set; }
127 
128         // this is added because of the MarkerComparer
129         public static SymbolAddress MaxValue;
130 
SymbolAddressAntmicro.Renode.Core.SymbolAddress131         static SymbolAddress()
132         {
133             MaxValue = new SymbolAddress(ulong.MaxValue);
134         }
135     }
136 }
137