1 /********************************************************
2 *
3 * Warning!
4 * This file was generated automatically.
5 * Please do not edit. Changes should be made in the
6 * appropriate *.tt file.
7 *
8 */
9 using System;
10 using System.Linq;
11 using System.Collections.Generic;
12 using Antmicro.Renode.Peripherals.CPU.Registers;
13 using Antmicro.Renode.Utilities.Binding;
14 using Antmicro.Renode.Exceptions;
15 
16 namespace Antmicro.Renode.Peripherals.CPU
17 {
18     public partial class Arm
19     {
SetRegister(int register, RegisterValue value)20         public override void SetRegister(int register, RegisterValue value)
21         {
22             if(!mapping.TryGetValue((ArmRegisters)register, out var r))
23             {
24                 throw new RecoverableException($"Wrong register index: {register}");
25             }
26 
27             SetRegisterValue32(r.Index, checked((uint)value));
28         }
29 
GetRegister(int register)30         public override RegisterValue GetRegister(int register)
31         {
32             if(!mapping.TryGetValue((ArmRegisters)register, out var r))
33             {
34                 throw new RecoverableException($"Wrong register index: {register}");
35             }
36             return GetRegisterValue32(r.Index);
37         }
38 
GetRegisters()39         public override IEnumerable<CPURegister> GetRegisters()
40         {
41             return mapping.Values.OrderBy(x => x.Index);
42         }
43 
44         [Register]
45         public RegisterValue SP
46         {
47             get
48             {
49                 return GetRegisterValue32((int)ArmRegisters.SP);
50             }
51             set
52             {
53                 SetRegisterValue32((int)ArmRegisters.SP, value);
54             }
55         }
56         [Register]
57         public RegisterValue LR
58         {
59             get
60             {
61                 return GetRegisterValue32((int)ArmRegisters.LR);
62             }
63             set
64             {
65                 SetRegisterValue32((int)ArmRegisters.LR, value);
66             }
67         }
68         [Register]
69         public override RegisterValue PC
70         {
71             get
72             {
73                 return GetRegisterValue32((int)ArmRegisters.PC);
74             }
75             set
76             {
77                 value = BeforePCWrite(value);
78                 SetRegisterValue32((int)ArmRegisters.PC, value);
79             }
80         }
81         [Register]
82         public RegisterValue CPSR
83         {
84             get
85             {
86                 return GetRegisterValue32((int)ArmRegisters.CPSR);
87             }
88             set
89             {
90                 SetRegisterValue32((int)ArmRegisters.CPSR, value);
91             }
92         }
93         public RegistersGroup R { get; private set; }
94 
InitializeRegisters()95         protected override void InitializeRegisters()
96         {
97             var indexValueMapR = new Dictionary<int, ArmRegisters>
98             {
99                 { 0, ArmRegisters.R0 },
100                 { 1, ArmRegisters.R1 },
101                 { 2, ArmRegisters.R2 },
102                 { 3, ArmRegisters.R3 },
103                 { 4, ArmRegisters.R4 },
104                 { 5, ArmRegisters.R5 },
105                 { 6, ArmRegisters.R6 },
106                 { 7, ArmRegisters.R7 },
107                 { 8, ArmRegisters.R8 },
108                 { 9, ArmRegisters.R9 },
109                 { 10, ArmRegisters.R10 },
110                 { 11, ArmRegisters.R11 },
111                 { 12, ArmRegisters.R12 },
112                 { 13, ArmRegisters.R13 },
113                 { 14, ArmRegisters.R14 },
114                 { 15, ArmRegisters.R15 },
115             };
116             R = new RegistersGroup(
117                 indexValueMapR.Keys,
118                 i => GetRegister((int)indexValueMapR[i]),
119                 (i, v) => SetRegister((int)indexValueMapR[i], v));
120 
121         }
122 
123         // 649:  Field '...' is never assigned to, and will always have its default value null
124         #pragma warning disable 649
125 
126         [Import(Name = "tlib_set_register_value_32")]
127         protected Action<int, uint> SetRegisterValue32;
128         [Import(Name = "tlib_get_register_value_32")]
129         protected Func<int, uint> GetRegisterValue32;
130 
131         #pragma warning restore 649
132 
133         private static readonly Dictionary<ArmRegisters, CPURegister> mapping = new Dictionary<ArmRegisters, CPURegister>
134         {
135             { ArmRegisters.R0,  new CPURegister(0, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R0" }) },
136             { ArmRegisters.R1,  new CPURegister(1, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R1" }) },
137             { ArmRegisters.R2,  new CPURegister(2, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R2" }) },
138             { ArmRegisters.R3,  new CPURegister(3, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R3" }) },
139             { ArmRegisters.R4,  new CPURegister(4, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R4" }) },
140             { ArmRegisters.R5,  new CPURegister(5, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R5" }) },
141             { ArmRegisters.R6,  new CPURegister(6, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R6" }) },
142             { ArmRegisters.R7,  new CPURegister(7, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R7" }) },
143             { ArmRegisters.R8,  new CPURegister(8, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R8" }) },
144             { ArmRegisters.R9,  new CPURegister(9, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R9" }) },
145             { ArmRegisters.R10,  new CPURegister(10, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R10" }) },
146             { ArmRegisters.R11,  new CPURegister(11, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R11" }) },
147             { ArmRegisters.R12,  new CPURegister(12, 32, isGeneral: true, isReadonly: false, aliases: new [] { "R12" }) },
148             { ArmRegisters.SP,  new CPURegister(13, 32, isGeneral: true, isReadonly: false, aliases: new [] { "SP", "R13" }) },
149             { ArmRegisters.LR,  new CPURegister(14, 32, isGeneral: true, isReadonly: false, aliases: new [] { "LR", "R14" }) },
150             { ArmRegisters.PC,  new CPURegister(15, 32, isGeneral: true, isReadonly: false, aliases: new [] { "PC", "R15" }) },
151             { ArmRegisters.CPSR,  new CPURegister(25, 32, isGeneral: false, isReadonly: false, aliases: new [] { "CPSR" }) },
152         };
153     }
154 
155     public enum ArmRegisters
156     {
157         SP = 13,
158         LR = 14,
159         PC = 15,
160         CPSR = 25,
161         R0 = 0,
162         R1 = 1,
163         R2 = 2,
164         R3 = 3,
165         R4 = 4,
166         R5 = 5,
167         R6 = 6,
168         R7 = 7,
169         R8 = 8,
170         R9 = 9,
171         R10 = 10,
172         R11 = 11,
173         R12 = 12,
174         R13 = 13,
175         R14 = 14,
176         R15 = 15,
177     }
178 }
179