1 //
2 // Copyright (c) 2010-2022 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.Linq;
8 using Antmicro.Renode.Core;
9 using Antmicro.Renode.Core.Structure.Registers;
10 using Antmicro.Renode.Peripherals.Bus;
11 
12 namespace Antmicro.Renode.Peripherals.Miscellaneous
13 {
14     [AllowedTranslations(AllowedTranslation.ByteToDoubleWord | AllowedTranslation.WordToDoubleWord)]
15     public class AmbiqApollo4_PowerController : BasicDoubleWordPeripheral, IKnownSize
16     {
AmbiqApollo4_PowerController(IMachine machine)17         public AmbiqApollo4_PowerController(IMachine machine) : base(machine)
18         {
19             DefineRegisters();
20         }
21 
22         public long Size => 0x250;
23 
DefineRegisters()24         private void DefineRegisters()
25         {
26             Registers.MCUPerformanceControl.Define(this, 0x00000009)
27                 .WithTag("MCUPERFREQ", 0, 2)
28                 .WithTaggedFlag("MCUPERFACK", 2)
29                 .WithTag("MCUPERFSTATUS", 3, 2)
30                 .WithReservedBits(5, 27)
31                 ;
32 
33             Registers.DevicePowerEnable.Define(this, 0x00100000)
34                 .WithTaggedFlag("PWRENIOS", 0)
35                 .WithFlags(1, 4, out powerEnableFlagsIOM0_3, name: "PWRENIOMx")
36                 .WithFlags(5, 4, out powerEnableFlagsIOM4_7, name: "PWRENIOMx")
37                 .WithFlags(9, 4, out powerEnableFlagsUart0_3, name: "PWRENUARTx")
38                 .WithFlag(13, out powerEnableFlagADC, name: "PWRENADC")
39                 .WithTaggedFlag("PWRENMSPI0", 14)
40                 .WithTaggedFlag("PWRENMSPI1", 15)
41                 .WithTaggedFlag("PWRENMSPI2", 16)
42                 .WithTaggedFlag("PWRENGFX", 17)
43                 .WithTaggedFlag("PWRENDISP", 18)
44                 .WithTaggedFlag("PWRENDISPPHY", 19)
45                 .WithFlag(20, out powerEnableFlagCrypto, name: "PWRENCRYPTO")
46                 .WithTaggedFlag("PWRENSDIO", 21)
47                 .WithTaggedFlag("PWRENUSB", 22)
48                 .WithTaggedFlag("PWRENUSBPHY", 23)
49                 .WithTaggedFlag("PWRENDBG", 24)
50                 .WithReservedBits(25, 7)
51                 ;
52 
53             Registers.DevicePowerStatus.Define(this)
54                 .WithTaggedFlag("PWRSTIOS", 0)
55                 .WithFlags(1, 4, FieldMode.Read, name: "PWRSTIOMx", valueProviderCallback: (_, __) => PowerStatusIOM0_3)
56                 .WithFlags(5, 4, FieldMode.Read, name: "PWRSTIOMx", valueProviderCallback: (_, __) => PowerStatusIOM4_7)
57                 .WithFlags(9, 4, FieldMode.Read, name: "PWRSTUARTx", valueProviderCallback: (_, __) => PowerStatusUart0_3)
58                 .WithFlag(13, FieldMode.Read, name: "PWRSTADC", valueProviderCallback: _ => powerEnableFlagADC.Value)
59                 .WithTaggedFlag("PWRSTMSPI0", 14)
60                 .WithTaggedFlag("PWRSTMSPI1", 15)
61                 .WithTaggedFlag("PWRSTMSPI2", 16)
62                 .WithTaggedFlag("PWRSTGFX", 17)
63                 .WithTaggedFlag("PWRSTDISP", 18)
64                 .WithTaggedFlag("PWRSTDISPPHY", 19)
65                 .WithFlag(20, FieldMode.Read, name: "PWRSTCRYPTO", valueProviderCallback: _ => powerEnableFlagCrypto.Value)
66                 .WithTaggedFlag("PWRSTSDIO", 21)
67                 .WithTaggedFlag("PWRSTUSB", 22)
68                 .WithTaggedFlag("PWRSTUSBPHY", 23)
69                 .WithTaggedFlag("PWRSTDBG", 24)
70                 .WithReservedBits(25, 7)
71                 ;
72 
73             Registers.AudioSubsystemPowerEnable.Define(this)
74                 .WithTaggedFlag("PWRENAUDREC", 0)
75                 .WithTaggedFlag("PWRENAUDPB", 1)
76                 .WithTaggedFlag("PWRENPDM0", 2)
77                 .WithTaggedFlag("PWRENPDM1", 3)
78                 .WithTaggedFlag("PWRENPDM2", 4)
79                 .WithTaggedFlag("PWRENPDM3", 5)
80                 .WithTaggedFlag("PWRENI2S0", 6)
81                 .WithTaggedFlag("PWRENI2S1", 7)
82                 .WithReservedBits(8, 2)
83                 .WithTaggedFlag("PWRENAUDADC", 10)
84                 .WithTaggedFlag("PWRENDSPA", 11)
85                 .WithReservedBits(12, 20)
86                 ;
87 
88             Registers.AudioSubsystemPowerStatus.Define(this)
89                 .WithTaggedFlag("PWRSTAUDREC", 0)
90                 .WithTaggedFlag("PWRSTAUDPB", 1)
91                 .WithTaggedFlag("PWRSTPDM0", 2)
92                 .WithTaggedFlag("PWRSTPDM1", 3)
93                 .WithTaggedFlag("PWRSTPDM2", 4)
94                 .WithTaggedFlag("PWRSTPDM3", 5)
95                 .WithTaggedFlag("PWRSTI2S0", 6)
96                 .WithTaggedFlag("PWRSTI2S1", 7)
97                 .WithReservedBits(8, 2)
98                 .WithTaggedFlag("PWRSTAUDADC", 10)
99                 .WithTaggedFlag("PWRSTDSPA", 11)
100                 .WithReservedBits(12, 20)
101                 ;
102 
103             Registers.MemoryPowerEnable.Define(this, 0x0000003F)
104                 .WithTag("PWRENDTCM", 0, 3)
105                 .WithTaggedFlag("PWRENNVM0", 3)
106                 .WithTaggedFlag("PWRENCACHEB0", 4)
107                 .WithTaggedFlag("PWRENCACHEB2", 5)
108                 .WithReservedBits(6, 26)
109                 ;
110 
111             Registers.MemoryPowerStatus.Define(this, 0x0000003F)
112                 .WithTag("PWRSTDTCM", 0, 3)
113                 .WithTaggedFlag("PWRSTNVM0", 3)
114                 .WithTaggedFlag("PWRSTCACHEB0", 4)
115                 .WithTaggedFlag("PWRSTCACHEB2", 5)
116                 .WithReservedBits(6, 26)
117                 ;
118 
119             Registers.MemoryRetConfiguration.Define(this, 0x00000008)
120                 .WithTag("DTCMPWDSLP", 0, 3)
121                 .WithTaggedFlag("NVM0PWDSLP", 3)
122                 .WithTaggedFlag("CACHEPWDSLP", 4)
123                 .WithReservedBits(5, 27)
124                 ;
125 
126             Registers.SystemPowerStatus.Define(this, 0x0000000F)
127                 .WithTaggedFlag("PWRSTMCUL", 0)
128                 .WithTaggedFlag("PWRSTMCUH", 1)
129                 .WithTaggedFlag("PWRSTDSP0H", 2)
130                 .WithTaggedFlag("PWRSTDSP1H", 3)
131                 .WithReservedBits(4, 25)
132                 .WithTaggedFlag("CORESLEEP", 29)
133                 .WithTaggedFlag("COREDEEPSLEEP", 30)
134                 .WithTaggedFlag("SYSDEEPSLEEP", 31)
135                 ;
136 
137             Registers.SharedSRAMPowerEnable.Define(this)
138                 .WithTag("PWRENSSRAM", 0, 2)
139                 .WithReservedBits(2, 30)
140                 ;
141 
142             Registers.SharedSRAMPowerStatus.Define(this, 0x00000003)
143                 .WithTag("SSRAMPWRST", 0, 2)
144                 .WithReservedBits(2, 30)
145                 ;
146 
147             Registers.SharedSRAMRetConfiguration.Define(this, 0x000003FC)
148                 .WithTag("SSRAMPWDSLP", 0, 2)
149                 .WithTag("SSRAMACTMCU", 2, 2)
150                 .WithTag("SSRAMACTDSP", 4, 2)
151                 .WithTag("SSRAMACTGFX", 6, 2)
152                 .WithTag("SSRAMACTDISP", 8, 2)
153                 .WithReservedBits(10, 22)
154                 ;
155 
156             Registers.DevicePowerEventEnable.Define(this)
157                 .WithTaggedFlag("MCULEVEN", 0)
158                 .WithTaggedFlag("MCUHEVEN", 1)
159                 .WithTaggedFlag("HCPAEVEN", 2)
160                 .WithTaggedFlag("HCPBEVEN", 3)
161                 .WithTaggedFlag("HCPCEVEN", 4)
162                 .WithTaggedFlag("ADCEVEN", 5)
163                 .WithTaggedFlag("MSPIEVEN", 6)
164                 .WithTaggedFlag("AUDEVEN", 7)
165                 .WithReservedBits(8, 24)
166                 ;
167 
168             Registers.MemoryPowerEventEnable.Define(this)
169                 .WithTag("DTCMEN", 0, 3)
170                 .WithTaggedFlag("NVM0EN", 3)
171                 .WithTaggedFlag("CACHEB0EN", 4)
172                 .WithTaggedFlag("CACHEB2EN", 5)
173                 .WithReservedBits(6, 26)
174                 ;
175 
176             Registers.MultimediaSystemOverride.Define(this, 0x00000FFC)
177                 .WithTaggedFlag("MMSOVRMCULDISP", 0)
178                 .WithTaggedFlag("MMSOVRMCULGFX", 1)
179                 .WithTaggedFlag("MMSOVRSSRAMDISP", 2)
180                 .WithTaggedFlag("MMSOVRSSRAMGFX", 3)
181                 .WithTag("MMSOVRDSPRAMRETDISP", 4, 2)
182                 .WithTag("MMSOVRDSPRAMRETGFX", 6, 2)
183                 .WithTag("MMSOVRSSRAMRETDISP", 8, 2)
184                 .WithTag("MMSOVRSSRAMRETGFX", 10, 2)
185                 .WithReservedBits(12, 20)
186                 ;
187 
188             Registers.DSP0PowerAndResetControls.Define(this, 0x00000008)
189                 .WithTag("DSP0PCMRSTDLY", 0, 4)
190                 .WithTaggedFlag("DSP0PCMRSTOR", 4)
191                 .WithReservedBits(5, 27)
192                 ;
193 
194             Registers.DSP0PerformanceControl.Define(this, 0x00000009)
195                 .WithTag("DSP0PERFREQ", 0, 2)
196                 .WithTaggedFlag("DSP0PERFACK", 2)
197                 .WithTag("DSP0PERFSTATUS", 3, 2)
198                 .WithReservedBits(5, 27)
199                 ;
200 
201             Registers.DSP0MemoryPowerEnable.Define(this)
202                 .WithTaggedFlag("PWRENDSP0RAM", 0)
203                 .WithTaggedFlag("PWRENDSP0ICACHE", 1)
204                 .WithReservedBits(2, 30)
205                 ;
206 
207             Registers.DSP0MemoryPowerStatus.Define(this)
208                 .WithTaggedFlag("PWRSTDSP0RAM", 0)
209                 .WithTaggedFlag("PWRSTDSP0ICACHE", 1)
210                 .WithReservedBits(2, 30)
211                 ;
212 
213             Registers.DSP0MemoryRetConfiguration.Define(this)
214                 .WithTaggedFlag("RAMPWDDSP0OFF", 0)
215                 .WithTaggedFlag("DSP0RAMACTMCU", 1)
216                 .WithTaggedFlag("ICACHEPWDDSP0OFF", 2)
217                 .WithTaggedFlag("DSP0RAMACTDISP", 3)
218                 .WithTaggedFlag("DSP0RAMACTGFX", 4)
219                 .WithReservedBits(5, 27)
220                 ;
221 
222             Registers.DSP1PowerAndResetControls.Define(this, 0x00000008)
223                 .WithTag("DSP1PCMRSTDLY", 0, 4)
224                 .WithTaggedFlag("DSP1PCMRSTOR", 4)
225                 .WithReservedBits(5, 27)
226                 ;
227 
228             Registers.DSP1PerformanceControl.Define(this, 0x00000009)
229                 .WithTag("DSP1PERFREQ", 0, 2)
230                 .WithTaggedFlag("DSP1PERFACK", 2)
231                 .WithTag("DSP1PERFSTATUS", 3, 2)
232                 .WithReservedBits(5, 27)
233                 ;
234 
235             Registers.DSP1MemoryPowerEnable.Define(this)
236                 .WithTaggedFlag("PWRENDSP1RAM", 0)
237                 .WithTaggedFlag("PWRENDSP1ICACHE", 1)
238                 .WithReservedBits(2, 30)
239                 ;
240 
241             Registers.DSP1MemoryPowerStatus.Define(this)
242                 .WithTaggedFlag("PWRSTDSP1RAM", 0)
243                 .WithTaggedFlag("PWRSTDSP1ICACHE", 1)
244                 .WithReservedBits(2, 30)
245                 ;
246 
247             Registers.DSP1MemoryRetConfiguration.Define(this)
248                 .WithTaggedFlag("RAMPWDDSP1OFF", 0)
249                 .WithTaggedFlag("DSP1RAMACTMCU", 1)
250                 .WithTaggedFlag("ICACHEPWDDSP1OFF", 2)
251                 .WithTaggedFlag("DSP1RAMACTDISP", 3)
252                 .WithTaggedFlag("DSP1RAMACTGFX", 4)
253                 .WithReservedBits(5, 27)
254                 ;
255 
256             Registers.VoltageRegulatorsControl.Define(this)
257                 .WithTaggedFlag("SIMOBUCKEN", 0)
258                 .WithReservedBits(1, 31)
259                 ;
260 
261             Registers.VoltageRegulatorsLegacyLowPowerOverrides.Define(this)
262                 .WithTaggedFlag("IGNOREIOS", 0)
263                 .WithTaggedFlag("IGNOREHCPA", 1)
264                 .WithTaggedFlag("IGNOREHCPB", 2)
265                 .WithTaggedFlag("IGNOREHCPC", 3)
266                 .WithTaggedFlag("IGNOREHCPD", 4)
267                 .WithTaggedFlag("IGNOREHCPE", 5)
268                 .WithTaggedFlag("IGNOREMSPI", 6)
269                 .WithTaggedFlag("IGNOREGFX", 7)
270                 .WithTaggedFlag("IGNOREDISP", 8)
271                 .WithTaggedFlag("IGNOREDISPPHY", 9)
272                 .WithTaggedFlag("IGNORECRYPTO", 10)
273                 .WithTaggedFlag("IGNORESDIO", 11)
274                 .WithTaggedFlag("IGNOREUSB", 12)
275                 .WithTaggedFlag("IGNOREUSBPHY", 13)
276                 .WithTaggedFlag("IGNOREAUD", 14)
277                 .WithTaggedFlag("IGNOREDSPA", 15)
278                 .WithTaggedFlag("IGNOREDSP0H", 16)
279                 .WithTaggedFlag("IGNOREDSP1H", 17)
280                 .WithTaggedFlag("IGNOREDBG", 18)
281                 .WithReservedBits(19, 13)
282                 ;
283 
284             Registers.VoltageRegulatorsStatus.Define(this)
285                 .WithTag("CORELDOST", 0, 2)
286                 .WithTag("MEMLDOST", 2, 2)
287                 .WithTag("SIMOBUCKST", 4, 2)
288                 .WithReservedBits(6, 26)
289                 ;
290 
291             Registers.ULPLowPowerWeights0.Define(this)
292                 .WithTag("WTULPMCU", 0, 4)
293                 .WithTag("WTULPDSP0", 4, 4)
294                 .WithTag("WTULPDSP1", 8, 4)
295                 .WithTag("WTULPIOS", 12, 4)
296                 .WithTag("WTULPUART0", 16, 4)
297                 .WithTag("WTULPUART1", 20, 4)
298                 .WithTag("WTULPUART2", 24, 4)
299                 .WithTag("WTULPUART3", 28, 4)
300                 ;
301 
302             Registers.ULPLowPowerWeights1.Define(this)
303                 .WithTag("WTULPIOM0", 0, 4)
304                 .WithTag("WTULPIOM1", 4, 4)
305                 .WithTag("WTULPIOM2", 8, 4)
306                 .WithTag("WTULPIOM3", 12, 4)
307                 .WithTag("WTULPIOM4", 16, 4)
308                 .WithTag("WTULPIOM5", 20, 4)
309                 .WithTag("WTULPIOM6", 24, 4)
310                 .WithTag("WTULPIOM7", 28, 4)
311                 ;
312 
313             Registers.ULPLowPowerWeights2.Define(this)
314                 .WithTag("WTULPADC", 0, 4)
315                 .WithTag("WTULPMSPI0", 4, 4)
316                 .WithTag("WTULPMSPI1", 8, 4)
317                 .WithTag("WTULPGFX", 12, 4)
318                 .WithTag("WTULPDISP", 16, 4)
319                 .WithTag("WTULPCRYPTO", 20, 4)
320                 .WithTag("WTULPSDIO", 24, 4)
321                 .WithTag("WTULPUSB", 28, 4)
322                 ;
323 
324             Registers.ULPLowPowerWeights3.Define(this)
325                 .WithTag("WTULPDSPA", 0, 4)
326                 .WithTag("WTULPDBG", 4, 4)
327                 .WithTag("WTULPAUDREC", 8, 4)
328                 .WithTag("WTULPAUDPB", 12, 4)
329                 .WithTag("WTULPAUDADC", 16, 4)
330                 .WithReservedBits(20, 8)
331                 .WithTag("WTULPMSPI2", 28, 4)
332                 ;
333 
334             Registers.ULPLowPowerWeights4.Define(this)
335                 .WithTag("WTULPI2S0", 0, 4)
336                 .WithTag("WTULPI2S1", 4, 4)
337                 .WithReservedBits(8, 8)
338                 .WithTag("WTULPPDM0", 16, 4)
339                 .WithTag("WTULPPDM1", 20, 4)
340                 .WithTag("WTULPPDM2", 24, 4)
341                 .WithTag("WTULPPDM3", 28, 4)
342                 ;
343 
344             Registers.ULPLowPowerWeights5.Define(this)
345                 .WithTag("WTULPDISPPHY", 0, 4)
346                 .WithTag("WTULPUSBPHY", 4, 4)
347                 .WithReservedBits(8, 24)
348                 ;
349 
350             Registers.LPLowPowerWeights0.Define(this)
351                 .WithTag("WTLPMCU", 0, 4)
352                 .WithTag("WTLPDSP0", 4, 4)
353                 .WithTag("WTLPDSP1", 8, 4)
354                 .WithTag("WTLPIOS", 12, 4)
355                 .WithTag("WTLPUART0", 16, 4)
356                 .WithTag("WTLPUART1", 20, 4)
357                 .WithTag("WTLPUART2", 24, 4)
358                 .WithTag("WTLPUART3", 28, 4)
359                 ;
360 
361             Registers.LPLowPowerWeights1.Define(this)
362                 .WithTag("WTLPIOM0", 0, 4)
363                 .WithTag("WTLPIOM1", 4, 4)
364                 .WithTag("WTLPIOM2", 8, 4)
365                 .WithTag("WTLPIOM3", 12, 4)
366                 .WithTag("WTLPIOM4", 16, 4)
367                 .WithTag("WTLPIOM5", 20, 4)
368                 .WithTag("WTLPIOM6", 24, 4)
369                 .WithTag("WTLPIOM7", 28, 4)
370                 ;
371 
372             Registers.LPLowPowerWeights2.Define(this)
373                 .WithTag("WTLPADC", 0, 4)
374                 .WithTag("WTLPMSPI0", 4, 4)
375                 .WithTag("WTLPMSPI1", 8, 4)
376                 .WithTag("WTLPGFX", 12, 4)
377                 .WithTag("WTLPDISP", 16, 4)
378                 .WithTag("WTLPCRYPTO", 20, 4)
379                 .WithTag("WTLPSDIO", 24, 4)
380                 .WithTag("WTLPUSB", 28, 4)
381                 ;
382 
383             Registers.LPLowPowerWeights3.Define(this)
384                 .WithTag("WTLPDSPA", 0, 4)
385                 .WithTag("WTLPDBG", 4, 4)
386                 .WithTag("WTLPAUDREC", 8, 4)
387                 .WithTag("WTLPAUDPB", 12, 4)
388                 .WithTag("WTLPAUDADC", 16, 4)
389                 .WithReservedBits(20, 8)
390                 .WithTag("WTLPMSPI2", 28, 4)
391                 ;
392 
393             Registers.LPLowPowerWeights4.Define(this)
394                 .WithTag("WTLPI2S0", 0, 4)
395                 .WithTag("WTLPI2S1", 4, 4)
396                 .WithReservedBits(8, 8)
397                 .WithTag("WTLPPDM0", 16, 4)
398                 .WithTag("WTLPPDM1", 20, 4)
399                 .WithTag("WTLPPDM2", 24, 4)
400                 .WithTag("WTLPPDM3", 28, 4)
401                 ;
402 
403             Registers.LPLowPowerWeights5.Define(this)
404                 .WithTag("WTLPDISPPHY", 0, 4)
405                 .WithTag("WTLPUSBPHY", 4, 4)
406                 .WithReservedBits(8, 24)
407                 ;
408 
409             Registers.HPLowPowerWeights0.Define(this)
410                 .WithTag("WTHPMCU", 0, 4)
411                 .WithTag("WTHPDSP0", 4, 4)
412                 .WithTag("WTHPDSP1", 8, 4)
413                 .WithTag("WTHPIOS", 12, 4)
414                 .WithTag("WTHPUART0", 16, 4)
415                 .WithTag("WTHPUART1", 20, 4)
416                 .WithTag("WTHPUART2", 24, 4)
417                 .WithTag("WTHPUART3", 28, 4)
418                 ;
419 
420             Registers.HPLowPowerWeights1.Define(this)
421                 .WithTag("WTHPIOM0", 0, 4)
422                 .WithTag("WTHPIOM1", 4, 4)
423                 .WithTag("WTHPIOM2", 8, 4)
424                 .WithTag("WTHPIOM3", 12, 4)
425                 .WithTag("WTHPIOM4", 16, 4)
426                 .WithTag("WTHPIOM5", 20, 4)
427                 .WithTag("WTHPIOM6", 24, 4)
428                 .WithTag("WTHPIOM7", 28, 4)
429                 ;
430 
431             Registers.HPLowPowerWeights2.Define(this)
432                 .WithTag("WTHPADC", 0, 4)
433                 .WithTag("WTHPMSPI0", 4, 4)
434                 .WithTag("WTHPMSPI1", 8, 4)
435                 .WithTag("WTHPGFX", 12, 4)
436                 .WithTag("WTHPDISP", 16, 4)
437                 .WithTag("WTHPCRYPTO", 20, 4)
438                 .WithTag("WTHPSDIO", 24, 4)
439                 .WithTag("WTHPUSB", 28, 4)
440                 ;
441 
442             Registers.HPLowPowerWeights3.Define(this)
443                 .WithTag("WTHPDSPA", 0, 4)
444                 .WithTag("WTHPDBG", 4, 4)
445                 .WithTag("WTHPAUDREC", 8, 4)
446                 .WithTag("WTHPAUDPB", 12, 4)
447                 .WithTag("WTHPAUDADC", 16, 4)
448                 .WithReservedBits(20, 8)
449                 .WithTag("WTHPMSPI2", 28, 4)
450                 ;
451 
452             Registers.HPLowPowerWeights4.Define(this)
453                 .WithTag("WTHPI2S0", 0, 4)
454                 .WithTag("WTHPI2S1", 4, 4)
455                 .WithReservedBits(8, 8)
456                 .WithTag("WTHPPDM0", 16, 4)
457                 .WithTag("WTHPPDM1", 20, 4)
458                 .WithTag("WTHPPDM2", 24, 4)
459                 .WithTag("WTHPPDM3", 28, 4)
460                 ;
461 
462             Registers.HPLowPowerWeights5.Define(this)
463                 .WithTag("WTHPDISPPHY", 0, 4)
464                 .WithTag("WTHPUSBPHY", 4, 4)
465                 .WithReservedBits(8, 24)
466                 ;
467 
468             Registers.SleepLowPowerWeights.Define(this)
469                 .WithTag("WTDSMCU", 0, 4)
470                 .WithReservedBits(4, 28)
471                 ;
472 
473             Registers.VoltageRegulatorsDemotionThreshold.Define(this)
474                 .WithTag("VRDEMOTIONTHR", 0, 32)
475                 ;
476 
477             Registers.SRAMControl.Define(this)
478                 .WithReservedBits(0, 1)
479                 .WithTaggedFlag("SRAMCLKGATE", 1)
480                 .WithTaggedFlag("SRAMMASTERCLKGATE", 2)
481                 .WithReservedBits(3, 5)
482                 .WithTag("SRAMLIGHTSLEEP", 8, 12)
483                 .WithReservedBits(20, 12)
484                 ;
485 
486             Registers.ADCPowerStatus.Define(this, 0x0000003F)
487                 .WithTaggedFlag("ADCPWD", 0)
488                 .WithTaggedFlag("BGTPWD", 1)
489                 .WithTaggedFlag("VPTATPWD", 2)
490                 .WithTaggedFlag("VBATPWD", 3)
491                 .WithTaggedFlag("REFKEEPPWD", 4)
492                 .WithTaggedFlag("REFBUFPWD", 5)
493                 .WithReservedBits(6, 26)
494                 ;
495 
496             Registers.AudioADCPowerStatus.Define(this, 0x0000003F)
497                 .WithTaggedFlag("AUDADCPWD", 0)
498                 .WithTaggedFlag("AUDBGTPWD", 1)
499                 .WithTaggedFlag("AUDVPTATPWD", 2)
500                 .WithTaggedFlag("AUDVBATPWD", 3)
501                 .WithTaggedFlag("AUDREFKEEPPWD", 4)
502                 .WithTaggedFlag("AUDREFBUFPWD", 5)
503                 .WithReservedBits(6, 26)
504                 ;
505 
506             Registers.EnergyMonitorControl.Define(this, 0x000000FF)
507                 .WithTag("FREEZE", 0, 8)
508                 .WithTag("CLEAR", 8, 8)
509                 .WithReservedBits(16, 16)
510                 ;
511 
512             Registers.EnergyMonitorModeSelect0.Define(this)
513                 .WithTag("EMONSEL0", 0, 8)
514                 .WithReservedBits(8, 24)
515                 ;
516 
517             Registers.EnergyMonitorModeSelect1.Define(this)
518                 .WithTag("EMONSEL1", 0, 8)
519                 .WithReservedBits(8, 24)
520                 ;
521 
522             Registers.EnergyMonitorModeSelect2.Define(this)
523                 .WithTag("EMONSEL2", 0, 8)
524                 .WithReservedBits(8, 24)
525                 ;
526 
527             Registers.EnergyMonitorModeSelect3.Define(this)
528                 .WithTag("EMONSEL3", 0, 8)
529                 .WithReservedBits(8, 24)
530                 ;
531 
532             Registers.EnergyMonitorModeSelect4.Define(this)
533                 .WithTag("EMONSEL4", 0, 8)
534                 .WithReservedBits(8, 24)
535                 ;
536 
537             Registers.EnergyMonitorModeSelect5.Define(this)
538                 .WithTag("EMONSEL5", 0, 8)
539                 .WithReservedBits(8, 24)
540                 ;
541 
542             Registers.EnergyMonitorModeSelect6.Define(this)
543                 .WithTag("EMONSEL6", 0, 8)
544                 .WithReservedBits(8, 24)
545                 ;
546 
547             Registers.EnergyMonitorModeSelect7.Define(this)
548                 .WithTag("EMONSEL7", 0, 8)
549                 .WithReservedBits(8, 24)
550                 ;
551 
552             Registers.EnergyMonitorCount0.Define(this)
553                 .WithTag("EMONCOUNT0", 0, 32)
554                 ;
555 
556             Registers.EnergyMonitorCount1.Define(this)
557                 .WithTag("EMONCOUNT1", 0, 32)
558                 ;
559 
560             Registers.EnergyMonitorCount2.Define(this)
561                 .WithTag("EMONCOUNT2", 0, 32)
562                 ;
563 
564             Registers.EnergyMonitorCount3.Define(this)
565                 .WithTag("EMONCOUNT3", 0, 32)
566                 ;
567 
568             Registers.EnergyMonitorCount4.Define(this)
569                 .WithTag("EMONCOUNT4", 0, 32)
570                 ;
571 
572             Registers.EnergyMonitorCount5.Define(this)
573                 .WithTag("EMONCOUNT5", 0, 32)
574                 ;
575 
576             Registers.EnergyMonitorCount6.Define(this)
577                 .WithTag("EMONCOUNT6", 0, 32)
578                 ;
579 
580             Registers.EnergyMonitorCount7.Define(this)
581                 .WithTag("EMONCOUNT7", 0, 32)
582                 ;
583 
584             Registers.EnergyMonitorStatus.Define(this)
585                 .WithTaggedFlag("EMONOVERFLOW0", 0)
586                 .WithTaggedFlag("EMONOVERFLOW1", 1)
587                 .WithTaggedFlag("EMONOVERFLOW2", 2)
588                 .WithTaggedFlag("EMONOVERFLOW3", 3)
589                 .WithTaggedFlag("EMONOVERFLOW4", 4)
590                 .WithTaggedFlag("EMONOVERFLOW5", 5)
591                 .WithTaggedFlag("EMONOVERFLOW6", 6)
592                 .WithTaggedFlag("EMONOVERFLOW7", 7)
593                 .WithReservedBits(8, 24)
594                 ;
595         }
596 
597         // Some modules share a single power domain, e.g. enabling IOM1 powers on all IOM0..3 modules.
598         private bool PowerStatusIOM0_3 => powerEnableFlagsIOM0_3.Any(flag => flag.Value);
599         private bool PowerStatusIOM4_7 => powerEnableFlagsIOM4_7.Any(flag => flag.Value);
600         private bool PowerStatusUart0_3 => powerEnableFlagsUart0_3.Any(flag => flag.Value);
601 
602         private IFlagRegisterField powerEnableFlagADC;
603         private IFlagRegisterField powerEnableFlagCrypto;
604         private IFlagRegisterField[] powerEnableFlagsIOM0_3;
605         private IFlagRegisterField[] powerEnableFlagsIOM4_7;
606         private IFlagRegisterField[] powerEnableFlagsUart0_3;
607 
608         private enum Registers : long
609         {
610             MCUPerformanceControl = 0x0,
611             DevicePowerEnable = 0x4,
612             DevicePowerStatus = 0x8,
613             AudioSubsystemPowerEnable = 0xC,
614             AudioSubsystemPowerStatus = 0x10,
615             MemoryPowerEnable = 0x14,
616             MemoryPowerStatus = 0x18,
617             MemoryRetConfiguration = 0x1C,
618             SystemPowerStatus = 0x20,
619             SharedSRAMPowerEnable = 0x24,
620             SharedSRAMPowerStatus = 0x28,
621             SharedSRAMRetConfiguration = 0x2C,
622             DevicePowerEventEnable = 0x30,
623             MemoryPowerEventEnable = 0x34,
624             MultimediaSystemOverride = 0x40,
625             DSP0PowerAndResetControls = 0x50,
626             DSP0PerformanceControl = 0x54,
627             DSP0MemoryPowerEnable = 0x58,
628             DSP0MemoryPowerStatus = 0x5C,
629             DSP0MemoryRetConfiguration = 0x60,
630             DSP1PowerAndResetControls = 0x70,
631             DSP1PerformanceControl = 0x74,
632             DSP1MemoryPowerEnable = 0x78,
633             DSP1MemoryPowerStatus = 0x7C,
634             DSP1MemoryRetConfiguration = 0x80,
635             VoltageRegulatorsControl = 0x100,
636             VoltageRegulatorsLegacyLowPowerOverrides = 0x104,
637             VoltageRegulatorsStatus = 0x108,
638             ULPLowPowerWeights0 = 0x140,
639             ULPLowPowerWeights1 = 0x144,
640             ULPLowPowerWeights2 = 0x148,
641             ULPLowPowerWeights3 = 0x14C,
642             ULPLowPowerWeights4 = 0x150,
643             ULPLowPowerWeights5 = 0x154,
644             LPLowPowerWeights0 = 0x158,
645             LPLowPowerWeights1 = 0x15C,
646             LPLowPowerWeights2 = 0x160,
647             LPLowPowerWeights3 = 0x164,
648             LPLowPowerWeights4 = 0x168,
649             LPLowPowerWeights5 = 0x16C,
650             HPLowPowerWeights0 = 0x170,
651             HPLowPowerWeights1 = 0x174,
652             HPLowPowerWeights2 = 0x178,
653             HPLowPowerWeights3 = 0x17C,
654             HPLowPowerWeights4 = 0x180,
655             HPLowPowerWeights5 = 0x184,
656             SleepLowPowerWeights = 0x188,
657             VoltageRegulatorsDemotionThreshold = 0x18C,
658             SRAMControl = 0x190,
659             ADCPowerStatus = 0x194,
660             AudioADCPowerStatus = 0x198,
661             EnergyMonitorControl = 0x200,
662             EnergyMonitorModeSelect0 = 0x204,
663             EnergyMonitorModeSelect1 = 0x208,
664             EnergyMonitorModeSelect2 = 0x20C,
665             EnergyMonitorModeSelect3 = 0x210,
666             EnergyMonitorModeSelect4 = 0x214,
667             EnergyMonitorModeSelect5 = 0x218,
668             EnergyMonitorModeSelect6 = 0x21C,
669             EnergyMonitorModeSelect7 = 0x220,
670             EnergyMonitorCount0 = 0x228,
671             EnergyMonitorCount1 = 0x22C,
672             EnergyMonitorCount2 = 0x230,
673             EnergyMonitorCount3 = 0x234,
674             EnergyMonitorCount4 = 0x238,
675             EnergyMonitorCount5 = 0x23C,
676             EnergyMonitorCount6 = 0x240,
677             EnergyMonitorCount7 = 0x244,
678             EnergyMonitorStatus = 0x24C,
679         }
680     }
681 }
682