1 //
2 // Copyright (c) 2010-2025 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 using System.Collections.Generic;
9 using Antmicro.Renode.Core.Structure;
10 using Antmicro.Renode.Core.Structure.Registers;
11 using Antmicro.Renode.Logging;
12 using Antmicro.Renode.Peripherals.Bus;
13 using Antmicro.Renode.UserInterface;
14 using Antmicro.Renode.Utilities;
15 
16 namespace Antmicro.Renode.Peripherals.Network
17 {
18     public partial class SynopsysDWCEthernetQualityOfService : IDoubleWordPeripheral
19     {
ReadDoubleWord(long offset)20         public virtual uint ReadDoubleWord(long offset)
21         {
22             return Read<RegistersMacAndMmc>(macAndMmcRegisters, "MAC and MMC", offset);
23         }
24 
WriteDoubleWord(long offset, uint value)25         public virtual void WriteDoubleWord(long offset, uint value)
26         {
27             Write<RegistersMacAndMmc>(macAndMmcRegisters, "MAC and MMC", offset, value);
28         }
29 
30         [ConnectionRegionAttribute("mtl")]
ReadDoubleWordFromMTL(long offset)31         public uint ReadDoubleWordFromMTL(long offset)
32         {
33             return Read<RegistersMTL>(mtlRegisters, "MTL", offset);
34         }
35 
36         [ConnectionRegionAttribute("mtl")]
WriteDoubleWordToMTL(long offset, uint value)37         public void WriteDoubleWordToMTL(long offset, uint value)
38         {
39             Write<RegistersMTL>(mtlRegisters, "MTL", offset, value);
40         }
41 
42         [ConnectionRegionAttribute("dma")]
ReadDoubleWordFromDMA(long offset)43         public uint ReadDoubleWordFromDMA(long offset)
44         {
45             return Read<RegistersDMA>(dmaRegisters, "DMA", offset);
46         }
47 
48         [ConnectionRegionAttribute("dma")]
WriteDoubleWordToDMA(long offset, uint value)49         public void WriteDoubleWordToDMA(long offset, uint value)
50         {
51             Write<RegistersDMA>(dmaRegisters, "DMA", offset, value);
52         }
53 
54         [UiAccessible]
GetCoutersInfo()55         public string[,] GetCoutersInfo()
56         {
57             var table = new Table();
58             table.AddRow("Name", "Value");
59             table.AddRow(nameof(txByteCounter), Convert.ToString(txByteCounter.Value));
60             table.AddRow(nameof(txPacketCounter), Convert.ToString(txPacketCounter.Value));
61             table.AddRow(nameof(txUnicastPacketCounter), Convert.ToString(txUnicastPacketCounter.Value));
62             table.AddRow(nameof(txMulticastPacketCounter), Convert.ToString(txMulticastPacketCounter.Value));
63             table.AddRow(nameof(txBroadcastPacketCounter), Convert.ToString(txBroadcastPacketCounter.Value));
64             table.AddRow(nameof(txGoodByteCounter), Convert.ToString(txGoodByteCounter.Value));
65             table.AddRow(nameof(txGoodPacketCounter), Convert.ToString(txGoodPacketCounter.Value));
66             table.AddRow(nameof(rxPacketCounter), Convert.ToString(rxPacketCounter.Value));
67             table.AddRow(nameof(rxByteCounter), Convert.ToString(rxByteCounter.Value));
68             table.AddRow(nameof(rxGoodByteCounter), Convert.ToString(rxGoodByteCounter.Value));
69             table.AddRow(nameof(rxBroadcastPacketCounter), Convert.ToString(rxBroadcastPacketCounter.Value));
70             table.AddRow(nameof(rxMulticastPacketCounter), Convert.ToString(rxMulticastPacketCounter.Value));
71             table.AddRow(nameof(rxCrcErrorPacketCounter), Convert.ToString(rxCrcErrorPacketCounter.Value));
72             table.AddRow(nameof(rxUnicastPacketCounter), Convert.ToString(rxUnicastPacketCounter.Value));
73             table.AddRow(nameof(rxFifoPacketCounter), Convert.ToString(rxFifoPacketCounter.Value));
74             for(var i = 0; i < NumberOfIpcCounters; i++)
75             {
76                 var name = (IpcCounter)i;
77                 table.AddRow($"IPC {name} Packets", Convert.ToString(rxIpcPacketCounter[i].Value));
78                 table.AddRow($"IPC {name} Bytes", Convert.ToString(rxIpcByteCounter[i].Value));
79             }
80             return table.ToArray();
81         }
82 
83         // This property works similar to `sysbus LogPeripheralAccess` command,
84         // but supports regions. Setting this to `null` disables logging.
85         public LogLevel PeripheralAccessLogLevel { get; set; } = null;
86 
87         protected IEnumRegisterField<DMAChannelInterruptMode> dmaInterruptMode;
88 
ResetRegisters()89         private void ResetRegisters()
90         {
91             macAndMmcRegisters.Reset();
92             mtlRegisters.Reset();
93             dmaRegisters.Reset();
94         }
95 
CreateRegisterMap()96         private IDictionary<long, DoubleWordRegister> CreateRegisterMap()
97         {
98             return new Dictionary<long, DoubleWordRegister>()
99             {
100                 {(long)RegistersMacAndMmc.OperatingModeConfiguration, new DoubleWordRegister(this)
101                     .WithFlag(0, out rxEnable, name: "MACCR.RE (Receiver Enable)")
102                     .WithFlag(1, out txEnable, name: "MACCR.TE (TE)")
103                     .WithTag("MACCR.PRELEN (PRELEN)", 2, 2)
104                     .WithTaggedFlag("MACCR.DC (DC)", 4)
105                     .WithTag("MACCR.BL (BL)", 5, 2)
106                     .WithReservedBits(7, 1)
107                     .WithTaggedFlag("MACCR.DR (DR)", 8)
108                     .WithTaggedFlag("MACCR.DCRS (DCRS)", 9)
109                     .WithTaggedFlag("MACCR.DO (DO)", 10)
110                     .WithTaggedFlag("MACCR.ECRSFD (ECRSFD)", 11)
111                     .WithFlag(12, out loopbackEnabled, name: "MACCR.LM (LM)")
112                     .WithTaggedFlag("MACCR.DM (DM)", 13)
113                     .WithTaggedFlag("MACCR.FES (FES)", 14)
114                     .WithReservedBits(15, 1)
115                     .WithTaggedFlag("MACCR.JD (JD)", 17)
116                     .WithTaggedFlag("MACCR.JE (JE)", 16)
117                     .WithReservedBits(18, 1)
118                     .WithTaggedFlag("MACCR.WD (WD)", 19)
119                     .WithTaggedFlag("MACCR.ACS (ACS)", 20)
120                     .WithTaggedFlag("MACCR.CST (CST)", 21)
121                     .WithTaggedFlag("MACCR.S2KP (S2KP)", 22)
122                     .WithTaggedFlag("MACCR.GPSLCE (GPSLCE)", 23)
123                     .WithTag("MACCR.IPG (IPG)", 24, 3)
124                     .WithFlag(27, out checksumOffloadEnable, name: "MACCR.IPC (IPC)")
125                     .WithEnumField<DoubleWordRegister, RegisterSourceAddressOperation>(28, 3, out sourceAddressOperation, name: "MACCR.SARC (SARC)")
126                     .WithTaggedFlag("MACCR.ARPEN (ARPEN)", 31)
127                 },
128                 {(long)RegistersMacAndMmc.ExtendedOperatingModeConfiguration, new DoubleWordRegister(this)
129                     .WithTag("MACECR.GPSL (GPSL)", 0, 14)
130                     .WithReservedBits(14, 2)
131                     .WithFlag(16, out crcCheckDisable, name: "MACECR.DCRCC (DCRCC)")
132                     .WithTaggedFlag("MACECR.SPEN (SPEN)", 17)
133                     .WithTaggedFlag("MACECR.USP (USP)", 18)
134                     .If(dmaChannels.Length > 1)
135                         .Then(r => r.WithFlag(19, out packetDuplicationControl, name: "MACECR.PDC (PDC)"))
136                         .Else(r => r.WithReservedBits(19, 1))
137                     .WithReservedBits(20, 4)
138                     .WithTaggedFlag("MACECR.EIPGEN (EIPGEN)", 24)
139                     .WithTag("MACECR.EIPG (EIPG)", 25, 5)
140                     .WithReservedBits(30, 2)
141                 },
142                 {(long)RegistersMacAndMmc.PacketFilteringControl, new DoubleWordRegister(this)
143                     .WithTaggedFlag("MACPFR.PR (PR)", 0)
144                     .WithTaggedFlag("MACPFR.HUC (HUC)", 1)
145                     .WithTaggedFlag("MACPFR.HMC (HMC)", 2)
146                     .WithTaggedFlag("MACPFR.DAIF (DAIF)", 3)
147                     .WithTaggedFlag("MACPFR.PM (PM)", 4)
148                     .WithTaggedFlag("MACPFR.DBF (DBF)", 5)
149                     .WithTag("MACPFR.PCF (PCF)", 6, 2)
150                     .WithTaggedFlag("MACPFR.SAIF (SAIF)", 8)
151                     .WithTaggedFlag("MACPFR.SAF (SAF)", 9)
152                     .WithTaggedFlag("MACPFR.HPF (HPF)", 10)
153                     .WithReservedBits(11, 5)
154                     .WithTaggedFlag("MACPFR.VTFE (VTFE)", 16)
155                     .WithReservedBits(17, 3)
156                     .WithTaggedFlag("MACPFR.IPFE (IPFE)", 20)
157                     .WithTaggedFlag("MACPFR.DNTU (DNTU)", 21)
158                     .WithReservedBits(22, 9)
159                     .WithTaggedFlag("MACPFR.RA (RA)", 31)
160                 },
161                 {(long)RegistersMacAndMmc.WatchdogTimeout, new DoubleWordRegister(this)
162                     .WithTag("MACWTR.WTO (WTO)", 0, 4)
163                     .WithReservedBits(4, 4)
164                     .WithTaggedFlag("MACWTR.PWE (PWE)", 8)
165                     .WithReservedBits(9, 23)
166                 },
167                 {(long)RegistersMacAndMmc.HashTable0, new DoubleWordRegister(this)
168                     .WithTag("MACHT0R.HT31T0 (HT31T0)", 0, 32)
169                 },
170                 {(long)RegistersMacAndMmc.HashTable1, new DoubleWordRegister(this)
171                     .WithTag("MACHT1R.HT63T32 (HT63T32)", 0, 32)
172                 },
173                 {(long)RegistersMacAndMmc.VLANTag, new DoubleWordRegister(this)
174                     .WithTag("MACVTR.VL (VL)", 0, 16)
175                     .WithTaggedFlag("MACVTR.ETV (ETV)", 16)
176                     .WithTaggedFlag("MACVTR.VTIM (VTIM)", 17)
177                     .WithTaggedFlag("MACVTR.ESVL (ESVL)", 18)
178                     .WithTaggedFlag("MACVTR.ERSVLM (ERSVLM)", 19)
179                     .WithTaggedFlag("MACVTR.DOVLTC (DOVLTC)", 20)
180                     .WithTag("MACVTR.EVLS (EVLS)", 21, 2)
181                     .WithReservedBits(23, 1)
182                     .WithTaggedFlag("MACVTR.EVLRXS (EVLRXS)", 24)
183                     .WithTaggedFlag("MACVTR.VTHM (VTHM)", 25)
184                     .WithTaggedFlag("MACVTR.EDVLP (EDVLP)", 26)
185                     .WithTaggedFlag("MACVTR.ERIVLT (ERIVLT)", 27)
186                     .WithTag("MACVTR.EIVLS (EIVLS)", 28, 2)
187                     .WithReservedBits(30, 1)
188                     .WithTaggedFlag("MACVTR.EIVLRXS (EIVLRXS)", 31)
189                 },
190                 {(long)RegistersMacAndMmc.VLANHashTable, new DoubleWordRegister(this)
191                     .WithTag("MACVHTR.VLHT (VLHT)", 0, 16)
192                     .WithReservedBits(16, 16)
193                 },
194                 {(long)RegistersMacAndMmc.VLANInclusion, new DoubleWordRegister(this)
195                     .WithTag("MACVIR.VLT (VLT)", 0, 16)
196                     .WithTag("MACVIR.VLC (VLC)", 16, 2)
197                     .WithTaggedFlag("MACVIR.VLP (VLP)", 18)
198                     .WithTaggedFlag("MACVIR.CSVL (CSVL)", 19)
199                     .WithTaggedFlag("MACVIR.VLTI (VLTI)", 20)
200                     .WithReservedBits(21, 11)
201                 },
202                 {(long)RegistersMacAndMmc.InnerVLANInclusion, new DoubleWordRegister(this)
203                     .WithTag("MACIVIR.VLT (VLT)", 0, 16)
204                     .WithTag("MACIVIR.VLC (VLC)", 16, 2)
205                     .WithTaggedFlag("MACIVIR.VLP (VLP)", 18)
206                     .WithTaggedFlag("MACIVIR.CSVL (CSVL)", 19)
207                     .WithTaggedFlag("MACIVIR.VLTI (VLTI)", 20)
208                     .WithReservedBits(21, 11)
209                 },
210                 {(long)RegistersMacAndMmc.TxQueueFlowControl, new DoubleWordRegister(this)
211                     .WithTaggedFlag("MACQTxFCR.FCB_BPA (FCB_BPA)", 0)
212                     .WithTaggedFlag("MACQTxFCR.TFE (TFE)", 1)
213                     .WithReservedBits(2, 2)
214                     .WithTag("MACQTxFCR.PLT (PLT)", 4, 3)
215                     .WithTaggedFlag("MACQTxFCR.DZPQ (DZPQ)", 7)
216                     .WithReservedBits(8, 8)
217                     .WithTag("MACQTxFCR.PT (PT)", 16, 16)
218                 },
219                 {(long)RegistersMacAndMmc.RxFlowControl, new DoubleWordRegister(this)
220                     .WithTaggedFlag("MACRxFCR.RFE (RFE)", 0)
221                     .WithTaggedFlag("MACRxFCR.UP (UP)", 1)
222                     .WithReservedBits(2, 30)
223                 },
224                 {(long)RegistersMacAndMmc.InterruptStatus, new DoubleWordRegister(this)
225                     .WithReservedBits(0, 3)
226                     .WithTaggedFlag("MACISR.PHYIS (PHYIS)", 3)
227                     .WithFlag(4, out ptpMessageTypeInterrupt, FieldMode.Read, name: "MACISR.PMTIS (PMTIS)")
228                     .WithFlag(5, out lowPowerIdleInterrupt, FieldMode.Read, name: "MACISR.LPIIS (LPIIS)")
229                     .WithReservedBits(6, 2)
230                     .WithTaggedFlag("MACISR.MMCIS (MMCIS)", 8)
231                     .WithFlag(9, FieldMode.Read, valueProviderCallback: _ => MMCRxInterruptStatus, name: "MACISR.MMCRXIS (MMCRXIS)")
232                     .WithFlag(10, FieldMode.Read, valueProviderCallback: _ => MMCTxInterruptStatus, name: "MACISR.MMCTXIS (MMCTXIS)")
233                     .WithReservedBits(11, 1)
234                     .WithFlag(12, out timestampInterrupt, FieldMode.ReadToClear, name: "MACISR.TSIS (TSIS)")
235                     .WithTaggedFlag("MACISR.TXSTSIS (TXSTSIS)", 13)
236                     .WithTaggedFlag("MACISR.RXSTSIS (RXSTSIS)", 14)
237                     .WithReservedBits(15, 17)
238                     .WithChangeCallback((_, __) => UpdateInterrupts())
239                 },
240                 {(long)RegistersMacAndMmc.InterruptEnable, new DoubleWordRegister(this)
241                     .WithReservedBits(0, 3)
242                     .WithTaggedFlag("MACIER.PHYIE (PHYIE)", 3)
243                     .WithFlag(4, out ptpMessageTypeInterruptEnable, name: "MACIER.PMTIE (PMTIE)")
244                     .WithFlag(5, out lowPowerIdleInterruptEnable, name: "MACIER.LPIIE (LPIIE)")
245                     .WithReservedBits(6, 6)
246                     .WithFlag(12, out timestampInterruptEnable, name: "MACIER.TSIE (TSIE)")
247                     .WithTaggedFlag("MACIER.TXSTSIE (TXSTSIE)", 13)
248                     .WithTaggedFlag("MACIER.RXSTSIE (RXSTSIE)", 14)
249                     .WithReservedBits(15, 17)
250                     .WithChangeCallback((_, __) => UpdateInterrupts())
251                 },
252                 {(long)RegistersMacAndMmc.RxTxStatus, new DoubleWordRegister(this)
253                     .WithTaggedFlag("MACRxTxSR.TJT (TJT)", 0)
254                     .WithTaggedFlag("MACRxTxSR.NCARR (NCARR)", 1)
255                     .WithTaggedFlag("MACRxTxSR.LCARR (LCARR)", 2)
256                     .WithTaggedFlag("MACRxTxSR.EXDEF (EXDEF)", 3)
257                     .WithTaggedFlag("MACRxTxSR.LCOL (LCOL)", 4)
258                     .WithTaggedFlag("MACRxTxSR.EXCOL (LCOL)", 5)
259                     .WithReservedBits(6, 2)
260                     .WithTaggedFlag("MACRxTxSR.RWT (RWT)", 8)
261                     .WithReservedBits(9, 23)
262                 },
263                 {(long)RegistersMacAndMmc.PMTControlStatus, new DoubleWordRegister(this)
264                     .WithTaggedFlag("MACPCSR.PWRDWN (PWRDWN)", 0)
265                     .WithTaggedFlag("MACPCSR.MGKPKTEN (MGKPKTEN)", 1)
266                     .WithTaggedFlag("MACPCSR.RWKPKTEN (RWKPKTEN)", 2)
267                     .WithReservedBits(3, 2)
268                     .WithTaggedFlag("MACPCSR.MGKPRCVD (MGKPRCVD)", 5)
269                     .WithTaggedFlag("MACPCSR.RWKPRCVD (RWKPRCVD)", 6)
270                     .WithReservedBits(7, 2)
271                     .WithTaggedFlag("MACPCSR.GLBLUCAST (GLBLUCAST)", 9)
272                     .WithTaggedFlag("MACPCSR.RWKPFE (RWKPFE)", 10)
273                     .WithReservedBits(11, 13)
274                     .WithTag("MACPCSR.RWKPTR (RWKPTR)", 24, 5)
275                     .WithReservedBits(29, 2)
276                     .WithTaggedFlag("MACPCSR.RWKFILTRST (RWKFILTRST)", 31)
277                 },
278                 {(long)RegistersMacAndMmc.RemoteWakeUpPacketFilter, new DoubleWordRegister(this)
279                     .WithTag("MACRWKPFR.MACRWKPFR (MACRWKPFR)", 0, 32)
280                 },
281                 {(long)RegistersMacAndMmc.LPIControlAndStatus, new DoubleWordRegister(this)
282                     .WithTaggedFlag("MACLCSR.TLPIEN (TLPIEN)", 0)
283                     .WithTaggedFlag("MACLCSR.TLPIEX (TLPIEX)", 1)
284                     .WithTaggedFlag("MACLCSR.RLPIEN (RLPIEN)", 2)
285                     .WithTaggedFlag("MACLCSR.RLPIEX (RLPIEX)", 3)
286                     .WithReservedBits(4, 4)
287                     .WithTaggedFlag("MACLCSR.TLPIST (TLPIST)", 8)
288                     .WithTaggedFlag("MACLCSR.RLPIST (RLPIST)", 9)
289                     .WithReservedBits(10, 6)
290                     .WithTaggedFlag("MACLCSR.LPIEN (LPIEN)", 16)
291                     .WithTaggedFlag("MACLCSR.PLS (PLS)", 17)
292                     .WithTaggedFlag("MACLCSR.PLSEN (PLSEN)", 18)
293                     .WithTaggedFlag("MACLCSR.LPITXA (LPITXA)", 19)
294                     .WithTaggedFlag("MACLCSR.LPITE (LPITE)", 20)
295                     .WithReservedBits(21, 11)
296                 },
297                 {(long)RegistersMacAndMmc.LPITimersControl, new DoubleWordRegister(this, 0x3E80000)
298                     .WithTag("MACLTCR.TWT (TWT)", 0, 16)
299                     .WithTag("MACLTCR.LST (LST)", 16, 10)
300                     .WithReservedBits(26, 6)
301                 },
302                 {(long)RegistersMacAndMmc.LPIEntryTimer, new DoubleWordRegister(this)
303                     .WithTag("MACLETR.LPIET (LPIET)", 0, 17)
304                     .WithReservedBits(17, 15)
305                 },
306                 {(long)RegistersMacAndMmc.OneMicrosecondTickCounter, new DoubleWordRegister(this)
307                     .WithTag("MAC1USTCR.TIC_1US_CNTR (TIC_1US_CNTR)", 0, 12)
308                     .WithReservedBits(12, 20)
309                 },
310                 {(long)RegistersMacAndMmc.Version, new DoubleWordRegister(this, 0x3142)
311                     .WithTag("MACVR.SNPSVER (SNPSVER)", 0, 8)
312                     .WithTag("MACVR.USERVER (USERVER)", 8, 8)
313                     .WithReservedBits(16, 16)
314                 },
315                 {(long)RegistersMacAndMmc.Debug, new DoubleWordRegister(this)
316                     .WithTaggedFlag("MACDR.RPESTS (RPESTS)", 0)
317                     .WithTag("MACDR.RFCFCSTS (RFCFCSTS)", 1, 2)
318                     .WithReservedBits(3, 13)
319                     .WithTaggedFlag("MACDR.TPESTS (TPESTS)", 16)
320                     .WithTag("MACDR.TFCSTS (TFCSTS)", 17, 2)
321                     .WithReservedBits(19, 13)
322                 },
323                 {(long)RegistersMacAndMmc.HardwareFeature0, new DoubleWordRegister(this, 0x0A0D_73F7)
324                     .WithTaggedFlag("MIISEL", 0)
325                     .WithTaggedFlag("GMIISEL", 1)
326                     .WithTaggedFlag("HDSEL", 2)
327                     .WithTaggedFlag("PCSSEL", 3)
328                     .WithTaggedFlag("VLHASH", 4)
329                     .WithTaggedFlag("SMASEL", 5)
330                     .WithTaggedFlag("RWKSEL", 6)
331                     .WithTaggedFlag("MGKSEL", 7)
332                     .WithTaggedFlag("MMCSEL", 8)
333                     .WithTaggedFlag("ARPOFFSEL", 9)
334                     .WithReservedBits(10, 2)
335                     .WithTaggedFlag("TSSEL", 12)
336                     .WithTaggedFlag("EEESEL", 13)
337                     .WithTaggedFlag("TXCOESEL", 14)
338                     .WithReservedBits(15, 1)
339                     .WithTaggedFlag("RXCOESEL", 16)
340                     .WithReservedBits(17, 1)
341                     .WithTag("ADDMACADRSEL", 18, 5)
342                     .WithTaggedFlag("MACADR32SEL", 23)
343                     .WithTaggedFlag("MACADR64SEL", 24)
344                     .WithTag("TSSTSSEL", 25, 2)
345                     .WithTaggedFlag("SAVLANINS", 27)
346                     .WithTag("ACTPHYSEL", 28, 3)
347                     .WithReservedBits(31, 1)
348                 },
349                 {(long)RegistersMacAndMmc.HardwareFeature1, new DoubleWordRegister(this, 0x1104_1904)
350                     .WithTag("MACHWF1R.RXFIFOSIZE (RXFIFOSIZE)", 0, 5)
351                     .WithReservedBits(5, 1)
352                     .WithTag("MACHWF1R.TXFIFOSIZE (TXFIFOSIZE)", 6, 5)
353                     .WithTaggedFlag("MACHWF1R.OSTEN (OSTEN)", 11)
354                     .WithTaggedFlag("MACHWF1R.PTOEN (PTOEN)", 12)
355                     .WithTaggedFlag("MACHWF1R.ADVTHWORD (ADVTHWORD)", 13)
356                     .WithTag("MACHWF1R.ADDR64 (ADDR64)", 14, 2)
357                     .WithTaggedFlag("MACHWF1R.DCBEN (DCBEN)", 16)
358                     .WithTaggedFlag("MACHWF1R.SPHEN (SPHEN)", 17)
359                     .WithTaggedFlag("MACHWF1R.TSOEN (TSOEN)", 18)
360                     .WithTaggedFlag("MACHWF1R.DBGMEMA (DBGMEMA)", 19)
361                     .WithTaggedFlag("MACHWF1R.AVSEL (AVSEL)", 20)
362                     .WithReservedBits(21, 3)
363                     .WithTag("MACHWF1R.HASHTBLSZ (HASHTBLSZ)", 24, 2)
364                     .WithReservedBits(26, 1)
365                     .WithTag("MACHWF1R.L3L4FNUM (L3L4FNUM)", 27, 4)
366                     .WithReservedBits(31, 1)
367                 },
368                 {(long)RegistersMacAndMmc.HardwareFeature2, new DoubleWordRegister(this, 0x4100_0000)
369                     .WithTag("MACHWF2R.RXQCNT (RXQCNT)", 0, 4)
370                     .WithReservedBits(4, 2)
371                     .WithTag("MACHWF2R.TXQCNT (TXQCNT)", 6, 4)
372                     .WithReservedBits(10, 2)
373                     .WithTag("MACHWF2R.RXCHCNT (RXCHCNT)", 12, 4)
374                     .WithReservedBits(16, 2)
375                     .WithTag("MACHWF2R.TXCHCNT (TXCHCNT)", 18, 4)
376                     .WithReservedBits(22, 2)
377                     .WithTag("MACHWF2R.PPSOUTNUM (PPSOUTNUM)", 24, 3)
378                     .WithReservedBits(27, 1)
379                     .WithTag("MACHWF2R.AUXSNAPNUM (AUXSNAPNUM)", 28, 3)
380                     .WithReservedBits(31, 1)
381                 },
382                 {(long)RegistersMacAndMmc.HardwareFeature3, new DoubleWordRegister(this, 0x20)
383                     .WithTag("NRVF", 0, 3)
384                     .WithReservedBits(3, 1)
385                     .WithTaggedFlag("CBTISEL", 4)
386                     .WithTaggedFlag("DVLAN", 5)
387                     .WithReservedBits(6, 26)
388                 },
389                 {(long)RegistersMacAndMmc.MDIOAddress, new DoubleWordRegister(this)
390                     .WithFlag(0, out miiBusy, name: "MACMDIOAR.MB (MB)")
391                     .WithFlag(1, out clause45PhyEnable, name: "MACMDIOAR.C45E (C45E)")
392                     .WithEnumField<DoubleWordRegister, MIIOperation>(2, 2, out miiOperation, name: "MACMDIOAR.GOC (GOC)")
393                     .WithTaggedFlag("MACMDIOAR.SKAP (SKAP)", 4)
394                     .WithReservedBits(5, 3)
395                     .WithValueField(8, 4, changeCallback: (_, value) => { if(value >= 0b0110 && value <= 0b0111) this.Log(LogLevel.Warning, "Reserved CSR Clock Range (0x{0:X}).", value); }, name: "MACMDIOAR.CR (CR)")
396                     .WithTag("MACMDIOAR.NTC (NTC)", 12, 3)
397                     .WithReservedBits(15, 1)
398                     .WithValueField(16, 5, out miiRegisterOrDeviceAddress, name: "MACMDIOAR.RDA (RDA)")
399                     .WithValueField(21, 5, out miiPhy, name: "MACMDIOAR.PA (PA)")
400                     .WithTaggedFlag("MACMDIOAR.BTB (BTB)", 26)
401                     .WithTaggedFlag("MACMDIOAR.PSE (PSE)", 27)
402                     .WithReservedBits(28, 4)
403                     .WithWriteCallback((_, __) => ExecuteMIIOperation())
404                 },
405                 {(long)RegistersMacAndMmc.MDIOData, new DoubleWordRegister(this)
406                     .WithValueField(0, 16, out miiData, name: "MACMDIODR.MD (MD)")
407                     .WithValueField(16, 16, out miiAddress, name: "MACMDIODR.RA (RA)")
408                 },
409                 {(long)RegistersMacAndMmc.ARPAddress, new DoubleWordRegister(this)
410                     .WithTag("MACARPAR.ARPPA (ARPPA)", 0, 32)
411                 },
412                 {(long)RegistersMacAndMmc.CSRSoftwareControl, new DoubleWordRegister(this)
413                     .WithTaggedFlag("RCW", 0)
414                     .WithReservedBits(1, 7)
415                     .WithTaggedFlag("SEEN", 8)
416                     .WithReservedBits(9, 23)
417                 },
418                 {(long)RegistersMacAndMmc.MACAddress0High, new DoubleWordRegister(this, 0x8000FFFF)
419                     .WithValueField(0, 8, name: "MACA0HR.ADDRHI (ADDRHI) [MAC.E]",
420                         valueProviderCallback: _ => MAC.E,
421                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(e: (byte)value))
422                     .WithValueField(8, 8, name: "MACA0HR.ADDRHI (ADDRHI) [MAC.F]",
423                         valueProviderCallback: _ => MAC.F,
424                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(f: (byte)value))
425                     .If(dmaChannels.Length > 1)
426                         .Then(r => r
427                             .WithValueField(16, dmaChannels.Length, out dmaChannelSelect, name: "MACA0HR.DCS (DCS)")
428                             .WithReservedBits(16 + dmaChannels.Length, 15 - dmaChannels.Length))
429                         .Else(r => r.WithReservedBits(16, 15))
430                     .WithFlag(31, FieldMode.Read, name: "MACA0HR.AE (AE)",
431                         valueProviderCallback: _ => true)
432                 },
433                 {(long)RegistersMacAndMmc.MACAddress0Low, new DoubleWordRegister(this, 0xFFFFFFFF)
434                     .WithValueField(0, 8, name: "MACA0LR.ADDRLO (ADDRLO) [MAC.A]",
435                         valueProviderCallback: _ => MAC.A,
436                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(a: (byte)value))
437                     .WithValueField(8, 8, name: "MACA0LR.ADDRLO (ADDRLO) [MAC.B]",
438                         valueProviderCallback: _ => MAC.B,
439                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(b: (byte)value))
440                     .WithValueField(16, 8, name: "MACA0LR.ADDRLO (ADDRLO) [MAC.C]",
441                         valueProviderCallback: _ => MAC.C,
442                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(c: (byte)value))
443                     .WithValueField(24, 8, name: "MACA0LR.ADDRLO (ADDRLO) [MAC.D]",
444                         valueProviderCallback: _ => MAC.D,
445                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(d: (byte)value))
446                 },
447                 {(long)RegistersMacAndMmc.MACAddress1High, new DoubleWordRegister(this, 0xFFFF)
448                     .WithValueField(0, 8, name: "MACA1HR.ADDRHI (ADDRHI) [MAC1.E]",
449                         valueProviderCallback: _ => MAC1.E,
450                         writeCallback: (_, value) => MAC1 = MAC1.WithNewOctets(e: (byte)value))
451                     .WithValueField(8, 8, name: "MACA1HR.ADDRHI (ADDRHI) [MAC1.F]",
452                         valueProviderCallback: _ => MAC1.F,
453                         writeCallback: (_, value) => MAC1 = MAC1.WithNewOctets(f: (byte)value))
454                     .WithReservedBits(16, 8)
455                     .WithTag("MACA1HR.MBC (MBC)", 24, 6)
456                     .WithTaggedFlag("MACA1HR.SA (SA)", 30)
457                     .WithTaggedFlag("MACA1HR.AE (AE)", 31)
458                 },
459                 {(long)RegistersMacAndMmc.MACAddress1Low, new DoubleWordRegister(this, 0xFFFFFFFF)
460                     .WithValueField(0, 8, name: "MACA1LR.ADDRLO (ADDRLO) [MAC.A]",
461                         valueProviderCallback: _ => MAC1.A,
462                         writeCallback: (_, value) => MAC1 = MAC1.WithNewOctets(a: (byte)value))
463                     .WithValueField(8, 8, name: "MACA1LR.ADDRLO (ADDRLO) [MAC1.B]",
464                         valueProviderCallback: _ => MAC1.B,
465                         writeCallback: (_, value) => MAC = MAC.WithNewOctets(b: (byte)value))
466                     .WithValueField(16, 8, name: "MACA1LR.ADDRLO (ADDRLO) [MAC1.C]",
467                         valueProviderCallback: _ => MAC1.C,
468                         writeCallback: (_, value) => MAC1 = MAC1.WithNewOctets(c: (byte)value))
469                     .WithValueField(24, 8, name: "MACA1LR.ADDRLO (ADDRLO) [MAC1.D]",
470                         valueProviderCallback: _ => MAC1.D,
471                         writeCallback: (_, value) => MAC1 = MAC1.WithNewOctets(d: (byte)value))
472                 },
473                 {(long)RegistersMacAndMmc.MACAddress2High, new DoubleWordRegister(this, 0xFFFF)
474                     .WithTag("MACA2HR.ADDRHI (ADDRHI)", 0, 16)
475                     .WithReservedBits(16, 8)
476                     .WithTag("MACA2HR.MBC (MBC)", 24, 6)
477                     .WithTaggedFlag("MACA2HR.SA (SA)", 30)
478                     .WithTaggedFlag("MACA2HR.AE (AE)", 31)
479                 },
480                 {(long)RegistersMacAndMmc.MACAddress2Low, new DoubleWordRegister(this, 0xFFFFFFFF)
481                     .WithTag("MACA2LR.ADDRLO (ADDRLO)", 0, 32)
482                 },
483                 {(long)RegistersMacAndMmc.MACAddress3High, new DoubleWordRegister(this, 0xFFFF)
484                     .WithTag("MACA3HR.ADDRHI (ADDRHI)", 0, 16)
485                     .WithReservedBits(16, 8)
486                     .WithTag("MACA3HR.MBC (MBC)", 24, 6)
487                     .WithTaggedFlag("MACA3HR.SA (SA)", 30)
488                     .WithTaggedFlag("MACA3HR.AE (AE)", 31)
489                 },
490                 {(long)RegistersMacAndMmc.MACAddress3Low, new DoubleWordRegister(this, 0xFFFFFFFF)
491                     .WithTag("MACA3LR.ADDRLO (ADDRLO)", 0, 32)
492                 },
493                 {(long)RegistersMacAndMmc.MMCControl, new DoubleWordRegister(this)
494                     .WithTaggedFlag("MMC_CONTROL.CNTRST (CNTRST)", 0)
495                     .WithTaggedFlag("MMC_CONTROL.CNTSTOPRO (CNTSTOPRO)", 1)
496                     .WithTaggedFlag("MMC_CONTROL.RSTONRD (RSTONRD)", 2)
497                     .WithTaggedFlag("MMC_CONTROL.CNTFREEZ (CNTFREEZ)", 3)
498                     .WithTaggedFlag("MMC_CONTROL.CNTPRST (CNTPRST)", 4)
499                     .WithTaggedFlag("MMC_CONTROL.CNTPRSTLVL (CNTPRSTLVL)", 5)
500                     .WithReservedBits(6, 2)
501                     .WithTaggedFlag("MMC_CONTROL.UCDBC (UCDBC)", 8)
502                     .WithReservedBits(9, 23)
503                 },
504                 {(long)RegistersMacAndMmc.MMCRxInterrupt, new DoubleWordRegister(this)
505                     .WithFlag(0, out rxPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXGBPKTIS (MMC Receive Good Bad Packet Counter Interrupt Status)")
506                     .WithFlag(1, out rxByteCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXGBOCTIS (MMC Receive Good Bad Octet Counter Interrupt Status)")
507                     .WithFlag(2, out rxGoodByteCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXGOCTIS (MMC Receive Good Octet Counter Interrupt Status)")
508                     .WithFlag(3, out rxBroadcastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXBCGPIS (MMC Receive Broadcast Good Packet Counter Interrupt Status)")
509                     .WithFlag(4, out rxMulticastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXMCGPIS (MMC Receive Multicast Good Packet Counter Interrupt Status)")
510                     .WithFlag(5, out rxCrcErrorPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXCRCERPIS (MMC Receive CRC Error Packet Counter Interrupt Status)")
511                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXALGNERPIS (MMC Receive Alignment Error Packet Counter Interrupt Status)", 6)
512                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXRUNTPIS (MMC Receive Runt Packet Counter Interrupt Status)", 7)
513                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXJABERPIS (MMC Receive Jabber Error Packet Counter Interrupt Status)", 8)
514                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXUSIZEGPIS (MMC Receive Undersize Good Packet Counter Interrupt Status)", 9)
515                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXOSIZEGPIS (MMC Receive Oversize Good Packet Counter Interrupt Status)", 10)
516                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX64OCTGBPIS (MMC Receive 64 Octet Good Bad Packet Counter Interrupt Status)", 11)
517                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX65T127OCTGBPIS (MMC Receive Broadcast Good Bad Packet Counter Interrupt Status)", 12)
518                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX128T255OCTGBPIS (MMC Receive 128 to 255 Octet Good Bad Packet Counter Interrupt Status)", 13)
519                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX256T511OCTGBPIS (MMC Receive 256 to 511 Octet Good Bad Packet Counter Interrupt Status)", 14)
520                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX512T1023OCTGBPIS (MMC Receive 512 to 1023 Octet Good Bad Packet Counter Interrupt Status)", 15)
521                     .WithTaggedFlag("MMC_RX_INTERRUPT.RX1024TMAXOCTGBPIS (MMC Receive 1024 to Maximum Octet Good Bad Packet Counter Interrupt Status)", 16)
522                     .WithFlag(17, out rxUnicastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXUCGPIS (MMC Receive Unicast Good Packet Counter Interrupt Status)")
523                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXLENERPIS (MMC Receive Length Error Packet Counter Interrupt Status)", 18)
524                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXORANGEPIS (MMC Receive Out Of Range Error Packet Counter Interrupt Status)", 19)
525                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXPAUSPIS (MMC Receive Pause Packet Counter Interrupt Status)", 20)
526                     .WithFlag(21, out rxFifoPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_RX_INTERRUPT.RXFOVPIS (MMC Receive FIFO Overflow Packet Counter Interrupt Status)")
527                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXVLANGBPIS (MMC Receive VLAN Good Bad Packet Counter Interrupt Status)", 22)
528                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXWDOGPIS (MMC Receive Watchdog Error Packet Counter Interrupt Status)", 23)
529                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXRCVERRPIS (MMC Receive Error Packet Counter Interrupt Status)", 24)
530                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXCTRLPIS (MMC Receive Control Packet Counter Interrupt Status)", 25)
531                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXLPIUSCIS (MMC Receive LPI Microsecond Counter Interrupt Status)", 26)
532                     .WithTaggedFlag("MMC_RX_INTERRUPT.RXLPITRCIS (MMC Receive LPI Transition Counter Interrupt Status)", 27)
533                     .WithReservedBits(28, 4)
534                     .WithChangeCallback((_, __) => UpdateInterrupts())
535                 },
536                 {(long)RegistersMacAndMmc.MMCTxInterrupt, new DoubleWordRegister(this)
537                     .WithFlag(0, out txByteCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXGBOCTIS (MMC Transmit Good Bad Octet Counter Interrupt Status)")
538                     .WithFlag(1, out txPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXGBPKTIS (MMC Transmit Good Bad Packet Counter Interrupt Status)")
539                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXBCGPIS (MMC Transmit Broadcast Good Packet Counter Interrupt Status)", 2)
540                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXMCGPIS (MMC Transmit Multicast Good Packet Counter Interrupt Status)", 3)
541                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX64OCTGBPIS (MMC Transmit 64 Octet Good Bad Packet Counter Interrupt Status)", 4)
542                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX65T127OCTGBPIS (MMC Transmit 65 to 127 Octet Good Bad Packet Counter Interrupt Status)", 5)
543                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX128T255OCTGBPIS (MMC Transmit 128 to 255 Octet Good Bad Packet Counter Interrupt Status)", 6)
544                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX256T511OCTGBPIS (MMC Transmit 256 to 511 Octet Good Bad Packet Counter Interrupt Status)", 7)
545                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX512T1023OCTGBPIS (MMC Transmit 512 to 1023 Octet Good Bad Packet Counter Interrupt Status)", 8)
546                     .WithTaggedFlag("MMC_TX_INTERRUPT.TX1024TMAXOCTGBPIS (MMC Transmit 1024 to Maximum Octet Good Bad Packet Counter Interrupt Status)", 9)
547                     .WithFlag(10, out txUnicastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXUCGBPIS (MMC Transmit Unicast Good Bad Packet Counter Interrupt Status)")
548                     .WithFlag(11, out txMulticastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXMCGBPIS (MMC Transmit Multicast Good Bad Packet Counter Interrupt Status)")
549                     .WithFlag(12, out txBroadcastPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXBCGBPIS (MMC Transmit Broadcast Good Bad Packet Counter Interrupt Status)")
550                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXUFLOWERPIS (MMC Transmit Underflow Error Packet Counter Interrupt Status)", 13)
551                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXSCOLGPIS (MMC Transmit Single Collision Good Packet Counter Interrupt Status)", 14)
552                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXMCOLGPIS (MMC Transmit Multiple Collision Good Packet Counter Interrupt Status)", 15)
553                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXDEFPIS (MMC Transmit Deferred Packet Counter Interrupt Status)", 16)
554                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXLATCOLPIS (MMC Transmit Late Collision Packet Counter Interrupt Status)", 17)
555                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXEXCOLPIS (MMC Transmit Excessive Collision Packet Counter Interrupt Status)", 18)
556                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXCARERPIS (MMC Transmit Carrier Error Packet Counter Interrupt Status)", 19)
557                     .WithFlag(20, out txGoodByteCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXGOCTIS (MMC Transmit Good Octet Counter Interrupt Status)")
558                     .WithFlag(21, out txGoodPacketCounterInterrupt, FieldMode.ReadToClear, name: "MMC_TX_INTERRUPT.TXGPKTIS (MMC Transmit Good Packet Counter Interrupt Status)")
559                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXEXDEFPIS (MMC Transmit Excessive Deferral Packet Counter Interrupt Status)", 22)
560                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXPAUSPIS (MMC Transmit Pause Packet Counter Interrupt Status)", 23)
561                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXVLANGPIS (MMC Transmit VLAN Good Packet Counter Interrupt Status)", 24)
562                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXOSIZEGPIS (MMC Transmit Oversize Good Packet Counter Interrupt Status)", 25)
563                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXLPIUSCIS (MMC Transmit LPI Microsecond Counter Interrupt Status)", 26)
564                     .WithTaggedFlag("MMC_TX_INTERRUPT.TXLPITRCIS (MMC Transmit LPI Transition Counter Interrupt Status)", 27)
565                     .WithReservedBits(28, 4)
566                     .WithChangeCallback((_, __) => UpdateInterrupts())
567                 },
568                 {(long)RegistersMacAndMmc.MMCRxInterruptMask, new DoubleWordRegister(this)
569                     .WithFlag(0, out rxPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXGBPKTIM (MMC Receive Good Bad Packet Counter Interrupt Mask)")
570                     .WithFlag(1, out rxByteCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXGBOCTIM (MMC Receive Good Bad Octet Counter Interrupt Mask)")
571                     .WithFlag(2, out rxGoodByteCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXGOCTIM (MMC Receive Good Octet Counter Interrupt Mask)")
572                     .WithFlag(3, out rxBroadcastPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXBCGPIM (MMC Receive Broadcast Good Packet Counter Interrupt Mask)")
573                     .WithFlag(4, out rxMulticastPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXMCGPIM (MMC Receive Multicast Good Packet Counter Interrupt Mask)")
574                     .WithFlag(5, out rxCrcErrorPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXCRCERPIM (MMC Receive CRC Error Packet Counter Interrupt Mask)")
575                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXALGNERPIM (MMC Receive Alignment Error Packet Counter Interrupt Mask)", 6)
576                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXRUNTPIM (MMC Receive Runt Packet Counter Interrupt Mask)", 7)
577                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXJABERPIM (MMC Receive Jabber Error Packet Counter Interrupt Mask)", 8)
578                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXUSIZEGPIM (MMC Receive Undersize Good Packet Counter Interrupt Mask)", 9)
579                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXOSIZEGPIM (MMC Receive Oversize Good Packet Counter Interrupt Mask)", 10)
580                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX64OCTGBPIM (MMC Receive 64 Octet Good Bad Packet Counter Interrupt Mask)", 11)
581                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX65T127OCTGBPIM (MMC Receive Broadcast Good Bad Packet Counter Interrupt Mask)", 12)
582                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX128T255OCTGBPIM (MMC Receive 128 to 255 Octet Good Bad Packet Counter Interrupt Mask)", 13)
583                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX256T511OCTGBPIM (MMC Receive 256 to 511 Octet Good Bad Packet Counter Interrupt Mask)", 14)
584                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX512T1023OCTGBPIM (MMC Receive 512 to 1023 Octet Good Bad Packet Counter Interrupt Mask)", 15)
585                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RX1024TMAXOCTGBPIM (MMC Receive 1024 to Maximum Octet Good Bad Packet Counter Interrupt Mask)", 16)
586                     .WithFlag(17, out rxUnicastPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXUCGPIM (MMC Receive Unicast Good Packet Counter Interrupt Mask)")
587                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXLENERPIM (MMC Receive Length Error Packet Counter Interrupt Mask)", 18)
588                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXORANGEPIM (MMC Receive Out Of Range Error Packet Counter Interrupt Mask)", 19)
589                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXPAUSPIM (MMC Receive Pause Packet Counter Interrupt Mask)", 20)
590                     .WithFlag(21, out rxFifoPacketCounterInterruptEnable, name: "MMC_RX_INTERRUPT_MASK.RXFOVPIM (MMC Receive FIFO Overflow Packet Counter Interrupt Mask)")
591                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXVLANGBPIM (MMC Receive VLAN Good Bad Packet Counter Interrupt Mask)", 22)
592                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXWDOGPIM (MMC Receive Watchdog Error Packet Counter Interrupt Mask)", 23)
593                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXRCVERRPIM (MMC Receive Error Packet Counter Interrupt Mask)", 24)
594                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXCTRLPIM (MMC Receive Control Packet Counter Interrupt Mask)", 25)
595                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXLPIUSCIM (MMC Receive LPI Microsecond Counter Interrupt Mask)", 26)
596                     .WithTaggedFlag("MMC_RX_INTERRUPT_MASK.RXLPITRCIM (MMC Receive LPI Transition Counter Interrupt Mask)", 27)
597                     .WithReservedBits(28, 4)
598                     .WithChangeCallback((_, __) => UpdateInterrupts())
599                 },
600                 {(long)RegistersMacAndMmc.MMCTxInterruptMask, new DoubleWordRegister(this)
601                     .WithFlag(0, out txByteCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXGBOCTIM (MMC Transmit Good Bad Octet Counter Interrupt Mask)")
602                     .WithFlag(1, out txPacketCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXGBPKTIM (MMC Transmit Good Bad Packet Counter Interrupt Mask)")
603                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXBCGPIM (MMC Transmit Broadcast Good Packet Counter Interrupt Mask)", 2)
604                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXMCGPIM (MMC Transmit Multicast Good Packet Counter Interrupt Mask)", 3)
605                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX64OCTGBPIM (MMC Transmit 64 Octet Good Bad Packet Counter Interrupt Mask)", 4)
606                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX65T127OCTGBPIM (MMC Transmit 65 to 127 Octet Good Bad Packet Counter Interrupt Mask)", 5)
607                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX128T255OCTGBPIM (MMC Transmit 128 to 255 Octet Good Bad Packet Counter Interrupt Mask)", 6)
608                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX256T511OCTGBPIM (MMC Transmit 256 to 511 Octet Good Bad Packet Counter Interrupt Mask)", 7)
609                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX512T1023OCTGBPIM (MMC Transmit 512 to 1023 Octet Good Bad Packet Counter Interrupt Mask)", 8)
610                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TX1024TMAXOCTGBPIM (MMC Transmit 1024 to Maximum Octet Good Bad Packet Counter Interrupt Mask)", 9)
611                     .WithFlag(10, out txUnicastPacketCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXUCGBPIM (MMC Transmit Unicast Good Bad Packet Counter Interrupt Mask)")
612                     .WithFlag(11, out txMulticastPacketCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXMCGBPIM (MMC Transmit Multicast Good Bad Packet Counter Interrupt Mask)")
613                     .WithFlag(12, out txBroadcastPacketCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXBCGBPIM (MMC Transmit Broadcast Good Bad Packet Counter Interrupt Mask)")
614                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXUFLOWERPIM (MMC Transmit Underflow Error Packet Counter Interrupt Mask)", 13)
615                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXSCOLGPIM (MMC Transmit Single Collision Good Packet Counter Interrupt Mask)", 14)
616                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXMCOLGPIM (MMC Transmit Multiple Collision Good Packet Counter Interrupt Mask)", 15)
617                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXDEFPIM (MMC Transmit Deferred Packet Counter Interrupt Mask)", 16)
618                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXLATCOLPIM (MMC Transmit Late Collision Packet Counter Interrupt Mask)", 17)
619                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXEXCOLPIM (MMC Transmit Excessive Collision Packet Counter Interrupt Mask)", 18)
620                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXCARERPIM (MMC Transmit Carrier Error Packet Counter Interrupt Mask)", 19)
621                     .WithFlag(20, out txGoodByteCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXGOCTIM (MMC Transmit Good Octet Counter Interrupt Mask)")
622                     .WithFlag(21, out txGoodPacketCounterInterruptEnable, name: "MMC_TX_INTERRUPT_MASK.TXGPKTIM (MMC Transmit Good Packet Counter Interrupt Mask)")
623                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXEXDEFPIM (MMC Transmit Excessive Deferral Packet Counter Interrupt Mask)", 22)
624                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXPAUSPIM (MMC Transmit Pause Packet Counter Interrupt Mask)", 23)
625                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXVLANGPIM (MMC Transmit VLAN Good Packet Counter Interrupt Mask)", 24)
626                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXOSIZEGPIM (MMC Transmit Oversize Good Packet Counter Interrupt Mask)", 25)
627                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXLPIUSCIM (MMC Transmit LPI Microsecond Counter Interrupt Mask)", 26)
628                     .WithTaggedFlag("MMC_TX_INTERRUPT_MASK.TXLPITRCIM (MMC Transmit LPI Transition Counter Interrupt Mask)", 27)
629                     .WithReservedBits(28, 4)
630                     .WithChangeCallback((_, __) => UpdateInterrupts())
631                 },
632                 {(long)RegistersMacAndMmc.TxOctetCountGoodBad, new DoubleWordRegister(this)
633                     .WithValueField(0, 32, out txByteCounter, FieldMode.Read, name: "TX_OCTET_COUNT_GOOD_BAD.TXOCTGB (TXOCTGB)")
634                 },
635                 {(long)RegistersMacAndMmc.TxPacketCountGoodBad, new DoubleWordRegister(this)
636                     .WithValueField(0, 32, out txPacketCounter, FieldMode.Read, name: "TX_PACKET_COUNT_GOOD_BAD.TXPKTGB (TXPKTGB)")
637                 },
638                 {(long)RegistersMacAndMmc.TxUnicastPacketsGoodBad, new DoubleWordRegister(this)
639                     .WithValueField(0, 32, out txUnicastPacketCounter, FieldMode.Read, name: "TX_UNICAST_PACKETS_GOOD_BAD.TXUCASTGB (TXUCASTGB)")
640                 },
641                 {(long)RegistersMacAndMmc.TxMulticastPacketsGoodBad, new DoubleWordRegister(this)
642                     .WithValueField(0, 32, out txMulticastPacketCounter, FieldMode.Read, name: "TX_MULTICAST_PACKETS_GOOD_BAD.TXMCASTGB (TXMCASTGB)")
643                 },
644                 {(long)RegistersMacAndMmc.TxBroadcastPacketsGoodBad, new DoubleWordRegister(this)
645                     .WithValueField(0, 32, out txBroadcastPacketCounter, FieldMode.Read, name: "TX_BROADCAST_PACKETS_GOOD_BAD.TXBCASTGB (TXBCASTGB)")
646                 },
647                 {(long)RegistersMacAndMmc.TxSingleCollisionGoodPackets, new DoubleWordRegister(this)
648                     // collisions are impossible
649                     .WithValueField(0, 32, FieldMode.Read, name: "TX_SINGLE_COLLISION_GOOD_PACKETS.TXSNGLCOLG (TXSNGLCOLG)")
650                 },
651                 {(long)RegistersMacAndMmc.TxMultipleCollisionGoodPackets, new DoubleWordRegister(this)
652                     // collisions are impossible
653                     .WithValueField(0, 32, FieldMode.Read, name: "TX_MULTIPLE_COLLISION_GOOD_PACKETS.TXMULTCOLG (TXMULTCOLG)")
654                 },
655                 {(long)RegistersMacAndMmc.TxOctetCountGood, new DoubleWordRegister(this)
656                     .WithValueField(0, 32, out txGoodByteCounter, FieldMode.Read, name: "TX_OCTET_COUNT_GOOD.TXOCTG (TXOCTG)")
657                 },
658                 {(long)RegistersMacAndMmc.TxPacketCountGood, new DoubleWordRegister(this)
659                     .WithValueField(0, 32, out txGoodPacketCounter, FieldMode.Read, name: "TX_PACKET_COUNT_GOOD.TXPKTG (TXPKTG)")
660                 },
661                 {(long)RegistersMacAndMmc.RxPacketsCountGoodBad, new DoubleWordRegister(this)
662                     .WithValueField(0, 32, out rxPacketCounter, FieldMode.Read, name: "RX_PACKETS_COUNT_GOOD_BAD.RXPKTGB (RXPKTGB)")
663                 },
664                 {(long)RegistersMacAndMmc.RxOctetCountGoodBad, new DoubleWordRegister(this)
665                     .WithValueField(0, 32, out rxByteCounter, FieldMode.Read, name: "RX_OCTET_COUNT_GOOD_BAD.RXOCTGB (RXOCTGB)")
666                 },
667                 {(long)RegistersMacAndMmc.RxOctetCountGood, new DoubleWordRegister(this)
668                     .WithValueField(0, 32, out rxGoodByteCounter, FieldMode.Read, name: "RX_OCTET_COUNT_GOOD.RXOCTG (RXOCTG)")
669                 },
670                 {(long)RegistersMacAndMmc.RxBroadcastPacketsGood, new DoubleWordRegister(this)
671                     .WithValueField(0, 32, out rxBroadcastPacketCounter, FieldMode.Read, name: "RX_BROADCAST_PACKETS_GOOD.RXBCASTG (RXBCASTG)")
672                 },
673                 {(long)RegistersMacAndMmc.RxMulticastPacketsGood, new DoubleWordRegister(this)
674                     .WithValueField(0, 32, out rxMulticastPacketCounter, FieldMode.Read, name: "RX_MULTICAST_PACKETS_GOOD.RXMCASTG (RXMCASTG)")
675                 },
676                 {(long)RegistersMacAndMmc.RxCRCErrorPackets, new DoubleWordRegister(this)
677                     .WithValueField(0, 32, out rxCrcErrorPacketCounter, FieldMode.Read, name: "RX_CRC_ERROR_PACKETS.RXCRCERR (RXCRCERR)")
678                 },
679                 {(long)RegistersMacAndMmc.RxAlignmentErrorPackets, new DoubleWordRegister(this)
680                     .WithTag("RX_ALIGNMENT_ERROR_PACKETS.RXALGNERR (RXALGNERR)", 0, 32)
681                 },
682                 {(long)RegistersMacAndMmc.RxUnicastPacketsGood, new DoubleWordRegister(this)
683                     .WithValueField(0, 32, out rxUnicastPacketCounter, FieldMode.Read, name: "RX_UNICAST_PACKETS_GOOD.RXUCASTG (RXUCASTG)")
684                 },
685                 {(long)RegistersMacAndMmc.RxFifoOverflowPackets, new DoubleWordRegister(this)
686                     .WithValueField(0, 32, out rxFifoPacketCounter, name: "Rx_FIFO_Overflow_Packets.RXFIFOOVFL (RXFIFOOVFL)")
687                 },
688                 {(long)RegistersMacAndMmc.TxLPIMicrodecondTimer, new DoubleWordRegister(this)
689                     .WithTag("TX_LPI_USEC_CNTR.TXLPIUSC (TXLPIUSC)", 0, 32)
690                 },
691                 {(long)RegistersMacAndMmc.TxLPITransitionCounter, new DoubleWordRegister(this)
692                     .WithTag("TX_LPI_TRAN_CNTR.TXLPITRC (TXLPITRC)", 0, 32)
693                 },
694                 {(long)RegistersMacAndMmc.RxLPIMicrosecondCounter, new DoubleWordRegister(this)
695                     .WithTag("RX_LPI_USEC_CNTR.RXLPIUSC (RXLPIUSC)", 0, 32)
696                 },
697                 {(long)RegistersMacAndMmc.RxLPITransitionCounter, new DoubleWordRegister(this)
698                     .WithTag("RX_LPI_TRAN_CNTR.RXLPITRC (RXLPITRC)", 0, 32)
699                 },
700                 {(long)RegistersMacAndMmc.MmcIpcRxInterruptMask, new DoubleWordRegister(this)
701                     .WithFlag(0, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV4Good], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4GPIM (RXIPV4GPIM)")
702                     .WithFlag(1, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV4HeaderError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4HERPIM (RXIPV4HERPIM)")
703                     .WithFlag(2, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV4NoPayload], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4NOPAYPIM (RXIPV4NOPAYPIM)")
704                     .WithFlag(3, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV4Fragmented], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4FRAGPIM (RXIPV4FRAGPIM)")
705                     .WithFlag(4, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV4UDPChecksumDisabled], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4UDSBLPIM (RXIPV4UDSBLPIM)")
706                     .WithFlag(5, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV6Good], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6GPIM (RXIPV6GPIM)")
707                     .WithFlag(6, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV6HeaderError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6HERPIM (RXIPV6HERPIM)")
708                     .WithFlag(7, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IpV6NoPayload], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6NOPAYPIM (RXIPV6NOPAYPIM)")
709                     .WithFlag(8, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.UdpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXUDPGPIM (RXUDPGPIM)")
710                     .WithFlag(9, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.UdpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXUDPERPIM (RXUDPERPIM)")
711                     .WithFlag(10, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.TcpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXTCPGPIM (RXTCPGPIM)")
712                     .WithFlag(11, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.TcpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXTCPERPIM (RXTCPERPIM)")
713                     .WithFlag(12, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IcmpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXICMPGPIM (RXICMPGPIM)")
714                     .WithFlag(13, out rxIpcPacketCounterInterruptEnable[(int)IpcCounter.IcmpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXICMPERPIM (RXICMPERPIM)")
715                     .WithReservedBits(14, 2)
716                     .WithFlag(16, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV4Good], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4GOIM (RXIPV4GOIM)")
717                     .WithFlag(17, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV4HeaderError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4HEROIM (RXIPV4HEROIM)")
718                     .WithFlag(18, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV4NoPayload], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4NOPAYOIM (RXIPV4NOPAYOIM)")
719                     .WithFlag(19, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV4Fragmented], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4FRAGOIM (RXIPV4FRAGOIM)")
720                     .WithFlag(20, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV4UDPChecksumDisabled], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV4UDSBLOIM (RXIPV4UDSBLOIM)")
721                     .WithFlag(21, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV6Good], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6GOIM (RXIPV6GOIM)")
722                     .WithFlag(22, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV6HeaderError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6HEROIM (RXIPV6HEROIM)")
723                     .WithFlag(23, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IpV6NoPayload], name: "MMC_IPC_RX_INTERRUPT_MASK.RXIPV6NOPAYOIM (RXIPV6NOPAYOIM)")
724                     .WithFlag(24, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.UdpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXUDPGOIM (RXUDPGOIM)")
725                     .WithFlag(25, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.UdpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXUDPEROIM (RXUDPEROIM)")
726                     .WithFlag(26, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.TcpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXTCPGOIM (RXTCPGOIM)")
727                     .WithFlag(27, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.TcpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXTCPEROIM (RXTCPEROIM)")
728                     .WithFlag(28, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IcmpGood], name: "MMC_IPC_RX_INTERRUPT_MASK.RXICMPGOIM (RXICMPGOIM)")
729                     .WithFlag(29, out rxIpcByteCounterInterruptEnable[(int)IpcCounter.IcmpError], name: "MMC_IPC_RX_INTERRUPT_MASK.RXICMPEROIM (RXICMPEROIM)")
730                     .WithReservedBits(30, 2)
731                 },
732                 {(long)RegistersMacAndMmc.MmcIpcRxInterrupt, new DoubleWordRegister(this)
733                     .WithFlag(0, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV4Good], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4GPIS (RXIPV4GPIS)")
734                     .WithFlag(1, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV4HeaderError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4HERPIS (RXIPV4HERPIS)")
735                     .WithFlag(2, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV4NoPayload], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4NOPAYPIS (RXIPV4NOPAYPIS)")
736                     .WithFlag(3, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV4Fragmented], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4FRAGPIS (RXIPV4FRAGPIS)")
737                     .WithFlag(4, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV4UDPChecksumDisabled], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4UDSBLPIS (RXIPV4UDSBLPIS)")
738                     .WithFlag(5, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV6Good], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6GPIS (RXIPV6GPIS)")
739                     .WithFlag(6, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV6HeaderError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6HERPIS (RXIPV6HERPIS)")
740                     .WithFlag(7, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IpV6NoPayload], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6NOPAYPIS (RXIPV6NOPAYPIS)")
741                     .WithFlag(8, out rxIpcPacketCounterInterrupt[(int)IpcCounter.UdpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXUDPGPIS (RXUDPGPIS)")
742                     .WithFlag(9, out rxIpcPacketCounterInterrupt[(int)IpcCounter.UdpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXUDPERPIS (RXUDPERPIS)")
743                     .WithFlag(10, out rxIpcPacketCounterInterrupt[(int)IpcCounter.TcpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXTCPGPIS (RXTCPGPIS)")
744                     .WithFlag(11, out rxIpcPacketCounterInterrupt[(int)IpcCounter.TcpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXTCPERPIS (RXTCPERPIS)")
745                     .WithFlag(12, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IcmpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXICMPGPIS (RXICMPGPIS)")
746                     .WithFlag(13, out rxIpcPacketCounterInterrupt[(int)IpcCounter.IcmpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXICMPERPIS (RXICMPERPIS)")
747                     .WithReservedBits(14, 2)
748                     .WithFlag(16, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV4Good], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4GOIS (RXIPV4GOIS)")
749                     .WithFlag(17, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV4HeaderError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4HEROIS (RXIPV4HEROIS)")
750                     .WithFlag(18, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV4NoPayload], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4NOPAYOIS (RXIPV4NOPAYOIS)")
751                     .WithFlag(19, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV4Fragmented], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4FRAGOIS (RXIPV4FRAGOIS)")
752                     .WithFlag(20, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV4UDPChecksumDisabled], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV4UDSBLOIS (RXIPV4UDSBLOIS)")
753                     .WithFlag(21, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV6Good], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6GOIS (RXIPV6GOIS)")
754                     .WithFlag(22, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV6HeaderError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6HEROIS (RXIPV6HEROIS)")
755                     .WithFlag(23, out rxIpcByteCounterInterrupt[(int)IpcCounter.IpV6NoPayload], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXIPV6NOPAYOIS (RXIPV6NOPAYOIS)")
756                     .WithFlag(24, out rxIpcByteCounterInterrupt[(int)IpcCounter.UdpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXUDPGOIS (RXUDPGOIS)")
757                     .WithFlag(25, out rxIpcByteCounterInterrupt[(int)IpcCounter.UdpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXUDPEROIS (RXUDPEROIS)")
758                     .WithFlag(26, out rxIpcByteCounterInterrupt[(int)IpcCounter.TcpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXTCPGOIS (RXTCPGOIS)")
759                     .WithFlag(27, out rxIpcByteCounterInterrupt[(int)IpcCounter.TcpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXTCPEROIS (RXTCPEROIS)")
760                     .WithFlag(28, out rxIpcByteCounterInterrupt[(int)IpcCounter.IcmpGood], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXICMPGOIS (RXICMPGOIS)")
761                     .WithFlag(29, out rxIpcByteCounterInterrupt[(int)IpcCounter.IcmpError], FieldMode.ReadToClear, name: "MMC_IPC_RX_INTERRUPT.RXICMPEROIS (RXICMPEROIS)")
762                     .WithReservedBits(30, 2)
763                 },
764                 {(long)RegistersMacAndMmc.RxIpv4GoodPackets, new DoubleWordRegister(this)
765                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV4Good], FieldMode.Read, name: "RXIPV4_GOOD_PACKETS.RXIPV4GDPKT (RXIPV4GDPKT)")
766                 },
767                 {(long)RegistersMacAndMmc.RxIpv4HeaderErrorPackets, new DoubleWordRegister(this)
768                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV4HeaderError], FieldMode.Read, name: "RXIPV4_HEADER_ERROR_PACKETS.RXIPV4HDRERRPKT (RXIPV4HDRERRPKT)")
769                 },
770                 {(long)RegistersMacAndMmc.RxIpv4NoPayloadPackets, new DoubleWordRegister(this)
771                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV4NoPayload], FieldMode.Read, name: "RXIPV4_NO_PAYLOAD_PACKETS.RXIPV4NOPAYPKT (RXIPV4NOPAYPKT)")
772                 },
773                 {(long)RegistersMacAndMmc.RxIpv4FragmentedPackets, new DoubleWordRegister(this)
774                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV4Fragmented], FieldMode.Read, name: "RXIPV4_FRAGMENTED_PACKETS.RXIPV4FRAGPKT (RXIPV4FRAGPKT)")
775                 },
776                 {(long)RegistersMacAndMmc.RxIpv4UdpChecksumDisabledPackets, new DoubleWordRegister(this)
777                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV4UDPChecksumDisabled], FieldMode.Read, name: "RXIPV4_UDP_CHECKSUM_DISABLED_PACKETS.RXIPV4UDSBLPKT (RXIPV4UDSBLPKT)")
778                 },
779                 {(long)RegistersMacAndMmc.RxIpv6GoodPackets, new DoubleWordRegister(this)
780                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV6Good], FieldMode.Read, name: "RXIPV6_GOOD_PACKETS.RXIPV6GDPKT (RXIPV6GDPKT)")
781                 },
782                 {(long)RegistersMacAndMmc.RxIpv6HeaderErrorPackets, new DoubleWordRegister(this)
783                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV6HeaderError], FieldMode.Read, name: "RXIPV6_HEADER_ERROR_PACKETS.RXIPV6HDRERRPKT (RXIPV6HDRERRPKT)")
784                 },
785                 {(long)RegistersMacAndMmc.RxIpv6NoPayloadPackets, new DoubleWordRegister(this)
786                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IpV6NoPayload], FieldMode.Read, name: "RXIPV6_NO_PAYLOAD_PACKETS.RXIPV6NOPAYPKT (RXIPV6NOPAYPKT)")
787                 },
788                 {(long)RegistersMacAndMmc.RxUdpGoodPackets, new DoubleWordRegister(this)
789                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.UdpGood], FieldMode.Read, name: "RXUDP_GOOD_PACKETS.RXUDPGDPKT (RXUDPGDPKT)")
790                 },
791                 {(long)RegistersMacAndMmc.RxUdpErrorPackets, new DoubleWordRegister(this)
792                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.UdpError], FieldMode.Read, name: "RXUDP_ERROR_PACKETS.RXUDPERRPKT (RXUDPERRPKT)")
793                 },
794                 {(long)RegistersMacAndMmc.RxTcpGoodPackets, new DoubleWordRegister(this)
795                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.TcpGood], FieldMode.Read, name: "RXTCP_GOOD_PACKETS.RXTCPGDPKT (RXTCPGDPKT)")
796                 },
797                 {(long)RegistersMacAndMmc.RxTcpErrorPackets, new DoubleWordRegister(this)
798                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.TcpError], FieldMode.Read, name: "RXTCP_ERROR_PACKETS.RXTCPERRPKT (RXTCPERRPKT)")
799                 },
800                 {(long)RegistersMacAndMmc.RxIcmpGoodPackets, new DoubleWordRegister(this)
801                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IcmpGood], FieldMode.Read, name: "RXICMP_GOOD_PACKETS.RXICMPGDPKT (RXICMPGDPKT)")
802                 },
803                 {(long)RegistersMacAndMmc.RxIcmpErrorPackets, new DoubleWordRegister(this)
804                     .WithValueField(0, 32, out rxIpcPacketCounter[(int)IpcCounter.IcmpError], FieldMode.Read, name: "RXICMP_ERROR_PACKETS.RXICMPERRPKT (RXICMPERRPKT)")
805                 },
806                 {(long)RegistersMacAndMmc.RxIpv4GoodOctets, new DoubleWordRegister(this)
807                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV4Good], FieldMode.Read, name: "RXIPV4_GOOD_OCTETS.RXIPV4GDOCT (RXIPV4GDOCT)")
808                 },
809                 {(long)RegistersMacAndMmc.RxIpv4HeaderErrorOctets, new DoubleWordRegister(this)
810                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV4HeaderError], FieldMode.Read, name: "RXIPV4_HEADER_ERROR_OCTETS.RXIPV4HDRERROCT (RXIPV4HDRERROCT)")
811                 },
812                 {(long)RegistersMacAndMmc.RxIpv4NoPayloadOctets, new DoubleWordRegister(this)
813                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV4NoPayload], FieldMode.Read, name: "RXIPV4_NO_PAYLOAD_OCTETS.RXIPV4NOPAYOCT (RXIPV4NOPAYOCT)")
814                 },
815                 {(long)RegistersMacAndMmc.RxIpv4FragmentedOctets, new DoubleWordRegister(this)
816                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV4Fragmented], FieldMode.Read, name: "RXIPV4_FRAGMENTED_OCTETS.RXIPV4FRAGOCT (RXIPV4FRAGOCT)")
817                 },
818                 {(long)RegistersMacAndMmc.RxIpv4UdpChecksumDisableOctets, new DoubleWordRegister(this)
819                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV4UDPChecksumDisabled], FieldMode.Read, name: "RXIPV4_UDP_CHECKSUM_DISABLE_OCTETS.RXIPV4UDSBLOCT (RXIPV4UDSBLOCT)")
820                 },
821                 {(long)RegistersMacAndMmc.RxIpv6GoodOctets, new DoubleWordRegister(this)
822                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV6Good], FieldMode.Read, name: "RXIPV6_GOOD_OCTETS.RXIPV6GDOCT (RXIPV6GDOCT)")
823                 },
824                 {(long)RegistersMacAndMmc.RxIpv6HeaderErrorOctets, new DoubleWordRegister(this)
825                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV6HeaderError], FieldMode.Read, name: "RXIPV6_HEADER_ERROR_OCTETS.RXIPV6HDRERROCT (RXIPV6HDRERROCT)")
826                 },
827                 {(long)RegistersMacAndMmc.RxIpv6NoPayloadOctets, new DoubleWordRegister(this)
828                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IpV6NoPayload], FieldMode.Read, name: "RXIPV6_NO_PAYLOAD_OCTETS.RXIPV6NOPAYOCT (RXIPV6NOPAYOCT)")
829                 },
830                 {(long)RegistersMacAndMmc.RxUdpGoodOctets, new DoubleWordRegister(this)
831                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.UdpGood], FieldMode.Read, name: "RXUDP_GOOD_OCTETS.RXUDPGDOCT (RXUDPGDOCT)")
832                 },
833                 {(long)RegistersMacAndMmc.RxUdpErrorOctets, new DoubleWordRegister(this)
834                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.UdpError], FieldMode.Read, name: "RXUDP_ERROR_OCTETS.RXUDPERROCT (RXUDPERROCT)")
835                 },
836                 {(long)RegistersMacAndMmc.RxTcpGoodOctets, new DoubleWordRegister(this)
837                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.TcpGood], FieldMode.Read, name: "RXTCP_GOOD_OCTETS.RXTCPGDOCT (RXTCPGDOCT)")
838                 },
839                 {(long)RegistersMacAndMmc.RxTcpErrorOctets, new DoubleWordRegister(this)
840                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.TcpError], FieldMode.Read, name: "RXTCP_ERROR_OCTETS.RXTCPERROCT (RXTCPERROCT)")
841                 },
842                 {(long)RegistersMacAndMmc.RxIcmpGoodOctets, new DoubleWordRegister(this)
843                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IcmpGood], FieldMode.Read, name: "RXICMP_GOOD_OCTETS.RXICMPGDOCT (RXICMPGDOCT)")
844                 },
845                 {(long)RegistersMacAndMmc.RxIcmpErrorOctets, new DoubleWordRegister(this)
846                     .WithValueField(0, 32, out rxIpcByteCounter[(int)IpcCounter.IcmpError], FieldMode.Read, name: "RXICMP_ERROR_OCTETS.RXICMPERROCT (RXICMPERROCT)")
847                 },
848                 {(long)RegistersMacAndMmc.Layer3And4Control0, new DoubleWordRegister(this)
849                     .WithTaggedFlag("MACL3L4C0R.L3PEN0 (L3PEN0)", 0)
850                     .WithReservedBits(1, 1)
851                     .WithTaggedFlag("MACL3L4C0R.L3SAM0 (L3SAM0)", 2)
852                     .WithTaggedFlag("MACL3L4C0R.L3SAIM0 (L3SAIM0)", 3)
853                     .WithTaggedFlag("MACL3L4C0R.L3DAM0 (L3DAM0)", 4)
854                     .WithTaggedFlag("MACL3L4C0R.L3DAIM0 (L3DAIM0)", 5)
855                     .WithTag("MACL3L4C0R.L3HSBM0 (L3HSBM0)", 6, 5)
856                     .WithTag("MACL3L4C0R.L3HDBM0 (L3HDBM0)", 11, 5)
857                     .WithTaggedFlag("MACL3L4C0R.L4PEN0 (L4PEN0)", 16)
858                     .WithReservedBits(17, 1)
859                     .WithTaggedFlag("MACL3L4C0R.L4SPM0 (L4SPM0)", 18)
860                     .WithTaggedFlag("MACL3L4C0R.L4SPIM0 (L4SPIM0)", 19)
861                     .WithTaggedFlag("MACL3L4C0R.L4DPM0 (L4DPM0)", 20)
862                     .WithTaggedFlag("MACL3L4C0R.L4DPIM0 (L4DPIM0)", 21)
863                     .WithReservedBits(22, 10)
864                 },
865                 {(long)RegistersMacAndMmc.Layer4AddressFilter0, new DoubleWordRegister(this)
866                     .WithTag("MACL4A0R.L4SP0 (L4SP0)", 0, 16)
867                     .WithTag("MACL4A0R.L4DP0 (L4DP0)", 16, 16)
868                 },
869                 {(long)RegistersMacAndMmc.Layer3Address0Filter0, new DoubleWordRegister(this)
870                     .WithTag("MACL3A00R.L3A00 (L3A00)", 0, 32)
871                 },
872                 {(long)RegistersMacAndMmc.Layer3Address1Filter0, new DoubleWordRegister(this)
873                     .WithTag("MACL3A10R.L3A10 (L3A10)", 0, 32)
874                 },
875                 {(long)RegistersMacAndMmc.Layer3Address2Filter0, new DoubleWordRegister(this)
876                     .WithTag("MACL3A20.L3A20 (L3A20)", 0, 32)
877                 },
878                 {(long)RegistersMacAndMmc.Layer3Address3Filter0, new DoubleWordRegister(this)
879                     .WithTag("MACL3A30.L3A30 (L3A30)", 0, 32)
880                 },
881                 {(long)RegistersMacAndMmc.Layer3And4Control1, new DoubleWordRegister(this)
882                     .WithTaggedFlag("MACL3L4C1R.L3PEN1 (L3PEN1)", 0)
883                     .WithReservedBits(1, 1)
884                     .WithTaggedFlag("MACL3L4C1R.L3SAM1 (L3SAM1)", 2)
885                     .WithTaggedFlag("MACL3L4C1R.L3SAIM1 (L3SAIM1)", 3)
886                     .WithTaggedFlag("MACL3L4C1R.L3DAM1 (L3DAM1)", 4)
887                     .WithTaggedFlag("MACL3L4C1R.L3DAIM1 (L3DAIM1)", 5)
888                     .WithTag("MACL3L4C1R.L3HSBM1 (L3HSBM1)", 6, 5)
889                     .WithTag("MACL3L4C1R.L3HDBM1 (L3HDBM1)", 11, 5)
890                     .WithTaggedFlag("MACL3L4C1R.L4PEN1 (L4PEN1)", 16)
891                     .WithReservedBits(17, 1)
892                     .WithTaggedFlag("MACL3L4C1R.L4SPM1 (L4SPM1)", 18)
893                     .WithTaggedFlag("MACL3L4C1R.L4SPIM1 (L4SPIM1)", 19)
894                     .WithTaggedFlag("MACL3L4C1R.L4DPM1 (L4DPM1)", 20)
895                     .WithTaggedFlag("MACL3L4C1R.L4DPIM1 (L4DPIM1)", 21)
896                     .WithReservedBits(22, 10)
897                 },
898                 {(long)RegistersMacAndMmc.Layer4AddressFilter1, new DoubleWordRegister(this)
899                     .WithTag("MACL4A1R.L4SP1 (L4SP1)", 0, 16)
900                     .WithTag("MACL4A1R.L4DP1 (L4DP1)", 16, 16)
901                 },
902                 {(long)RegistersMacAndMmc.Layer3Address0Filter1, new DoubleWordRegister(this)
903                     .WithTag("MACL3A01R.L3A01 (L3A01)", 0, 32)
904                 },
905                 {(long)RegistersMacAndMmc.Layer3Address1Filter1, new DoubleWordRegister(this)
906                     .WithTag("MACL3A11R.L3A11 (L3A11)", 0, 32)
907                 },
908                 {(long)RegistersMacAndMmc.Layer3Address2Filter1, new DoubleWordRegister(this)
909                     .WithTag("MACL3A21R.L3A21 (L3A21)", 0, 32)
910                 },
911                 {(long)RegistersMacAndMmc.Layer3Address3Filter1, new DoubleWordRegister(this)
912                     .WithTag("MACL3A31R.L3A31 (L3A31)", 0, 32)
913                 },
914                 {(long)RegistersMacAndMmc.TimestampControl, new DoubleWordRegister(this, 0x0200)
915                     .WithFlag(0, out enableTimestamp, name: "MACTSCR.TSENA (TSENA)")
916                     .WithTaggedFlag("MACTSCR.TSCFUPDT (TSCFUPDT)", 1)
917                     .WithTaggedFlag("MACTSCR.TSINIT (TSINIT)", 2)
918                     .WithTaggedFlag("MACTSCR.TSUPDT (TSUPDT)", 3)
919                     .WithReservedBits(4, 1)
920                     .WithTaggedFlag("MACTSCR.TSADDREG (TSADDREG)", 5)
921                     .WithReservedBits(6, 2)
922                     .WithFlag(8, out enableTimestampForAll, name: "MACTSCR.TSENALL (TSENALL)")
923                     .WithTaggedFlag("MACTSCR.TSCTRLSSR (TSCTRLSSR)", 9)
924                     .WithTaggedFlag("MACTSCR.TSVER2ENA (TSVER2ENA)", 10)
925                     .WithTaggedFlag("MACTSCR.TSIPENA (TSIPENA)", 11)
926                     .WithTaggedFlag("MACTSCR.TSIPV6ENA (TSIPV6ENA)", 12)
927                     .WithTaggedFlag("MACTSCR.TSIPV4ENA (TSIPV4ENA)", 13)
928                     .WithTaggedFlag("MACTSCR.TSEVNTENA (TSEVNTENA)", 14)
929                     .WithTaggedFlag("MACTSCR.TSMSTRENA (TSMSTRENA)", 15)
930                     .WithTag("MACTSCR.SNAPTYPSEL (SNAPTYPSEL)", 16, 2)
931                     .WithTaggedFlag("MACTSCR.TSENMACADDR (TSENMACADDR)", 18)
932                     .WithTaggedFlag("MACTSCR.CSC (CSC)", 19)
933                     .WithReservedBits(20, 4)
934                     .WithTaggedFlag("MACTSCR.TXTSSTSM (TXTSSTSM)", 24)
935                     .WithReservedBits(25, 7)
936                 },
937                 {(long)RegistersMacAndMmc.SubsecondIncrement, new DoubleWordRegister(this)
938                     .WithReservedBits(0, 8)
939                     .WithTag("MACSSIR.SNSINC (SNSINC)", 8, 8)
940                     .WithTag("MACSSIR.SSINC (SSINC)", 16, 8)
941                     .WithReservedBits(24, 8)
942                 },
943                 {(long)RegistersMacAndMmc.SystemTimeSeconds, new DoubleWordRegister(this)
944                     .WithTag("MACSTSR.TSS (TSS)", 0, 32)
945                 },
946                 {(long)RegistersMacAndMmc.SystemTimeNanoseconds, new DoubleWordRegister(this)
947                     .WithTag("MACSTNR.TSSS (TSSS)", 0, 31)
948                     .WithReservedBits(31, 1)
949                 },
950                 {(long)RegistersMacAndMmc.SystemTimeSecondsUpdate, new DoubleWordRegister(this)
951                     .WithTag("MACSTSUR.TSS (TSS)", 0, 32)
952                 },
953                 {(long)RegistersMacAndMmc.SystemTimeNanosecondsUpdate, new DoubleWordRegister(this)
954                     .WithTag("MACSTNUR.TSSS (TSSS)", 0, 31)
955                     .WithTaggedFlag("MACSTNUR.ADDSUB (ADDSUB)", 31)
956                 },
957                 {(long)RegistersMacAndMmc.TimestampAddend, new DoubleWordRegister(this)
958                     .WithTag("MACTSAR.TSAR (TSAR)", 0, 32)
959                 },
960                 {(long)RegistersMacAndMmc.TimestampStatus, new DoubleWordRegister(this)
961                     .WithTaggedFlag("MACTSSR.TSSOVF (TSSOVF)", 0)
962                     .WithTaggedFlag("MACTSSR.TSTARGT0 (TSTARGT0)", 1)
963                     .WithTaggedFlag("MACTSSR.AUXTSTRIG (AUXTSTRIG)", 2)
964                     .WithTaggedFlag("MACTSSR.TSTRGTERR0 (TSTRGTERR0)", 3)
965                     .WithReservedBits(4, 11)
966                     .WithTaggedFlag("MACTSSR.TXTSSIS (TXTSSIS)", 15)
967                     .WithTag("MACTSSR.ATSSTN (ATSSTN)", 16, 4)
968                     .WithReservedBits(20, 4)
969                     .WithTaggedFlag("MACTSSR.ATSSTM (ATSSTM)", 24)
970                     .WithTag("MACTSSR.ATSNS (ATSNS)", 25, 5)
971                     .WithReservedBits(30, 2)
972                 },
973                 {(long)RegistersMacAndMmc.TxTimestampStatusNanoseconds, new DoubleWordRegister(this)
974                     .WithTag("MACTxTSSNR.TXTSSLO (TXTSSLO)", 0, 31)
975                     .WithTaggedFlag("MACTxTSSNR.TXTSSMIS (TXTSSMIS)", 31)
976                 },
977                 {(long)RegistersMacAndMmc.TxTimestampStatusSeconds, new DoubleWordRegister(this)
978                     .WithTag("MACTxTSSSR.TXTSSHI (TXTSSHI)", 0, 32)
979                 },
980                 {(long)RegistersMacAndMmc.AuxiliaryControl, new DoubleWordRegister(this)
981                     .WithTaggedFlag("MACACR.ATSFC (ATSFC)", 0)
982                     .WithReservedBits(1, 3)
983                     .WithTaggedFlag("MACACR.ATSEN0 (ATSEN0)", 4)
984                     .WithTaggedFlag("MACACR.ATSEN1 (ATSEN1)", 5)
985                     .WithTaggedFlag("MACACR.ATSEN2 (ATSEN2)", 6)
986                     .WithTaggedFlag("MACACR.ATSEN3 (ATSEN3)", 7)
987                     .WithReservedBits(8, 24)
988                 },
989                 {(long)RegistersMacAndMmc.AuxiliaryTimestampNanoseconds, new DoubleWordRegister(this)
990                     .WithTag("MACATSNR.AUXTSLO (AUXTSLO)", 0, 31)
991                     .WithReservedBits(31, 1)
992                 },
993                 {(long)RegistersMacAndMmc.AuxiliaryTimestampSeconds, new DoubleWordRegister(this)
994                     .WithTag("MACATSSR.AUXTSHI (AUXTSHI)", 0, 32)
995                 },
996                 {(long)RegistersMacAndMmc.TimestampIngressAsymmetricCorrection, new DoubleWordRegister(this)
997                     .WithTag("MACTSIACR.OSTIAC (OSTIAC)", 0, 32)
998                 },
999                 {(long)RegistersMacAndMmc.TimestampEgressAsymmetricCorrection, new DoubleWordRegister(this)
1000                     .WithTag("MACTSEACR.OSTEAC (OSTEAC)", 0, 32)
1001                 },
1002                 {(long)RegistersMacAndMmc.TimestampIngressCorrectionNanosecond, new DoubleWordRegister(this)
1003                     .WithTag("MACTSICNR.TSIC (TSIC)", 0, 32)
1004                 },
1005                 {(long)RegistersMacAndMmc.TimestampEgressCorrectionNanosecond, new DoubleWordRegister(this)
1006                     .WithTag("MACTSECNR.TSEC (TSEC)", 0, 32)
1007                 },
1008                 {(long)RegistersMacAndMmc.PPSControl, new DoubleWordRegister(this)
1009                     .WithTag("MACPPSCR.PPSCTRL/MACPPSCR.PPSCMD (PPSCTRL/PPSCMD)", 0, 4)
1010                     .WithTaggedFlag("MACPPSCR.PPSEN0 (PPSEN0)", 4)
1011                     .WithTag("MACPPSCR.TRGTMODSEL0 (TRGTMODSEL0)", 5, 2)
1012                     .WithReservedBits(7, 25)
1013                 },
1014                 {(long)RegistersMacAndMmc.PPSTargetTimeSeconds, new DoubleWordRegister(this)
1015                     .WithTag("MACPPSTTSR.TSTRH0 (TSTRH0)", 0, 31)
1016                     .WithReservedBits(31, 1)
1017                 },
1018                 {(long)RegistersMacAndMmc.PPSTargetTimeNanoseconds, new DoubleWordRegister(this)
1019                     .WithTag("MACPPSTTNR.TTSL0 (TTSL0)", 0, 31)
1020                     .WithTaggedFlag("MACPPSTTNR.TRGTBUSY0 (TRGTBUSY0)", 31)
1021                 },
1022                 {(long)RegistersMacAndMmc.PPSInterval, new DoubleWordRegister(this)
1023                     .WithTag("MACPPSIR.PPSINT0 (PPSINT0)", 0, 32)
1024                 },
1025                 {(long)RegistersMacAndMmc.PPSWidth, new DoubleWordRegister(this)
1026                     .WithTag("MACPPSWR.PPSWIDTH0 (PPSWIDTH0)", 0, 32)
1027                 },
1028                 {(long)RegistersMacAndMmc.PTPOffloadControl, new DoubleWordRegister(this)
1029                     .WithTaggedFlag("MACPOCR.PTOEN (PTOEN)", 0)
1030                     .WithTaggedFlag("MACPOCR.ASYNCEN (ASYNCEN)", 1)
1031                     .WithTaggedFlag("MACPOCR.APDREQEN (APDREQEN)", 2)
1032                     .WithReservedBits(3, 1)
1033                     .WithTaggedFlag("MACPOCR.ASYNCTRIG (ASYNCTRIG)", 4)
1034                     .WithTaggedFlag("MACPOCR.APDREQTRIG (APDREQTRIG)", 5)
1035                     .WithTaggedFlag("MACPOCR.DRRDIS (DRRDIS)", 6)
1036                     .WithReservedBits(7, 1)
1037                     .WithTag("MACPOCR.DN (DN)", 8, 8)
1038                     .WithReservedBits(16, 16)
1039                 },
1040                 {(long)RegistersMacAndMmc.PTPSourcePortIdentity0, new DoubleWordRegister(this)
1041                     .WithTag("MACSPI0R.SPI0 (SPI0)", 0, 32)
1042                 },
1043                 {(long)RegistersMacAndMmc.PTPSourcePortIdentity1, new DoubleWordRegister(this)
1044                     .WithTag("MACSPI1R.SPI1 (SPI1)", 0, 32)
1045                 },
1046                 {(long)RegistersMacAndMmc.PTPSourcePortIdentity2, new DoubleWordRegister(this)
1047                     .WithTag("MACSPI2R.SPI2 (SPI2)", 0, 16)
1048                     .WithReservedBits(16, 16)
1049                 },
1050                 {(long)RegistersMacAndMmc.LogMessageInterval, new DoubleWordRegister(this)
1051                     .WithTag("MACLMIR.LSI (LSI)", 0, 8)
1052                     .WithTag("MACLMIR.DRSYNCR (DRSYNCR)", 8, 3)
1053                     .WithReservedBits(11, 13)
1054                     .WithTag("MACLMIR.LMPDRI (LMPDRI)", 24, 8)
1055                 }
1056             };
1057         }
1058 
CreateMTLRegisterMap()1059         private IDictionary<long, DoubleWordRegister> CreateMTLRegisterMap()
1060         {
1061             return new Dictionary<long, DoubleWordRegister>()
1062             {
1063                 {(long)RegistersMTL.OperatingMode, new DoubleWordRegister(this)
1064                     .WithReservedBits(0, 1)
1065                     .WithTaggedFlag("MTLOMR.DTXSTS (DTXSTS)", 1)
1066                     .WithReservedBits(2, 6)
1067                     .WithTaggedFlag("MTLOMR.CNTPRST (CNTPRST)", 8)
1068                     .WithTaggedFlag("MTLOMR.CNTCLR (CNTCLR)", 9)
1069                     .WithReservedBits(10, 22)
1070                 },
1071                 {(long)RegistersMTL.InterruptStatus, new DoubleWordRegister(this)
1072                     .WithTaggedFlag("MTLISR.Q0IS (Queue interrupt status)", 0)
1073                     .WithReservedBits(1, 31)
1074                     .WithChangeCallback((_, __) => UpdateInterrupts())
1075                 },
1076                 {(long)RegistersMTL.TxQueueOperating, new DoubleWordRegister(this, 0x70008)
1077                     .WithTaggedFlag("MTLTxQOMR.FTQ (Flush Transmit Queue)", 0)
1078                     .WithTaggedFlag("MTLTxQOMR.TSF (Transmit Store and Forward)", 1)
1079                     .WithTag("MTLTxQOMR.TXQEN (Transmit Queue Enable)", 2, 2)
1080                     .WithTag("MTLTxQOMR.TTC (Transmit Threshold Control)", 4, 3)
1081                     .WithReservedBits(7, 9)
1082                     .WithTag("MTLTxQOMR.TQS (Transmit Queue Size)", 16, 3)
1083                     .WithReservedBits(19, 13)
1084                 },
1085                 {(long)RegistersMTL.TxQueueUnderflow, new DoubleWordRegister(this)
1086                     .WithTag("MTLTxQUR.UFFRMCNT (Underflow Packet Counter)", 0, 11)
1087                     .WithTaggedFlag("MTLTxQUR.UFCNTOVF (UFCNTOVF)", 11)
1088                     .WithReservedBits(12, 20)
1089                 },
1090                 {(long)RegistersMTL.TxQueueDebug, new DoubleWordRegister(this)
1091                     // values are intentionally empty because we send packets immediately
1092                     .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => false, name: "MTLTxQDR.TXQPAUSED (TXQPAUSED)")
1093                     .WithEnumField<DoubleWordRegister, MTLTxQueueReadControllerStatus>(1, 2, FieldMode.Read,
1094                         valueProviderCallback: _ => MTLTxQueueReadControllerStatus.Idle, name: "MTLTxQDR.TRCSTS (TRCSTS)")
1095                     .WithFlag(3, FieldMode.Read, valueProviderCallback: _ => false, name: "MTLTxQDR.TWCSTS (TWCSTS)")
1096                     .WithFlag(4, FieldMode.Read, valueProviderCallback: _ => false, name: "MTLTxQDR.TXQSTS (TXQSTS)")
1097                     .WithFlag(5, FieldMode.Read, valueProviderCallback: _ => false, name: "MTLTxQDR.TXSTSFSTS (TXSTSFSTS)")
1098                     .WithReservedBits(6, 10)
1099                     .WithValueField(16, 3, FieldMode.Read, valueProviderCallback: _ => 0, name: "MTLTxQDR.PTXQ (PTXQ)")
1100                     .WithReservedBits(19, 1)
1101                     .WithValueField(20, 3, FieldMode.Read, valueProviderCallback: _ => 0, name: "MTLTxQDR.STXSTSF (STXSTSF)")
1102                     .WithReservedBits(23, 9)
1103                 },
1104                 {(long)RegistersMTL.QueueInterruptControlStatus, new DoubleWordRegister(this)
1105                     .WithTaggedFlag("MTLQICSR.TXUNFIS (TXUNFIS)", 0)
1106                     .WithReservedBits(1, 7)
1107                     .WithTaggedFlag("MTLQICSR.TXUIE (TXUIE)", 8)
1108                     .WithReservedBits(9, 7)
1109                     .WithTaggedFlag("MTLQICSR.RXOVFIS (RXOVFIS)", 16)
1110                     .WithReservedBits(17, 7)
1111                     .WithTaggedFlag("MTLQICSR.RXOIE (RXOIE)", 24)
1112                     .WithReservedBits(25, 7)
1113                 },
1114                 {(long)RegistersMTL.RxQueueOperatingMode, new DoubleWordRegister(this)
1115                     .WithTag("MTLRxQOMR.RTC (RTC)", 0, 2)
1116                     .WithReservedBits(2, 1)
1117                     .WithTaggedFlag("MTLRxQOMR.FUP (FUP)", 3)
1118                     .WithTaggedFlag("MTLRxQOMR.FEP (FEP)", 4)
1119                     .WithTaggedFlag("MTLRxQOMR.RSF (RSF)", 5)
1120                     .WithTaggedFlag("MTLRxQOMR.DIS_TCP_EF (DIS_TCP_EF)", 6)
1121                     .WithTaggedFlag("MTLRxQOMR.EHFC (EHFC)", 7)
1122                     .WithTag("MTLRxQOMR.RFA (RFA)", 8, 4)
1123                     .WithReservedBits(12, 2)
1124                     .WithTag("MTLRxQOMR.RFD (RFD)", 14, 4)
1125                     .WithReservedBits(18, 2)
1126                     .WithValueField(20, 5, FieldMode.Read, valueProviderCallback: _ => 0b11111, name: "MTLRxQOMR.RQS (RQS)")
1127                     .WithReservedBits(25, 7)
1128                 },
1129                 {(long)RegistersMTL.RxQueueMissedPacketAndOverflowCounter, new DoubleWordRegister(this)
1130                     .WithTag("MTLRxQMPOCR.OVFPKTCNT (OVFPKTCNT)", 0, 11)
1131                     .WithTaggedFlag("MTLRxQMPOCR.OVFCNTOVF (OVFCNTOVF)", 11)
1132                     .WithReservedBits(12, 4)
1133                     .WithTag("MTLRxQMPOCR.MISPKTCNT (MISPKTCNT)", 16, 11)
1134                     .WithTaggedFlag("MTLRxQMPOCR.MISCNTOVF (MISCNTOVF)", 27)
1135                     .WithReservedBits(28, 4)
1136                 },
1137                 {(long)RegistersMTL.RxQueueDebug, new DoubleWordRegister(this)
1138                     .WithTaggedFlag("MTLRxQDR.RWCSTS (RWCSTS)", 0)
1139                     .WithTag("MTLRxQDR.RRCSTS (RRCSTS)", 1, 2)
1140                     .WithReservedBits(3, 1)
1141                     .WithTag("MTLRxQDR.RXQSTS (RXQSTS)", 4, 2)
1142                     .WithReservedBits(6, 10)
1143                     .WithTag("MTLRxQDR.PRXQ (PRXQ)", 16, 14)
1144                     .WithReservedBits(30, 2)
1145                 }
1146             };
1147         }
1148 
CreateDMARegisterMap()1149         private IDictionary<long, DoubleWordRegister> CreateDMARegisterMap()
1150         {
1151             var map = new Dictionary<long, DoubleWordRegister>()
1152             {
1153                 {(long)RegistersDMA.DMAMode, new DoubleWordRegister(this)
1154                     .WithFlag(0, FieldMode.Read | FieldMode.Set, writeCallback: (_, value) =>
1155                     {
1156                         if(value)
1157                         {
1158                             this.Log(LogLevel.Info, "Software reset.");
1159                             Reset();
1160                         }
1161                     },
1162                     valueProviderCallback: _ => false, name: "DMAMR.SWR (Software Reset)")
1163                     .WithTaggedFlag("DMAMR.DA (DMA Tx or Rx Arbitration Scheme)", 1)
1164                     .WithReservedBits(2, 9)
1165                     .WithTaggedFlag("DMAMR.TXPR (Transmit priority)", 11)
1166                     .WithTag("DMAMR.PR (Priority ratio)", 12, 3)
1167                     .WithReservedBits(15, 1)
1168                     .WithEnumField(16, 2, out dmaInterruptMode, name: "DMAMR.INTM (Interrupt Mode)",
1169                         changeCallback: (previous, current) =>
1170                         {
1171                             if(current == DMAChannelInterruptMode.Reserved)
1172                             {
1173                                 this.Log(LogLevel.Warning, "Attempted to set DMA interrupt mode to a reserved value. Reverting back to the previous value {0}", previous);
1174                                 dmaInterruptMode.Value = previous;
1175                                 return;
1176                             }
1177 
1178                             UpdateInterrupts();
1179                         })
1180                     .WithReservedBits(18, 14)
1181                 },
1182                 {(long)RegistersDMA.SystemBusMode, new DoubleWordRegister(this)
1183                     .WithTaggedFlag("DMASBMR.FB (Fixed Burst Length)", 0)
1184                     .WithReservedBits(1, 11)
1185                     .WithFlag(12, name: "DMASBMR.AAL (Address-Aligned Beats)")
1186                     .WithReservedBits(13, 1)
1187                     .WithTaggedFlag("DMASBMR.MB (Mixed Burst)", 14)
1188                     .WithTaggedFlag("DMASBMR.RB (Rebuild INCRx Burst)", 15)
1189                     .WithReservedBits(16, 16)
1190                 },
1191                 {(long)RegistersDMA.InterruptStatus, new DoubleWordRegister(this)
1192                     .WithFlags(0, dmaChannels.Length, name: "DMAISR.DCxIS (DMA Channel Interrupt Status)",
1193                         valueProviderCallback: (i, _) => dmaChannels[i].Interrupts)
1194                     .WithReservedBits(dmaChannels.Length, 16 - dmaChannels.Length)
1195                     .WithTaggedFlag("DMAISR.MTLIS (MTL Interrupt Status)", 16)
1196                     .WithTaggedFlag("DMAISR.MACIS (MAC Interrupt Status)", 17)
1197                     .WithReservedBits(18, 14)
1198                     .WithChangeCallback((_, __) => UpdateInterrupts())
1199                 },
1200                 {(long)RegistersDMA.DebugStatus, new DoubleWordRegister(this)
1201                     .WithTaggedFlag("DMADSR.AXWHSTS (AHB Master Write Channel)", 0)
1202                     .WithReservedBits(1, 7)
1203                     .For((r, i) =>
1204                     {
1205                         var offset = i * 8;
1206                         r.WithEnumField<DoubleWordRegister, DMARxProcessState>(8 + offset, 4, FieldMode.Read,
1207                             valueProviderCallback: _ => dmaChannels[i].DmaRxState, name: $"DMADSR.RPS{i} (DMA Channel {i} Receive Process State)")
1208                         .WithEnumField<DoubleWordRegister, DMATxProcessState>(12 + offset, 4, FieldMode.Read,
1209                             valueProviderCallback: _ => dmaChannels[i].DmaTxState, name: $"DMADSR.TPS{i} (DMA Channel {i} Transmit Process State)");
1210                     }, 0, dmaChannels.Length)
1211                 },
1212             };
1213 
1214             foreach(var channel in dmaChannels)
1215             {
1216                 channel.DefineChannelRegisters(ref map);
1217             }
1218 
1219             return map;
1220         }
1221 
1222         private uint Read<T>(DoubleWordRegisterCollection registersCollection, string regionName, long offset)
1223         where T : struct, IComparable, IFormattable
1224         {
1225             var result = 0U;
1226             try
1227             {
1228                 if(registersCollection.TryRead(offset, out result))
1229                 {
1230                     return result;
1231                 }
1232             }
1233             finally
1234             {
1235                 if(PeripheralAccessLogLevel != null)
1236                 {
1237                     this.Log(PeripheralAccessLogLevel, "Read from {0} at offset 0x{1:X} ({2}), returned 0x{3:X}.", regionName, offset, Enum.Format(typeof(T), offset, "G"), result);
1238                 }
1239             }
this.LogAntmicro.Renode.Peripherals.Network.SynopsysDWCEthernetQualityOfService.IFormattable1240             this.Log(LogLevel.Warning, "Unhandled read from {0} at offset 0x{1:X} ({2}).", regionName, offset, Enum.Format(typeof(T), offset, "G"));
1241             return result;
1242         }
1243 
1244         private void Write<T>(DoubleWordRegisterCollection registersCollection, string regionName, long offset, uint value)
1245         where T : struct, IComparable, IFormattable
1246         {
1247             if(PeripheralAccessLogLevel != null)
1248             {
1249                 this.Log(PeripheralAccessLogLevel, "Write to {0} at offset 0x{1:X} ({2}), value 0x{3:X}.", regionName, offset, Enum.Format(typeof(T), offset, "G"), value);
1250             }
1251             if(!registersCollection.TryWrite(offset, value))
1252             {
1253                 this.Log(LogLevel.Warning, "Unhandled write to {0} at offset 0x{1:X} ({2}), value 0x{3:X}.", regionName, offset, Enum.Format(typeof(T), offset, "G"), value);
1254                 return;
1255             }
1256         }
1257 
ExecuteMIIOperation()1258         private void ExecuteMIIOperation()
1259         {
1260             if(!miiBusy.Value)
1261             {
1262                 return;
1263             }
1264             miiBusy.Value = false;
1265 
1266             switch(miiOperation.Value)
1267             {
1268                 case MIIOperation.Read:
1269                     if(clause45PhyEnable.Value)
1270                     {
1271                         if(!TryGetPhy<Clause45Address, ushort>((uint)miiPhy.Value, out var phy))
1272                         {
1273                             this.Log(LogLevel.Debug, "Read access to unknown phy {0} via Clause 45.", miiPhy.Value);
1274                             break;
1275                         }
1276                         var c45Address = new Clause45Address((byte)miiRegisterOrDeviceAddress.Value, (ushort)miiAddress.Value);
1277                         miiData.Value = phy.Read(c45Address);
1278                         this.Log(LogLevel.Noisy, "Read ({1}, 0x{2:X}) access to phy {0} via Clause 45.", miiPhy.Value, c45Address, miiData.Value);
1279                     }
1280                     else
1281                     {
1282                         if(!TryGetPhy<ushort>((uint)miiPhy.Value, out var phy))
1283                         {
1284                             this.Log(LogLevel.Debug, "Read access to unknown phy {0} via Clause 22.", miiPhy.Value);
1285                             break;
1286                         }
1287                         miiData.Value = phy.Read((ushort)miiRegisterOrDeviceAddress.Value);
1288                         this.Log(LogLevel.Noisy, "Read ({1}, 0x{2:X}) access to phy {0} via Clause 22.", miiPhy.Value, miiRegisterOrDeviceAddress.Value, miiData.Value);
1289                     }
1290                     break;
1291                 case MIIOperation.Write:
1292                     if(clause45PhyEnable.Value)
1293                     {
1294                         if(!TryGetPhy<Clause45Address, ushort>((uint)miiPhy.Value, out var phy))
1295                         {
1296                             this.Log(LogLevel.Debug, "Write access to unknown phy {0} via Clause 45.", miiPhy.Value);
1297                             break;
1298                         }
1299                         var c45Address = new Clause45Address((byte)miiRegisterOrDeviceAddress.Value, (ushort)miiAddress.Value);
1300                         this.Log(LogLevel.Noisy, "Write ({1}, 0x{2:X}) access to phy {0} via Clause 45.", miiPhy.Value, c45Address, miiData.Value);
1301                         phy.Write(c45Address, (ushort)miiData.Value);
1302                     }
1303                     else
1304                     {
1305                         if(!TryGetPhy<ushort>((uint)miiPhy.Value, out var phy))
1306                         {
1307                             this.Log(LogLevel.Debug, "Write access to unknown phy {0} via Clause 22.", miiPhy.Value);
1308                             break;
1309                         }
1310                         this.Log(LogLevel.Noisy, "Write ({1}, 0x{2:X}) access to phy {0} via Clause 22.", miiPhy.Value, miiRegisterOrDeviceAddress.Value, miiData.Value);
1311                         phy.Write((ushort)miiRegisterOrDeviceAddress.Value, (ushort)miiData.Value);
1312                     }
1313                     break;
1314                 case MIIOperation.PostReadAddressIncrement:
1315                     if(!clause45PhyEnable.Value)
1316                     {
1317                         this.Log(LogLevel.Warning, "Invalid MII Command: Post Read Increment Address is valid only for Clause 45 PHY.");
1318                         break;
1319                     }
1320                     this.Log(LogLevel.Warning, "Unimplemented Command: Post Read Increment Address.");
1321                     break;
1322                 default:
1323                     this.Log(LogLevel.Warning, "Invalid MII Command: Reserved Operation (0x{0:X}).", miiOperation.Value);
1324                     break;
1325             }
1326         }
1327 
1328         private IFlagRegisterField rxEnable;
1329         private IFlagRegisterField txEnable;
1330         private IFlagRegisterField loopbackEnabled;
1331         private IFlagRegisterField checksumOffloadEnable;
1332         private IFlagRegisterField crcCheckDisable;
1333         private IFlagRegisterField packetDuplicationControl;
1334         private IFlagRegisterField ptpMessageTypeInterrupt;
1335         private IFlagRegisterField lowPowerIdleInterrupt;
1336         private IFlagRegisterField timestampInterrupt;
1337         private IFlagRegisterField ptpMessageTypeInterruptEnable;
1338         private IFlagRegisterField lowPowerIdleInterruptEnable;
1339         private IFlagRegisterField timestampInterruptEnable;
1340         private IFlagRegisterField miiBusy;
1341         private IFlagRegisterField clause45PhyEnable;
1342         private IEnumRegisterField<MIIOperation> miiOperation;
1343         private IEnumRegisterField<RegisterSourceAddressOperation> sourceAddressOperation;
1344         private IValueRegisterField miiRegisterOrDeviceAddress;
1345         private IValueRegisterField miiPhy;
1346         private IValueRegisterField miiData;
1347         private IValueRegisterField miiAddress;
1348         private IValueRegisterField dmaChannelSelect;
1349         private IFlagRegisterField rxUnicastPacketCounterInterrupt;
1350         private IFlagRegisterField rxFifoPacketCounterInterrupt;
1351         private IFlagRegisterField rxCrcErrorPacketCounterInterrupt;
1352         private IFlagRegisterField rxMulticastPacketCounterInterrupt;
1353         private IFlagRegisterField rxBroadcastPacketCounterInterrupt;
1354         private IFlagRegisterField rxGoodByteCounterInterrupt;
1355         private IFlagRegisterField rxByteCounterInterrupt;
1356         private IFlagRegisterField rxPacketCounterInterrupt;
1357         private IFlagRegisterField txGoodPacketCounterInterrupt;
1358         private IFlagRegisterField txGoodByteCounterInterrupt;
1359         private IFlagRegisterField txBroadcastPacketCounterInterrupt;
1360         private IFlagRegisterField txMulticastPacketCounterInterrupt;
1361         private IFlagRegisterField txUnicastPacketCounterInterrupt;
1362         private IFlagRegisterField txPacketCounterInterrupt;
1363         private IFlagRegisterField txByteCounterInterrupt;
1364         private IFlagRegisterField rxUnicastPacketCounterInterruptEnable;
1365         private IFlagRegisterField rxFifoPacketCounterInterruptEnable;
1366         private IFlagRegisterField rxCrcErrorPacketCounterInterruptEnable;
1367         private IFlagRegisterField rxMulticastPacketCounterInterruptEnable;
1368         private IFlagRegisterField rxBroadcastPacketCounterInterruptEnable;
1369         private IFlagRegisterField rxGoodByteCounterInterruptEnable;
1370         private IFlagRegisterField rxByteCounterInterruptEnable;
1371         private IFlagRegisterField rxPacketCounterInterruptEnable;
1372         private IFlagRegisterField txGoodPacketCounterInterruptEnable;
1373         private IFlagRegisterField txGoodByteCounterInterruptEnable;
1374         private IFlagRegisterField txBroadcastPacketCounterInterruptEnable;
1375         private IFlagRegisterField txMulticastPacketCounterInterruptEnable;
1376         private IFlagRegisterField txUnicastPacketCounterInterruptEnable;
1377         private IFlagRegisterField txPacketCounterInterruptEnable;
1378         private IFlagRegisterField txByteCounterInterruptEnable;
1379         private IValueRegisterField txByteCounter;
1380         private IValueRegisterField txPacketCounter;
1381         private IValueRegisterField txUnicastPacketCounter;
1382         private IValueRegisterField txMulticastPacketCounter;
1383         private IValueRegisterField txBroadcastPacketCounter;
1384         private IValueRegisterField txGoodByteCounter;
1385         private IValueRegisterField txGoodPacketCounter;
1386         private IValueRegisterField rxPacketCounter;
1387         private IValueRegisterField rxByteCounter;
1388         private IValueRegisterField rxGoodByteCounter;
1389         private IValueRegisterField rxBroadcastPacketCounter;
1390         private IValueRegisterField rxMulticastPacketCounter;
1391         private IValueRegisterField rxCrcErrorPacketCounter;
1392         private IValueRegisterField rxUnicastPacketCounter;
1393         private IValueRegisterField rxFifoPacketCounter;
1394         private IFlagRegisterField enableTimestamp;
1395         private IFlagRegisterField enableTimestampForAll;
1396 
1397         private readonly IFlagRegisterField[] rxIpcPacketCounterInterruptEnable;
1398         private readonly IFlagRegisterField[] rxIpcByteCounterInterruptEnable;
1399         private readonly IFlagRegisterField[] rxIpcPacketCounterInterrupt;
1400         private readonly IFlagRegisterField[] rxIpcByteCounterInterrupt;
1401         private readonly IValueRegisterField[] rxIpcPacketCounter;
1402         private readonly IValueRegisterField[] rxIpcByteCounter;
1403 
1404         private readonly DoubleWordRegisterCollection macAndMmcRegisters;
1405         // MAC Transaction Layer
1406         private readonly DoubleWordRegisterCollection mtlRegisters;
1407         private readonly DoubleWordRegisterCollection dmaRegisters;
1408 
1409         private readonly int NumberOfIpcCounters = Enum.GetNames(typeof(IpcCounter)).Length;
1410 
1411         public enum RegistersMacAndMmc : long
1412         {
1413             OperatingModeConfiguration = 0x000,
1414             ExtendedOperatingModeConfiguration = 0x004,
1415             PacketFilteringControl = 0x008,
1416             WatchdogTimeout = 0x00C,
1417             HashTable0 = 0x010,
1418             HashTable1 = 0x014,
1419             VLANTag = 0x050,
1420             VLANHashTable = 0x058,
1421             VLANInclusion = 0x060,
1422             InnerVLANInclusion = 0x064,
1423             TxQueueFlowControl = 0x070,
1424             RxFlowControl = 0x090,
1425             InterruptStatus = 0x0B0,
1426             InterruptEnable = 0x0B4,
1427             RxTxStatus = 0x0B8,
1428             PMTControlStatus = 0x0C0,
1429             RemoteWakeUpPacketFilter = 0x0C4,
1430             LPIControlAndStatus = 0x0D0,
1431             LPITimersControl = 0x0D4,
1432             LPIEntryTimer = 0x0D8,
1433             OneMicrosecondTickCounter = 0x0DC,
1434             Version = 0x110,
1435             Debug = 0x114,
1436             HardwareFeature0 = 0x11C,
1437             HardwareFeature1 = 0x120,
1438             HardwareFeature2 = 0x124,
1439             HardwareFeature3 = 0x128,
1440             MDIOAddress = 0x200,
1441             MDIOData = 0x204,
1442             ARPAddress = 0x210,
1443             CSRSoftwareControl = 0x230,
1444             MACAddress0High = 0x300,
1445             MACAddress0Low = 0x304,
1446             MACAddress1Low = 0x30C,
1447             MACAddress2Low = 0x314,
1448             MACAddress1High = 0x308,
1449             MACAddress2High = 0x310,
1450             MACAddress3High = 0x318,
1451             MACAddress3Low = 0x31C,
1452             MMCControl = 0x700,
1453             MMCRxInterrupt = 0x704,
1454             MMCTxInterrupt = 0x708,
1455             MMCRxInterruptMask = 0x70C,
1456             MMCTxInterruptMask = 0x710,
1457             TxOctetCountGoodBad = 0x714,
1458             TxPacketCountGoodBad = 0x718,
1459             TxUnicastPacketsGoodBad = 0x73C,
1460             TxMulticastPacketsGoodBad = 0x740,
1461             TxBroadcastPacketsGoodBad = 0x744,
1462             TxSingleCollisionGoodPackets = 0x74C,
1463             TxMultipleCollisionGoodPackets = 0x750,
1464             TxOctetCountGood = 0x764,
1465             TxPacketCountGood = 0x768,
1466             RxPacketsCountGoodBad = 0x780,
1467             RxOctetCountGoodBad = 0x784,
1468             RxOctetCountGood = 0x788,
1469             RxBroadcastPacketsGood = 0x78C,
1470             RxMulticastPacketsGood = 0x790,
1471             RxCRCErrorPackets = 0x794,
1472             RxAlignmentErrorPackets = 0x798,
1473             RxUnicastPacketsGood = 0x7C4,
1474             RxFifoOverflowPackets = 0x7D4,
1475             TxLPIMicrodecondTimer = 0x7EC,
1476             TxLPITransitionCounter = 0x7F0,
1477             RxLPIMicrosecondCounter = 0x7F4,
1478             RxLPITransitionCounter = 0x7F8,
1479             MmcIpcRxInterruptMask = 0x800,
1480             MmcIpcRxInterrupt = 0x808,
1481             RxIpv4GoodPackets = 0x810,
1482             RxIpv4HeaderErrorPackets = 0x814,
1483             RxIpv4NoPayloadPackets = 0x818,
1484             RxIpv4FragmentedPackets = 0x81C,
1485             RxIpv4UdpChecksumDisabledPackets = 0x820,
1486             RxIpv6GoodPackets = 0x824,
1487             RxIpv6HeaderErrorPackets = 0x828,
1488             RxIpv6NoPayloadPackets = 0x82C,
1489             RxUdpGoodPackets = 0x830,
1490             RxUdpErrorPackets = 0x834,
1491             RxTcpGoodPackets = 0x838,
1492             RxTcpErrorPackets = 0x83C,
1493             RxIcmpGoodPackets = 0x840,
1494             RxIcmpErrorPackets = 0x844,
1495             RxIpv4GoodOctets = 0x850,
1496             RxIpv4HeaderErrorOctets = 0x854,
1497             RxIpv4NoPayloadOctets = 0x858,
1498             RxIpv4FragmentedOctets = 0x85C,
1499             RxIpv4UdpChecksumDisableOctets = 0x860,
1500             RxIpv6GoodOctets = 0x864,
1501             RxIpv6HeaderErrorOctets = 0x868,
1502             RxIpv6NoPayloadOctets = 0x86C,
1503             RxUdpGoodOctets = 0x870,
1504             RxUdpErrorOctets = 0x874,
1505             RxTcpGoodOctets = 0x878,
1506             RxTcpErrorOctets = 0x87C,
1507             RxIcmpGoodOctets = 0x880,
1508             RxIcmpErrorOctets = 0x884,
1509             Layer3And4Control0 = 0x900,
1510             Layer4AddressFilter0 = 0x904,
1511             Layer3Address0Filter0 = 0x910,
1512             Layer3Address1Filter0 = 0x914,
1513             Layer3Address2Filter0 = 0x918,
1514             Layer3Address3Filter0 = 0x91C,
1515             Layer3And4Control1 = 0x930,
1516             Layer4AddressFilter1 = 0x934,
1517             Layer3Address0Filter1 = 0x940,
1518             Layer3Address1Filter1 = 0x944,
1519             Layer3Address2Filter1 = 0x948,
1520             Layer3Address3Filter1 = 0x94C,
1521             TimestampControl = 0xB00,
1522             SubsecondIncrement = 0xB04,
1523             SystemTimeSeconds = 0xB08,
1524             SystemTimeNanoseconds = 0xB0C,
1525             SystemTimeSecondsUpdate = 0xB10,
1526             SystemTimeNanosecondsUpdate = 0xB14,
1527             TimestampAddend = 0xB18,
1528             TimestampStatus = 0xB20,
1529             TxTimestampStatusNanoseconds = 0xB30,
1530             TxTimestampStatusSeconds = 0xB34,
1531             AuxiliaryControl = 0xB40,
1532             AuxiliaryTimestampNanoseconds = 0xB48,
1533             AuxiliaryTimestampSeconds = 0xB4C,
1534             TimestampIngressAsymmetricCorrection = 0xB50,
1535             TimestampEgressAsymmetricCorrection = 0xB54,
1536             TimestampIngressCorrectionNanosecond = 0xB58,
1537             TimestampEgressCorrectionNanosecond = 0xB5C,
1538             PPSControl = 0xB70,
1539             PPSTargetTimeSeconds = 0xB80,
1540             PPSTargetTimeNanoseconds = 0xB84,
1541             PPSInterval = 0xB88,
1542             PPSWidth = 0xB8C,
1543             PTPOffloadControl = 0xBC0,
1544             PTPSourcePortIdentity0 = 0xBC4,
1545             PTPSourcePortIdentity1 = 0xBC8,
1546             PTPSourcePortIdentity2 = 0xBCC,
1547             LogMessageInterval = 0xBD0,
1548         }
1549 
1550         public enum RegistersMTL : long
1551         {
1552             OperatingMode = 0x000,
1553             InterruptStatus = 0x020,
1554             TxQueueOperating = 0x100,
1555             TxQueueUnderflow = 0x104,
1556             TxQueueDebug = 0x108,
1557             QueueInterruptControlStatus = 0x12C,
1558             RxQueueOperatingMode = 0x130,
1559             RxQueueMissedPacketAndOverflowCounter = 0x134,
1560             RxQueueDebug = 0x138,
1561         }
1562 
1563         public enum RegistersDMA : long
1564         {
1565             DMAMode = 0x000,
1566             SystemBusMode = 0x004,
1567             InterruptStatus = 0x008,
1568             DebugStatus = 0x00C,
1569         }
1570 
1571         public enum RegistersDMAChannel : long
1572         {
1573             Control = 0x00,
1574             TransmitControl = 0x04,
1575             ReceiveControl = 0x08,
1576             TxDescriptorListAddress = 0x14,
1577             RxDescriptorListAddress = 0x1C,
1578             TxDescriptorTailPointer = 0x20,
1579             RxDescriptorTailPointer = 0x28,
1580             TxDescriptorRingLength = 0x2C,
1581             RxDescriptorRingLength = 0x30,
1582             InterruptEnable = 0x34,
1583             RxInterruptWatchdogTimer = 0x38,
1584             CurrentApplicationTransmitDescriptor = 0x44,
1585             CurrentApplicationReceiveDescriptor = 0x4C,
1586             CurrentApplicationTransmitBuffer = 0x54,
1587             CurrentApplicationReceiveBuffer = 0x5C,
1588             Status = 0x60,
1589             MissedFrameCount = 0x6C,
1590         }
1591 
1592         public enum RegisterSourceAddressOperation : byte
1593         {
1594             MACAddressRegisterReserved0 = 0b000,
1595             MACAddressRegisterReserved1 = 0b001,
1596             MACAddressRegister0Insert   = 0b010,
1597             MACAddressRegister0Replace  = 0b011,
1598             MACAddressRegisterReserved2 = 0b100,
1599             MACAddressRegisterReserved3 = 0b101,
1600             MACAddressRegister1Insert   = 0b110,
1601             MACAddressRegister1Replace  = 0b111,
1602         }
1603 
1604         protected enum DMATxProcessState
1605         {
1606             Stopped             = 0b000, // Reset or Stop Receive Command issued
1607             FetchingDescriptor  = 0b001, // Fetching Tx Transfer Descriptor
1608             WaitingForStatus    = 0b010, // Waiting for status
1609             FetchingBufferData  = 0b011, // Reading Data from system memory buffer and queuing it to the Tx buffer (Tx FIFO)
1610             TimestampWriteState = 0b100, // Timestamp write state
1611             // Reserved         = 0b101, // Reserved for future use
1612             Suspended           = 0b110, // Tx Descriptor Unavailable or Tx Buffer Underflow
1613             ClosingDescriptor   = 0b111, // Closing Tx Descriptor
1614         }
1615 
1616         protected enum DMARxProcessState
1617         {
1618             Stopped             = 0b000, // Reset or Stop Receive Command issued
1619             FetchingDescriptor  = 0b001, // Fetching Rx Transfer Descriptor
1620             // Reserved         = 0b010, // Reserved for future use
1621             WaitingForPacket    = 0b011, // Waiting for Rx packet
1622             Suspended           = 0b100, // Rx Descriptor Unavailable
1623             ClosingDescriptor   = 0b101, // Closing the Rx Descriptor
1624             TimestampWriteState = 0b110, // Timestamp write state
1625             WritingBufferData   = 0b111, // Transferring the received packet data from the Rx buffer to the system memory
1626         }
1627 
1628         private enum MIIOperation : byte
1629         {
1630             Write = 0b01,
1631             PostReadAddressIncrement = 0b10,
1632             Read = 0b11,
1633         }
1634 
1635         private enum IpcCounter : int
1636         {
1637             IpV4Good,
1638             IpV4HeaderError,
1639             IpV4NoPayload,
1640             IpV4Fragmented,
1641             IpV4UDPChecksumDisabled,
1642             IpV6Good,
1643             IpV6HeaderError,
1644             IpV6NoPayload,
1645             UdpGood,
1646             UdpError,
1647             TcpGood,
1648             TcpError,
1649             IcmpGood,
1650             IcmpError,
1651         }
1652 
1653         private enum MTLTxQueueReadControllerStatus
1654         {
1655             Idle = 0b00,
1656             Read = 0b01,
1657             Waiting = 0b10,
1658             Flushing = 0b11,
1659         }
1660     }
1661 }
1662