1 //
2 // Copyright (c) 2010-2018 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.Utilities;
10 
11 namespace Antmicro.Renode.Core.Structure.Registers
12 {
13     [Flags]
14     public enum FieldMode
15     {
16         Read = 1 << 0,
17         Write = 1 << 1,
18         Set = 1 << 2,
19         Toggle = 1 << 3,
20         WriteOneToClear = 1 << 4,
21         WriteZeroToClear = 1 << 5,
22         ReadToClear = 1 << 6,
23         WriteZeroToSet = 1 << 7,
24         WriteZeroToToggle = 1 << 8,
25         ReadToSet = 1 << 11,
26         WriteToClear = 1 << 12
27     }
28 
29     public static class FieldModeHelper
30     {
IsFlagSet(this FieldMode mode, FieldMode value)31         public static bool IsFlagSet(this FieldMode mode, FieldMode value)
32         {
33             return (mode & value) != 0;
34         }
35 
IsReadable(this FieldMode mode)36         public static bool IsReadable(this FieldMode mode)
37         {
38             return (mode & (FieldMode.Read | FieldMode.ReadToClear | FieldMode.ReadToSet)) != 0;
39         }
40 
IsWritable(this FieldMode mode)41         public static bool IsWritable(this FieldMode mode)
42         {
43             return (mode & (FieldMode.Write | FieldMode.Set | FieldMode.Toggle | FieldMode.WriteOneToClear | FieldMode.WriteZeroToClear |
44                             FieldMode.WriteZeroToSet | FieldMode.WriteZeroToToggle | FieldMode.WriteToClear)) != 0;
45         }
46 
WriteBits(this FieldMode mode)47         public static FieldMode WriteBits(this FieldMode mode)
48         {
49             return mode & ~(FieldMode.Read | FieldMode.ReadToClear | FieldMode.ReadToSet);
50         }
51 
ReadBits(this FieldMode mode)52         public static FieldMode ReadBits(this FieldMode mode)
53         {
54             return mode & (FieldMode.Read | FieldMode.ReadToClear | FieldMode.ReadToSet);
55         }
56 
IsValid(this FieldMode mode)57         public static bool IsValid(this FieldMode mode)
58         {
59             //the assumption that write flags are exclusive is used in BusRegister logic (switch instead of ifs)
60             return !(BitHelper.GetSetBits((uint)ReadBits(mode)).Count > 1) && !(BitHelper.GetSetBits((uint)WriteBits(mode)).Count > 1);
61         }
62     }
63 }
64