From 508495c52c4c959f82d7b9e385d3991fbe7096fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Kr=C3=BCger?= Date: Mon, 2 Sep 2024 14:57:52 +0100 Subject: [PATCH] RISC-V: Incorporate macro structs into re-usable struct --- .../lib/src/machine_state/csregisters.rs | 6 +- .../src/machine_state/csregisters/values.rs | 3430 +++++------------ 2 files changed, 1065 insertions(+), 2371 deletions(-) diff --git a/src/riscv/lib/src/machine_state/csregisters.rs b/src/riscv/lib/src/machine_state/csregisters.rs index 637c9c192f8f..ce767b6dda8c 100644 --- a/src/riscv/lib/src/machine_state/csregisters.rs +++ b/src/riscv/lib/src/machine_state/csregisters.rs @@ -31,7 +31,7 @@ use crate::{ use num_enum::TryFromPrimitive; use root::RootCSRegister; use strum::IntoEnumIterator; -use values::{CSRValuesLayout, CSRegisterValues, MStatusValue}; +use values::{CSRValues, CSRValuesLayout, MStatusValue}; /// Privilege required to access a CSR #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] @@ -1357,7 +1357,7 @@ pub fn access_checks(csr: CSRegister, hart_state: &HartState) /// CSRs pub struct CSRegisters { - registers: CSRegisterValues, + registers: CSRValues, pub(super) interrupt_cache: InterruptsCache, } @@ -1630,7 +1630,7 @@ impl CSRegisters { /// Bind the CSR state to the allocated space. pub fn bind(space: backend::AllocatedOf) -> Self { Self { - registers: values::CSRegisterValues::bind(space), + registers: values::CSRValues::bind(space), interrupt_cache: InterruptsCache::default(), } } diff --git a/src/riscv/lib/src/machine_state/csregisters/values.rs b/src/riscv/lib/src/machine_state/csregisters/values.rs index e3697c16cb60..19ffdfc7ca64 100644 --- a/src/riscv/lib/src/machine_state/csregisters/values.rs +++ b/src/riscv/lib/src/machine_state/csregisters/values.rs @@ -57,1222 +57,59 @@ impl Bits64 for CSRValue { } } -type NoEffectCSR = EffectCell; -type MipEffectCSR = EffectCell; +type RawValue = EffectCell; -type EffectCSRLayout = EffectCellLayout; +type MipValue = EffectCell; -pub(super) struct CSRegisterValues -where - M: ManagerBase, -{ - pub(super) mstatus: MStatusValue, - pub(super) mip: MipEffectCSR, - mnscratch: NoEffectCSR, - mnepc: NoEffectCSR, - mncause: NoEffectCSR, - mnstatus: NoEffectCSR, - cycle: NoEffectCSR, - time: NoEffectCSR, - instret: NoEffectCSR, - mcycle: NoEffectCSR, - minstret: NoEffectCSR, - hpmcounter3: NoEffectCSR, - hpmcounter4: NoEffectCSR, - hpmcounter5: NoEffectCSR, - hpmcounter6: NoEffectCSR, - hpmcounter7: NoEffectCSR, - hpmcounter8: NoEffectCSR, - hpmcounter9: NoEffectCSR, - hpmcounter10: NoEffectCSR, - hpmcounter11: NoEffectCSR, - hpmcounter12: NoEffectCSR, - hpmcounter13: NoEffectCSR, - hpmcounter14: NoEffectCSR, - hpmcounter15: NoEffectCSR, - hpmcounter16: NoEffectCSR, - hpmcounter17: NoEffectCSR, - hpmcounter18: NoEffectCSR, - hpmcounter19: NoEffectCSR, - hpmcounter20: NoEffectCSR, - hpmcounter21: NoEffectCSR, - hpmcounter22: NoEffectCSR, - hpmcounter23: NoEffectCSR, - hpmcounter24: NoEffectCSR, - hpmcounter25: NoEffectCSR, - hpmcounter26: NoEffectCSR, - hpmcounter27: NoEffectCSR, - hpmcounter28: NoEffectCSR, - hpmcounter29: NoEffectCSR, - hpmcounter30: NoEffectCSR, - hpmcounter31: NoEffectCSR, - mhpmcounter3: NoEffectCSR, - mhpmcounter4: NoEffectCSR, - mhpmcounter5: NoEffectCSR, - mhpmcounter6: NoEffectCSR, - mhpmcounter7: NoEffectCSR, - mhpmcounter8: NoEffectCSR, - mhpmcounter9: NoEffectCSR, - mhpmcounter10: NoEffectCSR, - mhpmcounter11: NoEffectCSR, - mhpmcounter12: NoEffectCSR, - mhpmcounter13: NoEffectCSR, - mhpmcounter14: NoEffectCSR, - mhpmcounter15: NoEffectCSR, - mhpmcounter16: NoEffectCSR, - mhpmcounter17: NoEffectCSR, - mhpmcounter18: NoEffectCSR, - mhpmcounter19: NoEffectCSR, - mhpmcounter20: NoEffectCSR, - mhpmcounter21: NoEffectCSR, - mhpmcounter22: NoEffectCSR, - mhpmcounter23: NoEffectCSR, - mhpmcounter24: NoEffectCSR, - mhpmcounter25: NoEffectCSR, - mhpmcounter26: NoEffectCSR, - mhpmcounter27: NoEffectCSR, - mhpmcounter28: NoEffectCSR, - mhpmcounter29: NoEffectCSR, - mhpmcounter30: NoEffectCSR, - mhpmcounter31: NoEffectCSR, - mhpmevent3: NoEffectCSR, - mhpmevent4: NoEffectCSR, - mhpmevent5: NoEffectCSR, - mhpmevent6: NoEffectCSR, - mhpmevent7: NoEffectCSR, - mhpmevent8: NoEffectCSR, - mhpmevent9: NoEffectCSR, - mhpmevent10: NoEffectCSR, - mhpmevent11: NoEffectCSR, - mhpmevent12: NoEffectCSR, - mhpmevent13: NoEffectCSR, - mhpmevent14: NoEffectCSR, - mhpmevent15: NoEffectCSR, - mhpmevent16: NoEffectCSR, - mhpmevent17: NoEffectCSR, - mhpmevent18: NoEffectCSR, - mhpmevent19: NoEffectCSR, - mhpmevent20: NoEffectCSR, - mhpmevent21: NoEffectCSR, - mhpmevent22: NoEffectCSR, - mhpmevent23: NoEffectCSR, - mhpmevent24: NoEffectCSR, - mhpmevent25: NoEffectCSR, - mhpmevent26: NoEffectCSR, - mhpmevent27: NoEffectCSR, - mhpmevent28: NoEffectCSR, - mhpmevent29: NoEffectCSR, - mhpmevent30: NoEffectCSR, - mhpmevent31: NoEffectCSR, - mcountinhibit: NoEffectCSR, - scounteren: NoEffectCSR, - mcounteren: NoEffectCSR, - pub(super) fcsr: NoEffectCSR, - pmpcfg0: NoEffectCSR, - pmpcfg2: NoEffectCSR, - pmpcfg4: NoEffectCSR, - pmpcfg6: NoEffectCSR, - pmpcfg8: NoEffectCSR, - pmpcfg10: NoEffectCSR, - pmpcfg12: NoEffectCSR, - pmpcfg14: NoEffectCSR, - pmpaddr0: NoEffectCSR, - pmpaddr1: NoEffectCSR, - pmpaddr2: NoEffectCSR, - pmpaddr3: NoEffectCSR, - pmpaddr4: NoEffectCSR, - pmpaddr5: NoEffectCSR, - pmpaddr6: NoEffectCSR, - pmpaddr7: NoEffectCSR, - pmpaddr8: NoEffectCSR, - pmpaddr9: NoEffectCSR, - pmpaddr10: NoEffectCSR, - pmpaddr11: NoEffectCSR, - pmpaddr12: NoEffectCSR, - pmpaddr13: NoEffectCSR, - pmpaddr14: NoEffectCSR, - pmpaddr15: NoEffectCSR, - pmpaddr16: NoEffectCSR, - pmpaddr17: NoEffectCSR, - pmpaddr18: NoEffectCSR, - pmpaddr19: NoEffectCSR, - pmpaddr20: NoEffectCSR, - pmpaddr21: NoEffectCSR, - pmpaddr22: NoEffectCSR, - pmpaddr23: NoEffectCSR, - pmpaddr24: NoEffectCSR, - pmpaddr25: NoEffectCSR, - pmpaddr26: NoEffectCSR, - pmpaddr27: NoEffectCSR, - pmpaddr28: NoEffectCSR, - pmpaddr29: NoEffectCSR, - pmpaddr30: NoEffectCSR, - pmpaddr31: NoEffectCSR, - pmpaddr32: NoEffectCSR, - pmpaddr33: NoEffectCSR, - pmpaddr34: NoEffectCSR, - pmpaddr35: NoEffectCSR, - pmpaddr36: NoEffectCSR, - pmpaddr37: NoEffectCSR, - pmpaddr38: NoEffectCSR, - pmpaddr39: NoEffectCSR, - pmpaddr40: NoEffectCSR, - pmpaddr41: NoEffectCSR, - pmpaddr42: NoEffectCSR, - pmpaddr43: NoEffectCSR, - pmpaddr44: NoEffectCSR, - pmpaddr45: NoEffectCSR, - pmpaddr46: NoEffectCSR, - pmpaddr47: NoEffectCSR, - pmpaddr48: NoEffectCSR, - pmpaddr49: NoEffectCSR, - pmpaddr50: NoEffectCSR, - pmpaddr51: NoEffectCSR, - pmpaddr52: NoEffectCSR, - pmpaddr53: NoEffectCSR, - pmpaddr54: NoEffectCSR, - pmpaddr55: NoEffectCSR, - pmpaddr56: NoEffectCSR, - pmpaddr57: NoEffectCSR, - pmpaddr58: NoEffectCSR, - pmpaddr59: NoEffectCSR, - pmpaddr60: NoEffectCSR, - pmpaddr61: NoEffectCSR, - pmpaddr62: NoEffectCSR, - pmpaddr63: NoEffectCSR, - mhartid: NoEffectCSR, - mvendorid: NoEffectCSR, - marchid: NoEffectCSR, - mimpid: NoEffectCSR, - misa: NoEffectCSR, - mscratch: NoEffectCSR, - sscratch: NoEffectCSR, - stvec: NoEffectCSR, - mtvec: NoEffectCSR, - pub(super) mie: NoEffectCSR, - satp: NoEffectCSR, - scause: NoEffectCSR, - mcause: NoEffectCSR, - sepc: NoEffectCSR, - mepc: NoEffectCSR, - stval: NoEffectCSR, - mtval: NoEffectCSR, - mtval2: NoEffectCSR, - mtinst: NoEffectCSR, - senvcfg: NoEffectCSR, - menvcfg: NoEffectCSR, - mconfigptr: NoEffectCSR, - medeleg: NoEffectCSR, - mideleg: NoEffectCSR, - mseccfg: NoEffectCSR, - scontext: NoEffectCSR, - hstatus: NoEffectCSR, - hedeleg: NoEffectCSR, - hideleg: NoEffectCSR, - hie: NoEffectCSR, - hcounteren: NoEffectCSR, - hgeie: NoEffectCSR, - htval: NoEffectCSR, - hip: NoEffectCSR, - hvip: NoEffectCSR, - htinst: NoEffectCSR, - hgeip: NoEffectCSR, - henvcfg: NoEffectCSR, - hgatp: NoEffectCSR, - hcontext: NoEffectCSR, - htimedelta: NoEffectCSR, - vsstatus: NoEffectCSR, - vsie: NoEffectCSR, - vstvec: NoEffectCSR, - vsscratch: NoEffectCSR, - vsepc: NoEffectCSR, - vscause: NoEffectCSR, - vstval: NoEffectCSR, - vsip: NoEffectCSR, - vsatp: NoEffectCSR, - tselect: NoEffectCSR, - tdata1: NoEffectCSR, - tdata2: NoEffectCSR, - tdata3: NoEffectCSR, - tcontrol: NoEffectCSR, - mcontext: NoEffectCSR, - dcsr: NoEffectCSR, - dpc: NoEffectCSR, - dscratch0: NoEffectCSR, - dscratch1: NoEffectCSR, -} +/// Values of all control and state registers +pub type CSRValues = CSRValuesF, MStatusValue, MipValue>; -impl CSRegisterValues { +impl CSRValues { + /// Bind the CSR values to the given allocated regions. pub fn bind(space: AllocatedOf) -> Self { - Self { - mstatus: >::bind(space.mstatus), - mip: >::bind(space.mip), - mnscratch: >::bind(space.mnscratch), - mnepc: >::bind(space.mnepc), - mncause: >::bind(space.mncause), - mnstatus: >::bind(space.mnstatus), - cycle: >::bind(space.cycle), - time: >::bind(space.time), - instret: >::bind(space.instret), - mcycle: >::bind(space.mcycle), - minstret: >::bind(space.minstret), - hpmcounter3: >::bind(space.hpmcounter3), - hpmcounter4: >::bind(space.hpmcounter4), - hpmcounter5: >::bind(space.hpmcounter5), - hpmcounter6: >::bind(space.hpmcounter6), - hpmcounter7: >::bind(space.hpmcounter7), - hpmcounter8: >::bind(space.hpmcounter8), - hpmcounter9: >::bind(space.hpmcounter9), - hpmcounter10: >::bind(space.hpmcounter10), - hpmcounter11: >::bind(space.hpmcounter11), - hpmcounter12: >::bind(space.hpmcounter12), - hpmcounter13: >::bind(space.hpmcounter13), - hpmcounter14: >::bind(space.hpmcounter14), - hpmcounter15: >::bind(space.hpmcounter15), - hpmcounter16: >::bind(space.hpmcounter16), - hpmcounter17: >::bind(space.hpmcounter17), - hpmcounter18: >::bind(space.hpmcounter18), - hpmcounter19: >::bind(space.hpmcounter19), - hpmcounter20: >::bind(space.hpmcounter20), - hpmcounter21: >::bind(space.hpmcounter21), - hpmcounter22: >::bind(space.hpmcounter22), - hpmcounter23: >::bind(space.hpmcounter23), - hpmcounter24: >::bind(space.hpmcounter24), - hpmcounter25: >::bind(space.hpmcounter25), - hpmcounter26: >::bind(space.hpmcounter26), - hpmcounter27: >::bind(space.hpmcounter27), - hpmcounter28: >::bind(space.hpmcounter28), - hpmcounter29: >::bind(space.hpmcounter29), - hpmcounter30: >::bind(space.hpmcounter30), - hpmcounter31: >::bind(space.hpmcounter31), - mhpmcounter3: >::bind(space.mhpmcounter3), - mhpmcounter4: >::bind(space.mhpmcounter4), - mhpmcounter5: >::bind(space.mhpmcounter5), - mhpmcounter6: >::bind(space.mhpmcounter6), - mhpmcounter7: >::bind(space.mhpmcounter7), - mhpmcounter8: >::bind(space.mhpmcounter8), - mhpmcounter9: >::bind(space.mhpmcounter9), - mhpmcounter10: >::bind(space.mhpmcounter10), - mhpmcounter11: >::bind(space.mhpmcounter11), - mhpmcounter12: >::bind(space.mhpmcounter12), - mhpmcounter13: >::bind(space.mhpmcounter13), - mhpmcounter14: >::bind(space.mhpmcounter14), - mhpmcounter15: >::bind(space.mhpmcounter15), - mhpmcounter16: >::bind(space.mhpmcounter16), - mhpmcounter17: >::bind(space.mhpmcounter17), - mhpmcounter18: >::bind(space.mhpmcounter18), - mhpmcounter19: >::bind(space.mhpmcounter19), - mhpmcounter20: >::bind(space.mhpmcounter20), - mhpmcounter21: >::bind(space.mhpmcounter21), - mhpmcounter22: >::bind(space.mhpmcounter22), - mhpmcounter23: >::bind(space.mhpmcounter23), - mhpmcounter24: >::bind(space.mhpmcounter24), - mhpmcounter25: >::bind(space.mhpmcounter25), - mhpmcounter26: >::bind(space.mhpmcounter26), - mhpmcounter27: >::bind(space.mhpmcounter27), - mhpmcounter28: >::bind(space.mhpmcounter28), - mhpmcounter29: >::bind(space.mhpmcounter29), - mhpmcounter30: >::bind(space.mhpmcounter30), - mhpmcounter31: >::bind(space.mhpmcounter31), - mhpmevent3: >::bind(space.mhpmevent3), - mhpmevent4: >::bind(space.mhpmevent4), - mhpmevent5: >::bind(space.mhpmevent5), - mhpmevent6: >::bind(space.mhpmevent6), - mhpmevent7: >::bind(space.mhpmevent7), - mhpmevent8: >::bind(space.mhpmevent8), - mhpmevent9: >::bind(space.mhpmevent9), - mhpmevent10: >::bind(space.mhpmevent10), - mhpmevent11: >::bind(space.mhpmevent11), - mhpmevent12: >::bind(space.mhpmevent12), - mhpmevent13: >::bind(space.mhpmevent13), - mhpmevent14: >::bind(space.mhpmevent14), - mhpmevent15: >::bind(space.mhpmevent15), - mhpmevent16: >::bind(space.mhpmevent16), - mhpmevent17: >::bind(space.mhpmevent17), - mhpmevent18: >::bind(space.mhpmevent18), - mhpmevent19: >::bind(space.mhpmevent19), - mhpmevent20: >::bind(space.mhpmevent20), - mhpmevent21: >::bind(space.mhpmevent21), - mhpmevent22: >::bind(space.mhpmevent22), - mhpmevent23: >::bind(space.mhpmevent23), - mhpmevent24: >::bind(space.mhpmevent24), - mhpmevent25: >::bind(space.mhpmevent25), - mhpmevent26: >::bind(space.mhpmevent26), - mhpmevent27: >::bind(space.mhpmevent27), - mhpmevent28: >::bind(space.mhpmevent28), - mhpmevent29: >::bind(space.mhpmevent29), - mhpmevent30: >::bind(space.mhpmevent30), - mhpmevent31: >::bind(space.mhpmevent31), - mcountinhibit: >::bind(space.mcountinhibit), - scounteren: >::bind(space.scounteren), - mcounteren: >::bind(space.mcounteren), - fcsr: >::bind(space.fcsr), - pmpcfg0: >::bind(space.pmpcfg0), - pmpcfg2: >::bind(space.pmpcfg2), - pmpcfg4: >::bind(space.pmpcfg4), - pmpcfg6: >::bind(space.pmpcfg6), - pmpcfg8: >::bind(space.pmpcfg8), - pmpcfg10: >::bind(space.pmpcfg10), - pmpcfg12: >::bind(space.pmpcfg12), - pmpcfg14: >::bind(space.pmpcfg14), - pmpaddr0: >::bind(space.pmpaddr0), - pmpaddr1: >::bind(space.pmpaddr1), - pmpaddr2: >::bind(space.pmpaddr2), - pmpaddr3: >::bind(space.pmpaddr3), - pmpaddr4: >::bind(space.pmpaddr4), - pmpaddr5: >::bind(space.pmpaddr5), - pmpaddr6: >::bind(space.pmpaddr6), - pmpaddr7: >::bind(space.pmpaddr7), - pmpaddr8: >::bind(space.pmpaddr8), - pmpaddr9: >::bind(space.pmpaddr9), - pmpaddr10: >::bind(space.pmpaddr10), - pmpaddr11: >::bind(space.pmpaddr11), - pmpaddr12: >::bind(space.pmpaddr12), - pmpaddr13: >::bind(space.pmpaddr13), - pmpaddr14: >::bind(space.pmpaddr14), - pmpaddr15: >::bind(space.pmpaddr15), - pmpaddr16: >::bind(space.pmpaddr16), - pmpaddr17: >::bind(space.pmpaddr17), - pmpaddr18: >::bind(space.pmpaddr18), - pmpaddr19: >::bind(space.pmpaddr19), - pmpaddr20: >::bind(space.pmpaddr20), - pmpaddr21: >::bind(space.pmpaddr21), - pmpaddr22: >::bind(space.pmpaddr22), - pmpaddr23: >::bind(space.pmpaddr23), - pmpaddr24: >::bind(space.pmpaddr24), - pmpaddr25: >::bind(space.pmpaddr25), - pmpaddr26: >::bind(space.pmpaddr26), - pmpaddr27: >::bind(space.pmpaddr27), - pmpaddr28: >::bind(space.pmpaddr28), - pmpaddr29: >::bind(space.pmpaddr29), - pmpaddr30: >::bind(space.pmpaddr30), - pmpaddr31: >::bind(space.pmpaddr31), - pmpaddr32: >::bind(space.pmpaddr32), - pmpaddr33: >::bind(space.pmpaddr33), - pmpaddr34: >::bind(space.pmpaddr34), - pmpaddr35: >::bind(space.pmpaddr35), - pmpaddr36: >::bind(space.pmpaddr36), - pmpaddr37: >::bind(space.pmpaddr37), - pmpaddr38: >::bind(space.pmpaddr38), - pmpaddr39: >::bind(space.pmpaddr39), - pmpaddr40: >::bind(space.pmpaddr40), - pmpaddr41: >::bind(space.pmpaddr41), - pmpaddr42: >::bind(space.pmpaddr42), - pmpaddr43: >::bind(space.pmpaddr43), - pmpaddr44: >::bind(space.pmpaddr44), - pmpaddr45: >::bind(space.pmpaddr45), - pmpaddr46: >::bind(space.pmpaddr46), - pmpaddr47: >::bind(space.pmpaddr47), - pmpaddr48: >::bind(space.pmpaddr48), - pmpaddr49: >::bind(space.pmpaddr49), - pmpaddr50: >::bind(space.pmpaddr50), - pmpaddr51: >::bind(space.pmpaddr51), - pmpaddr52: >::bind(space.pmpaddr52), - pmpaddr53: >::bind(space.pmpaddr53), - pmpaddr54: >::bind(space.pmpaddr54), - pmpaddr55: >::bind(space.pmpaddr55), - pmpaddr56: >::bind(space.pmpaddr56), - pmpaddr57: >::bind(space.pmpaddr57), - pmpaddr58: >::bind(space.pmpaddr58), - pmpaddr59: >::bind(space.pmpaddr59), - pmpaddr60: >::bind(space.pmpaddr60), - pmpaddr61: >::bind(space.pmpaddr61), - pmpaddr62: >::bind(space.pmpaddr62), - pmpaddr63: >::bind(space.pmpaddr63), - mhartid: >::bind(space.mhartid), - mvendorid: >::bind(space.mvendorid), - marchid: >::bind(space.marchid), - mimpid: >::bind(space.mimpid), - misa: >::bind(space.misa), - mscratch: >::bind(space.mscratch), - sscratch: >::bind(space.sscratch), - stvec: >::bind(space.stvec), - mtvec: >::bind(space.mtvec), - mie: >::bind(space.mie), - satp: >::bind(space.satp), - scause: >::bind(space.scause), - mcause: >::bind(space.mcause), - sepc: >::bind(space.sepc), - mepc: >::bind(space.mepc), - stval: >::bind(space.stval), - mtval: >::bind(space.mtval), - mtval2: >::bind(space.mtval2), - mtinst: >::bind(space.mtinst), - senvcfg: >::bind(space.senvcfg), - menvcfg: >::bind(space.menvcfg), - mconfigptr: >::bind(space.mconfigptr), - medeleg: >::bind(space.medeleg), - mideleg: >::bind(space.mideleg), - mseccfg: >::bind(space.mseccfg), - scontext: >::bind(space.scontext), - hstatus: >::bind(space.hstatus), - hedeleg: >::bind(space.hedeleg), - hideleg: >::bind(space.hideleg), - hie: >::bind(space.hie), - hcounteren: >::bind(space.hcounteren), - hgeie: >::bind(space.hgeie), - htval: >::bind(space.htval), - hip: >::bind(space.hip), - hvip: >::bind(space.hvip), - htinst: >::bind(space.htinst), - hgeip: >::bind(space.hgeip), - henvcfg: >::bind(space.henvcfg), - hgatp: >::bind(space.hgatp), - hcontext: >::bind(space.hcontext), - htimedelta: >::bind(space.htimedelta), - vsstatus: >::bind(space.vsstatus), - vsie: >::bind(space.vsie), - vstvec: >::bind(space.vstvec), - vsscratch: >::bind(space.vsscratch), - vsepc: >::bind(space.vsepc), - vscause: >::bind(space.vscause), - vstval: >::bind(space.vstval), - vsip: >::bind(space.vsip), - vsatp: >::bind(space.vsatp), - tselect: >::bind(space.tselect), - tdata1: >::bind(space.tdata1), - tdata2: >::bind(space.tdata2), - tdata3: >::bind(space.tdata3), - tcontrol: >::bind(space.tcontrol), - mcontext: >::bind(space.mcontext), - dcsr: >::bind(space.dcsr), - dpc: >::bind(space.dpc), - dscratch0: >::bind(space.dscratch0), - dscratch1: >::bind(space.dscratch1), - } + space.map(MStatusValue::bind, EffectCell::bind, EffectCell::bind) } } impl CSRegisters { + /// Perform a general read of a CSR. #[inline(always)] pub(super) fn general_raw_read(&self, csr: RootCSRegister) -> CSRRepr where M: ManagerRead, { - match csr { - RootCSRegister::mstatus => self.registers.mstatus.read(), - RootCSRegister::mip => self.registers.mip.read(), - RootCSRegister::mnscratch => self.registers.mnscratch.read(), - RootCSRegister::mnepc => self.registers.mnepc.read(), - RootCSRegister::mncause => self.registers.mncause.read(), - RootCSRegister::mnstatus => self.registers.mnstatus.read(), - RootCSRegister::cycle => self.registers.cycle.read(), - RootCSRegister::time => self.registers.time.read(), - RootCSRegister::instret => self.registers.instret.read(), - RootCSRegister::mcycle => self.registers.mcycle.read(), - RootCSRegister::minstret => self.registers.minstret.read(), - RootCSRegister::hpmcounter3 => self.registers.hpmcounter3.read(), - RootCSRegister::hpmcounter4 => self.registers.hpmcounter4.read(), - RootCSRegister::hpmcounter5 => self.registers.hpmcounter5.read(), - RootCSRegister::hpmcounter6 => self.registers.hpmcounter6.read(), - RootCSRegister::hpmcounter7 => self.registers.hpmcounter7.read(), - RootCSRegister::hpmcounter8 => self.registers.hpmcounter8.read(), - RootCSRegister::hpmcounter9 => self.registers.hpmcounter9.read(), - RootCSRegister::hpmcounter10 => self.registers.hpmcounter10.read(), - RootCSRegister::hpmcounter11 => self.registers.hpmcounter11.read(), - RootCSRegister::hpmcounter12 => self.registers.hpmcounter12.read(), - RootCSRegister::hpmcounter13 => self.registers.hpmcounter13.read(), - RootCSRegister::hpmcounter14 => self.registers.hpmcounter14.read(), - RootCSRegister::hpmcounter15 => self.registers.hpmcounter15.read(), - RootCSRegister::hpmcounter16 => self.registers.hpmcounter16.read(), - RootCSRegister::hpmcounter17 => self.registers.hpmcounter17.read(), - RootCSRegister::hpmcounter18 => self.registers.hpmcounter18.read(), - RootCSRegister::hpmcounter19 => self.registers.hpmcounter19.read(), - RootCSRegister::hpmcounter20 => self.registers.hpmcounter20.read(), - RootCSRegister::hpmcounter21 => self.registers.hpmcounter21.read(), - RootCSRegister::hpmcounter22 => self.registers.hpmcounter22.read(), - RootCSRegister::hpmcounter23 => self.registers.hpmcounter23.read(), - RootCSRegister::hpmcounter24 => self.registers.hpmcounter24.read(), - RootCSRegister::hpmcounter25 => self.registers.hpmcounter25.read(), - RootCSRegister::hpmcounter26 => self.registers.hpmcounter26.read(), - RootCSRegister::hpmcounter27 => self.registers.hpmcounter27.read(), - RootCSRegister::hpmcounter28 => self.registers.hpmcounter28.read(), - RootCSRegister::hpmcounter29 => self.registers.hpmcounter29.read(), - RootCSRegister::hpmcounter30 => self.registers.hpmcounter30.read(), - RootCSRegister::hpmcounter31 => self.registers.hpmcounter31.read(), - RootCSRegister::mhpmcounter3 => self.registers.mhpmcounter3.read(), - RootCSRegister::mhpmcounter4 => self.registers.mhpmcounter4.read(), - RootCSRegister::mhpmcounter5 => self.registers.mhpmcounter5.read(), - RootCSRegister::mhpmcounter6 => self.registers.mhpmcounter6.read(), - RootCSRegister::mhpmcounter7 => self.registers.mhpmcounter7.read(), - RootCSRegister::mhpmcounter8 => self.registers.mhpmcounter8.read(), - RootCSRegister::mhpmcounter9 => self.registers.mhpmcounter9.read(), - RootCSRegister::mhpmcounter10 => self.registers.mhpmcounter10.read(), - RootCSRegister::mhpmcounter11 => self.registers.mhpmcounter11.read(), - RootCSRegister::mhpmcounter12 => self.registers.mhpmcounter12.read(), - RootCSRegister::mhpmcounter13 => self.registers.mhpmcounter13.read(), - RootCSRegister::mhpmcounter14 => self.registers.mhpmcounter14.read(), - RootCSRegister::mhpmcounter15 => self.registers.mhpmcounter15.read(), - RootCSRegister::mhpmcounter16 => self.registers.mhpmcounter16.read(), - RootCSRegister::mhpmcounter17 => self.registers.mhpmcounter17.read(), - RootCSRegister::mhpmcounter18 => self.registers.mhpmcounter18.read(), - RootCSRegister::mhpmcounter19 => self.registers.mhpmcounter19.read(), - RootCSRegister::mhpmcounter20 => self.registers.mhpmcounter20.read(), - RootCSRegister::mhpmcounter21 => self.registers.mhpmcounter21.read(), - RootCSRegister::mhpmcounter22 => self.registers.mhpmcounter22.read(), - RootCSRegister::mhpmcounter23 => self.registers.mhpmcounter23.read(), - RootCSRegister::mhpmcounter24 => self.registers.mhpmcounter24.read(), - RootCSRegister::mhpmcounter25 => self.registers.mhpmcounter25.read(), - RootCSRegister::mhpmcounter26 => self.registers.mhpmcounter26.read(), - RootCSRegister::mhpmcounter27 => self.registers.mhpmcounter27.read(), - RootCSRegister::mhpmcounter28 => self.registers.mhpmcounter28.read(), - RootCSRegister::mhpmcounter29 => self.registers.mhpmcounter29.read(), - RootCSRegister::mhpmcounter30 => self.registers.mhpmcounter30.read(), - RootCSRegister::mhpmcounter31 => self.registers.mhpmcounter31.read(), - RootCSRegister::mhpmevent3 => self.registers.mhpmevent3.read(), - RootCSRegister::mhpmevent4 => self.registers.mhpmevent4.read(), - RootCSRegister::mhpmevent5 => self.registers.mhpmevent5.read(), - RootCSRegister::mhpmevent6 => self.registers.mhpmevent6.read(), - RootCSRegister::mhpmevent7 => self.registers.mhpmevent7.read(), - RootCSRegister::mhpmevent8 => self.registers.mhpmevent8.read(), - RootCSRegister::mhpmevent9 => self.registers.mhpmevent9.read(), - RootCSRegister::mhpmevent10 => self.registers.mhpmevent10.read(), - RootCSRegister::mhpmevent11 => self.registers.mhpmevent11.read(), - RootCSRegister::mhpmevent12 => self.registers.mhpmevent12.read(), - RootCSRegister::mhpmevent13 => self.registers.mhpmevent13.read(), - RootCSRegister::mhpmevent14 => self.registers.mhpmevent14.read(), - RootCSRegister::mhpmevent15 => self.registers.mhpmevent15.read(), - RootCSRegister::mhpmevent16 => self.registers.mhpmevent16.read(), - RootCSRegister::mhpmevent17 => self.registers.mhpmevent17.read(), - RootCSRegister::mhpmevent18 => self.registers.mhpmevent18.read(), - RootCSRegister::mhpmevent19 => self.registers.mhpmevent19.read(), - RootCSRegister::mhpmevent20 => self.registers.mhpmevent20.read(), - RootCSRegister::mhpmevent21 => self.registers.mhpmevent21.read(), - RootCSRegister::mhpmevent22 => self.registers.mhpmevent22.read(), - RootCSRegister::mhpmevent23 => self.registers.mhpmevent23.read(), - RootCSRegister::mhpmevent24 => self.registers.mhpmevent24.read(), - RootCSRegister::mhpmevent25 => self.registers.mhpmevent25.read(), - RootCSRegister::mhpmevent26 => self.registers.mhpmevent26.read(), - RootCSRegister::mhpmevent27 => self.registers.mhpmevent27.read(), - RootCSRegister::mhpmevent28 => self.registers.mhpmevent28.read(), - RootCSRegister::mhpmevent29 => self.registers.mhpmevent29.read(), - RootCSRegister::mhpmevent30 => self.registers.mhpmevent30.read(), - RootCSRegister::mhpmevent31 => self.registers.mhpmevent31.read(), - RootCSRegister::mcountinhibit => self.registers.mcountinhibit.read(), - RootCSRegister::scounteren => self.registers.scounteren.read(), - RootCSRegister::mcounteren => self.registers.mcounteren.read(), - RootCSRegister::fcsr => self.registers.fcsr.read(), - RootCSRegister::pmpcfg0 => self.registers.pmpcfg0.read(), - RootCSRegister::pmpcfg2 => self.registers.pmpcfg2.read(), - RootCSRegister::pmpcfg4 => self.registers.pmpcfg4.read(), - RootCSRegister::pmpcfg6 => self.registers.pmpcfg6.read(), - RootCSRegister::pmpcfg8 => self.registers.pmpcfg8.read(), - RootCSRegister::pmpcfg10 => self.registers.pmpcfg10.read(), - RootCSRegister::pmpcfg12 => self.registers.pmpcfg12.read(), - RootCSRegister::pmpcfg14 => self.registers.pmpcfg14.read(), - RootCSRegister::pmpaddr0 => self.registers.pmpaddr0.read(), - RootCSRegister::pmpaddr1 => self.registers.pmpaddr1.read(), - RootCSRegister::pmpaddr2 => self.registers.pmpaddr2.read(), - RootCSRegister::pmpaddr3 => self.registers.pmpaddr3.read(), - RootCSRegister::pmpaddr4 => self.registers.pmpaddr4.read(), - RootCSRegister::pmpaddr5 => self.registers.pmpaddr5.read(), - RootCSRegister::pmpaddr6 => self.registers.pmpaddr6.read(), - RootCSRegister::pmpaddr7 => self.registers.pmpaddr7.read(), - RootCSRegister::pmpaddr8 => self.registers.pmpaddr8.read(), - RootCSRegister::pmpaddr9 => self.registers.pmpaddr9.read(), - RootCSRegister::pmpaddr10 => self.registers.pmpaddr10.read(), - RootCSRegister::pmpaddr11 => self.registers.pmpaddr11.read(), - RootCSRegister::pmpaddr12 => self.registers.pmpaddr12.read(), - RootCSRegister::pmpaddr13 => self.registers.pmpaddr13.read(), - RootCSRegister::pmpaddr14 => self.registers.pmpaddr14.read(), - RootCSRegister::pmpaddr15 => self.registers.pmpaddr15.read(), - RootCSRegister::pmpaddr16 => self.registers.pmpaddr16.read(), - RootCSRegister::pmpaddr17 => self.registers.pmpaddr17.read(), - RootCSRegister::pmpaddr18 => self.registers.pmpaddr18.read(), - RootCSRegister::pmpaddr19 => self.registers.pmpaddr19.read(), - RootCSRegister::pmpaddr20 => self.registers.pmpaddr20.read(), - RootCSRegister::pmpaddr21 => self.registers.pmpaddr21.read(), - RootCSRegister::pmpaddr22 => self.registers.pmpaddr22.read(), - RootCSRegister::pmpaddr23 => self.registers.pmpaddr23.read(), - RootCSRegister::pmpaddr24 => self.registers.pmpaddr24.read(), - RootCSRegister::pmpaddr25 => self.registers.pmpaddr25.read(), - RootCSRegister::pmpaddr26 => self.registers.pmpaddr26.read(), - RootCSRegister::pmpaddr27 => self.registers.pmpaddr27.read(), - RootCSRegister::pmpaddr28 => self.registers.pmpaddr28.read(), - RootCSRegister::pmpaddr29 => self.registers.pmpaddr29.read(), - RootCSRegister::pmpaddr30 => self.registers.pmpaddr30.read(), - RootCSRegister::pmpaddr31 => self.registers.pmpaddr31.read(), - RootCSRegister::pmpaddr32 => self.registers.pmpaddr32.read(), - RootCSRegister::pmpaddr33 => self.registers.pmpaddr33.read(), - RootCSRegister::pmpaddr34 => self.registers.pmpaddr34.read(), - RootCSRegister::pmpaddr35 => self.registers.pmpaddr35.read(), - RootCSRegister::pmpaddr36 => self.registers.pmpaddr36.read(), - RootCSRegister::pmpaddr37 => self.registers.pmpaddr37.read(), - RootCSRegister::pmpaddr38 => self.registers.pmpaddr38.read(), - RootCSRegister::pmpaddr39 => self.registers.pmpaddr39.read(), - RootCSRegister::pmpaddr40 => self.registers.pmpaddr40.read(), - RootCSRegister::pmpaddr41 => self.registers.pmpaddr41.read(), - RootCSRegister::pmpaddr42 => self.registers.pmpaddr42.read(), - RootCSRegister::pmpaddr43 => self.registers.pmpaddr43.read(), - RootCSRegister::pmpaddr44 => self.registers.pmpaddr44.read(), - RootCSRegister::pmpaddr45 => self.registers.pmpaddr45.read(), - RootCSRegister::pmpaddr46 => self.registers.pmpaddr46.read(), - RootCSRegister::pmpaddr47 => self.registers.pmpaddr47.read(), - RootCSRegister::pmpaddr48 => self.registers.pmpaddr48.read(), - RootCSRegister::pmpaddr49 => self.registers.pmpaddr49.read(), - RootCSRegister::pmpaddr50 => self.registers.pmpaddr50.read(), - RootCSRegister::pmpaddr51 => self.registers.pmpaddr51.read(), - RootCSRegister::pmpaddr52 => self.registers.pmpaddr52.read(), - RootCSRegister::pmpaddr53 => self.registers.pmpaddr53.read(), - RootCSRegister::pmpaddr54 => self.registers.pmpaddr54.read(), - RootCSRegister::pmpaddr55 => self.registers.pmpaddr55.read(), - RootCSRegister::pmpaddr56 => self.registers.pmpaddr56.read(), - RootCSRegister::pmpaddr57 => self.registers.pmpaddr57.read(), - RootCSRegister::pmpaddr58 => self.registers.pmpaddr58.read(), - RootCSRegister::pmpaddr59 => self.registers.pmpaddr59.read(), - RootCSRegister::pmpaddr60 => self.registers.pmpaddr60.read(), - RootCSRegister::pmpaddr61 => self.registers.pmpaddr61.read(), - RootCSRegister::pmpaddr62 => self.registers.pmpaddr62.read(), - RootCSRegister::pmpaddr63 => self.registers.pmpaddr63.read(), - RootCSRegister::mhartid => self.registers.mhartid.read(), - RootCSRegister::mvendorid => self.registers.mvendorid.read(), - RootCSRegister::marchid => self.registers.marchid.read(), - RootCSRegister::mimpid => self.registers.mimpid.read(), - RootCSRegister::misa => self.registers.misa.read(), - RootCSRegister::mscratch => self.registers.mscratch.read(), - RootCSRegister::sscratch => self.registers.sscratch.read(), - RootCSRegister::stvec => self.registers.stvec.read(), - RootCSRegister::mtvec => self.registers.mtvec.read(), - RootCSRegister::mie => self.registers.mie.read(), - RootCSRegister::satp => self.registers.satp.read(), - RootCSRegister::scause => self.registers.scause.read(), - RootCSRegister::mcause => self.registers.mcause.read(), - RootCSRegister::sepc => self.registers.sepc.read(), - RootCSRegister::mepc => self.registers.mepc.read(), - RootCSRegister::stval => self.registers.stval.read(), - RootCSRegister::mtval => self.registers.mtval.read(), - RootCSRegister::mtval2 => self.registers.mtval2.read(), - RootCSRegister::mtinst => self.registers.mtinst.read(), - RootCSRegister::senvcfg => self.registers.senvcfg.read(), - RootCSRegister::menvcfg => self.registers.menvcfg.read(), - RootCSRegister::mconfigptr => self.registers.mconfigptr.read(), - RootCSRegister::medeleg => self.registers.medeleg.read(), - RootCSRegister::mideleg => self.registers.mideleg.read(), - RootCSRegister::mseccfg => self.registers.mseccfg.read(), - RootCSRegister::scontext => self.registers.scontext.read(), - RootCSRegister::hstatus => self.registers.hstatus.read(), - RootCSRegister::hedeleg => self.registers.hedeleg.read(), - RootCSRegister::hideleg => self.registers.hideleg.read(), - RootCSRegister::hie => self.registers.hie.read(), - RootCSRegister::hcounteren => self.registers.hcounteren.read(), - RootCSRegister::hgeie => self.registers.hgeie.read(), - RootCSRegister::htval => self.registers.htval.read(), - RootCSRegister::hip => self.registers.hip.read(), - RootCSRegister::hvip => self.registers.hvip.read(), - RootCSRegister::htinst => self.registers.htinst.read(), - RootCSRegister::hgeip => self.registers.hgeip.read(), - RootCSRegister::henvcfg => self.registers.henvcfg.read(), - RootCSRegister::hgatp => self.registers.hgatp.read(), - RootCSRegister::hcontext => self.registers.hcontext.read(), - RootCSRegister::htimedelta => self.registers.htimedelta.read(), - RootCSRegister::vsstatus => self.registers.vsstatus.read(), - RootCSRegister::vsie => self.registers.vsie.read(), - RootCSRegister::vstvec => self.registers.vstvec.read(), - RootCSRegister::vsscratch => self.registers.vsscratch.read(), - RootCSRegister::vsepc => self.registers.vsepc.read(), - RootCSRegister::vscause => self.registers.vscause.read(), - RootCSRegister::vstval => self.registers.vstval.read(), - RootCSRegister::vsip => self.registers.vsip.read(), - RootCSRegister::vsatp => self.registers.vsatp.read(), - RootCSRegister::tselect => self.registers.tselect.read(), - RootCSRegister::tdata1 => self.registers.tdata1.read(), - RootCSRegister::tdata2 => self.registers.tdata2.read(), - RootCSRegister::tdata3 => self.registers.tdata3.read(), - RootCSRegister::tcontrol => self.registers.tcontrol.read(), - RootCSRegister::mcontext => self.registers.mcontext.read(), - RootCSRegister::dcsr => self.registers.dcsr.read(), - RootCSRegister::dpc => self.registers.dpc.read(), - RootCSRegister::dscratch0 => self.registers.dscratch0.read(), - RootCSRegister::dscratch1 => self.registers.dscratch1.read(), - } + self.registers + .select_ref(csr, MStatusValue::read, MipValue::read, RawValue::read) } + /// Perform a general write of a CSR. #[inline(always)] pub(super) fn general_raw_write(&mut self, csr: RootCSRegister, value: CSRRepr) where M: ManagerWrite, { - let effect = match csr { - RootCSRegister::mstatus => self.registers.mstatus.write(value), - RootCSRegister::mip => self.registers.mip.write(value), - RootCSRegister::mnscratch => self.registers.mnscratch.write(value), - RootCSRegister::mnepc => self.registers.mnepc.write(value), - RootCSRegister::mncause => self.registers.mncause.write(value), - RootCSRegister::mnstatus => self.registers.mnstatus.write(value), - RootCSRegister::cycle => self.registers.cycle.write(value), - RootCSRegister::time => self.registers.time.write(value), - RootCSRegister::instret => self.registers.instret.write(value), - RootCSRegister::mcycle => self.registers.mcycle.write(value), - RootCSRegister::minstret => self.registers.minstret.write(value), - RootCSRegister::hpmcounter3 => self.registers.hpmcounter3.write(value), - RootCSRegister::hpmcounter4 => self.registers.hpmcounter4.write(value), - RootCSRegister::hpmcounter5 => self.registers.hpmcounter5.write(value), - RootCSRegister::hpmcounter6 => self.registers.hpmcounter6.write(value), - RootCSRegister::hpmcounter7 => self.registers.hpmcounter7.write(value), - RootCSRegister::hpmcounter8 => self.registers.hpmcounter8.write(value), - RootCSRegister::hpmcounter9 => self.registers.hpmcounter9.write(value), - RootCSRegister::hpmcounter10 => self.registers.hpmcounter10.write(value), - RootCSRegister::hpmcounter11 => self.registers.hpmcounter11.write(value), - RootCSRegister::hpmcounter12 => self.registers.hpmcounter12.write(value), - RootCSRegister::hpmcounter13 => self.registers.hpmcounter13.write(value), - RootCSRegister::hpmcounter14 => self.registers.hpmcounter14.write(value), - RootCSRegister::hpmcounter15 => self.registers.hpmcounter15.write(value), - RootCSRegister::hpmcounter16 => self.registers.hpmcounter16.write(value), - RootCSRegister::hpmcounter17 => self.registers.hpmcounter17.write(value), - RootCSRegister::hpmcounter18 => self.registers.hpmcounter18.write(value), - RootCSRegister::hpmcounter19 => self.registers.hpmcounter19.write(value), - RootCSRegister::hpmcounter20 => self.registers.hpmcounter20.write(value), - RootCSRegister::hpmcounter21 => self.registers.hpmcounter21.write(value), - RootCSRegister::hpmcounter22 => self.registers.hpmcounter22.write(value), - RootCSRegister::hpmcounter23 => self.registers.hpmcounter23.write(value), - RootCSRegister::hpmcounter24 => self.registers.hpmcounter24.write(value), - RootCSRegister::hpmcounter25 => self.registers.hpmcounter25.write(value), - RootCSRegister::hpmcounter26 => self.registers.hpmcounter26.write(value), - RootCSRegister::hpmcounter27 => self.registers.hpmcounter27.write(value), - RootCSRegister::hpmcounter28 => self.registers.hpmcounter28.write(value), - RootCSRegister::hpmcounter29 => self.registers.hpmcounter29.write(value), - RootCSRegister::hpmcounter30 => self.registers.hpmcounter30.write(value), - RootCSRegister::hpmcounter31 => self.registers.hpmcounter31.write(value), - RootCSRegister::mhpmcounter3 => self.registers.mhpmcounter3.write(value), - RootCSRegister::mhpmcounter4 => self.registers.mhpmcounter4.write(value), - RootCSRegister::mhpmcounter5 => self.registers.mhpmcounter5.write(value), - RootCSRegister::mhpmcounter6 => self.registers.mhpmcounter6.write(value), - RootCSRegister::mhpmcounter7 => self.registers.mhpmcounter7.write(value), - RootCSRegister::mhpmcounter8 => self.registers.mhpmcounter8.write(value), - RootCSRegister::mhpmcounter9 => self.registers.mhpmcounter9.write(value), - RootCSRegister::mhpmcounter10 => self.registers.mhpmcounter10.write(value), - RootCSRegister::mhpmcounter11 => self.registers.mhpmcounter11.write(value), - RootCSRegister::mhpmcounter12 => self.registers.mhpmcounter12.write(value), - RootCSRegister::mhpmcounter13 => self.registers.mhpmcounter13.write(value), - RootCSRegister::mhpmcounter14 => self.registers.mhpmcounter14.write(value), - RootCSRegister::mhpmcounter15 => self.registers.mhpmcounter15.write(value), - RootCSRegister::mhpmcounter16 => self.registers.mhpmcounter16.write(value), - RootCSRegister::mhpmcounter17 => self.registers.mhpmcounter17.write(value), - RootCSRegister::mhpmcounter18 => self.registers.mhpmcounter18.write(value), - RootCSRegister::mhpmcounter19 => self.registers.mhpmcounter19.write(value), - RootCSRegister::mhpmcounter20 => self.registers.mhpmcounter20.write(value), - RootCSRegister::mhpmcounter21 => self.registers.mhpmcounter21.write(value), - RootCSRegister::mhpmcounter22 => self.registers.mhpmcounter22.write(value), - RootCSRegister::mhpmcounter23 => self.registers.mhpmcounter23.write(value), - RootCSRegister::mhpmcounter24 => self.registers.mhpmcounter24.write(value), - RootCSRegister::mhpmcounter25 => self.registers.mhpmcounter25.write(value), - RootCSRegister::mhpmcounter26 => self.registers.mhpmcounter26.write(value), - RootCSRegister::mhpmcounter27 => self.registers.mhpmcounter27.write(value), - RootCSRegister::mhpmcounter28 => self.registers.mhpmcounter28.write(value), - RootCSRegister::mhpmcounter29 => self.registers.mhpmcounter29.write(value), - RootCSRegister::mhpmcounter30 => self.registers.mhpmcounter30.write(value), - RootCSRegister::mhpmcounter31 => self.registers.mhpmcounter31.write(value), - RootCSRegister::mhpmevent3 => self.registers.mhpmevent3.write(value), - RootCSRegister::mhpmevent4 => self.registers.mhpmevent4.write(value), - RootCSRegister::mhpmevent5 => self.registers.mhpmevent5.write(value), - RootCSRegister::mhpmevent6 => self.registers.mhpmevent6.write(value), - RootCSRegister::mhpmevent7 => self.registers.mhpmevent7.write(value), - RootCSRegister::mhpmevent8 => self.registers.mhpmevent8.write(value), - RootCSRegister::mhpmevent9 => self.registers.mhpmevent9.write(value), - RootCSRegister::mhpmevent10 => self.registers.mhpmevent10.write(value), - RootCSRegister::mhpmevent11 => self.registers.mhpmevent11.write(value), - RootCSRegister::mhpmevent12 => self.registers.mhpmevent12.write(value), - RootCSRegister::mhpmevent13 => self.registers.mhpmevent13.write(value), - RootCSRegister::mhpmevent14 => self.registers.mhpmevent14.write(value), - RootCSRegister::mhpmevent15 => self.registers.mhpmevent15.write(value), - RootCSRegister::mhpmevent16 => self.registers.mhpmevent16.write(value), - RootCSRegister::mhpmevent17 => self.registers.mhpmevent17.write(value), - RootCSRegister::mhpmevent18 => self.registers.mhpmevent18.write(value), - RootCSRegister::mhpmevent19 => self.registers.mhpmevent19.write(value), - RootCSRegister::mhpmevent20 => self.registers.mhpmevent20.write(value), - RootCSRegister::mhpmevent21 => self.registers.mhpmevent21.write(value), - RootCSRegister::mhpmevent22 => self.registers.mhpmevent22.write(value), - RootCSRegister::mhpmevent23 => self.registers.mhpmevent23.write(value), - RootCSRegister::mhpmevent24 => self.registers.mhpmevent24.write(value), - RootCSRegister::mhpmevent25 => self.registers.mhpmevent25.write(value), - RootCSRegister::mhpmevent26 => self.registers.mhpmevent26.write(value), - RootCSRegister::mhpmevent27 => self.registers.mhpmevent27.write(value), - RootCSRegister::mhpmevent28 => self.registers.mhpmevent28.write(value), - RootCSRegister::mhpmevent29 => self.registers.mhpmevent29.write(value), - RootCSRegister::mhpmevent30 => self.registers.mhpmevent30.write(value), - RootCSRegister::mhpmevent31 => self.registers.mhpmevent31.write(value), - RootCSRegister::mcountinhibit => self.registers.mcountinhibit.write(value), - RootCSRegister::scounteren => self.registers.scounteren.write(value), - RootCSRegister::mcounteren => self.registers.mcounteren.write(value), - RootCSRegister::fcsr => self.registers.fcsr.write(value), - RootCSRegister::pmpcfg0 => self.registers.pmpcfg0.write(value), - RootCSRegister::pmpcfg2 => self.registers.pmpcfg2.write(value), - RootCSRegister::pmpcfg4 => self.registers.pmpcfg4.write(value), - RootCSRegister::pmpcfg6 => self.registers.pmpcfg6.write(value), - RootCSRegister::pmpcfg8 => self.registers.pmpcfg8.write(value), - RootCSRegister::pmpcfg10 => self.registers.pmpcfg10.write(value), - RootCSRegister::pmpcfg12 => self.registers.pmpcfg12.write(value), - RootCSRegister::pmpcfg14 => self.registers.pmpcfg14.write(value), - RootCSRegister::pmpaddr0 => self.registers.pmpaddr0.write(value), - RootCSRegister::pmpaddr1 => self.registers.pmpaddr1.write(value), - RootCSRegister::pmpaddr2 => self.registers.pmpaddr2.write(value), - RootCSRegister::pmpaddr3 => self.registers.pmpaddr3.write(value), - RootCSRegister::pmpaddr4 => self.registers.pmpaddr4.write(value), - RootCSRegister::pmpaddr5 => self.registers.pmpaddr5.write(value), - RootCSRegister::pmpaddr6 => self.registers.pmpaddr6.write(value), - RootCSRegister::pmpaddr7 => self.registers.pmpaddr7.write(value), - RootCSRegister::pmpaddr8 => self.registers.pmpaddr8.write(value), - RootCSRegister::pmpaddr9 => self.registers.pmpaddr9.write(value), - RootCSRegister::pmpaddr10 => self.registers.pmpaddr10.write(value), - RootCSRegister::pmpaddr11 => self.registers.pmpaddr11.write(value), - RootCSRegister::pmpaddr12 => self.registers.pmpaddr12.write(value), - RootCSRegister::pmpaddr13 => self.registers.pmpaddr13.write(value), - RootCSRegister::pmpaddr14 => self.registers.pmpaddr14.write(value), - RootCSRegister::pmpaddr15 => self.registers.pmpaddr15.write(value), - RootCSRegister::pmpaddr16 => self.registers.pmpaddr16.write(value), - RootCSRegister::pmpaddr17 => self.registers.pmpaddr17.write(value), - RootCSRegister::pmpaddr18 => self.registers.pmpaddr18.write(value), - RootCSRegister::pmpaddr19 => self.registers.pmpaddr19.write(value), - RootCSRegister::pmpaddr20 => self.registers.pmpaddr20.write(value), - RootCSRegister::pmpaddr21 => self.registers.pmpaddr21.write(value), - RootCSRegister::pmpaddr22 => self.registers.pmpaddr22.write(value), - RootCSRegister::pmpaddr23 => self.registers.pmpaddr23.write(value), - RootCSRegister::pmpaddr24 => self.registers.pmpaddr24.write(value), - RootCSRegister::pmpaddr25 => self.registers.pmpaddr25.write(value), - RootCSRegister::pmpaddr26 => self.registers.pmpaddr26.write(value), - RootCSRegister::pmpaddr27 => self.registers.pmpaddr27.write(value), - RootCSRegister::pmpaddr28 => self.registers.pmpaddr28.write(value), - RootCSRegister::pmpaddr29 => self.registers.pmpaddr29.write(value), - RootCSRegister::pmpaddr30 => self.registers.pmpaddr30.write(value), - RootCSRegister::pmpaddr31 => self.registers.pmpaddr31.write(value), - RootCSRegister::pmpaddr32 => self.registers.pmpaddr32.write(value), - RootCSRegister::pmpaddr33 => self.registers.pmpaddr33.write(value), - RootCSRegister::pmpaddr34 => self.registers.pmpaddr34.write(value), - RootCSRegister::pmpaddr35 => self.registers.pmpaddr35.write(value), - RootCSRegister::pmpaddr36 => self.registers.pmpaddr36.write(value), - RootCSRegister::pmpaddr37 => self.registers.pmpaddr37.write(value), - RootCSRegister::pmpaddr38 => self.registers.pmpaddr38.write(value), - RootCSRegister::pmpaddr39 => self.registers.pmpaddr39.write(value), - RootCSRegister::pmpaddr40 => self.registers.pmpaddr40.write(value), - RootCSRegister::pmpaddr41 => self.registers.pmpaddr41.write(value), - RootCSRegister::pmpaddr42 => self.registers.pmpaddr42.write(value), - RootCSRegister::pmpaddr43 => self.registers.pmpaddr43.write(value), - RootCSRegister::pmpaddr44 => self.registers.pmpaddr44.write(value), - RootCSRegister::pmpaddr45 => self.registers.pmpaddr45.write(value), - RootCSRegister::pmpaddr46 => self.registers.pmpaddr46.write(value), - RootCSRegister::pmpaddr47 => self.registers.pmpaddr47.write(value), - RootCSRegister::pmpaddr48 => self.registers.pmpaddr48.write(value), - RootCSRegister::pmpaddr49 => self.registers.pmpaddr49.write(value), - RootCSRegister::pmpaddr50 => self.registers.pmpaddr50.write(value), - RootCSRegister::pmpaddr51 => self.registers.pmpaddr51.write(value), - RootCSRegister::pmpaddr52 => self.registers.pmpaddr52.write(value), - RootCSRegister::pmpaddr53 => self.registers.pmpaddr53.write(value), - RootCSRegister::pmpaddr54 => self.registers.pmpaddr54.write(value), - RootCSRegister::pmpaddr55 => self.registers.pmpaddr55.write(value), - RootCSRegister::pmpaddr56 => self.registers.pmpaddr56.write(value), - RootCSRegister::pmpaddr57 => self.registers.pmpaddr57.write(value), - RootCSRegister::pmpaddr58 => self.registers.pmpaddr58.write(value), - RootCSRegister::pmpaddr59 => self.registers.pmpaddr59.write(value), - RootCSRegister::pmpaddr60 => self.registers.pmpaddr60.write(value), - RootCSRegister::pmpaddr61 => self.registers.pmpaddr61.write(value), - RootCSRegister::pmpaddr62 => self.registers.pmpaddr62.write(value), - RootCSRegister::pmpaddr63 => self.registers.pmpaddr63.write(value), - RootCSRegister::mhartid => self.registers.mhartid.write(value), - RootCSRegister::mvendorid => self.registers.mvendorid.write(value), - RootCSRegister::marchid => self.registers.marchid.write(value), - RootCSRegister::mimpid => self.registers.mimpid.write(value), - RootCSRegister::misa => self.registers.misa.write(value), - RootCSRegister::mscratch => self.registers.mscratch.write(value), - RootCSRegister::sscratch => self.registers.sscratch.write(value), - RootCSRegister::stvec => self.registers.stvec.write(value), - RootCSRegister::mtvec => self.registers.mtvec.write(value), - RootCSRegister::mie => self.registers.mie.write(value), - RootCSRegister::satp => self.registers.satp.write(value), - RootCSRegister::scause => self.registers.scause.write(value), - RootCSRegister::mcause => self.registers.mcause.write(value), - RootCSRegister::sepc => self.registers.sepc.write(value), - RootCSRegister::mepc => self.registers.mepc.write(value), - RootCSRegister::stval => self.registers.stval.write(value), - RootCSRegister::mtval => self.registers.mtval.write(value), - RootCSRegister::mtval2 => self.registers.mtval2.write(value), - RootCSRegister::mtinst => self.registers.mtinst.write(value), - RootCSRegister::senvcfg => self.registers.senvcfg.write(value), - RootCSRegister::menvcfg => self.registers.menvcfg.write(value), - RootCSRegister::mconfigptr => self.registers.mconfigptr.write(value), - RootCSRegister::medeleg => self.registers.medeleg.write(value), - RootCSRegister::mideleg => self.registers.mideleg.write(value), - RootCSRegister::mseccfg => self.registers.mseccfg.write(value), - RootCSRegister::scontext => self.registers.scontext.write(value), - RootCSRegister::hstatus => self.registers.hstatus.write(value), - RootCSRegister::hedeleg => self.registers.hedeleg.write(value), - RootCSRegister::hideleg => self.registers.hideleg.write(value), - RootCSRegister::hie => self.registers.hie.write(value), - RootCSRegister::hcounteren => self.registers.hcounteren.write(value), - RootCSRegister::hgeie => self.registers.hgeie.write(value), - RootCSRegister::htval => self.registers.htval.write(value), - RootCSRegister::hip => self.registers.hip.write(value), - RootCSRegister::hvip => self.registers.hvip.write(value), - RootCSRegister::htinst => self.registers.htinst.write(value), - RootCSRegister::hgeip => self.registers.hgeip.write(value), - RootCSRegister::henvcfg => self.registers.henvcfg.write(value), - RootCSRegister::hgatp => self.registers.hgatp.write(value), - RootCSRegister::hcontext => self.registers.hcontext.write(value), - RootCSRegister::htimedelta => self.registers.htimedelta.write(value), - RootCSRegister::vsstatus => self.registers.vsstatus.write(value), - RootCSRegister::vsie => self.registers.vsie.write(value), - RootCSRegister::vstvec => self.registers.vstvec.write(value), - RootCSRegister::vsscratch => self.registers.vsscratch.write(value), - RootCSRegister::vsepc => self.registers.vsepc.write(value), - RootCSRegister::vscause => self.registers.vscause.write(value), - RootCSRegister::vstval => self.registers.vstval.write(value), - RootCSRegister::vsip => self.registers.vsip.write(value), - RootCSRegister::vsatp => self.registers.vsatp.write(value), - RootCSRegister::tselect => self.registers.tselect.write(value), - RootCSRegister::tdata1 => self.registers.tdata1.write(value), - RootCSRegister::tdata2 => self.registers.tdata2.write(value), - RootCSRegister::tdata3 => self.registers.tdata3.write(value), - RootCSRegister::tcontrol => self.registers.tcontrol.write(value), - RootCSRegister::mcontext => self.registers.mcontext.write(value), - RootCSRegister::dcsr => self.registers.dcsr.write(value), - RootCSRegister::dpc => self.registers.dpc.write(value), - RootCSRegister::dscratch0 => self.registers.dscratch0.write(value), - RootCSRegister::dscratch1 => self.registers.dscratch1.write(value), - }; + let effect = self.registers.select_mut( + csr, + |mstatus| mstatus.write(value), + |mip| mip.write(value), + |raw| raw.write(value), + ); handle_csr_effect(self, effect); } + /// Perform a general replace of a CSR. #[inline(always)] pub(super) fn general_raw_replace(&mut self, csr: RootCSRegister, value: CSRRepr) -> CSRRepr where M: ManagerReadWrite, { - let (old_value, effect) = match csr { - RootCSRegister::mstatus => self.registers.mstatus.replace(value), - RootCSRegister::mip => self.registers.mip.replace(value), - RootCSRegister::mnscratch => self.registers.mnscratch.replace(value), - RootCSRegister::mnepc => self.registers.mnepc.replace(value), - RootCSRegister::mncause => self.registers.mncause.replace(value), - RootCSRegister::mnstatus => self.registers.mnstatus.replace(value), - RootCSRegister::cycle => self.registers.cycle.replace(value), - RootCSRegister::time => self.registers.time.replace(value), - RootCSRegister::instret => self.registers.instret.replace(value), - RootCSRegister::mcycle => self.registers.mcycle.replace(value), - RootCSRegister::minstret => self.registers.minstret.replace(value), - RootCSRegister::hpmcounter3 => self.registers.hpmcounter3.replace(value), - RootCSRegister::hpmcounter4 => self.registers.hpmcounter4.replace(value), - RootCSRegister::hpmcounter5 => self.registers.hpmcounter5.replace(value), - RootCSRegister::hpmcounter6 => self.registers.hpmcounter6.replace(value), - RootCSRegister::hpmcounter7 => self.registers.hpmcounter7.replace(value), - RootCSRegister::hpmcounter8 => self.registers.hpmcounter8.replace(value), - RootCSRegister::hpmcounter9 => self.registers.hpmcounter9.replace(value), - RootCSRegister::hpmcounter10 => self.registers.hpmcounter10.replace(value), - RootCSRegister::hpmcounter11 => self.registers.hpmcounter11.replace(value), - RootCSRegister::hpmcounter12 => self.registers.hpmcounter12.replace(value), - RootCSRegister::hpmcounter13 => self.registers.hpmcounter13.replace(value), - RootCSRegister::hpmcounter14 => self.registers.hpmcounter14.replace(value), - RootCSRegister::hpmcounter15 => self.registers.hpmcounter15.replace(value), - RootCSRegister::hpmcounter16 => self.registers.hpmcounter16.replace(value), - RootCSRegister::hpmcounter17 => self.registers.hpmcounter17.replace(value), - RootCSRegister::hpmcounter18 => self.registers.hpmcounter18.replace(value), - RootCSRegister::hpmcounter19 => self.registers.hpmcounter19.replace(value), - RootCSRegister::hpmcounter20 => self.registers.hpmcounter20.replace(value), - RootCSRegister::hpmcounter21 => self.registers.hpmcounter21.replace(value), - RootCSRegister::hpmcounter22 => self.registers.hpmcounter22.replace(value), - RootCSRegister::hpmcounter23 => self.registers.hpmcounter23.replace(value), - RootCSRegister::hpmcounter24 => self.registers.hpmcounter24.replace(value), - RootCSRegister::hpmcounter25 => self.registers.hpmcounter25.replace(value), - RootCSRegister::hpmcounter26 => self.registers.hpmcounter26.replace(value), - RootCSRegister::hpmcounter27 => self.registers.hpmcounter27.replace(value), - RootCSRegister::hpmcounter28 => self.registers.hpmcounter28.replace(value), - RootCSRegister::hpmcounter29 => self.registers.hpmcounter29.replace(value), - RootCSRegister::hpmcounter30 => self.registers.hpmcounter30.replace(value), - RootCSRegister::hpmcounter31 => self.registers.hpmcounter31.replace(value), - RootCSRegister::mhpmcounter3 => self.registers.mhpmcounter3.replace(value), - RootCSRegister::mhpmcounter4 => self.registers.mhpmcounter4.replace(value), - RootCSRegister::mhpmcounter5 => self.registers.mhpmcounter5.replace(value), - RootCSRegister::mhpmcounter6 => self.registers.mhpmcounter6.replace(value), - RootCSRegister::mhpmcounter7 => self.registers.mhpmcounter7.replace(value), - RootCSRegister::mhpmcounter8 => self.registers.mhpmcounter8.replace(value), - RootCSRegister::mhpmcounter9 => self.registers.mhpmcounter9.replace(value), - RootCSRegister::mhpmcounter10 => self.registers.mhpmcounter10.replace(value), - RootCSRegister::mhpmcounter11 => self.registers.mhpmcounter11.replace(value), - RootCSRegister::mhpmcounter12 => self.registers.mhpmcounter12.replace(value), - RootCSRegister::mhpmcounter13 => self.registers.mhpmcounter13.replace(value), - RootCSRegister::mhpmcounter14 => self.registers.mhpmcounter14.replace(value), - RootCSRegister::mhpmcounter15 => self.registers.mhpmcounter15.replace(value), - RootCSRegister::mhpmcounter16 => self.registers.mhpmcounter16.replace(value), - RootCSRegister::mhpmcounter17 => self.registers.mhpmcounter17.replace(value), - RootCSRegister::mhpmcounter18 => self.registers.mhpmcounter18.replace(value), - RootCSRegister::mhpmcounter19 => self.registers.mhpmcounter19.replace(value), - RootCSRegister::mhpmcounter20 => self.registers.mhpmcounter20.replace(value), - RootCSRegister::mhpmcounter21 => self.registers.mhpmcounter21.replace(value), - RootCSRegister::mhpmcounter22 => self.registers.mhpmcounter22.replace(value), - RootCSRegister::mhpmcounter23 => self.registers.mhpmcounter23.replace(value), - RootCSRegister::mhpmcounter24 => self.registers.mhpmcounter24.replace(value), - RootCSRegister::mhpmcounter25 => self.registers.mhpmcounter25.replace(value), - RootCSRegister::mhpmcounter26 => self.registers.mhpmcounter26.replace(value), - RootCSRegister::mhpmcounter27 => self.registers.mhpmcounter27.replace(value), - RootCSRegister::mhpmcounter28 => self.registers.mhpmcounter28.replace(value), - RootCSRegister::mhpmcounter29 => self.registers.mhpmcounter29.replace(value), - RootCSRegister::mhpmcounter30 => self.registers.mhpmcounter30.replace(value), - RootCSRegister::mhpmcounter31 => self.registers.mhpmcounter31.replace(value), - RootCSRegister::mhpmevent3 => self.registers.mhpmevent3.replace(value), - RootCSRegister::mhpmevent4 => self.registers.mhpmevent4.replace(value), - RootCSRegister::mhpmevent5 => self.registers.mhpmevent5.replace(value), - RootCSRegister::mhpmevent6 => self.registers.mhpmevent6.replace(value), - RootCSRegister::mhpmevent7 => self.registers.mhpmevent7.replace(value), - RootCSRegister::mhpmevent8 => self.registers.mhpmevent8.replace(value), - RootCSRegister::mhpmevent9 => self.registers.mhpmevent9.replace(value), - RootCSRegister::mhpmevent10 => self.registers.mhpmevent10.replace(value), - RootCSRegister::mhpmevent11 => self.registers.mhpmevent11.replace(value), - RootCSRegister::mhpmevent12 => self.registers.mhpmevent12.replace(value), - RootCSRegister::mhpmevent13 => self.registers.mhpmevent13.replace(value), - RootCSRegister::mhpmevent14 => self.registers.mhpmevent14.replace(value), - RootCSRegister::mhpmevent15 => self.registers.mhpmevent15.replace(value), - RootCSRegister::mhpmevent16 => self.registers.mhpmevent16.replace(value), - RootCSRegister::mhpmevent17 => self.registers.mhpmevent17.replace(value), - RootCSRegister::mhpmevent18 => self.registers.mhpmevent18.replace(value), - RootCSRegister::mhpmevent19 => self.registers.mhpmevent19.replace(value), - RootCSRegister::mhpmevent20 => self.registers.mhpmevent20.replace(value), - RootCSRegister::mhpmevent21 => self.registers.mhpmevent21.replace(value), - RootCSRegister::mhpmevent22 => self.registers.mhpmevent22.replace(value), - RootCSRegister::mhpmevent23 => self.registers.mhpmevent23.replace(value), - RootCSRegister::mhpmevent24 => self.registers.mhpmevent24.replace(value), - RootCSRegister::mhpmevent25 => self.registers.mhpmevent25.replace(value), - RootCSRegister::mhpmevent26 => self.registers.mhpmevent26.replace(value), - RootCSRegister::mhpmevent27 => self.registers.mhpmevent27.replace(value), - RootCSRegister::mhpmevent28 => self.registers.mhpmevent28.replace(value), - RootCSRegister::mhpmevent29 => self.registers.mhpmevent29.replace(value), - RootCSRegister::mhpmevent30 => self.registers.mhpmevent30.replace(value), - RootCSRegister::mhpmevent31 => self.registers.mhpmevent31.replace(value), - RootCSRegister::mcountinhibit => self.registers.mcountinhibit.replace(value), - RootCSRegister::scounteren => self.registers.scounteren.replace(value), - RootCSRegister::mcounteren => self.registers.mcounteren.replace(value), - RootCSRegister::fcsr => self.registers.fcsr.replace(value), - RootCSRegister::pmpcfg0 => self.registers.pmpcfg0.replace(value), - RootCSRegister::pmpcfg2 => self.registers.pmpcfg2.replace(value), - RootCSRegister::pmpcfg4 => self.registers.pmpcfg4.replace(value), - RootCSRegister::pmpcfg6 => self.registers.pmpcfg6.replace(value), - RootCSRegister::pmpcfg8 => self.registers.pmpcfg8.replace(value), - RootCSRegister::pmpcfg10 => self.registers.pmpcfg10.replace(value), - RootCSRegister::pmpcfg12 => self.registers.pmpcfg12.replace(value), - RootCSRegister::pmpcfg14 => self.registers.pmpcfg14.replace(value), - RootCSRegister::pmpaddr0 => self.registers.pmpaddr0.replace(value), - RootCSRegister::pmpaddr1 => self.registers.pmpaddr1.replace(value), - RootCSRegister::pmpaddr2 => self.registers.pmpaddr2.replace(value), - RootCSRegister::pmpaddr3 => self.registers.pmpaddr3.replace(value), - RootCSRegister::pmpaddr4 => self.registers.pmpaddr4.replace(value), - RootCSRegister::pmpaddr5 => self.registers.pmpaddr5.replace(value), - RootCSRegister::pmpaddr6 => self.registers.pmpaddr6.replace(value), - RootCSRegister::pmpaddr7 => self.registers.pmpaddr7.replace(value), - RootCSRegister::pmpaddr8 => self.registers.pmpaddr8.replace(value), - RootCSRegister::pmpaddr9 => self.registers.pmpaddr9.replace(value), - RootCSRegister::pmpaddr10 => self.registers.pmpaddr10.replace(value), - RootCSRegister::pmpaddr11 => self.registers.pmpaddr11.replace(value), - RootCSRegister::pmpaddr12 => self.registers.pmpaddr12.replace(value), - RootCSRegister::pmpaddr13 => self.registers.pmpaddr13.replace(value), - RootCSRegister::pmpaddr14 => self.registers.pmpaddr14.replace(value), - RootCSRegister::pmpaddr15 => self.registers.pmpaddr15.replace(value), - RootCSRegister::pmpaddr16 => self.registers.pmpaddr16.replace(value), - RootCSRegister::pmpaddr17 => self.registers.pmpaddr17.replace(value), - RootCSRegister::pmpaddr18 => self.registers.pmpaddr18.replace(value), - RootCSRegister::pmpaddr19 => self.registers.pmpaddr19.replace(value), - RootCSRegister::pmpaddr20 => self.registers.pmpaddr20.replace(value), - RootCSRegister::pmpaddr21 => self.registers.pmpaddr21.replace(value), - RootCSRegister::pmpaddr22 => self.registers.pmpaddr22.replace(value), - RootCSRegister::pmpaddr23 => self.registers.pmpaddr23.replace(value), - RootCSRegister::pmpaddr24 => self.registers.pmpaddr24.replace(value), - RootCSRegister::pmpaddr25 => self.registers.pmpaddr25.replace(value), - RootCSRegister::pmpaddr26 => self.registers.pmpaddr26.replace(value), - RootCSRegister::pmpaddr27 => self.registers.pmpaddr27.replace(value), - RootCSRegister::pmpaddr28 => self.registers.pmpaddr28.replace(value), - RootCSRegister::pmpaddr29 => self.registers.pmpaddr29.replace(value), - RootCSRegister::pmpaddr30 => self.registers.pmpaddr30.replace(value), - RootCSRegister::pmpaddr31 => self.registers.pmpaddr31.replace(value), - RootCSRegister::pmpaddr32 => self.registers.pmpaddr32.replace(value), - RootCSRegister::pmpaddr33 => self.registers.pmpaddr33.replace(value), - RootCSRegister::pmpaddr34 => self.registers.pmpaddr34.replace(value), - RootCSRegister::pmpaddr35 => self.registers.pmpaddr35.replace(value), - RootCSRegister::pmpaddr36 => self.registers.pmpaddr36.replace(value), - RootCSRegister::pmpaddr37 => self.registers.pmpaddr37.replace(value), - RootCSRegister::pmpaddr38 => self.registers.pmpaddr38.replace(value), - RootCSRegister::pmpaddr39 => self.registers.pmpaddr39.replace(value), - RootCSRegister::pmpaddr40 => self.registers.pmpaddr40.replace(value), - RootCSRegister::pmpaddr41 => self.registers.pmpaddr41.replace(value), - RootCSRegister::pmpaddr42 => self.registers.pmpaddr42.replace(value), - RootCSRegister::pmpaddr43 => self.registers.pmpaddr43.replace(value), - RootCSRegister::pmpaddr44 => self.registers.pmpaddr44.replace(value), - RootCSRegister::pmpaddr45 => self.registers.pmpaddr45.replace(value), - RootCSRegister::pmpaddr46 => self.registers.pmpaddr46.replace(value), - RootCSRegister::pmpaddr47 => self.registers.pmpaddr47.replace(value), - RootCSRegister::pmpaddr48 => self.registers.pmpaddr48.replace(value), - RootCSRegister::pmpaddr49 => self.registers.pmpaddr49.replace(value), - RootCSRegister::pmpaddr50 => self.registers.pmpaddr50.replace(value), - RootCSRegister::pmpaddr51 => self.registers.pmpaddr51.replace(value), - RootCSRegister::pmpaddr52 => self.registers.pmpaddr52.replace(value), - RootCSRegister::pmpaddr53 => self.registers.pmpaddr53.replace(value), - RootCSRegister::pmpaddr54 => self.registers.pmpaddr54.replace(value), - RootCSRegister::pmpaddr55 => self.registers.pmpaddr55.replace(value), - RootCSRegister::pmpaddr56 => self.registers.pmpaddr56.replace(value), - RootCSRegister::pmpaddr57 => self.registers.pmpaddr57.replace(value), - RootCSRegister::pmpaddr58 => self.registers.pmpaddr58.replace(value), - RootCSRegister::pmpaddr59 => self.registers.pmpaddr59.replace(value), - RootCSRegister::pmpaddr60 => self.registers.pmpaddr60.replace(value), - RootCSRegister::pmpaddr61 => self.registers.pmpaddr61.replace(value), - RootCSRegister::pmpaddr62 => self.registers.pmpaddr62.replace(value), - RootCSRegister::pmpaddr63 => self.registers.pmpaddr63.replace(value), - RootCSRegister::mhartid => self.registers.mhartid.replace(value), - RootCSRegister::mvendorid => self.registers.mvendorid.replace(value), - RootCSRegister::marchid => self.registers.marchid.replace(value), - RootCSRegister::mimpid => self.registers.mimpid.replace(value), - RootCSRegister::misa => self.registers.misa.replace(value), - RootCSRegister::mscratch => self.registers.mscratch.replace(value), - RootCSRegister::sscratch => self.registers.sscratch.replace(value), - RootCSRegister::stvec => self.registers.stvec.replace(value), - RootCSRegister::mtvec => self.registers.mtvec.replace(value), - RootCSRegister::mie => self.registers.mie.replace(value), - RootCSRegister::satp => self.registers.satp.replace(value), - RootCSRegister::scause => self.registers.scause.replace(value), - RootCSRegister::mcause => self.registers.mcause.replace(value), - RootCSRegister::sepc => self.registers.sepc.replace(value), - RootCSRegister::mepc => self.registers.mepc.replace(value), - RootCSRegister::stval => self.registers.stval.replace(value), - RootCSRegister::mtval => self.registers.mtval.replace(value), - RootCSRegister::mtval2 => self.registers.mtval2.replace(value), - RootCSRegister::mtinst => self.registers.mtinst.replace(value), - RootCSRegister::senvcfg => self.registers.senvcfg.replace(value), - RootCSRegister::menvcfg => self.registers.menvcfg.replace(value), - RootCSRegister::mconfigptr => self.registers.mconfigptr.replace(value), - RootCSRegister::medeleg => self.registers.medeleg.replace(value), - RootCSRegister::mideleg => self.registers.mideleg.replace(value), - RootCSRegister::mseccfg => self.registers.mseccfg.replace(value), - RootCSRegister::scontext => self.registers.scontext.replace(value), - RootCSRegister::hstatus => self.registers.hstatus.replace(value), - RootCSRegister::hedeleg => self.registers.hedeleg.replace(value), - RootCSRegister::hideleg => self.registers.hideleg.replace(value), - RootCSRegister::hie => self.registers.hie.replace(value), - RootCSRegister::hcounteren => self.registers.hcounteren.replace(value), - RootCSRegister::hgeie => self.registers.hgeie.replace(value), - RootCSRegister::htval => self.registers.htval.replace(value), - RootCSRegister::hip => self.registers.hip.replace(value), - RootCSRegister::hvip => self.registers.hvip.replace(value), - RootCSRegister::htinst => self.registers.htinst.replace(value), - RootCSRegister::hgeip => self.registers.hgeip.replace(value), - RootCSRegister::henvcfg => self.registers.henvcfg.replace(value), - RootCSRegister::hgatp => self.registers.hgatp.replace(value), - RootCSRegister::hcontext => self.registers.hcontext.replace(value), - RootCSRegister::htimedelta => self.registers.htimedelta.replace(value), - RootCSRegister::vsstatus => self.registers.vsstatus.replace(value), - RootCSRegister::vsie => self.registers.vsie.replace(value), - RootCSRegister::vstvec => self.registers.vstvec.replace(value), - RootCSRegister::vsscratch => self.registers.vsscratch.replace(value), - RootCSRegister::vsepc => self.registers.vsepc.replace(value), - RootCSRegister::vscause => self.registers.vscause.replace(value), - RootCSRegister::vstval => self.registers.vstval.replace(value), - RootCSRegister::vsip => self.registers.vsip.replace(value), - RootCSRegister::vsatp => self.registers.vsatp.replace(value), - RootCSRegister::tselect => self.registers.tselect.replace(value), - RootCSRegister::tdata1 => self.registers.tdata1.replace(value), - RootCSRegister::tdata2 => self.registers.tdata2.replace(value), - RootCSRegister::tdata3 => self.registers.tdata3.replace(value), - RootCSRegister::tcontrol => self.registers.tcontrol.replace(value), - RootCSRegister::mcontext => self.registers.mcontext.replace(value), - RootCSRegister::dcsr => self.registers.dcsr.replace(value), - RootCSRegister::dpc => self.registers.dpc.replace(value), - RootCSRegister::dscratch0 => self.registers.dscratch0.replace(value), - RootCSRegister::dscratch1 => self.registers.dscratch1.replace(value), - }; + let (old_value, effect) = self.registers.select_mut( + csr, + |mstatus| mstatus.replace(value), + |mip| mip.replace(value), + |raw| raw.replace(value), + ); handle_csr_effect(self, effect); @@ -1280,1197 +117,1054 @@ impl CSRegisters { } } -pub struct CSRValuesLayout { - _mstatus: MStatusLayout, - _mnscratch: EffectCSRLayout, - _mnepc: EffectCSRLayout, - _mncause: EffectCSRLayout, - _mnstatus: EffectCSRLayout, - _cycle: EffectCSRLayout, - _time: EffectCSRLayout, - _instret: EffectCSRLayout, - _mcycle: EffectCSRLayout, - _minstret: EffectCSRLayout, - _hpmcounter3: EffectCSRLayout, - _hpmcounter4: EffectCSRLayout, - _hpmcounter5: EffectCSRLayout, - _hpmcounter6: EffectCSRLayout, - _hpmcounter7: EffectCSRLayout, - _hpmcounter8: EffectCSRLayout, - _hpmcounter9: EffectCSRLayout, - _hpmcounter10: EffectCSRLayout, - _hpmcounter11: EffectCSRLayout, - _hpmcounter12: EffectCSRLayout, - _hpmcounter13: EffectCSRLayout, - _hpmcounter14: EffectCSRLayout, - _hpmcounter15: EffectCSRLayout, - _hpmcounter16: EffectCSRLayout, - _hpmcounter17: EffectCSRLayout, - _hpmcounter18: EffectCSRLayout, - _hpmcounter19: EffectCSRLayout, - _hpmcounter20: EffectCSRLayout, - _hpmcounter21: EffectCSRLayout, - _hpmcounter22: EffectCSRLayout, - _hpmcounter23: EffectCSRLayout, - _hpmcounter24: EffectCSRLayout, - _hpmcounter25: EffectCSRLayout, - _hpmcounter26: EffectCSRLayout, - _hpmcounter27: EffectCSRLayout, - _hpmcounter28: EffectCSRLayout, - _hpmcounter29: EffectCSRLayout, - _hpmcounter30: EffectCSRLayout, - _hpmcounter31: EffectCSRLayout, - _mhpmcounter3: EffectCSRLayout, - _mhpmcounter4: EffectCSRLayout, - _mhpmcounter5: EffectCSRLayout, - _mhpmcounter6: EffectCSRLayout, - _mhpmcounter7: EffectCSRLayout, - _mhpmcounter8: EffectCSRLayout, - _mhpmcounter9: EffectCSRLayout, - _mhpmcounter10: EffectCSRLayout, - _mhpmcounter11: EffectCSRLayout, - _mhpmcounter12: EffectCSRLayout, - _mhpmcounter13: EffectCSRLayout, - _mhpmcounter14: EffectCSRLayout, - _mhpmcounter15: EffectCSRLayout, - _mhpmcounter16: EffectCSRLayout, - _mhpmcounter17: EffectCSRLayout, - _mhpmcounter18: EffectCSRLayout, - _mhpmcounter19: EffectCSRLayout, - _mhpmcounter20: EffectCSRLayout, - _mhpmcounter21: EffectCSRLayout, - _mhpmcounter22: EffectCSRLayout, - _mhpmcounter23: EffectCSRLayout, - _mhpmcounter24: EffectCSRLayout, - _mhpmcounter25: EffectCSRLayout, - _mhpmcounter26: EffectCSRLayout, - _mhpmcounter27: EffectCSRLayout, - _mhpmcounter28: EffectCSRLayout, - _mhpmcounter29: EffectCSRLayout, - _mhpmcounter30: EffectCSRLayout, - _mhpmcounter31: EffectCSRLayout, - _mhpmevent3: EffectCSRLayout, - _mhpmevent4: EffectCSRLayout, - _mhpmevent5: EffectCSRLayout, - _mhpmevent6: EffectCSRLayout, - _mhpmevent7: EffectCSRLayout, - _mhpmevent8: EffectCSRLayout, - _mhpmevent9: EffectCSRLayout, - _mhpmevent10: EffectCSRLayout, - _mhpmevent11: EffectCSRLayout, - _mhpmevent12: EffectCSRLayout, - _mhpmevent13: EffectCSRLayout, - _mhpmevent14: EffectCSRLayout, - _mhpmevent15: EffectCSRLayout, - _mhpmevent16: EffectCSRLayout, - _mhpmevent17: EffectCSRLayout, - _mhpmevent18: EffectCSRLayout, - _mhpmevent19: EffectCSRLayout, - _mhpmevent20: EffectCSRLayout, - _mhpmevent21: EffectCSRLayout, - _mhpmevent22: EffectCSRLayout, - _mhpmevent23: EffectCSRLayout, - _mhpmevent24: EffectCSRLayout, - _mhpmevent25: EffectCSRLayout, - _mhpmevent26: EffectCSRLayout, - _mhpmevent27: EffectCSRLayout, - _mhpmevent28: EffectCSRLayout, - _mhpmevent29: EffectCSRLayout, - _mhpmevent30: EffectCSRLayout, - _mhpmevent31: EffectCSRLayout, - _mcountinhibit: EffectCSRLayout, - _scounteren: EffectCSRLayout, - _mcounteren: EffectCSRLayout, - _fcsr: EffectCSRLayout, - _pmpcfg0: EffectCSRLayout, - _pmpcfg2: EffectCSRLayout, - _pmpcfg4: EffectCSRLayout, - _pmpcfg6: EffectCSRLayout, - _pmpcfg8: EffectCSRLayout, - _pmpcfg10: EffectCSRLayout, - _pmpcfg12: EffectCSRLayout, - _pmpcfg14: EffectCSRLayout, - _pmpaddr0: EffectCSRLayout, - _pmpaddr1: EffectCSRLayout, - _pmpaddr2: EffectCSRLayout, - _pmpaddr3: EffectCSRLayout, - _pmpaddr4: EffectCSRLayout, - _pmpaddr5: EffectCSRLayout, - _pmpaddr6: EffectCSRLayout, - _pmpaddr7: EffectCSRLayout, - _pmpaddr8: EffectCSRLayout, - _pmpaddr9: EffectCSRLayout, - _pmpaddr10: EffectCSRLayout, - _pmpaddr11: EffectCSRLayout, - _pmpaddr12: EffectCSRLayout, - _pmpaddr13: EffectCSRLayout, - _pmpaddr14: EffectCSRLayout, - _pmpaddr15: EffectCSRLayout, - _pmpaddr16: EffectCSRLayout, - _pmpaddr17: EffectCSRLayout, - _pmpaddr18: EffectCSRLayout, - _pmpaddr19: EffectCSRLayout, - _pmpaddr20: EffectCSRLayout, - _pmpaddr21: EffectCSRLayout, - _pmpaddr22: EffectCSRLayout, - _pmpaddr23: EffectCSRLayout, - _pmpaddr24: EffectCSRLayout, - _pmpaddr25: EffectCSRLayout, - _pmpaddr26: EffectCSRLayout, - _pmpaddr27: EffectCSRLayout, - _pmpaddr28: EffectCSRLayout, - _pmpaddr29: EffectCSRLayout, - _pmpaddr30: EffectCSRLayout, - _pmpaddr31: EffectCSRLayout, - _pmpaddr32: EffectCSRLayout, - _pmpaddr33: EffectCSRLayout, - _pmpaddr34: EffectCSRLayout, - _pmpaddr35: EffectCSRLayout, - _pmpaddr36: EffectCSRLayout, - _pmpaddr37: EffectCSRLayout, - _pmpaddr38: EffectCSRLayout, - _pmpaddr39: EffectCSRLayout, - _pmpaddr40: EffectCSRLayout, - _pmpaddr41: EffectCSRLayout, - _pmpaddr42: EffectCSRLayout, - _pmpaddr43: EffectCSRLayout, - _pmpaddr44: EffectCSRLayout, - _pmpaddr45: EffectCSRLayout, - _pmpaddr46: EffectCSRLayout, - _pmpaddr47: EffectCSRLayout, - _pmpaddr48: EffectCSRLayout, - _pmpaddr49: EffectCSRLayout, - _pmpaddr50: EffectCSRLayout, - _pmpaddr51: EffectCSRLayout, - _pmpaddr52: EffectCSRLayout, - _pmpaddr53: EffectCSRLayout, - _pmpaddr54: EffectCSRLayout, - _pmpaddr55: EffectCSRLayout, - _pmpaddr56: EffectCSRLayout, - _pmpaddr57: EffectCSRLayout, - _pmpaddr58: EffectCSRLayout, - _pmpaddr59: EffectCSRLayout, - _pmpaddr60: EffectCSRLayout, - _pmpaddr61: EffectCSRLayout, - _pmpaddr62: EffectCSRLayout, - _pmpaddr63: EffectCSRLayout, - _mhartid: EffectCSRLayout, - _mvendorid: EffectCSRLayout, - _marchid: EffectCSRLayout, - _mimpid: EffectCSRLayout, - _misa: EffectCSRLayout, - _mscratch: EffectCSRLayout, - _sscratch: EffectCSRLayout, - _stvec: EffectCSRLayout, - _mtvec: EffectCSRLayout, - _mie: EffectCSRLayout, - _satp: EffectCSRLayout, - _scause: EffectCSRLayout, - _mcause: EffectCSRLayout, - _sepc: EffectCSRLayout, - _mepc: EffectCSRLayout, - _stval: EffectCSRLayout, - _mtval: EffectCSRLayout, - _mtval2: EffectCSRLayout, - _mip: EffectCSRLayout, - _mtinst: EffectCSRLayout, - _senvcfg: EffectCSRLayout, - _menvcfg: EffectCSRLayout, - _mconfigptr: EffectCSRLayout, - _medeleg: EffectCSRLayout, - _mideleg: EffectCSRLayout, - _mseccfg: EffectCSRLayout, - _scontext: EffectCSRLayout, - _hstatus: EffectCSRLayout, - _hedeleg: EffectCSRLayout, - _hideleg: EffectCSRLayout, - _hie: EffectCSRLayout, - _hcounteren: EffectCSRLayout, - _hgeie: EffectCSRLayout, - _htval: EffectCSRLayout, - _hip: EffectCSRLayout, - _hvip: EffectCSRLayout, - _htinst: EffectCSRLayout, - _hgeip: EffectCSRLayout, - _henvcfg: EffectCSRLayout, - _hgatp: EffectCSRLayout, - _hcontext: EffectCSRLayout, - _htimedelta: EffectCSRLayout, - _vsstatus: EffectCSRLayout, - _vsie: EffectCSRLayout, - _vstvec: EffectCSRLayout, - _vsscratch: EffectCSRLayout, - _vsepc: EffectCSRLayout, - _vscause: EffectCSRLayout, - _vstval: EffectCSRLayout, - _vsip: EffectCSRLayout, - _vsatp: EffectCSRLayout, - _tselect: EffectCSRLayout, - _tdata1: EffectCSRLayout, - _tdata2: EffectCSRLayout, - _tdata3: EffectCSRLayout, - _tcontrol: EffectCSRLayout, - _mcontext: EffectCSRLayout, - _dcsr: EffectCSRLayout, - _dpc: EffectCSRLayout, - _dscratch0: EffectCSRLayout, - _dscratch1: EffectCSRLayout, -} +/// Layout for the values of CSRs +pub struct CSRValuesLayout; + +impl Layout for CSRValuesLayout { + type Placed = CSRValuesF< + PlacedOf>, + PlacedOf, + PlacedOf>, + >; + + type Allocated = CSRValuesF< + AllocatedOf, M>, + AllocatedOf, + AllocatedOf, M>, + >; -pub struct CSRValuesPlaced { - mstatus: PlacedOf, - mnscratch: PlacedOf, - mnepc: PlacedOf, - mncause: PlacedOf, - mnstatus: PlacedOf, - cycle: PlacedOf, - time: PlacedOf, - instret: PlacedOf, - mcycle: PlacedOf, - minstret: PlacedOf, - hpmcounter3: PlacedOf, - hpmcounter4: PlacedOf, - hpmcounter5: PlacedOf, - hpmcounter6: PlacedOf, - hpmcounter7: PlacedOf, - hpmcounter8: PlacedOf, - hpmcounter9: PlacedOf, - hpmcounter10: PlacedOf, - hpmcounter11: PlacedOf, - hpmcounter12: PlacedOf, - hpmcounter13: PlacedOf, - hpmcounter14: PlacedOf, - hpmcounter15: PlacedOf, - hpmcounter16: PlacedOf, - hpmcounter17: PlacedOf, - hpmcounter18: PlacedOf, - hpmcounter19: PlacedOf, - hpmcounter20: PlacedOf, - hpmcounter21: PlacedOf, - hpmcounter22: PlacedOf, - hpmcounter23: PlacedOf, - hpmcounter24: PlacedOf, - hpmcounter25: PlacedOf, - hpmcounter26: PlacedOf, - hpmcounter27: PlacedOf, - hpmcounter28: PlacedOf, - hpmcounter29: PlacedOf, - hpmcounter30: PlacedOf, - hpmcounter31: PlacedOf, - mhpmcounter3: PlacedOf, - mhpmcounter4: PlacedOf, - mhpmcounter5: PlacedOf, - mhpmcounter6: PlacedOf, - mhpmcounter7: PlacedOf, - mhpmcounter8: PlacedOf, - mhpmcounter9: PlacedOf, - mhpmcounter10: PlacedOf, - mhpmcounter11: PlacedOf, - mhpmcounter12: PlacedOf, - mhpmcounter13: PlacedOf, - mhpmcounter14: PlacedOf, - mhpmcounter15: PlacedOf, - mhpmcounter16: PlacedOf, - mhpmcounter17: PlacedOf, - mhpmcounter18: PlacedOf, - mhpmcounter19: PlacedOf, - mhpmcounter20: PlacedOf, - mhpmcounter21: PlacedOf, - mhpmcounter22: PlacedOf, - mhpmcounter23: PlacedOf, - mhpmcounter24: PlacedOf, - mhpmcounter25: PlacedOf, - mhpmcounter26: PlacedOf, - mhpmcounter27: PlacedOf, - mhpmcounter28: PlacedOf, - mhpmcounter29: PlacedOf, - mhpmcounter30: PlacedOf, - mhpmcounter31: PlacedOf, - mhpmevent3: PlacedOf, - mhpmevent4: PlacedOf, - mhpmevent5: PlacedOf, - mhpmevent6: PlacedOf, - mhpmevent7: PlacedOf, - mhpmevent8: PlacedOf, - mhpmevent9: PlacedOf, - mhpmevent10: PlacedOf, - mhpmevent11: PlacedOf, - mhpmevent12: PlacedOf, - mhpmevent13: PlacedOf, - mhpmevent14: PlacedOf, - mhpmevent15: PlacedOf, - mhpmevent16: PlacedOf, - mhpmevent17: PlacedOf, - mhpmevent18: PlacedOf, - mhpmevent19: PlacedOf, - mhpmevent20: PlacedOf, - mhpmevent21: PlacedOf, - mhpmevent22: PlacedOf, - mhpmevent23: PlacedOf, - mhpmevent24: PlacedOf, - mhpmevent25: PlacedOf, - mhpmevent26: PlacedOf, - mhpmevent27: PlacedOf, - mhpmevent28: PlacedOf, - mhpmevent29: PlacedOf, - mhpmevent30: PlacedOf, - mhpmevent31: PlacedOf, - mcountinhibit: PlacedOf, - scounteren: PlacedOf, - mcounteren: PlacedOf, - fcsr: PlacedOf, - pmpcfg0: PlacedOf, - pmpcfg2: PlacedOf, - pmpcfg4: PlacedOf, - pmpcfg6: PlacedOf, - pmpcfg8: PlacedOf, - pmpcfg10: PlacedOf, - pmpcfg12: PlacedOf, - pmpcfg14: PlacedOf, - pmpaddr0: PlacedOf, - pmpaddr1: PlacedOf, - pmpaddr2: PlacedOf, - pmpaddr3: PlacedOf, - pmpaddr4: PlacedOf, - pmpaddr5: PlacedOf, - pmpaddr6: PlacedOf, - pmpaddr7: PlacedOf, - pmpaddr8: PlacedOf, - pmpaddr9: PlacedOf, - pmpaddr10: PlacedOf, - pmpaddr11: PlacedOf, - pmpaddr12: PlacedOf, - pmpaddr13: PlacedOf, - pmpaddr14: PlacedOf, - pmpaddr15: PlacedOf, - pmpaddr16: PlacedOf, - pmpaddr17: PlacedOf, - pmpaddr18: PlacedOf, - pmpaddr19: PlacedOf, - pmpaddr20: PlacedOf, - pmpaddr21: PlacedOf, - pmpaddr22: PlacedOf, - pmpaddr23: PlacedOf, - pmpaddr24: PlacedOf, - pmpaddr25: PlacedOf, - pmpaddr26: PlacedOf, - pmpaddr27: PlacedOf, - pmpaddr28: PlacedOf, - pmpaddr29: PlacedOf, - pmpaddr30: PlacedOf, - pmpaddr31: PlacedOf, - pmpaddr32: PlacedOf, - pmpaddr33: PlacedOf, - pmpaddr34: PlacedOf, - pmpaddr35: PlacedOf, - pmpaddr36: PlacedOf, - pmpaddr37: PlacedOf, - pmpaddr38: PlacedOf, - pmpaddr39: PlacedOf, - pmpaddr40: PlacedOf, - pmpaddr41: PlacedOf, - pmpaddr42: PlacedOf, - pmpaddr43: PlacedOf, - pmpaddr44: PlacedOf, - pmpaddr45: PlacedOf, - pmpaddr46: PlacedOf, - pmpaddr47: PlacedOf, - pmpaddr48: PlacedOf, - pmpaddr49: PlacedOf, - pmpaddr50: PlacedOf, - pmpaddr51: PlacedOf, - pmpaddr52: PlacedOf, - pmpaddr53: PlacedOf, - pmpaddr54: PlacedOf, - pmpaddr55: PlacedOf, - pmpaddr56: PlacedOf, - pmpaddr57: PlacedOf, - pmpaddr58: PlacedOf, - pmpaddr59: PlacedOf, - pmpaddr60: PlacedOf, - pmpaddr61: PlacedOf, - pmpaddr62: PlacedOf, - pmpaddr63: PlacedOf, - mhartid: PlacedOf, - mvendorid: PlacedOf, - marchid: PlacedOf, - mimpid: PlacedOf, - misa: PlacedOf, - mscratch: PlacedOf, - sscratch: PlacedOf, - stvec: PlacedOf, - mtvec: PlacedOf, - mie: PlacedOf, - satp: PlacedOf, - scause: PlacedOf, - mcause: PlacedOf, - sepc: PlacedOf, - mepc: PlacedOf, - stval: PlacedOf, - mtval: PlacedOf, - mtval2: PlacedOf, - mip: PlacedOf, - mtinst: PlacedOf, - senvcfg: PlacedOf, - menvcfg: PlacedOf, - mconfigptr: PlacedOf, - medeleg: PlacedOf, - mideleg: PlacedOf, - mseccfg: PlacedOf, - scontext: PlacedOf, - hstatus: PlacedOf, - hedeleg: PlacedOf, - hideleg: PlacedOf, - hie: PlacedOf, - hcounteren: PlacedOf, - hgeie: PlacedOf, - htval: PlacedOf, - hip: PlacedOf, - hvip: PlacedOf, - htinst: PlacedOf, - hgeip: PlacedOf, - henvcfg: PlacedOf, - hgatp: PlacedOf, - hcontext: PlacedOf, - htimedelta: PlacedOf, - vsstatus: PlacedOf, - vsie: PlacedOf, - vstvec: PlacedOf, - vsscratch: PlacedOf, - vsepc: PlacedOf, - vscause: PlacedOf, - vstval: PlacedOf, - vsip: PlacedOf, - vsatp: PlacedOf, - tselect: PlacedOf, - tdata1: PlacedOf, - tdata2: PlacedOf, - tdata3: PlacedOf, - tcontrol: PlacedOf, - mcontext: PlacedOf, - dcsr: PlacedOf, - dpc: PlacedOf, - dscratch0: PlacedOf, - dscratch1: PlacedOf, + fn place_with(alloc: &mut Choreographer) -> Self::Placed { + let alloc = std::cell::RefCell::new(alloc); + Self::Placed::new( + || MStatusLayout::place_with(&mut alloc.borrow_mut()), + || EffectCellLayout::::place_with(&mut alloc.borrow_mut()), + || EffectCellLayout::::place_with(&mut alloc.borrow_mut()), + ) + } + + fn allocate(backend: &mut M, placed: Self::Placed) -> Self::Allocated { + let backend = std::cell::RefCell::new(backend); + placed.map( + |placed| MStatusLayout::allocate(*backend.borrow_mut(), placed), + |placed| EffectCellLayout::::allocate(*backend.borrow_mut(), placed), + |placed| EffectCellLayout::::allocate(*backend.borrow_mut(), placed), + ) + } } -pub struct CSRValuesAllocated { - mstatus: AllocatedOf, - mnscratch: AllocatedOf, - mnepc: AllocatedOf, - mncause: AllocatedOf, - mnstatus: AllocatedOf, - cycle: AllocatedOf, - time: AllocatedOf, - instret: AllocatedOf, - mcycle: AllocatedOf, - minstret: AllocatedOf, - hpmcounter3: AllocatedOf, - hpmcounter4: AllocatedOf, - hpmcounter5: AllocatedOf, - hpmcounter6: AllocatedOf, - hpmcounter7: AllocatedOf, - hpmcounter8: AllocatedOf, - hpmcounter9: AllocatedOf, - hpmcounter10: AllocatedOf, - hpmcounter11: AllocatedOf, - hpmcounter12: AllocatedOf, - hpmcounter13: AllocatedOf, - hpmcounter14: AllocatedOf, - hpmcounter15: AllocatedOf, - hpmcounter16: AllocatedOf, - hpmcounter17: AllocatedOf, - hpmcounter18: AllocatedOf, - hpmcounter19: AllocatedOf, - hpmcounter20: AllocatedOf, - hpmcounter21: AllocatedOf, - hpmcounter22: AllocatedOf, - hpmcounter23: AllocatedOf, - hpmcounter24: AllocatedOf, - hpmcounter25: AllocatedOf, - hpmcounter26: AllocatedOf, - hpmcounter27: AllocatedOf, - hpmcounter28: AllocatedOf, - hpmcounter29: AllocatedOf, - hpmcounter30: AllocatedOf, - hpmcounter31: AllocatedOf, - mhpmcounter3: AllocatedOf, - mhpmcounter4: AllocatedOf, - mhpmcounter5: AllocatedOf, - mhpmcounter6: AllocatedOf, - mhpmcounter7: AllocatedOf, - mhpmcounter8: AllocatedOf, - mhpmcounter9: AllocatedOf, - mhpmcounter10: AllocatedOf, - mhpmcounter11: AllocatedOf, - mhpmcounter12: AllocatedOf, - mhpmcounter13: AllocatedOf, - mhpmcounter14: AllocatedOf, - mhpmcounter15: AllocatedOf, - mhpmcounter16: AllocatedOf, - mhpmcounter17: AllocatedOf, - mhpmcounter18: AllocatedOf, - mhpmcounter19: AllocatedOf, - mhpmcounter20: AllocatedOf, - mhpmcounter21: AllocatedOf, - mhpmcounter22: AllocatedOf, - mhpmcounter23: AllocatedOf, - mhpmcounter24: AllocatedOf, - mhpmcounter25: AllocatedOf, - mhpmcounter26: AllocatedOf, - mhpmcounter27: AllocatedOf, - mhpmcounter28: AllocatedOf, - mhpmcounter29: AllocatedOf, - mhpmcounter30: AllocatedOf, - mhpmcounter31: AllocatedOf, - mhpmevent3: AllocatedOf, - mhpmevent4: AllocatedOf, - mhpmevent5: AllocatedOf, - mhpmevent6: AllocatedOf, - mhpmevent7: AllocatedOf, - mhpmevent8: AllocatedOf, - mhpmevent9: AllocatedOf, - mhpmevent10: AllocatedOf, - mhpmevent11: AllocatedOf, - mhpmevent12: AllocatedOf, - mhpmevent13: AllocatedOf, - mhpmevent14: AllocatedOf, - mhpmevent15: AllocatedOf, - mhpmevent16: AllocatedOf, - mhpmevent17: AllocatedOf, - mhpmevent18: AllocatedOf, - mhpmevent19: AllocatedOf, - mhpmevent20: AllocatedOf, - mhpmevent21: AllocatedOf, - mhpmevent22: AllocatedOf, - mhpmevent23: AllocatedOf, - mhpmevent24: AllocatedOf, - mhpmevent25: AllocatedOf, - mhpmevent26: AllocatedOf, - mhpmevent27: AllocatedOf, - mhpmevent28: AllocatedOf, - mhpmevent29: AllocatedOf, - mhpmevent30: AllocatedOf, - mhpmevent31: AllocatedOf, - mcountinhibit: AllocatedOf, - scounteren: AllocatedOf, - mcounteren: AllocatedOf, - fcsr: AllocatedOf, - pmpcfg0: AllocatedOf, - pmpcfg2: AllocatedOf, - pmpcfg4: AllocatedOf, - pmpcfg6: AllocatedOf, - pmpcfg8: AllocatedOf, - pmpcfg10: AllocatedOf, - pmpcfg12: AllocatedOf, - pmpcfg14: AllocatedOf, - pmpaddr0: AllocatedOf, - pmpaddr1: AllocatedOf, - pmpaddr2: AllocatedOf, - pmpaddr3: AllocatedOf, - pmpaddr4: AllocatedOf, - pmpaddr5: AllocatedOf, - pmpaddr6: AllocatedOf, - pmpaddr7: AllocatedOf, - pmpaddr8: AllocatedOf, - pmpaddr9: AllocatedOf, - pmpaddr10: AllocatedOf, - pmpaddr11: AllocatedOf, - pmpaddr12: AllocatedOf, - pmpaddr13: AllocatedOf, - pmpaddr14: AllocatedOf, - pmpaddr15: AllocatedOf, - pmpaddr16: AllocatedOf, - pmpaddr17: AllocatedOf, - pmpaddr18: AllocatedOf, - pmpaddr19: AllocatedOf, - pmpaddr20: AllocatedOf, - pmpaddr21: AllocatedOf, - pmpaddr22: AllocatedOf, - pmpaddr23: AllocatedOf, - pmpaddr24: AllocatedOf, - pmpaddr25: AllocatedOf, - pmpaddr26: AllocatedOf, - pmpaddr27: AllocatedOf, - pmpaddr28: AllocatedOf, - pmpaddr29: AllocatedOf, - pmpaddr30: AllocatedOf, - pmpaddr31: AllocatedOf, - pmpaddr32: AllocatedOf, - pmpaddr33: AllocatedOf, - pmpaddr34: AllocatedOf, - pmpaddr35: AllocatedOf, - pmpaddr36: AllocatedOf, - pmpaddr37: AllocatedOf, - pmpaddr38: AllocatedOf, - pmpaddr39: AllocatedOf, - pmpaddr40: AllocatedOf, - pmpaddr41: AllocatedOf, - pmpaddr42: AllocatedOf, - pmpaddr43: AllocatedOf, - pmpaddr44: AllocatedOf, - pmpaddr45: AllocatedOf, - pmpaddr46: AllocatedOf, - pmpaddr47: AllocatedOf, - pmpaddr48: AllocatedOf, - pmpaddr49: AllocatedOf, - pmpaddr50: AllocatedOf, - pmpaddr51: AllocatedOf, - pmpaddr52: AllocatedOf, - pmpaddr53: AllocatedOf, - pmpaddr54: AllocatedOf, - pmpaddr55: AllocatedOf, - pmpaddr56: AllocatedOf, - pmpaddr57: AllocatedOf, - pmpaddr58: AllocatedOf, - pmpaddr59: AllocatedOf, - pmpaddr60: AllocatedOf, - pmpaddr61: AllocatedOf, - pmpaddr62: AllocatedOf, - pmpaddr63: AllocatedOf, - mhartid: AllocatedOf, - mvendorid: AllocatedOf, - marchid: AllocatedOf, - mimpid: AllocatedOf, - misa: AllocatedOf, - mscratch: AllocatedOf, - sscratch: AllocatedOf, - stvec: AllocatedOf, - mtvec: AllocatedOf, - mie: AllocatedOf, - satp: AllocatedOf, - scause: AllocatedOf, - mcause: AllocatedOf, - sepc: AllocatedOf, - mepc: AllocatedOf, - stval: AllocatedOf, - mtval: AllocatedOf, - mtval2: AllocatedOf, - mip: AllocatedOf, - mtinst: AllocatedOf, - senvcfg: AllocatedOf, - menvcfg: AllocatedOf, - mconfigptr: AllocatedOf, - medeleg: AllocatedOf, - mideleg: AllocatedOf, - mseccfg: AllocatedOf, - scontext: AllocatedOf, - hstatus: AllocatedOf, - hedeleg: AllocatedOf, - hideleg: AllocatedOf, - hie: AllocatedOf, - hcounteren: AllocatedOf, - hgeie: AllocatedOf, - htval: AllocatedOf, - hip: AllocatedOf, - hvip: AllocatedOf, - htinst: AllocatedOf, - hgeip: AllocatedOf, - henvcfg: AllocatedOf, - hgatp: AllocatedOf, - hcontext: AllocatedOf, - htimedelta: AllocatedOf, - vsstatus: AllocatedOf, - vsie: AllocatedOf, - vstvec: AllocatedOf, - vsscratch: AllocatedOf, - vsepc: AllocatedOf, - vscause: AllocatedOf, - vstval: AllocatedOf, - vsip: AllocatedOf, - vsatp: AllocatedOf, - tselect: AllocatedOf, - tdata1: AllocatedOf, - tdata2: AllocatedOf, - tdata3: AllocatedOf, - tcontrol: AllocatedOf, - mcontext: AllocatedOf, - dcsr: AllocatedOf, - dpc: AllocatedOf, - dscratch0: AllocatedOf, - dscratch1: AllocatedOf, +#[derive(Default, Debug, Clone, PartialEq, Eq)] +pub struct CSRValuesF { + pub mstatus: MStatus, + pub mnscratch: Raw, + pub mnepc: Raw, + pub mncause: Raw, + pub mnstatus: Raw, + pub cycle: Raw, + pub time: Raw, + pub instret: Raw, + pub mcycle: Raw, + pub minstret: Raw, + pub hpmcounter3: Raw, + pub hpmcounter4: Raw, + pub hpmcounter5: Raw, + pub hpmcounter6: Raw, + pub hpmcounter7: Raw, + pub hpmcounter8: Raw, + pub hpmcounter9: Raw, + pub hpmcounter10: Raw, + pub hpmcounter11: Raw, + pub hpmcounter12: Raw, + pub hpmcounter13: Raw, + pub hpmcounter14: Raw, + pub hpmcounter15: Raw, + pub hpmcounter16: Raw, + pub hpmcounter17: Raw, + pub hpmcounter18: Raw, + pub hpmcounter19: Raw, + pub hpmcounter20: Raw, + pub hpmcounter21: Raw, + pub hpmcounter22: Raw, + pub hpmcounter23: Raw, + pub hpmcounter24: Raw, + pub hpmcounter25: Raw, + pub hpmcounter26: Raw, + pub hpmcounter27: Raw, + pub hpmcounter28: Raw, + pub hpmcounter29: Raw, + pub hpmcounter30: Raw, + pub hpmcounter31: Raw, + pub mhpmcounter3: Raw, + pub mhpmcounter4: Raw, + pub mhpmcounter5: Raw, + pub mhpmcounter6: Raw, + pub mhpmcounter7: Raw, + pub mhpmcounter8: Raw, + pub mhpmcounter9: Raw, + pub mhpmcounter10: Raw, + pub mhpmcounter11: Raw, + pub mhpmcounter12: Raw, + pub mhpmcounter13: Raw, + pub mhpmcounter14: Raw, + pub mhpmcounter15: Raw, + pub mhpmcounter16: Raw, + pub mhpmcounter17: Raw, + pub mhpmcounter18: Raw, + pub mhpmcounter19: Raw, + pub mhpmcounter20: Raw, + pub mhpmcounter21: Raw, + pub mhpmcounter22: Raw, + pub mhpmcounter23: Raw, + pub mhpmcounter24: Raw, + pub mhpmcounter25: Raw, + pub mhpmcounter26: Raw, + pub mhpmcounter27: Raw, + pub mhpmcounter28: Raw, + pub mhpmcounter29: Raw, + pub mhpmcounter30: Raw, + pub mhpmcounter31: Raw, + pub mhpmevent3: Raw, + pub mhpmevent4: Raw, + pub mhpmevent5: Raw, + pub mhpmevent6: Raw, + pub mhpmevent7: Raw, + pub mhpmevent8: Raw, + pub mhpmevent9: Raw, + pub mhpmevent10: Raw, + pub mhpmevent11: Raw, + pub mhpmevent12: Raw, + pub mhpmevent13: Raw, + pub mhpmevent14: Raw, + pub mhpmevent15: Raw, + pub mhpmevent16: Raw, + pub mhpmevent17: Raw, + pub mhpmevent18: Raw, + pub mhpmevent19: Raw, + pub mhpmevent20: Raw, + pub mhpmevent21: Raw, + pub mhpmevent22: Raw, + pub mhpmevent23: Raw, + pub mhpmevent24: Raw, + pub mhpmevent25: Raw, + pub mhpmevent26: Raw, + pub mhpmevent27: Raw, + pub mhpmevent28: Raw, + pub mhpmevent29: Raw, + pub mhpmevent30: Raw, + pub mhpmevent31: Raw, + pub mcountinhibit: Raw, + pub scounteren: Raw, + pub mcounteren: Raw, + pub fcsr: Raw, + pub pmpcfg0: Raw, + pub pmpcfg2: Raw, + pub pmpcfg4: Raw, + pub pmpcfg6: Raw, + pub pmpcfg8: Raw, + pub pmpcfg10: Raw, + pub pmpcfg12: Raw, + pub pmpcfg14: Raw, + pub pmpaddr0: Raw, + pub pmpaddr1: Raw, + pub pmpaddr2: Raw, + pub pmpaddr3: Raw, + pub pmpaddr4: Raw, + pub pmpaddr5: Raw, + pub pmpaddr6: Raw, + pub pmpaddr7: Raw, + pub pmpaddr8: Raw, + pub pmpaddr9: Raw, + pub pmpaddr10: Raw, + pub pmpaddr11: Raw, + pub pmpaddr12: Raw, + pub pmpaddr13: Raw, + pub pmpaddr14: Raw, + pub pmpaddr15: Raw, + pub pmpaddr16: Raw, + pub pmpaddr17: Raw, + pub pmpaddr18: Raw, + pub pmpaddr19: Raw, + pub pmpaddr20: Raw, + pub pmpaddr21: Raw, + pub pmpaddr22: Raw, + pub pmpaddr23: Raw, + pub pmpaddr24: Raw, + pub pmpaddr25: Raw, + pub pmpaddr26: Raw, + pub pmpaddr27: Raw, + pub pmpaddr28: Raw, + pub pmpaddr29: Raw, + pub pmpaddr30: Raw, + pub pmpaddr31: Raw, + pub pmpaddr32: Raw, + pub pmpaddr33: Raw, + pub pmpaddr34: Raw, + pub pmpaddr35: Raw, + pub pmpaddr36: Raw, + pub pmpaddr37: Raw, + pub pmpaddr38: Raw, + pub pmpaddr39: Raw, + pub pmpaddr40: Raw, + pub pmpaddr41: Raw, + pub pmpaddr42: Raw, + pub pmpaddr43: Raw, + pub pmpaddr44: Raw, + pub pmpaddr45: Raw, + pub pmpaddr46: Raw, + pub pmpaddr47: Raw, + pub pmpaddr48: Raw, + pub pmpaddr49: Raw, + pub pmpaddr50: Raw, + pub pmpaddr51: Raw, + pub pmpaddr52: Raw, + pub pmpaddr53: Raw, + pub pmpaddr54: Raw, + pub pmpaddr55: Raw, + pub pmpaddr56: Raw, + pub pmpaddr57: Raw, + pub pmpaddr58: Raw, + pub pmpaddr59: Raw, + pub pmpaddr60: Raw, + pub pmpaddr61: Raw, + pub pmpaddr62: Raw, + pub pmpaddr63: Raw, + pub mhartid: Raw, + pub mvendorid: Raw, + pub marchid: Raw, + pub mimpid: Raw, + pub misa: Raw, + pub mscratch: Raw, + pub sscratch: Raw, + pub stvec: Raw, + pub mtvec: Raw, + pub mie: Raw, + pub satp: Raw, + pub scause: Raw, + pub mcause: Raw, + pub sepc: Raw, + pub mepc: Raw, + pub stval: Raw, + pub mtval: Raw, + pub mtval2: Raw, + pub mip: MIP, + pub mtinst: Raw, + pub senvcfg: Raw, + pub menvcfg: Raw, + pub mconfigptr: Raw, + pub medeleg: Raw, + pub mideleg: Raw, + pub mseccfg: Raw, + pub scontext: Raw, + pub hstatus: Raw, + pub hedeleg: Raw, + pub hideleg: Raw, + pub hie: Raw, + pub hcounteren: Raw, + pub hgeie: Raw, + pub htval: Raw, + pub hip: Raw, + pub hvip: Raw, + pub htinst: Raw, + pub hgeip: Raw, + pub henvcfg: Raw, + pub hgatp: Raw, + pub hcontext: Raw, + pub htimedelta: Raw, + pub vsstatus: Raw, + pub vsie: Raw, + pub vstvec: Raw, + pub vsscratch: Raw, + pub vsepc: Raw, + pub vscause: Raw, + pub vstval: Raw, + pub vsip: Raw, + pub vsatp: Raw, + pub tselect: Raw, + pub tdata1: Raw, + pub tdata2: Raw, + pub tdata3: Raw, + pub tcontrol: Raw, + pub mcontext: Raw, + pub dcsr: Raw, + pub dpc: Raw, + pub dscratch0: Raw, + pub dscratch1: Raw, } -impl Layout for CSRValuesLayout { - type Placed = CSRValuesPlaced; +impl CSRValuesF { + /// Create a new CSR values structure. The given functions are used to initialise each CSR + /// value. + #[inline] + fn new( + make_mstatus: impl FnOnce() -> MStatus, + make_mip: impl FnOnce() -> MIP, + mut make_raw: impl FnMut() -> Raw, + ) -> Self { + CSRValuesF::<(), (), ()>::default().map(|_| make_mstatus(), |_| make_mip(), |_| make_raw()) + } - type Allocated = CSRValuesAllocated; + /// Transform each field representing a CSR value into a different type. + #[inline] + fn map( + self, + map_mstatus: impl FnOnce(MStatus) -> MStatus2, + map_mip: impl FnOnce(MIP) -> MIP2, + mut map_raw: impl FnMut(Raw) -> Raw2, + ) -> CSRValuesF { + CSRValuesF { + mstatus: map_mstatus(self.mstatus), + mnscratch: map_raw(self.mnscratch), + mnepc: map_raw(self.mnepc), + mncause: map_raw(self.mncause), + mnstatus: map_raw(self.mnstatus), + cycle: map_raw(self.cycle), + time: map_raw(self.time), + instret: map_raw(self.instret), + mcycle: map_raw(self.mcycle), + minstret: map_raw(self.minstret), + hpmcounter3: map_raw(self.hpmcounter3), + hpmcounter4: map_raw(self.hpmcounter4), + hpmcounter5: map_raw(self.hpmcounter5), + hpmcounter6: map_raw(self.hpmcounter6), + hpmcounter7: map_raw(self.hpmcounter7), + hpmcounter8: map_raw(self.hpmcounter8), + hpmcounter9: map_raw(self.hpmcounter9), + hpmcounter10: map_raw(self.hpmcounter10), + hpmcounter11: map_raw(self.hpmcounter11), + hpmcounter12: map_raw(self.hpmcounter12), + hpmcounter13: map_raw(self.hpmcounter13), + hpmcounter14: map_raw(self.hpmcounter14), + hpmcounter15: map_raw(self.hpmcounter15), + hpmcounter16: map_raw(self.hpmcounter16), + hpmcounter17: map_raw(self.hpmcounter17), + hpmcounter18: map_raw(self.hpmcounter18), + hpmcounter19: map_raw(self.hpmcounter19), + hpmcounter20: map_raw(self.hpmcounter20), + hpmcounter21: map_raw(self.hpmcounter21), + hpmcounter22: map_raw(self.hpmcounter22), + hpmcounter23: map_raw(self.hpmcounter23), + hpmcounter24: map_raw(self.hpmcounter24), + hpmcounter25: map_raw(self.hpmcounter25), + hpmcounter26: map_raw(self.hpmcounter26), + hpmcounter27: map_raw(self.hpmcounter27), + hpmcounter28: map_raw(self.hpmcounter28), + hpmcounter29: map_raw(self.hpmcounter29), + hpmcounter30: map_raw(self.hpmcounter30), + hpmcounter31: map_raw(self.hpmcounter31), + mhpmcounter3: map_raw(self.mhpmcounter3), + mhpmcounter4: map_raw(self.mhpmcounter4), + mhpmcounter5: map_raw(self.mhpmcounter5), + mhpmcounter6: map_raw(self.mhpmcounter6), + mhpmcounter7: map_raw(self.mhpmcounter7), + mhpmcounter8: map_raw(self.mhpmcounter8), + mhpmcounter9: map_raw(self.mhpmcounter9), + mhpmcounter10: map_raw(self.mhpmcounter10), + mhpmcounter11: map_raw(self.mhpmcounter11), + mhpmcounter12: map_raw(self.mhpmcounter12), + mhpmcounter13: map_raw(self.mhpmcounter13), + mhpmcounter14: map_raw(self.mhpmcounter14), + mhpmcounter15: map_raw(self.mhpmcounter15), + mhpmcounter16: map_raw(self.mhpmcounter16), + mhpmcounter17: map_raw(self.mhpmcounter17), + mhpmcounter18: map_raw(self.mhpmcounter18), + mhpmcounter19: map_raw(self.mhpmcounter19), + mhpmcounter20: map_raw(self.mhpmcounter20), + mhpmcounter21: map_raw(self.mhpmcounter21), + mhpmcounter22: map_raw(self.mhpmcounter22), + mhpmcounter23: map_raw(self.mhpmcounter23), + mhpmcounter24: map_raw(self.mhpmcounter24), + mhpmcounter25: map_raw(self.mhpmcounter25), + mhpmcounter26: map_raw(self.mhpmcounter26), + mhpmcounter27: map_raw(self.mhpmcounter27), + mhpmcounter28: map_raw(self.mhpmcounter28), + mhpmcounter29: map_raw(self.mhpmcounter29), + mhpmcounter30: map_raw(self.mhpmcounter30), + mhpmcounter31: map_raw(self.mhpmcounter31), + mhpmevent3: map_raw(self.mhpmevent3), + mhpmevent4: map_raw(self.mhpmevent4), + mhpmevent5: map_raw(self.mhpmevent5), + mhpmevent6: map_raw(self.mhpmevent6), + mhpmevent7: map_raw(self.mhpmevent7), + mhpmevent8: map_raw(self.mhpmevent8), + mhpmevent9: map_raw(self.mhpmevent9), + mhpmevent10: map_raw(self.mhpmevent10), + mhpmevent11: map_raw(self.mhpmevent11), + mhpmevent12: map_raw(self.mhpmevent12), + mhpmevent13: map_raw(self.mhpmevent13), + mhpmevent14: map_raw(self.mhpmevent14), + mhpmevent15: map_raw(self.mhpmevent15), + mhpmevent16: map_raw(self.mhpmevent16), + mhpmevent17: map_raw(self.mhpmevent17), + mhpmevent18: map_raw(self.mhpmevent18), + mhpmevent19: map_raw(self.mhpmevent19), + mhpmevent20: map_raw(self.mhpmevent20), + mhpmevent21: map_raw(self.mhpmevent21), + mhpmevent22: map_raw(self.mhpmevent22), + mhpmevent23: map_raw(self.mhpmevent23), + mhpmevent24: map_raw(self.mhpmevent24), + mhpmevent25: map_raw(self.mhpmevent25), + mhpmevent26: map_raw(self.mhpmevent26), + mhpmevent27: map_raw(self.mhpmevent27), + mhpmevent28: map_raw(self.mhpmevent28), + mhpmevent29: map_raw(self.mhpmevent29), + mhpmevent30: map_raw(self.mhpmevent30), + mhpmevent31: map_raw(self.mhpmevent31), + mcountinhibit: map_raw(self.mcountinhibit), + scounteren: map_raw(self.scounteren), + mcounteren: map_raw(self.mcounteren), + fcsr: map_raw(self.fcsr), + pmpcfg0: map_raw(self.pmpcfg0), + pmpcfg2: map_raw(self.pmpcfg2), + pmpcfg4: map_raw(self.pmpcfg4), + pmpcfg6: map_raw(self.pmpcfg6), + pmpcfg8: map_raw(self.pmpcfg8), + pmpcfg10: map_raw(self.pmpcfg10), + pmpcfg12: map_raw(self.pmpcfg12), + pmpcfg14: map_raw(self.pmpcfg14), + pmpaddr0: map_raw(self.pmpaddr0), + pmpaddr1: map_raw(self.pmpaddr1), + pmpaddr2: map_raw(self.pmpaddr2), + pmpaddr3: map_raw(self.pmpaddr3), + pmpaddr4: map_raw(self.pmpaddr4), + pmpaddr5: map_raw(self.pmpaddr5), + pmpaddr6: map_raw(self.pmpaddr6), + pmpaddr7: map_raw(self.pmpaddr7), + pmpaddr8: map_raw(self.pmpaddr8), + pmpaddr9: map_raw(self.pmpaddr9), + pmpaddr10: map_raw(self.pmpaddr10), + pmpaddr11: map_raw(self.pmpaddr11), + pmpaddr12: map_raw(self.pmpaddr12), + pmpaddr13: map_raw(self.pmpaddr13), + pmpaddr14: map_raw(self.pmpaddr14), + pmpaddr15: map_raw(self.pmpaddr15), + pmpaddr16: map_raw(self.pmpaddr16), + pmpaddr17: map_raw(self.pmpaddr17), + pmpaddr18: map_raw(self.pmpaddr18), + pmpaddr19: map_raw(self.pmpaddr19), + pmpaddr20: map_raw(self.pmpaddr20), + pmpaddr21: map_raw(self.pmpaddr21), + pmpaddr22: map_raw(self.pmpaddr22), + pmpaddr23: map_raw(self.pmpaddr23), + pmpaddr24: map_raw(self.pmpaddr24), + pmpaddr25: map_raw(self.pmpaddr25), + pmpaddr26: map_raw(self.pmpaddr26), + pmpaddr27: map_raw(self.pmpaddr27), + pmpaddr28: map_raw(self.pmpaddr28), + pmpaddr29: map_raw(self.pmpaddr29), + pmpaddr30: map_raw(self.pmpaddr30), + pmpaddr31: map_raw(self.pmpaddr31), + pmpaddr32: map_raw(self.pmpaddr32), + pmpaddr33: map_raw(self.pmpaddr33), + pmpaddr34: map_raw(self.pmpaddr34), + pmpaddr35: map_raw(self.pmpaddr35), + pmpaddr36: map_raw(self.pmpaddr36), + pmpaddr37: map_raw(self.pmpaddr37), + pmpaddr38: map_raw(self.pmpaddr38), + pmpaddr39: map_raw(self.pmpaddr39), + pmpaddr40: map_raw(self.pmpaddr40), + pmpaddr41: map_raw(self.pmpaddr41), + pmpaddr42: map_raw(self.pmpaddr42), + pmpaddr43: map_raw(self.pmpaddr43), + pmpaddr44: map_raw(self.pmpaddr44), + pmpaddr45: map_raw(self.pmpaddr45), + pmpaddr46: map_raw(self.pmpaddr46), + pmpaddr47: map_raw(self.pmpaddr47), + pmpaddr48: map_raw(self.pmpaddr48), + pmpaddr49: map_raw(self.pmpaddr49), + pmpaddr50: map_raw(self.pmpaddr50), + pmpaddr51: map_raw(self.pmpaddr51), + pmpaddr52: map_raw(self.pmpaddr52), + pmpaddr53: map_raw(self.pmpaddr53), + pmpaddr54: map_raw(self.pmpaddr54), + pmpaddr55: map_raw(self.pmpaddr55), + pmpaddr56: map_raw(self.pmpaddr56), + pmpaddr57: map_raw(self.pmpaddr57), + pmpaddr58: map_raw(self.pmpaddr58), + pmpaddr59: map_raw(self.pmpaddr59), + pmpaddr60: map_raw(self.pmpaddr60), + pmpaddr61: map_raw(self.pmpaddr61), + pmpaddr62: map_raw(self.pmpaddr62), + pmpaddr63: map_raw(self.pmpaddr63), + mhartid: map_raw(self.mhartid), + mvendorid: map_raw(self.mvendorid), + marchid: map_raw(self.marchid), + mimpid: map_raw(self.mimpid), + misa: map_raw(self.misa), + mscratch: map_raw(self.mscratch), + sscratch: map_raw(self.sscratch), + stvec: map_raw(self.stvec), + mtvec: map_raw(self.mtvec), + mie: map_raw(self.mie), + satp: map_raw(self.satp), + scause: map_raw(self.scause), + mcause: map_raw(self.mcause), + sepc: map_raw(self.sepc), + mepc: map_raw(self.mepc), + stval: map_raw(self.stval), + mtval: map_raw(self.mtval), + mtval2: map_raw(self.mtval2), + mip: map_mip(self.mip), + mtinst: map_raw(self.mtinst), + senvcfg: map_raw(self.senvcfg), + menvcfg: map_raw(self.menvcfg), + mconfigptr: map_raw(self.mconfigptr), + medeleg: map_raw(self.medeleg), + mideleg: map_raw(self.mideleg), + mseccfg: map_raw(self.mseccfg), + scontext: map_raw(self.scontext), + hstatus: map_raw(self.hstatus), + hedeleg: map_raw(self.hedeleg), + hideleg: map_raw(self.hideleg), + hie: map_raw(self.hie), + hcounteren: map_raw(self.hcounteren), + hgeie: map_raw(self.hgeie), + htval: map_raw(self.htval), + hip: map_raw(self.hip), + hvip: map_raw(self.hvip), + htinst: map_raw(self.htinst), + hgeip: map_raw(self.hgeip), + henvcfg: map_raw(self.henvcfg), + hgatp: map_raw(self.hgatp), + hcontext: map_raw(self.hcontext), + htimedelta: map_raw(self.htimedelta), + vsstatus: map_raw(self.vsstatus), + vsie: map_raw(self.vsie), + vstvec: map_raw(self.vstvec), + vsscratch: map_raw(self.vsscratch), + vsepc: map_raw(self.vsepc), + vscause: map_raw(self.vscause), + vstval: map_raw(self.vstval), + vsip: map_raw(self.vsip), + vsatp: map_raw(self.vsatp), + tselect: map_raw(self.tselect), + tdata1: map_raw(self.tdata1), + tdata2: map_raw(self.tdata2), + tdata3: map_raw(self.tdata3), + tcontrol: map_raw(self.tcontrol), + mcontext: map_raw(self.mcontext), + dcsr: map_raw(self.dcsr), + dpc: map_raw(self.dpc), + dscratch0: map_raw(self.dscratch0), + dscratch1: map_raw(self.dscratch1), + } + } - fn place_with(alloc: &mut Choreographer) -> Self::Placed { - CSRValuesPlaced { - mstatus: ::place_with(alloc), - mnscratch: ::place_with(alloc), - mnepc: ::place_with(alloc), - mncause: ::place_with(alloc), - mnstatus: ::place_with(alloc), - cycle: ::place_with(alloc), - time: ::place_with(alloc), - instret: ::place_with(alloc), - mcycle: ::place_with(alloc), - minstret: ::place_with(alloc), - hpmcounter3: ::place_with(alloc), - hpmcounter4: ::place_with(alloc), - hpmcounter5: ::place_with(alloc), - hpmcounter6: ::place_with(alloc), - hpmcounter7: ::place_with(alloc), - hpmcounter8: ::place_with(alloc), - hpmcounter9: ::place_with(alloc), - hpmcounter10: ::place_with(alloc), - hpmcounter11: ::place_with(alloc), - hpmcounter12: ::place_with(alloc), - hpmcounter13: ::place_with(alloc), - hpmcounter14: ::place_with(alloc), - hpmcounter15: ::place_with(alloc), - hpmcounter16: ::place_with(alloc), - hpmcounter17: ::place_with(alloc), - hpmcounter18: ::place_with(alloc), - hpmcounter19: ::place_with(alloc), - hpmcounter20: ::place_with(alloc), - hpmcounter21: ::place_with(alloc), - hpmcounter22: ::place_with(alloc), - hpmcounter23: ::place_with(alloc), - hpmcounter24: ::place_with(alloc), - hpmcounter25: ::place_with(alloc), - hpmcounter26: ::place_with(alloc), - hpmcounter27: ::place_with(alloc), - hpmcounter28: ::place_with(alloc), - hpmcounter29: ::place_with(alloc), - hpmcounter30: ::place_with(alloc), - hpmcounter31: ::place_with(alloc), - mhpmcounter3: ::place_with(alloc), - mhpmcounter4: ::place_with(alloc), - mhpmcounter5: ::place_with(alloc), - mhpmcounter6: ::place_with(alloc), - mhpmcounter7: ::place_with(alloc), - mhpmcounter8: ::place_with(alloc), - mhpmcounter9: ::place_with(alloc), - mhpmcounter10: ::place_with(alloc), - mhpmcounter11: ::place_with(alloc), - mhpmcounter12: ::place_with(alloc), - mhpmcounter13: ::place_with(alloc), - mhpmcounter14: ::place_with(alloc), - mhpmcounter15: ::place_with(alloc), - mhpmcounter16: ::place_with(alloc), - mhpmcounter17: ::place_with(alloc), - mhpmcounter18: ::place_with(alloc), - mhpmcounter19: ::place_with(alloc), - mhpmcounter20: ::place_with(alloc), - mhpmcounter21: ::place_with(alloc), - mhpmcounter22: ::place_with(alloc), - mhpmcounter23: ::place_with(alloc), - mhpmcounter24: ::place_with(alloc), - mhpmcounter25: ::place_with(alloc), - mhpmcounter26: ::place_with(alloc), - mhpmcounter27: ::place_with(alloc), - mhpmcounter28: ::place_with(alloc), - mhpmcounter29: ::place_with(alloc), - mhpmcounter30: ::place_with(alloc), - mhpmcounter31: ::place_with(alloc), - mhpmevent3: ::place_with(alloc), - mhpmevent4: ::place_with(alloc), - mhpmevent5: ::place_with(alloc), - mhpmevent6: ::place_with(alloc), - mhpmevent7: ::place_with(alloc), - mhpmevent8: ::place_with(alloc), - mhpmevent9: ::place_with(alloc), - mhpmevent10: ::place_with(alloc), - mhpmevent11: ::place_with(alloc), - mhpmevent12: ::place_with(alloc), - mhpmevent13: ::place_with(alloc), - mhpmevent14: ::place_with(alloc), - mhpmevent15: ::place_with(alloc), - mhpmevent16: ::place_with(alloc), - mhpmevent17: ::place_with(alloc), - mhpmevent18: ::place_with(alloc), - mhpmevent19: ::place_with(alloc), - mhpmevent20: ::place_with(alloc), - mhpmevent21: ::place_with(alloc), - mhpmevent22: ::place_with(alloc), - mhpmevent23: ::place_with(alloc), - mhpmevent24: ::place_with(alloc), - mhpmevent25: ::place_with(alloc), - mhpmevent26: ::place_with(alloc), - mhpmevent27: ::place_with(alloc), - mhpmevent28: ::place_with(alloc), - mhpmevent29: ::place_with(alloc), - mhpmevent30: ::place_with(alloc), - mhpmevent31: ::place_with(alloc), - mcountinhibit: ::place_with(alloc), - scounteren: ::place_with(alloc), - mcounteren: ::place_with(alloc), - fcsr: ::place_with(alloc), - pmpcfg0: ::place_with(alloc), - pmpcfg2: ::place_with(alloc), - pmpcfg4: ::place_with(alloc), - pmpcfg6: ::place_with(alloc), - pmpcfg8: ::place_with(alloc), - pmpcfg10: ::place_with(alloc), - pmpcfg12: ::place_with(alloc), - pmpcfg14: ::place_with(alloc), - pmpaddr0: ::place_with(alloc), - pmpaddr1: ::place_with(alloc), - pmpaddr2: ::place_with(alloc), - pmpaddr3: ::place_with(alloc), - pmpaddr4: ::place_with(alloc), - pmpaddr5: ::place_with(alloc), - pmpaddr6: ::place_with(alloc), - pmpaddr7: ::place_with(alloc), - pmpaddr8: ::place_with(alloc), - pmpaddr9: ::place_with(alloc), - pmpaddr10: ::place_with(alloc), - pmpaddr11: ::place_with(alloc), - pmpaddr12: ::place_with(alloc), - pmpaddr13: ::place_with(alloc), - pmpaddr14: ::place_with(alloc), - pmpaddr15: ::place_with(alloc), - pmpaddr16: ::place_with(alloc), - pmpaddr17: ::place_with(alloc), - pmpaddr18: ::place_with(alloc), - pmpaddr19: ::place_with(alloc), - pmpaddr20: ::place_with(alloc), - pmpaddr21: ::place_with(alloc), - pmpaddr22: ::place_with(alloc), - pmpaddr23: ::place_with(alloc), - pmpaddr24: ::place_with(alloc), - pmpaddr25: ::place_with(alloc), - pmpaddr26: ::place_with(alloc), - pmpaddr27: ::place_with(alloc), - pmpaddr28: ::place_with(alloc), - pmpaddr29: ::place_with(alloc), - pmpaddr30: ::place_with(alloc), - pmpaddr31: ::place_with(alloc), - pmpaddr32: ::place_with(alloc), - pmpaddr33: ::place_with(alloc), - pmpaddr34: ::place_with(alloc), - pmpaddr35: ::place_with(alloc), - pmpaddr36: ::place_with(alloc), - pmpaddr37: ::place_with(alloc), - pmpaddr38: ::place_with(alloc), - pmpaddr39: ::place_with(alloc), - pmpaddr40: ::place_with(alloc), - pmpaddr41: ::place_with(alloc), - pmpaddr42: ::place_with(alloc), - pmpaddr43: ::place_with(alloc), - pmpaddr44: ::place_with(alloc), - pmpaddr45: ::place_with(alloc), - pmpaddr46: ::place_with(alloc), - pmpaddr47: ::place_with(alloc), - pmpaddr48: ::place_with(alloc), - pmpaddr49: ::place_with(alloc), - pmpaddr50: ::place_with(alloc), - pmpaddr51: ::place_with(alloc), - pmpaddr52: ::place_with(alloc), - pmpaddr53: ::place_with(alloc), - pmpaddr54: ::place_with(alloc), - pmpaddr55: ::place_with(alloc), - pmpaddr56: ::place_with(alloc), - pmpaddr57: ::place_with(alloc), - pmpaddr58: ::place_with(alloc), - pmpaddr59: ::place_with(alloc), - pmpaddr60: ::place_with(alloc), - pmpaddr61: ::place_with(alloc), - pmpaddr62: ::place_with(alloc), - pmpaddr63: ::place_with(alloc), - mhartid: ::place_with(alloc), - mvendorid: ::place_with(alloc), - marchid: ::place_with(alloc), - mimpid: ::place_with(alloc), - misa: ::place_with(alloc), - mscratch: ::place_with(alloc), - sscratch: ::place_with(alloc), - stvec: ::place_with(alloc), - mtvec: ::place_with(alloc), - mie: ::place_with(alloc), - satp: ::place_with(alloc), - scause: ::place_with(alloc), - mcause: ::place_with(alloc), - sepc: ::place_with(alloc), - mepc: ::place_with(alloc), - stval: ::place_with(alloc), - mtval: ::place_with(alloc), - mtval2: ::place_with(alloc), - mip: ::place_with(alloc), - mtinst: ::place_with(alloc), - senvcfg: ::place_with(alloc), - menvcfg: ::place_with(alloc), - mconfigptr: ::place_with(alloc), - medeleg: ::place_with(alloc), - mideleg: ::place_with(alloc), - mseccfg: ::place_with(alloc), - scontext: ::place_with(alloc), - hstatus: ::place_with(alloc), - hedeleg: ::place_with(alloc), - hideleg: ::place_with(alloc), - hie: ::place_with(alloc), - hcounteren: ::place_with(alloc), - hgeie: ::place_with(alloc), - htval: ::place_with(alloc), - hip: ::place_with(alloc), - hvip: ::place_with(alloc), - htinst: ::place_with(alloc), - hgeip: ::place_with(alloc), - henvcfg: ::place_with(alloc), - hgatp: ::place_with(alloc), - hcontext: ::place_with(alloc), - htimedelta: ::place_with(alloc), - vsstatus: ::place_with(alloc), - vsie: ::place_with(alloc), - vstvec: ::place_with(alloc), - vsscratch: ::place_with(alloc), - vsepc: ::place_with(alloc), - vscause: ::place_with(alloc), - vstval: ::place_with(alloc), - vsip: ::place_with(alloc), - vsatp: ::place_with(alloc), - tselect: ::place_with(alloc), - tdata1: ::place_with(alloc), - tdata2: ::place_with(alloc), - tdata3: ::place_with(alloc), - tcontrol: ::place_with(alloc), - mcontext: ::place_with(alloc), - dcsr: ::place_with(alloc), - dpc: ::place_with(alloc), - dscratch0: ::place_with(alloc), - dscratch1: ::place_with(alloc), + /// Select a field representing a CSR value and apply a function to it, returing its result. + #[inline(always)] + fn select_ref( + &self, + csr: RootCSRegister, + fold_mstatus: impl FnOnce(&MStatus) -> R, + fold_mip: impl FnOnce(&MIP) -> R, + fold_raw: impl FnOnce(&Raw) -> R, + ) -> R { + match csr { + RootCSRegister::mstatus => fold_mstatus(&self.mstatus), + RootCSRegister::mip => fold_mip(&self.mip), + RootCSRegister::mnscratch => fold_raw(&self.mnscratch), + RootCSRegister::mnepc => fold_raw(&self.mnepc), + RootCSRegister::mncause => fold_raw(&self.mncause), + RootCSRegister::mnstatus => fold_raw(&self.mnstatus), + RootCSRegister::cycle => fold_raw(&self.cycle), + RootCSRegister::time => fold_raw(&self.time), + RootCSRegister::instret => fold_raw(&self.instret), + RootCSRegister::mcycle => fold_raw(&self.mcycle), + RootCSRegister::minstret => fold_raw(&self.minstret), + RootCSRegister::hpmcounter3 => fold_raw(&self.hpmcounter3), + RootCSRegister::hpmcounter4 => fold_raw(&self.hpmcounter4), + RootCSRegister::hpmcounter5 => fold_raw(&self.hpmcounter5), + RootCSRegister::hpmcounter6 => fold_raw(&self.hpmcounter6), + RootCSRegister::hpmcounter7 => fold_raw(&self.hpmcounter7), + RootCSRegister::hpmcounter8 => fold_raw(&self.hpmcounter8), + RootCSRegister::hpmcounter9 => fold_raw(&self.hpmcounter9), + RootCSRegister::hpmcounter10 => fold_raw(&self.hpmcounter10), + RootCSRegister::hpmcounter11 => fold_raw(&self.hpmcounter11), + RootCSRegister::hpmcounter12 => fold_raw(&self.hpmcounter12), + RootCSRegister::hpmcounter13 => fold_raw(&self.hpmcounter13), + RootCSRegister::hpmcounter14 => fold_raw(&self.hpmcounter14), + RootCSRegister::hpmcounter15 => fold_raw(&self.hpmcounter15), + RootCSRegister::hpmcounter16 => fold_raw(&self.hpmcounter16), + RootCSRegister::hpmcounter17 => fold_raw(&self.hpmcounter17), + RootCSRegister::hpmcounter18 => fold_raw(&self.hpmcounter18), + RootCSRegister::hpmcounter19 => fold_raw(&self.hpmcounter19), + RootCSRegister::hpmcounter20 => fold_raw(&self.hpmcounter20), + RootCSRegister::hpmcounter21 => fold_raw(&self.hpmcounter21), + RootCSRegister::hpmcounter22 => fold_raw(&self.hpmcounter22), + RootCSRegister::hpmcounter23 => fold_raw(&self.hpmcounter23), + RootCSRegister::hpmcounter24 => fold_raw(&self.hpmcounter24), + RootCSRegister::hpmcounter25 => fold_raw(&self.hpmcounter25), + RootCSRegister::hpmcounter26 => fold_raw(&self.hpmcounter26), + RootCSRegister::hpmcounter27 => fold_raw(&self.hpmcounter27), + RootCSRegister::hpmcounter28 => fold_raw(&self.hpmcounter28), + RootCSRegister::hpmcounter29 => fold_raw(&self.hpmcounter29), + RootCSRegister::hpmcounter30 => fold_raw(&self.hpmcounter30), + RootCSRegister::hpmcounter31 => fold_raw(&self.hpmcounter31), + RootCSRegister::mhpmcounter3 => fold_raw(&self.mhpmcounter3), + RootCSRegister::mhpmcounter4 => fold_raw(&self.mhpmcounter4), + RootCSRegister::mhpmcounter5 => fold_raw(&self.mhpmcounter5), + RootCSRegister::mhpmcounter6 => fold_raw(&self.mhpmcounter6), + RootCSRegister::mhpmcounter7 => fold_raw(&self.mhpmcounter7), + RootCSRegister::mhpmcounter8 => fold_raw(&self.mhpmcounter8), + RootCSRegister::mhpmcounter9 => fold_raw(&self.mhpmcounter9), + RootCSRegister::mhpmcounter10 => fold_raw(&self.mhpmcounter10), + RootCSRegister::mhpmcounter11 => fold_raw(&self.mhpmcounter11), + RootCSRegister::mhpmcounter12 => fold_raw(&self.mhpmcounter12), + RootCSRegister::mhpmcounter13 => fold_raw(&self.mhpmcounter13), + RootCSRegister::mhpmcounter14 => fold_raw(&self.mhpmcounter14), + RootCSRegister::mhpmcounter15 => fold_raw(&self.mhpmcounter15), + RootCSRegister::mhpmcounter16 => fold_raw(&self.mhpmcounter16), + RootCSRegister::mhpmcounter17 => fold_raw(&self.mhpmcounter17), + RootCSRegister::mhpmcounter18 => fold_raw(&self.mhpmcounter18), + RootCSRegister::mhpmcounter19 => fold_raw(&self.mhpmcounter19), + RootCSRegister::mhpmcounter20 => fold_raw(&self.mhpmcounter20), + RootCSRegister::mhpmcounter21 => fold_raw(&self.mhpmcounter21), + RootCSRegister::mhpmcounter22 => fold_raw(&self.mhpmcounter22), + RootCSRegister::mhpmcounter23 => fold_raw(&self.mhpmcounter23), + RootCSRegister::mhpmcounter24 => fold_raw(&self.mhpmcounter24), + RootCSRegister::mhpmcounter25 => fold_raw(&self.mhpmcounter25), + RootCSRegister::mhpmcounter26 => fold_raw(&self.mhpmcounter26), + RootCSRegister::mhpmcounter27 => fold_raw(&self.mhpmcounter27), + RootCSRegister::mhpmcounter28 => fold_raw(&self.mhpmcounter28), + RootCSRegister::mhpmcounter29 => fold_raw(&self.mhpmcounter29), + RootCSRegister::mhpmcounter30 => fold_raw(&self.mhpmcounter30), + RootCSRegister::mhpmcounter31 => fold_raw(&self.mhpmcounter31), + RootCSRegister::mhpmevent3 => fold_raw(&self.mhpmevent3), + RootCSRegister::mhpmevent4 => fold_raw(&self.mhpmevent4), + RootCSRegister::mhpmevent5 => fold_raw(&self.mhpmevent5), + RootCSRegister::mhpmevent6 => fold_raw(&self.mhpmevent6), + RootCSRegister::mhpmevent7 => fold_raw(&self.mhpmevent7), + RootCSRegister::mhpmevent8 => fold_raw(&self.mhpmevent8), + RootCSRegister::mhpmevent9 => fold_raw(&self.mhpmevent9), + RootCSRegister::mhpmevent10 => fold_raw(&self.mhpmevent10), + RootCSRegister::mhpmevent11 => fold_raw(&self.mhpmevent11), + RootCSRegister::mhpmevent12 => fold_raw(&self.mhpmevent12), + RootCSRegister::mhpmevent13 => fold_raw(&self.mhpmevent13), + RootCSRegister::mhpmevent14 => fold_raw(&self.mhpmevent14), + RootCSRegister::mhpmevent15 => fold_raw(&self.mhpmevent15), + RootCSRegister::mhpmevent16 => fold_raw(&self.mhpmevent16), + RootCSRegister::mhpmevent17 => fold_raw(&self.mhpmevent17), + RootCSRegister::mhpmevent18 => fold_raw(&self.mhpmevent18), + RootCSRegister::mhpmevent19 => fold_raw(&self.mhpmevent19), + RootCSRegister::mhpmevent20 => fold_raw(&self.mhpmevent20), + RootCSRegister::mhpmevent21 => fold_raw(&self.mhpmevent21), + RootCSRegister::mhpmevent22 => fold_raw(&self.mhpmevent22), + RootCSRegister::mhpmevent23 => fold_raw(&self.mhpmevent23), + RootCSRegister::mhpmevent24 => fold_raw(&self.mhpmevent24), + RootCSRegister::mhpmevent25 => fold_raw(&self.mhpmevent25), + RootCSRegister::mhpmevent26 => fold_raw(&self.mhpmevent26), + RootCSRegister::mhpmevent27 => fold_raw(&self.mhpmevent27), + RootCSRegister::mhpmevent28 => fold_raw(&self.mhpmevent28), + RootCSRegister::mhpmevent29 => fold_raw(&self.mhpmevent29), + RootCSRegister::mhpmevent30 => fold_raw(&self.mhpmevent30), + RootCSRegister::mhpmevent31 => fold_raw(&self.mhpmevent31), + RootCSRegister::mcountinhibit => fold_raw(&self.mcountinhibit), + RootCSRegister::scounteren => fold_raw(&self.scounteren), + RootCSRegister::mcounteren => fold_raw(&self.mcounteren), + RootCSRegister::fcsr => fold_raw(&self.fcsr), + RootCSRegister::pmpcfg0 => fold_raw(&self.pmpcfg0), + RootCSRegister::pmpcfg2 => fold_raw(&self.pmpcfg2), + RootCSRegister::pmpcfg4 => fold_raw(&self.pmpcfg4), + RootCSRegister::pmpcfg6 => fold_raw(&self.pmpcfg6), + RootCSRegister::pmpcfg8 => fold_raw(&self.pmpcfg8), + RootCSRegister::pmpcfg10 => fold_raw(&self.pmpcfg10), + RootCSRegister::pmpcfg12 => fold_raw(&self.pmpcfg12), + RootCSRegister::pmpcfg14 => fold_raw(&self.pmpcfg14), + RootCSRegister::pmpaddr0 => fold_raw(&self.pmpaddr0), + RootCSRegister::pmpaddr1 => fold_raw(&self.pmpaddr1), + RootCSRegister::pmpaddr2 => fold_raw(&self.pmpaddr2), + RootCSRegister::pmpaddr3 => fold_raw(&self.pmpaddr3), + RootCSRegister::pmpaddr4 => fold_raw(&self.pmpaddr4), + RootCSRegister::pmpaddr5 => fold_raw(&self.pmpaddr5), + RootCSRegister::pmpaddr6 => fold_raw(&self.pmpaddr6), + RootCSRegister::pmpaddr7 => fold_raw(&self.pmpaddr7), + RootCSRegister::pmpaddr8 => fold_raw(&self.pmpaddr8), + RootCSRegister::pmpaddr9 => fold_raw(&self.pmpaddr9), + RootCSRegister::pmpaddr10 => fold_raw(&self.pmpaddr10), + RootCSRegister::pmpaddr11 => fold_raw(&self.pmpaddr11), + RootCSRegister::pmpaddr12 => fold_raw(&self.pmpaddr12), + RootCSRegister::pmpaddr13 => fold_raw(&self.pmpaddr13), + RootCSRegister::pmpaddr14 => fold_raw(&self.pmpaddr14), + RootCSRegister::pmpaddr15 => fold_raw(&self.pmpaddr15), + RootCSRegister::pmpaddr16 => fold_raw(&self.pmpaddr16), + RootCSRegister::pmpaddr17 => fold_raw(&self.pmpaddr17), + RootCSRegister::pmpaddr18 => fold_raw(&self.pmpaddr18), + RootCSRegister::pmpaddr19 => fold_raw(&self.pmpaddr19), + RootCSRegister::pmpaddr20 => fold_raw(&self.pmpaddr20), + RootCSRegister::pmpaddr21 => fold_raw(&self.pmpaddr21), + RootCSRegister::pmpaddr22 => fold_raw(&self.pmpaddr22), + RootCSRegister::pmpaddr23 => fold_raw(&self.pmpaddr23), + RootCSRegister::pmpaddr24 => fold_raw(&self.pmpaddr24), + RootCSRegister::pmpaddr25 => fold_raw(&self.pmpaddr25), + RootCSRegister::pmpaddr26 => fold_raw(&self.pmpaddr26), + RootCSRegister::pmpaddr27 => fold_raw(&self.pmpaddr27), + RootCSRegister::pmpaddr28 => fold_raw(&self.pmpaddr28), + RootCSRegister::pmpaddr29 => fold_raw(&self.pmpaddr29), + RootCSRegister::pmpaddr30 => fold_raw(&self.pmpaddr30), + RootCSRegister::pmpaddr31 => fold_raw(&self.pmpaddr31), + RootCSRegister::pmpaddr32 => fold_raw(&self.pmpaddr32), + RootCSRegister::pmpaddr33 => fold_raw(&self.pmpaddr33), + RootCSRegister::pmpaddr34 => fold_raw(&self.pmpaddr34), + RootCSRegister::pmpaddr35 => fold_raw(&self.pmpaddr35), + RootCSRegister::pmpaddr36 => fold_raw(&self.pmpaddr36), + RootCSRegister::pmpaddr37 => fold_raw(&self.pmpaddr37), + RootCSRegister::pmpaddr38 => fold_raw(&self.pmpaddr38), + RootCSRegister::pmpaddr39 => fold_raw(&self.pmpaddr39), + RootCSRegister::pmpaddr40 => fold_raw(&self.pmpaddr40), + RootCSRegister::pmpaddr41 => fold_raw(&self.pmpaddr41), + RootCSRegister::pmpaddr42 => fold_raw(&self.pmpaddr42), + RootCSRegister::pmpaddr43 => fold_raw(&self.pmpaddr43), + RootCSRegister::pmpaddr44 => fold_raw(&self.pmpaddr44), + RootCSRegister::pmpaddr45 => fold_raw(&self.pmpaddr45), + RootCSRegister::pmpaddr46 => fold_raw(&self.pmpaddr46), + RootCSRegister::pmpaddr47 => fold_raw(&self.pmpaddr47), + RootCSRegister::pmpaddr48 => fold_raw(&self.pmpaddr48), + RootCSRegister::pmpaddr49 => fold_raw(&self.pmpaddr49), + RootCSRegister::pmpaddr50 => fold_raw(&self.pmpaddr50), + RootCSRegister::pmpaddr51 => fold_raw(&self.pmpaddr51), + RootCSRegister::pmpaddr52 => fold_raw(&self.pmpaddr52), + RootCSRegister::pmpaddr53 => fold_raw(&self.pmpaddr53), + RootCSRegister::pmpaddr54 => fold_raw(&self.pmpaddr54), + RootCSRegister::pmpaddr55 => fold_raw(&self.pmpaddr55), + RootCSRegister::pmpaddr56 => fold_raw(&self.pmpaddr56), + RootCSRegister::pmpaddr57 => fold_raw(&self.pmpaddr57), + RootCSRegister::pmpaddr58 => fold_raw(&self.pmpaddr58), + RootCSRegister::pmpaddr59 => fold_raw(&self.pmpaddr59), + RootCSRegister::pmpaddr60 => fold_raw(&self.pmpaddr60), + RootCSRegister::pmpaddr61 => fold_raw(&self.pmpaddr61), + RootCSRegister::pmpaddr62 => fold_raw(&self.pmpaddr62), + RootCSRegister::pmpaddr63 => fold_raw(&self.pmpaddr63), + RootCSRegister::mhartid => fold_raw(&self.mhartid), + RootCSRegister::mvendorid => fold_raw(&self.mvendorid), + RootCSRegister::marchid => fold_raw(&self.marchid), + RootCSRegister::mimpid => fold_raw(&self.mimpid), + RootCSRegister::misa => fold_raw(&self.misa), + RootCSRegister::mscratch => fold_raw(&self.mscratch), + RootCSRegister::sscratch => fold_raw(&self.sscratch), + RootCSRegister::stvec => fold_raw(&self.stvec), + RootCSRegister::mtvec => fold_raw(&self.mtvec), + RootCSRegister::mie => fold_raw(&self.mie), + RootCSRegister::satp => fold_raw(&self.satp), + RootCSRegister::scause => fold_raw(&self.scause), + RootCSRegister::mcause => fold_raw(&self.mcause), + RootCSRegister::sepc => fold_raw(&self.sepc), + RootCSRegister::mepc => fold_raw(&self.mepc), + RootCSRegister::stval => fold_raw(&self.stval), + RootCSRegister::mtval => fold_raw(&self.mtval), + RootCSRegister::mtval2 => fold_raw(&self.mtval2), + RootCSRegister::mtinst => fold_raw(&self.mtinst), + RootCSRegister::senvcfg => fold_raw(&self.senvcfg), + RootCSRegister::menvcfg => fold_raw(&self.menvcfg), + RootCSRegister::mconfigptr => fold_raw(&self.mconfigptr), + RootCSRegister::medeleg => fold_raw(&self.medeleg), + RootCSRegister::mideleg => fold_raw(&self.mideleg), + RootCSRegister::mseccfg => fold_raw(&self.mseccfg), + RootCSRegister::scontext => fold_raw(&self.scontext), + RootCSRegister::hstatus => fold_raw(&self.hstatus), + RootCSRegister::hedeleg => fold_raw(&self.hedeleg), + RootCSRegister::hideleg => fold_raw(&self.hideleg), + RootCSRegister::hie => fold_raw(&self.hie), + RootCSRegister::hcounteren => fold_raw(&self.hcounteren), + RootCSRegister::hgeie => fold_raw(&self.hgeie), + RootCSRegister::htval => fold_raw(&self.htval), + RootCSRegister::hip => fold_raw(&self.hip), + RootCSRegister::hvip => fold_raw(&self.hvip), + RootCSRegister::htinst => fold_raw(&self.htinst), + RootCSRegister::hgeip => fold_raw(&self.hgeip), + RootCSRegister::henvcfg => fold_raw(&self.henvcfg), + RootCSRegister::hgatp => fold_raw(&self.hgatp), + RootCSRegister::hcontext => fold_raw(&self.hcontext), + RootCSRegister::htimedelta => fold_raw(&self.htimedelta), + RootCSRegister::vsstatus => fold_raw(&self.vsstatus), + RootCSRegister::vsie => fold_raw(&self.vsie), + RootCSRegister::vstvec => fold_raw(&self.vstvec), + RootCSRegister::vsscratch => fold_raw(&self.vsscratch), + RootCSRegister::vsepc => fold_raw(&self.vsepc), + RootCSRegister::vscause => fold_raw(&self.vscause), + RootCSRegister::vstval => fold_raw(&self.vstval), + RootCSRegister::vsip => fold_raw(&self.vsip), + RootCSRegister::vsatp => fold_raw(&self.vsatp), + RootCSRegister::tselect => fold_raw(&self.tselect), + RootCSRegister::tdata1 => fold_raw(&self.tdata1), + RootCSRegister::tdata2 => fold_raw(&self.tdata2), + RootCSRegister::tdata3 => fold_raw(&self.tdata3), + RootCSRegister::tcontrol => fold_raw(&self.tcontrol), + RootCSRegister::mcontext => fold_raw(&self.mcontext), + RootCSRegister::dcsr => fold_raw(&self.dcsr), + RootCSRegister::dpc => fold_raw(&self.dpc), + RootCSRegister::dscratch0 => fold_raw(&self.dscratch0), + RootCSRegister::dscratch1 => fold_raw(&self.dscratch1), } } - fn allocate(backend: &mut M, placed: Self::Placed) -> Self::Allocated { - Self::Allocated { - mstatus: ::allocate(backend, placed.mstatus), - mnscratch: ::allocate(backend, placed.mnscratch), - mnepc: ::allocate(backend, placed.mnepc), - mncause: ::allocate(backend, placed.mncause), - mnstatus: ::allocate(backend, placed.mnstatus), - cycle: ::allocate(backend, placed.cycle), - time: ::allocate(backend, placed.time), - instret: ::allocate(backend, placed.instret), - mcycle: ::allocate(backend, placed.mcycle), - minstret: ::allocate(backend, placed.minstret), - hpmcounter3: ::allocate(backend, placed.hpmcounter3), - hpmcounter4: ::allocate(backend, placed.hpmcounter4), - hpmcounter5: ::allocate(backend, placed.hpmcounter5), - hpmcounter6: ::allocate(backend, placed.hpmcounter6), - hpmcounter7: ::allocate(backend, placed.hpmcounter7), - hpmcounter8: ::allocate(backend, placed.hpmcounter8), - hpmcounter9: ::allocate(backend, placed.hpmcounter9), - hpmcounter10: ::allocate(backend, placed.hpmcounter10), - hpmcounter11: ::allocate(backend, placed.hpmcounter11), - hpmcounter12: ::allocate(backend, placed.hpmcounter12), - hpmcounter13: ::allocate(backend, placed.hpmcounter13), - hpmcounter14: ::allocate(backend, placed.hpmcounter14), - hpmcounter15: ::allocate(backend, placed.hpmcounter15), - hpmcounter16: ::allocate(backend, placed.hpmcounter16), - hpmcounter17: ::allocate(backend, placed.hpmcounter17), - hpmcounter18: ::allocate(backend, placed.hpmcounter18), - hpmcounter19: ::allocate(backend, placed.hpmcounter19), - hpmcounter20: ::allocate(backend, placed.hpmcounter20), - hpmcounter21: ::allocate(backend, placed.hpmcounter21), - hpmcounter22: ::allocate(backend, placed.hpmcounter22), - hpmcounter23: ::allocate(backend, placed.hpmcounter23), - hpmcounter24: ::allocate(backend, placed.hpmcounter24), - hpmcounter25: ::allocate(backend, placed.hpmcounter25), - hpmcounter26: ::allocate(backend, placed.hpmcounter26), - hpmcounter27: ::allocate(backend, placed.hpmcounter27), - hpmcounter28: ::allocate(backend, placed.hpmcounter28), - hpmcounter29: ::allocate(backend, placed.hpmcounter29), - hpmcounter30: ::allocate(backend, placed.hpmcounter30), - hpmcounter31: ::allocate(backend, placed.hpmcounter31), - mhpmcounter3: ::allocate(backend, placed.mhpmcounter3), - mhpmcounter4: ::allocate(backend, placed.mhpmcounter4), - mhpmcounter5: ::allocate(backend, placed.mhpmcounter5), - mhpmcounter6: ::allocate(backend, placed.mhpmcounter6), - mhpmcounter7: ::allocate(backend, placed.mhpmcounter7), - mhpmcounter8: ::allocate(backend, placed.mhpmcounter8), - mhpmcounter9: ::allocate(backend, placed.mhpmcounter9), - mhpmcounter10: ::allocate(backend, placed.mhpmcounter10), - mhpmcounter11: ::allocate(backend, placed.mhpmcounter11), - mhpmcounter12: ::allocate(backend, placed.mhpmcounter12), - mhpmcounter13: ::allocate(backend, placed.mhpmcounter13), - mhpmcounter14: ::allocate(backend, placed.mhpmcounter14), - mhpmcounter15: ::allocate(backend, placed.mhpmcounter15), - mhpmcounter16: ::allocate(backend, placed.mhpmcounter16), - mhpmcounter17: ::allocate(backend, placed.mhpmcounter17), - mhpmcounter18: ::allocate(backend, placed.mhpmcounter18), - mhpmcounter19: ::allocate(backend, placed.mhpmcounter19), - mhpmcounter20: ::allocate(backend, placed.mhpmcounter20), - mhpmcounter21: ::allocate(backend, placed.mhpmcounter21), - mhpmcounter22: ::allocate(backend, placed.mhpmcounter22), - mhpmcounter23: ::allocate(backend, placed.mhpmcounter23), - mhpmcounter24: ::allocate(backend, placed.mhpmcounter24), - mhpmcounter25: ::allocate(backend, placed.mhpmcounter25), - mhpmcounter26: ::allocate(backend, placed.mhpmcounter26), - mhpmcounter27: ::allocate(backend, placed.mhpmcounter27), - mhpmcounter28: ::allocate(backend, placed.mhpmcounter28), - mhpmcounter29: ::allocate(backend, placed.mhpmcounter29), - mhpmcounter30: ::allocate(backend, placed.mhpmcounter30), - mhpmcounter31: ::allocate(backend, placed.mhpmcounter31), - mhpmevent3: ::allocate(backend, placed.mhpmevent3), - mhpmevent4: ::allocate(backend, placed.mhpmevent4), - mhpmevent5: ::allocate(backend, placed.mhpmevent5), - mhpmevent6: ::allocate(backend, placed.mhpmevent6), - mhpmevent7: ::allocate(backend, placed.mhpmevent7), - mhpmevent8: ::allocate(backend, placed.mhpmevent8), - mhpmevent9: ::allocate(backend, placed.mhpmevent9), - mhpmevent10: ::allocate(backend, placed.mhpmevent10), - mhpmevent11: ::allocate(backend, placed.mhpmevent11), - mhpmevent12: ::allocate(backend, placed.mhpmevent12), - mhpmevent13: ::allocate(backend, placed.mhpmevent13), - mhpmevent14: ::allocate(backend, placed.mhpmevent14), - mhpmevent15: ::allocate(backend, placed.mhpmevent15), - mhpmevent16: ::allocate(backend, placed.mhpmevent16), - mhpmevent17: ::allocate(backend, placed.mhpmevent17), - mhpmevent18: ::allocate(backend, placed.mhpmevent18), - mhpmevent19: ::allocate(backend, placed.mhpmevent19), - mhpmevent20: ::allocate(backend, placed.mhpmevent20), - mhpmevent21: ::allocate(backend, placed.mhpmevent21), - mhpmevent22: ::allocate(backend, placed.mhpmevent22), - mhpmevent23: ::allocate(backend, placed.mhpmevent23), - mhpmevent24: ::allocate(backend, placed.mhpmevent24), - mhpmevent25: ::allocate(backend, placed.mhpmevent25), - mhpmevent26: ::allocate(backend, placed.mhpmevent26), - mhpmevent27: ::allocate(backend, placed.mhpmevent27), - mhpmevent28: ::allocate(backend, placed.mhpmevent28), - mhpmevent29: ::allocate(backend, placed.mhpmevent29), - mhpmevent30: ::allocate(backend, placed.mhpmevent30), - mhpmevent31: ::allocate(backend, placed.mhpmevent31), - mcountinhibit: ::allocate(backend, placed.mcountinhibit), - scounteren: ::allocate(backend, placed.scounteren), - mcounteren: ::allocate(backend, placed.mcounteren), - fcsr: ::allocate(backend, placed.fcsr), - pmpcfg0: ::allocate(backend, placed.pmpcfg0), - pmpcfg2: ::allocate(backend, placed.pmpcfg2), - pmpcfg4: ::allocate(backend, placed.pmpcfg4), - pmpcfg6: ::allocate(backend, placed.pmpcfg6), - pmpcfg8: ::allocate(backend, placed.pmpcfg8), - pmpcfg10: ::allocate(backend, placed.pmpcfg10), - pmpcfg12: ::allocate(backend, placed.pmpcfg12), - pmpcfg14: ::allocate(backend, placed.pmpcfg14), - pmpaddr0: ::allocate(backend, placed.pmpaddr0), - pmpaddr1: ::allocate(backend, placed.pmpaddr1), - pmpaddr2: ::allocate(backend, placed.pmpaddr2), - pmpaddr3: ::allocate(backend, placed.pmpaddr3), - pmpaddr4: ::allocate(backend, placed.pmpaddr4), - pmpaddr5: ::allocate(backend, placed.pmpaddr5), - pmpaddr6: ::allocate(backend, placed.pmpaddr6), - pmpaddr7: ::allocate(backend, placed.pmpaddr7), - pmpaddr8: ::allocate(backend, placed.pmpaddr8), - pmpaddr9: ::allocate(backend, placed.pmpaddr9), - pmpaddr10: ::allocate(backend, placed.pmpaddr10), - pmpaddr11: ::allocate(backend, placed.pmpaddr11), - pmpaddr12: ::allocate(backend, placed.pmpaddr12), - pmpaddr13: ::allocate(backend, placed.pmpaddr13), - pmpaddr14: ::allocate(backend, placed.pmpaddr14), - pmpaddr15: ::allocate(backend, placed.pmpaddr15), - pmpaddr16: ::allocate(backend, placed.pmpaddr16), - pmpaddr17: ::allocate(backend, placed.pmpaddr17), - pmpaddr18: ::allocate(backend, placed.pmpaddr18), - pmpaddr19: ::allocate(backend, placed.pmpaddr19), - pmpaddr20: ::allocate(backend, placed.pmpaddr20), - pmpaddr21: ::allocate(backend, placed.pmpaddr21), - pmpaddr22: ::allocate(backend, placed.pmpaddr22), - pmpaddr23: ::allocate(backend, placed.pmpaddr23), - pmpaddr24: ::allocate(backend, placed.pmpaddr24), - pmpaddr25: ::allocate(backend, placed.pmpaddr25), - pmpaddr26: ::allocate(backend, placed.pmpaddr26), - pmpaddr27: ::allocate(backend, placed.pmpaddr27), - pmpaddr28: ::allocate(backend, placed.pmpaddr28), - pmpaddr29: ::allocate(backend, placed.pmpaddr29), - pmpaddr30: ::allocate(backend, placed.pmpaddr30), - pmpaddr31: ::allocate(backend, placed.pmpaddr31), - pmpaddr32: ::allocate(backend, placed.pmpaddr32), - pmpaddr33: ::allocate(backend, placed.pmpaddr33), - pmpaddr34: ::allocate(backend, placed.pmpaddr34), - pmpaddr35: ::allocate(backend, placed.pmpaddr35), - pmpaddr36: ::allocate(backend, placed.pmpaddr36), - pmpaddr37: ::allocate(backend, placed.pmpaddr37), - pmpaddr38: ::allocate(backend, placed.pmpaddr38), - pmpaddr39: ::allocate(backend, placed.pmpaddr39), - pmpaddr40: ::allocate(backend, placed.pmpaddr40), - pmpaddr41: ::allocate(backend, placed.pmpaddr41), - pmpaddr42: ::allocate(backend, placed.pmpaddr42), - pmpaddr43: ::allocate(backend, placed.pmpaddr43), - pmpaddr44: ::allocate(backend, placed.pmpaddr44), - pmpaddr45: ::allocate(backend, placed.pmpaddr45), - pmpaddr46: ::allocate(backend, placed.pmpaddr46), - pmpaddr47: ::allocate(backend, placed.pmpaddr47), - pmpaddr48: ::allocate(backend, placed.pmpaddr48), - pmpaddr49: ::allocate(backend, placed.pmpaddr49), - pmpaddr50: ::allocate(backend, placed.pmpaddr50), - pmpaddr51: ::allocate(backend, placed.pmpaddr51), - pmpaddr52: ::allocate(backend, placed.pmpaddr52), - pmpaddr53: ::allocate(backend, placed.pmpaddr53), - pmpaddr54: ::allocate(backend, placed.pmpaddr54), - pmpaddr55: ::allocate(backend, placed.pmpaddr55), - pmpaddr56: ::allocate(backend, placed.pmpaddr56), - pmpaddr57: ::allocate(backend, placed.pmpaddr57), - pmpaddr58: ::allocate(backend, placed.pmpaddr58), - pmpaddr59: ::allocate(backend, placed.pmpaddr59), - pmpaddr60: ::allocate(backend, placed.pmpaddr60), - pmpaddr61: ::allocate(backend, placed.pmpaddr61), - pmpaddr62: ::allocate(backend, placed.pmpaddr62), - pmpaddr63: ::allocate(backend, placed.pmpaddr63), - mhartid: ::allocate(backend, placed.mhartid), - mvendorid: ::allocate(backend, placed.mvendorid), - marchid: ::allocate(backend, placed.marchid), - mimpid: ::allocate(backend, placed.mimpid), - misa: ::allocate(backend, placed.misa), - mscratch: ::allocate(backend, placed.mscratch), - sscratch: ::allocate(backend, placed.sscratch), - stvec: ::allocate(backend, placed.stvec), - mtvec: ::allocate(backend, placed.mtvec), - mie: ::allocate(backend, placed.mie), - satp: ::allocate(backend, placed.satp), - scause: ::allocate(backend, placed.scause), - mcause: ::allocate(backend, placed.mcause), - sepc: ::allocate(backend, placed.sepc), - mepc: ::allocate(backend, placed.mepc), - stval: ::allocate(backend, placed.stval), - mtval: ::allocate(backend, placed.mtval), - mtval2: ::allocate(backend, placed.mtval2), - mip: ::allocate(backend, placed.mip), - mtinst: ::allocate(backend, placed.mtinst), - senvcfg: ::allocate(backend, placed.senvcfg), - menvcfg: ::allocate(backend, placed.menvcfg), - mconfigptr: ::allocate(backend, placed.mconfigptr), - medeleg: ::allocate(backend, placed.medeleg), - mideleg: ::allocate(backend, placed.mideleg), - mseccfg: ::allocate(backend, placed.mseccfg), - scontext: ::allocate(backend, placed.scontext), - hstatus: ::allocate(backend, placed.hstatus), - hedeleg: ::allocate(backend, placed.hedeleg), - hideleg: ::allocate(backend, placed.hideleg), - hie: ::allocate(backend, placed.hie), - hcounteren: ::allocate(backend, placed.hcounteren), - hgeie: ::allocate(backend, placed.hgeie), - htval: ::allocate(backend, placed.htval), - hip: ::allocate(backend, placed.hip), - hvip: ::allocate(backend, placed.hvip), - htinst: ::allocate(backend, placed.htinst), - hgeip: ::allocate(backend, placed.hgeip), - henvcfg: ::allocate(backend, placed.henvcfg), - hgatp: ::allocate(backend, placed.hgatp), - hcontext: ::allocate(backend, placed.hcontext), - htimedelta: ::allocate(backend, placed.htimedelta), - vsstatus: ::allocate(backend, placed.vsstatus), - vsie: ::allocate(backend, placed.vsie), - vstvec: ::allocate(backend, placed.vstvec), - vsscratch: ::allocate(backend, placed.vsscratch), - vsepc: ::allocate(backend, placed.vsepc), - vscause: ::allocate(backend, placed.vscause), - vstval: ::allocate(backend, placed.vstval), - vsip: ::allocate(backend, placed.vsip), - vsatp: ::allocate(backend, placed.vsatp), - tselect: ::allocate(backend, placed.tselect), - tdata1: ::allocate(backend, placed.tdata1), - tdata2: ::allocate(backend, placed.tdata2), - tdata3: ::allocate(backend, placed.tdata3), - tcontrol: ::allocate(backend, placed.tcontrol), - mcontext: ::allocate(backend, placed.mcontext), - dcsr: ::allocate(backend, placed.dcsr), - dpc: ::allocate(backend, placed.dpc), - dscratch0: ::allocate(backend, placed.dscratch0), - dscratch1: ::allocate(backend, placed.dscratch1), + /// Select a field representing a CSR value and apply a function to it, returing its result. + #[inline(always)] + fn select_mut( + &mut self, + csr: RootCSRegister, + fold_mstatus: impl FnOnce(&mut MStatus) -> R, + fold_mip: impl FnOnce(&mut MIP) -> R, + fold_raw: impl FnOnce(&mut Raw) -> R, + ) -> R { + match csr { + RootCSRegister::mstatus => fold_mstatus(&mut self.mstatus), + RootCSRegister::mip => fold_mip(&mut self.mip), + RootCSRegister::mnscratch => fold_raw(&mut self.mnscratch), + RootCSRegister::mnepc => fold_raw(&mut self.mnepc), + RootCSRegister::mncause => fold_raw(&mut self.mncause), + RootCSRegister::mnstatus => fold_raw(&mut self.mnstatus), + RootCSRegister::cycle => fold_raw(&mut self.cycle), + RootCSRegister::time => fold_raw(&mut self.time), + RootCSRegister::instret => fold_raw(&mut self.instret), + RootCSRegister::mcycle => fold_raw(&mut self.mcycle), + RootCSRegister::minstret => fold_raw(&mut self.minstret), + RootCSRegister::hpmcounter3 => fold_raw(&mut self.hpmcounter3), + RootCSRegister::hpmcounter4 => fold_raw(&mut self.hpmcounter4), + RootCSRegister::hpmcounter5 => fold_raw(&mut self.hpmcounter5), + RootCSRegister::hpmcounter6 => fold_raw(&mut self.hpmcounter6), + RootCSRegister::hpmcounter7 => fold_raw(&mut self.hpmcounter7), + RootCSRegister::hpmcounter8 => fold_raw(&mut self.hpmcounter8), + RootCSRegister::hpmcounter9 => fold_raw(&mut self.hpmcounter9), + RootCSRegister::hpmcounter10 => fold_raw(&mut self.hpmcounter10), + RootCSRegister::hpmcounter11 => fold_raw(&mut self.hpmcounter11), + RootCSRegister::hpmcounter12 => fold_raw(&mut self.hpmcounter12), + RootCSRegister::hpmcounter13 => fold_raw(&mut self.hpmcounter13), + RootCSRegister::hpmcounter14 => fold_raw(&mut self.hpmcounter14), + RootCSRegister::hpmcounter15 => fold_raw(&mut self.hpmcounter15), + RootCSRegister::hpmcounter16 => fold_raw(&mut self.hpmcounter16), + RootCSRegister::hpmcounter17 => fold_raw(&mut self.hpmcounter17), + RootCSRegister::hpmcounter18 => fold_raw(&mut self.hpmcounter18), + RootCSRegister::hpmcounter19 => fold_raw(&mut self.hpmcounter19), + RootCSRegister::hpmcounter20 => fold_raw(&mut self.hpmcounter20), + RootCSRegister::hpmcounter21 => fold_raw(&mut self.hpmcounter21), + RootCSRegister::hpmcounter22 => fold_raw(&mut self.hpmcounter22), + RootCSRegister::hpmcounter23 => fold_raw(&mut self.hpmcounter23), + RootCSRegister::hpmcounter24 => fold_raw(&mut self.hpmcounter24), + RootCSRegister::hpmcounter25 => fold_raw(&mut self.hpmcounter25), + RootCSRegister::hpmcounter26 => fold_raw(&mut self.hpmcounter26), + RootCSRegister::hpmcounter27 => fold_raw(&mut self.hpmcounter27), + RootCSRegister::hpmcounter28 => fold_raw(&mut self.hpmcounter28), + RootCSRegister::hpmcounter29 => fold_raw(&mut self.hpmcounter29), + RootCSRegister::hpmcounter30 => fold_raw(&mut self.hpmcounter30), + RootCSRegister::hpmcounter31 => fold_raw(&mut self.hpmcounter31), + RootCSRegister::mhpmcounter3 => fold_raw(&mut self.mhpmcounter3), + RootCSRegister::mhpmcounter4 => fold_raw(&mut self.mhpmcounter4), + RootCSRegister::mhpmcounter5 => fold_raw(&mut self.mhpmcounter5), + RootCSRegister::mhpmcounter6 => fold_raw(&mut self.mhpmcounter6), + RootCSRegister::mhpmcounter7 => fold_raw(&mut self.mhpmcounter7), + RootCSRegister::mhpmcounter8 => fold_raw(&mut self.mhpmcounter8), + RootCSRegister::mhpmcounter9 => fold_raw(&mut self.mhpmcounter9), + RootCSRegister::mhpmcounter10 => fold_raw(&mut self.mhpmcounter10), + RootCSRegister::mhpmcounter11 => fold_raw(&mut self.mhpmcounter11), + RootCSRegister::mhpmcounter12 => fold_raw(&mut self.mhpmcounter12), + RootCSRegister::mhpmcounter13 => fold_raw(&mut self.mhpmcounter13), + RootCSRegister::mhpmcounter14 => fold_raw(&mut self.mhpmcounter14), + RootCSRegister::mhpmcounter15 => fold_raw(&mut self.mhpmcounter15), + RootCSRegister::mhpmcounter16 => fold_raw(&mut self.mhpmcounter16), + RootCSRegister::mhpmcounter17 => fold_raw(&mut self.mhpmcounter17), + RootCSRegister::mhpmcounter18 => fold_raw(&mut self.mhpmcounter18), + RootCSRegister::mhpmcounter19 => fold_raw(&mut self.mhpmcounter19), + RootCSRegister::mhpmcounter20 => fold_raw(&mut self.mhpmcounter20), + RootCSRegister::mhpmcounter21 => fold_raw(&mut self.mhpmcounter21), + RootCSRegister::mhpmcounter22 => fold_raw(&mut self.mhpmcounter22), + RootCSRegister::mhpmcounter23 => fold_raw(&mut self.mhpmcounter23), + RootCSRegister::mhpmcounter24 => fold_raw(&mut self.mhpmcounter24), + RootCSRegister::mhpmcounter25 => fold_raw(&mut self.mhpmcounter25), + RootCSRegister::mhpmcounter26 => fold_raw(&mut self.mhpmcounter26), + RootCSRegister::mhpmcounter27 => fold_raw(&mut self.mhpmcounter27), + RootCSRegister::mhpmcounter28 => fold_raw(&mut self.mhpmcounter28), + RootCSRegister::mhpmcounter29 => fold_raw(&mut self.mhpmcounter29), + RootCSRegister::mhpmcounter30 => fold_raw(&mut self.mhpmcounter30), + RootCSRegister::mhpmcounter31 => fold_raw(&mut self.mhpmcounter31), + RootCSRegister::mhpmevent3 => fold_raw(&mut self.mhpmevent3), + RootCSRegister::mhpmevent4 => fold_raw(&mut self.mhpmevent4), + RootCSRegister::mhpmevent5 => fold_raw(&mut self.mhpmevent5), + RootCSRegister::mhpmevent6 => fold_raw(&mut self.mhpmevent6), + RootCSRegister::mhpmevent7 => fold_raw(&mut self.mhpmevent7), + RootCSRegister::mhpmevent8 => fold_raw(&mut self.mhpmevent8), + RootCSRegister::mhpmevent9 => fold_raw(&mut self.mhpmevent9), + RootCSRegister::mhpmevent10 => fold_raw(&mut self.mhpmevent10), + RootCSRegister::mhpmevent11 => fold_raw(&mut self.mhpmevent11), + RootCSRegister::mhpmevent12 => fold_raw(&mut self.mhpmevent12), + RootCSRegister::mhpmevent13 => fold_raw(&mut self.mhpmevent13), + RootCSRegister::mhpmevent14 => fold_raw(&mut self.mhpmevent14), + RootCSRegister::mhpmevent15 => fold_raw(&mut self.mhpmevent15), + RootCSRegister::mhpmevent16 => fold_raw(&mut self.mhpmevent16), + RootCSRegister::mhpmevent17 => fold_raw(&mut self.mhpmevent17), + RootCSRegister::mhpmevent18 => fold_raw(&mut self.mhpmevent18), + RootCSRegister::mhpmevent19 => fold_raw(&mut self.mhpmevent19), + RootCSRegister::mhpmevent20 => fold_raw(&mut self.mhpmevent20), + RootCSRegister::mhpmevent21 => fold_raw(&mut self.mhpmevent21), + RootCSRegister::mhpmevent22 => fold_raw(&mut self.mhpmevent22), + RootCSRegister::mhpmevent23 => fold_raw(&mut self.mhpmevent23), + RootCSRegister::mhpmevent24 => fold_raw(&mut self.mhpmevent24), + RootCSRegister::mhpmevent25 => fold_raw(&mut self.mhpmevent25), + RootCSRegister::mhpmevent26 => fold_raw(&mut self.mhpmevent26), + RootCSRegister::mhpmevent27 => fold_raw(&mut self.mhpmevent27), + RootCSRegister::mhpmevent28 => fold_raw(&mut self.mhpmevent28), + RootCSRegister::mhpmevent29 => fold_raw(&mut self.mhpmevent29), + RootCSRegister::mhpmevent30 => fold_raw(&mut self.mhpmevent30), + RootCSRegister::mhpmevent31 => fold_raw(&mut self.mhpmevent31), + RootCSRegister::mcountinhibit => fold_raw(&mut self.mcountinhibit), + RootCSRegister::scounteren => fold_raw(&mut self.scounteren), + RootCSRegister::mcounteren => fold_raw(&mut self.mcounteren), + RootCSRegister::fcsr => fold_raw(&mut self.fcsr), + RootCSRegister::pmpcfg0 => fold_raw(&mut self.pmpcfg0), + RootCSRegister::pmpcfg2 => fold_raw(&mut self.pmpcfg2), + RootCSRegister::pmpcfg4 => fold_raw(&mut self.pmpcfg4), + RootCSRegister::pmpcfg6 => fold_raw(&mut self.pmpcfg6), + RootCSRegister::pmpcfg8 => fold_raw(&mut self.pmpcfg8), + RootCSRegister::pmpcfg10 => fold_raw(&mut self.pmpcfg10), + RootCSRegister::pmpcfg12 => fold_raw(&mut self.pmpcfg12), + RootCSRegister::pmpcfg14 => fold_raw(&mut self.pmpcfg14), + RootCSRegister::pmpaddr0 => fold_raw(&mut self.pmpaddr0), + RootCSRegister::pmpaddr1 => fold_raw(&mut self.pmpaddr1), + RootCSRegister::pmpaddr2 => fold_raw(&mut self.pmpaddr2), + RootCSRegister::pmpaddr3 => fold_raw(&mut self.pmpaddr3), + RootCSRegister::pmpaddr4 => fold_raw(&mut self.pmpaddr4), + RootCSRegister::pmpaddr5 => fold_raw(&mut self.pmpaddr5), + RootCSRegister::pmpaddr6 => fold_raw(&mut self.pmpaddr6), + RootCSRegister::pmpaddr7 => fold_raw(&mut self.pmpaddr7), + RootCSRegister::pmpaddr8 => fold_raw(&mut self.pmpaddr8), + RootCSRegister::pmpaddr9 => fold_raw(&mut self.pmpaddr9), + RootCSRegister::pmpaddr10 => fold_raw(&mut self.pmpaddr10), + RootCSRegister::pmpaddr11 => fold_raw(&mut self.pmpaddr11), + RootCSRegister::pmpaddr12 => fold_raw(&mut self.pmpaddr12), + RootCSRegister::pmpaddr13 => fold_raw(&mut self.pmpaddr13), + RootCSRegister::pmpaddr14 => fold_raw(&mut self.pmpaddr14), + RootCSRegister::pmpaddr15 => fold_raw(&mut self.pmpaddr15), + RootCSRegister::pmpaddr16 => fold_raw(&mut self.pmpaddr16), + RootCSRegister::pmpaddr17 => fold_raw(&mut self.pmpaddr17), + RootCSRegister::pmpaddr18 => fold_raw(&mut self.pmpaddr18), + RootCSRegister::pmpaddr19 => fold_raw(&mut self.pmpaddr19), + RootCSRegister::pmpaddr20 => fold_raw(&mut self.pmpaddr20), + RootCSRegister::pmpaddr21 => fold_raw(&mut self.pmpaddr21), + RootCSRegister::pmpaddr22 => fold_raw(&mut self.pmpaddr22), + RootCSRegister::pmpaddr23 => fold_raw(&mut self.pmpaddr23), + RootCSRegister::pmpaddr24 => fold_raw(&mut self.pmpaddr24), + RootCSRegister::pmpaddr25 => fold_raw(&mut self.pmpaddr25), + RootCSRegister::pmpaddr26 => fold_raw(&mut self.pmpaddr26), + RootCSRegister::pmpaddr27 => fold_raw(&mut self.pmpaddr27), + RootCSRegister::pmpaddr28 => fold_raw(&mut self.pmpaddr28), + RootCSRegister::pmpaddr29 => fold_raw(&mut self.pmpaddr29), + RootCSRegister::pmpaddr30 => fold_raw(&mut self.pmpaddr30), + RootCSRegister::pmpaddr31 => fold_raw(&mut self.pmpaddr31), + RootCSRegister::pmpaddr32 => fold_raw(&mut self.pmpaddr32), + RootCSRegister::pmpaddr33 => fold_raw(&mut self.pmpaddr33), + RootCSRegister::pmpaddr34 => fold_raw(&mut self.pmpaddr34), + RootCSRegister::pmpaddr35 => fold_raw(&mut self.pmpaddr35), + RootCSRegister::pmpaddr36 => fold_raw(&mut self.pmpaddr36), + RootCSRegister::pmpaddr37 => fold_raw(&mut self.pmpaddr37), + RootCSRegister::pmpaddr38 => fold_raw(&mut self.pmpaddr38), + RootCSRegister::pmpaddr39 => fold_raw(&mut self.pmpaddr39), + RootCSRegister::pmpaddr40 => fold_raw(&mut self.pmpaddr40), + RootCSRegister::pmpaddr41 => fold_raw(&mut self.pmpaddr41), + RootCSRegister::pmpaddr42 => fold_raw(&mut self.pmpaddr42), + RootCSRegister::pmpaddr43 => fold_raw(&mut self.pmpaddr43), + RootCSRegister::pmpaddr44 => fold_raw(&mut self.pmpaddr44), + RootCSRegister::pmpaddr45 => fold_raw(&mut self.pmpaddr45), + RootCSRegister::pmpaddr46 => fold_raw(&mut self.pmpaddr46), + RootCSRegister::pmpaddr47 => fold_raw(&mut self.pmpaddr47), + RootCSRegister::pmpaddr48 => fold_raw(&mut self.pmpaddr48), + RootCSRegister::pmpaddr49 => fold_raw(&mut self.pmpaddr49), + RootCSRegister::pmpaddr50 => fold_raw(&mut self.pmpaddr50), + RootCSRegister::pmpaddr51 => fold_raw(&mut self.pmpaddr51), + RootCSRegister::pmpaddr52 => fold_raw(&mut self.pmpaddr52), + RootCSRegister::pmpaddr53 => fold_raw(&mut self.pmpaddr53), + RootCSRegister::pmpaddr54 => fold_raw(&mut self.pmpaddr54), + RootCSRegister::pmpaddr55 => fold_raw(&mut self.pmpaddr55), + RootCSRegister::pmpaddr56 => fold_raw(&mut self.pmpaddr56), + RootCSRegister::pmpaddr57 => fold_raw(&mut self.pmpaddr57), + RootCSRegister::pmpaddr58 => fold_raw(&mut self.pmpaddr58), + RootCSRegister::pmpaddr59 => fold_raw(&mut self.pmpaddr59), + RootCSRegister::pmpaddr60 => fold_raw(&mut self.pmpaddr60), + RootCSRegister::pmpaddr61 => fold_raw(&mut self.pmpaddr61), + RootCSRegister::pmpaddr62 => fold_raw(&mut self.pmpaddr62), + RootCSRegister::pmpaddr63 => fold_raw(&mut self.pmpaddr63), + RootCSRegister::mhartid => fold_raw(&mut self.mhartid), + RootCSRegister::mvendorid => fold_raw(&mut self.mvendorid), + RootCSRegister::marchid => fold_raw(&mut self.marchid), + RootCSRegister::mimpid => fold_raw(&mut self.mimpid), + RootCSRegister::misa => fold_raw(&mut self.misa), + RootCSRegister::mscratch => fold_raw(&mut self.mscratch), + RootCSRegister::sscratch => fold_raw(&mut self.sscratch), + RootCSRegister::stvec => fold_raw(&mut self.stvec), + RootCSRegister::mtvec => fold_raw(&mut self.mtvec), + RootCSRegister::mie => fold_raw(&mut self.mie), + RootCSRegister::satp => fold_raw(&mut self.satp), + RootCSRegister::scause => fold_raw(&mut self.scause), + RootCSRegister::mcause => fold_raw(&mut self.mcause), + RootCSRegister::sepc => fold_raw(&mut self.sepc), + RootCSRegister::mepc => fold_raw(&mut self.mepc), + RootCSRegister::stval => fold_raw(&mut self.stval), + RootCSRegister::mtval => fold_raw(&mut self.mtval), + RootCSRegister::mtval2 => fold_raw(&mut self.mtval2), + RootCSRegister::mtinst => fold_raw(&mut self.mtinst), + RootCSRegister::senvcfg => fold_raw(&mut self.senvcfg), + RootCSRegister::menvcfg => fold_raw(&mut self.menvcfg), + RootCSRegister::mconfigptr => fold_raw(&mut self.mconfigptr), + RootCSRegister::medeleg => fold_raw(&mut self.medeleg), + RootCSRegister::mideleg => fold_raw(&mut self.mideleg), + RootCSRegister::mseccfg => fold_raw(&mut self.mseccfg), + RootCSRegister::scontext => fold_raw(&mut self.scontext), + RootCSRegister::hstatus => fold_raw(&mut self.hstatus), + RootCSRegister::hedeleg => fold_raw(&mut self.hedeleg), + RootCSRegister::hideleg => fold_raw(&mut self.hideleg), + RootCSRegister::hie => fold_raw(&mut self.hie), + RootCSRegister::hcounteren => fold_raw(&mut self.hcounteren), + RootCSRegister::hgeie => fold_raw(&mut self.hgeie), + RootCSRegister::htval => fold_raw(&mut self.htval), + RootCSRegister::hip => fold_raw(&mut self.hip), + RootCSRegister::hvip => fold_raw(&mut self.hvip), + RootCSRegister::htinst => fold_raw(&mut self.htinst), + RootCSRegister::hgeip => fold_raw(&mut self.hgeip), + RootCSRegister::henvcfg => fold_raw(&mut self.henvcfg), + RootCSRegister::hgatp => fold_raw(&mut self.hgatp), + RootCSRegister::hcontext => fold_raw(&mut self.hcontext), + RootCSRegister::htimedelta => fold_raw(&mut self.htimedelta), + RootCSRegister::vsstatus => fold_raw(&mut self.vsstatus), + RootCSRegister::vsie => fold_raw(&mut self.vsie), + RootCSRegister::vstvec => fold_raw(&mut self.vstvec), + RootCSRegister::vsscratch => fold_raw(&mut self.vsscratch), + RootCSRegister::vsepc => fold_raw(&mut self.vsepc), + RootCSRegister::vscause => fold_raw(&mut self.vscause), + RootCSRegister::vstval => fold_raw(&mut self.vstval), + RootCSRegister::vsip => fold_raw(&mut self.vsip), + RootCSRegister::vsatp => fold_raw(&mut self.vsatp), + RootCSRegister::tselect => fold_raw(&mut self.tselect), + RootCSRegister::tdata1 => fold_raw(&mut self.tdata1), + RootCSRegister::tdata2 => fold_raw(&mut self.tdata2), + RootCSRegister::tdata3 => fold_raw(&mut self.tdata3), + RootCSRegister::tcontrol => fold_raw(&mut self.tcontrol), + RootCSRegister::mcontext => fold_raw(&mut self.mcontext), + RootCSRegister::dcsr => fold_raw(&mut self.dcsr), + RootCSRegister::dpc => fold_raw(&mut self.dpc), + RootCSRegister::dscratch0 => fold_raw(&mut self.dscratch0), + RootCSRegister::dscratch1 => fold_raw(&mut self.dscratch1), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::atomic::{AtomicUsize, Ordering}; + use strum::IntoEnumIterator; + + /// Ensure that [`CSRValues::fold_ref`] and [`CSRValuesF::fold_mut`] refer to the same CSR + /// value field provided the same [`RootCSRegister`]. + #[test] + fn fold_ref_mut_consistent() { + let counter = AtomicUsize::new(0); + + let mut example = CSRValuesF::new( + || counter.fetch_add(1, Ordering::SeqCst), + || counter.fetch_add(1, Ordering::SeqCst), + || counter.fetch_add(1, Ordering::SeqCst), + ); + + for csr in RootCSRegister::iter() { + let lhs = example.select_ref(csr, |x| *x, |x| *x, |x| *x); + let rhs = example.select_mut(csr, |x| *x, |x| *x, |x| *x); + assert_eq!(lhs, rhs); } } } -- GitLab